gv.website = {
	emailRegex : /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+[a-zA-Z0-9]{2,4}$/,
	displayedMessage : 0,
	pauseRotatingMessages : false,
	loginTargetLightbox : undefined,
	fancyboxOpts : {
		overlayOpacity: 0.6,
		overlayColor: '#333',
		centerOnScroll: true,
		onStart: function() { 
		},
		onClosed: function() {
			if (window.location.hash.length > 0)
				window.location.hash = '';
			$('.active-lightbox').remove();
		}
	},
	messages : [
		{
			id: '0',
			vinename: 'Super Bowl XLIV',
			username: 'dilbert',
			postdetails: 'spoke for 16 sec.',
			url: 'http://grapevinetalk.com/media-files/super-bowl-xliv/raghav__c6f8a4e0-9cd9-4dc2-832f-5301c7773bee.flv'
		},
		{
			id: '1',
			vinename: 'InTune: High Above the Storm',
			username: 'lucius',
			postdetails: 'spoke for 59 sec.',
			url: 'http://grapevinetalk.com/media-files/intune-high-above-the-storm/lucius__057b9151-e537-4ec1-bc98-9ba30b4838f3.flv'
		},
		{
			id: '2',
			vinename: 'Project Pinnacle team vine',
			username: 'scorpio',
			postdetails: 'spoke for 11 sec.',
			url: '/media-samples/Jimmy__f90740b4-4e87-4056-abe5-a6a6a640a998.flv'
		},
		{
			id: '3',
			vinename: 'Product launch day',
			username: 'pascal',
			postdetails: 'spoke for 4 sec.',
			url: '/media-samples/pascal__1d4dd008-ede2-4113-8fbd-c5cd6c6cb0ec.flv'
		}
	],
	
	//
	// Check login status
	checkLoggedIn : function(opts) {
		gv.data.getUserDetails(
			function(data) {
				gv.website.updateUIOnLogin(data.user.username);			
				
				if (opts && opts.success)
					opts.success();
			},
			function() {
				gv.website.updateUIOnLogout();
				
				if (opts && opts.error)
					opts.error();
			}
		);
	},
	
	//
	// update UI for login
	updateUIOnLogin : function(username) {
		$('.logged-in-username').text(username);			
		$('.top-banner-right').animate({top: 0}, 1000);
		$('#loginPane').hide();
		$('#loggedInPane').fadeIn(1000);
	},
	
	//
	// update UI for login
	updateUIOnLogout : function() {
		$('.top-banner-right').animate({top: 0}, 1000);
		$('#loggedInPane').hide();
		$('#loginPane').fadeIn(1000);
	},
	
	//
	// Signup a new user
	signup : function(form) {
		var username = form.username.value;
		var password = form.password.value;
		var confirmPassword = form.confirmPassword.value;
		var email = form.email.value;
		var firstName = form.firstname.value;
		var lastName = form.lastname.value;
		var howHeard = form.howheard.value;
		
		if (username && username.indexOf(' ') > -1) {
			$(form).find('#signup-form-feedback').text("Looks like you have some spaces crampin' your username, friend. On Grapevine, a username must be a single word.");
			return false;
		}		
		if (password === '' || password !== confirmPassword) {
			$(form).find('#signup-form-feedback').text("Oops! Those two passwords don't quite match...");
			return false;
		}		
		if (!firstName || firstName.length < 1 || !lastName || lastName.length < 1) {
			gv.logger.log(firstName + ' - ' + lastName);
			$(form).find('#signup-form-feedback').text("Please enter your first and last names.");
			return false;
		}		
		if (!gv.website.isEmailValid(email)) {
			$(form).find('#signup-form-feedback').text("Oops! That doesn't look like a valid email address...");
			return false;
		}
		
		$(form)
			.hide()
			.find('#signup-form-feedback').text("").end()
			.siblings('#signup-form-processing').text("Hold tight one moment.");
		
		gv.username = username;
		var makeNameVisible = form.makeNameVisible.checked;
		
		gv.data.signup(firstName, lastName, username, password, confirmPassword, email, howHeard, undefined,
			function() {
				gv.website.showLightbox('#signupverifybox');
			},
			function (error){
				$(form)
					.siblings('signup-form-processing').text("").end()
					.find('#signup-form-feedback').text("Something went wrong during signup: " + error).end()
					.show();
			}
		);
	},
	
	isEmailValid : function(email) {
		return email.match(gv.website.emailRegex);
	},
	
	resetPassword : function(form) {
		var email = form.email.value;
		if (!gv.website.isEmailValid(email)) {
			$(form).find('#reset-password-form-feedback').text("Oops! That doesn't look like a valid email address...");
			return;
		}
		
		$(form).hide();
		$(form).siblings('#reset-password-feedback').text("Hold tight one moment.");		
		
		gv.data.resetPassword(email, function () {
				$(form).siblings('p#reset-password-feedback').text("Check your email for your new password");				
			},
			function(error){
				$(form)
					.siblings('#reset-password-feedback').text("").end()
					.find('#reset-password-form-feedback').text("Something went wrong whilst resetting your password: " + error).end()
					.show();
			}
		);
	},
	
	inviteAFriend : function(form) {
		var email = form.email.value;
		if (!gv.website.isEmailValid(email)) {
			$(form).find('#invite-a-friend-form-feedback').text("Oops! That doesn't look like a valid email address...");
			return;
		}
		
		$(form).hide();
		$(form).siblings('#invite-a-friend-feedback').text("Hold tight one moment.");
		gv.data.invite(email, undefined,
			function() {
				$(form).siblings('#invite-a-friend-feedback').text("We've emailed " + email + " on your behalf, inviting them to Grapevine.");
			},
			function(error) {
				$(form)
					.siblings('#invite-a-friend-feedback').text("").end()
					.find('#invite-a-friend-form-feedback').text("Something went wrong while trying to send the invite: " + error).end()
					.show();
			}
		);
	},
	
	playbackStarting : function() {
		gv.logger.log('playback starting');
	},
	
	playbackStopping : function() {
		gv.logger.log('playback stopping');
		$('.stop').removeClass('stop').addClass('play');
		gv.website.pauseRotatingMessages = false;
	},
	
	rotateMessages : function() {
		gv.website.showMessage();
		setInterval(function(){ gv.website.showMessage(); }, 5000);
	},
	
	showMessage : function() {
		if (gv.website.pauseRotatingMessages) {
			return;		
		}
		
		var m = gv.website.messages[gv.website.displayedMessage];
		gv.website.displayedMessage ++;
		if (gv.website.displayedMessage >= gv.website.messages.length) {
			gv.website.displayedMessage = 0;
		}
		$('.recenttemplate').animate({'left': '-300px', 'opacity':0}, 500, function(){
			var newrecent = $(this).clone();
			$(this).remove();
			newrecent
				.find('#vinename').text(m.vinename).end()
				.find('#poster').text(m.username).end()
				.find('#postdetails').text(m.postdetails).end()
				.find('.play').attr('href', m.url).end()
				.css({'right': '-300px', 'opacity':0})
				.appendTo('#recently')
				.animate({'left': '0', 'opacity':1}, 300);
		});	
	},
	
	launchBrowserApp : function() {
		window.open('/app/', 'gvappwindow', 'scrollbars=1,toolbar=0,resizable=1,status=0,location=0,directories=0,menubar=0,width=500,height=600,left=100,top=100');
	},
	
	//
	// lightbox support and handlers
	initLightboxSupport : function() {
		// lightbox close
		$('.lightbox-close').live('click', function(ev) {
			ev.preventDefault();
			$.fancybox.close();
		});
		
		// lightbox opening
		$('.lightboxlink').live('click', function(ev) {
			ev.preventDefault();
			var lightboxref = $(ev.target).attr('href');
			gv.website.showLightbox(lightboxref);
		});
		
		// show lightbox if anchor given
		var anchor = window.location.hash;
		gv.logger.log('Got anchor ' + anchor);
		if (anchor) {
			var box = anchor + 'box';
			gv.website.showLightbox(box);
		}
	},
	
	showLightbox : function(lightboxref) {
		if ($(lightboxref).length <= 0) {
			gv.logger.log('Lightbox ' + lightboxref + ' not found');
			return;
		}
		if (lightboxref.indexOf('#') > -1)
			gv.logger.log('WARN: referencing lightbox ' + lightboxref + ' by id - use class references to avoid duplicate IDs');
		
		if ($(lightboxref).hasClass('loggedinlightbox')) {
			gv.website.checkLoggedIn({
				success: function() {
					var cloned = $(lightboxref).clone().addClass('active-lightbox');
					$.fancybox(cloned, gv.website.fancyboxOpts);
				},
				error: function() {
					gv.logger.log('User session not found, forcing login to get to ' + lightboxref);
					gv.website.loginTargetLightbox = lightboxref;
					$.fancybox($('#loginbox'), gv.website.fancyboxOpts);
				}
			});
		} else {
			var cloned = $(lightboxref).clone().addClass('active-lightbox');
			$.fancybox(cloned, gv.website.fancyboxOpts);
		}
	},
	
	embedDownloadSwf : function() {
		$('.appdownload').each(function() {
			var elementId = $(this).attr('id'); 
			var params = {
					wmode: "transparent"
					//scale: "noscale"
			};
			var flashvars = {
					airversion: "1.0", 
					appname: "Grapevine",
					appurl: "http://www.grapevinetalk.com/GrapevineApp.air", 
					appid: "com.GrapevineTalk",
					pubid: "",
					appversion: "0.31.1260128305.p",
					imageurl: "images/get_app_badge.png", 
					str_err_airswf: "Running locally?<br/><br/>The AIR proxy swf won't load properly when this demo is run from the local file system."
			};
			swfobject.embedSWF('swf/badge-final.swf', elementId, '215', '180', '9.0.115',
					'swf/expressinstall.swf', flashvars, params);
		});
	}
};

