YUI.add('slideshow', function (Y) {
	Y.Slideshow = {
	    set: function (connector, container, cap, path, slides, options) {
		var run = -1,
		    is_showing = options.showing || false,
		    first_slide = options.active_slide || 0,
		    waiting = true,
		    active_slide = '',
		    in_buffer = '',
		    asset,
		    buffer = Y.SlideshowBuffer,
		    display = Y.SlideshowDisplay,
		    nextcap = '';
		    
		    buffer.set(path, connector);
		    connector.addConnection(buffer, ['buffer_ready'], this);
		    
		    display.set(container, connector);
		    connector.addConnection(display, ['faded-in','faded-out'], this);
		    
		   
		    
		    this.addAsset = function (file, slide) {
			    asset = file;
			    in_buffer = slide.src;
			    nextcap = slide.tit;
			    if(waiting === true) {
				waiting = false;
				display.addAsset(file);
				display.fadeIn();
				active_slide = slide.src;
			    }
		    };
		    
		    this.checkBuffer = function () {
			    if(in_buffer !== '') {
				    display.addAsset(asset);
				    display.fadeIn();
			    } else {
				    waiting = true;
			    }
		    }
		    
		    this.getActiveSlide = function (){
			var i;
			for(var i=0; i < slides.length; i++){
				if(active_slide === slides[i].src){
					return i;
				}
			}
			return 0;
		    };
		    
		    this.loadNext = function(p) {
			    p = ((p < slides.length- 1) ? p + 1 : 0);
			    buffer._addToStack(slides[p]);
		    }
		    
		    this.jump = function(n){
			clearInterval(this.run);
			this.run = -1;
			if(in_buffer !== slides[n].src){
				in_buffer = '';
				buffer._addToStack(slides[n]);
			}
			display.fadeOut();
		    }
		    
		    this.setCap = function () {
			cap.set('text', nextcap);
			
		    }
		    
		     this.loadNext(slides.length);
	    },
	    
	    receive: function (e, argv) {
		    var p;
		    switch (e) {
			case 'buffer_ready':
				this.addAsset(argv.file, argv.slide);
				break;
			case 'faded-in':
				this.setCap();
				this.loadNext(this.getActiveSlide());
				break;
			case 'faded-out':
				this.checkBuffer();
				break;
			case 'jump':
				this.jump(argv.p);
			break;
		    }
		
	    }
	}
});


YUI.add('slideshow-buffer', function (Y) {
    Y.SlideshowBuffer = {
	set: function (path, connector) {
	    var stack = [];
	    
	     
	    this._addToStack = function (file) {
		    stack.push(file);
		    if(stack.length === 1){
			    this._loadAsset();
		    }
	    };
	    
	    this._loadAsset = function () {
		var asset;
		asset = stack[0];
		img = new Image();
		img.src = path + asset.src;
		img.width = asset.w;
		img.height = asset.h;
		img.pr = this;
		img.onload = function() {
			this.pr._onload(this);
		};
	    };
	    
	    
	    
	    this._onload = function (file) {
		var asset;
		asset = stack.splice(0,1).pop();
		if (stack.length) {
		    if(stack.length > 1){
			    stack=[stack.pop()];
		    }
		    this._loadAsset();
		} else {
		    connector.notifyConnections('buffer_ready', this, {file: file, slide: asset});
		}
	    };
	    
	    
	
	}
    }
});

YUI.add('slideshow-display', function (Y) {
    Y.SlideshowDisplay = {
	set: function (container, connector) {
		var display = container.create("<div class='display absolute'></div>"),
		    state = '',
		    that = this,
		    fade;
		
		container.append(display);
		display.setStyle('opacity',0);
	    
		fade = new Y.Anim({
			node: display,
			from: {
			    opacity: 0
			},
			to: {
			    opacity: 1
			},
			duration: 0.01
		});
		
		
		
		fade.on('end', function(){
			if(state === 'fading-in') {
				state = 'faded-in';
				connector.notifyConnections(state, that, {});
			} else {
				state = 'faded-out';
				connector.notifyConnections(state, that, {});
			}
		})
			    		
		this.fadeIn = function () {
		    fade.set('reverse',false);
		    fade.run();
		    state = 'fading-in';
		};
		
		this.fadeOut = function () {
		    fade.set('reverse',true);
		    fade.run();
		    state = 'fading-out';
		}
		
		this.addAsset = function (asset) {
		    display.all('*').remove();
		    display.append(asset);
		}
	}
	
    }
});

YUI.add('slideshow-navigator', function (Y) {
	Y.SlideshowNavigator = {
		set: function (connector, slideshow, container, p, max) {
		    var nav =  container.create(
			    "<div class='slideshow-nav l'>" +
				    "<a class='prev l' href='#prev'>" +
					" < " +
				    "</a>" +
				    "<a class='next l' href='#next'>" +
					" > " +
				    "</a>" +
			    "</div>"),
			buttons;
		    container.ancestor().insert(nav, 2);
		    
		    connector.addConnection(this, ['jump'], slideshow);
		    
		    buttons = nav.all('a');
		    buttons.each(function (but, n) {
			but.pr = this;
			but.n = n;
			but.on('click',function(e){
				e.preventDefault();
				this.pr.notify(n)	
			})
		    }, this);
		    
		    this.notify = function (n) {
			    if(n === 0) {
				    p = ((p > 0) ? p - 1 : max - 1);
			    } else {
				    p = ((p < max -1) ? p + 1 : 0);
			    }
			    connector.notifyConnections('jump',this,{p: p});
		    }
		    
		}
	}
});
