(function($) {

	$.fn.transitionGallery = function( options ){

		if( (typeof(options)).match('object|undefined') ){
			return this.each(function(i){
				new transitionGallery(this, options );
			});
		}else{
			return this.each(function(i){

				var tg = $(this).data('TransitionGallery');

				switch(options){
					case 'destroy':
						tg.destroy();
					break;
				}
			});
		}
	};

	var transitionGallery = function(el, options) {

		var tg = this;
		tg.$el = $(el).addClass('ls-lt-container');
		tg.$el.data('TransitionGallery', tg);
		tg.g = {
			slide : ['sample_slide_1.png','sample_slide_2.png'],
			cssTransitions : !lsBrowser().msie || ( lsBrowser().msie && lsBrowser().version > 9 ) ? true : false
		};
		tg.o = options;

		tg.destroy = function(){
			clearTimeout( tg.g.timer1 );
			clearTimeout( tg.g.timer2 );
			$(el).find('*').stop().dequeue();
			$(el).empty();
		};

		tg.animate = function(){

			var cur = 0, next;
			
			var slideTransition = function(){

				next = cur == tg.g.slide.length - 1 ? 0 : cur + 1;

				var carousel = tg.o.transition.name.toLowerCase().indexOf('carousel') == -1 ? false : true;

				// Calculating cols and rows

				var cols = 1;

				if( typeof tg.o.transition.cols  == 'number' ){
					cols = tg.o.transition.cols;
				}else if( typeof tg.o.transition.cols == 'string' ){
					cols = Math.floor( Math.random() * ( parseInt( tg.o.transition.cols.split(',')[1] ) - parseInt( tg.o.transition.cols.split(',')[0] ) + 1) ) + parseInt( tg.o.transition.cols.split(',')[0] );
				}else if( typeof tg.o.transition.cols == 'object' ){
					cols = Math.floor( Math.random() * ( tg.o.transition.cols[1] - tg.o.transition.cols[0] + 1) ) + tg.o.transition.cols[0];
				}

				var rows = 1;

				if( typeof tg.o.transition.rows == 'number' ){
					rows = tg.o.transition.rows;					
				}else if( typeof tg.o.transition.rows == 'string' ){
					rows = Math.floor( Math.random() * ( parseInt( tg.o.transition.rows.split(',')[1] ) - parseInt( tg.o.transition.rows.split(',')[0] ) + 1) ) + parseInt( tg.o.transition.rows.split(',')[0] );	
				}else if( typeof tg.o.transition.rows == 'object' ){
					rows = Math.floor( Math.random() * ( tg.o.transition.rows[1] - tg.o.transition.rows[0] + 1) ) + tg.o.transition.rows[0];					
				}

				var tileWidth = $(el).width() / cols;
				var tileHeight = $(el).height() / rows;

				// Setting size

				var restW = $(el).width() - Math.floor(tileWidth) * cols;
				var restH = $(el).height() - Math.floor(tileHeight) * rows;

				var tileSequence = [];

				for(var ts=0; ts<cols * rows; ts++){
					tileSequence.push(ts);
				}

				// Setting the sequences of the transition

				switch( tg.o.transition.tile.sequence ){
					case 'reverse':
						tileSequence.reverse();
					break;
					case 'col-forward':
						tileSequence = lsOrderArray(rows,cols,'forward');
					break;
					case 'col-reverse':
						tileSequence = lsOrderArray(rows,cols,'reverse');
					break;
					case 'random':
						tileSequence.randomize();
					break;
				}

				if( tg.o.type == '3d' ){
					tg.g.totalDuration = ((cols * rows) - 1) * tg.o.transition.tile.delay;

					var stepDuration = 0;

					if( tg.o.transition.before && tg.o.transition.before.duration ){
						stepDuration += tg.o.transition.before.duration;
					}
					if( tg.o.transition.animation && tg.o.transition.animation.duration ){
						stepDuration += tg.o.transition.animation.duration;
					}
					if( tg.o.transition.after && tg.o.transition.after.duration ){
						stepDuration += tg.o.transition.after.duration;
					}

					tg.g.totalDuration += stepDuration;

					var stepDelay = 0;

					if( tg.o.transition.before && tg.o.transition.before.delay ){
						stepDelay += tg.o.transition.before.delay;
					}
					if( tg.o.transition.animation && tg.o.transition.animation.delay ){
						stepDelay += tg.o.transition.animation.delay;
					}
					if( tg.o.transition.after && tg.o.transition.after.delay ){
						stepDelay += tg.o.transition.after.delay;
					}

					tg.g.totalDuration += stepDelay;

				}else{
					tg.g.totalDuration = ((cols * rows) - 1) * tg.o.transition.tile.delay + tg.o.transition.transition.duration;

					tg.g.curTiles = $('<div>').addClass('ls-curtiles').appendTo( tg.$el );
					tg.g.nextTiles = $('<div>').addClass('ls-nexttiles').appendTo( tg.$el );
				}

				// Creating cuboids for 3d or tiles for 2d transition (cols * rows)

				for(var tiles=0; tiles < cols * rows; tiles++){

					var rW = tiles%cols == 0 ? restW : 0;
					var rH = tiles > (rows-1)*cols-1 ? restH : 0;

					var tile = $('<div>').addClass('ls-lt-tile').css({
						width : Math.floor(tileWidth) + rW,
						height : Math.floor(tileHeight) + rH
					}).appendTo( $(el) );

					var curTile, nextTile;

					// If current transition is a 3d transition

					if( tg.o.type == '3d' ){

						tile.addClass('ls-3d-container');

						var W = Math.floor(tileWidth) + rW;
						var H = Math.floor(tileHeight) + rH;
						var D;

						if( tg.o.transition.animation.direction == 'horizontal' ){
							if( Math.abs(tg.o.transition.animation.transition.rotateY) > 90 && tg.o.transition.tile.depth != 'large' ){
								D = 7 + rW;
							}else{
								D = W;
							}
						}else{
							if( Math.abs(tg.o.transition.animation.transition.rotateX) > 90 && tg.o.transition.tile.depth != 'large' ){
								D = 7 + rH;
							}else{
								D = H;
							}
						}

						var W2 = W/2;
						var H2 = H/2;
						var D2 = D/2;

						// createCuboids function will append cuboids with their style settings to their container

						var createCuboids = function(c,a,w,h,tx,ty,tz,rx,ry){
							$('<div>').addClass(c).css({
								width: w,
								height: h,
								'transform': 'translate3d('+tx+'px, '+ty+'px, '+tz+'px) rotateX('+rx+'deg) rotateY('+ry+'deg) rotateZ(0deg) scale3d(1, 1, 1)',
								'-o-transform': 'translate3d('+tx+'px, '+ty+'px, '+tz+'px) rotateX('+rx+'deg) rotateY('+ry+'deg) rotateZ(0deg) scale3d(1, 1, 1)',
								'-ms-transform': 'translate3d('+tx+'px, '+ty+'px, '+tz+'px) rotateX('+rx+'deg) rotateY('+ry+'deg) rotateZ(0deg) scale3d(1, 1, 1)',
								'-moz-transform': 'translate3d('+tx+'px, '+ty+'px, '+tz+'px) rotateX('+rx+'deg) rotateY('+ry+'deg) rotateZ(0deg) scale3d(1, 1, 1)',
								'-webkit-transform': 'translate3d('+tx+'px, '+ty+'px, '+tz+'px) rotateX('+rx+'deg) rotateY('+ry+'deg) rotateZ(0deg) scale3d(1, 1, 1)'
							}).appendTo(a);
						};

						createCuboids('ls-3d-box',tile,0,0,0,0,-D2,0,0);

						var backRotX = 0
						var topRotX = 0
						var bottomRotX = 0

						if( tg.o.transition.animation.direction == 'vertical' && Math.abs(tg.o.transition.animation.transition.rotateX) > 90){
							createCuboids('ls-3d-back',tile.find('.ls-3d-box'),W,H,-W2,-H2,-D2,180,0);
						}else{
							createCuboids('ls-3d-back',tile.find('.ls-3d-box'),W,H,-W2,-H2,-D2,0,180);								
						}

						createCuboids('ls-3d-bottom',tile.find('.ls-3d-box'),W,D,-W2,H2-D2,0,-90,0);
						createCuboids('ls-3d-top',tile.find('.ls-3d-box'),W,D,-W2,-H2-D2,0,90,0);
						createCuboids('ls-3d-front',tile.find('.ls-3d-box'),W,H,-W2,-H2,D2,0,0);
						createCuboids('ls-3d-left',tile.find('.ls-3d-box'),D,H,-W2-D2,-H2,0,0,-90);
						createCuboids('ls-3d-right',tile.find('.ls-3d-box'),D,H,W2-D2,-H2,0,0,90);

						curTile = tile.find('.ls-3d-front');

						if( tg.o.transition.animation.direction == 'horizontal' ){
							if( Math.abs(tg.o.transition.animation.transition.rotateY) > 90 ){
								nextTile = tile.find('.ls-3d-back');
							}else{
								nextTile = tile.find('.ls-3d-left, .ls-3d-right');
							}
						}else{
							if( Math.abs(tg.o.transition.animation.transition.rotateX) > 90 ){
								nextTile = tile.find('.ls-3d-back');
							}else{
								nextTile = tile.find('.ls-3d-top, .ls-3d-bottom');
							}
						}

						$(el).css({
							background: 'none'
						});

						// Animating cuboids

						var curCubDelay = tileSequence[tiles] * tg.o.transition.tile.delay;

						var curCub = $(el).find('.ls-3d-container:eq('+tiles+') .ls-3d-box');

						if( tg.o.transition.before && tg.o.transition.before.transition ){
							tg.o.transition.before.transition.delay = tg.o.transition.before.transition.delay ? tg.o.transition.before.transition.delay + curCubDelay : curCubDelay;
							curCub.transition( tg.o.transition.before.transition, tg.o.transition.before.duration, tg.o.transition.before.easing );
						}else{
							tg.o.transition.animation.transition.delay = tg.o.transition.animation.transition.delay ? tg.o.transition.animation.transition.delay + curCubDelay : curCubDelay;
						}

						curCub.transition( tg.o.transition.animation.transition, tg.o.transition.animation.duration, tg.o.transition.animation.easing )

						if( tg.o.transition.after ){
							curCub.transition( $.extend({},{ scale3d : 1 }, tg.o.transition.after.transition), tg.o.transition.after.duration, tg.o.transition.after.easing );
						}
					
					}else{

						// If current transition is a 2d transition

						var T1 = L1 = T2 = L2 = 'auto';
						var O1 = O2 = 1;

						if( tg.o.transition.transition.direction == 'random' ){
							var dir = ['top','bottom','right','left'];
							var direction = dir[Math.floor(Math.random() * dir.length )];
						}else{
							var direction = tg.o.transition.transition.direction;
						}

						// Selecting direction

						var pn = 'next';
						
						if( tg.o.transition.name.toLowerCase().indexOf('mirror') != -1 && tiles%2 == 0 ){
							pn = 'prev';
						}

						if( pn == 'prev' ){

							switch( direction ){
								case 'top':
									direction = 'bottom';
								break;
								case 'bottom':
									direction = 'top';
								break;
								case 'left':
									direction = 'right';
								break;
								case 'right':
									direction = 'left';
								break;
								case 'topleft':
									direction = 'bottomright';
								break;
								case 'topright':
									direction = 'bottomleft';
								break;
								case 'bottomleft':
									direction = 'topright';
								break;
								case 'bottomright':
									direction = 'topleft';
								break;
							}
						}

						switch( direction ){
							case 'top':
								T1 = T2 = -tile.height();
								L1 = L2 = 0;
							break;
							case 'bottom':
								T1 = T2 = tile.height();
								L1 = L2 = 0;
							break;
							case 'left':
								T1 = T2 = 0;
								L1 = L2 = -tile.width();
							break;
							case 'right':
								T1 = T2 = 0;
								L1 = L2 = tile.width();
							break;
							case 'topleft':
								T1 = tile.height();
								T2 = 0;
								L1 = tile.width(); 
								L2 = 0;
							break;
							case 'topright':
								T1 = tile.height();
								T2 = 0;
								L1 = - tile.width(); 
								L2 = 0;
							break;
							case 'bottomleft':
								T1 = - tile.height();
								T2 = 0;
								L1 = tile.width(); 
								L2 = 0;
							break;
							case 'bottomright':
								T1 = - tile.height();
								T2 = 0;
								L1 = - tile.width(); 
								L2 = 0;
							break;
						}

						tg.g.scale2D = tg.o.transition.transition.scale ? tg.o.transition.transition.scale : 1;

						if( carousel == true && tg.g.scale2D != 1 ){
							
							T1 = T1 / 2;
							T2 = T2 / 2;
							L1 = L1 / 2;
							L2 = L2 / 2;
						}

						// Selecting the type of the transition

						var ie78 = lsBrowser().msie && lsBrowser().version < 9 ? true : false;

//						if( !ie78 || ( ie78 && tg.o.transition.name.toLowerCase().indexOf('crossfade') != -1 ) ){
							switch( tg.o.transition.transition.type ){
								case 'fade':
									T1 = T2 = L1 = L2 = 0;
									O1 = 0;
									O2 = 1;
								break;
								case 'mixed':
								O1 = 0;
								O2 = 1;
								if( tg.g.scale2D == 1 ){
									T2 = L2 = 0;
								}
								break;
							}
//						}

						if((( tg.o.transition.transition.rotate || tg.o.transition.transition.rotateX || tg.o.transition.transition.rotateY ) || tg.g.scale2D != 1 ) && !ie78 && tg.o.transition.transition.type != 'slide' ){
							tile.css({
								overflow : 'visible'
							});
						}else{
							tile.css({
								overflow : 'hidden'
							});									
						}
						
						if( carousel == true){
							tg.g.curTiles.css({
								overflow: 'visible'
							});
						}else{
							tg.g.curTiles.css({
								overflow: 'hidden'
							});									
						}

						if( tg.o.transition.transition.type == 'slide' || carousel == true ){
							var tileInCur = tile.appendTo( tg.g.curTiles );
							curTile = $('<div>').addClass('ls-curtile').appendTo( tileInCur );
							var tileInNext = tile.clone().appendTo( tg.g.nextTiles );
						}else{
							var tileInNext = tile.appendTo( tg.g.nextTiles );
						}

						nextTile = $('<div>').addClass('ls-nexttile').appendTo( tileInNext ).css({
							top : -T1,
							left : -L1,
							dispay : 'block',
							opacity : O1
						});

						// Animating tiles

						var curTileDelay = tileSequence[tiles] * tg.o.transition.tile.delay;

						$(el).css({
							background: 'none'
						});

						if( tg.g.cssTransitions && $.transit != undefined && tg.o.transition.transition.easing.indexOf('swing') == -1 && tg.o.transition.transition.easing.indexOf('Elastic') == -1 && tg.o.transition.transition.easing.indexOf('Bounce') == -1 ){
							var r = tg.o.transition.transition.rotate ? tg.o.transition.transition.rotate : 0;
							var rX = tg.o.transition.transition.rotateX ? tg.o.transition.transition.rotateX : 0;
							var rY = tg.o.transition.transition.rotateY ? tg.o.transition.transition.rotateY : 0;
							
							if( pn == 'prev' ){
								r = -r;
								rX = -rX;
								rY = -rY;
							}

							if( rX != 0 || rY != 0 || r != 0 || tg.g.scale2D != 1 ){
								nextTile.css({
									'transform': 'rotate('+r+'deg) rotateX('+rX+'deg) rotateY('+rY+'deg) scale('+tg.g.scale2D+','+tg.g.scale2D+')',
									'-o-transform': 'rotate('+r+'deg) rotateX('+rX+'deg) rotateY('+rY+'deg) scale('+tg.g.scale2D+','+tg.g.scale2D+')',
									'-ms-transform': 'rotate('+r+'deg) rotateX('+rX+'deg) rotateY('+rY+'deg) scale('+tg.g.scale2D+','+tg.g.scale2D+')',
									'-moz-transform': 'rotate('+r+'deg) rotateX('+rX+'deg) rotateY('+rY+'deg) scale('+tg.g.scale2D+','+tg.g.scale2D+')',
									'-webkit-transform': 'rotate('+r+'deg) rotateX('+rX+'deg) rotateY('+rY+'deg) scale('+tg.g.scale2D+','+tg.g.scale2D+')'
								});										
							}
							
							nextTile.transition({
								delay : curTileDelay,
								top : 0,
								left : 0,
								opacity : O2,
								rotate : 0,
								rotateX : 0,
								rotateY : 0,
								scale : 1
							}, tg.o.transition.transition.duration, tg.o.transition.transition.easing );

							if( ( tg.o.transition.transition.type == 'slide' || carousel == true ) && tg.o.transition.name.toLowerCase().indexOf('mirror') == -1 ){
																		
								var r2 = 0;

								if( r != 0 ){
									r2 = -r;
								}

								curTile.transition({
									delay : curTileDelay,
									top : T2,
									left : L2,
									rotate : r2,
									scale : tg.g.scale2D,
									opacity: O1
								}, tg.o.transition.transition.duration, tg.o.transition.transition.easing );
							}
						}else{
							nextTile.delay( curTileDelay ).animate({
								top : 0,
								left : 0,
								opacity : O2
							}, tg.o.transition.transition.duration, tg.o.transition.transition.easing );
							curTile.delay( curTileDelay ).animate({
								top : T2,
								left : L2
							}, tg.o.transition.transition.duration, tg.o.transition.transition.easing );								
						}
					}

					// Appending the background images of current and next layers into the tiles on both of 2d & 3d transitions

					if( tg.o.type == '3d' || ( tg.o.type == '2d' && ( tg.o.transition.transition.type == 'slide' || carousel == true ) ) ){
						curTile.append($('<img>').attr('src', tg.o.path+tg.g.slide[cur] ).css({
							marginLeft : - parseInt(tile.position().left),
							marginTop :  - parseInt(tile.position().top)
						}));						
					}else{
						tg.g.curTiles.append($('<img>').attr('src', tg.o.path+tg.g.slide[cur] ).css({
							marginLeft : - parseInt(tile.position().left),
							marginTop :  - parseInt(tile.position().top)
						}));
						
					}

					nextTile.append($('<img>').attr('src', tg.o.path+tg.g.slide[next] ).css({
						marginLeft :  - parseInt(tile.position().left),
						marginTop :  - parseInt(tile.position().top)
					}));
				}

				next = cur;
				cur = cur == tg.g.slide.length - 1 ? 0 : cur + 1;

				tg.g.timer1 = setTimeout(function(){
					$(el).css({
						background: 'url('+(tg.o.path+tg.g.slide[cur])+')'
					}).empty();
				}, tg.g.totalDuration );
				
				tg.g.timer2 = setTimeout(function(){
					slideTransition();					
				}, tg.o.delay + tg.g.totalDuration );
			};		

			slideTransition(true);
		};

		if( tg.o.type == '3d' && !lsSupport3D($(el)) ){
			$(el).css({
				background: 'url('+tg.o.path+'nocss3d.png)'
			})
		}else{
			tg.animate();
		}
	};

	// Support3D checks the CSS3 3D capability of the browser (based on the idea of Modernizr.js)

	var lsSupport3D = function( el ) {
		
		var testEl = $('<div>'),
			s3d1 = false,
			s3d2 = false,
			properties = ['perspective', 'OPerspective', 'msPerspective', 'MozPerspective', 'WebkitPerspective'];
			transform = ['transformStyle','OTransformStyle','msTransformStyle','MozTransformStyle','WebkitTransformStyle'];

		for (var i = properties.length - 1; i >= 0; i--){
			s3d1 = s3d1 ? s3d1 : testEl[0].style[properties[i]] != undefined;
		};
		
		// preserve 3D test
		
		for (var i = transform.length - 1; i >= 0; i--){
			testEl.css( 'transform-style', 'preserve-3d' );
			s3d2 = s3d2 ? s3d2 : testEl[0].style[transform[i]] == 'preserve-3d';
		};

		// If browser has perspective capability and it is webkit, we must check it with this solution because Chrome can give false positive result if GPU acceleration is disabled

        if (s3d1 && testEl[0].style[properties[4]] != undefined){
			testEl.attr('id','ls-test3d').appendTo( el );
            s3d1 = testEl[0].offsetHeight === 3 && testEl[0].offsetLeft === 9;
			testEl.remove();
        }

        return (s3d1 && s3d2);
	};

	// Order array function

	var lsOrderArray = function(x,y,dir) {
		var i = [];
		if(dir=='forward'){
			for( var a=0; a<x;a++){
				for( var b=0; b<y; b++){
					i.push(a+b*x);	
				}
			}
		}else{
			for( var a=x-1; a>-1;a--){
				for( var b=y-1; b>-1; b--){
					i.push(a+b*x);
				}
			}
		}
		return i;
	};

	// Randomize array function

	Array.prototype.randomize = function() {
	  var i = this.length, j, tempi, tempj;
	  if ( i == 0 ) return false;
	  while ( --i ) {
	     j       = Math.floor( Math.random() * ( i + 1 ) );
	     tempi   = this[i];
	     tempj   = this[j];
	     this[i] = tempj;
	     this[j] = tempi;
	  }
	  return this;
	}

	// CountProp counts the properties in an object

	var lsCountProp = function(obj) {
	    var count = 0;

	    for(var prop in obj) {
	        if(obj.hasOwnProperty(prop)){
	            ++count;
			}
	    }
	    return count;
	};
	
	// We need the browser function (removed from jQuery 1.9)

	var lsBrowser = function(){

		uaMatch = function( ua ) {
			ua = ua.toLowerCase();

			var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
				/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
				/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
				/(msie) ([\w.]+)/.exec( ua ) ||
				ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
				[];

			return {
				browser: match[ 1 ] || "",
				version: match[ 2 ] || "0"
			};
		};

		var matched = uaMatch( navigator.userAgent ), browser = {};

		if ( matched.browser ) {
			browser[ matched.browser ] = true;
			browser.version = matched.version;
		}

		if ( browser.chrome ) {
			browser.webkit = true;
		} else if ( browser.webkit ) {
			browser.safari = true;
		}
		return browser;			
	};
})(jQuery);

