X3ND1 GANTENG
Server IP : 108.163.255.210  /  Your IP : 3.15.214.244
Web Server : Apache
System : Linux blossom.urlnameserver.com 3.10.0-1160.80.1.el7.x86_64 #1 SMP Tue Nov 8 15:48:59 UTC 2022 x86_64
User :  ( 1172)
PHP Version : 7.2.34
Disable Function : eval,escapeshellarg,proc_close,proc_get_status,proc_nice,proc_open,symlink,system,pcntl_exec,getrusage,chown,chgp,closelog,openlog,syslog,define_syslog_variables,php_ini_loaded_file,getservbyname,getservbyport,posix_getgid,posix_getgrgid,proc_terminate,pfsockopen,apache_child_terminate,posix_mkfifo,posix_setpgid,posix_setuid,hypot,pg_host,pos,posix_access,posix_getcwd,posix_getservbyname,myshellexec,getpid,posix_getsid,posix_isatty,posix_kill,posix_mknod,posix_setgid,posix_setsid,posix_setuid,posix_times,posix_uname,ps_fill,posix_getpwuid,global,ini_restore,zip_open,zip_read,rar_open,bzopen,bzread,bzwrite,apache_get_modules,apache_get_version,phpversionphpinfo,php_ini_scanned_files,get_current_user,disk_total_space,diskfreespace,leak,imap_list,hypo,filedump,safe_mode,getmygid,apache_getenv,apache_setenv,bzread,bzwrite,bzopen,phpini,higlight_file,dos_conv,get_cwd,er_log,cmd,e_name,vdir,get_dir,only_read,ftok,ftpexec,posix_getpwnam,mysql_list_dbs,disk_free_space,session_save_path,confirm_phpdoc_compiled,zip_entry_rea,php_u,psockopen,crack_opendict,crack_getlastmessage,crack_closedict,crack_check,fpassthru,posix_get_last_error,posix_getlogin,posix_getgroups,posix_strerror,posix_getrlimit,posix_getpgrp,posix_getgrnam,pos,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/unilinki/public_html/alpai2/public/js/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ BERANDA ]     

Current File : /home/unilinki/public_html/alpai2/public/js/jquery.banner-rotator.js
/**
 * jQuery Banner Rotator v4.1.1
 * Copyright (c) 2015 Allan Ma (http://codecanyon.net/user/webtako)
 */
