;(function($) {

    var timer = 0;
    var timerOn = 0;

    $.fn.sfSlideShow = function(options) {
        var opts = $.extend({}, $.fn.sfSlideShow.defaults, options);
        return this.each(function() {
            init($(this),opts);
        });
    };
    
    $.fn.sfSlideShow.defaults = {
        speed: 2000,
        width: 556,
        height: 280,
        controlPanel: 0,
        fadeDuration: 400,
        playstop: 0
    };
    
    function init($obj,opts) {
        var delay = opts.speed;
        $obj.addClass('sfSlideShow')
            .css('width',opts.width+'px')
            .css('height',opts.height+'px');
        var len = $obj.find('li').length;
        var z = len;
        $obj.find('li').each(function() {
            $(this).css('z-index',z);
            if(z != len) {
                //$(this).hide();
            }
            z--;
        });

        
        // add buttons to it
        if(opts.controlPanel) {
            var cp = $('<div/>')
                        .addClass('controlPanel')
                        .css('z-index',parseInt($obj.find('li').length)+2);
                    
            // add button for every image
            $obj.find('li').each(function(i,v) {
                var dname = 'slide'+i;
                $(this).attr('name',dname);
                var div = $('<div/>')
                            .addClass('slideButton')
                            .text(i+1)
                            .click(function() {
                                 mStack($obj,dname);
                                 $("div.slideButton").removeClass('selected');
                                 $(this).addClass('selected');
                            })
                            .mouseenter(function() {
                                $(this).css('cursor','pointer')
                                       .addClass('over');
                            })
                            .mouseleave(function() {
                                $(this).removeClass('over');
                            });
                cp.append(div);
            });
            
            $obj.append(cp);
            
            // select first button
            $("div.slideButton:first").addClass('selected');
        }
        
        if(opts.playstop) {
            $("<div/>",{'class':'playstop'})
                .css('z-index',parseInt($obj.find('li').length)+2)
                .append($('<div/>',{'class':'rwd'}).text('R'))
                .append($('<div/>',{'class':'play','style':'display:none'}).text('P'))
                .append($('<div/>',{'class':'pause'}).text('II'))
                .append($('<div/>',{'class':'fwd'}).text('F'))
                .appendTo($obj);
                
                
                
            $('.pause',$obj).click(function() {
                timerOn = 0;
                clearTimeout(timer);
                $('.play',$obj).show();
                $(this).hide();
            });
            
            $('.play',$obj).click(function() {
                timerOn = 1;
                restack($obj,opts);
                $(this).hide();
                $('.pause').show();
            });
            
            $('.fwd',$obj).click(function() {
                $('.pause').hide();
                $('.play').show();
                timerOn = 0;
                clearTimeout(timer);
                switchSlide($obj,opts);
            });
            
            $('.rwd',$obj).click(function() {
                $('.pause').hide();
                $('.play').show();
                timerOn = 0;
                clearTimeout(timer);
                switchSlide($obj,opts,-1);
            });
            
        }        
        
        
        
        // start slideshow
        timerOn = 1;
        restack($obj,opts);
        
    }

    function restack($obj,opts) {
        if(timerOn) {
            timer = setTimeout(function() {
                switchSlide($obj,opts);
            },opts.speed);
        }
    }


    function switchSlide($obj,opts,step) {
    
        if(!step) {
            step = 1;
        }
        
        var len = $obj.find('li').length;
        var first = 1;
        if(step > 0) {
        
            $obj.find('li').each(function(i,v) {
                if($(this).css('z-index') == len) {
                    $(this).fadeOut(opts.fadeDuration,function() {
					    $obj.find('li').each(function(i,v) {
						    if($(this).css('z-index') == len) {
							    $(this).css('z-index',first);
						    } else {
							    $(this).css('z-index',parseInt($(this).css('z-index'))+step);
						    }
						    $(this).css('display','list-item');
					    });	
				    });
				    return false;
                }
            });
            
        } else {
            
            $obj.find('li').each(function(i,v) {
                if($(this).css('z-index') == 1) {
                    $(this).hide().css('z-index',len+1).fadeIn(opts.fadeDuration,function() {
					    $obj.find('li').each(function(i,v) {
					        if($(this).css('z-index') > len) {
					            $(this).css('z-index',len);
						    } else {
							    $(this).css('z-index',parseInt($(this).css('z-index'))+step);
						    }
						    $(this).css('display','list-item');
					    });	
				    });
				    return false;
                }
            });
            
        }            
            
        if(timerOn) {
            restack($obj,opts);
        }
    }



    function mStack($obj,t) {
        if(timerOn) {
            clearTimeout(timer);
            timerOn = 0;
        }
        var len = $obj.find('li').length;
        $obj.find('li').each(function() {
            if(t == $(this).attr('name')) {
                $(this).fadeIn(opts.fadeDuration);
            } else if($(this).css('display') == 'list-item') {
                $(this).fadeOut(opts.fadeDuration);
            }
        });
    }

})(jQuery);

