(function($) {
	//
	// plugin definition
	//
	$.fn.zoomslide = function(options) {
		
		var opts = $.extend({}, $.fn.zoomslide.defaults, options);
		
		var images = [], imagesToLoad = [], rows, fullscreen = false;

		this.each(function() {
			
		
			var $this=$(this), $li = undefined, $liimg, $litext, loaded = 0;;
			$this.css({width:opts.width,height:opts.height});
			var containerWidth = $this.width(), containerHeight=$this.height();
			
			
			
			
			function loadImages(){
				for(var i=0;i<imagesToLoad.length;i++){
					$this.append("<img src='"+opts.folder+imagesToLoad[i]+"' class='zoomslide-img'>")
						.find("img:last")
						.data("pos",i)
						.css("z-index",i+1)
						.hide();
					}
				
				rows = Math.floor(Math.sqrt(imagesToLoad.length-1))+1;
				
				$this.find("img.zoomslide-img")
					.click(function(e){
							bringToTop($(this));
							if(fullscreen){
								resizeToOverview();
								fullscreen = false;
							}else{
								resizeToFullscreen($(this).data("pos"));
								fullscreen = true;
							}
							e.stopPropagation();
							e.preventDefault();
						})
					.each(function(){
							if(this.complete || (jQuery.browser.msie && parseInt(jQuery.browser.version) == 6)){
								$(this).trigger("load");}
						})
					.load(function(){
							var $self = $(this);
							images[parseInt($self.data("pos"))] = {
								object: $self,
								origW: $self.width(),
								origH: $self.height(),
								width: $self.width(),
								height:$self.height()};
							
							loaded++;
							
							if($li!=undefined){
								$litext.html(loaded+" von "+imagesToLoad.length+" Bildern geladen");
							}
							
							if (loaded == imagesToLoad.length){
								$li.hide();
								$this.find("img").fadeIn("slow");
								resizeToOverview(false);
							}
						});
			}
			

			
			function bringToTop($img){
				var imgz = $img.css("zIndex");
				for (var i=0;i<images.length;i++){
					var $activeimg = images[i].object, activez = $activeimg.css("zIndex");
					if (parseInt(activez)>parseInt(imgz)){
						$activeimg.css("zIndex",activez-1);
					}
				}
				$img.css("zIndex",images.length);
			}
			
			function resizeToOverview(animate){
				if (animate==undefined){
					animate=true;
				}
				var iw = containerWidth/rows, ih = containerHeight/rows, ai = 0;
								
				for (var r=0; r<rows; r++){
					for (var c=0; c<rows; c++){
						if (ai<images.length){
							var img = images[ai],
								$img = img.object;
							
							var params = fitImgIntoRect(img,{top:r*(ih+opts.spacing/2), left:c*(iw+opts.spacing/2), width:iw-opts.spacing, height:ih-opts.spacing});
														
							//$img.animate({},opts.animTime);
							
							if (animate){
								$img.animate(params,opts.animTime);
							} else{
								$img.css(params);
							}
							
							/*
							$img.animate(fitImgIntoRect(img,{top:r*(ih+opts.spacing/2), left:c*(iw+opts.spacing/2), width:iw-opts.spacing, height:ih-opts.spacing}),opts.animTime);	*/
							ai++;
						}
					}
				}
			}
			
			function resizeToFullscreen(index){
				var targetRect = fitImgIntoRect(images[index]);
				
				for (var i=0; i<images.length; i++){
					var img = images[i], $img = img.object;
					
					var params = fitImgIntoRect(img,targetRect);
										
					$img.stop().animate(params,opts.animTime);
					

				}
			}
			
			function fitImgIntoRect(img,rect){
				rect = rect || {width:containerWidth, height:containerHeight, top:0, left:0};
				return centerImgInRect(resizeImgIntoRect(img,rect),rect);
			}
			
			function resizeImgIntoRect (obj,rect){
				rect = rect || {top:0,left:0,width:containerWidth,height:containerHeight};
				var rw=rect.width, rh=rect.height, rrat = rw/rh, iw=obj.origW, ih=obj.origH, irat = iw/ih;
								
				if (rrat<=irat){
					obj.width	= rw;
					obj.height = Math.floor(rw/(iw/ih)+0.5);
				} else {
					obj.height = rh;
					obj.width = Math.floor(rh/(ih/iw)+0.5);	
				}
				
				return obj;
			}
			
			function centerImgInRect(obj,rect){
				rect = rect || {top:0,left:0,width:containerWidth,height:containerHeight};
				obj.top =  Math.floor((rect.height-obj.height)/2+0.5)+rect.top;
				obj.left = Math.floor((rect.width-obj.width)/2+0.5)+rect.left;
				
				return obj;
			}
			
			
			if (opts.loadingindicator!=""){
				$li = $this.append("<div class='zoomslide-li'><center></center></div>").find(".zoomslide-li center");
				$liimg = $li.append("<img src='"+opts.loadingindicator+"' class='zoomslide-li-img'>").find("img:last");
				$litext = $li.append("<div class='zoomslide-text'></div>").find(".zoomslide-text");
				
				$li.css({paddingTop:(containerHeight-50)/2+"px"});
			}
			
			if (typeof(opts.images)=="array" && opts.images.length>0){
				imagesToLoad = opts.images;
				loadImages();
			} else if (opts.ajaxURL!=""){
				$.post(opts.ajaxURL,opts.ajaxPost, function(r){
					var $res = $(r);
					$res.find("img").each(function(i){
						imagesToLoad.push($(this).attr("src"));
						
					});

					loadImages();
				});
			}
			
		});

		return this;
	};

	//
	// plugin defaults
	//
	$.fn.zoomslide.defaults = {
		images:[],
		ajaxURL:"",
		ajaxPost: {},
		folder:"",
		spacing:5,
		animTime:"slow",
		loadingindicator:"",
		width: 400,
		height: 300
	};
	
})(jQuery);
