	
	/**
	 * dTslider - the jquery plugin
	 *
	 * this text should tell you how the plugin works. too bad it doesn't.
	 */
	(function( $ ){
			
		//
		// Default settings
		var defaultSettings = {
			'animate' :			true, 			// should the slider animate
			'speed' :			500, 			// how fast should the slider animate
			'easing' :			null, 			// should the slider use an easing method for animation
			'previous' : 		'a.previous', 	// what is the previous button called
			'next' :			'a.next', 		// what is the next button called
			'container' :		'ul:first', 	// what is the container for the elements called (usually with overflow:hidden)
			'element' :			'li', 			// what are the slide elements called
			'timer' :			false, 			// should the slider rotate on a duration
			'orientation' :		'horizontal',	// horizontal or vertical slider
			'continuous' :		true,			// continuous (infinite) scrolling
			'visible'	:		1,				// how many slides are visible
			'mousewheel' :		false			// use mousewheel events
		};
		
		//
		// Methods
		var methods = {
			
			//
			// Initialize slider
			init : function( options ) {
				
				return this.each(function() {
				
					var $this = $(this);
					
					//
					// Apply initial settings
					var settings = defaultSettings;
					if ( options ) settings = $.extend( {}, defaultSettings, options );
					$this.data( 'dTslider', { 'settings' : settings } );
					
					//
					// Verify count
					if( $this.find(settings.container + ' > ' + settings.element).length <= settings.visible ) {
						$this.find(settings.previous).hide();
						$this.find(settings.next).hide();
						return;
					}
					
					//
					// Get data
					methods.refresh.call($(this));
					var data = $this.data('dTslider');
					
					//
					// Apply event listeners
					methods.enable.call($this);
					
					//
					// Setup timer
					if( data.settings.timer ) {
						data.interval = setInterval( function() {
							methods.next.call($this);
						}, data.settings.timer );
						$(this).bind( 'mouseover.dTslider', function() {
							methods.stop.call($this);
						});
						$(this).bind( 'mouseout.dTslider', function() {
							methods.start.call($this);
						});
					}
					
					//
					// Save data
					$this.data( 'dTslider', data );
					
				});
				
			},
			
			//
			// Go to next slide
			next : function() {
				
				return this.each(function() {
				
					var $this = $(this);
					
					methods.disable.call($this);
				
					var data = $(this).data('dTslider');
					var slides = $(this).find( data.settings.container + ' > ' + data.settings.element );
					var current = data.current;
					var next = ( current+data.visible > data.total )? (current+data.visible)-data.total : current+data.visible;
					
					if( typeof(data.settings.begin) == 'function' ) {
						data.settings.begin.call( $this, next-1 );
					}
					
					//
					// Check position
					if( !data.settings.continuous && data.current == ( data.total - data.visible + 1 ) ) { methods.enable.call($this); return };
					
					//
					// Horizontal
					if( data.settings.orientation=='horizontal' ) {
					
						//
						// Update height
						data.height = $(slides[next-1]).outerHeight(true);
						$this.animate( { height: data.height }, data.settings.speed, data.settings.easing ).find(data.settings.container).animate( { height: data.height }, data.settings.speed, data.settings.easing );
					
						//
						// Animate current
						$(slides).removeClass('animate');
						for( var i = 0; i < data.visible; i++ ) {
							var position = ( current+i > data.total )? (current+i)-data.total : current+i;
							$(slides[position-1]).css({ display: 'block', left: (i*data.width) }).addClass('animate').addClass('current').stop().animate( { left: ((i-1)*data.width) }, data.settings.speed, data.settings.easing );
						}
						
						//
						// Set class for element leaving frame
						$(slides[current-1]).removeClass('current');
						
						//
						// Animate next element into frame
						$(slides[next-1]).css({ display: 'block', left: (data.visible*data.width) }).addClass('animate').addClass('current').stop().animate( { left: ((data.visible-1)*data.width) }, data.settings.speed, data.settings.easing, function() { 
								methods.enable.call($this);
								if( typeof(data.settings.complete) == 'function' ) {
									data.settings.complete.call( $this, $this.find(data.settings.container + ' > ' + data.settings.element).eq(data.current-1) );
								}
							});
						
						//
						// Hide non animated slides
						$(slides).not('.animate').removeClass('current').css({ left: 0, display: 'none' });
					
					//
					// Vertical
					} else if( data.settings.orientation=='vertical' ) {
					
						//
						// Update width
						data.width = $(slides[next-1]).outerWidth(true);
						$this.animate( { width: data.width }, data.settings.speed, data.settings.easing ).find(data.settings.container).animate( { width: data.width }, data.settings.speed, data.settings.easing );
					
						//
						// Animate current
						$(slides).removeClass('animate');
						for( var i = 0; i < data.visible; i++ ) {
							var position = ( current+i > data.total )? (current+i)-data.total : current+i;
							$(slides[position-1]).css({ display: 'block', top: (i*data.height) }).addClass('animate').addClass('current').stop().animate( { top: ((i-1)*data.height) }, data.settings.speed, data.settings.easing );
						}
						
						//
						// Set class for element leaving frame
						$(slides[current-1]).removeClass('current');
						
						//
						// Animate next element into frame
						$(slides[next-1]).css({ display: 'block', top: (data.visible*data.height) }).addClass('animate').addClass('current').stop().animate( { top: ((data.visible-1)*data.height) }, data.settings.speed, data.settings.easing, function() {
								methods.enable.call($this);
								if( typeof(data.settings.complete) == 'function' ) {
									data.settings.complete.call( $this, $this.find(data.settings.container + ' > ' + data.settings.element).eq(data.current-1) );
								}
							});
						
						//
						// Hide non animated slides
						$(slides).not('.animate').removeClass('current').css({ top: 0, display: 'none' });
					
					}
					
					//
					// Save current
					data.current = ( current+1 > data.total )? 1 : current+1;
					$(this).data( 'dTslider', data);
				
				});
				
			},
			
			//
			// Go to previous slide
			previous : function() {
				
				return this.each(function() {
				
					var $this = $(this);
				
					var data = $(this).data('dTslider');
					var slides = $(this).find( data.settings.container + ' > ' + data.settings.element );
					var current = data.current;
					var next = ( current-1 < 1 )? data.total : current-1;
					
					methods.disable.call($this);
					
					if( typeof(data.settings.begin) == 'function' ) {
						data.settings.begin.call( $this, next-1 );
					}
					
					//
					// Check position
					if( !data.settings.continuous && data.current == 1 ) { methods.enable.call($this); return };
					
					//
					// Horizontal
					if( data.settings.orientation=='horizontal' ) {
					
						//
						// Update height
						data.height = $(slides[next-1]).outerHeight(true);
						$this.animate( { height: data.height }, data.settings.speed, data.settings.easing ).find(data.settings.container).animate( { height: data.height }, data.settings.speed, data.settings.easing );
					
						//
						// Animate current
						$(slides).removeClass('animate');
						for( var i = 0; i < data.visible; i++ ) {
							var position = ( current+i > data.total )? (current+i)-data.total : current+i;
							$(slides[position-1]).css({ display: 'block', left: (i*data.width) }).addClass('animate').addClass('current').stop().animate( { left: ((i+1)*data.width) }, data.settings.speed, data.settings.easing );
						}
						
						//
						// Set class for element leaving frame
						$(slides[current+data.visible-1]).removeClass('current');
						
						//
						// Animate next element into frame
						$(slides[next-1]).css({ display: 'block', left: (-1*data.width) }).addClass('animate').addClass('current').stop().animate( { left: 0 }, data.settings.speed, data.settings.easing, function() {
								methods.enable.call($this);
								if( typeof(data.settings.complete) == 'function' ) {
									data.settings.complete.call( $this, $this.find(data.settings.container + ' > ' + data.settings.element).eq(data.current-1) );
								}
							});
						
						//
						// Hide non animated slides
						$(slides).not('.animate').removeClass('current').css({ left: 0, display: 'none' });
					
					//
					// Vertical
					} else if( data.settings.orientation=='vertical' ) {
					
						//
						// Update width
						data.width = $(slides[next-1]).outerWidth(true);
						$this.animate( { width: data.width }, data.settings.speed, data.settings.easing ).find(data.settings.container).animate( { width: data.width }, data.settings.speed, data.settings.easing );
					
						//
						// Animate current
						$(slides).removeClass('animate');
						for( var i = 0; i < data.visible; i++ ) {
							var position = ( current+i > data.total )? (current+i)-data.total : current+i;
							$(slides[position-1]).css({ display: 'block', top: (i*data.height) }).addClass('animate').addClass('current').stop().animate( { top: ((i+1)*data.height) }, data.settings.speed, data.settings.easing );
						}
						
						//
						// Set class for element leaving frame
						$(slides[current+data.visible-1]).removeClass('current');
						
						//
						// Animate next element into frame
						$(slides[next-1]).css({ display: 'block', top: (-1*data.height) }).addClass('animate').addClass('current').stop().animate( { top: 0 }, data.settings.speed, data.settings.easing, function() {
								methods.enable.call($this);
								if( typeof(data.settings.complete) == 'function' ) {
									data.settings.complete.call( $this, $this.find(data.settings.container + ' > ' + data.settings.element).eq(data.current-1) );
								}
							});
						
						//
						// Hide non animated slides
						$(slides).not('.animate').removeClass('current').css({ top: 0, display: 'none' });
						
					}
					
					//
					// Save current
					data.current = next;
					$(this).data( 'dTslider', data);
				
				});
				
			},
			
			go : function(position) {
			
				var current = position;
			
				return this.each(function() {
				
					var $this = $(this);
				
					var data = $(this).data('dTslider');
					var slides = $(this).find( data.settings.container + ' > ' + data.settings.element );
					
					if( data.current == ( current + 1 ) ) return;
					
					methods.disable.call($this);
					
					if( typeof(data.settings.begin) == 'function' ) {
						data.settings.begin.call( $this, current );
					}
					
					//
					// Horizontal
					if( data.settings.orientation=='horizontal' ) {
					
						//
						// Update height
						data.height = $(slides[current]).outerHeight(true);
						$this.animate({ height: data.height }, data.settings.speed, data.settings.easing).find(data.settings.container).animate({ height: data.height }, data.settings.speed, data.settings.easing);
						
						//
						// Hide all slides
						$(slides).removeClass('current').stop().css({ left: 0, display: 'none' });
						$(slides[data.current-1]).css({ left: 0, display: 'block' });
						
						//
						// Go forward
						if( data.current > current ) {
						
							$(slides[current]).css({ left: -data.width, display: 'block' }).animate({ left: 0 }, data.settings.speed, data.settings.easing, function() {
									methods.enable.call($this);
									if( typeof(data.settings.complete) == 'function' ) {
										data.settings.complete.call( $this, $this.find(data.settings.container + ' > ' + data.settings.element).eq(data.current-1) );
									}
								}).addClass('current');
							
							$(slides[data.current-1]).animate({ left: data.width }, data.settings.speed, data.settings.easing);
							
						//
						// Go backward
						} else {
						
							$(slides[current]).css({ left: data.width, display: 'block' }).animate({ left: 0 }, data.settings.speed, data.settings.easing, function() {
									methods.enable.call($this);
									if( typeof(data.settings.complete) == 'function' ) {
										data.settings.complete.call( $this, $this.find(data.settings.container + ' > ' + data.settings.element).eq(data.current-1) );
									}
								}).addClass('current');
							
							$(slides[data.current-1]).animate({ left: -data.width }, data.settings.speed, data.settings.easing);
						
						}
					
					//
					// Vertical
					} else if( data.settings.orientation=='vertical' ) {
					
						//
						// Update width
						data.width = $(slides[current]).outerWidth(true);
						$this.animate( { width: data.width }, data.settings.speed, data.settings.easing ).find(data.settings.container).animate( { width: data.width }, data.settings.speed, data.settings.easing );
					
					}
					
					//
					// Save current
					data.current = current + 1;
					$(this).data( 'dTslider', data);
				
				});
			
			},
			
			//
			// Destroy slider
			destroy : function() {
				
				return this.each(function() {
				
					if( $(this).data('dTslider') != undefined ) {
				
						methods.stop.call($(this));
						methods.disable.call($(this));
						$(this).removeData('dTslider');
						$(this).unbind('.dTslider');
					
					}
					
				});
				
			},
			
			//
			// Refresh slider data
			refresh : function() {
				
				return this.each(function() {
				
					var $this = $(this);
					if( $this.data('dTslider') == undefined ) return;
				
					//
					// Default data variables
					var data = $(this).data('dTslider');
					var slides = $(this).find( data.settings.container + ' > ' + data.settings.element );
					var data = {
						'current' :		1,
						'total' :		$(this).find( data.settings.container + ' > ' + data.settings.element ).length,
						'width' :		$(slides[0]).outerWidth(true),
						'height' :		$(slides[0]).outerHeight(true),
						'settings' :	data.settings
					};
					
					//
					// Horizontal
					if( data.settings.orientation=='horizontal' ) {
					
						//
						// Update height
						data.height = $(slides[0]).outerHeight(true);
						$this.css({ height: data.height }).find(data.settings.container).css({ height: data.height });
						
						//
						// Set # of visible slides
						data.visible = Math.ceil( $(this).find(data.settings.container).parent().width() / data.width );
					
						//
						// Get current from positions
						for( var i = 0; i < slides.length; i++ ) {
							if( $(slides[i]).is(':visible') && parseInt($(slides[i]).css('left'))==0 ) {
								data.current = i+1;
								break;
							}
						}
						
						//
						// Position slides
						$(slides).removeClass('current').css({ position: 'absolute' });
						for( var i = 0; i < data.visible; i++ ) {
							var position = ( data.current+i > data.total )? (data.current+i)-data.total : data.current+i;
							$(slides[position-1]).addClass('current').css({ display: 'block', left: (data.width*i) });
						}
						$(slides).not('.current').css({ display: 'none', left: 0 });
					
					//
					// Vertical
					} else if( data.settings.orientation=='vertical' ) {
					
						//
						// Update width
						data.width = $(slides[0]).outerWidth(true);
						$this.css({ width: data.width }).find(data.settings.container).css({ width: data.width });
						
						//
						// Set # of visible slides
						data.visible = Math.ceil( $(this).find(data.settings.container).parent().height() / data.height );
					
						//
						// Get current from positions
						for( var i = 0; i < slides.length; i++ ) {
							if( $(slides[i]).is(':visible') && parseInt($(slides[i]).css('top'))==0 ) {
								data.current = i+1;
								break;
							}
						}
						
						//
						// Position slides
						$(slides).removeClass('current').css({ position: 'absolute' });
						for( var i = 0; i < data.visible; i++ ) {
							var position = ( data.current+i > data.total )? (data.current+i)-data.total : data.current+i;
							$(slides[position-1]).addClass('current').css({ display: 'block', top: (data.height*i) });
						}
						$(slides).not('.current').css({ display: 'none', top: 0 });
						
					}
					
					//
					// Setup container
					$(this).find(data.settings.container).css({ position: 'relative' });
					
					//
					// Set speed
					if( !data.settings.animate )
						data.settings.speed = 0;
					
					//
					// Save data
					$(this).data( 'dTslider', data );
				
				});
				
			},
			
			//
			// Disable slider actions
			disable : function() {
				
				return this.each(function() {
				
					var data = $(this).data('dTslider');
				
					$(this).find(data.settings.previous).unbind('.dTslider').bind('click.dTslider',function() { return false; });
					$(this).find(data.settings.next).unbind('.dTslider').bind('click.dTslider',function() { return false; });
				
				});
				
			},
			
			//
			// Enable slider actions
			enable: function() {
				
				return this.each(function() {
				
					var $this = $(this);
					var data = $(this).data('dTslider');
				
					$(this).find(data.settings.previous).unbind('.dTslider').bind( 'click.dTslider', function(e) {
						e.preventDefault();
						methods.previous.call($this);
					});
					
					$(this).find(data.settings.next).unbind('.dTslider').bind( 'click.dTslider', function(e) {
						e.preventDefault();
						methods.next.call($this);
					});
					
					if( data.settings.mousewheel ) {
						$(this).unbind('mousewheel.dTslider').bind( 'mousewheel.dTslider', function( e, delta ) {
							e.preventDefault();
							if( delta>0 ) {
								methods.previous.call($this);
							} else {
								methods.next.call($this);
							}
						});
					}
					
					if( data.settings.video != undefined && data.settings.video ) {
						var $li = $this.find('ul:first li').eq(data.current-1);
						$li.find('.tag').remove();
						$li.dTvideo('play');
					}
				
				});
				
			},
			
			//
			// Stop slider timer
			stop : function(e) {
				
				return this.each(function() {
			
					var data = $(this).data('dTslider');
					var settings = data.settings;
					
					clearInterval(data.interval);
					data.interval = null;
					$(this).data( 'dTslider', data );
				
				});
				
			},
			
			//
			// Start slider timer
			start : function() {
				
				return this.each(function() {
				
					var $this = $(this);
					var data = $(this).data('dTslider');
					
					data.interval = setInterval( function() {
						methods.next.call($this);
					}, data.settings.timer );
					$(this).data( 'dTslider', data );
					
				});
				
			},
			
			//
			// Set complete function
			complete : function(complete) {
			
				return this.each(function() {
				
					var $this = $(this);
					var data = $(this).data('dTslider');
					
					data.settings.complete = complete;
					
					$(this).data( 'dTslider', data);
				
				});
			
			},
			
			//
			// Set begin function
			begin : function(begin) {
			
				return this.each(function() {
				
					var $this = $(this);
					var data = $(this).data('dTslider');
					
					data.settings.begin = begin;
					
					$(this).data( 'dTslider', data);
				
				});
			
			},
			
			//
			// Get current slide
			getCurrent : function() {
				
				var $this = this;
				var data = $this.data('dTslider');
				var slides = $(this).find( data.settings.container + ' > ' + data.settings.element );
				
				return slides[data.current-1];
				
			}
		
		}
	  
		$.fn.dTslider = function( method ) {
			
			//
			// Method call
			if ( methods[method] ) {
				return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
			
			//
			// Default init call
			} else if ( typeof method === 'object' || ! method ) {
				return methods.init.apply( this, arguments );
			
			//
			// Method doesn't exist
			} else {
				$.error( 'Method ' +  method + ' does not exist on jQuery.dTslider' );
			}
		
		};
	  
	})( jQuery );
	
