YUI.add('slideshow', function (Y) {
	Y.Slideshow = function (connector, container, cap, path, myslides, options) {
		var run = -1,
		    is_showing = options.showing || false,
		    first_slide = options.active_slide || 0,
		    waiting = true,
		    active_slide = '',
		    in_buffer = '',
		    asset,
		    buffer = new Y.SlideshowBuffer(path, connector),
		    display = new Y.SlideshowDisplay(container, connector),
		    nextcap = ''
		    that = this;
		    
		    connector.addConnection(buffer, ['buffer_ready'], this);
		    
		    
		    connector.addConnection(display, ['faded-in','faded-out'], this);
		    
		    
		    var addVid = function (vid) {
			if(vid.com === 'youtube') {
				return container.create("<object width='480' height='385'>"+
							"<param name='movie' value='http://www.youtube.com/v/"+vid.src+"&amp;hl=nl_NL&amp;fs=1'></param>"+
							"<param name='allowFullScreen' value='true'></param>"+
							"<param name='allowscriptaccess' value='always'></param>"+
							"<embed src='http://www.youtube.com/v/"+vid.src+"&amp;hl=nl_NL&amp;fs=1'"+
							       "type='application/x-shockwave-flash'"+
							       "allowscriptaccess='always'"+
							       "allowfullscreen='true'"+
							       "width='480'"+
							       "height='385'>"+
							"</embed>"+
						    "</object>");
					
					
			} else if (vid.com === 'vimeo') {
				return  container.create("<object width='400' height='267'>"+
								"<param name='allowfullscreen' value='true'/>"+
								"<param name='allowscriptaccess' value='always' />"+
								"<param name='movie' value='http://vimeo.com/moogaloop.swf?clip_id="+vid.src+"&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1' />"+
								"<embed  src='http://vimeo.com/moogaloop.swf?clip_id="+vid.src+"&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1'"+
									"type='application/x-shockwave-flash'"+
									"allowfullscreen='true'"+
									"allowscriptaccess='always'"+
									"width='400'"+
									"height='267'>"+
								"</embed>"+
							    "</object>");
				
			}
		    }
		    
		    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);
				    active_slide = in_buffer;
				    display.fadeIn();
			    } else {
				    waiting = true;
			    }
		    }
		    
		    this.getActiveSlide = function (){
			var i;
			for(var i=0; i < myslides.length; i++){
				if(active_slide === myslides[i].src){
					return i;
				}
			}
			return 0;
		    };
		    
		    this.loadNext = function(p) {
			var player;
			    p = ((p < myslides.length- 1) ? p + 1 : 0);
			    if(myslides[p].typ === 'img') {
				 buffer._addToStack(myslides[p]);
			    } else {
				this.addAsset(addVid(myslides[p]), {src: myslides[p].src});
			    }
			   
		    }
		    
		    this.jump = function(n){
			clearInterval(this.run);
			this.run = -1;
			if(in_buffer !== myslides[n].src){
				in_buffer = '';
				
				if(myslides[n].typ === 'img') {
					buffer._addToStack(myslides[n]);
				} else {
					this.addAsset(addVid(myslides[n]), {src: myslides[n].src});
				}
				
			}
			display.fadeOut();
		    }
		    
		    this.setCap = function () {
			cap.set('text', (this.getActiveSlide() + 1)+'/'+myslides.length);
			
		    }
		    
		this.loadNext(myslides.length);
	}
	    
	Y.Slideshow.prototype.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 = function(path, connector) {
	    var stack = [];
	    
	     
	    this._addToStack = function (file) {
		    stack.push(file);
		    if(stack.length === 1){
			    this._loadAsset();
		    }
	    };
	    
	    this._loadAsset = function () {
		var asset
		, that = this;
		asset = stack[0];
		img = new Image();
		
		img.onload = function() {
			that._onload(this);
		};
		img.src = path + asset.src;
		img.width = asset.w;
		img.height = asset.h;
	    };
	    
	    
	    
	    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 = 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 = function (connector, slideshow, container, p, max) {
		var that = this;
		connector.addConnection(this, ['jump'], slideshow);
		
		buttons = container.all('.arrows span');
		buttons.each(function (but, n) {
		    but.pr = this;
		    but.n = n;
		    but.on('click',function(e){
			    e.preventDefault();
			    this.pr.notify(n)	
		    })
		}, this);
		
		Y.on('click',function(e){
			if(e.currentTarget.one('img') !== null) {
				that.notify(1);
			}
		},container.previous('.slideshow'));
		
		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});
		}
		
	}
});