var transitionGallery = {

	init : function() {

		// Generate transition gallery
		transitionGallery.appendTransition('2D transitions', layerSliderTransitions['t2d'], '2d');
		transitionGallery.appendTransition('3D transitions', layerSliderTransitions['t3d'], '3d');

		// Prevent click events on transitions
		jQuery(document).on('click', '#ls-transition-gallery a', function(e) {
			e.preventDefault();
		});

		// Show transitions
		jQuery(document).on('mouseenter', '#ls-transition-gallery a', function() {
			transitionGallery.showPreview(this);
		});

		// Hide transitions
		jQuery(document).on('mouseleave', '#ls-transition-gallery a', function() {
			transitionGallery.hidePreview();
		});
	},

	appendTransition : function(title, transitions, classes) {

		// Create transition group header
		jQuery('#ls-transition-gallery').append( jQuery('<tbody>', { 'class' : classes })
			.append( jQuery('<tr>')
				.append( jQuery('<th>', { 'colspan' : '2' })
					.append( jQuery('<h3>', { 'text' : 'List of the available '+title }))
				)
			)
		);

		// Iterate over the transitions
		for(c = 0; c < transitions.length; c+=2) {


			// Create new table row
			jQuery('#ls-transition-gallery tbody:last').append( jQuery('<tr>')
				.append( jQuery('<td>'))
				.append( jQuery('<td>'))
			);

			// Get new table row
			var tds = jQuery('#ls-transition-gallery tr:last td');

			// Set first transition
			tds.eq(0).append( jQuery('<a>', { 'href' : '#', 'rel' : 'tr'+(c+1)+'', 'html' : ''+(c+1)+'. '+transitions[c]['name'] }))

			// Set second transition
			if(typeof transitions[(c+1)] != "undefined") {
				tds.eq(1).append( jQuery('<a>', { 'href' : '#', 'rel' : 'tr'+(c+2)+'', 'html' : ''+(c+2)+'. '+ transitions[(c+1)]['name'] }))
			}
		}
	},

	showPreview : function(el) {

		// Create popup
		jQuery('body').append( jQuery('<div>', { 'class' : 'ls-popup' })
			.append( jQuery('<div>', { 'class' : 'inner ls-transition-preview' }))
		);

		// Get popup
		var popup = jQuery('.ls-popup');

		// Get viewport dimensions
		var v_w = jQuery(window).width();

		// Get element dimensions
		var e_w = jQuery(el).width();

		// Get element position
		var e_l = jQuery(el).offset().left;
		var e_t = jQuery(el).offset().top;

		// Get toolip dimensions
		var t_w = popup.outerWidth();
		var t_h = popup.outerHeight();

		// Position tooltip
		popup.css({ top : e_t - t_h - 10, left : e_l - (t_w - e_w) / 2  });

		// Get transition type
		var trtype = jQuery(el).closest('tbody').attr('class');

		// Get transition index
		var index = parseInt(jQuery(el).attr('rel').substr(2))-1;

		// Get transition object
		var trObj = layerSliderTransitions['t'+trtype][index];

		// Init transition
		popup.find('.inner').transitionGallery({
			type : trtype,
			transition : trObj,
			delay : 1500,
			path : '../assets/img/'
		});
	},

	hidePreview : function() {
		jQuery('.ls-popup .inner').transitionGallery('destroy');
		jQuery('.ls-popup').remove();
	}
};

jQuery(document).ready(function() {

	transitionGallery.init();
});