(function($) {
	$.fn.boxedslider = function(options) 
	{
		var defaults = 
		{
				previewSlideMargin : 120,
				slideDuration : 300,
				itemWidth : 910,
				initialTarget : null
		};
  
		var options = $.extend(defaults, options);
    
		return this.each(function()
		{
			context = $(this);			
			
			var current_item = options.initialTarget;
			if (!current_item || current_item.size() == 0)
				current_item = $(".boxedslider_item:first", context);
			
			context.data('boxedSlider:currentItem', current_item);
			context.data('boxedSlider:targetItem', current_item);
			context.data('boxedSlider:isSliding', false);
			
			var slideBack = true;
			
			var isiPad = navigator.userAgent.match(/iPad/i) != null;
			
			if(!isiPad)
			{
				options.buttonNext.mouseover(function()
				{
					slideBack = true;
					context.data('boxedSlider:clickCount', 0);
					slide(options, context, 'next', true);
				});
				
				options.buttonNext.mouseout(function()
				{
					if (slideBack)
					{
						context.data('boxedSlider:clickCount', 0);
						slide(options, context, 'back', true);
					}
				});	
				
				options.buttonPrev.mouseover(function()
				{
					slideBack = true;
					context.data('boxedSlider:clickCount', 0);
					slide(options, context, 'prev', true);
				});
				
				options.buttonPrev.mouseout(function()
				{
					if (slideBack)
					{
						context.data('boxedSlider:clickCount', 0);
						slide(options, context, 'back', true);
					}
				});
			}
			
			var ensureLoadedItemFn = function(direction)
			{
				slide(options, context, direction, false, function(new_target_item) {
					
					if (new_target_item.size() > 0)
					{
						if ($('.boxedslider_item_not_loaded', new_target_item).size() > 0)
						{
							if (!new_target_item.data('is_loading'))
							{
								new_target_item.data('is_loading', true);
								fireLoadItem(options, new_target_item);
							}
						}
					}
				});
				
				$("#navholder .nextprod").css({"background-position":"10px 0px"});
				$("#navholder .prevprod").css({"background-position":"0px -70px"});
			};
			
			
			
			/*
			$('#prodspagecontainer').swipe({
			     swipeLeft: function()
			     {
			     	slideBack = false;
					var clickCount = context.data('boxedSlider:clickCount');
					context.data('boxedSlider:clickCount', ++clickCount);
					ensureLoadedItemFn('next', true);
			     },
			     swipeRight: function()
			     {
					slideBack = false;
					var clickCount = context.data('boxedSlider:clickCount');
					context.data('boxedSlider:clickCount', ++clickCount);
					ensureLoadedItemFn('prev', true);
			     },
			     treshold: "50,20"
			});
			*/
			
			options.buttonNext.click(function()
			{
				slideBack = false;
				var clickCount = context.data('boxedSlider:clickCount');
				context.data('boxedSlider:clickCount', ++clickCount);
				ensureLoadedItemFn('next', true); 
			});
			
			options.buttonPrev.click(function()
			{
				slideBack = false;
				var clickCount = context.data('boxedSlider:clickCount');
				context.data('boxedSlider:clickCount', ++clickCount);
				ensureLoadedItemFn('prev', true);
			});
			
			fireInitialized(options, current_item);
			updateUI(options, context);
			
			next_item = getNextItem(current_item);
			if (next_item)
				fireLoadItem(options, next_item);
			
			prev_item = getPrevItem(current_item);
			if (prev_item)
				fireLoadItem(options, prev_item);
		});
	};
	
	function fireBeforeSlide(options, item, next, direction)
	{
		if (typeof(options.beforeSlideFn) == "function")
			options.beforeSlideFn({ item : item, next : next, direction : direction });
	};

    function fireBeforePreview(options, item, next, direction)
	{
		if (typeof(options.beforePreviewFn) == "function")
			options.beforePreviewFn({ item : item, next : next, direction : direction });
	};
    
    function fireInitialized(options, item)
	{
		if (typeof(options.initializedFn) == "function")
			options.initializedFn({ item : item });
	};
	
	function fireLoadItem(options, item)
	{
		if (typeof(options.loadItemFn) == "function")
		{
			options.loadItemFn({
				item : item,
				completedFn : function(data)
				{
					item.data('is_loading', false);
					if (data)
					{
						item.html($(data).children());
						item.removeClass('boxedslider_item_hidden');
						updateUI(options, item.parents('#boxedslider'));
						fireInitialized(options, item);
					}
				}
			});
		}
	};
	
	function updateUI(options, context, preview, direction, animate)
	{
		//console.log('updateUI,' + preview + "," + direction + "," + animate);
		var target_item = context.data('boxedSlider:targetItem');
		var current_item = context.data('boxedSlider:currentItem');
		var container = $("#boxedslidercontainer", context);
		
		options.buttonNext.css("display", ((preview ? getNextItem(current_item) : getNextItem(target_item)) ? "block" : "none"));
		options.buttonPrev.css("display", ((preview ? getPrevItem(current_item) : getPrevItem(target_item)) ? "block" : "none"));
		
		var current_item_index = current_item.index();
		var target_item_index = target_item.index();
		var visibleCount = Math.abs(current_item_index-target_item_index)+1;
		
		/*if (context.data('boxedSlider:isSlidingBack') || context.data('boxedSlider:isInPreview'))
			visibleCount++;*/
		
		if (direction == 'back')
			visibleCount++;
		
		//console.log('target_item: ' + target_item.attr('id'));
		//console.log('current_item_index' + current_item_index);
		//console.log('target_item_index' + target_item_index);
		//console.log('visibleCount' + visibleCount);
		
		var width = options.itemWidth * visibleCount;
		//console.log('width: ' + width);
		container.css("width", width + "px");
		
		if (preview && direction != 'back' && target_item.attr('id') != current_item.attr('id'))
			target_item.addClass('boxedslider_item_opacity');
		
		if (!target_item.hasClass('boxedslider_item_visible'))
		{
			target_item.addClass('boxedslider_item_visible');
			if (direction == 'prev')
			{
				var margin = parseInt(container.css('marginLeft').replace("px", "")) - options.itemWidth;
				container.css('marginLeft', margin + "px");
			}
		}
		
		if (animate)
		{
			if (!preview)
				context.data('boxedSlider:isSliding', true);
			else if (direction == 'back')
				context.data('boxedSlider:isSlidingBack', true);
			
					
			var visible_prev_items;
			if (!preview)
				visible_prev_items = target_item.prevAll('.boxedslider_item_visible').size();
			else
				visible_prev_items = current_item.prevAll('.boxedslider_item_visible').size();
			
			//console.log('visible_prev_items' + visible_prev_items);
			var margin = (-options.itemWidth) * (visible_prev_items);
			//console.log('margin' + margin);
			
			if (preview)
			{
				if (direction == 'next')
					margin -= options.previewSlideMargin;
				else if (direction == 'prev')
					margin += options.previewSlideMargin;
	            
	            if (direction != 'back') 
	                fireBeforePreview(options, current_item, target_item, direction);
			}
			else
			{
				target_item.removeClass('boxedslider_item_opacity');
				fireBeforeSlide(options, current_item, target_item, direction);
			}
			
			container
    		.stop()
    		.animate(
    			{ 
    				marginLeft: margin + "px" 
    			}, 
    			{
    				duration: options.slideDuration,
	      			easing: "swing",
	      			complete : function()
	           		{
    					//console.log("ANIMATION ENDED!");
    					
    					var the_item;
    					
    					if (!preview)
    					{
    						the_item = target_item;
    						context.data('boxedSlider:currentItem', target_item);
    					}
    					else if (direction == 'back')
    					{
    						the_item = current_item;
    						context.data('boxedSlider:targetItem', current_item);
    					}
    					
    					if (!preview || direction == 'back')
    					{
    						$(".boxedslider_item_visible", context).not(the_item).removeClass('boxedslider_item_visible');
    						the_item.removeClass('boxedslider_item_opacity');
    						container.css('marginLeft', '0px');
    						context.data('boxedSlider:isInPreview', false);
    					}
    					
    					context.data('boxedSlider:isSliding', false);
    					context.data('boxedSlider:isSlidingBack', false);
    					
    					updateUI(options, context, preview, direction, false);
	           		}
    			});
			
			
			/*if (!preview)
			{
				var prevCount = current_item.prevAll('.boxedslider_item_current_prospect').size();
				
				if (direction == 'next')
					margin = -((prevCount+1) * options.itemWidth);
				else if (direction == 'prev')
				{
					//if (!$("#boxedslidercontainer", context).data('boxedSlider:lastSlideWasPreview'))
					//	$("#boxedslidercontainer", context).css('marginLeft', (-options.itemWidth) + "px");
					
					//margin = 0;
				}
	                
	            fireBeforeSlide(options, current_item, next_item, direction);
			}
			else
			{
				if (direction == 'next')
					margin = -options.previewSlideMargin;
				else if (direction == 'prev')
					margin = -(options.itemWidth - options.previewSlideMargin);
				else if (direction == 'back' && current_item.prev().hasClass('boxedslider_item_current_prospect'))
					margin = -options.itemWidth;
	            
	            if (direction != 'back') {
	                fireBeforePreview(options, current_item, next_item, direction);
	            }
			}
			
			container
	    		.data('boxedSlider:isSliding', true)
	    		.data('boxedSlider:isSlidingPreview', (preview && direction != 'back'))
	    		.stop()
	    		.animate(
	    			{ 
	    				marginLeft: margin + "px" 
	    			}, 
	    			{
	    				duration: options.slideDuration,
		      			easing: "swing",
		      			complete : function()
		           		{
	    					container.data('boxedSlider:isSliding', false);
	    					container.data('boxedSlider:lastSlideDirection', direction);
	    					container.data('boxedSlider:lastSlideWasPreview', preview && direction != 'back');
		      			
		           			if (direction == 'back')
		           			{
		           				$(".boxedslider_item_current_prospect", context).removeClass('boxedslider_item_current_prospect');
		           			}
		           			else
		           			{
		           				if (!preview)
		           				{
		           					current_item.removeClass('boxedslider_item_current');
		               				next_item.addClass('boxedslider_item_current');
		           					$(".boxedslider_item_current_prospect", context).removeClass('boxedslider_item_current_prospect');
		           					container.css('marginLeft', '0px');
		           				}
		           			}
		           			
		           			context.data('boxedSlider:visibleCount', 1);
		           			if (!preview || (preview && direction == 'back'))
		           				updateUI(options, context, direction, preview);
		           		}
		      		}
	    		);	*/
		}
	}
	
	function slide(options, context, direction, preview, callback)
	{
		var target_item = context.data('boxedSlider:targetItem');
		var new_target_item = null;
		if (!preview && context.data('boxedSlider:clickCount') <= 1)
			new_target_item = target_item;
		else if (direction == 'prev')
			new_target_item = getPrevItem(target_item);
		else if (direction == 'next')
			new_target_item = getNextItem(target_item);
		else
			new_target_item = context.data('boxedSlider:currentItem');
		
		if (new_target_item && new_target_item.size() > 0)
		{
			if (preview)
				context.data('boxedSlider:isInPreview', true);
				
			context.data('boxedSlider:targetItem', new_target_item);
			if (typeof(callback) === "function")
				callback(new_target_item);
			updateUI(options, context, preview, direction, true);
		}	
	}
	
	function getNextItem(item)
	{
		var found_item = item.next('.boxedslider_item');
		
		return (found_item.size() > 0) ? found_item : null;
	}
	
	function getPrevItem(item)
	{
		var found_item = item.prev('.boxedslider_item');
		
		return (found_item.size() > 0) ? found_item : null;
	}
	
	function getPrevItemCount(item)
	{
		var count = item.prevAll('.boxedslider_item:not(.boxedslider_item_hidden)').size();
		return count;
	}
})(jQuery);