$.fn.statusFlash = function(options) {
	var defaults = {
		cssClass : 'status-flash',
		type : 'info',
		message : '',
		top : undefined
	};
	var opts = $.extend({}, defaults, options);
	
	var _this = this;
	$(this) 
		.removeClass().addClass(opts.cssClass).addClass(opts.type)
		.text(opts.message)
		.fadeIn(1500, function() {
			$.timer(5000, function(timer) {			
				timer.stop();
				$(_this).fadeOut(2000);
			});
		});
	if (opts.top)
		$(this).css('top', opts.top);
};

$(document).ready(function() {
	gv.website.embedDownloadSwf();
	
	//
	// see if we have a session
	gv.website.checkLoggedIn();
	
	//
	// user / pass box
	$('#loginUsername').focus(function() {
		$('#loginUsername').removeClass('clean').val('');
	});	
	$('#loginPasswordClear').focus(function(ev) {
		var target = $(ev.target);
		target.hide();
		$('#loginPasswordMasked').show().focus();
	});

	//
	// lightbox initialisation
	gv.website.initLightboxSupport();
	
	//
	// color picker setup
	if ($.farbtastic)
		$('#colorpicker').farbtastic('#color');
	
	//
	// form submission handles
	$('form').live('submit', function(ev){
		if ($(ev.target).attr('id') == 'signup-form'){
			ev.preventDefault();
			gv.website.signup(this);
		} else if ($(ev.target).hasClass('loginform')) {
			ev.preventDefault();
			var username = $(ev.target).find('.username').val();
			var password = $(ev.target).find('.password').val();
			gv.sessionmanager.login({
				username: username,
				password: password,
				jsonp: true,
				success: function() {
					gv.logger.log('logged in');
					gv.website.updateUIOnLogin(gv.session.username);
					
					var targetLightbox = gv.website.loginTargetLightbox;
					if (targetLightbox) {
						gv.website.loginTargetLightbox = undefined;
						$.fancybox($(targetLightbox), gv.website.fancyboxOpts);
					}
				},
				error: function() {
					$(ev.target).siblings('.login-status-flash').statusFlash({
						type : 'error',
						message : 'Uh oh - there was a problem signing you in'
					});
				}
			});
		} else if ($(ev.target).attr('id') == 'reset-password-form') {
			ev.preventDefault();			
			gv.website.resetPassword(this);
		} else if ($(ev.target).attr('id') == 'invite-a-friend-form') {
			ev.preventDefault();
			gv.website.inviteAFriend(this);
		} else if ($(ev.target).attr('id') == 'spaces-trial-form') {
			ev.preventDefault();
			var spaceName = $(ev.target).find('#spacename').val();
			var spaceColorHex = $(ev.target).find('#color').val().replace("#", "");
			var spaceInviteesCsv = '';
			$(ev.target).find('table tr').each(function() {
				gv.logger.log('row ' + $(this).html());
				if (!$(this).hasClass('nousersselected') && $(this).has('th').length < 1) {
					var invitee = $(this).find('td:first').text();
					gv.logger.log('invitee: ' + invitee);
					spaceInviteesCsv += ',' + invitee;
				}
			});
			if (spaceInviteesCsv.length > 0)
				spaceInviteesCsv = spaceInviteesCsv.substring(1);
			
			if (!spaceName || spaceName.length < 1) {
				$('p#spaces-trial-form-feedback').text("Please provide a name for your space");
				return false;
			}
			
			$('#spaces-trial-form-feedback').text('');
			$('#spaces-trial-form').hide();
			$('#spaces-trial-form-processing').show();
			gv.data.registerSpace(spaceName, spaceInviteesCsv, spaceColorHex,
					function() {
						$('#spaces-trial-form-processing').hide();
						$('#spaces-trial-form-success').show();
					},
					function() {
						$('#spaces-trial-form-processing').hide();
						$('#spaces-trial-form-error').show();
					}
			);
		}
		return true;
	});
	
	$("input[name$='username']").live('keyup', function(ev) {
		$.gvreq({
			url : '/users.json?page_size=1&username=' + this.value,
			success : function (result) {
				if (result.users_count == '1') {
					$('p#signup-form-username-feedback').text("This username is already taken.");
				} else {
					$('p#signup-form-username-feedback').text("");
				}
			}
		});
	});
	
	//
	// init audio
	if ($('#grapevinewrapper-alt').length > 0) {
		var prefs = {
				divId : 'grapevinewrapper-alt',
				width: "0px",
				height: "0px",
				disablePortTest: true,
				loaded : function() {
					//gv.logger.log('loaded');
				}
		};
		gv.embedWrapper(prefs);
	}
	
	//
	// playback event handling
	$('a.play').live('click', function(ev) {
		ev.preventDefault();
		var target = $(ev.target);
		var url = target.attr('href');
		$('.stop').removeClass('stop').addClass('play');
		gv.logger.log('Going to play message ' + url);
		gv.getWrapper().playStaticExt(url, 'gv.website.playbackStarting', 'gv.website.playbackStopping', 'gv.website.playbackStopping');
		target.removeClass('play').addClass('stop');
		gv.website.pauseRotatingMessages = true;		
	});
	
	$('a.stop').live('click', function(ev) {
		ev.preventDefault();
		$(ev.target).removeClass('stop').addClass('play');
		gv.getWrapper().stopStatic();
		gv.website.pauseRotatingMessages = false;
	});
	
	//
	// login handling
	$('.launchinbrowserlink').live('click', function(ev) {
		ev.preventDefault();
		gv.website.launchBrowserApp();
	});	
	$('.loginbutton').live('click', function(ev) {
		ev.preventDefault();
		$(ev.target).parents('form').submit();
	});
	
	//
	// logout handling
	$('.logoutlink').live('click', function(ev) {
		ev.preventDefault();
		gv.sessionmanager.logout();
		gv.website.updateUIOnLogout();
	});
	
	//
	// init rotation
	gv.website.rotateMessages();
	
	//
	// user picker initialisation
	$('.userpicker').ajaxMatch({
		matchFunction : function(matchText, dataAvailableCallbackFunc) {
			if (matchText && matchText.length > 0) {
				gv.data.findUsers(matchText, undefined, 20, 0, function(data) {				
					gv.logger.log('Got users for text ' + matchText + 'from user picker: ' + JSON.stringify(data));
					dataAvailableCallbackFunc(data);
				});
			}
		},
		resultFunction : function(res, matchText, target) {		
			var matchesDiv = $(target).siblings('div.userpickermatches');
			var ww = $(target).width();
			matchesDiv.children().remove().end()
				.css('right', '40px')
				.width(ww)
				.show();
			if (!res || res.length < 1) {
				$('<p><i>No matches</i></p>')
					.appendTo(matchesDiv);
				return;
			}
				
			// show div and remove any existing match results
			$.each(res.users, function(){
				// for each matched user, show and add click handler
				var username = this.username;
				$('<a href="#" style="display: block; padding: 2px 5px;">' + username + '</a>')
					.click(function(ev) {
						ev.preventDefault();
						$(target).siblings('.userpickertable')
							.find('.nousersselected').remove().end()
							.append($('<tr><td>' + username + '</td><td><a class="removepickeduser" href="#">Remove</a></td></tr>'));
						$(target).val('');
						matchesDiv.hide();
					})
					.appendTo(matchesDiv);
			});
		}
	});
	$('.userpickertable .removepickeduser').live('click', function(ev) {
		ev.preventDefault();
		gv.logger.log('hhh ' + $(ev.target).parents('tr').siblings().length);
		if ($(ev.target).parents('tr').siblings().length < 2)
			$(ev.target).parents('table').append('<tr class="nousersselected"><td><i>No users selected</i></td><td></td></tr>');
			
		$(ev.target).parents('tr').remove();
	});
});	