(function($) {
	var PRESETS = {};

	(function() {
		var empty = [''],
			xDirs = ['left', 'right'],
			yDirs = ['up', 'down'],
			order = ['downLeft', 'upRight', 'downRight', 'upLeft', 'spiralIn', 'spiralOut', 'zigZagDown', 'zigZagUp', 'zigZagRight', 'zigZagLeft'];
		
		$.each(['none', 'column', 'row', 'grid'], function(i, val) {
			PRESETS[val] = [];
		});

		addPresets(PRESETS.none, ['cover', 'flip', 'push', 'rotate'], xDirs.concat(yDirs), empty);
		addPresets(PRESETS.none, ['fade', 'zoom'], empty, empty);
		
		addPresets(PRESETS.column, ['fade', 'zoom'], empty, xDirs);
		addPresets(PRESETS.column, ['push', 'rotate'], yDirs, xDirs);
		$.each(xDirs, function(i, val) {
			addPresets(PRESETS.column, ['cover', 'flip', 'move'], [val], [val]);
		});
		
		addPresets(PRESETS.row, ['fade', 'zoom'], empty, yDirs);
		addPresets(PRESETS.row, ['push', 'rotate'], xDirs, yDirs);
		$.each(yDirs, function(i, val) {
			addPresets(PRESETS.row, ['cover', 'flip', 'move'], [val], [val]);
		});

		addPresets(PRESETS.grid, ['expand', 'fade', 'zoom'], empty, order);
		addPresets(PRESETS.grid, ['cover', 'flip', 'move', 'push'], ['random'], order);
	}());

	var IS_TOUCH = 'ontouchstart' in window,
		ANDROID2 = isAndroid(2.9),
		CHROME = isChrome();
	
	var CUBIC_BEZIER = {
		'linear':			'linear',
		'':					'ease',
		'swing':			'ease',
		'ease':           	'ease',
       	'ease-in':        	'ease-in',
       	'ease-out':       	'ease-out',
       	'ease-in-out':    	'ease-in-out',
		'easeInQuad':		'cubic-bezier(.55,.085,.68,.53)',
		'easeOutQuad':		'cubic-bezier(.25,.46,.45,.94)',
		'easeInOutQuad':	'cubic-bezier(.455,.03,.515,.955)',
		'easeInCubic':		'cubic-bezier(.55,.055,.675,.19)',
		'easeOutCubic':		'cubic-bezier(.215,.61,.355,1)',
		'easeInOutCubic':	'cubic-bezier(.645,.045,.355,1)',
		'easeInQuart':		'cubic-bezier(.895,.03,.685,.22)',
		'easeOutQuart':		'cubic-bezier(.165,.84,.44,1)',
		'easeInOutQuart':	'cubic-bezier(.77,0,.175,1)',
		'easeInQuint':		'cubic-bezier(.755,.05,.855,.06)',
		'easeOutQuint':		'cubic-bezier(.23,1,.32,1)',
		'easeInOutQuint':	'cubic-bezier(.86,0,.07,1)',
		'easeInSine':		'cubic-bezier(.47,0,.745,.715)',
		'easeOutSine':		'cubic-bezier(.39,.575,.565,1)',
		'easeInOutSine':	'cubic-bezier(.445,.05,.55,.95)',
		'easeInExpo':		'cubic-bezier(.95,.05,.795,.035)',
		'easeOutExpo':		'cubic-bezier(.19,1,.22,1)',
		'easeInOutExpo':	'cubic-bezier(1,0,0,1)',
		'easeInCirc':		'cubic-bezier(.6,.04,.98,.335)',
		'easeOutCirc':		'cubic-bezier(.075,.82,.165,1)',
		'easeInOutCirc':	'cubic-bezier(.785,.135,.15,.86)',
		'easeInBack':		'cubic-bezier(.60,-.28,.735,.045)',
		'easeOutBack':		'cubic-bezier(.175,.885,.32,1.275)',
		'easeInOutBack':	'cubic-bezier(.68,-.55,.265,1.55)'
	};
		
	var SIDES,
		OPPOSITE_SIDE = {top:'bottom', left:'right'},
		OPPOSITE_LAYER = {
			zoomIn:'zoomOut',
			flipDown:'flipUp',
			flipRight:'flipLeft',
			moveDown:'moveUp',
			moveRight:'moveLeft',
			spinInRight:'spinOutLeft',
			spinInLeft:'spinOutRight'
		};

	(function() {
		$.each(OPPOSITE_LAYER, function(key, val) {
			OPPOSITE_LAYER[val] = key;
		});

		$.each(OPPOSITE_SIDE, function(key, val) {
			OPPOSITE_SIDE[val] = key;
		});

		SIDES = getKeys(OPPOSITE_SIDE);
	}());

	var SUPPORT = {},
		PREFIX,
		PREFIXES,
		CSS_TRANSITION_END,
		CSS_ANIMATION_END;
	
	(function() {
		$.each(['transform', 'transition', 'transformStyle', 'animation', 'backgroundSize', 'pointerEvents'], function(i, val) {
			styleSupport(val);
		});
		
		SUPPORT.transform3d = propertySupport(SUPPORT.transform, 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)');
		SUPPORT.preserve3d = propertySupport(SUPPORT.transformStyle, 'preserve-3d');
		SUPPORT.cssFilter = filterSupport();

		switch(SUPPORT.transition) {
			case 'WebkitTransition':
				CSS_TRANSITION_END = 'webkitTransitionEnd';
				break;
			case 'OTransition':
				CSS_TRANSITION_END = 'otransitionend';
				break;
			default:
				CSS_TRANSITION_END = 'transitionend';
		}

		switch(SUPPORT.animation) {
			case 'WebkitAnimation':
				CSS_ANIMATION_END = 'webkitAnimationEnd';
				break;
			case 'OAnimation':
				CSS_ANIMATION_END = 'oanimationend';
				break;
			default:
				CSS_ANIMATION_END = 'animationend';
		}

		if (SUPPORT.animation && /^(Moz|Webkit|O)/.test(SUPPORT.animation)) {
			PREFIX = '-' + SUPPORT.animation.replace('Animation', '').toLowerCase() + '-';
			PREFIXES = [PREFIX];
		}
		else {
			PREFIX = '';
			PREFIXES = ['-moz-', '-ms-', '-webkit-'];
		}
	}());
	
	var FROM_KEYFRAME = '0% { ' + getTransformProperty('translateZ(0px)') + ' } ',
		TO_KEYFRAME = '10' + FROM_KEYFRAME;

	(function() {
		requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
		cancelAnimationFrame  = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame || $.noop;

	   	if (!requestAnimationFrame) {
	        requestAnimationFrame = function(callback, element) {
	           	callback.call(null);
	        };
	 	} 	
 	}());

	//Timer Class
	function Timer(context, opts) {
		if (this instanceof Timer) {
			if (context) {
				this._running = false;
				this._complete = true;
				this._$timer = $('<div/>').appendTo(context._$screen).addTransitionClass('br-element-transition');
				
				if ($.isFunction(opts.click)) {
					this._$timer.css({cursor:'pointer'}).on('click', opts.click);
				}

				this.addOnHover(context._$outmost, context._namespace);
			}
		}
		else {
			return new Timer();
		}
	}

	Timer.prototype = {
		constructor: Timer,

		start: function() {
			this._running = true;
			this._complete = false;
			this._$timer.addClass('br-on');
			this.wake();
		},

		stop: function() {
			this._running = false;
			this._complete = true;
			this._$timer.removeClass('br-on');
		},

		pause: function() {
			this._running = false;
			this.sleep();
		},

		wake: function() {
			this._$timer.removeClass('br-timer-sleep');
		},

		sleep: function() {
			if (!this._running) {
				this._$timer.addClass('br-timer-sleep');
			}
		},

		addOnHover: function($parent, namespace) {
			$parent.on('mouseenter' + namespace, $.proxy(function() { this.wake(); }, this))
				   .on('mouseleave' + namespace, $.proxy(function() { this.sleep(); }, this));
		}
	};

	//Bar Timer Class
	BarTimer.prototype = new Timer();
	BarTimer.prototype.constructor = BarTimer;

	function BarTimer(context, opts) {
		if (this instanceof BarTimer) {
			Timer.call(this, context, opts);
			this._$bar = $('<div/>');
			this._$timer.addClass('br-bar-timer').addClass(/bottom/i.test(opts.position) ? 'br-bottom' : 'br-top').append(this._$bar);
		}
		else {
			return new BarTimer(context, opts);
		}
	}

	BarTimer.prototype.start = function(delay) {
		if (this._complete) {
			this._delay = delay;
		}

		this._startTime = $.now();
		this._$bar.transition({width:'101%'}, delay, 'linear');
		Timer.prototype.start.call(this);
	};

	BarTimer.prototype.stop = function() {
		this._elapsed = 0;
		this._$bar.stopTransition(true).width(0);

		Timer.prototype.stop.call(this);
	};

	BarTimer.prototype.pause = function() {
		this._$bar.stopTransition(true);
		this._elapsed += ($.now() - this._startTime);
		this._$bar.width((this._elapsed/this._delay * 101) + '%');
		
		Timer.prototype.pause.call(this);
	};
	
	//Pie Timer Class
	PieTimer.prototype = new Timer();
	PieTimer.prototype.constructor = PieTimer;

	function PieTimer(context, opts) {
		if (this instanceof PieTimer) {
			Timer.call(this, context, opts);
			var css = {},
				positions = opts.position.split(' ', 2);
			
			css[getEnum(positions[0], ['left', 'right'], 'right')] = 0;
			css[getEnum(positions[1], ['top', 'bottom'], 'top')] = 0;

			this._$spinner = $('<div/>', {'class':'br-spinner', html:'<div/>'});
			this._$fill = $('<div/>', {'class':'br-pie-fill', html:'<div/>'});
			this._$mask = $('<div/>', {'class':'br-pie-mask'});
			this._$el = this._$spinner.add(this._$fill).add(this._$mask);
			this._$timer.addClass('br-pie-timer').css(css).append(this._$el);
		}
		else {
			return new PieTimer(context, opts);
		}
	}
	
	PieTimer.prototype.start = function(delay) {
		if (this._complete) {
			this._delay = delay;
		}
		
		this._startTime = $.now();
		this._$spinner.transition({transform:'rotate(360deg)'}, delay, 'linear');
		if (this._elapsed < this._delay/2) {
			var props = {duration:0, easing:'linear', delay:this._delay/2 - this._elapsed};
			this._$fill.transition({opacity:1}, props);
			this._$mask.transition({opacity:0}, props);
		}

		Timer.prototype.start.call(this);
	};
	
	PieTimer.prototype.stop = function() {
		this._elapsed = 0;
		this._$el.stopTransition(true);
		this._$fill.css({opacity:0});
		this._$mask.css({opacity:1});
		this._$spinner.css({transform:'rotate(0)'});

		Timer.prototype.stop.call(this);
	};

	PieTimer.prototype.pause = function() {
		this._$el.stopTransition(true);
		this._elapsed += ($.now() - this._startTime);
		
		var degree = (this._elapsed/this._delay * 360);
		this._$spinner.css({transform:'rotate(' + degree + 'deg)'});
		if (this._elapsed < this._delay/2) {
			this._$fill.css({opacity:0});
			this._$mask.css({opacity:1});
		}

		Timer.prototype.pause.call(this);
	};
	
	//Effect Class
	function Effect(context) {
		if (this instanceof Effect) {
			if (context) {
				this._timeout = null;
				this._requestId = null;
				this._context = context;
				this._$container = $('<div/>', {'class':'br-effects'}).appendTo(this._context._$screen);
				this._transform = this._context._transform;
				this._support3d = SUPPORT.transform3d && SUPPORT.preserve3d && this._context._cssTransition;
			}
		}
		else {
			return new Effect(context);
		}
	}
	
	Effect.prototype = {
		constructor: Effect,

		//create elements
		createElements: function() {
			var total = this._rows * this._columns,
				inner = this._is3D ? Effect.CUBOID : Effect.PLANE,
				content = '';
			
			while (total--) {
				content += '<div class="br-effect">' + inner + '</div>';
			}
			this._$container.toggleClass('br-2d', !this._is3D).html(content);
			this._$el = this._$container.children();
			
			if (this._shapeColor) {
				this._$el.find('>.br-shape').children().css({backgroundColor:this._shapeColor});
			}
		},

		//set elements
		initElements: function() {
			var $curr = this.getCurrImage(),
				currTop = $curr.position().top,
				currLeft = $curr.position().left,
				$prev = this.getPrevImage(),
				prevTop, 
				prevLeft;

			if ($prev) {
				prevTop = $prev.position().top;
				prevLeft = $prev.position().left;
			}

			this.addImage();
			var availHeight = this._$container.height();
			for (var i = 0; i < this._rows; i++) {
				var availWidth = this._$container.width(),
					height = Math.min(this._height, availHeight);
				availHeight -= height;
				for (var j = 0; j < this._columns; j++) {
					var width = Math.min(this._width, availWidth),
						top = i * this._height,
						left = j * this._width,
						$el = this._$el.eq(i * this._columns + j),
						$shape = $($el[0].firstChild);
						
					$el.css({top:top, left:left, width:width, height:height});
					$shape.find('>.br-prev-side>img').css({left:(prevLeft - left), top:(prevTop - top)}).end()
						  .find('>.br-active-side>img').css({left:(currLeft - left), top:(currTop - top)});
					
					if (this._is3D) {
						this.setCuboid($shape, width, height, $el.data('depth'));
					}

					availWidth -= width;
				}
			}

			this._$el.css({visibility:'visible'});

			if (this._hideItems) {
				this._context._$items.css({visibility:'hidden'});
			}
		},

		//clear elements
		clear: function() {
			clearTimeout(this._timeout);
			cancelAnimationFrame(this._requestId);
			this._$container.empty();
			this._progress = false;
		},

		//get type
		getType: function() {
			if (1 < this._rows) {
				if (1 < this._columns) {
					return Effect.GRID;
				}
				else {
					return Effect.ROW;
				}
			}
			else if (1 < this._columns) {
				return Effect.COLUMN;
			}

			return 'none';
		},

		//init order
		initOrder: function() {
			if (0 > $.inArray(this._order, Effect.ORDERS)) {
				this._order = 'right';
			}

			if (this._context._backward && this._autoReverse) {
				this._order = this.getOpposite(this._order);
			}
		},

		//init direction
		initDirection: function() {
			if (0 > $.inArray(this._direction, ['up', 'down', 'left', 'right', 'random'])) {
				this._direction = 'right';
			}

			if (this._context._backward && this._autoReverse) {
				this._direction = this.getOpposite(this._direction);
			}
		},

		//get opposite
		getOpposite: function(val) {
			if (val in Effect.OPPOSITE) {
				return Effect.OPPOSITE[val];
			}
			return val;
		},

		//get current image
		getCurrImage: function() {
			if (this._context._$currItem) {
				return this._context._$currItem.find('>img.br-img');
			}
		},

		//get previous image
		getPrevImage: function() {
			if (this._context._$prevItem) {
				return this._context._$prevItem.find('>img.br-img');
			}
		},

		//add element's image
		addImage: function() {
			$.each({'>.br-active-side': this.getCurrImage(), '>.br-prev-side': this.getPrevImage()}, 
				$.proxy(function(selector, $img) {
					if ($img && $img.length) {
						var rect = $img[0].getBoundingClientRect(),
							width = rect.width || $img.width(),
							height = rect.height || $img.height(),
							$newImg = $('<img/>', {src:$img.attr('src'), alt:'', css:{width:width, height:height}});
						this._$el.find('>.br-shape').find(selector).html($newImg);
					}
				}, this));
		},

		//set cuboid
		setCuboid: function($cuboid, width, height, depth) {
			var widthZ  = 'translateZ(' + (width/2)  + 'px)',
				heightZ = 'translateZ(' + (height/2) + 'px)',
				depthZ  = 'translateZ(' + (depth/2)  + 'px)',
				left = (width - depth)/2,
				top = (height - depth)/2,
				invert = $cuboid.find('>.br-face-back').hasClass('br-inverted') ? 'rotate(180deg) ' : '';
			
			$cuboid.find('>.br-face-front').css({transform:depthZ}).end()
				   .find('>.br-face-back').css({transform:'rotateY(180deg) ' + invert + depthZ}).end()
				   .find('>.br-face-left').css({width:depth, left:left, transform:'rotateY(-90deg) ' + widthZ}).end()
				   .find('>.br-face-right').css({width:depth, left:left, transform:'rotateY(90deg) ' + widthZ}).end()
				   .find('>.br-face-top').css({height:depth, top:top, transform:'rotateX(90deg) ' + heightZ}).end()
				   .find('>.br-face-bottom').css({height:depth, top:top, transform:'rotateX(-90deg) ' + heightZ});
		},

		//update keyframes
		updateKeyframes: function(effect) {
			var sheet = this._context._sheet,
				index = this._context._activeIndex,
				size, arr, pct;
			
			if ('flip' === effect) {
				size = ('up' === this._direction || 'down' === this._direction ? this._height : this._width)/2;
				offset = 0;
				arr = Effect.SINES;
				pct = Effect.FLIP_PCT;
			}
			else {
				size = this._$el.data('depth')/2;
				offset = size;
				size /= Math.cos(degreesToRadians(45));
				arr = Effect.COSINES;
				pct = Effect.ROTATE_PCT;
			}

			var length = arr.length,
				rule = '@' + PREFIX + 'keyframes ' + ('br-' + this._context._uid + '-' + index) + ' { ';

			for (var i = 0; i < length; i++) {
				var val = (arr[i] * size);
				rule += (pct[i] + ' { ' + getTransformProperty('translateZ(' + Math.min(0, offset - val) + 'px)') + ' } ');
			}
			rule += '} ';
			
			try {
				sheet.deleteRule(index);
				sheet.insertRule(rule, index);
			}
			catch (err) {
			}
		},

		//animate elements
		animate: function(elArray, duration, easing) {
			if (this._is3D) {
				if (!$.isNumeric(this._depth)) {
					this.updateKeyframes(this._effect);
				}
					
				if (this._shapeShading) {
					var shadeDuration = ('flip' === this._effect ? duration/2 : duration);
					this._$el.find('>.br-shape>.br-prev-side').each(function() {
						$('<div/>', {'class':'br-shading'}).animation('br-shade-in', 
							{duration:shadeDuration, easing:easing, playState:'paused', complete:function(e) {
								e.stopPropagation();
							}}).appendTo($(this));
					});
				}
			}

			var props = {duration:duration, easing:easing};
			this._requestId = requestAnimationFrame($.proxy(function() {
				this.animateElement(elArray, props);
			}, this));
		},

		//animate active element
		animateElement: function(elArray, options) {
			var $el = $(elArray.shift()),
				selector = $el.data('selector'),
				$active = (selector ? $el.find(selector) : $el),
				promises = [],
				isLast = !elArray.length;
			
			if (this._is3D) {
				var opts = $.extend({}, options);
				if (isLast) {
					var d2 = $.Deferred();
					promises.push(d2.promise());
					opts.complete = function() { 
						d2.resolve(); 
					};
				}
				$el.animation('br-' + this._context._uid + '-' + this._context._activeIndex, opts)
				   .find('>.br-shape>.br-prev-side>.br-shading').css({animationPlayState:'running'});
			}

			if (isLast) {
				var d1 = $.Deferred();
				promises.push(d1.promise());
				options.complete = function() { 
					d1.resolve(); 
				};
				
				$.when.apply(null, promises).always($.proxy(function() {
					this._context.activateItem(false);
					this._$container.empty();
					this._progress = false;
				}, this));
			}
			
			$active.transition($el.data('to'), options);
			
			if (!isLast) {
				this._timeout = setTimeout($.proxy(function() {
					this._requestId = requestAnimationFrame($.proxy(function() {
						this.animateElement(elArray, options);
					}, this));
				}, this), this._interval);
			}
		},

		getPromises: function() {
			var promises = [];
			this.getCurrImage().add(this.getPrevImage()).each(function(n, el) {
				var $el = $(el);
				if ($el && $el.length) {
					var $img = $el.clone(),
						img = $img[0];

					if (typeof img.readyState !== 'undefined') {
						if ('complete' === img.readyState) {
							return false;
						}
					}
					else if (img.complete) {
						return false;
					}

					var deferred = $.Deferred();
					promises.push(deferred.promise());
					$img.brHandleImage($img.attr('src'), { 
						complete: function() {
							deferred.resolve();
						},
						error: function() { 
							deferred.reject(); 
						}
					});
				}
			});

			return promises;
		},

		inProgress: function() {
			return this._progress;
		},

		//get ordered element array
		getElementArray: function() {
			var elements;
			switch (this._order) {
				case 'up':
				case 'down':
				case 'left':
				case 'right':
					elements = this.getDirectionalArray(this._order);
					break;
				case 'upLeft':
				case 'upRight':
				case 'downLeft':
				case 'downRight':
					elements = this.getDiagonalArray(this._order);
					break;
				case 'spiralIn':
				case 'spiralOut':
					elements = this.getSpiralArray();
					break;
				case 'zigZagUp':
				case 'zigZagDown':
				case 'zigZagLeft':
				case 'zigZagRight':
					elements = this.getZigZagArray(this._order);
					break;
				case 'random':
					elements  = this._$el.toArray();
					shuffleArray(elements);
					break;
				default:
					elements  = this._$el.toArray();
			}

			if (this._isReverse) {
				elements.reverse();
			}
			
			return elements;
		},

		setFn: function(fn, dir) {
			var setter = 'set' + capitalize(fn), 
				name = setter + capitalize(dir);

			if (!$.isFunction(this[name])) {
				name = setter + capitalize(this._direction);
			}
			return name;
		},

		setAlternate: function(fn) {
			this[this.setFn(fn, this._direction)](this._$el.filter(':even'));
			this[this.setFn(fn, this.getOpposite(this._direction))](this._$el.filter(':odd'));
		},

		setRandomDirection: function($el, fn, directions) {
			if (!directions) {
				directions = ['up', 'down', 'left', 'right'];
			}
			
			$el.each(function() {
				$(this).data({dir:getRandomItem(directions)}); 
			});
			
			$.each(directions, $.proxy(function(i, dir) {
				var $items = $el.filter(function() { 
					return $(this).data('dir') === dir;
				});
				this[this.setFn(fn, dir)]($items);
			}, this));
		},

		//cover helper
		setCoverDown: function($el) {
			this.setPush($el, 'hidden', 'Y', true);
		},
	
		setCoverUp: function($el) {
			this.setPush($el, 'hidden', 'Y', false);
		},

		setCoverRight: function($el) {
			this.setPush($el, 'hidden', 'X', true);
		},

		setCoverLeft: function($el) {
			this.setPush($el, 'hidden', 'X', false);
		},

		setCoverRandom: function($el) {
			this.setRandomDirection($el, 'cover');
		},

		//push helper
		setPushDown: function($el) {
			this.setPush($el, 'visible', 'Y', true);
		},
	
		setPushUp: function($el) {
			this.setPush($el, 'visible', 'Y', false);
		},

		setPushRight: function($el) {
			this.setPush($el, 'visible', 'X', true);
		},

		setPushLeft: function($el) {
			this.setPush($el, 'visible', 'X', false);
		},

		setPushRandom: function($el) {
			this.setRandomDirection($el, 'push');
		},

		setPush: function($el, visibility, axis, fwd) {
			var active  = 'front', 
				prev = 'back',
				dim = ('Y' === axis ? 'height' : 'width'),
				from, to;
				
			if (this._transform) {
				var translate = 'translate' + axis;
				from = {transform:translate + '(-50%)'};
				to = {transform:translate + '(0)'};
			}
			else {
				var pos = ('Y' === axis ? 'top' : 'left');
				from = {};
				to = {};
				from[pos] = -this['_' + dim];
				to[pos] = 0;
			}

			if (!fwd) {
				var temp = from;
				from = to;
				to = temp;

				temp = prev;
				prev = active;
				active = temp;
			}

			$el.data({to:to}).find('>.br-shape').addClass('br-extend-' + dim).css(from)
				.find('>.br-' + active).addClass('br-active-side').end()
				.find('>.br-' + prev).addClass('br-prev-side').css('visibility', visibility);
		},

		//move helper
		setMoveDown: function($el) {
			this.setMove($el, 'Y', -this._$container.height());
		},

		setMoveUp: function($el) {
			this.setMove($el, 'Y', this._$container.height());
		},

		setMoveRight: function($el) {
			this.setMove($el, 'X', -this._$container.width());
		},

		setMoveLeft: function($el) {
			this.setMove($el, 'X', this._$container.width());
		},

		setMoveRandom: function($el) {
			this.setRandomDirection($el, 'move');
		},

		setMove: function($el, axis, dist) {
			var from, to;
			if (this._transform) {
				var translate = 'translate' + axis;
				from = {transform:translate + '(' + dist + 'px)'};
				to = {transform:translate + '(0)'};
			}
			else {
				if ('Y' === axis) {
					from = {marginTop:dist};
					to = {marginTop:0};
				}
				else {
					from = {marginLeft:dist};
					to = {marginLeft:0};
				}
			}

			$el.data({to:to}).css(from).find('>.br-shape')
			   .find('>.br-front').addClass('br-active-side').end()
			   .find('>.br-back').hide();
		},

		//rotate helper fns
		setRotateDown: function($el) {
			this.setRotate($el, 'X', false);
		},

		setRotateUp: function($el) {
			this.setRotate($el, 'X', true);
		},

		setRotateRight: function($el) {
			this.setRotate($el, 'Y', true);
		},

		setRotateLeft: function($el) {
			this.setRotate($el, 'Y', false);
		},

		setRotateRandom: function($el) {
			this.setRandomDirection($el, 'rotate', ['up', 'down']);
		},

		setRotate: function($el, axis, positive) {
			var transform = 'translateZ(' + (-$el.data('depth')/2) + 'px) rotate' + axis,
				sign, side;

			if (positive) {
				sign = '';
				side = (axis === 'X' ? 'bottom' : 'left');
			}
			else {
				sign = '-';
				side = (axis === 'X' ? 'top' : 'right');
			}

			$el.data({to:{transform:transform + '(' + sign + '90deg)'}})
			 	.find('>.br-shape').css({transform:transform + '(0deg)'})
				.find('>.br-face-' + side).addClass('br-active-side').end()
				.find('>.br-face-front').addClass('br-prev-side');
		},

		//flip helper fns
		setFlipDown: function($el) {
			this.setFlip($el, 'X', false);
		},

		setFlipUp: function($el) {
			this.setFlip($el, 'X', true);
		},

		setFlipRight: function($el) {
			this.setFlip($el, 'Y', true);
		},

		setFlipLeft: function($el) {
			this.setFlip($el, 'Y', false);
		},

		setFlipRandom: function($el) {
			this.setRandomDirection($el, 'flip');
		},

		setFlip: function($el, axis, positive) {
			var transform = 'translateZ(' + (-$el.data('depth')/2) + 'px) rotate' + axis,
				sign = positive ? '' : '-';
			
			$el.data({to:{transform:transform + '(' + sign + '180deg)'}})
				.find('>.br-shape').css({transform:transform + '(0deg)'})
				.find('>.br-face-front').addClass('br-prev-side').end()
				.find('>.br-face-back').addClass('br-active-side').toggleClass('br-inverted', axis === 'X');
		},
		
		//fade effect
		fade: function() {
			var selector = '>.br-shape';
			this._$el.data({selector:selector, to:{opacity:1}})
					 .find(selector).css({opacity:0})
					 .find('>.br-front').addClass('br-active-side').end()
					 .find('>.br-back').hide();
		},

		//zoom effect
		zoom: function() {
			var front = 'br-active-side', 
				back = 'br-prev-side',
				from = {opacity:1, transform:'scale(1)'},
				to = {opacity:0, transform:'scale(2)'};

			if ('out' === this._direction) {
				var temp = from;
				from = to;
				to = temp;

				temp = front;
				front = back;
				back = temp;
			}
			
			this._$el.data({selector:'>.br-shape>.br-back', to:to})
					.find('>.br-shape').addClass('br-stack')
					.find('>.br-front').addClass(front).end()
					.find('>.br-back').addClass(back).css(from);
		},

		//expand effect
		expand: function() {
			var selector = '>.br-shape',
				from, to;
			
			if (this._transform) {
				from = {transform:'scale(0)'};
				to = {transform:'scale(1)'};
			}
			else {
				from = {width:0, height:0};
				to = {width:this._width, height:this._height};
			}
			
			this._$el.data({selector:selector, to:to})
					 .find(selector).css(from)
					 .find('>.br-front').addClass('br-active-side').end()
					 .find('>.br-back').hide();
		},
		
		//push effect
		push: function() {
			if (this._alternate) {
				this.setAlternate('push');
			}
			else {
				this[this.setFn('push', this._direction)](this._$el);
			}
			
			this._$el.data({selector:'>.br-shape'});
		},

		//cover transition
		cover: function() {
			if (this._alternate) {
				this.setAlternate('cover');
			}
			else {
				this[this.setFn('cover', this._direction)](this._$el);
			}
			
			this._$el.data({selector:'>.br-shape'});
		},

		//slide transition
		slide: function() {
			this._autoReverse = true;
			this._direction = this.getOpposite(this._direction);
			
			if (this._alternate) {
				this.setAlternate('push');
			}
			else {
				this[this.setFn('push', this._direction)](this._$el);
			}

			this._$el.data({selector:'>.br-shape'});
		},

		//move transition
		move: function() {
			this._isReverse = !this._isReverse;
			this[this.setFn('move', this._direction)](this._$el);
		},
		
		//flip transition
		flip: function() {
			this._$el.data({selector:'>.br-shape', depth:this._shapeDepth});
			if (this._alternate) {
				this.setAlternate('flip');
			}
			else {
				this[this.setFn('flip', this._direction)](this._$el);
			}
		},

		//rotate transition
		rotate: function() {
			this._$el.data({selector:'>.br-shape', depth:('left' === this._direction || 'right' === this._direction ? this._width : this._height)});
			if (this._alternate) {
				this.setAlternate('rotate');
			}
			else {
				this[this.setFn('rotate', this._direction)](this._$el);
			}
		},

		start: function(opts) {
			this._progress = true;

			$.each(Effect.DATA, $.proxy(function(i, val) {
				this['_' + val] = opts[val];
			}, this));
						
			this._columns = getPosInt(this._columns, 1);
			this._rows = getPosInt(this._rows, 1);
			this._width = Math.ceil(this._$container.width()/this._columns);
			this._height = Math.ceil(this._$container.height()/this._rows);
			
			if ('random' === this._effect) {
				this.setRandomEffect();
			}

			this._is3D = -1 < $.inArray(this._effect, ['flip', 'rotate']);
			if (this._is3D && !this._support3d) {
				this._effect = 'push';
				this._is3D = false;
			}

			this._interval = getNonNegInt(this._interval, 0);
			this._shapeDepth = getNonNegInt(this._shapeDepth, 0);
			this.initDirection();
			this.initOrder();
			this._isReverse = -1 < $.inArray(this._order, Effect.REVERSE);
			this._hideItems = -1 < $.inArray(this._effect, ['flip', 'push', 'rotate', 'slide', 'zoom']);

			this.createElements();
			this[this._effect]();
			this.initElements();

			var arr = this.getElementArray(),
				duration = getNonNegInt(opts.duration, $.fn.bannerRotator.defaults.duration),
				easing = opts.easing;

			this.animate(arr, duration, easing);
		},

		setRandomEffect: function() {
			var type = this.getType(),
				preset = getRandomItem(PRESETS[type]);
			
			$.each(['effect', 'direction', 'order'], $.proxy(function(i, val) {
				this['_' + val] = preset[val];
			}, this));
		},

		//get diagonal array
		getDiagonalArray: function(order) {
			var elArray = [],
				start = 0, 
				end = (this._rows - 1) + (this._columns - 1) + 1,
				flip = ('downLeft' === order || 'upRight' === order);

			while (start != end) {
				i = Math.min(this._rows - 1, start);
				while(i >= 0) {
					if (flip) {
						j = (this._columns - 1) - Math.abs(i - start);
						if (j < 0) {
							break;
						}
					}
					else {
						j = Math.abs(i - start);
						if (j >= this._columns) {
							break;
						}
					}

					elArray.push(this._$el.eq(i * this._columns + j));
					i--;
				}
				start++;
			}
			
			return elArray;
		},

		//get zig-zag array
		getZigZagArray: function(order) {
			var i = 0, 
				j = 0, 
				fwd = true,
				elArray = [],
				total = this._$el.length,
				count;
			
			if ('zigZagUp' === order || 'zigZagDown' === order) {
				for (count = 0; count < total; count++) {
					elArray[count] = this._$el.eq(i * this._columns + j);
					
					if (fwd) { 
						j++;
					}
					else {
						j--;
					}
						
					if (j == this._columns || j < 0) {
						fwd = !fwd;
						j = (fwd ? 0 : this._columns - 1);
						i++;
					}
				}
			}
			else {
				for (count = 0; count < total; count++) {
					elArray[count] = this._$el.eq(i * this._columns + j);
					
					if (fwd) { 
						i++;
					}
					else {
						i--;
					}
					
					if (i == this._rows || i < 0) {
						fwd = !fwd;
						i = (fwd ? 0 : this._rows - 1);
						j++;
					}
				}
			}
			
			return elArray;
		},
		
		//get directional array
		getDirectionalArray: function(order) {
			var elArray;
			if ('right' === order || 'left' === order) {
				elArray = [];
				for (var j = 0; j < this._columns; j++) {
					for (var i = 0; i < this._rows; i++) {
						elArray.push(this._$el.eq(i * this._columns + j));
					}
				}
			}
			else {
				elArray = this._$el.toArray();
			}
			
			return elArray;
		},
		
		//get spiral array
		getSpiralArray: function() {
			var i = 0, 
				j = 0,
				rowCount = this._rows - 1,
				colCount = this._columns - 1,
				dir = 0,
				limit = colCount,
				elArray = [];
			
			while (rowCount >= 0 && colCount >=0) {
				var count = 0; 
				while(true) { 
					elArray.push(this._$el.eq(i * this._columns + j));
					if ((++count) > limit) {
						break;
					}
					switch(dir) {
						case 0:
							j++;
							break;
						case 1:
							i++;
							break;
						case 2:
							j--;
							break;
						case 3:
							i--;
							break;
					}
				} 
				switch(dir) {
					case 0:
						dir = 1;
						limit = (--rowCount);
						i++;
						break;
					case 1:
						dir = 2;
						limit = (--colCount);
						j--;
						break;
					case 2:
						dir = 3;
						limit = (--rowCount);
						i--;
						break;
					case 3:
						dir = 0;
						limit = (--colCount);
						j++;
						break;
				}
			}
				
			return elArray;
		}
	};

	Effect.DATA = ['effect', 'columns', 'rows', 'interval', 'direction', 'order', 'alternate', 'autoReverse', 'depth', 'shapeColor', 'shapeShading', 'shapeDepth'];

	Effect.CUBOID= '<div class="br-cuboid br-shape">\
						<div class="br-face-front"></div>\
			    		<div class="br-face-back"></div>\
						<div class="br-face-left"></div>\
						<div class="br-face-right"></div>\
						<div class="br-face-top"></div>\
						<div class="br-face-bottom"></div>\
					</div>';

	Effect.PLANE = '<div class="br-plane br-shape">\
						<div class="br-front"></div>\
						<div class="br-back"></div>\
					</div>';

	Effect.COLUMN = 'column';

	Effect.ROW = 'row';
	
	Effect.GRID = 'grid';

    Effect.EFFECTS = ['cover', 'expand', 'fade', 'flip', 'move', 'push', 'rotate', 'slide', 'zoom'];
    
    Effect.OPPOSITE = {
		down:'up',
		right:'left',
		downLeft:'upRight',
		downRight:'upLeft',
		spiralIn:'spiralOut',
		zigZagDown:'zigZagUp',
		zigZagRight:'zigZagLeft'
	};

	(function() {
		Effect.REVERSE = [];
		$.each(Effect.OPPOSITE, function(key, val) {
			Effect.OPPOSITE[val] = key;
			Effect.REVERSE.push(val);
		});

		Effect.ORDERS = getKeys(Effect.OPPOSITE);
		Effect.ORDERS.push('random');
	}());

	(function() {
		Effect.SINES = [];
		Effect.FLIP_PCT = [];
		var num = 20,
			radian = Math.PI,
			step = radian/num;
		
		for (var i = 0; i <= num; i++) {
			Effect.FLIP_PCT[i] = Math.round(i/num * 100) + '%';
			Effect.SINES[i] = roundTo(Math.sin(radian), 5);
			radian -= step;
		}
	}());

	(function() {
		Effect.COSINES = [];
		Effect.ROTATE_PCT = [];
		var num = 45,
			radian = degreesToRadians(45),
			step = radian/(num/2);
		
		for (var i = 0; i <= num; i++) {
			Effect.ROTATE_PCT[i] = Math.round(i/num * 100) + '%';
			Effect.COSINES[i] = roundTo(Math.cos(radian), 5);
			radian -= step;
			if (0 >= radian) {
				step = -step;
			}
		}
	}());
		
	//KBurns Class
	function KBurns($img, effect, opts) {
		if (this instanceof KBurns) {
			this._$img = $img;
			this._effect = effect;
			this._options = {};

			if (SUPPORT.animation && !isNone(this._effect)) {
				opts = opts || {};
				
				if (/^random/.test(this._effect)) {
					this._effect = this.getRandom();
				}
				else {
					this._effect = camelToDash(this._effect);
				}
				
				if (this._effect in KBurns.REVERSES) {
					this._effect = KBurns.REVERSES[this._effect];
					opts.direction = 'reverse';
				}
				
				this._effect = 'br-' + this._effect;
				this._options = {
					duration:getNonNegInt(opts.duration, 5000),
					easing:getValue(opts.easing, 'linear'), 
					playState:'paused',
					direction:opts.direction
				};

				this.set();
			}
		}
		else {
			return new KBurns($img, effect, opts);
		}
	}

	(function() {
		KBurns.PAN = ['up', 'down', 'left', 'right', 'up-left', 'up-right', 'down-left', 'down-right'];
		
		KBurns.ZOOMIN = ['zoom-in'];
		
		KBurns.ZOOMOUT = ['zoom-out'];

		$.each(KBurns.PAN, function(i, val) {
			KBurns.PAN[i] = 'pan-' + val;
			KBurns.ZOOMIN.push('zoom-in-' + val);
			KBurns.ZOOMOUT.push('zoom-out-' + val);
		});

		KBurns.ZOOM = KBurns.ZOOMIN.concat(KBurns.ZOOMOUT);
		
		KBurns.EFFECTS = KBurns.PAN.concat(KBurns.ZOOM);
		
		KBurns.REVERSES = {
			'pan-left':'pan-right',
			'pan-up':'pan-down',
			'pan-up-left':'pan-down-right', 
			'pan-up-right':'pan-down-left',
			'zoom-out':'zoom-in',
			'zoom-out-left':'zoom-in-right',
			'zoom-out-right':'zoom-in-left',
			'zoom-out-up':'zoom-in-down',
			'zoom-out-down':'zoom-in-up',
			'zoom-out-up-left':'zoom-in-down-right',
			'zoom-out-up-right':'zoom-in-down-left',
			'zoom-out-down-left':'zoom-in-up-right',
			'zoom-out-down-right':'zoom-in-up-left'
		};
	}());

	KBurns.prototype = {
		constructor: KBurns,

		set: function() {
			this._$img.stopAnimation(true).animation(this._effect, this._options);
		},

		start: function() {
			this._$img.css({animationPlayState:'running'});
		},

		stop: function() {
			this._$img.css({animationPlayState:'paused'});
		},

		restart: function() {
			this.set();
			this.start();
		},

		getRandom: function() {
			var name = this._effect.substring('random'.length).toUpperCase(),
				effects = KBurns[name];
			
			if (!$.isArray(effects)) {
				effects = KBurns.EFFECTS;
			}

			return getRandomItem(effects);
		}
	};

	//Banner Rotator Class
	function Rotator(el, opts) {
		if (this instanceof Rotator) {
			this._uid = Rotator.uid++;
			this._options = opts;
			this._stageWidth = this._options.width;
			this._stageHeight = this._options.height;
			this._rotate = this._options.autoPlay;

			this._cssTransition = (SUPPORT.transition && !ANDROID2 ? this._options.cssTransition : false);
			this._transform = SUPPORT.transform && this._cssTransition;
				
			if (!this._cssTransition) {
				$.fn.transition = $.fn.animate;
				$.fn.stopTransition = $.fn.stop;
			}

			this._timeout = null;
			this._tooltipId = null;
			this._layerIds = [];
			this._requestIds = [];
			this._interact = false;
			this._delay = 0;
			this._$rotator = $(el);
			this._$outmost = this._$rotator;
			this._namespace = '.' + Rotator.PLUGIN + '.' + this._uid;
			this._isWhite = this._$rotator.hasClass('white');
			this._hasShadow = this._$rotator.hasClass('shadow');
			this._html = this._$rotator.html();
			this._style = this._$rotator.attr('style');

			this.init();
		}
		else {
			return new Rotator(el, opts);
		}
	}
	
	Rotator.uid = 0;

	Rotator.PLUGIN = 'rotator';

	Rotator.EVENTS = ['create', 'first', 'last', 'prev', 'next', 'play', 'pause', 'change', 'changed', 'load'];

	Rotator.ANIMATE_SPEED = 500;

	Rotator.prototype = {
		constructor: Rotator,
		
		//init banner rotator
		init: function() {
			this._$rotator.attr('tabindex', -1).toggleClass('br-no-touch', !IS_TOUCH);
			if (!this._$rotator.hasClass('banner-rotator')) {
				this._$rotator.addClass('banner-rotator');
			}
			
			this._$list = this._$rotator.find('>ul');
			if (!this._$list.hasClass('slides')) {
				this._$list.addClass('slides');
			}
			
			if (this._options.shuffle) {
				shuffleElements(this._$list);
			}
			this._$items = this._$list.children().addClass('br-item');
			this._numItems = this._$items.length;
			
			if ('random' === this._options.startIndex) {
				this._activeIndex = Math.floor(Math.random() * this._numItems);
			}
			else {
				var index = getNonNegInt(this._options.startIndex, 0);
				this._activeIndex = withinRange(index, 0, this._numItems - 1) ? index : 0;
			}
			
			//init components
			this.createStyle();
			this.initOuterButtons();
			this.initStage();
			this.initItems();
			this.initNavThumbs();
			this.initCPanel();
			
			if (this._options.hideControl) {
				this._$controls = this._$screen.find('>.br-nav-wrapper').add(this._$rotator.find('>.br-cpanel-wrapper'));
				if (this._$outmost.hasClass('br-outer-navs')) {
					this._$controls = this._$controls.add(this._$outmost.children(':not(.banner-rotator, .br-wrapper)'));
				}
				this._$controls.addTransitionClass('br-opacity-transition');
			}

			if (this._options.responsive) {
				this.resize();
				$(window).on('resize' + this._namespace, debounce($.proxy(this.resize, this), 50));
			}
			else {
				var $outer = this._$rotator.css({width:this._stageWidth, height:this._stageHeight});
				$.each(['.br-wrapper', '.br-outer-navs'], function(i, selector) {
					var $el = $outer.parent(selector);
					if ($el.length) {
						$el.css({width:$outer.outerWidth(true), height:$outer.outerHeight(true)});
						$outer = $el;
					}
				});
			}

			if (this._options.mousewheel) {
				this._$rotator.on('mousewheel' + this._namespace + ' DOMMouseScroll' + this._namespace, $.proxy(this.mousescroll, this));
			}
				
			if (this._options.keyboard) {
				this._$rotator.on('keydown' + this._namespace, $.proxy(this.keyControl, this));
			}
			
			if (IS_TOUCH) {
				if (!isNone(this._options.swipe)) {
					if ('reverse' === this._options.swipeDirection) {
						this.swipeFwd = this.prevSlide;
						this.swipeBack = this.nextSlide;
					}
					else {
						this.swipeFwd = this.nextSlide;
						this.swipeBack = this.prevSlide;
					}
					this._$rotator.on('touchstart' + this._namespace, $.proxy(this.touchStart, this));
				}
			}
			else if (this._options.pauseOnHover) {
				this._$outmost.on('mouseenter' + this._namespace, $.proxy(this.pause, this))
							  .on('mouseleave' + this._namespace, $.proxy(this.play, this));
			}
			
			if (this._options.playOnce) {
				this._$rotator.on('rotatorLast', $.proxy(this.pause, this));
			}

			this.triggerEvent('create');
			
			if (this._options.preload) {
				this.setPreload();
			}
			else {
				this.loadNextImage(this._$items.toArray());
				this.loadSlide();
			}
		},
		
		setPreload: function() {
			this._$preloader.hide();
					
			var $hidden = this._$rotator.children();
			if (this._$outmost.hasClass('br-outer-navs')) {
				$hidden = $hidden.add(this._$outmost.children(':not(.banner-rotator, .br-wrapper)'));
			}
			$hidden.addClass('br-hidden');

			var $overlay = $('<div/>', {'class':'br-load-screen'}).appendTo(this._$rotator);
			this._$progressBar = $('<div/>', {'class':'br-progress-bar', html:'<div/>'}).appendTo($overlay);

			this.loadNextImage(this._$items.toArray(), function() {
				setTimeout($.proxy(function() {
					$hidden.removeClass('br-hidden');
					$overlay.fadeOut(Rotator.ANIMATE_SPEED, function() {
						$(this).remove();
					});
					this.loadSlide();
				}, this), 600);
			});
		},

		//init stage
		initStage: function() {
			this._$screen = this._$list.wrap('<div class="br-screen"></div>').parent();
			this._$stage = this._$screen.wrap('<div class="br-stage"></div>').parent();
			
			if (this._options.backgroundColor) {
				this._$stage.css({backgroundColor:this._options.backgroundColor});
			}
			this.createBorder();
			
			//init screen
			this._effects = new Effect(this);
			this._$screen.append('<div class="br-preloader"></div><div class="br-links"></div><div class="br-layers"></div>');
			this._$preloader = this._$screen.find('>.br-preloader');
			this._$linkWrapper = this._$screen.find('>.br-links');
			this._$layerWrapper = this._$screen.find('>.br-layers');
			if (this._options.pauseOnInteraction) {
				this._$linkWrapper.on('click' + this._namespace, '>a', $.proxy(this.pause, this));
			}

			//init timer
			if (!isNone(this._options.timer)) {
				var settings = {position:this._options.timerPosition, click:$.proxy(this.togglePlay, this)};
				if ('bar' === this._options.timer) {
					this._timer = new BarTimer(this, settings);
				}
				else if ('pie' === this._options.timer && SUPPORT.animation && this._transform) {
					this._timer = new PieTimer(this, settings);
				}
			}
			
			//init side buttons and thumbs
			this.initSideButtons();
		},
		
		//create border
		createBorder: function() {
			//set border options
			$.each(['width', 'style', 'color', 'radius'], $.proxy(function(i, name) {
				name = 'border' + capitalize(name);
				var	opt = this._options[name];
				if (!isEmptyStr(opt)) {
					this._$rotator.css(name, opt);
				}
			}, this));
			
			if (this._$rotator.brHasBorder()) {
				this._$rotator.toggleClass('br-flat-shadow', this._hasShadow).add(this._$screen).css({overflow:'hidden'});
			}
			else if (this._hasShadow && SUPPORT.transform3d && SUPPORT.preserve3d) {
				$('<div/>', {'class':'br-3d-shadow'}).prependTo(this._$rotator);
			}
		},
		
		//create border wrapper
		createBorderWrapper: function() {
			var $wrapper = $('<div/>', {'class':'br-wrapper'}).brCopyBorder(this._$rotator);
			this._$rotator.css({border:'none', borderRadius:0}).removeClass('br-flat-shadow').wrap($wrapper);
			$wrapper = this._$rotator.parent();

			if ($wrapper.brHasBorder()) {
				$wrapper.toggleClass('br-flat-shadow', this._hasShadow).css({overflow:'hidden'});
			}
			else if (this._hasShadow && 'horizontal' === this._orientation && 'bottom' === this._cpPosition.y) {
				this._$rotator.find('>.br-3d-shadow').remove();
				this._$extPanel.addClass('br-flat-shadow');
			}
		},
		
		//init items
		initItems: function() {
			var effects = ['effect', 'duration', 'easing', 'delay'],
				kenBurns = ['kbEffect', 'kbDuration', 'kbEasing'],
				props = ['columns', 'rows', 'interval', 'direction', 'order', 'alternate', 'autoReverse', 
						 'depth', 'shapeColor', 'shapeShading', 'shapeDepth',
						 'imagePosition'].concat(effects).concat(kenBurns);
			
			this._$items.each($.proxy(function(n, el) {
				var $item = $(el).data('ready', false),
					$img = $item.children('img').first(),
					$link = $item.children('a').first();

				if ($link.length && $link.find('>img').length) {
					if (!$img.length || $link.index() < $img.index()) {
						$item.data({link:$link.attr('href'), target:$link.attr('target')});
						$img = $link.find('>img').unwrap();
					}
				}
				
				$img.addClass('br-img').data('src', $img.data('src') || $img.attr('src'));
				$.each(['thumb', 'nav-thumb'], function(i, val) {
					$img.data(val, $img.data(val) || $img.data('src'));
				});

				//set tooltip
				if ('image' === this._options.tooltip) {
					$img.data('tooltip', $img.data('tooltip') || $img.data('thumb'));
					$item.prepend($('<img/>', {alt:'', 'class':'tooltip', src:$img.data('tooltip')}));
				}
				else if ('text' === this._options.tooltip) {
					$item.data({tooltip:$item.find('>.tooltip').html() || $img.attr('title')});
				}
				
				//add link
				if ($item.data('link')) {
					$('<a/>', {id:'br-link-' + n, 'class':'br-link', href:$item.data('link'), target:$item.data('target')}).appendTo(this._$linkWrapper);
				}
				
				//set data
				$item.brMapShorthand('transition', effects).brMapShorthand('ken-burns', kenBurns);
				$.each(props, $.proxy(function(i, val) {
					$item.data(val, getValue($item.data(val), this._options[val]));
				}, this));
				
				$item.data({easing:getEasing($item.data('easing'), this._cssTransition), kbEasing:getEasing($item.data('kbEasing'), true)});

				this.initLayer($item);

				this.injectKeyframes($item);
			}, this));
	
			//init layers
			this._$layers = this._$layerWrapper.find('.br-layer');
			if (this._options.layerOnHover) {
				this.addOnHover(this._$layerWrapper, 'br-transparent');
			}
		},
		
		//create style head tag
		createStyle: function() {
			var css = document.createElement('style');
			css.type = 'text/css';
			document.getElementsByTagName('head')[0].appendChild(css);
			this._sheet = css.sheet || css.styleSheet;
		},

		//inject item's keyframes
		injectKeyframes: function($item) {
			try {
				var depth = $.isNumeric($item.data('depth')) ? -Math.abs($item.data('depth')) : 0,
					rules = this._sheet.rules || this._sheet.cssRules;

				this._sheet.insertRule('@' + PREFIX + 'keyframes ' + ('br-' + this._uid + '-' + $item.index()) + ' { ' +
											FROM_KEYFRAME + 
											'50% { ' + getTransformProperty('translateZ(' + depth + 'px)') + ' } ' + 
											TO_KEYFRAME + 
									   '} ', rules.length);
			}
			catch (err) {
			}
		},

		//init control panel
		initCPanel: function() {
			this._$cpanel = $('<div/>', {'class':'br-cpanel'});
			this._cpPosition = getPosition(this._options.cpanelPosition);

			if ('vertical' === this._options.cpanelOrientation) {
				this._orientation = 'vertical';
				if ('center' === this._cpPosition.x) {
					this._cpPosition.x = 'left';
				}
			}
			else {
				this._orientation = 'horizontal';
				if ('center' === this._cpPosition.y) {
					this._cpPosition.y = 'bottom';
				}
			}
			
			this._$cpanel.addClass('br-' + this._orientation);

			if (this._options.cpanelOutside) {
				this._$cpanel.prependTo(this._$rotator);
			}
			else {
				this._$cpanel.appendTo(this._$rotator);
			}
			
			if (this._options.groupButtons && 'bullet' !== this._options.thumbnails) {
				var size = ('vertical' === this._orientation ? 'Width' : 'Height');
				this._$cpanel.addClass('br-button-group');
				this._options['thumb' + size] = this._options['button' + size] = Math.max(this._options['thumb' + size], this._options['button' + size]);
			}

			this.initThumbnails();
			this.initButtons();
			
			var $el = this._$cpanel.children();
			if ($el.length) {
				this._$cpWrapper = this._$cpanel.wrap('<div class="br-cpanel-wrapper"></div>').parent();
				this.initButtonGroup();

				if ('vertical' === this._orientation) {
					this._$cpanel.data({pos:'top', coord:'y', dim:'height', outerDim:'outerHeight'});

					//set size
					var maxWidth = Math.max.apply(null, $el.map(function() { return $(this).outerWidth(true); }).get());
					$el.each(function() {
						$(this).css({left:(maxWidth - $(this).outerWidth(true))/2});
					});
					this._$cpanel.css({width:maxWidth});
					
					//check offset
					this.setNavOffset();
				}
				else {
					this._$cpanel.data({pos:'left', coord:'x', dim:'width', outerDim:'outerWidth'});

					//set size
					var maxHeight = Math.max.apply(null, $el.map(function() { return $(this).outerHeight(true); }).get());
					this._$cpanel.css({height:maxHeight});
				}
				
				var data = this._$cpanel.data(),
					dim = data.dim,
					outerDim = data.outerDim;

				//position control panel
				if ('center' === this._cpPosition[data.coord]) {
					this._$cpWrapper.css(data.pos, '50%');
					this._$cpanel.css(data.pos, -this._$cpanel[outerDim](true)/2);
				}
				else {
					this._$cpWrapper.css(this._cpPosition[data.coord], 0);
				}

				//set inner or outer
				if (this._options.cpanelOutside) {
					this['setOuter' + capitalize(this._orientation) + 'CPanel']();
				}
				else {
					this.setInnerCPanel();
				}

				//check overflow
				if (!isNone(this._options.thumbnails)) {
					this._buttonSize = $el.not('.br-thumbnails')['brTotal' + capitalize(dim)](true);
					this._cpanelMargin = this._$cpanel[outerDim](true) - this._$cpanel[dim]();
					
					if (this._options.responsive) {
						this._$rotator.on('resizeCPanel' + this._namespace, $.proxy(this.resizeCPanel, this));
						this.addThumbScroll();
					}
					else if (this._$cpanel[outerDim](true) > this['_stage' + capitalize(dim)]) {
						this.resizeCPanel();
						this.addThumbScroll();
					}
				}
			}
			else {
				this._$cpanel.remove();
			}
		},
		
		setNavOffset: function() {
			var margin = this._$cpWrapper.width(),
				direction = ('left' === this._cpPosition.x ? 'prev' : 'next'),
				selector = '>.br-' + direction + '-wrapper';

			if (this._$outmost.hasClass('br-outer-navs')) {
				this._$outmost.find(selector).css(this._cpPosition.x, '+=' + margin);
			}
			else if ('large' === this._options.navButtons && !this._options.cpanelOutside) {
				var $container = this._$screen.find('>.br-nav-wrapper'),
					prop = {};
				prop['margin-' + this._cpPosition.x] = '+=' + margin;
				if ($container.find(selector).length) {
					$container.find(selector).find('>.br-nav-thumb').css(prop).data({margin:margin}).end()
							  .width($container.find(selector).children().brTotalWidth(true));
				}
				else {
					$container.find('>.br-side-' + direction).css(prop);
				}
				
			}
		},

		//init button group
		initButtonGroup: function() {
			var $first = this._$cpanel.children().first(),
				$last = this._$cpanel.children().last();

			if ($first.hasClass('br-thumbnails')) {
				$first = $first.find('>ul').children().first();
			}
			$first.addClass('br-first-item');

			if ($last.hasClass('br-thumbnails')) {
				$last = $last.find('>ul').children().last();
			}
			$last.addClass('br-last-item');
		},

		//set inner cpanel
		setInnerCPanel: function() {
			this._$cpWrapper.css(this._cpPosition['vertical' === this._orientation ? 'x' : 'y'], 0);
			
			if (this._options.cpanelOnHover) {
				this.addOnHover(this._$cpanel, 'br-transparent');
			}
		},

		//create outer cpanel background
		createCPanelBg: function() {
			this._$extPanel = this._$cpWrapper.wrap('<div class="br-ext-cp"></div>').parent();
			this._$extPanel.toggleClass('white', this._isWhite || this._$rotator.hasClass('white-cpanel'));
			
			if (SUPPORT.transform3d && SUPPORT.preserve3d) {
				var $face = $('<div/>').toggleClass('white', this._$extPanel.hasClass('white'));
				$('<div/>', {
					'class':'br-stage-bg',
					html:$('<div/>').append($face)
				}).prependTo(this._$stage);
				
				if ('vertical' === this._orientation) {
					$face.addClass('br-face-' + this._cpPosition.x);
					if (this._options.responsive) {
						this._$rotator.on('resizeCPanel' + this._namespace, function() {
							$face.width($face.height());
						});
					}
					else {
						$face.width(this._stageHeight);
					}
				}
				else {
					$face.addClass('br-face-' + this._cpPosition.y);
				}
			}
		},

		//set outer horizontal cpanel
		setOuterHorizontalCPanel: function() {
			var pos = this._cpPosition.y,
				size = this._$cpWrapper.height();

			this.createCPanelBg();
			this._$stage.css('padding-' + pos, getNonNegInt(this._options.cpanelGap, 0));
			this._$rotator.css('margin-' + pos, size).css({overflow:'visible'});
			this._$extPanel.css({left:0, width:'100%', height:size}).css(pos, -size);
			this.createBorderWrapper();
		},
		
		//set outer vertical cpanel
		setOuterVerticalCPanel: function() {
			var pos = this._cpPosition.x,
				size = this._$cpWrapper.width();

			this.createCPanelBg();
			this._$rotator.css('margin-' + pos, size).css({overflow:'visible'});
			this._$extPanel.css({top:0, width:size, height:'100%'}).css(pos, -size);
			this.createBorderWrapper();
		},
		
		//init buttons
		initButtons: function() {
			var $playButton, $prevButton, $nextButton;

			//init play button
			if (this._options.playButton) {
				$playButton = $('<div/>', {
					'class':'br-play-button',
					title:this._rotate ? this._options.pauseText : this._options.playText,
					html:'<div/>'
				}).toggleClass('br-pause', this._rotate)
				.on('click' + this._namespace, $.proxy(this.togglePlay, this))
				.appendTo(this._$cpanel);
			}
			
			//init navigation buttons
			if (true === this._options.navButtons || 'small' === this._options.navButtons) {
				$prevButton = $('<div/>', {
					'class':'br-prev-button',
					title:this._options.prevText,
					html:'<div/>'
				}).toggleClass('br-up', 'vertical' === this._orientation)
				.on('click' + this._namespace, $.proxy(this.prevSlide, this));

				$nextButton = $('<div/>', {
					'class':'br-next-button',
					title:this._options.nextText,
					html:'<div/>'
				}).toggleClass('br-down', 'vertical' === this._orientation)
				.on('click' + this._namespace, $.proxy(this.nextSlide, this));

				if ($playButton) {
					$playButton.before($prevButton).after($nextButton);
				}
				else {
					this._$cpanel.prepend($prevButton).append($nextButton);
				}
			}
			
			this._$cpanel.children(':not(.br-thumbnails)')
						.css({width:this._options.buttonWidth, height:this._options.buttonHeight, margin:this._options.buttonMargin})
						.toggleClass('white', this._isWhite || this._$rotator.hasClass('white-button'))
						.addTransitionClass('br-color-transition');
		},
		
		//init side buttons
		initSideButtons: function() {
			if ('large' === this._options.navButtons) {
				var $wrapper = $('<div/>', {'class':'br-nav-wrapper'}).appendTo(this._$screen);

				var $prevButton = $('<div/>', {
					'class':'br-side-prev',
					title:this._options.prevText,
					html:'<div/>'
				}).on('click' + this._namespace, $.proxy(this.prevSlide, this));

				var $nextButton = $('<div/>', {
					'class':'br-side-next',
					title:this._options.nextText,
					html:'<div/>'
				}).on('click' + this._namespace, $.proxy(this.nextSlide, this));

				var $buttons = $prevButton.add($nextButton).appendTo($wrapper).find('>div').addTransitionClass('br-element-transition');

				if (this._options.navButtonsOnHover) {
					this.addOnHover($buttons, 'br-shrink');
				}
			}
		},

		//init outer buttons
		initOuterButtons: function() {
			if (-1 < $.inArray(this._options.navButtons, ['outside', 'outer'])) {
				this._$outmost = this._$rotator.wrap('<div class="br-outer-navs"></div>').parent();
				
				var $prevNav = $('<div/>', {
					'class':'br-outer-prev',
					title:this._options.prevText,
					html:'<div/>'
				}).on('click' + this._namespace, $.proxy(this.prevSlide, this)).appendTo(this._$outmost);

				var $nextNav = $('<div/>', {
					'class':'br-outer-next',
					title:this._options.nextText,
					html:'<div/>'
				}).on('click' + this._namespace, $.proxy(this.nextSlide, this)).appendTo(this._$outmost);

				var margin = getNonNegInt(this._options.sideButtonMargin, 0);
				if (0 < margin) {
					$prevNav.css({paddingRight:margin}).css({left:-$prevNav.outerWidth()}).find('>div').css({marginLeft:'-=' + margin/2});
					$nextNav.css({paddingLeft:margin}).css({right:-$nextNav.outerWidth()}).find('>div').css({marginLeft:'+=' + margin/2});
				}

				if (this._options.navButtonsOnHover) {
					this.addOnHover($prevNav.add($nextNav), 'br-shrink');
				}
			}
		},

		//init nav thumbs
		initNavThumbs: function() {
			if (!IS_TOUCH && this._options.navThumbs && -1 < $.inArray(this._options.navButtons, ['large', 'outside', 'outer'])) {
				var $prevNav, $nextNav,
					$prevWrapper = $('<div/>', {'class':'br-prev-wrapper', data:{pos:'left'}}),
					$nextWrapper = $('<div/>', {'class':'br-next-wrapper', data:{pos:'right'}});
				
				//init wrappers
				if ('large' === this._options.navButtons) {
					$prevWrapper = this._$screen.find('>.br-nav-wrapper>.br-side-prev').wrap($prevWrapper).parent();
					$nextWrapper = this._$screen.find('>.br-nav-wrapper>.br-side-next').wrap($nextWrapper).parent();
				}
				else {
					$prevNav = this._$outmost.find('>.br-outer-prev').data({wrapper:$prevWrapper});
					$nextNav = this._$outmost.find('>.br-outer-next').data({wrapper:$nextWrapper});
					$prevNav.add($nextNav).each($.proxy(function(n, el) {
						var $wrapper = $(el).data('wrapper'),
							pos = $wrapper.data('pos');
						$wrapper.insertAfter($(el)).css(pos, '+=' + parseInt(this._$rotator.css('border-' + pos + '-width'), 10));
					}, this));
				}
				
				//init thumbs
				var $prevThumb = $('<div/>', {'class':'br-nav-thumb'}).on('click' + this._namespace, $.proxy(this.prevSlide, this)).prependTo($prevWrapper),
					$nextThumb = $('<div/>', {'class':'br-nav-thumb'}).on('click' + this._namespace, $.proxy(this.nextSlide, this)).appendTo($nextWrapper),
					content = '';
				
				this._$items.each(function(n, el) {
					var src = $(el).find('>img.br-img').data('nav-thumb');
					if (SUPPORT.backgroundSize) {
						content += '<div data-src="' + src + '"></div>';
					}
					else {
						content += '<img data-src="' + src + '"/>';
					}
				});
				$prevThumb.add($nextThumb).html(content);
	
				var $wrappers = $prevWrapper.add($nextWrapper);
				$wrappers.each($.proxy(function(n, el) {
					var $thumb = $(el).find('>.br-nav-thumb').css({width:this._options.navThumbWidth, height:this._options.navThumbHeight}),
						$imgs = $thumb.children().addTransitionClass('br-opacity-transition');
					
					$(el).height($thumb.outerHeight(true)).css({marginTop:-$(el).outerHeight()/2, width:$(el).children().brTotalWidth(true)});
					this.loadNextThumb($imgs.toArray(), false);
				}, this)).toggleClass('white', this._isWhite || this._$rotator.hasClass('white-nav-thumb'));
					
				//bind event handlers
				if ('large' === this._options.navButtons) {
					$wrappers.each($.proxy(function(n, el) {
						var $thumb = $(el).find('>.br-nav-thumb').addClass('br-transparent').addTransitionClass('br-opacity-transition'),
							pos = $(el).data('pos');
						
						$(el).css(pos, -$thumb.outerWidth(true))
							 .on('mouseenter' + this._namespace, {pos:pos}, $.proxy(this.showNavWrapper, this))
							 .on('mouseleave' + this._namespace, {pos:pos}, this.hideNavWrapper);
					}, this));
				}
				else {
					$wrappers.addClass('br-shrink').addTransitionClass('br-all-transition')
						  	.on('mouseenter' + this._namespace, function() { $(this).addClass('br-hover-on'); })
						  	.on('mouseleave' + this._namespace, function() { $(this).removeClass('br-hover-on').addClass('br-shrink'); });

					$prevNav.add($nextNav).on('mouseenter' + this._namespace, $.proxy(this.showNavThumb, this))
										  .on('mouseleave' + this._namespace, this.hideNavThumb);
				}

				this._$rotator.on('updateNavThumbs' + this._namespace, $.proxy(function() {
					var $prevItem = this._$currItem.brPrev(),
						$nextItem = this._$currItem.brNext(),
						$prevImg = $prevThumb.children().eq($prevItem.index()),
						$nextImg = $nextThumb.children().eq($nextItem.index());
					
					this.loadNavThumb($prevImg);
					this.loadNavThumb($nextImg);
					
					if (CHROME) {
						$prevWrapper.data('thumb-kb', new KBurns($prevImg, $prevItem.data('kb-effect')));
						if ($prevWrapper.add($prevNav).hasClass('br-hover-on')) {
							this.startNavKB($prevWrapper);
						}
						
						$nextWrapper.data('thumb-kb', new KBurns($nextImg, $nextItem.data('kb-effect')));
						if ($nextWrapper.add($nextNav).hasClass('br-hover-on')) {
							this.startNavKB($nextWrapper);
						}
					}
				}, this));
			}
		},
		
		loadNavThumb: function($img) {
			$img.siblings().addBack().css({opacity:0});
			$img.reflow().css({opacity:1});
		},

		showNavWrapper: function(e) {
			var $wrapper = $(e.currentTarget),
				prop = {};
			prop[e.data.pos] = 0;

			$wrapper.animate(prop, {duration:Rotator.ANIMATE_SPEED, queue:false,
				complete:function() {
					$(this).find('>.br-nav-thumb').removeClass('br-transparent');
				}
			}).addClass('br-hover-on');
			this.startNavKB($wrapper);
		},
			
		hideNavWrapper: function(e) {
			var $wrapper = $(e.currentTarget),
				$thumb = $wrapper.find('>.br-nav-thumb'),
				margin = $thumb.data('margin') || 0,
				prop = {};
			prop[e.data.pos] = -$thumb.outerWidth(true) + margin;

			$wrapper.stop(true, true).animate(prop, {duration:Rotator.ANIMATE_SPEED, queue:false}).removeClass('br-hover-on');
			$thumb.addClass('br-transparent');
		},

		showNavThumb: function(e) {
			var $nav = $(e.currentTarget).addClass('br-hover-on'),
				$wrapper = $nav.data('wrapper').removeClass('br-shrink');
			
			this.startNavKB($wrapper);
		},

		hideNavThumb: function(e) {
			var $nav = $(e.currentTarget).removeClass('br-hover-on'),
				$wrapper = $nav.data('wrapper');

			setTimeout(function() {
				if (!$wrapper.hasClass('br-hover-on')) {
					$wrapper.addClass('br-shrink');
				}
			}, 100);
		},

		startNavKB: function($wrapper) {
			var kBurns = $wrapper.data('thumb-kb');
			if (kBurns) {
				kBurns.restart();
			}
		},

		//init thumbnails
		initThumbnails: function() {
			if (!isNone(this._options.thumbnails)) {
				this._$thumbPanel = $('<div/>', {'class':'br-thumbnails'}).prependTo(this._$cpanel);
				this._$thumbList = $('<ul/>').prependTo(this._$thumbPanel);
				
				for (var i = 0; i < this._numItems; i++) {
					var $li = $('<li/>');
					switch(this._options.thumbnails) {
						case 'number':
							$li.html(i + 1);
							break;
						case 'text':
							$li.html(this._$items.eq(i).find('>img.br-img').attr('title'));
							break;
						case 'image':
							var $img = (SUPPORT.backgroundSize ? $('<div/>') : $('<img/>', {alt:''}));
							$img.data({src:this._$items.eq(i).find('>img.br-img').data('thumb')})
								.addTransitionClass('br-opacity-transition').wrap('<div class="br-img-wrapper"></div>');
							$li.addClass('br-img-thumb').prepend($img.parent());
							break;
						case 'bullet':
							$li.addClass('br-bullet');
							break;
					}
					this._$thumbList.append($li);
				}
				this._$thumbs = this._$thumbList.children();
				this._$thumbs.toggleClass('white', this._isWhite || this._$rotator.hasClass('white-thumb'))
							 .addTransitionClass('br-color-transition')
							 .on((this._options.selectOnHover ? 'mouseenter' : 'click') + this._namespace, $.proxy(this.selectSlide, this));

				if ('bullet' !== this._options.thumbnails) {
					if ('image' === this._options.thumbnails) {
						var $wrappers = this._$thumbs.children();
						$wrappers.css({width:this._options.thumbWidth - ($wrappers.outerWidth(true) - $wrappers.width()), height:this._options.thumbHeight - ($wrappers.outerHeight(true) - $wrappers.height())});
						this.loadNextThumb($wrappers.children().toArray(), true);
					}
					this._$thumbs.css({width:this._options.thumbWidth, height:this._options.thumbHeight, margin:this._options.thumbMargin, lineHeight:this._options.thumbHeight + 'px'});
				}
				
				this._$thumbList.css('vertical' === this._orientation ? {width:this._$thumbs.outerWidth(true)} : {height:this._$thumbs.outerHeight(true)});
				
				this._$rotator.on('rotatorChange', $.proxy(function() {
					this._$thumbs.eq(this._activeIndex).addClass('br-active').siblings().removeClass('br-active');
				}, this));

				this.initTooltip();
			}
		},
		
		//init layer
		initLayer: function($item) {
			var	$layers = $item.children(':not(.tooltip, img.br-img)').addClass('br-layer'),
				$bin = $('<div/>', {
					id:'br-layers-' + $item.index(),
					'class':'br-layer-bin',
					html:$layers
				}).appendTo(this._$layerWrapper);

			$layers.each($.proxy(function(n, el) {
				var $el = $(el),
					metric = {};

				if ('auto' === el.style.width && 'auto' === el.style.height) {
					$el.css('white-space', 'nowrap');
				}
				
				$.each(SIDES, $.proxy(function(i, side) {
					var pos = el.style[side];
					if ($.isNumeric(parseInt(pos, 10))) {
						if (!isPercent(pos)) {
							var dim = (-1 < $.inArray(side, ['top', 'bottom']) ? this._stageHeight : this._stageWidth);
							$el.css(side, (getInt(pos, 0)/dim * 100) + '%');
						}
						$el.css(OPPOSITE_SIDE[side], 'auto');
					}
					metric['padding-' + side] = getInt($el.css('padding-' + side), 0);
					metric['border-' + side + '-width'] = getInt($el.css('border-' + side + '-width'), 0);
				}, this));

				metric.width = $.isNumeric(parseInt(el.style.width, 10)) ? $el.width() : 'auto';
				metric.height = $.isNumeric(parseInt(el.style.height, 10)) ? $el.height() : 'auto';
				$.each(['fontSize', 'lineHeight', 'letterSpacing'], function(i, prop) {
					metric[prop] = parseInt($el.css(prop), 10);
				});

				$el.data({opacity:getFloat($el.css('opacity'), 1), metric:metric});
				$.each(['', 'Out'], $.proxy(function(i, dir) {
					var props = ['effect' + dir, 'duration' + dir, 'easing' + dir, 'delay' + dir];
					$el.brMapShorthand('transition' + dir, props);
					$.each(props, $.proxy(function(j, prop) {
						$el.data(prop, getValue($el.data(prop), this._options['layer' + capitalize(prop)]));
					}, this));
					$el.data('easing' + dir, getEasing($el.data('easing' + dir), this._cssTransition));
				}, this));
			}, this));
		},

		//init tooltip
		initTooltip: function() {
			if (!IS_TOUCH && !isNone(this._options.tooltip)) {
				var $inner = $('<div/>', {
					'class':'br-tooltip-inner',
					css:{width:this._options.tooltipWidth, height:this._options.tooltipHeight}
				});

				this._$tooltip = $('<div/>', {
					'class':'br-tooltip br-tooltip-' + OPPOSITE_SIDE[this._cpPosition['vertical' === this._orientation ? 'x' : 'y']],
					html:$inner.add('<div class="br-tail"/>')
				}).toggleClass('white', this._isWhite || this._$rotator.hasClass('white-tooltip')).prependTo($('body'));
				
				if ('image' === this._options.tooltip) {
					this._$items.each($.proxy(function(n, el) {
						var $thumb = this._$thumbs.eq(n),
							$img = $(el).find('>img.tooltip');

						if ($img.length && $img.attr('src')) {
							var $content = $img.clone().removeClass().addClass('br-transparent').appendTo($inner);
							$img.brHandleImage($img.attr('src'), {
								complete: $.proxy(function() {
									$img.brFill(this._options.tooltipWidth, this._options.tooltipHeight);
									$content.css({top:$img.css('top'), left:$img.css('left'), width:$img.width(), height:$img.height()})
											.removeClass('br-transparent');
									$img.remove();
									if (CHROME) {
										$thumb.data('tooltip-kb', new KBurns($content, $(el).data('kb-effect')));
									}
								}, this)
							});

							$thumb.on('mouseenter' + this._namespace, $.proxy(function(e) {
								this._$tooltip.stop(true, true);
								$content.show().siblings().hide();
								this.displayTooltip($(e.currentTarget));
							}, this)).on('mouseleave' + this._namespace, $.proxy(this.hideTooltip, this));
						}
					}, this));
				}
				else {
					this._$items.each($.proxy(function(n, el) {
						var caption = $(el).data('tooltip');
						if (!isEmptyStr(caption)) {
							this._$thumbs.eq(n).on('mouseenter' + this._namespace, $.proxy(function(e) {
								this._$tooltip.stop(true, true);
								$inner.html(caption);
								this.displayTooltip($(e.currentTarget));
							}, this)).on('mouseleave' + this._namespace, $.proxy(this.hideTooltip, this));
						}
					}, this));
				}
				
				if (!SUPPORT.pointerEvents && document.elementFromPoint) {
					this._$tooltip.on('mouseleave' + this._namespace, $.proxy(function(e) {
						if (!$(document.elementFromPoint(e.clientX, e.clientY)).closest('.banner-rotator').is(this._$rotator)) {
							this._$outmost.trigger('mouseleave' + this._namespace);
						}
					}, this));
				}
			}
		},
		
		//display tooltip
		displayTooltip: function($thumb) {
			var $base = (this._options.cpanelOutside ? this._$extPanel : $thumb),
				top, left;
			
			if ('vertical' === this._orientation) {
				left = $base.offset().left;
				if ('left' === this._cpPosition.x) {
					left += $base.width();
				}
				else {
					left -= this._$tooltip.outerWidth();
				}
				top = $thumb.offset().top - (this._$tooltip.height() - $thumb.height())/2;
			}
			else {
				top = $base.offset().top;
				if ('top' === this._cpPosition.y) {
					top += $base.height();
				}
				else {
					top -= this._$tooltip.outerHeight();
				}
				left = $thumb.offset().left - (this._$tooltip.width() - $thumb.width())/2;
			}
			
			this._tooltipId = setTimeout($.proxy(function() {
				this._$tooltip.css({opacity:0, top:top, left:left}).show().animate({opacity:1}, Rotator.ANIMATE_SPEED, 
					function() {
						var kBurns = $thumb.data('tooltip-kb');
						if (kBurns) {
							kBurns.start();
						}
					});
			}, this), this._options.tooltipDelay);
		},
		
		//hide tooltip
		hideTooltip: function(e) {
			clearTimeout(this._tooltipId);
			if (this._$tooltip) {
				this._$tooltip.stop(true).fadeOut(Rotator.ANIMATE_SPEED);
			}
		},
		
		//navigate to
		navigateTo: function(interact, fn, args) {
			this._interact = interact;
			if (this._interact && this._options.pauseOnInteraction) {
				this.pause();
			}
			
			if (!this._effects.inProgress()) {
				if (this._options.layerOutSync) {
					this.deferredLoad(fn, args);
				}
				else {
					fn.apply(this, args);
				}
			}
		},

		//select slide
		selectSlide: function(e) {
			var index = (typeof e === 'number' ? parseInt(e, 10) : $(e.currentTarget).index());
			if (withinRange(index, 0, this._numItems - 1) && index !== this._activeIndex) {
				this.navigateTo(true, this.select, [index]);
			}
		},
		
		select: function(index) {
			this._backward = index < this._activeIndex;
			this._activeIndex = index;
			this.loadSlide();
		},
		
		//to previous slide
		prevSlide: function() {
			this.navigateTo(true, this.prev, [true]);
		},
		
		prev: function(triggerEvent) {
			this._backward = true;
			this._activeIndex = (0 < this._activeIndex ? (this._activeIndex - 1) : (this._numItems - 1));
			if (triggerEvent) {
				this.triggerEvent('prev', {index:this._activeIndex});
			}
			this.loadSlide();
		},
		
		//to next slide
		nextSlide: function() {
			this.navigateTo(true, this.next, [true]);
		},
		
		next: function(triggerEvent) {
			this._backward = false;
			this._activeIndex = (this._numItems - 1 > this._activeIndex ? (this._activeIndex + 1) : 0);
			if (triggerEvent) {
				this.triggerEvent('next', {index:this._activeIndex});
			}
			this.loadSlide();
		},
		
		//rotate slide
		rotateSlide: function() {
			this.navigateTo(false, this.next, [false]);
		},
		
		//toggle play
		togglePlay: function() {
			if (this._rotate) {
				this.pause();
			}
			else {
				this.play();
			}
		},
		
		//play
		play: function() {
			if (!this._rotate) {
				this._rotate = true;
				this._$cpanel.find('>.br-play-button').addClass('br-pause').attr({title:this._options.pauseText});
				if (!this._effects.inProgress()) {
					this.resumeTimer();
				}
				this.triggerEvent('play', {index:this._activeIndex, delay:this._delay});
			}
		},
	
		//pause
		pause: function() {
			if (this._rotate) {
				this._rotate = false;
				this._$cpanel.find('>.br-play-button').removeClass('br-pause').attr({title:this._options.playText});
				if (!this._effects.inProgress()) {
					this.pauseTimer();
				}
				this.triggerEvent('pause', {index:this._activeIndex, delay:this._delay});
			}
		},
		
		//display layers
		displayLayers: function() {
			this.stopLayers(true);
			this._layerIds = [];
			this._requestIds = [];
			
			var $wrapper = this._$layerWrapper.find('>#br-layers-' + this._$currItem.index());
			$wrapper.addClass('br-active-layers').siblings().removeClass('br-active-layers');
			$wrapper.children().each($.proxy(function(n, el) {
				var $layer = $(el),
					delay = getNonNegInt($layer.data('delay'), 0);

				this._layerIds.push(setTimeout($.proxy(function() {
					var id = requestAnimationFrame($.proxy(function() {
						$layer.css({opacity:$layer.data('opacity'), margin:0, transform:'none'}).show();
						this.animateLayer($layer, false);
						this.queueLayerOut($layer);
					}, this));
					this._requestIds.push(id);
				}, this), delay));
			}, this));
		},
		
		//hide layer
		hideLayer: function($layer) {
			$layer.stopTransition(true, true).stopAnimation(true, true);
			this.animateLayer($layer, true);
			$layer.data('promise', $layer.promise());
		},

		//animate layer
		animateLayer: function($layer, out) {
			var data = $layer.data(),
				dir = (out ? 'Out' : ''),
				effect = data['effect' + dir],
				opts = {duration:parseInt(data['duration' + dir], 10), easing:data['easing' + dir], complete:$.noop};

			if (/^slide/.test(effect)) {
				opts.direction = effect.substring('slide'.length).toLowerCase();
				opts.mode = (out ? 'hide' : 'show');
				opts.transform = this._transform;
				$layer.brSlideEffect(opts);
				return;
			}

			if (out) {
				if (effect in OPPOSITE_LAYER) {
					effect = OPPOSITE_LAYER[effect];
				}
				
				opts.complete = function() {
					$layer.hide();
				};
			}
			
			if (/^(blur|flip|spin|zoom)/.test(effect) && SUPPORT.animation && this._transform) {
				var animationName = 'br-layer-' + camelToDash(effect);
				if (out) {
					animationName += '-out';
				}
				$layer.animation(animationName, opts);
			}
			else {
				var props;
				if (/^(move|shift)/.test(effect)) {
					var match = effect.match(/^(move|shift)/);
					props = this['get' + capitalize(match[0]) + 'Props']($layer, effect.substring(match[0].length).toLowerCase());
				}
				else if ('none' === effect) {
					opts.complete.call(this);
					return;
				}
				else {
					props = {
						from:{opacity:0},
						to:{opacity:data.opacity}
					};
				}

				if (out) {
					props = {from:props.to, to:props.from};
				}

				$layer.css(props.from).transition(props.to, opts);
			}
		},

		queueLayerOut: function($layer) {
			var delay = getNonNegInt($layer.data('delayOut'), 0);
			if (0 < delay) {
				$layer.promise().done($.proxy(function() {
					this._layerIds.push(setTimeout($.proxy(function() { 
						this.hideLayer($layer);
					}, this), delay));
				}, this));
			}
		},

		//stop layers
		stopLayers: function(stop) {
			while(this._layerIds.length) {
				clearTimeout(this._layerIds.pop());
			}

			while(this._requestIds.length) {
				cancelAnimationFrame(this._requestIds.pop());
			}

			if (stop) {
				this._$layers.stopTransition(true, true).stopAnimation(true, true);
			}
		},
		
		//clear layers
		clearAllLayers: function(transition) {
			this.stopLayers(true);
			var $layers = this._$layers.filter(':visible');
			if (transition) {
				$layers.each($.proxy(function(n, el) { 
					this.hideLayer($(el));
				}, this));
			}
			else {
				$layers.hide();
			}
		},
		
		//get move property
		getMoveProps: function($el, direction) {
			var isHorizontal = ('left' === direction || 'right' === direction),
				dim = isHorizontal ? 'outerWidth' : 'outerHeight',
				fwd = ('right' === direction || 'down' === direction),
				from = {},
				to = {},
				pos, translate, side;
			
			if (this._transform) {
				if (isHorizontal) {
					pos = $el.position().left;
					translate = 'translateX';
				}
				else {
					pos = $el.position().top;
					translate = 'translateY';
				}
			}
			else {
				side = (isHorizontal ? 'right' : 'bottom');
				if ($.isNumeric(parseInt($el[0].style[side], 10))) {
					fwd = !fwd;
				}
				else {
					side = OPPOSITE_SIDE[side];
				}
				pos = Math.round(parseFloat($el[0].style[side])/100 * this._$screen[dim]());
			}
			
			var offset = (fwd ? -(pos + $el[dim]() + 1) : (this._$screen[dim]() - pos) + 1);
			if (this._transform) {
				from.transform = translate + '(' + offset + 'px)';
				to.transform = translate + '(0px)';
			}
			else {
				from['margin-' + side] = offset;
				to['margin-' + side] = 0;
			}
			return {from:from, to:to};
		},

		//get shift property
		getShiftProps: function($el, direction) {
			var isHorizontal = ('left' === direction || 'right' === direction),
				inverse = ('right' === direction || 'down' === direction ? -1 : 1),
				from = {opacity:0},
				to = {opacity:1};
			
			if (this._transform) {
				var translate = 'translate' + (isHorizontal ? 'X' : 'Y');
				from.transform = translate + '(' + (inverse * 100) + '%)';
				to.transform = translate + '(0)';
			}
			else {
				var side, dim;
				if (isHorizontal) {
					side = 'right';
					dim = 'outerWidth';
				}
				else {
					side = 'bottom';
					dim = 'outerHeight';
				}
				
				if ($.isNumeric(parseInt($el[0].style[side], 10))) {
					inverse *= -1;
				}
				else {
					side = OPPOSITE_SIDE[side];
				}

				from['margin-' + side] = inverse * $el[dim]();
				to['margin-' + side] = 0;
			}
			return {from:from, to:to};
		},

		//deferred load
		deferredLoad: function(fn, args) {
			if (!this._promise || 'pending' !== this._promise.state()) {
				this._$items.find('>img.br-img').off('load.display');
				this.resetTimer();
				this.stopLayers(false);
				
				var $layers = this._$layers.filter(':visible');
				if ($layers.length) {
					var promises = [],
						max = 0;

					$layers.each($.proxy(function(n, el) {
						var promise = $(el).data('promise');
						if (!promise || 'pending' !== promise.state()) {
							this.hideLayer($(el));
						}
						promises.push($(el).data('promise'));
						max = Math.max(max, $(el).data('duration-out'));
					}, this)).removeData('promise');

					this._promise = $.when.apply(null, promises)
									  	.always($.proxy(function() { 
											fn.apply(this, args);
										}, this));

					setTimeout(function() {
						$layers.dequeue();
					}, max + 100);
				}
				else {
					fn.apply(this, args);
				}
			}
		},
		
		//load current slide
		loadSlide: function() {
			this._$items.find('>img.br-img').off('load.display');
			this.resetTimer();

			this._effects.clear();
			this._$linkWrapper.children().hide();
			this.clearAllLayers(true);

			//trigger events
			var params = {index:this._activeIndex};
			this.triggerEvent('change', params);
			if (0 === this._activeIndex) {
				this.triggerEvent('first', params);
			}
			if (this._numItems - 1 === this._activeIndex) {
				this.triggerEvent('last', params);
			}

			//load content
			var $item = this._$items.eq(this._activeIndex);
			if ($item.data('ready')) {
				this.displayContent($item);
			}
			else {
				this._$preloader.show();
				var $img = $item.find('>img.br-img');
				$img.brHandleImage($img.data('src'), {
					namespace:'display',
					complete:$.proxy(function() {
						if (!$item.data('ready')) {
							this.processImage($item);
						}
						this.displayContent($item);
					}, this)
				});
			}
		},
		
		//display current content
		displayContent: function($item) {
			this._$preloader.hide();
					
			this._$prevItem = this._$currItem;
			this._$currItem = $item;
			var data = this._$currItem.data();
			
			//update nav thumbs
			this._$rotator.trigger('updateNavThumbs' + this._namespace);

			//control sync
			if (this._options.hideControl) {
				this._$controls.addClass('br-transparent');
				this.hideTooltip();
			}

			//display layers
			if (!this._options.layerSync) {
				this.displayLayers();
			}
			
			//set ken burns
			if (CHROME || !IS_TOUCH) {
				this._kBurns = new KBurns(this._$currItem.find('>img.br-img'), data.kbEffect, {duration:getPosInt(data.kbDuration, data.delay), easing:data.kbEasing});
			}

			//activate
			var effectOff = (!this._options.effectOnInteraction && this._interact) || (!this._options.effectOnStart && !this._$prevItem);
			if (effectOff || (0 > $.inArray(data.effect, Effect.EFFECTS) && 'random' !== data.effect)) {
				this.activateItem(false);
			}
			else {
				this._effects.start(data);
			}
		},
		
		//activate current item
		activateItem: function(isResize) {
			if (!isResize) {
				this.triggerEvent('changed', {index:this._activeIndex});
			}

			this._$currItem.css({visibility:'visible'}).siblings().css({visibility:'hidden'});
			this._$linkWrapper.children('a#br-link-' + this._$currItem.index()).show();

			if (isResize || this._options.layerSync) {
				this.displayLayers();
			}
			
			if (this._options.hideControl) {
				this._$controls.removeClass('br-transparent');
			}
			
			this.startTimer();
		},
		
		//load next image
		loadNextImage: function(items, complete) {
			if (items.length) {
				this.loadImage($(items.shift())).always($.proxy(function() {
					if (this._$progressBar) {
						this._$progressBar.children().width((this._numItems - items.length)/this._numItems * 100 + '%');
					}
					this.loadNextImage(items, complete);
				}, this));
			}
			else if ($.isFunction(complete)) {
				complete.call(this);
			}
		},

		//load image
		loadImage: function($item) {
			var deferred = $.Deferred(),
				$img = $item.find('>img.br-img');
			
			$img.brHandleImage($img.data('src'), {
				complete: $.proxy(function() {
					if (!$item.data('ready')) {
						this.processImage($item);
					}
					deferred.resolve();
				}, this),
				error: function() { 
					deferred.reject();
				}
			});

			return deferred.promise();
		},
		
		//load next thumb
		loadNextThumb: function(thumbs, fadeIn) {
			if (thumbs.length) {
				this.loadThumb($(thumbs.shift()), fadeIn).always($.proxy(function() {
					this.loadNextThumb(thumbs, fadeIn);
				}, this));
			}
		},

		//load thumb
		loadThumb: function($thumb, fadeIn) {
			var deferred = $.Deferred(),
				$img = ($thumb.is('img') ? $thumb : $('<img/>'));
			
			$img.brHandleImage($thumb.data('src'), {
				complete: function() {
					if ($thumb.is('img')) {
						$thumb.brFill($thumb.parent().width(), $thumb.parent().height());
					}
					else {
						$thumb.css({backgroundImage:'url(' + $thumb.data('src') + ')'});
					}

					if (fadeIn) {
						$thumb.css({opacity:1});
					}
					deferred.resolve();
				},
				error: function() { 
					deferred.reject();
				}
			});

			return deferred.promise();
		},

		//process image
		processImage: function($item) {
			$item.data('ready', true);
			var $img = $item.find('>img.br-img'),
				position = $item.data('imagePosition'),
				arr = (position + '').split(' ', 2);
				
			if (2 === arr.length) {
				$.each(['left', 'top'], function(i, val) {
					var pos = arr[i];
					if ($.isNumeric(parseInt(pos, 10))) {
						$img.css(val, $.isNumeric(pos) ? parseInt(pos, 10) : pos);
					}
				});
			}
			else if (-1 < $.inArray(position, ['fill', 'fit', 'stretch', 'center'])) {
				var fn = 'br' + capitalize(position);
				if ($.isFunction($img[fn])) {
					$img[fn](this._stageWidth, this._stageHeight);
				}
			}
			
			if (this._options.responsive) {
				var ratio = this._$stage.width()/this._stageWidth,
					props = {top:parseInt($img.css('top'), 10), left:parseInt($img.css('left'), 10), width:$img.width(), height:$img.height()};
				
				$img.data('metric', props);
				$.each(props, function(name, val) {
					$img.css(name, Math.round(ratio * val));
				});
			}
			
			this.triggerEvent('load', {index:$item.index()});
		},
		
		//start timer
		startTimer: function() {
			this._delay = getPosInt(this._$currItem.data('delay'), $.fn.bannerRotator.defaults.delay);
			this.resumeTimer();
		},
		
		//resume timer
		resumeTimer: function() {
			if (this._rotate && 0 < this._delay) {
				this._start = $.now();
				this._timeout = setTimeout($.proxy(this.rotateSlide, this), this._delay);
				
				if (this._kBurns) {
					this._kBurns.start();
				}

				if (this._timer) {
					this._timer.start(this._delay);
				}
			}
		},
		
		//reset timer
		resetTimer: function(isResize) {
			this._delay = 0;
			clearTimeout(this._timeout);

			if (this._kBurns) {
				this._kBurns[isResize ? 'set' : 'stop']();
			}

			if (this._timer) {
				this._timer.stop();
			}
		},
		
		//pause timer
		pauseTimer: function() {
			if (this._start) {
				this._delay -= ($.now() - this._start);
			}
			clearTimeout(this._timeout);

			if (this._kBurns) {
				this._kBurns.stop();
			}
			
			if (this._timer) {
				this._timer.pause();
			}
		},
		
		//add mouseenter & mouseleave handlers
		addOnHover: function($el, hide) {
			if (!IS_TOUCH) {
				$el.addClass(hide).addTransitionClass('br-all-transition');
				this._$outmost.on('mouseenter' + this._namespace, function() { 
								$el.removeClass(hide); 
							})
							.on('mouseleave' + this._namespace, $.proxy(function(e) { 
								if (!this.onTooltip(e)) {
									$el.addClass(hide);
								}
							}, this));
			}
		},
		
		//add thumb scrolling
		addThumbScroll: function() {
			this._$rotator.on('rotatorChange', $.proxy(this.syncThumbs, this));
			if (!IS_TOUCH) {
				var easing = getEasing('easeOutCirc', false),
					data = this._$cpanel.data(),
					pos = data.pos,
					dim = data.dim,
					pagePos = 'page' + capitalize(data.coord);

				this._$thumbPanel.on('mouseenter' + this._namespace, function() {
										$(this).addClass('br-hover-on');
									})
									.on('mouseleave' + this._namespace, function() {
										$(this).removeClass('br-hover-on');
									})
									.on('mousemove' + this._namespace, $.proxy(function(e) {
										var pct = (e[pagePos] - this._$thumbPanel.offset()[pos])/this._$thumbPanel[dim]();
											prop = {};
										prop[pos] = this._$thumbPanel.data('range') * pct;
										this._$thumbList.animate(prop, {duration:Rotator.ANIMATE_SPEED, easing:easing, queue:false});
									}, this));
			}
		},
		
		//sync thumb position
		syncThumbs: function() {
			if (!this._$thumbPanel.hasClass('br-hover-on')) {
				var data = this._$cpanel.data(),
					thumb = this._$thumbs.eq(this._activeIndex).offset()[data.pos],
					panel = this._$thumbPanel.offset()[data.pos],
					prop = {};
				
				if (thumb < panel) {
					prop[data.pos] = -this._activeIndex * this._$thumbs[data.outerDim](true);
				}
				else if (thumb + this._$thumbs[data.dim]() > panel + this._$thumbPanel[data.dim]()) {
					prop[data.pos] = (this._numItems - 1 - this._activeIndex) * this._$thumbs[data.outerDim](true) + this._$thumbPanel.data('range');
				}

				if (!$.isEmptyObject(prop)) {
					this._$thumbList.animate(prop, {duration:Rotator.ANIMATE_SPEED, queue:false});
				}
			}
		},
		
		//resize cpanel
		resizeCPanel: function() {
			var data = this._$cpanel.data(),
				pos = data.pos,
				dim = data.dim;

			this._$thumbPanel.css(dim, Math.min(this._$screen[dim]() - this._cpanelMargin - this._buttonSize, this._$thumbList[dim]()))
							 .data({range:this._$thumbPanel[dim]() - this._$thumbList[dim]()});
			this._$thumbList.stop().css(pos, Math.max(this._$thumbPanel.data('range'), this._$thumbList.position()[pos]));
			this._$rotator.find('>.br-ext-cp').css(dim, this._$screen[dim]());

			if ('center' === this._cpPosition[data.coord]) {
				this._$cpanel.css(pos, -this._$cpanel[data.outerDim](true)/2);
			}
		},
		
		//touch start
		touchStart: function(e) {
			this._swipeMove = 0;
			if (1 === e.originalEvent.touches.length) {
				this._swipeStart = new Date();
				this._startX = e.originalEvent.touches[0].pageX;
				this._startY = e.originalEvent.touches[0].pageY;
				this._$rotator.on('touchmove' + this._namespace, $.proxy(this.touchMove, this))
							  .one('touchend' + this._namespace, $.proxy(this.touchEnd, this));
			}
		},
		
		//touch move
		touchMove: function(e) {
			var xDist = this._startX - e.originalEvent.touches[0].pageX,
				yDist = this._startY - e.originalEvent.touches[0].pageY;
				
			if ('vertical' === this._options.swipe) {
				this._swipeMove = yDist;
				this._isSwipe = Math.abs(this._swipeMove) > Math.abs(xDist);
			}
			else {
				this._swipeMove = xDist;
				this._isSwipe = Math.abs(this._swipeMove) > Math.abs(yDist);
			}
			
			if (this._isSwipe) {
				e.preventDefault();
			}
		},
		
		//touch end
		touchEnd: function(e) {
			this._$rotator.off('touchmove' + this._namespace);
			
			if (this._isSwipe) {
				if (Math.abs(this._swipeMove) > 50) {
					if (this._swipeMove < 0) {
						this.swipeBack();
					}
					else {
						this.swipeFwd();
					}
				}
			}
		},
		
		//mousewheel scroll
		mousescroll: function(e) {
			e.preventDefault();
			var delta = (e.originalEvent.wheelDelta ?  e.originalEvent.wheelDelta : -e.originalEvent.detail);
			if (0 < delta) {
				this.prevSlide();
			}
			else {
				this.nextSlide();
			}
		},
		
		//keydown
		keyControl: function(e) {
			switch(e.which) {
				case 35:
					this.selectSlide(this._numItems - 1);
					break;
				case 36:
					this.selectSlide(0);
					break;
				case 37:
					this.prevSlide();
					break;
				case 39:
					this.nextSlide();
					break;
				case 32:
					this.togglePlay();
					break;
				default:
					return;
			}
			e.preventDefault();
		},

		//resize
		resize: function() {
			if ($(window).width() !== this._winWidth) {
				//reset
				this._winWidth = $(window).width();
				this.resetTimer(true);
				this.clearAllLayers(false);
				this._effects.clear();
				
				//resize stage
				var ratio = this._$stage.width()/this._stageWidth;
				this._$stage.css({height:Math.round(ratio * this._stageHeight)});
				this._$screen.css({width:this._$stage.width(), height:this._$stage.height()});
				
				//resize images
				this._$items.each(function(n, item) {
					if ($(item).data('ready')) {
						var $img = $(item).find('>img.br-img');
						$.each($img.data('metric'), function(name, val) {
							$img.css(name, Math.round(ratio * val));
						});
					}
				});
				
				//resize layers
				this._$layers.each(function(n, layer) {
					$.each($(layer).data('metric'), function(name, val) {
						if ($.isNumeric(val)) {
							$(layer).css(name, Math.ceil(ratio * val) + 'px');
						}
					});
				});
				
				//resize cpanel
				this._$rotator.trigger('resizeCPanel' + this._namespace);

				//display current
				if (this._$currItem && this._$currItem.data('ready')) {
					this.activateItem(true);
				}
			}
		},
		
		//check on tooltip
		onTooltip: function(e) {
			if (!SUPPORT.pointerEvents && document.elementFromPoint) {
				return $(document.elementFromPoint(e.clientX, e.clientY)).closest('.br-tooltip').is(this._$tooltip);
			}
			return false;
		},

		//trigger event
		triggerEvent: function(name, data) {
			name = capitalize(name);
			data = data || {};

			this._$rotator.trigger(Rotator.PLUGIN + name, data);

			var callback = this._options['on' + name];
			if ($.isFunction(callback)) {
				callback.call(this, data);
			}
		},

		//get option value
		getOption: function(name) {
			if (typeof name === 'string') {
				return this._options[name];
			}
			return this._options;
		},

		//destroy rotator
		destroy: function() {
			this.resetTimer();
			this.stopLayers(true);
			this._effects.clear();

			$(window).add($(document)).off(this._namespace);
			this._$rotator.find('*').addBack().off(this._namespace).removeData();
			
			$.each(Rotator.EVENTS, $.proxy(function(i, name) {
				this._$rotator.off(Rotator.PLUGIN + capitalize(name));
			}, this));

			//restore elements
			if (this._$tooltip) {
				this._$tooltip.remove();
			}

			$.each(['.br-wrapper', '.br-outer-navs'], $.proxy(function(i, selector) {
				if (this._$rotator.parent(selector).length) {
					this._$rotator.parent(selector).children(':not(.banner-rotator)').remove();
					this._$rotator.unwrap();
				}
			}, this));

			this._$rotator.html(this._html).attr({style:this._style}).removeClass('br-flat-shadow br-no-touch');
		}
	};
	
	//shuffle elements
	function shuffleElements($el) {
		var items = $el.children().toArray();
		shuffleArray(items);
		$el.append(items);
	}

	//get position
	function getPosition(val) {
		var props = {},
			arr = val.split(' ', 2);
		
		if (2 !== arr.length) {
			arr = camelToDash(val).split('-');
		}

		props.x = getEnum(arr[0], ['left', 'center', 'right'], 'left');
		props.y = getEnum(arr[1], ['top', 'center', 'bottom'], 'bottom');

		return props;
	}

	//get valid easing
	function getEasing(easing, css) {
		if (css) {
			if (!(easing in CUBIC_BEZIER)) {
				return 'ease';
			}
		}
		else if (!(easing in $.easing)) {
			return 'swing';
		}
		return easing;
	}

	//get random array element
	function getRandomItem(arr) {
		return arr[Math.floor(Math.random() * arr.length)];
	}

	//test number within range
	function withinRange(val, min, max) {
		return ($.isNumeric(val) && min <= val && val <= max);
	}

	//test for none
	function isNone(val) {
		return (typeof val === 'undefined' || false === val || 'none' === val);
	}

	//check if empty string
	function isEmptyStr(val) {
		return (typeof val === 'undefined' || '' === $.trim(val));
	}

	//get integer
	function getInt(val, defaultVal) {
		val = parseInt(val, 10);
		return ($.isNumeric(val) ? val : defaultVal);
	}
	
	//get positive integer
	function getPosInt(val, defaultVal) {
		val = parseInt(val, 10);
		return ($.isNumeric(val) && 0 < val ? val : defaultVal);
	}

	//get non-negative integer
	function getNonNegInt(val, defaultVal) {
		val = parseInt(val, 10);
		return ($.isNumeric(val) && 0 <= val ? val : defaultVal);
	}
	
	//get float
	function getFloat(val, defaultVal) {
		val = parseFloat(val);
		return ($.isNumeric(val) ? val : defaultVal);
	}
	
	//get value
	function getValue(val, defaultVal) {
		return (typeof val !== 'undefined' ? val : defaultVal);
	}
	
	//get enum value
	function getEnum(val, list, defaultVal) {
		return (-1 < $.inArray(val, list) ? val : defaultVal);
	}

	//check for percent
	function isPercent(val) {
		val += '';
		var last = val.length - 1;
		return '%' === val.charAt(last) && $.isNumeric(val.substring(0, last));
	}
	
	//round to
	function roundTo(val, digits) {
		var num = Math.pow(10, digits);
		return Math.round(val * num)/num;
	}

	//check for image file
	function isImage(val) {
		return /[^\s]+\.(bmp|gif|jpg|jpeg|png|tiff)$/i.test(val);
	}

	//check style property support
	function styleSupport(prop) {
		var el = document.createElement('div'),
			style = el.style,
			supported = false;
	
		if (prop in style) {
			supported = prop;
		}
		else {
			var capProp = capitalize(prop),
				prefixes = ['Moz', 'Webkit', 'O', 'ms'];
			
			for (var i = 0; i < prefixes.length; i++) {
				var prefixProp = prefixes[i] + capProp;
				if (prefixProp in style) {
					supported = prefixProp;
					break;
				}
			}
		}
		
		el = null;
		SUPPORT[prop] = supported;
		return supported;
	}
	
	//is android check
	function isAndroid(version) {
		var android = 'android',
			ua = navigator.userAgent.toLowerCase(),
			index = ua.indexOf(android);
		
		return (-1 < index && (typeof version === 'undefined' || parseFloat(ua.substring(index + android.length)) <= version));
	}
	
	//is chrome check
	function isChrome() {
		return /Chrome|CriOS/.test(navigator.userAgent);
	}

	//convert camel case to dash
	function camelToDash(str) {
		return (str + '').replace(/([A-Za-z])([A-Z])/g, '$1-$2').toLowerCase();
	}

	//convert dash to camel case
	function dashToCamel(str) {
		return (str + '').replace(/([A-Za-z])(-)([A-Za-z])/g, function(match, p1, p2, p3) {
			return (p1 + p3.toUpperCase());
		});
	}

	//check css property support
	function propertySupport(prop, val) {
		if (false === prop) {
			return false;
		}

		var dashProp = camelToDash(prop).replace(/^(moz-|webkit-|o-|ms-)/, '-$1'),
    		el = document.createElement('div'),
    		support;
    	
   		el.style[dashProp] = val;
    	support = -1 < (el.style[dashProp] + '').indexOf(val);
    	el = null;
   		
   		return support;
	}

	//check css filter support
	function filterSupport() {
		var el = document.createElement('div'),
			prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
    		cssText = prefixes.join('filter:blur(2px); ');

    	el.style.cssText = cssText;
    	return !!el.style.length && (document.documentMode === undefined || document.documentMode > 9);
	}

	//shuffle array
	function shuffleArray(arr) {
		var i = arr.length;
		while(0 < --i) {
			var ri = Math.floor(Math.random() * (i + 1)),
				temp = arr[i];
			arr[i] = arr[ri];
			arr[ri] = temp;
		}
	}
	
	//capitalize string
	function capitalize(str) {
		str += '';
		return str.charAt(0).toUpperCase() + str.substring(1);
	}

	//convert degrees to radians
	function degreesToRadians(degrees) {
		return (degrees * Math.PI/180);
	}

	//get transform property
	function getTransformProperty(transform) {
		return PREFIXES.concat(['', '']).join('transform:' + transform + ';');
	}

	//debounce
	function debounce(fn, wait, immediate) {
		var timeout;
		return function() {
			var context = this, 
				args = arguments;
			var later = function() {
				timeout = null;
				if (!immediate) {
					fn.apply(context, args);
				}
			};
			var callNow = immediate && !timeout;
			clearTimeout(timeout);
			timeout = setTimeout(later, wait);
			if (callNow) {
				fn.apply(context, args);
			}
		};
	}

	//get object keys
	function getKeys(obj) {
		return $.map(obj, function(val, key) {
			return key;
		});
	}

	//add effect presets
	function addPresets(presets, effects, directions, orders) {
		$.each(effects, function(i, effect) {
			$.each(directions, function(j, direction) {
				$.each(orders, function(k, order) {
					presets.push({effect:effect, direction:direction, order:order});
				});
			});
		});
	}

	//create wrapper
	function createWrapper($el) {
		var size = {width:$el.width(), height:$el.height()},
		$wrapper = $('<div/>', {
			'class':'br-effect-wrapper',
			css:{
				position:$el.css('position'),
				'float':$el.css('float'),
				width:$el.outerWidth(true),
				height:$el.outerHeight(true),
				'z-index':$el.css('z-index'),
				top:$el[0].style.top,
				left:$el[0].style.left,
				bottom:$el[0].style.bottom,
				right:$el[0].style.right
			}
		});
		
		$el.wrap($wrapper).css({
			display:'block',
			position:'relative',
			top:0,
			bottom:'auto',
			left:0,
			right:'auto'
		}).css(size);
	}
		
	//remove wrapper
	function removeWrapper($el) {
		if ($el.parent().hasClass('br-effect-wrapper')) {
			$el.unwrap();
		}
	}
		
	//save element style
	function saveStyle($el, props) {
		$.each(props, function(i, val) {
			$el.data('style-' + val, $el[0].style[val]);
		});
	}
		
	//restore element style
	function restoreStyle($el, props) {
		$.each(props, function(i, val) {
			var style = $el.data('style-' + val);
			$el.css(val, (typeof style === 'undefined' ? '' : style));
		});
	}

	//slide effect
	$.fn.brSlideEffect = function(opts) {
		var props = ['display', 'position', 'top', 'left', 'bottom', 'right', 'width', 'height'],
			isHorizontal = 'left' === opts.direction || 'right' === opts.direction,
			inverse = ('right' === opts.direction || 'down' === opts.direction ? -1 : 1),
			hide = 'hide' === opts.mode;
		
		return this.each(function() {
			var $el = $(this),
				from = {},
				to = {};
			
			if (opts.transform) {
				var translate = 'translate' + (isHorizontal ? 'X' : 'Y'),
					begin = inverse * 100,
					end = 0;
				
				if (hide) {
					end = -begin;
					begin = 0;
				}

				from.transform = translate + '(' + begin + '%)';
				to.transform = translate + '(' + end   + '%)';
			}
			else {
				var pos, dist;
				if (isHorizontal) {
					pos = 'left';
					dist = $el.outerWidth(true);
				}
				else {
					pos = 'top';
					dist = $el.outerHeight(true);
				}

				from[pos] = inverse * dist;
				to[pos] = 0;
				
				if (hide) {
					to[pos] = -from[pos];
					from[pos] = 0;
				}
			}

			saveStyle($el, props);
			createWrapper($el);

			$el.css(from).transition(to, opts.duration, opts.easing, function() {
				restoreStyle($el, props);
				if (hide) {
					$el.hide();
				}
				removeWrapper($el);
			});
		});
	};

	$.each(['width', 'height'], function(i, val) {
		var natural = 'natural' + capitalize(val); 
		$.fn[natural] = function() {
			var el = this[0],
				size;

			if (typeof el[natural] !== 'undefined') {
				size = el[natural];
			}
			else {
				var img = document.createElement('img');
				img.src = this.attr('src');
				size = img[val];
			}
			return size;
		};
	});

	//center content to viewpoint
	$.fn.brCenter = function(winWidth, winHeight) {
		return this.each(function() {
			$(this).css({top:(winHeight - $(this).naturalHeight())/2, left:(winWidth - $(this).naturalWidth())/2});
		});
	};
	
	//fill (cover) content to viewpoint
	$.fn.brFill = function(winWidth, winHeight) {
		return this.each(function() {
			var imgRatio = $(this).naturalWidth()/$(this).naturalHeight(),
				winRatio = winWidth/winHeight;
			
			if (imgRatio < winRatio) {
				$(this).css({width:winWidth, height:winWidth / imgRatio});
			}
			else {
				$(this).css({width:winHeight * imgRatio, height:winHeight});
			}
			$(this).css({top:(winHeight - $(this).height())/2, left:(winWidth - $(this).width())/2});
		});
	};

	//fit (contain) content to viewpoint
	$.fn.brFit = function(winWidth, winHeight) {
		return this.each(function() {
			var imgRatio = $(this).naturalWidth()/$(this).naturalHeight(),
				winRatio = winWidth/winHeight;
			
			if (imgRatio < winRatio) {
				$(this).css({width:winHeight * imgRatio, height:winHeight});
			}
			else {
				$(this).css({width:winWidth, height:winWidth / imgRatio});
			}
			$(this).css({top:(winHeight - $(this).height())/2, left:(winWidth - $(this).width())/2});
		});
	};

	//stretch content to viewpoint
	$.fn.brStretch = function(winWidth, winHeight) {
		return this.each(function() {
			$(this).css({top:0, left:0, width:winWidth, height:winHeight});
		});
	};

	//map shorthand data
	$.fn.brMapShorthand = function(key, props) {
		return this.each(function() {
			var val = $(this).data(key);
			if (!isEmptyStr(val)) {
				var values = val.split(' ');
				for (var i = 0; i < values.length && i < props.length; i++) {
					$(this).data(props[i], values[i]);
				}
			}
		});
	};

	//get total width of elements
	$.fn.brTotalWidth = function(includeMargin) {
		var width = 0;
		this.each(function() {
			width += $(this).outerWidth(includeMargin);
		});
		return width;
	};

	//get total height of elements
	$.fn.brTotalHeight = function(includeMargin) {
		var height = 0;
		this.each(function() {
			height += $(this).outerHeight(includeMargin);
		});
		return height;
	};
		
	//bind image handler
	$.fn.brHandleImage = function(src, settings) {
		var complete = $.isFunction(settings.complete) ? settings.complete : $.noop, 
			error = $.isFunction(settings.error) ? settings.error : $.noop,
			loadEvent = 'load';
			
		if (!isEmptyStr(settings.namespace)) {
			loadEvent += '.' + settings.namespace;
		}

		return this.each(function(n, img) {
			var $img = $(img);
			if ($img.is('img')) {
				$img.attr('src', '').one(loadEvent, complete).error(error).attr('src', src);
				if (typeof img.readyState !== 'undefined') {
					if ('complete' === img.readyState) {
						$img.trigger('load');
					}
				}
				else if (img.complete) {
					$img.trigger('load');
				}
			}
		});
	};

	$.fn.brPrev = function(selector) {
    	selector = selector || '';
	    return this.prev(selector).length ? this.prev(selector) : this.siblings(selector).addBack(selector).last();
	};

	$.fn.brNext = function(selector) {
    	selector = selector || '';
	    return this.next(selector).length ? this.next(selector) : this.siblings(selector).addBack(selector).first();
	};

	//check for border
	$.fn.brHasBorder = function() {
		for (var i = 0; i < SIDES.length; i++) {
			if (0 < parseInt($(this).css('border-' + SIDES[i] + '-width'), 10)) {
				return true;
			}
		}
		return false;
	};

	//copy border
	$.fn.brCopyBorder = function($el) {
		var props = ['width', 'style', 'color'],
			corners = ['TopLeft', 'TopRight', 'BottomLeft', 'BottomRight'];
		
		return this.each(function() {
			for (var i = 0; i < SIDES.length; i++) {
				for (var j = 0; j < props.length; j++) {
					var name = 'border-' + SIDES[i] + '-' + props[j];
					$(this).css(name, $el.css(name));
				}
			}
			
			for (var k = 0; k < corners.length; k++) {
				var radius = 'border' + corners[k] + 'Radius';
				$(this).css(radius, $el.css(radius));
			}
		});
	};

	//animation
	$.fn.animation = function() {
		var name = arguments[0], duration, easing, 
			direction, playState, fillMode,
			complete, always;

		if (typeof arguments[1] === 'object') {
			var opts = arguments[1];
			duration = opts.duration;
			easing = opts.easing;
			direction = opts.direction;
			playState = opts.playState;
			fillMode = opts.fillMode;
			complete = opts.complete;
			always = opts.always;
		}
		else {
			duration = arguments[1];
			easing = arguments[2];
			complete = arguments[3];
		}
		duration = getValue(duration, 400);
		easing = getValue(easing, 'ease');
		direction = getValue(direction, 'normal');
		playState = getValue(playState, 'running');
		fillMode = getValue(fillMode, 'forwards');
		
		var timingFn = (easing in CUBIC_BEZIER ? CUBIC_BEZIER[easing] : easing),
			props = {animationName:name, animationDuration:duration + 'ms', animationTimingFunction:timingFn, animationDirection:direction, animationPlayState:playState, animationFillMode:fillMode};

		return this.each(function() {
			var $el = $(this);
			$el.queue(function(){
				if ($.isFunction(complete)) {
					$el.one(CSS_ANIMATION_END, complete);
				}
				
				if ($.isFunction(always)) {
					$el.one(CSS_ANIMATION_END + '.always', always);
				}
				
				$el.one(CSS_ANIMATION_END, function() {
					$el.dequeue();
				});
				
				$el.reflow().css(props);
			});
		});
	};

	//stop animation
	$.fn.stopAnimation = function(clearQueue, jumpToEnd) {
		return this.each(function() {
			var $el = $(this);
			if (clearQueue) {
				$el.clearQueue();
			}
			
			clearTimeout($el.data('timeout'));
			
			if (jumpToEnd) {
				$el.trigger(CSS_ANIMATION_END);
			}
			else {
				$el.trigger(CSS_ANIMATION_END + '.always').off(CSS_ANIMATION_END);
			}
			
			$el.css({animation:'none'}).dequeue();
		});
	};

	//transition
	$.fn.transition = function() {
		var props = arguments[0],
			duration, easing, delay, 
			complete, always;
		
		if (typeof arguments[1] === 'object') {
			var opts = arguments[1];
			duration = opts.duration;
			easing = opts.easing;
			delay = opts.delay;
			complete = opts.complete;
			always = opts.always;
		}
		else {
			duration = arguments[1];
			easing = arguments[2];
			complete = arguments[3];
		}
		duration = getValue(duration, 400);
		easing = getValue(easing, 'ease');
		delay = getValue(delay, 0);
		props.transition = 'all ' + duration + 'ms ' + CUBIC_BEZIER[easing] + ' ' + delay + 'ms';

		return this.each(function() {
			var $el = $(this);
			$el.queue(function() {
				if ($.isFunction(complete)) {
					$el.one(CSS_TRANSITION_END, complete);
				}
				
				if ($.isFunction(always)) {
					$el.one(CSS_TRANSITION_END + '.always', always);
				}
				
				$el.one(CSS_TRANSITION_END, function() { 
					$el.dequeue();
				});
				
				$el.forceEnd(CSS_TRANSITION_END, duration).reflow().css(props);
			});
		});
	};
	
	//stop transition
	$.fn.stopTransition = function(clearQueue, jumpToEnd) {
		return this.each(function() {
			var $el = $(this);
			if (clearQueue) {
				$el.clearQueue();
			}
			
			clearTimeout($el.data('timeout'));
			
			if (jumpToEnd) {
				$el.trigger(CSS_TRANSITION_END);
			}
			else {
				$el.trigger(CSS_TRANSITION_END + '.always').off(CSS_TRANSITION_END);
			}
			
			$el.css({transition:'none', transitionDuration:'0s'}).dequeue();
		});
	};
	
	//force reflow
	$.fn.reflow = function() {
		return this.each(function() {
			var reflow = this.offsetWidth;
		});
	};
	
	//force transition end
	$.fn.forceEnd = function(endEvent, duration) {
		return this.each(function() {
			var $el = $(this),
				called = false;
			
			$el.one(endEvent, function() { 
				called = true; 
			}).data('timeout', setTimeout(function() {
				if (!called) {
					$el.trigger(endEvent);
				}
			}, duration + 50));
		});
	};
	
	//add transition class
	$.fn.addTransitionClass = function(className) {
		return this.each(function() {
			if (SUPPORT.transition && !ANDROID2) {
				$(this).reflow().addClass(className);
			}
		});
	};
	
	var METHODS = {
  		play:'play',
  		pause:'pause',
		togglePlay:'togglePlay',
		prev:'prevSlide',
		next:'nextSlide',
		to:'selectSlide',
		option:'getOption',
		destroy:'destroy'
 	};
		
	$.fn.bannerRotator = function() {
		var args = arguments,
			params = args[0];
		
		if (params in METHODS) {
			var method = METHODS[params],
				val;

			this.each(function(n, el) {
				var instance = $(el).data(Rotator.PLUGIN); 
				if (instance) {
					val = instance[method].apply(instance, Array.prototype.slice.call(args, 1));
					if (typeof val !== 'undefined') {
						return false;
					}
				}
			});
			
			return (typeof val !== 'undefined' ? val : this);
		}
		else if (typeof params === 'object' || !params) {
			return this.each(function(n, el) {
				var opts = $.extend(true, {}, $.fn.bannerRotator.defaults, params),
					o = ($.metadata ? $.extend({}, opts, $.metadata.get(this)) : opts);

				$(el).data(Rotator.PLUGIN, new Rotator(el, o));
			});
		}
	};

	$.fn.bannerRotator.defaults = {
		responsive:true,
		width:1000,
		height:400,
		thumbWidth:32,
		thumbHeight:32,
		thumbMargin:3,
		buttonWidth:32,
		buttonHeight:32,
		buttonMargin:3,
		sideButtonMargin:0,
		tooltipWidth:'auto',
		tooltipHeight:'auto',
		navThumbWidth:100,
		navThumbHeight:75,
		autoPlay:true,
		delay:6000,
		startIndex:0,
		pauseOnHover:false,
		pauseOnInteraction:false,
		playOnce:false,
		timer:'pie',
		timerPosition:'right top',
		cssTransition:true,
		effect:'fade',
		duration:800,
		easing:'',
		effectOnStart:true,
		columns:1,
		rows:1,
		interval:100,
		alternate:false,
		autoReverse:true,
		depth:0,
		shapeShading:true,
		shapeDepth:0,
		kbEffect:'none',
		kbDuration:'auto',
		kbEasing:'linear',
		cpanelPosition:'left bottom',
		cpanelOrientation:'horizontal',
		cpanelOutside:false,
		cpanelOnHover:false,
		thumbnails:'number',
		selectOnHover:false,
		tooltip:'text',
		tooltipDelay:0,
		navButtons:'small',
		navButtonsOnHover:false,
		navThumbs:false,
		playButton:true,
		groupButtons:false,
		cpanelGap:0,
		hideControl:false,
		effectOnInteraction:true,
		layerEffect:'fade',
		layerDuration:500,
		layerEasing:'',
		layerDelay:0,
		layerEffectOut:'fade',
		layerDurationOut:500,
		layerEasingOut:'',
		layerDelayOut:0,
		layerSync:true,
		layerOutSync:true,
		layerOnHover:false,
		imagePosition:'fill',
		preload:false,
		shuffle:false,
		keyboard:true,
		mousewheel:false,
		swipe:'horizontal',
		swipeDirection:'normal',
		playText:'play',
		pauseText:'pause',
		prevText:'previous',
		nextText:'next'
	};
})(jQuery);

Anon7 - 2022
SCDN GOK