(function(jQuery) {
	jQuery.extend({
		jSlide: new function() {

			this.defaults = {
			};

			var slide_index = 0;
			var slide_fading = false;
			var slide_fadingtime = "slow";
			var mouseon = false;

			function addLoadEvent(func, container)
			{
				var oldonload = window.onload;
				if (typeof window.onload != 'function') {
					window.onload = func(container);
				} else {
					window.onload = function() {
						if (oldonload) {
							oldonload();
						}
						func(container);
					}
				}
			}

			function initSlide(container)
			{
				jQuery(container).removeClass("preload");

				jQuery(container).find(".element")
					.css("position", "absolute")
					.css("top", 0)
					.css("left", 0)
					.css("z-index", -1)
					.show()
					.fadeTo(0, 0);

				slide_fading = true;

				jQuery(container).find(".element:eq(" + slide_index + ")")
					.css("z-index", 1)
					.fadeTo(slide_fadingtime, 1, function(){
						slide_fading = false;
					});
			}

			function showSlide(ev)
			{
				var container = ev.data.container;
				var index = ev.data.index;
				slide_fading = true;

				var $newslide = jQuery(container).find(".element:eq(" + index + ")");
				var $oldslide = jQuery(container).find(".element:eq(" + slide_index + ")");

				slide_index = index;

				$oldslide.fadeTo(slide_fadingtime, 0, function(){
					$oldslide.css("z-index", -1);
					$newslide
						.css("z-index", 1)
						.fadeTo(slide_fadingtime, 1, function(){
						slide_fading = false;
					});
				});
			}

			function autoNext (next){
				if (mouseon) {
					jQuery(this).delay(700).queue(autoNext);
				} else {
					tmp = slide_index + 1;
					if (tmp == jQuery(this).find(".element").length)
						tmp = 1;

					showSlide({
						"data" : {
							"container" : this
							, "index" : tmp
						}
					});
					jQuery(this).delay(config.timer).queue(autoNext);
				}
				next();
			}

			function enterBtn(ev) {
				var container = ev.data.container;
				mouseon = true;
				jQuery(container).addClass("mouseon");
			}

			function leaveBtn(ev) {
				var container = ev.data.container;
				mouseon = false;
				jQuery(container).removeClass("mouseon");
			}

			/* public methods */
			this.construct = function(settings) {

				return this.each(function() {
					var container = this;

					container.jSlide = [];
					container.jSlide["config"] = {};

					config = $.extend(container.jSlide["config"], $.jSlide.defaults, settings);

					jQuery(container).bind("mouseenter", {"container" : container}, enterBtn);
					jQuery(container).bind("mouseleave", {"container" : container}, leaveBtn);

					jQuery(container)
						.addClass("preload")
						.css("position", "relative")
						.find(".element")
							.hide()
							.each(function(index) {
								var element = this;
								var element_index = index;
								jQuery(element).find(".btn")
									.each(function(index) {
										btn = this;
										if (btn.href.indexOf("#") != -1) {
											var target = btn.href.substring(btn.href.indexOf("#") + 1);

											target_index = jQuery(container).find(".element").index(jQuery("#" + target));
											jQuery(btn).bind("click", {"container" : container, "index" : target_index}, showSlide);
											btn.href = "javascript:;";
										}
									});
							});

					addLoadEvent(initSlide, container);
					return;
				}).delay(config.timer).queue(autoNext);
			};
		}
	});

	// extend plugin scope
	$.fn.extend({
		jSlide: $.jSlide.construct
	});

	var js = $.jSlide;
})(jQuery);

