function Fader(panes, options){
	var settings = jQuery.extend({
			start: 0,
            auto_go: true,
			automate: true,
			'z-index': 4,
			loop: false,
			interval: false,
			handles: false,
            fade_in_duration: 200,
            fade_out_duration: 250,
			onFadeComplete: function(pane_in, pane_out){},
			onFadeStart: function(pane_in, pane_out){},
			onHandleClick: function(event, index){}
		}, options),
		pane_count = panes.length,
		zindex = settings['z-index'];

	var slider_obj = {
		current: 0,
		previous: 0,
		$timer: false,
		panes: [],
		
		goTo: function(index){
			if(index != this.current){
				this.stopInterval();
				
				if(settings.loop){
					index = index < 0 
						? pane_count - 1
						: index > pane_count - 1
							? 0
							: index; 
				}
				
				var self = this,
					pane_out = this.panes[this.current],
					pane_in = this.panes[index];
				
				settings.onFadeStart.apply(this, [index, this.current]);
				
				pane_in.css({
					'z-index': ++zindex,
                    display: 'block'
				}).animate(
                    {
                        opacity: 1
                    }, 
                    {
                        duration: settings.fade_in_duration,
                        queue: false
                    }
                );
				
				pane_out.animate({
                        opacity: 0
                    }, 
                    {
                        queue: false,
                        duration: settings.fade_out_duration, 
                        complete: function(){
                            pane_out.css({
                                'z-index': --zindex,
                                'display': 'none'
                            });
                            
                            settings.onFadeComplete.apply(self, [index, this.current]);
                            
                            if(settings.interval){
                                self.startInterval();
                            }
                        }
                    }
                );
				
				this.previous = this.current;
				this.current = index;
			}
			
			return this;
		},
		
		startInterval: function(){
			var self = this;

			this.$timer = setTimeout(function(){
				self.goTo(self.$next());
			}, settings.interval);
			
			return this;
		},
		 		
		stopInterval: function(){
			this.$timer = clearTimeout(this.$timer);
			
			return this;
		},
		
		$next: function(){
			return Math.max(0, Math.min(this.current + 1, pane_count));
		},
        
        nextLoop: function(){
            var index = this.$next();
            
            return index < 0 
                ? pane_count - 1
                : index > pane_count - 1
                    ? 0
                    : index; 
        },
		
		$prev: function(){
			return  Math.max(0, Math.min(this.current - 1, pane_count));
		},
        
        prevLoop: function(){
            var index = this.$prev();
            
            return index < 0 
                ? pane_count - 1
                : index > pane_count - 1
                    ? 0
                    : index; 
        },
		
		$placePane: function(index){
			
			
			return this;
		}
	};
	
	jQuery.each(panes, function(i, pane){
		var pane_ins = jQuery(pane);

		/** FIX THIS LOGIC**/
		if(i != settings.start){
			pane_ins.css({
				opacity: 0
			});
		}
		
		slider_obj.panes.push(pane_ins);
	});
	
	if(settings.handles){
		jQuery.each(settings.handles, function(i, handle){
			jQuery(handle).bind('click', function(e){
				settings.onHandleClick.apply(slider_obj, [e, i]);
				slider_obj.goTo.apply(slider_obj, [i]);
			});
		});
	}
	
	if(settings.automate){
		slider_obj.startInterval();
	}
    
	return settings.auto_go ? slider_obj.goTo(settings.start) : slider_obj;
}
