(function($){
	$.fn.trigallery = function( options ) {
		
		var object = this;
		
		var settings = {
			'fadeInOut': true,
			'height': 400,
			'width': 980,
			'length': 1,
			'delay': 10000,
			'i': 1 ,
			'min_move_x': 20,
    		'min_move_y': 20,
 			'swipe_left': function() { },
 			'swipe_right': function() { },
 			'swipe_up': function() { },
 			'swipe_down': function() { },
			'prevent_default_events': true
		};
	
			settings.height = object.height();
			settings.width = object.width();
			settings.length = $('ul#slides > li').length;
			
			var element = $('ul#slides');
			
			object.after(getButtons());
			
			var startX;
			var startY;
			var isMoving = false;
			
			function getButtons() {
				var data = '<ul data-role="slider-counter">';
				
				for (i=1;i<=settings.length;i++) {
					data += '<li data-number="'+i+'">'+i+'</li>';
				}
				
				data += '</ul>';
				
				return data;
			}
			
			
			function setCurrentButton() {
				$('body')
					.find('*[data-role="slider-counter"]').each(function(){
						$(this)
							.find('li').each(function(){
								if( parseInt($(this).attr('data-number')) == parseInt(settings.i) ) {
									$(this).addClass('current');
								} else {
									$(this).removeClass('current');
								}
							}).end();
					}).end();
			}
			
			function cancelTouch() {
				this.removeEventListener('touchmove', onTouchMove);
				startX = null;
				isMoving = false;
			}	
    	 
			function onTouchMove(e) {
			
				if(settings.prevent_default_events) {
					e.preventDefault();
				}
				
				if(isMoving) {
					var x = e.touches[0].pageX;
					var y = e.touches[0].pageY;
					var dx = startX - x;
					var dy = startY - y;
					if(Math.abs(dx) >= settings.min_move_x) {
						cancelTouch();
						if(dx > 0) {
							//settings.swipe_left();
							next();
						} else {
							//settings.swipe_right();
							prev();
						}
					} else if(Math.abs(dy) >= settings.min_move_y) {
						cancelTouch();
						if(dy > 0) {
							settings.swipe_down();
						} else {
							settings.swipe_up();
						}
					}
				}
			}
    	 
			function onTouchStart(e) {
				if (e.touches.length == 1) {
					startX = e.touches[0].pageX;
					startY = e.touches[0].pageY;
					isMoving = true;
					this.addEventListener('touchmove', onTouchMove, false);
				}
			}
			
			function animateSlide() {
			
				var offset = $('li[data-position="'+settings.i+'"]').attr("data-offset");
				var delay = parseInt($('li[data-position="'+settings.i+'"]').attr("data-transition-delay"));
			
				if ($.browser.webkit) {
					element
						.css({
							'-webkit-transition-duration': '400ms',
							'-webkit-transition-timing-function': 'cubic-bezier(0.25, 0, 0.25, 1)',
							'-webkit-transform': 'translate3d(-'+offset+'px, 0px, 0px)',
							'-webkit-transition-delay': '0ms'
						})
						.find('li:not([data-position="'+settings.i+'"]) *[data-role="layer"]').each(function(){
				
							$(this).css({
								'-webkit-transition-duration': '100ms',
								'-webkit-transition-timing-function': 'cubic-bezier(0.25, 0, 0.25, 1)',
								'-webkit-transition-delay': '0ms',
								'opacity': '0'
							});
					
							if ( parseInt($(this).parents('li.animated:first').attr('data-position')) == 1 && settings.i == settings.length ) {
								$(this).css({
									'-webkit-transform': 'translate3d(0px, 0px, 0px)'
								});
							} else if( parseInt($(this).parents('li.animated:first').attr('data-position')) < settings.i ) {
								$(this).css({
									'-webkit-transform': 'translate3d(-900px, 0px, 0px)'
								});
							} else if ( parseInt($(this).parents('li.animated:first').attr('data-position')) > settings.i ) {
								$(this).css({
									'-webkit-transform': 'translate3d(0px, 0px, 0px)'
								});
							}
					
					}).end()
					.find('li[data-position="'+settings.i+'"] *[data-role="layer"]').each(function(){
					
						var duration = ((typeof $(this).attr("data-duration") == 'string') && ($(this).attr("data-duration") != '')) ? $(this).attr("data-duration") : '500ms';
						var delay = $(this).attr("data-delay");
						var offset = $(this).attr("data-initial-offset");
					
						$(this).css({
							'-webkit-transition-duration': duration,
							'-webkit-transition-timing-function': 'cubic-bezier(0.25, 0, 0.25, 1)',
							'-webkit-transform': 'translate3d(-'+offset+'px, 0px, 0px)',
							'-webkit-transition-delay': delay,
							'opacity': '1'
						});
					}).end()
					.find('li[data-position="'+settings.i+'"] a.button').each(function(){
						$.doTimeout(750, function(){
							$('li[data-position="'+settings.i+'"] a.button').css({
								'opacity': 1
							});
						});
					}).end();
				} else {
			
					//var ul_offset = $('#slider ul').position();
					var ul_offset = parseInt($('li[data-position="'+settings.i+'"]').attr("data-offset"));
				
					if(ul_offset <= -(settings.width*(settings.length-1))) {
						var real_offset = 0;
					} else {
						var real_offset = (ul_offset*-1)+settings.width;
					}
			
					object.find('ul').
						animate({
							'left': real_offset
						})
						.find('li[data-position="'+settings.i+'"] *[data-role="layer"]').each(function(){
						
							var duration = $(this).attr("data-duration");
					
							$(this).animate({
								'opacity': 1,
								'right': 0
							}, duration);
						});
				}
			
			}
			
			function next() {
				element.doTimeout( 'slide', true );
			}
			
			function prev() {
				if(settings.i == 1) { 
					settings.i = settings.length-1 
				} else if(settings.i == 2) { 
					settings.i = settings.length 
				} else { 
					settings.i -= 2; 
				}
				element.doTimeout( 'slide', true );
			}
			    	 
			if ('ontouchstart' in document.documentElement) {
				document.getElementById("slides").addEventListener('touchstart', onTouchStart, false);
			}
			
			object.find('#next')
				.click(function(e){
					e.preventDefault();
					e.stopPropagation();
					next();
				});
			
			object.find('#prev')
				.click(function(e){
					e.preventDefault();
					e.stopPropagation();
					prev();
				});
			
			$('*[data-role="slider-counter"] li').live('click', function(e){
				e.preventDefault();
				e.stopPropagation();
				
				var num = $(this).attr('data-number');
				
				if(num == 1) {
					settings.i = settings.length;
				} else {
					settings.i = parseInt( $(this).attr('data-number') ) - 1;
				}
				
				element.doTimeout( 'slide', true );
			});
			
			var i = 1;
			
			element
				.css({
					'height': settings.height,
					'left': settings.width,
					'width': (settings.length+1)*settings.width
				})
				.find('li').each(function(){
					$(this)
						.css({
							'height': settings.height,
							'width': settings.width
						})
						.attr({
							"data-position": i.toString(),
							"data-offset": i*settings.width
						}).end();
						
					if($(this).hasClass('animated')) {
						$(this)
							.find('*[data-role="layer"]').each(function(){
					
								var initial_offset = -1*(parseInt($(this).attr("data-initial-offset")));
								$(this).css({
									'right': initial_offset,
									'opacity': 0,
									'-webkit-transition-duration': '',
									'-webkit-transition-timing-function': '',
									'-webkit-transform': '',
									'-webkit-transition-delay': '',
									'z-index': $(this).index()
								});
							});
					}
					i++;
				}).end()
				.doTimeout( 'initial', 250, function(){
					setCurrentButton();
					animateSlide();
					element
						.doTimeout( 'slide', settings.delay, function() {
					
							if(settings.i == settings.length) {
								settings.i = 1;
							} else {
								settings.i++;
							}
				
							setCurrentButton();
							animateSlide();
							return true;
						});
					return false;
				});
			
 
	};
})( jQuery );
