
(function( $ ){
	$.fn.wsImageSlider = function(options) {
		
		var settings = {
				
			slideSelector : ".slide",
			slidePositionSelector : ".slidePositioner",
			nextSelector : ".slideNext",
			prevSelector : ".slidePrev",
			slideButtonInactive : "inactive",
			extraInfoSelector : ".fadeHide",
			
			showRandom : 0,
			transitionTime : 300,
			showItems : 3,
			useFade : true,
			fadeInactive : 40,
			fadeActive : 100
		};
		
		var maxWidth = 0, maxHeight = 0, selectedItem = 0, totalItems = 0;
		
		var methods = {
			
			init : function() {
			
				totalItems = $(this).find(settings.slideSelector).length;
				
				$(this).find(settings.slideSelector).each(function(){
					maxWidth  = Math.max( maxWidth, $(this).width() );
					maxHeight = Math.max( maxHeight, $(this).height() );
				}).width(maxWidth);
				
				//maxHeight = $(this).find(settings.slidePositionSelector).height();
				
				// If fading is used, fade the inactive slides now
				if (settings.useFade) $(this).find(settings.slideSelector).fadeTo(0, (settings.fadeInactive / 100));
				
				var margin = methods.recalculateMargins.call(this, true);
				
				$(this).height(maxHeight);
				
				if (settings.showRandom) {
					selectedItem = Math.ceil(totalItems * Math.random()); 
				} else {
					selectedItem = (totalItems > 1) ? Math.ceil(totalItems / 2) : 1;
				};
				
				$(this).find(settings.slidePositionSelector + " " + settings.extraInfoSelector).hide();
				
				var centerPoint = Math.floor($(this).width() / 2);
				
				$(this).find(settings.nextSelector).click( methods.nextItem ).hover( function(){ jQuery(this).addClass("hover"); }, function(){ jQuery(this).removeClass("hover"); });
				$(this).find(settings.prevSelector).click( methods.prevItem ).hover( function(){ jQuery(this).addClass("hover"); }, function(){ jQuery(this).removeClass("hover"); });
				
				$(this).addClass("wsISinstance");
				
				$(this).data("wsIS", {
					settings : settings,
					selectedItem : selectedItem,
					oldItem : 0,
					totalItems : totalItems,
					centerPoint : centerPoint,
					margin : margin,
					maxWidth : maxWidth,
					maxHeight : maxHeight
				});
				
				methods.showSelectedItem.call(this, true)
				
			},
			
			recalculateMargins : function() {
				
				margin = ($(this).width() - (settings.showItems * maxWidth) );
				if (settings.showItems > 1) margin /= settings.showItems;
				margin = Math.floor(margin);
				var halfMargin = Math.floor(margin/2)
				
				$(this).find(settings.slideSelector).css({"margin-right" : halfMargin + "px", "margin-left" : halfMargin + "px"});
				
				// Force slide container to be very wide, so it can contain all entries
				$(this).find(settings.slidePositionSelector).width( totalItems * (maxWidth + margin) );
				
				return margin;
				
			},
			
			
			
			showSelectedItem : function(noAnimation, noOldMark) {
				var objData = $(this).data("wsIS");
				
				// Calculate new position
				var newPos = objData.centerPoint - ((objData.selectedItem - 1) * (objData.maxWidth + objData.margin)) - Math.floor(objData.maxWidth / 2) - Math.ceil(objData.margin / 2);
				
				$(this).stop(1,1).find("*").stop(1,1);
				
				if (noAnimation) {
					$(this).find(objData.settings.slidePositionSelector).css("left", newPos + "px");
					$(this).find(objData.settings.slideSelector).eq(objData.selectedItem - 1).fadeTo(0, objData.settings.fadeActive).find(objData.settings.extraInfoSelector).fadeIn(0);
					if (objData.oldItem && !noOldMark) {
						$(this).find(objData.settings.slideSelector).eq(objData.oldItem - 1).fadeTo(0, objData.settings.fadeInactive).find(objData.settings.extraInfoSelector).fadeOut(0);
					};
				} else {
					var parObj = $(this);
					
					if (objData.settings.useFade) {
						$(this).find(objData.settings.slideSelector).eq(objData.selectedItem - 1)
							.fadeTo(objData.settings.transitionTime, objData.settings.fadeActive / 100)
							.find(objData.settings.extraInfoSelector)
							.fadeIn(objData.settings.transitionTime);
						if (objData.oldItem && !noOldMark) {
							$(this).find(objData.settings.slideSelector).eq(objData.oldItem - 1)
								.fadeTo(objData.settings.transitionTime, objData.settings.fadeInactive / 100)
								.find(objData.settings.extraInfoSelector)
								.fadeOut(objData.settings.transitionTime);
						};
					} else {
						$(this).find(objData.settings.slideSelector).eq(objData.selectedItem - 1).find(objData.settings.extraInfoSelector).show();
						if (objData.oldItem && !noOldMark) {
							$(this).find(objData.settings.slideSelector).eq(objData.oldItem - 1).find(objData.settings.extraInfoSelector).hide();
						};
					};
					
					$(this).find(objData.settings.slidePositionSelector).animate({"left" : newPos + "px"}, objData.settings.transitionTime);
				};
				
				if (!noOldMark) {
					objData.oldItem = objData.selectedItem;
					$(this).data("wsIS", objData);
				};
				
				if (objData.selectedItem > 1) {
					$(this).find(objData.settings.prevSelector).removeClass(objData.settings.slideButtonInactive);
				} else {
					$(this).find(objData.settings.prevSelector).addClass(objData.settings.slideButtonInactive);
				};
				
				if (objData.selectedItem < objData.totalItems) {
					$(this).find(objData.settings.nextSelector).removeClass(objData.settings.slideButtonInactive);
				} else {
					$(this).find(objData.settings.nextSelector).addClass(objData.settings.slideButtonInactive);
				};
			},
			
			nextItem : function() {
				$(this).blur();
				var instance = $(this).parents(".wsISinstance:first");
				var objData = instance.data("wsIS");
				if (objData.selectedItem < objData.totalItems) {
					objData.selectedItem += 1;
					instance.data("wsIS", objData);
					methods.showSelectedItem.call(instance);
				};
			},
			
			prevItem : function() {
				$(this).blur();
				var instance = $(this).parents(".wsISinstance:first");
				var objData = instance.data("wsIS");
				if (objData.selectedItem > 1) {
					objData.selectedItem -= 1;
					instance.data("wsIS", objData);
					methods.showSelectedItem.call(instance);
				};
			},
			
			windowResize : function(e) {
				
				var parent = e.data.parent;
				if (typeof(parent) === 'object') {
					var margin = methods.recalculateMargins.call(parent, false);
					var centerPoint = Math.floor($(parent).width() / 2);
					
					var objData = $(parent).data("wsIS");
					objData.margin = margin;
					objData.centerPoint = centerPoint;
					$(parent).data("wsIS", objData);
					
					methods.showSelectedItem.call(parent, true, true);
				};
			}
			
		};
		

		return this.each(function() {
			if (options) {
				$.extend( settings, options );
			};
			
			$(window).bind('resize.wsimageslider', {parent: this}, methods.windowResize );
			
			methods.init.call(this);
		});

	};
})( jQuery );

