(function($)
{   
	$.fn.extend
	(
		{    
			ElectricSlide: function(options) 
			{  
				var defaults = 
				{  
					itemsSelector: "li",
					slideWidth: 350,
					previousToggleSelector: ".previous",
					nextToggleSelector: ".next",
					hideTogglesForOneSlide: false,
					hideTogglesStyle: null,
					slideSpeedMilliseconds: 1000,
					rewindFastForward: true,
					toggleSelectorOffClass: null
				}; 
			
				var options =  $.extend(defaults, options);  

				return this.each
				(
					function() 
					{  
						var electric_slide = jQuery(this);
						electric_slide.css("position", "relative");
						
						var o = options;  
	
						var aryItems = electric_slide.children(o.itemsSelector);
						
						for(var i = 0; i < aryItems.length; i++)
						{
							var item = jQuery(aryItems.get(i));
							item.css("float", "left");
							item.css("position", "absolute");
							item.css("left", i * o.slideWidth);
						}
						
						var prev = jQuery(o.previousToggleSelector);
						var next = jQuery(o.nextToggleSelector);
						
						var iFirstLeft = parseInt(jQuery(aryItems.get(0)).css("left").replace("px", ""));
						
						if(!o.rewindFastForward && o.toggleSelectorOffClass && iFirstLeft >= 0)
							prev.addClass(o.toggleSelectorOffClass);
							
						var iLastLeft = parseInt(jQuery(aryItems.get(aryItems.length - 1)).css("left").replace("px", ""));
						
						if(!o.rewindFastForward && o.toggleSelectorOffClass && iLastLeft < 1)
							next.addClass(o.toggleSelectorOffClass);
						
						var bAnimating = false;
						
						prev.click
						(
							function()
							{
								var toggle = jQuery(this);
								var iFirstLeft = parseInt(jQuery(aryItems.get(0)).css("left").replace("px", ""));
								
								if(!bAnimating && o.rewindFastForward && iFirstLeft >= 0)
								{
									bAnimating = true;
									aryItems.animate
									(
										{left : '-=' + iLastLeft}, 
										o.slideSpeedMilliseconds,
										function()
										{
											bAnimating = false;
										}
									);
								}
								else if(!bAnimating && iFirstLeft < 0)
								{
									bAnimating = true;
									aryItems.animate
									(
										{left : '+=' + o.slideWidth}, 
										o.slideSpeedMilliseconds,
										function()
										{
											if(!o.rewindFastForward && o.toggleSelectorOffClass)
											{
												next.removeClass(o.toggleSelectorOffClass);
												
												var iFirstLeftNow = parseInt(jQuery(aryItems.get(0)).css("left").replace("px", ""));
												
												 if(iFirstLeftNow >= 0)
													prev.addClass(o.toggleSelectorOffClass);
											}
											
											bAnimating = false;
										}
									);
								}
							}
						);
						
						next.click
						(
							function()
							{
								var toggle = jQuery(this);
								var iLastLeft = parseInt(jQuery(aryItems.get(aryItems.length - 1)).css("left").replace("px", ""));
								
								if(!bAnimating && o.rewindFastForward && iLastLeft < 1)
								{
									bAnimating = true;
									aryItems.animate
									(
										{left : '+=' + (-1 * iFirstLeft)}, 
										o.slideSpeedMilliseconds,
										function()
										{
											bAnimating = false;
										}
									);
								}
								else if(!bAnimating && iLastLeft > 0)
								{
									bAnimating = true;
									aryItems.animate
									(
										{left : '-=' + o.slideWidth}, 
										o.slideSpeedMilliseconds,
										function()
										{
											if(!o.rewindFastForward && o.toggleSelectorOffClass)
											{
												prev.removeClass(o.toggleSelectorOffClass);
												
												var iLastLeftNow = parseInt(jQuery(aryItems.get(aryItems.length - 1)).css("left").replace("px", ""));
												
												if(iLastLeftNow < 1)
													next.addClass(o.toggleSelectorOffClass);
											}
											
											bAnimating = false;
										}
									);
								}
							}
						);
						
						if(o.hideTogglesForOneSlide && aryItems.length < 2)
						{
						    if(o.hideTogglesStyle)
						    {
						        prev.css(o.hideTogglesStyle);
						        next.css(o.hideTogglesStyle);
						    }
						    else
						    {
						        prev.css({"display": "none"});
						        next.css({"display": "none"});
						    }
						}
					}
				);  
			}  
		}
	);  	      
}
)(jQuery);  
