(function($){
        $.fn.AnimatedSlideShow = function()
        {
        	$.fn.maxLoops=arguments[0];
            $.fn.imgId='';
            $.fn.divId='';
            $.fn.imageToFadeId='';
            $.fn.transitionOutTime=Math.min(3500,arguments[1]*0.8);
            $.fn.transitionInTime=Math.min(4000,arguments[1]*0.7);
            $.fn.transitionHoldTime=arguments[1]-$.fn.transitionOutTime;
            $.fn.animateTime=$.fn.transitionHoldTime;
            $.fn.trans=arguments[2];
            $.fn.lastTrans=arguments[2];
            $.fn.loadRequested=-1;
            $.fn.loaded=1;
            $.fn.loops=0;
            if(arguments[3].query!=undefined){
            	var type='json';
            	if(arguments[3].type!=undefined){
            		type=arguments[3].type;	
            	}
            	$.ajax({
            		  url: arguments[3].query,
            		  async: false,
            		  dataType: type,
            		  success: function(data){
            			  if(type=='json'){
            				  $.fn.slideConfig=data.slides;
            				  $.fn.count=data.slides.length;
            			  }else if(type=='xml'){
            				  $.fn.count=0;
            				  $.fn.slideConfig=new Object();
            				 $(data).find("slides").each(function()
            			     {
            					 $(this).find("slide").each(function()
                        		 {
            						 var slide=new Object();

            						 $(this).find("src").each(function(){slide.src=$(this).text();});
            						 $(this).find("title").each(function(){slide.title=$(this).text();});
            						 $(this).find("time").each(function(){slide.time=parseInt($(this).text());});
            						 $(this).find("end_pause").each(function(){slide.end_pause=parseInt($(this).text());});
                                     $(this).find("start_pause").each(function(){slide.start_pause=parseInt($(this).text());});
            						 $(this).find("trans").each(function(){slide.trans=$(this).text();});
            						
            						 $(this).find("start").each(function(){
            							 var start=new Object();
            							 start.width=parseInt($(this).attr("width"));
            							 start.height=parseInt($(this).attr("height"));
            							 start.top=parseInt($(this).attr("top"));
            							 start.left=parseInt($(this).attr("left"));
            							 slide.start=start;
            						 });
            						 $(this).find("end").each(function(){
            							 var end=new Object();
            							 end.width=parseInt($(this).attr("width"));
            							 end.height=parseInt($(this).attr("height"));
            							 end.top=parseInt($(this).attr("top"));
            							 end.left=parseInt($(this).attr("left"));
            							 slide.end=end;
            						 });
            						 $.fn.slideConfig[$.fn.count]=slide;
            						 $.fn.count++;
                        		 });
            						  
            			      });
            			  }
                          
            		  },
            	      complete: function(jqXHR, textStatus){
                       if(textStatus!='success'){
                           alert('Ajax slide show error: '+textStatus);
                       }
            	       }
            		});
            }else if(arguments[3].slides!=undefined){
            	$.fn.slideConfig=arguments[3].slides;
                $.fn.count=arguments[3].slides.length;
            }

            $.fn.loadImage=function(i){
               if(i<=$.fn.count && $.fn.slideConfig[i-1].src!=undefined){
            	  $.fn.loadRequested=i;
            	  var title="slide "+i+" of "+$.fn.count;
            	  if($.fn.slideConfig[i-1].title!=undefined){
            		  title=$.fn.slideConfig[i-1].title;
            	  }
                  var imgId='#'+$.fn.imgId+i;
                  var divId='#'+$.fn.divId;

                  var newImg=$('<img />')
                          .attr('id', $.fn.imgId+i)
                          .attr('style',"position:absolute;z-index:0;display:none;")
                          .attr('title',title)
                          .attr('alt',title);
                  $(divId).append(newImg);
                  $(imgId).load(function(){
                        $.fn.loaded=i;
                        })
                        .attr('src',$.fn.slideConfig[i-1].src);
                   //test loop to see loaded images
                  // $(divId).find("img").each(function(){
                   //        alert("id="+$(this).attr('id')+" src="+$(this).attr('src') );
                  // });

                }
            };



            $.fn.swapImage=function(i){
              var imgId='#'+$.fn.imgId+i;
              if($(imgId).attr('id')!=undefined && $.fn.loaded>=i ){

                $.fn.readSlideData(i);
                if($.fn.imageToFadeId!=''){
                   $.fn.doTransitionOut($.fn.imageToFadeId);
                }
                $.fn.imageToFadeId=imgId;
                $.fn.doTransitionIn(imgId,function(){
                	if($.fn.slideConfig[i-1].end!=undefined){
                	     $.fn.startSlide(i);
                	}
                	//choose next slide
                    i++;
                    if(i>$.fn.count){
                        i=1;
                        $.fn.loops++;
                    }

                    if($.fn.maxLoops==0 || $.fn.loops<$.fn.maxLoops){
	                    setTimeout("$.fn.swapImage("+i+")",$.fn.transitionHoldTime);
	                    if(i<=$.fn.count && i>$.fn.loaded && i!=$.fn.loadRequest){
	                        $.fn.loadImage(i);
	                    }
                    }
                });
              }else{
            	 //test in 1 second to see if loaded
                // alert("not loaded yet id="+ imgId);
                 setTimeout("$.fn.swapImage("+i+")",1000);
              }
             

            }

            $.fn.readSlideData=function(i){
                if($.fn.slideConfig[i-1].start!=undefined){
                	$('#'+$.fn.imgId+i).css($.fn.slideConfig[i-1].start);
                }

                if($.fn.slideConfig[i-1].time!=undefined){
                	 var slidePeriod=$.fn.slideConfig[i-1].time;
                	 $.fn.transitionOutTime=Math.min(3500,slidePeriod*0.8);
                     $.fn.transitionInTime=Math.min(4000,slidePeriod*0.7);
                     $.fn.transitionHoldTime=slidePeriod-$.fn.transitionOutTime;
                }
                if($.fn.slideConfig[i-1].trans!=undefined){
                     $.fn.lastTrans=$.fn.trans;
                     $.fn.trans=$.fn.slideConfig[i-1].trans;
                }
                $.fn.animateTime=$.fn.transitionHoldTime;

                	if($.fn.slideConfig[i-1].end!=undefined){
	                	if($.fn.slideConfig[i-1].end_pause!=undefined){
	                		$.fn.transitionHoldTime+=$.fn.slideConfig[i-1].end_pause;
                            $.fn.animateTime-=$.fn.slideConfig[i-1].end_pause;
	                	}
                        if($.fn.slideConfig[i-1].start_pause!=undefined){
	                		$.fn.transitionHoldTime+=$.fn.slideConfig[i-1].start_pause;
                            $.fn.animateTime-$.fn.slideConfig[i-1].start_pause;
	                	}
                    }

            };


            $.fn.doTransitionOut=function(id){
            	if($.fn.trans=='fade' ){
                  $(id).css("z-index","2")
            	       .fadeOut($.fn.transitionOutTime,function(id){
            	    	   $(id).css("z-index","0");
            	       });
            	}else{
            	  $(id).css("z-index","2")
            	       .delay($.fn.transitionOutTime)
            	       .fadeOut(0)
            	       .css("z-index","0");

            	}
            }
            
            $.fn.doTransitionIn=function(id,callBack){
            	if($.fn.trans=='fade'){
            	   $(id).css("z-index","1")
                   $(id).fadeIn($.fn.transitionInTime,callBack);
            	}else{
            		 $(id).css("z-index","1")
            		 $(id).fadeIn(0,callBack);
            	}
            }

            $.fn.startSlide=function(i){
               if($.fn.slideConfig[i-1].start_pause!=undefined){
                 setTimeout("$.fn.animateSlide("+i+")",$.fn.slideConfig[i-1].start_pause);
               }else{
                 $.fn.animateSlide(i);
               }
            };

            $.fn.animateSlide=function(i){
               	$('#'+$.fn.imgId+i).animate($.fn.slideConfig[i-1].end,$.fn.animateTime);
            };

            $.fn.startShow=function(id){
                $.fn.imgId=id+'_slide';
                $.fn.divId=id;
            	$.fn.loadImage(2);
                $.fn.readSlideData(1);
                $.fn.imageToFadeId='#'+$.fn.imgId+1;
                if($.fn.slideConfig[0].end!=undefined){
                      $.fn.startSlide(1);
                }
            	//set as first delay
            	setTimeout("$.fn.swapImage(2)",$.fn.transitionHoldTime);
            };
           
            return this.each(function()
            {
                $(this).startShow(this.id);
            });
        };
    })(jQuery);
	