/*
 * $(document).ready(function(){				
    $('#navholder .prev .prevprod').mouseover(function(){
            
        $('#navholder .prev .prevprod').css(
        	{backgroundPosition: "10px -105px"}
        );

        $("#boxedslidercontainer").stop().animate(
            {marginLeft: "15px"},
               {duration: 200}
          ); 
        
        $(this) 
        .mouseout(function(){
        	$('#navholder .next .nextprod').css(
           			{backgroundPosition: "10px 0px"}
                );

            $("#boxedslidercontainer").stop().animate(
              	{marginLeft: "0px"},
               	{duration: 200}
           	);
        })
    });

    var slideBack = false;
    $('#navholder .next .nextprod').mouseenter(function(){
            
        $('#navholder .next .nextprod').css(
        	{backgroundPosition: "10px -35px"}
        );

        var current_item = $(".boxedslider_item_current", "#boxedslidercontainer");
        //current_item.prevAll('boxedslider_item').size() * 900
        
        $("#boxedslidercontainer").stop().animate(
            {marginLeft: "-75px"},
           	{duration: 150}
      	);
        slideBack = true;
    })
    .mouseout(function(){
       	$('#navholder .next .nextprod').css(
       			{backgroundPosition: "10px 0px"}
            );

		if (slideBack)
		{
        	$("#boxedslidercontainer").stop().animate(
          		{marginLeft: "0px"},
           		{duration: 200}
       		);
		}
    })
    .click(function(){
    	var current_item = $(".boxedslider_item_current", "#boxedslidercontainer");
    	current_item.removeClass('current_production');
    	current_item.next('.boxedslider_item').addClass('current_production');
    	
    	slideBack = false;
    	$("#boxedslidercontainer").stop().animate(
        	{marginLeft: "-900px"},
           	{duration: 300}
      	);
      	return false;
    });
});*/

