(function( $ ){

	$.fn.wineslider = function( options ) {  

		var settings = $.extend( {}, options);
		

		return this.each(function() {
			
			var self = {} ;
			self.frame = $(this) ;
			self.counter = 0 ;
			self.animating = false ;
			
			self.normal_style = {
				opacity: 0.5,
				//height: '95%',
				//position: 'absolute',
				left: '50%',
				bottom: 0,
				marginLeft: -73

			} ;

			self.highlight_style = {
				opacity: 1,
				//height: '100%',
				marginLeft: -82
			} ;
			
			self.hover_style = {
				opacity: 0.85
			} ;

			self.updateBottleHandlers = function() {
				self.panel.find('img').unbind('click').unbind('hover').css({cursor: 'default'}) ;
				
				var prev = self.counter - 1 ;
				var next = self.counter + 1 ;
				
				var hoverEffect = function(wine) {
					wine.img.hover(function() {
						if(self.animating !== true)
						{
							$(this).stop(true).animate(self.hover_style) ;
						}
					}, function() {
						if(self.animating !== true)
						{
						//	alert('out') ;
							$(this).stop(true).animate(self.normal_style) ;
						}
						
					}) ;
				} ;
				
				if(typeof self.winelist[prev] !== 'undefined')
				{
					self.winelist[prev].img.bind('click', self.prev).css({cursor: 'pointer'}) ;
					hoverEffect(self.winelist[prev]) ;
				}
				
				if(typeof self.winelist[next] !== 'undefined')
				{
					self.winelist[next].img.bind('click', self.next).css({cursor: 'pointer'}) ;
					hoverEffect(self.winelist[next]) ;
				}
			} ;

			self.setHandlers = function() {
				self.arrow_left.bind('click', self.prev) ;
				self.arrow_right.bind('click', self.next) ;
				
				self.updateBottleHandlers() ;
				
				$(window).keydown(function(event) {
					if(event.keyCode == 39)
					{
						self.next() ;
					}
					
					if(event.keyCode == 37)
					{
						self.prev() ;
					}
				}) ;
			} ;

			self.prev = function() {
				if(self.animating === true)
				{
					return false ;
				}
				
				if(self.counter > 0) 
				{
					self.counter = self.counter - 1 ;
					self.target = self.winelist[self.counter] ;
					self.animateToTarget(1) ;
					
					if(self.counter === 0)
					{
						self.hideArrow(self.arrow_left) ;
					}
				}
				
				self.showArrow(self.arrow_right) ;
			} ;
			
			self.next = function() {
				if(self.animating === true)
				{
					return false ;
				}
				
				//console.log(self.counter + ' ' + (self.winelist.length - 1)) ;
				if(self.counter < self.winelist.length - 1) 
				{
					self.counter = self.counter + 1 ;
					self.target = self.winelist[self.counter] ;
					self.animateToTarget(-1) ;
					
					if(self.counter === (self.winelist.length - 1))
					{
						self.hideArrow(self.arrow_right) ;
					}
					
					self.showArrow(self.arrow_left) ;
				}
			} ;
			
			self.hideArrow = function(arrow) {
				arrow.stop(true).animate({opacity: 0}, 200).queue(function() {
					$(this).css({display: 'none'}) ;
				}) ;
			} ;
			
			self.showArrow = function(arrow) {
				arrow.css({display: 'block'}) ;
				arrow.stop(true).animate({opacity: 1}, 200) ;
			} ;
			
			self.animateToTarget = function(modifier) {
				
				settings.onChange(self.target) ;
				
				self.animating = true ;

				//console.log('position target: '+self.target.node.position().left) ;
				
				//console.log('left: '+self.panel.position().left) ;
				
				var new_left = self.panel.position().left + modifier * self.node_width ;
				//console.log('new left: '+new_left) ;
				self.panel.animate({left: new_left}) ;
				
				self.current.img.stop(true).animate(self.normal_style).queue(function() {
					self.animating = false ;
					$(this).dequeue() ;
				}) ;
				
				self.target.img.stop(true).animate(self.highlight_style) ;
				
				self.current = self.target ;
				self.target = null ;
				
				self.updateBottleHandlers() ;
				
			} ;

			self.setup = function() {

				self.arrow_left = $('<div class="arrow_left"></div>').css({opacity: 0, display: 'none'}) ;
				self.arrow_right = $('<div class="arrow_right"></div>').css({opacity: 0}) ;
				self.frame.prepend(self.arrow_left) ;
				self.frame.prepend(self.arrow_right) ;
				
				self.arrow_left.hover(function() {
					$(this).addClass('mol') ;
				}, function() {
					$(this).removeClass('mol') ;
				}) ;

				self.arrow_right.hover(function() {
					$(this).addClass('mor') ;
				}, function() {
					$(this).removeClass('mor') ;
				}) ;

				self.mask = $('<div class="wine_mask"></div>') ;
				self.panel = $('<div class="wine_panel"></div>') ;
				self.frame.append(self.mask) ;
				self.mask.append(self.panel) ;

				self.winelist = settings.wine ;
				self.panel_width = 0 ;
				
				self.node_height = self.frame.outerHeight() ;
				
				self.normal_style.height = self.node_height * settings.scale ;
				self.highlight_style.height = self.node_height ;
				

				for(i=0; i < self.winelist.length; i++)
				{

					self.winelist[i].node = $('<div class="wine_item"></div>') ;

					self.winelist[i].img = $('<img src="'+self.winelist[i].img+'" alt="'+self.winelist[i].name+'" />').css(self.normal_style).css({position: 'absolute'}) ;
					self.winelist[i].node.append(self.winelist[i].img) ;


					self.panel.append(self.winelist[i].node) ;

					self.panel_width = self.panel_width + self.winelist[i].node.outerWidth() ;

					//alert()

					//alert(settings.wine[i].name) ;

				}

				self.winelist[0].img.css(self.highlight_style) ;
				self.current = self.winelist[0] ;
				

				self.node_width = self.panel_width / self.winelist.length ;
				
				//alert(self.node_height) ;

				self.base_left = ((self.mask.outerWidth()/2)-(self.node_width/2)) ;
				
				//self.panel.css({width: self.panel_width, left: (self.mask.outerWidth())}) ;
				self.panel.css({width: self.panel_width, left: -(self.panel_width)}) ;
				self.panel.delay(500).animate({left: self.base_left}, 600, 'easeOutExpo').queue(function() {
					
					//self.winelist[0].img.animate(self.highlight_style) ;
					
					settings.init() ;
					settings.onChange(self.current) ;
					if(self.winelist.length > 1)
					{
						self.arrow_right.animate({opacity: 1}) ;
					}
					
					self.setHandlers() ;
					$(this).dequeue() ;
				}) ;
			} ;
			
			self.setup() ;
    	});

	};
})( jQuery );
