(function( $ ) {
	var timer;
	
	var methods = {
		init : function() {
			return this.each(function() {
				
	     	  	var nextSlide;
	     	  	var lastSlide;
	     	  	var count = 0;
	     	  	var iam = jQuery(this).attr("id");
	     	  	
	     	  	jQuery(jQuery(this).children(".slide").get().reverse()).each(function(index, slideElement){
	     	  		if (methods.isVisible(jQuery(slideElement))){
	     	  			
	     	  			if (lastSlide == undefined) {
	     	  				lastSlide = slideElement;
	     	  			}
	     	  			
	     	  			if (nextSlide != undefined) {
	     	  				// The next slide of the visible slide is the previous slide.
	     	  				//alert("set next slide for " + slide.attr("id") + " to " + nextSlide.attr("id"));
	     	  				slideElement.nextSlide = nextSlide;
	     	  			}
	     	  			
	     	  			nextSlide = slideElement;
	     	  			count++;
	     	  		}
	     	  		else {
	     	  			jQuery(slideElement).remove();
	     	  		}
	     	  	});
	     	  	
	     	  	// Set last looped visible slide (first visible slide) as the next of the last :)
	  			//alert("set next of last slide for " + lastSlide.attr("id") + " to " + nextSlide.attr("id"));
	  			lastSlide.nextSlide = nextSlide;	     	  	
	  			
	     	  	if (count > 0) {
	     	  		
	     	  		var firstSlide = jQuery(this).children(".slide:first-child");
	     	  		
	     	  		methods.showSlide(firstSlide);
	     	  		
	     	  		if (count > 1) {
	     	  			var interval = parseInt(jQuery(this).attr("interval")) * 1000;
	     	  			timer = setInterval(function () { methods.showNextSlide(iam); }, interval);
	     	  		}
	     	  	}		 			
			});
		},
		showNextSlide : function( banners ) {
	    	var currentSlide = jQuery("#" + banners).children(".current").get(0);

		  	if (currentSlide == undefined) {
		  		clearInterval(timer);
		  		return;
		  	}
	    	
		  	var nextSlide = currentSlide.nextSlide;

		  	if (nextSlide == undefined) {
		  		clearInterval(timer);
		  		return;
		  	}
		  	
		  	
		  	methods.hideSlide(jQuery(currentSlide));
		  	methods.showSlide(jQuery(nextSlide));
		},
		showSlide : function( slide ) {
			
			slide.addClass("current");
			slide.show();
		},
		hideSlide : function( slide ) {
			
			slide.removeClass("current");
		  	slide.hide();
		},
		getDate : function( dateString ) {
			 
			try {
		  		if (dateString != undefined && dateString != null && dateString.length > 0) {
		  			var datePart = dateString.split(" ")[0];
		  			var timePart = dateString.split(" ")[1];
		  			
		  			var date = jQuery.datepicker.parseDate("d.m.yy", datePart);
		  			date.setHours(parseInt(timePart.split(":")[0]));
		  			date.setMinutes(parseInt(timePart.split(":")[1]));
		  			date.setSeconds(0);
		  			
		  			return date;
		  		}
		  	}
		  	catch (error) {
		  		alert(error);
		  	}
		},
		isVisible : function( slide ) {
			var starts = methods.getDate(slide.attr("visibilityStarts"));
			var ends = methods.getDate(slide.attr("visibilityEnds"));
		  	var now = new Date();
		  	
		  	if (starts == undefined && ends == undefined) {
		  		return true;
		  	}
		  	
		  	if (starts != undefined && ends == undefined) {
		  		return starts < now;
		  	}
		  	
		  	if (starts == undefined && ends != undefined) {
		  		return ends > now;
		  	}
		  	
		  	if (starts < now && ends > now) {
		  		return true;
		  	}
		  	
		  	return false;
		}
	};

	jQuery.fn.banners = function( method ) {

		if ( methods[method] ) {
			return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
		} else if ( typeof method === 'object' || ! method ) {
			return methods.init.apply( this, arguments );
		} else {
			jQuery.error( 'Method ' +  method + ' does not exist on jQuery.banners' );
		} 
	 
	};
})( jQuery );


