(function($){
    $.extend({
        slider: {
            hidespeed: 400,
            showspeed: 400,
            transitiontype: '',            
            autoscrolling: false,
            autoscrollingdelay: 3000,
            stopautoscrollonelement: '',
            thumbs: true,
            thumbsarrows: true,
            thumbsarrowsprevtxt: '',
            thumbsarrowsnexttxt: '',
            transitionhide: 'fade', 
            transitionshow: 'fade',
            preloadpics: false,
            autoheight: false,
            autoheightstart: 0        
        }
    });
    $.fn.extend({
        slider: function(o){
        

            $.fn.image = function(src, f){
               return this.each(function(){
                   var i = new Image();
                   i.onload = f;
                   i.src = src;
                   i.align = 'left';           
                   this.appendChild(i);
               });
            };
                 
            return this.each(function(){
        				o = o || {};
        				var opt = {};
        				$.each($.slider, function(k,v){
        					 opt[k] = (typeof o[k]!='undefined' ? o[k] : v);
        				});
                  
                var $wrapper=$(this),
                    $slider=$(this).find('.slides'),
                    $slides=$slider.children('li'),    
                    $slidescount=$slides.length;
                    $slidescountreal=$slides.length;
                if (opt.thumbs) {
                    var $thumbslist=$(this).find('.thumbs'),
                        $thumbs=$thumbslist.find('li');
                }                

                //$slider.children('li:gt(0)').css({'display' : 'block', 'opacity' : 0.00});
                //$slider.children('li:eq(0)').css({'z-index' : '10'});                                                
                if (opt.preloadpics) var picspreloaded=true;
                
                function switchto(slidenum) {
                    $slider.children('li:not(eq('+slidenum+'))').css({'z-index' : '1'});                      
                    $slider.children('li:eq('+slidenum+')').css({'z-index' : '10'});
                    $slider.children('li').css({'display' : 'block'});
                    var $slideactive=$('.active',$slider);
                    var $slidenext=$slides.eq(slidenum); 
                    if (opt.thumbs) {
                        var $thumbactive=$('.active',$thumbslist);
                        var $thumbnext=$thumbs.eq(slidenum);
                    }                                                                                      

                    $.fn.hideslide = function(transitionhide, speed, callback) {
                        if (opt.autoheight) {                            
                            $slider.parents('.tabs').animate({'height' : opt.autoheightstart+'px'}, speed);
                        }   
                        if (transitionhide=='fade') $(this).animate({'opacity' : 0.00}, speed, callback);
                        if (transitionhide=='slidedown' || transitionhide=='slideside' || transitionhide=='slidesideloop') {
                            callback();  
                        }
                    }
                    
                    $.fn.showslide = function(transitionshow, speed, callback) { 
                        if (transitionshow=='fade') $(this).animate({'opacity' : 1.00}, speed, callback);
                        if (transitionshow=='slidedown') {
                            var slideheight=$(this).css('height').replace('px','')*1+$(this).css('padding-top').replace('px','')*1+$(this).css('padding-bottom').replace('px','')*1;
                            $(this).css({'display' : 'block', 'opacity': 1.00});
                            $slider.animate({'top' : '-'+slideheight*$(this).index()+'px'}, speed, callback);  
                        }
                        if (transitionshow=='slideside') {                            
                            var slidewidth=$(this).css('width').replace('px','')*1+$(this).css('padding-left').replace('px','')*1+$(this).css('padding-right').replace('px','')*1;
                            $(this).css({'display' : 'block', 'opacity': 1.00});
                            $slider.animate({'left' : '-'+slidewidth*$(this).index()+'px'}, speed, callback);  
                        }
                        if (transitionshow=='slidesideloop') {                            
                            var slidewidth=$(this).css('width').replace('px','')*1+$(this).css('padding-left').replace('px','')*1+$(this).css('padding-right').replace('px','')*1;
                            $(this).css({'display' : 'block', 'opacity': 1.00});
                            $slider.animate({'left' : '-'+slidewidth*$(this).index()+'px'}, speed, callback);  
                        }
                        if (opt.autoheight) {                            
                            $slider.parents('.tabs').animate({'height' : $(this).css('height').replace('px','')*1+opt.autoheightstart+'px'}, speed);
                        }                                                   
                    }                     

                    function dohideshow() {
                        $slideactive.stop().hideslide(opt.transitionhide, opt.hidespeed, function() {                    
                            $('.active',$wrapper).removeClass('active');
                            $slidenext.addClass('active');
                            if (opt.thumbs) $thumbnext.addClass('active');                        
                            $slideactive=$slidenext;
                            $thumbactive=$thumbnext;
                            $slideactive.showslide(opt.transitionshow, opt.showspeed, function() {
    
                            })                            
                        })                     
                    }  
                    
                    if (opt.preloadpics && $slidenext.find('.pic-box img').length==0) {
                        picspreloaded=false;
                        $slidenext.find('.pic-box').image($slidenext.find('.pic-box').attr('rel'),function(){
                            picspreloaded=true;                            
                            dohideshow();
                        });
                    } else {
                        dohideshow();
                    }
                    //$slider.find('li:not(eq('+slidenum+'))').css({'display' : 'none', 'opacity': 0.00}); 
                }
                
                function switchnext() {
                	//console.log($slides.filter(':lt(9)').size());  
                    $slideactive=$('.active',$slider);
                    if ($slideactive.index()+3==$slidescount) {
                    	$slides.clone().appendTo($slider);
	                    $slider=$slider.parent().find('.slides'),
	                    $slides=$slider.children('li'), 
                    	$slidescount=$slides.length;
                    }
                    /*
                    if ($slideactive.index()+1==$slidescount) {
                    	var slidenext=0;
                    }
                   */
                    if ($slideactive.index()==$slidescountreal) {
                    	$slider.css({'left' : '0px'});
                    	$slides.filter(':lt('+$slidescountreal+')').remove();
	                    $slider=$slider.parent().find('.slides'),
	                    $slides=$slider.children('li'), 
                    	$slidescount=$slides.length;
                    	var slidenext=1;
                    }

                    else var slidenext=$slideactive.next().index();
                    switchto(slidenext);      
                }
                
                function switchprev() {
                    var $slideactive = $('.active',$slider);                                                              
                    if ($slideactive.index()==0) var slideprev=$slidescount-1;
                    else var slideprev=$slideactive.prev().index();
                    switchto(slideprev);                    
                }
                
                if (opt.thumbsarrows) {
                    var arrows = $(document.createElement('div'));
                    arrows.addClass('arrows');
                    $wrapper.append(arrows);
                                  
                    var prevlink = $(document.createElement('a'));
                    prevlink.attr('href', '#').addClass('prev-arrow').html(opt.thumbsarrowsprevtxt);                    
                    arrows.append(prevlink);
                    
                    var nextlink = $(document.createElement('a'));
                    nextlink.attr('href', '#').addClass('next-arrow').html(opt.thumbsarrowsnexttxt);                    
                    arrows.append(nextlink);

                    prevlink.click(function() {
                        switchprev();                                                   
                        return false;
                    });
                    
                    nextlink.click(function() {
                        switchnext();                                                   
                        return false;
                    });
                }                                      
                
                if (opt.thumbs) {
                    $thumbs.children('a').click(function() {
                        if ($(this).parent().attr('class')!='active') switchto($(this).parent().index());                                                   
                        return false;
                    });
                }    
                
                
                
                
                if (opt.autoscrolling==true) var scrolling=true;
                else var scrolling=false;
                if ($slidescount<=1) opt.autoscrolling=false;
                if (opt.stopautoscrollonelement!='') var $stopelem=$(opt.stopautoscrollonelement, this);
                else var $stopelem=$(this); 
                
                $stopelem.mouseover(function () {
                    opt.autoscrolling = false;
                }).mouseout(function () {
                    if ($slidescount>1 && scrolling)
                        opt.autoscrolling = true;
                });  
                
                if(scrolling) {                                            
                    setInterval(function () {                        
                        if (opt.autoscrolling) {
                            if (!opt.preloadpics || opt.preloadpics && picspreloaded)                                                                       
                            switchnext();
                        }                                                                
                    }, opt.autoscrollingdelay);
                }                
                                                                      
            });
        }
    });
})(jQuery);
