var fp = {
	
	index: 1,
	limit: 12,
	currentSearch: null,
	size: {
		height: $(window).height(),
		width: $(window).width()
	},
	footerVisible: true,
	headerVisible: true,
	
	init: function() {
		
		//Start retrieving some initial content there's no direct jump to a video 
		if(!window.location.hash) fp.retrieve('demo');

		//Initialize mouse and keyboard events
		fp.initEvents();
		
		//Initalize the pseudo coverflow effect and the prev/next links in the footer
		fp.initFooter();
	
		//Pause logic
		$('#movie-blur, #status-pause').click(function() {
			fp.player.toggle();
		});
	
		//Initialize the searchbox in the header
		fp.initSearch();
		
		//Initialize controls on top
		$('#header div.progress').slider({
			range: 'min',
			change: function(e, ui) {
				fp.player.element.seekTo((ui.value / 100) * fp.player.element.getDuration(), true);
			},
			start: function() {
				fp.player.draggingProgress = true;
			},
			stop: function() {
				fp.player.draggingProgress = false;
			}
		});
		
		//Recenter for the first time
		fp.recenter();
		
	},
	
	initEvents: function() {

		$(window).bind('resize', function() {
			fp.size.width = $(window).width();
			fp.size.height  = $(window).height();
			if(fp.player) fp.player.resize(fp.size.width, fp.size.height);
			fp.recenter();
		});
		
		$(document)
			.bind('mousemove', function(e) {
		
				if(fp.size.height - e.pageY < 80 && !fp.footerVisible) fp.showFooter();
				if(fp.size.height - e.pageY > 200 && fp.footerVisible && fp.player.playing) fp.hideFooter();
		
				if(e.pageY < 80 && !fp.headerVisible) fp.showHeader();
				if(e.pageY > 120 && fp.headerVisible && fp.player.playing) fp.hideHeader();
				
			})
			.bind('keydown', function(e) {
				
				if(fp.searchFocussed) {
					if(e.keyCode == 27) {
						fp.headerIsSticky = false;
						$('#header input')[0].blur();
						fp.hideHeader();
					}
					return true;
				}
				var inst = $('#coverflow').data('coverflow');

				switch(e.keyCode) {
					case 13:
						if(fp.footerVisible) {
							$('#coverflow > div').eq(inst.current).trigger('click');
						}
						break;
					case 32:
						fp.player.toggle() && e.preventDefault();
						break;
					case 37:
						if(e.metaKey) {
							fp.player.prev();
							e.preventDefault();
						} else {
							if(fp.footerVisible) {
								if(!$('#coverflow > div')[inst.current-1] && $('#footer div.prev').css('opacity') != '0') {
									$('#coverflow').coverflow('select', $('#coverflow > div').length-1);
									$('#footer div.prev').trigger('click');
								} else {
									$('#coverflow').coverflow('select', inst.current-1);
								}
							}
						}
						break;
					case 39:
						if(e.metaKey) {
							fp.player.next();
							e.preventDefault();
						} else {
							if(fp.footerVisible) {
								if(!$('#coverflow > div')[inst.current+1]) {
									$('#coverflow').coverflow('select', 0);
									$('#footer div.next').trigger('click');
								} else {
									$('#coverflow').coverflow('select', inst.current+1);
								}
							}
						}
						break;
					case 38:
						fp[(fp.headerVisible ? 'hide' : 'show') + 'Header']();
						e.preventDefault();
						break;
					case 40:
						fp[(fp.footerVisible ? 'hide' : 'show') + 'Footer']();
						e.preventDefault();
						break;
					case 83:
						fp.showHeader(1);
						$('#header input')[0].value = '';
						$('#header input')[0].focus();
						e.preventDefault();
						break;
				}
			});

	},
	
	initFooter: function() {

		// Initialize shelf coverflow
		$('#coverflow').coverflow({
			opacity: 10,
			opacityElement: 'div.shadow',
			center: false,
			trigger: 'mouseover',
			recenter: false,
			select: function(e, ui) {
				$('div.play', '#coverflow').stop().css('opacity', 0);
				$('div.play', ui.item).stop().animate({ opacity: 0.7 }, 1000);
			}
		});
		
		$('#coverflow > div').live('click', function() {
	
			var offset = $(this).offset();
			var meta = $(this).data('meta');
			fp.showHeader(1);
	
			$('#header p.title').html(meta.title);
			$('#header p.author').html('by '+meta.author);
	
			$(this).clone().attr('id', '').find('div').remove().end().appendTo('body')
				.css({ zIndex: 20, position: 'absolute', top: offset.top, left: offset.left, width: this.offsetWidth, height: this.offsetHeight, opacity: 0, webkitTransform: '', mozTransform: '' })
				.animate({ top: 10, left: 10, width: 72, height: 48, opacity: 1 }, function() {
					$('#header div.cover').replaceWith($(this).css({ position: 'static' }));
				});
				
			fp.player.load(this.id);
			
		});
		
		$('#footer div.next').bind('click', function() {
			fp.index = fp.index + fp.limit;
			$('#coverflow > div').animate({ left: '-='+fp.size.width+'px' }, function() {
				$('#coverflow').empty().css({ opacity: 0 }); //TODO: Prevent race condition if request is faster
			});
			fp.retrieve(fp.currentSearch, function() {
				$('#coverflow').css('left', fp.size.width).animate({ opacity: 1, left: 0 });
			});
		});
		
		$('#footer div.prev').bind('click', function() {
			if(fp.index-fp.limit < 1) return;
			fp.index = fp.index - fp.limit;
			$('#coverflow > div').animate({ left: '+='+fp.size.width+'px' }, function() {
				$('#coverflow').empty().css({ opacity: 0 }); //TODO: Prevent race condition if request is faster
			});
			fp.retrieve(fp.currentSearch, function() {
				$('#coverflow').css('left', -fp.size.width).animate({ opacity: 1, left: 0 });
			});
		});

	},
	
	initSearch: function() {

		$('#header form').bind('submit', function() {
			fp.index = 1;
			var clone = $('#coverflow').clone().attr('id', 'coverflow2').appendTo('#footer').css({ position: 'absolute', zIndex: 1 });
			$('#coverflow').css({ opacity: 0 });
			fp.retrieve($('#header input')[0].value, function() {
				$('#coverflow').animate({ opacity: 1 }, 1000, function() { clone.remove(); });
			});
			$('#header input')[0].blur();
			return false;
		});
		
		$('#header input').bind('focus', function() {
			fp.searchFocussed = true;
		}).bind('blur', function() {
			fp.searchFocussed = false;
		});

	},
	
	recenter: function() {	
		
		//This logic is kind of ugly and needs to be refactored
		if(!($.browser.mozilla && (parseFloat($.browser.version) <= 1.9)) && !$.browser.opera) {
			var width = ( ($('#coverflow > div:visible').length * 60) + (100) );
			$('#coverflow').css('margin-left', ((fp.size.width - width) / 2));	
		} else {
			var width = ( ($('#coverflow > div:visible').length * 60) + (60*4) );
			$('#coverflow').css('margin-left', ((fp.size.width - width) / 2) + 40);	
		}
		
	},
	
	showHeader: function(sticky) {
		fp.headerVisible = true;
		if(fp.headerIsSticky) clearTimeout(fp.headerIsSticky);
		$('#header').animate({ top: 0 });
		fp.player.blur();
		
		if(sticky) fp.headerIsSticky = 1;
		return true;
	},
	
	hideHeader: function() {
		if(fp.headerIsSticky) return;
		fp.headerVisible = false;
		$('#header').animate({ top: -70 });
		fp.player.focus();
		return true;
	},
	
	showFooter: function() {
		fp.footerVisible = true;
		$('#footer').animate({ bottom: 20 });
		fp.player.blur();
		return true;
	},
	
	hideFooter: function() {
		fp.footerVisible = false;
		$('#footer').animate({ bottom: -200 });
		fp.player.focus();
		return true;
	},
	
	prepareFeed: function(data) {

		data = data.feed.entry;
		$('#coverflow > div').stop();
		$('#coverflow').empty();
		$.each(data, function() {
			$('<div class="cover" id="'+this.media$group.yt$videoid.$t+'"><div class="shadow"></div><div class="play"><p>'+this.media$group.media$title.$t+'</p></div><img src="'+this.media$group.media$thumbnail[this.media$group.media$thumbnail.length-1].url+'"></div>')
				.data('meta', {
					title: this.media$group.media$title.$t,
					author: this.media$group.media$credit[0].$t
				})
				.appendTo('#coverflow');
		});
		
		$('#coverflow').coverflow('refresh');	
		fp.showFooter();
		fp.recenter();
		
		if(fp.index-fp.limit < 1) {
			$('#footer div.prev').animate({ opacity: 0 });
		} else {
			if($('#footer div.prev').css('opacity') == '0') $('#footer div.prev').animate({ opacity: 0.5 });
		}
		
		if(fp._callback) {
			fp._callback();
			fp._callback = null;
		}

	},
	retrieve: function(s, callback) {
		fp.currentSearch = s;
		fp._callback = callback;
		$.getScript('http://gdata.youtube.com/feeds/api/videos?q='+encodeURI(s)+'&start-index='+fp.index+'&max-results='+fp.limit+'&v=2&format=5&alt=json-in-script&callback=fp.prepareFeed');
	}
		
};


$(document).ready(function() {
	fp.init();
});

