(function($){
	$.fn.promoslide = function(options, func_param){
		var defaults = {
			nextButton: null,
			prevButton: null,
			duration: null,
			automove: true,
			autotimer: 5000
		};
		
		$(this).data("_promoslide_param_options", options);
		
		return this.each(function() {
			var objMain = $(this); //first and main UL element
			var options = objMain.data("_promoslide_param_options"); objMain.data("_promoslide_param_options", null);
			
			if (objMain.data("_promoslide_loaded")){ //If navbardrop has already loaded on this element then call the function instead. (Use func_param for any parameters required in the function).
				var settings = objMain.data("_promoslide_settings");
				var opts = objMain.data("_promoslide_options");
				var duration = opts.duration;
				
				switch(options){
					case "slideJump":
						duration = 0;
					case "setSlide":
						var orgSlide = settings.currentSlide;
						settings.currentSlide = func_param * 1;
						//if (settings.currentSlide == 0 ) settings.currentSlide = settings.items.length;
						if (settings.currentSlide > settings.items.length) settings.currentSlide = (settings.currentSlide % settings.items.length);
						if (settings.currentSlide < 1) settings.currentSlide = settings.items.length - (settings.currentSlide % settings.items.length);
						
						if (settings.switchTimeout) clearTimeout(settings.switchTimeout);
						if (opts.automove) settings.switchTimeout = setTimeout(function(){objMain.promoslide("next");}, opts.autotimer);
						
						if (settings.currentSlide != orgSlide){
							settings.selectors.removeClass("selected").slice(settings.currentSlide - 1, settings.currentSlide).addClass("selected");
							
							settings.items.stop(true, true).slice(settings.currentSlide - 1, settings.currentSlide).appendTo(settings.elmBody).fadeIn(duration, 
								function(){
									if (orgSlide > 0) settings.items.slice(orgSlide - 1, orgSlide).hide().prependTo(settings.elmBody);
								}
							);
						};
						
						break;
					case "next":
						objMain.promoslide("setSlide", settings.currentSlide + 1);
						break;
					case "previous":
						objMain.promoslide("setSlide", settings.currentSlide - 1);
						break;
					case "setAutomove":
						opts.automove = func_param;
						
						if (settings.switchTimeout) clearTimeout(settings.switchTimeout);
						if (opts.automove) settings.switchTimeout = setTimeout(function(){objMain.promoslide("next");}, opts.autotimer);
						
						break;
					case "_settings":
						settings = func_param;
						break;
					default:
						//do nothing.
						break;
				};
			}else{
				options = $.extend(defaults, options);
				var settings = {currentSlide: 0, items: 0, loader: null, elmBody: null, elmSelector: null, selectors: null, switchTimeout: null, selectorTimeout: null};
				var imagesLoaded = 0;
				
				settings.elmBody = objMain.find(".promoslide_innerbody");
				settings.items = settings.elmBody.children(".promoslide_slide").not(".promoslide_loader");
				settings.loaders = settings.elmBody.children(".promoslide_loader");
				settings.elmSelector = objMain.find(".promoslide_selectors");
				
				settings.hideSelectors = function(timer){
					clearTimeout(settings.selectorTimeout);
					settings.selectorTimeout = setTimeout(function(){
						settings.elmSelector.stop(true, true).fadeOut();
						if ($.browser.msie) objMain.find(".promoslide_button img").hide();
					}, timer);
				};
				settings.showSelectors = function(){
					clearTimeout(settings.selectorTimeout);
					settings.elmSelector.stop(true, true).fadeIn();
					if ($.browser.msie) objMain.find(".promoslide_button img").show();
				};
				
				settings.items.each(function(i){
					settings.elmSelector.append( $("<div></div>").addClass("promoslide_selector")
															.click(function(){
																objMain.promoslide("setSlide", i+1);
															}) );
				});
				settings.selectors = settings.elmSelector.children(".promoslide_selector");
				
				settings.items.find("img").load(function(){
					imagesLoaded += 1;
					
					if (imagesLoaded == settings.items.length){
						settings.loaders.remove();
					};
				});
				
				objMain.mouseenter(function(){
					settings.showSelectors();
				});
				objMain.mouseleave(function(){
					settings.hideSelectors(500);
				});
				settings.hideSelectors(100);
				
				if (options.nextButton){
					options.nextButton = $(options.nextButton);
					
					options.nextButton.data("_promoslide", objMain);
					
					options.nextButton.click(function(e){
						var objMain = $(this).data("_promoslide");
						var options = objMain.data("_promoslide_options");
						var settings = objMain.data("_promoslide_settings");
						objMain.promoslide("next");
					});
				};
				
				if (options.prevButton){
					options.prevButton = $(options.prevButton);
					
					options.prevButton.data("_promoslide", objMain);
					
					options.prevButton.click(function(e){
						var objMain = $(this).data("_promoslide");
						var options = objMain.data("_promoslide_options");
						var settings = objMain.data("_promoslide_settings");
						objMain.promoslide("previous");
					});
				};
				
				objMain.data("_promoslide_options", options);
				objMain.data("_promoslide_settings", settings);
				
				objMain.data("_promoslide_loaded", true);
				
				settings.items.hide();
				objMain.promoslide("slideJump", 1);
			};
		});
	};
})(jQuery);

$(function(){
	$("#promoslide").promoslide({nextButton: $("#promoslide_nextButton"), prevButton: $("#promoslide_prevButton")});
});
