changeset 121:683cc27450ce

Merge
author Jorge@Jorge-PC
date Fri, 24 Jun 2011 21:19:42 -0300
parents c3573defd18f (current diff) 8fa58a79656a (diff)
children 17531db40d4e
files Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml Agendas/trunk/src/Agendas.Web/Views/Evento/New.cshtml Agendas/trunk/src/Agendas.Web/Views/Propuesta/Edit.cshtml Agendas/trunk/src/Agendas.Web/Views/Propuesta/Index.cshtml Agendas/trunk/src/Agendas.Web/Views/Propuesta/New.cshtml
diffstat 46 files changed, 915 insertions(+), 660 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -27,14 +27,19 @@
 			return evento;
 		}
 
-		public IList<Evento> GetEventosPropuestos()
+		public IList<Evento> GetEventosActivos(EventoState state)
 		{
-			return _eventosRepository.GetEventosSinFecha() ?? new List<Evento>();
+			return _eventosRepository.GetByState(state) ?? new List<Evento>();
 		}
 
-		public IList<Evento> GetEventosAgendados()
+		public IList<Evento> GetEventosActivos()
 		{
-			return _eventosRepository.GetEventosConFecha() ?? new List<Evento>();
+			return _eventosRepository.GetActivos() ?? new List<Evento>();
+		}
+
+		public IEnumerable<Evento> GetHistorico()
+		{
+			return _eventosRepository.GetByState(EventoPublicadoState.GetInstance()) ?? new List<Evento>();
 		}
 
 		public Resultado ModificarEvento(Guid eventoId, string titulo, string ponenteNombre, DateTime? fecha, string urlInvitacion)
--- a/Agendas/trunk/src/Agendas.Domain/Cuenta.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Cuenta.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -15,5 +15,28 @@
 			LogonName = logonName;
 			IdentityProvider = identityProvider;
 		}
+
+		public override bool Equals(object obj)
+		{
+			if (ReferenceEquals(null, obj)) return false;
+			if (ReferenceEquals(this, obj)) return true;
+			if (obj.GetType() != typeof (Cuenta)) return false;
+			return Equals((Cuenta) obj);
+		}
+
+		public virtual bool Equals(Cuenta other)
+		{
+			if (ReferenceEquals(null, other)) return false;
+			if (ReferenceEquals(this, other)) return true;
+			return Equals(other.LogonName, LogonName) && Equals(other.IdentityProvider, IdentityProvider);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked
+			{
+				return ((LogonName != null ? LogonName.GetHashCode() : 0)*397) ^ IdentityProvider.GetHashCode();
+			}
+		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/EventoAgendadoState.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/EventoAgendadoState.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -1,4 +1,5 @@
-using AltNetHispano.Agendas.Domain.Exceptions;
+using System;
+using AltNetHispano.Agendas.Domain.Exceptions;
 
 namespace AltNetHispano.Agendas.Domain
 {
@@ -33,5 +34,10 @@
     {
       return Descripcion;
     }
+
+  	public override bool PuedePromover(Accion accion)
+  	{
+		return accion == Accion.Confirmar;
+  	}
   }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/EventoConfirmadoState.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/EventoConfirmadoState.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -1,4 +1,5 @@
-using AltNetHispano.Agendas.Domain.Exceptions;
+using System;
+using AltNetHispano.Agendas.Domain.Exceptions;
 
 namespace AltNetHispano.Agendas.Domain
 {
@@ -33,5 +34,10 @@
     {
       return Descripcion;
     }
+
+  	public override bool PuedePromover(Accion accion)
+  	{
+  		return accion == Accion.Publicar;
+  	}
   }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/EventoNullState.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/EventoNullState.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -1,4 +1,5 @@
-using AltNetHispano.Agendas.Domain.Exceptions;
+using System;
+using AltNetHispano.Agendas.Domain.Exceptions;
 
 namespace AltNetHispano.Agendas.Domain
 {
@@ -37,5 +38,10 @@
     {
       return Descripcion;
     }
+
+  	public override bool PuedePromover(Accion accion)
+  	{
+  		return accion == Accion.Proponer || accion == Accion.Agendar;
+  	}
   }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/EventoPropuestoState.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/EventoPropuestoState.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -1,4 +1,5 @@
-using AltNetHispano.Agendas.Domain.Exceptions;
+using System;
+using AltNetHispano.Agendas.Domain.Exceptions;
 
 namespace AltNetHispano.Agendas.Domain
 {
@@ -33,5 +34,10 @@
     {
       return Descripcion;
     }
+
+  	public override bool PuedePromover(Accion accion)
+  	{
+  		return accion == Accion.Agendar;
+  	}
   }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/EventoPublicadoState.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/EventoPublicadoState.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -1,4 +1,5 @@
-using AltNetHispano.Agendas.Domain.Exceptions;
+using System;
+using AltNetHispano.Agendas.Domain.Exceptions;
 
 namespace AltNetHispano.Agendas.Domain
 {
@@ -25,5 +26,10 @@
     {
       return Descripcion;
     }
+
+  	public override bool PuedePromover(Accion accion)
+  	{
+  		return false;
+  	}
   }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/EventoState.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/EventoState.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -10,5 +10,7 @@
     public abstract void Promover(Evento evento, Accion accion);
 
     public abstract string GetDescripcion();
+
+  	public abstract bool PuedePromover(Accion accion);
   }
 }
--- a/Agendas/trunk/src/Agendas.Domain/IdentityContext.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/IdentityContext.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -27,15 +27,21 @@
 
 		public static string GetUserName()
 		{
-			string username = Current.GetUserName();
-			if (string.IsNullOrWhiteSpace(username))
-				throw new UsuarioNoAutenticadoException();
-			return username;
+			return Current.GetUserName();
+		}
+
+		public static bool IsAuthenticated()
+		{
+			return !string.IsNullOrWhiteSpace(GetUserName());
 		}
 
 		public static Persona GetUsuario()
 		{
-			var identification = new Identification(GetUserName());
+			var userName = GetUserName();
+			if (string.IsNullOrWhiteSpace(userName))
+				throw new UsuarioNoAutenticadoException();
+
+			var identification = new Identification(userName);
 
 			var cuenta = _personaRepository.GetCuenta(identification.IdentityProvider, identification.LogonName);
 			return cuenta != null ? cuenta.Persona : null;
--- a/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -7,8 +7,8 @@
 	{
 		void Delete(Evento evento);
 		Evento Get(Guid vanId);
-		IList<Evento> GetEventosConFecha();
-		IList<Evento> GetEventosSinFecha();
+		IList<Evento> GetByState(EventoState state);
+		IList<Evento> GetActivos();
 		Evento GetPropuestaByTitulo(string titulo);
 		void Save(Evento evento);
 		void Update(Evento evento);
--- a/Agendas/trunk/src/Agendas.Domain/Services/PersonaService.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Services/PersonaService.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -19,12 +19,12 @@
 			return cuenta != null;
 		}
 
-		public bool Validate(IdentityProviderEnum identityProvider, string username, string nombre)
+		public bool CreateIfNotExist(IdentityProviderEnum identityProvider, string username, string nombre)
 		{
 			var cuenta = _personaRepository.GetCuenta(identityProvider, username);
 			if (cuenta==null)
 			{
-				var persona=new Persona(nombre);
+				var persona = IdentityContext.IsAuthenticated() ? IdentityContext.GetUsuario() : new Persona(nombre);
 				persona.AddCuenta(new Cuenta(identityProvider, username));
 
 				if (identityProvider == IdentityProviderEnum.Twitter)
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -13,6 +13,11 @@
 			//nada que hacer en este método para este repositorio
 		}
 
+		public IList<Evento> GetByState(EventoState state)
+		{
+			return Objects.Values.Where(e => e.Estado == state.GetDescripcion()).ToList();
+		}
+
 		public void Delete(Evento evento)
 		{
 			Objects.Remove(evento.Id);
@@ -24,14 +29,12 @@
             return Objects.TryGetValue(vanId, out evento) ? evento : null;
         }
 
-		public IList<Evento> GetEventosSinFecha()
+		public IList<Evento> GetActivos()
 		{
-			return Objects.Values.Where(e => e.Fecha == null).ToList();
-		}
-
-		public IList<Evento> GetEventosConFecha()
-		{
-			return Objects.Values.Where(e => e.Fecha != null).ToList();
+			return
+				Objects.Values.Where(
+					e =>
+					e.Estado != EventoPublicadoState.GetInstance().GetDescripcion()).ToList();
 		}
 
 		public Evento GetPropuestaByTitulo(string titulo)
--- a/Agendas/trunk/src/Agendas.Repositories.NHibernate/EventoRepository.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.NHibernate/EventoRepository.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -22,14 +22,12 @@
 			return Session.Get<Evento>(vanId);
 		}
 
-		public IList<Evento> GetEventosConFecha()
+		public IList<Evento> GetActivos()
 		{
-			return Session.QueryOver<Evento>().Where(e => e.Fecha != null).List();
-		}
-
-		public IList<Evento> GetEventosSinFecha()
-		{
-			return Session.QueryOver<Evento>().Where(e => e.Fecha == null).List();
+			return
+				Session.QueryOver<Evento>().Where(
+					e =>
+					e.Estado != EventoPublicadoState.GetInstance().GetDescripcion()).List();
 		}
 
 		public Evento GetPropuestaByTitulo(string titulo)
@@ -41,5 +39,10 @@
 		{
 			//No es necesario implementarlo
 		}
+
+		public IList<Evento> GetByState(EventoState state)
+		{
+			return Session.QueryOver<Evento>().Where(e => e.Estado == state.GetDescripcion()).List();
+		}
 	}
 }
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -31,8 +31,9 @@
 
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);
 
-      Assert.Throws<Exception>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion, TipoEvento.Van));
-			Assert.AreEqual(0, agenda.GetEventosAgendados().Count);
+			Assert.Throws<Exception>(
+				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion, TipoEvento.Van));
+			Assert.AreEqual(0, agenda.GetEventosActivos().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
@@ -50,7 +51,7 @@
 
 			Assert.Throws<IdentityContextNotConfiguredException>(
 				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-          urlInvitacion, TipoEvento.Van));
+		  urlInvitacion, TipoEvento.Van));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
 
@@ -65,7 +66,7 @@
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);
 
 			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van));
+		urlInvitacion, TipoEvento.Van));
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(0));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
@@ -77,7 +78,7 @@
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			var r = agenda.Agendar("Van para publicar", string.Empty, DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			Assert.IsFalse(r.Succeful);
 		}
@@ -90,11 +91,11 @@
 
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
+			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															repository.Object, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 			publicador2.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -109,17 +110,17 @@
 			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
-			Assert.AreEqual(0, agenda.GetEventosPropuestos().Count);
+			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 
-			var eventos = agenda.GetEventosAgendados();
+			var eventos = agenda.GetEventosActivos();
 			Assert.AreEqual(1, eventos.Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
 			var evento = eventos[0];
-			
+
 			Assert.IsNotNull(evento.Ponente);
 		}
 
@@ -132,11 +133,11 @@
 			var agenda = new Agenda(publicador.Object, repository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
-			var evento = repository.GetEventosConFecha().First();
+			var evento = repository.GetActivos().First();
 			Assert.AreNotEqual(Guid.Empty, evento.Id);
 			Assert.IsNotNull(evento.Fecha);
 
@@ -145,7 +146,7 @@
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));
 
-			evento = repository.GetEventosConFecha().First();
+			evento = repository.GetActivos().First();
 			Assert.AreEqual("otro titulo", evento.Titulo);
 			Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
 			Assert.AreEqual(fecha, evento.Fecha);
@@ -161,13 +162,13 @@
 			var publicador1 = new Mock<IPublicador>();
 			var publicador2 = new Mock<IPublicador>();
 
-			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
+			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
-			var van = agenda.GetEventosAgendados().Single(v => v.Titulo == "Van para publicar");
+			var van = agenda.GetEventosActivos().Single(v => v.Titulo == "Van para publicar");
 			//agenda.Recordar(van.Id);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -184,18 +185,19 @@
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															DefaultEventoRepository, DefaultPersonaRepository);
 
-      agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
-			Assert.AreEqual(1, agenda.GetEventosPropuestos().Count);
-			Assert.AreEqual(0, agenda.GetEventosAgendados().Count);
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			Assert.AreEqual(1, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
+			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
-			var publicado = agenda.GetEventosPropuestos().First();
+			var publicado = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).First();
 			Assert.AreEqual(1, publicado.Tracks.Count());
 
 			agenda.ModificarEvento(publicado.Id, "Html 5", "jjmontes", DateTime.Today.AddDays(5), urlInvitacion);
-			Assert.AreEqual(0, agenda.GetEventosPropuestos().Count);
-			Assert.AreEqual(1, agenda.GetEventosAgendados().Count);
+			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
+			Assert.AreEqual(1, agenda.GetEventosActivos(EventoAgendadoState.GetInstance()).Count);
+			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
-			var agendado = agenda.GetEventosAgendados().First();
+			var agendado = agenda.GetEventosActivos().First();
 			Assert.AreSame(publicado, agendado);
 			Assert.AreEqual(2, agendado.Tracks.Count());
 
@@ -203,115 +205,118 @@
 			Assert.IsNotNull(agendado.Tracks.Where(t => t.Accion == Accion.Agendar).SingleOrDefault());
 		}
 
-    [Test]
-    public void Al_proponer_un_evento_debe_quedar_con_estado_EventoPropuestoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_proponer_un_evento_debe_quedar_con_estado_EventoPropuestoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetEventosSinFecha().Single(e => e.Titulo == "Html 5");
+			var evento =
+				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
 
-      Assert.IsInstanceOf(typeof(EventoPropuestoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Proponer) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoPropuestoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Proponer) == 1);
+		}
 
-    [Test]
-    public void Al_agendar_un_evento_debe_quedar_con_estado_EventoAgendadoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_agendar_un_evento_debe_quedar_con_estado_EventoAgendadoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetEventosConFecha().Single(e => e.Titulo == "Html 5");
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
-      Assert.IsInstanceOf(typeof(EventoAgendadoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Agendar) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoAgendadoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Agendar) == 1);
+		}
 
-    [Test]
-    public void Al_confirmar_un_evento_debe_quedar_con_estado_EventoConfirmadoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_confirmar_un_evento_debe_quedar_con_estado_EventoConfirmadoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetEventosConFecha().Single(e => e.Titulo == "Html 5");
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
-      agenda.Confirmar(evento.Id);
+			agenda.Confirmar(evento.Id);
 
-      Assert.IsInstanceOf(typeof(EventoConfirmadoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Confirmar) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoConfirmadoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Confirmar) == 1);
+		}
 
-    [Test]
-    public void Al_publicar_un_evento_debe_quedar_con_estado_EventoPublicadoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_publicar_un_evento_debe_quedar_con_estado_EventoPublicadoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetEventosConFecha().Single(e => e.Titulo == "Html 5");
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
-      agenda.Confirmar(evento.Id);
-      agenda.Publicar(evento.Id, 0, string.Empty);
+			agenda.Confirmar(evento.Id);
+			agenda.Publicar(evento.Id, 0, string.Empty);
 
-      Assert.IsInstanceOf(typeof(EventoPublicadoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Publicar) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoPublicadoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Publicar) == 1);
+		}
 
-    [Test]
-    public void Al_publicar_un_evento_debe_asignarse_el_nro_de_reunion_y_la_url_de_la_wiki()
-    {
-      var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_publicar_un_evento_debe_asignarse_el_nro_de_reunion_y_la_url_de_la_wiki()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetEventosConFecha().Single(e => e.Titulo == "Html 5");
-      agenda.Confirmar(evento.Id);
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
+			agenda.Confirmar(evento.Id);
 
-      const string urlWiki = "http://www.altnethispano.org/wiki/van-2010-10-21-mono-cecil.ashx";
-      agenda.Publicar(evento.Id, 71, urlWiki);
+			const string urlWiki = "http://www.altnethispano.org/wiki/van-2010-10-21-mono-cecil.ashx";
+			agenda.Publicar(evento.Id, 71, urlWiki);
 
-      Assert.AreEqual(71, evento.NumeroOrden);
-      Assert.AreEqual(urlWiki, evento.UrlWiki);
-    }
+			Assert.AreEqual(71, evento.NumeroOrden);
+			Assert.AreEqual(urlWiki, evento.UrlWiki);
+		}
 
-    [Test]
-    [ExpectedException(typeof(AccionNoSoportadaException))]
-    public void Al_confirmar_sin_agendar_debe_lanzarse_excepcion()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		[ExpectedException(typeof(AccionNoSoportadaException))]
+		public void Al_confirmar_sin_agendar_debe_lanzarse_excepcion()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
-
-      var evento = DefaultEventoRepository.GetEventosSinFecha().Single(e => e.Titulo == "Html 5");
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
 
-      Assert.IsFalse(evento.Estado.GetType() == typeof(EventoAgendadoState));
+			var evento =
+				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
 
-      agenda.Confirmar(evento.Id);
-    }
+			Assert.IsFalse(evento.Estado.GetType() == typeof(EventoAgendadoState));
+
+			agenda.Confirmar(evento.Id);
+		}
 
-    [Test]
-    [ExpectedException(typeof(AccionNoSoportadaException))]
-    public void Al_publicar_sin_confirmar_debe_lanzarse_excepcion()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		[ExpectedException(typeof(AccionNoSoportadaException))]
+		public void Al_publicar_sin_confirmar_debe_lanzarse_excepcion()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
-
-      var evento = DefaultEventoRepository.GetEventosSinFecha().Single(e => e.Titulo == "Html 5");
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
 
-      Assert.IsFalse(evento.Estado.GetType() == typeof(EventoConfirmadoState));
+			var evento =
+				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
 
-      agenda.Publicar(evento.Id, 0, string.Empty);
-    }
+			Assert.IsFalse(evento.Estado.GetType() == typeof(EventoConfirmadoState));
+
+			agenda.Publicar(evento.Id, 0, string.Empty);
+		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/PersonaServiceTests.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PersonaServiceTests.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -19,7 +19,7 @@
 
 			var personaService = new PersonaService(personaRepository.Object);
 			
-			Assert.IsTrue(personaService.Validate(IdentityProviderEnum.Twitter, "nelopauselli", "Nelo Pauselli"));
+			Assert.IsTrue(personaService.CreateIfNotExist(IdentityProviderEnum.Twitter, "nelopauselli", "Nelo Pauselli"));
 			personaRepository.Verify(r=>r.Save(It.IsAny<Persona>()), Times.Once());
 			Assert.IsNotNull(persona);
 			Assert.AreEqual(1, persona.Cuentas.Count());
@@ -32,7 +32,7 @@
 			personaRepository.Setup(r => r.GetCuenta(IdentityProviderEnum.Twitter, "nelopauselli")).Returns(cuenta);
 
 			Assert.AreEqual(1, persona.Cuentas.Count());
-			Assert.IsTrue(personaService.Validate(IdentityProviderEnum.Twitter, "nelopauselli", "Nelo Pauselli"));
+			Assert.IsTrue(personaService.CreateIfNotExist(IdentityProviderEnum.Twitter, "nelopauselli", "Nelo Pauselli"));
 			Assert.AreEqual(1, persona.Cuentas.Count());
 		}
 
--- a/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -25,7 +25,7 @@
 			agenda.Agendar("Conform - Parte 2", "Fabio Maulo", new DateTime(2011, 3, 5),
         urlInvitacion, TipoEvento.Van);
 
-			var eventos = agenda.GetEventosAgendados();
+			var eventos = agenda.GetEventosActivos();
 			Assert.AreEqual(2, eventos.Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));
@@ -51,7 +51,7 @@
 
       agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26), urlInvitacion, TipoEvento.Van);
 
-			Assert.AreEqual(1, agenda.GetEventosAgendados().Count);
+			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
@@ -75,7 +75,7 @@
 			agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26),
         urlInvitacion, TipoEvento.Van);
 
-			Assert.AreEqual(1, agenda.GetEventosAgendados().Count);
+			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
@@ -95,7 +95,7 @@
       agenda.Proponer(titulo, "Fabio", urlInvitacion, TipoEvento.Van);
 			Persona persona;
 			{
-				var eventos = agenda.GetEventosPropuestos();
+				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
@@ -107,7 +107,7 @@
 
 			agenda.ModificarPropuesta(eventoId, titulo, null, urlInvitacion);
 			{
-				var eventos = agenda.GetEventosPropuestos();
+				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
@@ -125,7 +125,7 @@
 
       agenda.Proponer(titulo, "Fabio", urlInvitacion, TipoEvento.Van);
 			{
-				var eventos = agenda.GetEventosPropuestos();
+				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
@@ -136,7 +136,7 @@
 
 			agenda.ModificarPropuesta(eventoId, titulo, "José", urlInvitacion);
 			{
-				var eventos = agenda.GetEventosPropuestos();
+				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -19,18 +19,18 @@
 		{
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
-      agenda.Proponer("Van", null, urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Van", null, urlInvitacion, TipoEvento.Van);
 			{
-				IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
-				IList<Evento> eventosPublicados = agenda.GetEventosAgendados();
+				IList<Evento> eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
+				IList<Evento> eventosAgendados = agenda.GetEventosActivos(EventoAgendadoState.GetInstance());
 
 				Assert.AreEqual(1, eventosPropuestos.Count);
-				Assert.AreEqual(0, eventosPublicados.Count);
+				Assert.AreEqual(0, eventosAgendados.Count);
 
 				var evento = eventosPropuestos.FirstOrDefault();
 				agenda.ModificarPropuesta(evento.Id, "Van 2", "otro ponente", urlInvitacion);
 
-				eventosPropuestos = agenda.GetEventosPropuestos();
+				eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 				Assert.AreEqual(1, eventosPropuestos.Count);
 
 				evento = eventosPropuestos.FirstOrDefault();
@@ -38,14 +38,14 @@
 				Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
 			}
 
-      var r = agenda.Agendar("Van 2", "jjmontes", DateTime.Now, urlInvitacion, TipoEvento.Van);
+			var r = agenda.Agendar("Van 2", "jjmontes", DateTime.Now, urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 			{
-				IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
-				IList<Evento> eventosPublicados = agenda.GetEventosAgendados();
+				IList<Evento> eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
+				IList<Evento> eventosAgendados = agenda.GetEventosActivos(EventoAgendadoState.GetInstance());
 
 				Assert.AreEqual(0, eventosPropuestos.Count);
-				Assert.AreEqual(1, eventosPublicados.Count);
+				Assert.AreEqual(1, eventosAgendados.Count);
 			}
 		}
 
@@ -55,14 +55,14 @@
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			{
-        agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
+				agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
 			}
 
 			{
-				var van = agenda.GetEventosPropuestos().FirstOrDefault();
+				var van = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).FirstOrDefault();
 				Assert.IsNotNull(van);
 				var r = agenda.Agendar(van.Titulo, "Ponente", null,
-          urlInvitacion, TipoEvento.Van);
+		  urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
 		}
@@ -73,16 +73,16 @@
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			{
-        agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
+				agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
 			}
 
 			{
-				var van = agenda.GetEventosPropuestos().FirstOrDefault();
+				var van = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).FirstOrDefault();
 				Assert.IsNotNull(van);
 
 				van.Actualizar(null, DateTime.Today.AddDays(5), urlInvitacion);
 				var r = agenda.Agendar(van.Titulo, string.Empty, van.Fecha,
-          urlInvitacion, TipoEvento.Van);
+		  urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
 		}
@@ -104,7 +104,7 @@
 
 			var agenda = new Agenda(null, repository.Object, DefaultPersonaRepository);
 
-      var r = agenda.Proponer(string.Empty, null, urlInvitacion, TipoEvento.Van);
+			var r = agenda.Proponer(string.Empty, null, urlInvitacion, TipoEvento.Van);
 			Assert.IsFalse(r.Succeful);
 
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
@@ -117,16 +117,16 @@
 
 			SetCurrentUser(null, null);
 
-      Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Proponer("Inmortalidad de la meduza.", null, urlInvitacion, TipoEvento.Van));
+			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Proponer("Inmortalidad de la meduza.", null, urlInvitacion, TipoEvento.Van));
 		}
 
 		[Test]
 		public void Proponer_evento_correctamente()
 		{
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
 
-			IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
+			IList<Evento> eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 			Assert.IsNotNull(eventosPropuestos);
 			Assert.AreEqual(1, eventosPropuestos.Count);
 			Assert.AreEqual("Van propuesta", eventosPropuestos[0].Titulo);
@@ -137,16 +137,16 @@
 		{
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
-      agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
 			var r = agenda.Agendar("Van publicada", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+			                       urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 
-			IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
-			IList<Evento> eventosPublicados = agenda.GetEventosAgendados();
+			IList<Evento> eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
+			IList<Evento> eventosAgendados = agenda.GetEventosActivos(EventoAgendadoState.GetInstance());
 
 			Assert.AreEqual(1, eventosPropuestos.Count);
-			Assert.AreEqual(1, eventosPublicados.Count);
+			Assert.AreEqual(1, eventosAgendados.Count);
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -43,8 +43,11 @@
 			seguridad.Setup(s => s.GetUserName()).Returns(logonName);
 			
 			IPersonaRepository personaRepository = new PersonaRepository();
-			var service = new PersonaService(personaRepository);
-			service.Validate(identityProvider, username, nombre);
+			var persona = new Persona(nombre);
+			persona.AddCuenta(new Cuenta(identityProvider, username));
+			persona.Twitter = username;
+
+			personaRepository.Save(persona);
 
 			IdentityContext.Init(seguridad.Object, personaRepository);
 
--- a/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -19,7 +19,7 @@
 
 			var fecha = DateTime.Now.AddDays(5);
 			agenda.Agendar("Html 5", "jjmontes", fecha, urlInvitacion, TipoEvento.Van);
-			var evento = repository.GetEventosConFecha().First();
+			var evento = repository.GetActivos().First();
 
 			Assert.AreEqual(1, evento.Tracks.Count());
 			var ultimo = evento.Tracks.Last();
@@ -54,7 +54,7 @@
 
 			agenda.Agendar("Html 5", "jjmontes", DateTime.Now,
         urlInvitacion, TipoEvento.Van);
-			var evento = repository.GetEventosConFecha().First();
+			var evento = repository.GetActivos().First();
 
 			Assert.AreEqual(1, evento.Tracks.Count());
 			Assert.AreEqual(Accion.Agendar, evento.Tracks.Last().Accion);
--- a/Agendas/trunk/src/Agendas.Tests/Workflows/WorkflowTests.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Workflows/WorkflowTests.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -43,7 +43,7 @@
 
 			_workflow.Agendar();
 
-			var evento = DefaultEventoRepository.GetEventosConFecha().SingleOrDefault();
+			var evento = DefaultEventoRepository.GetActivos().SingleOrDefault();
 			Assert.IsNotNull(evento);
 
 			_workflow.Confirmar(evento.Id);
@@ -58,7 +58,7 @@
 
 			_workflow.Agendar();
 
-			var evento = DefaultEventoRepository.GetEventosConFecha().SingleOrDefault();
+			var evento = DefaultEventoRepository.GetActivos().SingleOrDefault();
 			Assert.IsNotNull(evento);
 
 			_workflow.Confirmar(evento.Id);
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Fri Jun 24 21:19:42 2011 -0300
@@ -62,10 +62,11 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Controllers\AccountController.cs" />
+    <Compile Include="Controllers\ControllerMessageExtensions.cs" />
     <Compile Include="Controllers\EventoController.cs" />
+    <Compile Include="Controllers\HistoricoController.cs" />
     <Compile Include="Controllers\HomeController.cs" />
     <Compile Include="Controllers\PerfilController.cs" />
-    <Compile Include="Controllers\PropuestaController.cs" />
     <Compile Include="Global.asax.cs">
       <DependentUpon>Global.asax</DependentUpon>
     </Compile>
@@ -77,6 +78,7 @@
     <Compile Include="Models\AccountModels.cs" />
     <Compile Include="Models\EventoModel.cs" />
     <Compile Include="Models\EventoModelHelper.cs" />
+    <Compile Include="Models\HistoricoModel.cs" />
     <Compile Include="Models\PerfilModel.cs" />
     <Compile Include="Models\PropuestaModel.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -86,6 +88,7 @@
     <Compile Include="Services\IMembershipService.cs" />
   </ItemGroup>
   <ItemGroup>
+    <Content Include="Content\AltNetHispanoVans.css" />
     <Content Include="Content\altnetlogo.png" />
     <Content Include="Content\question.jpg" />
     <Content Include="Content\twitter\sign-in-with-twitter-d-sm.png" />
@@ -154,14 +157,12 @@
     <Folder Include="App_Data\" />
   </ItemGroup>
   <ItemGroup>
-    <Content Include="Views\Evento\Edit.cshtml" />
+    <Content Include="Views\Evento\Modificar.cshtml" />
     <Content Include="Views\Evento\Index.cshtml" />
-    <Content Include="Views\Evento\New.cshtml" />
+    <Content Include="Views\Evento\Nuevo.cshtml" />
   </ItemGroup>
   <ItemGroup>
-    <Content Include="Views\Propuesta\New.cshtml" />
-    <Content Include="Views\Propuesta\Edit.cshtml" />
-    <Content Include="Views\Propuesta\Index.cshtml" />
+    <Content Include="Views\Evento\Proponer.cshtml" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\Agendas.Domain\Agendas.Domain.csproj">
@@ -199,6 +200,15 @@
   <ItemGroup>
     <Content Include="Views\Perfil\AddBuiltInAccount.cshtml" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Shared\_Messages.cshtml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Evento\Agendar.cshtml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Historico\Index.cshtml" />
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Content/AltNetHispanoVans.css	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,27 @@
+.errorbox {
+	padding: 5px 5px 5px 5px; 
+	width: 90%; 
+	text-align: center;
+	overflow: auto;
+	margin: 5px 25px 5px 25px;
+}
+
+.warningbox {
+	padding: 5px 5px 5px 5px; 
+	width: 90%; 
+	text-align: center;
+	overflow: auto;
+	margin: 5px 25px 5px 25px;
+	
+}
+
+.notificationbox {
+	padding: 5px 5px 5px 5px; 
+	width: 90%; 
+	text-align: center;
+	overflow: auto;
+	margin: 5px 25px 5px 25px;
+	border: 1px solid #1c7c13;
+	background-color: #d2f7cf;
+	color: #363636;
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Controllers/AccountController.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/AccountController.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -1,5 +1,4 @@
-using System;
-using System.Web.Mvc;
+using System.Web.Mvc;
 using System.Web.Routing;
 using System.Web.Security;
 using AltNetHispano.Agendas.Domain;
@@ -66,26 +65,24 @@
 				var url = Request.Url.Scheme + "://" + Request.Url.Host +
 				          (Request.Url.Port != 80 ? ":" + Request.Url.Port : string.Empty) + action;
 
-				Response.Redirect(oAuth.AuthorizationLinkGet(url).ToString());
+				return Redirect(oAuth.AuthorizationLinkGet(url).ToString());
 			}
-			else
+			
+			var response = oAuth.AccessTokenGet(Request["oauth_token"], Request["oauth_verifier"]);
+			if (response.Length > 0)
 			{
-				var response = oAuth.AccessTokenGet(Request["oauth_token"], Request["oauth_verifier"]);
-				if (response.Length > 0)
-				{
-					var username = OAuthTwitter.GetResponseContent(response, "screen_name");
-					var nombre = OAuthTwitter.GetResponseContent(response, "name");
+				var username = OAuthTwitter.GetResponseContent(response, "screen_name");
+				var nombre = OAuthTwitter.GetResponseContent(response, "name");
 
-					var personaService = AgendaFactory.GetPersonaService();
-					if (personaService.Validate(IdentityProviderEnum.Twitter, username, nombre))
-					{
-						FormsService.SignIn(Identification.Map[(int)IdentityProviderEnum.Twitter]+username, false);
-						return RedirectToAction("Index", "Home");
-					}
-					ModelState.AddModelError("", "The user name or password provided is incorrect.");
-				}
+				var personaService = AgendaFactory.GetPersonaService();
+				personaService.CreateIfNotExist(IdentityProviderEnum.Twitter, username, nombre);
+
+				FormsService.SignIn(Identification.Map[(int)IdentityProviderEnum.Twitter]+username, false);
+				return RedirectToAction("Index", "Home");
 			}
 
+			ModelState.AddModelError("", "The user name or password provided is incorrect.");
+
 			return RedirectToAction("LogOn");
 		}
 
@@ -111,7 +108,7 @@
         }
 
         [HttpPost]
-        public ActionResult Register(RegisterModel model)
+        public ActionResult Register(RegisterModel model, string returnUrl)
         {
             if (ModelState.IsValid)
             {
@@ -121,9 +118,11 @@
                 if (createStatus == MembershipCreateStatus.Success)
                 {
 					var personaService = AgendaFactory.GetPersonaService();
-					if (personaService.Validate(IdentityProviderEnum.BuiltIn, model.UserName, model.Nombre))
+					if (personaService.CreateIfNotExist(IdentityProviderEnum.BuiltIn, model.UserName, model.Nombre))
 					{
 						FormsService.SignIn(Identification.Map[(int)IdentityProviderEnum.BuiltIn] + model.UserName, false);
+						if (Url.IsLocalUrl(returnUrl))
+							return Redirect(returnUrl); 
 						return RedirectToAction("Index", "Home");
 					}
                 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/ControllerMessageExtensions.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,45 @@
+using System;
+using System.Web.Mvc;
+
+namespace AltNetHispano.Agendas.Web.Controllers
+{
+	public static class ControllerMessageExtensions
+	{
+		public static void AddError(this Controller controller, string mensaje)
+		{
+			AddMessage(controller, "error", mensaje);
+		}
+
+		public static void AddNotification(this Controller controller, string mensaje)
+		{
+			AddMessage(controller, "notification", mensaje);
+		}
+
+		public static void AddWarning(this Controller controller, string mensaje)
+		{
+			AddMessage(controller, "warning", mensaje);
+		}
+
+		#region protected and private members
+
+		private static void AddMessage(Controller controller, string key, string mensaje)
+		{
+			if (controller == null) throw new ArgumentNullException("controller");
+			if (key == null) throw new ArgumentNullException("key");
+			if (mensaje == null) throw new ArgumentNullException("mensaje");
+
+			if (mensaje == string.Empty) return;
+
+			var mensajes = mensaje.Contains("\n") ? mensaje.Replace("\r", string.Empty).Split('\n') : new[] {mensaje};
+
+			foreach (var m in mensajes)
+			{
+				if (controller.TempData.ContainsKey(key))
+					controller.TempData[key] += "<br />";
+				controller.TempData[key] += m;
+			}
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -7,76 +7,170 @@
 
 namespace AltNetHispano.Agendas.Web.Controllers
 {
-  public class EventoController : Controller
-  {
-    public ActionResult Index()
-    {
-      var agenda = AgendaFactory.GetAgenda();
+	public class EventoController : Controller
+	{
+		public ActionResult Index()
+		{
+			var agenda = AgendaFactory.GetAgenda();
 
-      var model = new EventoIndexModel
-      {
-        ProximosEventos = from e in agenda.GetEventosAgendados()
-                          orderby e.Fecha
-                          select new EventoDto { Id = e.Id.ToString(), Titulo = e.Titulo, Fecha = e.Fecha.Value }
-      };
+			var model = new EventoIndexModel
+			            	{
+			            		ProximosEventos = from e in agenda.GetEventosActivos()
+			            		                  orderby e.Fecha
+			            		                  select new EventoDto
+			            		                         	{
+			            		                         		Id = e.Id.ToString(),
+			            		                         		Titulo = e.Titulo,
+			            		                         		Fecha = e.Fecha.HasValue ? e.Fecha.Value.ToShortDateString() : string.Empty,
+																Estado = e.Estado,
+			            		                         		PuedeAgendar = e.GetEstado().PuedePromover(Accion.Agendar),
+			            		                         		PuedeModificar = e.GetEstado().PuedePromover(Accion.Modificar),
+			            		                         		PuedeConfirmar = e.GetEstado().PuedePromover(Accion.Confirmar),
+			            		                         		PuedePublicar = e.GetEstado().PuedePromover(Accion.Publicar)
+			            		                         	}
+			            	};
+			return View(model);
+		}
+
+		[Authorize]
+		public ActionResult Nuevo()
+		{
+			return View(new EventoNewModel());
+		}
 
-      return View(model);
-    }
+		[HttpPost]
+		[Authorize]
+		public ActionResult Nuevo(EventoNewModel model)
+		{
+			if (ModelState.IsValid)
+			{
+				var agenda = AgendaFactory.GetAgenda();
+
+				var r = agenda.Agendar(model.Titulo, model.Ponente, model.Fecha,
+				  model.UrlInvitacion, (TipoEvento)model.Tipo);
+				if (r.Succeful)
+				{
+					this.AddNotification("Datos guardados");
+					return RedirectToAction("Index");
+				}
+				ModelState.AddModelError("error", r.ToString());
+			}
+			return View(model);
+		}
 
-    [Authorize]
-    public ActionResult New()
-    {
-      return View(new EventoNewModel());
-    }
+		[Authorize]
+		public ActionResult Confirmar(string id)
+		{
+			var agenda = AgendaFactory.GetAgenda();
+			agenda.Confirmar(new Guid(id));
+
+			this.AddNotification("Evento confirmado");
+			return RedirectToAction("Index");
+		}
 
-    [HttpPost]
-    [Authorize]
-    public ActionResult New(EventoNewModel model)
-    {
-      if (ModelState.IsValid)
-      {
-        var agenda = AgendaFactory.GetAgenda();
+		[Authorize]
+		public ActionResult Publicar(string id)
+		{
+			var agenda = AgendaFactory.GetAgenda();
+			agenda.Publicar(new Guid(id), 0, string.Empty);
+
+			this.AddNotification("Evento publicado");
+			return RedirectToAction("Index");
+		}
+
+		[Authorize]
+		public ActionResult Modificar(string id)
+		{
+			var agenda = AgendaFactory.GetAgenda();
+			var evento = agenda.GetEvento(new Guid(id));
 
-        var r = agenda.Agendar(model.Titulo, model.Ponente, model.Fecha,
-          model.UrlInvitacion, (TipoEvento)model.Tipo);
-        if (r.Succeful)
-          return RedirectToAction("Index");
-        ModelState.AddModelError("error", r.ToString());
-      }
-      return View(model);
-    }
+			var model = new EventoEditModel
+			{
+				Id = id,
+				Titulo = evento.Titulo,
+				Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
+				Fecha = evento.Fecha,
+				UrlInvitacion = evento.UrlInvitacion
+			};
+			return View(model);
+		}
+		
+		[HttpPost]
+		[Authorize]
+		public ActionResult Modificar(EventoEditModel model)
+		{
+			if (ModelState.IsValid)
+			{
+				var agenda = AgendaFactory.GetAgenda();
 
-    [Authorize]
-    public ActionResult Edit(string id)
-    {
-      var agenda = AgendaFactory.GetAgenda();
-      var evento = agenda.GetEvento(new Guid(id));
+				var r = agenda.ModificarEvento(new Guid(model.Id), model.Titulo, model.Ponente, model.Fecha.Value, model.UrlInvitacion);
+				if (r.Succeful)
+				{
+					this.AddNotification("datos guardados");
+					return RedirectToAction("Index");
+				}
+				ModelState.AddModelError("error", r.ToString());
+			}
+			return View(model);
+		}
+
+		[Authorize]
+		public ActionResult Agendar(string id)
+		{
+			var agenda = AgendaFactory.GetAgenda();
+			var evento = agenda.GetEvento(new Guid(id));
 
-      var model = new EventoEditModel
-                    {
-                      Id = id,
-                      Titulo = evento.Titulo,
-                      Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
-                      Fecha = evento.Fecha,
-                      UrlInvitacion = evento.UrlInvitacion
-                    };
-      return View(model);
-    }
+			var model = new EventoAgendarModel
+			{
+				Id = id,
+				Titulo = evento.Titulo,
+				Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
+				Fecha = evento.Fecha,
+				UrlInvitacion = evento.UrlInvitacion
+			};
+			return View(model);
+		}
+
+		[HttpPost]
+		[Authorize]
+		public ActionResult Agendar(EventoAgendarModel model)
+		{
+			if (ModelState.IsValid)
+			{
+				var agenda = AgendaFactory.GetAgenda();
 
-    [HttpPost]
-    [Authorize]
-    public ActionResult Edit(EventoEditModel model)
-    {
-      if (ModelState.IsValid)
-      {
-        var agenda = AgendaFactory.GetAgenda();
+				var r = agenda.ModificarEvento(new Guid(model.Id), model.Titulo, model.Ponente, model.Fecha.Value, model.UrlInvitacion);
+				if (r.Succeful)
+				{
+					this.AddNotification("evento agendado");
+					return RedirectToAction("Index");
+				}
+				ModelState.AddModelError("error", r.ToString());
+			}
+			return View(model);
+		}
+
+		[Authorize]
+		public ActionResult Proponer()
+		{
+			return View(new PropuestaNewModel());
+		}
 
-        var r = agenda.ModificarEvento(new Guid(model.Id), model.Titulo, model.Ponente, model.Fecha.Value, model.UrlInvitacion);
-        if (r.Succeful)
-          return RedirectToAction("Index");
-        ModelState.AddModelError("error", r.ToString());
-      }
-      return View(model);
-    }
-  }
+		[HttpPost]
+		[Authorize]
+		public ActionResult Proponer(PropuestaNewModel model)
+		{
+			if (ModelState.IsValid)
+			{
+				var agenda = AgendaFactory.GetAgenda();
+
+				var r = agenda.Proponer(model.Titulo, model.Ponente, model.UrlInvitacion, (TipoEvento)model.Tipo);
+				if (r.Succeful)
+					return RedirectToAction("Index");
+				ModelState.AddModelError("error", r.ToString());
+			}
+			return View(model);
+		}
+
+	}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/HistoricoController.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,30 @@
+using System.Linq;
+using System.Web.Mvc;
+using AltNetHispano.Agendas.Factories;
+using AltNetHispano.Agendas.Web.Models;
+
+namespace AltNetHispano.Agendas.Web.Controllers
+{
+	public class HistoricoController : Controller
+	{
+		public ActionResult Index()
+		{
+			var agenda = AgendaFactory.GetAgenda();
+
+			var model = new HistoricoIndexModel
+			            	{
+			            		Items = from e in agenda.GetHistorico()
+			            		        orderby e.Fecha
+			            		        select new HistoricoDto
+			            		               	{
+			            		               		Id = e.Id.ToString(),
+			            		               		Titulo = e.Titulo,
+			            		               		Fecha = e.Fecha.HasValue ? e.Fecha.Value.ToShortDateString() : string.Empty,
+			            		               		Wiki = e.UrlWiki,
+													Ponente = e.Ponente.Nombre
+			            		               	}
+			            	};
+			return View(model);
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Controllers/PerfilController.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/PerfilController.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -58,20 +58,18 @@
 				var url = Request.Url.Scheme + "://" + Request.Url.Host +
 						  (Request.Url.Port != 80 ? ":" + Request.Url.Port : string.Empty) + action;
 
-				Response.Redirect(oAuth.AuthorizationLinkGet(url).ToString());
+				return Redirect(oAuth.AuthorizationLinkGet(url).ToString());
 			}
-			else
+			
+			var response = oAuth.AccessTokenGet(Request["oauth_token"], Request["oauth_verifier"]);
+			if (response.Length > 0)
 			{
-				var response = oAuth.AccessTokenGet(Request["oauth_token"], Request["oauth_verifier"]);
-				if (response.Length > 0)
-				{
-					var username =OAuthTwitter.GetResponseContent(response, "screen_name");
+				var username = OAuthTwitter.GetResponseContent(response, "screen_name");
 
-					var personaService = AgendaFactory.GetPersonaService();
+				var personaService = AgendaFactory.GetPersonaService();
 
-					personaService.AddCuenta(IdentityProviderEnum.Twitter, username);
-					return RedirectToAction("Index");
-				}
+				personaService.AddCuenta(IdentityProviderEnum.Twitter, username);
+				return RedirectToAction("Index");
 			}
 			return RedirectToAction("Index");
 		}
--- a/Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs	Fri Jun 24 21:18:21 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-using System;
-using System.Linq;
-using System.Web.Mvc;
-using AltNetHispano.Agendas.Domain;
-using AltNetHispano.Agendas.Factories;
-using AltNetHispano.Agendas.Web.Models;
-
-namespace AltNetHispano.Agendas.Web.Controllers
-{
-	public class PropuestaController : Controller
-	{
-		public ActionResult Index()
-		{
-			var agenda = AgendaFactory.GetAgenda();
-
-			var model = new PropuestaIndexModel
-			            	{
-			            		Propuestas = from e in agenda.GetEventosPropuestos()
-			            		             select
-			            		             	new PropuestaDto
-			            		             		{
-			            		             			Id = e.Id.ToString(),
-			            		             			Titulo = e.Titulo,
-			            		             			Ponente = e.Ponente != null ? e.Ponente.Nombre : string.Empty
-			            		             		}
-			            	};
-
-			return View(model);
-		}
-
-		[Authorize]
-		public ActionResult New()
-		{
-			return View(new PropuestaNewModel());
-		}
-
-		[HttpPost]
-		[Authorize]
-		public ActionResult New(PropuestaNewModel model)
-		{
-			if (ModelState.IsValid)
-			{
-				var agenda = AgendaFactory.GetAgenda();
-
-        var r = agenda.Proponer(model.Titulo, model.Ponente, model.UrlInvitacion, (TipoEvento)model.Tipo);
-				if (r.Succeful)
-					return RedirectToAction("Index");
-				ModelState.AddModelError("error", r.ToString());
-			}
-			return View(model);
-		}
-
-		[Authorize]
-		public ActionResult Edit(string id)
-		{
-			var agenda = AgendaFactory.GetAgenda();
-			var propuesta = agenda.GetEvento(new Guid(id));
-
-			var model = new PropuestaEditModel
-			            	{
-			            		Id = id,
-			            		Titulo = propuesta.Titulo,
-			            		Ponente = propuesta.Ponente != null ? propuesta.Ponente.Nombre : string.Empty,
-			            		UrlInvitacion = propuesta.UrlInvitacion
-			            	};
-			return View(model);
-		}
-
-		[HttpPost]
-		[Authorize]
-		public ActionResult Edit(PropuestaEditModel model)
-		{
-			if (ModelState.IsValid)
-			{
-				var agenda = AgendaFactory.GetAgenda();
-
-				var r = agenda.ModificarPropuesta(new Guid(model.Id), model.Titulo, model.Ponente, model.UrlInvitacion);
-				if (r.Succeful)
-					return RedirectToAction("Index");
-				ModelState.AddModelError("error", r.ToString());
-			}
-			return View(model);
-		}
-	}
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -7,64 +7,87 @@
 namespace AltNetHispano.Agendas.Web.Models
 {
 	public class EventoIndexModel
-  {
-    public IEnumerable<EventoDto> ProximosEventos { get; set; }
-  }
+	{
+		public IEnumerable<EventoDto> ProximosEventos { get; set; }
+	}
 
-  public class EventoNewModel
-  {
-    public EventoNewModel()
-    {
-      Tipos = EventoModelHelper.GetTiposEventos();
-    }
+	public class EventoNewModel
+	{
+		public EventoNewModel()
+		{
+			Tipos = EventoModelHelper.GetTiposEventos();
+		}
 
-    [Required]
-    public int Tipo { get; set; }
+		[Required]
+		public int Tipo { get; set; }
+
+		[Required]
+		public string Titulo { get; set; }
+
+		[Required]
+		public string Ponente { get; set; }
 
-    [Required]
-    public string Titulo { get; set; }
+		[Required]
+		public DateTime Fecha { get; set; }
 
-    [Required]
-    public string Ponente { get; set; }
+		[Url]
+		public string UrlInvitacion { get; set; }
+
+		public IEnumerable<TipoEventoModel> Tipos { get; private set; }
+	}
 
-    [Required]
-    public DateTime Fecha { get; set; }
+	public class TipoEventoModel
+	{
+		public int TipoEvento { get; set; }
+		public string TipoEventoStr { get; set; }
+	}
 
-    [Url]
-    public string UrlInvitacion { get; set; }
-
-    public IEnumerable<TipoEventoModel> Tipos { get; private set; }
-  }
+	public class EventoEditModel
+	{
+		[HiddenInput(DisplayValue = false)]
+		public string Id { get; set; }
 
-  public class TipoEventoModel
-  {
-    public int TipoEvento { get; set; }
-    public string TipoEventoStr { get; set; }
-  }
+		[Required]
+		public string Titulo { get; set; }
+
+		[Required]
+		public string Ponente { get; set; }
+
+		[Required]
+		public DateTime? Fecha { get; set; }
 
-  public class EventoEditModel
-  {
-    [HiddenInput(DisplayValue = false)]
-    public string Id { get; set; }
+		[Url]
+		public string UrlInvitacion { get; set; }
+	}
 
-    [Required]
-    public string Titulo { get; set; }
+	public class EventoAgendarModel
+	{
+		[HiddenInput(DisplayValue = false)]
+		public string Id { get; set; }
+
+		[Required]
+		public string Titulo { get; set; }
 
-    [Required]
-    public string Ponente { get; set; }
+		[Required]
+		public string Ponente { get; set; }
 
-    [Required]
-    public DateTime? Fecha { get; set; }
+		[Required]
+		public DateTime? Fecha { get; set; }
+
+		[Url]
+		public string UrlInvitacion { get; set; }
+	}
 
-    [Url]
-    public string UrlInvitacion { get; set; }
-  }
-
+	public class EventoDto
+	{
+		public string Id { get; set; }
+		public string Titulo { get; set; }
+		public string Estado { get; set; }
+		public string Fecha { get; set; }
 
-  public class EventoDto
-  {
-    public string Id { get; set; }
-    public string Titulo { get; set; }
-    public DateTime Fecha { get; set; }
-  }
+		public bool PuedeAgendar { get; set; }
+		public bool PuedeModificar { get; set; }
+		public bool PuedeConfirmar { get; set; }
+		public bool PuedePublicar { get; set; }
+	}
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Models/HistoricoModel.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+
+namespace AltNetHispano.Agendas.Web.Models
+{
+	public class HistoricoIndexModel
+	{
+		public IEnumerable<HistoricoDto> Items { get; set; }
+	}
+
+	public class HistoricoDto
+	{
+		public string Id { get; set; }
+		public string Titulo { get; set; }
+		public string Fecha { get; set; }
+		public string Wiki { get; set; }
+		public string Ponente { get; set; }
+	}
+
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Fri Jun 24 21:19:42 2011 -0300
@@ -5,51 +5,24 @@
 
 namespace AltNetHispano.Agendas.Web.Models
 {
-  public class PropuestaIndexModel
-  {
-    public IEnumerable<PropuestaDto> Propuestas { get; set; }
-  }
+	public class PropuestaNewModel
+	{
+		public PropuestaNewModel()
+		{
+			Tipos = EventoModelHelper.GetTiposEventos();
+		}
 
-  public class PropuestaNewModel
-  {
-    public PropuestaNewModel()
-    {
-      Tipos = EventoModelHelper.GetTiposEventos();
-    }
-
-    [Required]
-    public int Tipo { get; set; }
-
-    [Required]
-    public string Titulo { get; set; }
-
-    public string Ponente { get; set; }
-
-    [Url]
-    public string UrlInvitacion { get; set; }
+		[Required]
+		public int Tipo { get; set; }
 
-    public IEnumerable<TipoEventoModel> Tipos { get; private set; }
-  }
+		[Required]
+		public string Titulo { get; set; }
 
-  public class PropuestaEditModel
-  {
-    [HiddenInput(DisplayValue = false)]
-    public string Id { get; set; }
-
-    [Required]
-    public string Titulo { get; set; }
-
-    public string Ponente { get; set; }
+		public string Ponente { get; set; }
 
-    [Url]
-    public string UrlInvitacion { get; set; }
-  }
-
+		[Url]
+		public string UrlInvitacion { get; set; }
 
-  public class PropuestaDto
-  {
-    public string Id { get; set; }
-    public string Titulo { get; set; }
-    public string Ponente { get; set; }
-  }
+		public IEnumerable<TipoEventoModel> Tipos { get; private set; }
+	}
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Agendar.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,28 @@
+@model AltNetHispano.Agendas.Web.Models.EventoAgendarModel
+<h2>Agenda</h2>
+<p>
+    Modifique los datos que desea corregir y presione guardar
+</p>
+
+<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+<script type="text/javascript">
+	$(document).ready(function () {
+		$("#Fecha").datepicker({ dateFormat: 'dd-mm-yy' });
+	});
+</script>
+
+@using (Html.BeginForm())
+{
+    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
+    <div>
+        <fieldset>
+            <legend>Datos del evento:</legend>
+            @Html.EditorForModel()
+            <p>
+                <input type="submit" value="Guardar" />
+            </p>
+        </fieldset>
+    </div>
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-@model AltNetHispano.Agendas.Web.Models.EventoEditModel
-<h2>Agenda</h2>
-<p>
-    Modifique los datos que desea corregir y presione guardar
-</p>
-
-<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
-<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
-
-<script type="text/javascript">
-	$(document).ready(function () {
-		$("#Fecha").datepicker({ dateFormat: 'dd-mm-yy' });
-	});
-</script>
-
-@using (Html.BeginForm())
-{
-    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
-    <div>
-        <fieldset>
-            <legend>Datos del evento:</legend>
-            @Html.EditorForModel()
-            <p>
-                <input type="submit" value="Guardar" />
-            </p>
-        </fieldset>
-    </div>
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Evento/Index.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Index.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -8,6 +8,7 @@
         <tr>
             <th>Fecha</th>
             <th>Evento</th>
+            <th>Estado</th>
             <th>Acciones</th>
         </tr>
     </thead>
@@ -15,11 +16,26 @@
         @foreach (var item in Model.ProximosEventos)
         {
         <tr>
-            <td>@item.Fecha.ToShortDateString()</td>
+            <td>@item.Fecha</td>
             <td>@item.Titulo</td>
+            <td>@item.Estado</td>
             <td>
-				@Html.ActionLink("Modificar", "Edit", new { id = item.Id })
-				@Html.ActionLink("Confirmar", "Confirm", new { id = item.Id })
+				@if (item.PuedeAgendar)
+	{
+					@Html.ActionLink("Agendar", "Agendar", "Evento", new { id = item.Id }, null)
+	}
+				@if (item.PuedeModificar)
+	{
+					@Html.ActionLink("Modificar", "Modificar", new { id = item.Id })
+	}
+				@if (item.PuedeConfirmar)
+	{
+					@Html.ActionLink("Confirmar", "Confirmar", new { id = item.Id })
+	}
+				@if (item.PuedePublicar)
+	{
+					@Html.ActionLink("Publicar", "Publicar", new { id = item.Id })
+	}
 			</td>
         </tr>
 		}
@@ -27,5 +43,6 @@
 </table>
     
 <p>
-@Html.ActionLink("Nuevo", "New")
+@Html.ActionLink("Nuevo", "Nuevo")
+@Html.ActionLink("Proponer", "Proponer")
 </p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Modificar.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,28 @@
+@model AltNetHispano.Agendas.Web.Models.EventoEditModel
+<h2>Agenda</h2>
+<p>
+    Modifique los datos que desea corregir y presione guardar
+</p>
+
+<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+<script type="text/javascript">
+	$(document).ready(function () {
+		$("#Fecha").datepicker({ dateFormat: 'dd-mm-yy' });
+	});
+</script>
+
+@using (Html.BeginForm())
+{
+    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
+    <div>
+        <fieldset>
+            <legend>Datos del evento:</legend>
+            @Html.EditorForModel()
+            <p>
+                <input type="submit" value="Guardar" />
+            </p>
+        </fieldset>
+    </div>
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Evento/New.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-@model AltNetHispano.Agendas.Web.Models.EventoNewModel
-<h2>Agenda</h2>
-<p>
-    Complete los siguiente datos para agendar un nuevo evento
-</p>
-
-<link href="@Url.Content("~/Content/themes/base/jquery-ui.css")" rel="stylesheet" type="text/css" />
-<script src="@Url.Content("~/Scripts/jquery-ui.js")" type="text/javascript"></script>
-
-<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
-<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
-
-<script type="text/javascript">
-	$(document).ready(function () {
-		$("#Fecha").datepicker({ dateFormat: 'dd-mm-yy' });
-	});
-</script>
-
-@using (Html.BeginForm())
-{
-    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
-    <div>
-        <fieldset>
-            <legend>Datos del evento:</legend>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.Tipo)
-            </div>
-            <div class="editor-field">
-              @Html.DropDownListFor(model => model.Tipo, new SelectList(Model.Tipos, "TipoEvento", "TipoEventoStr"))
-              @Html.ValidationMessageFor(model => model.Tipo)
-            </div>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.Titulo)
-            </div>
-            <div class="editor-field">
-              @Html.EditorFor(model=>model.Titulo)
-              @Html.ValidationMessageFor(model => model.Titulo)
-            </div>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.Ponente)
-            </div>
-            <div class="editor-field">
-              @Html.EditorFor(model=>model.Ponente)
-              @Html.ValidationMessageFor(model => model.Ponente)
-            </div>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.Fecha)
-            </div>
-            <div class="editor-field">
-              @Html.EditorFor(model=>model.Fecha)
-              @Html.ValidationMessageFor(model => model.Fecha)
-            </div>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.UrlInvitacion)
-            </div>
-            <div class="editor-field">
-              @Html.EditorFor(model => model.UrlInvitacion)
-              @Html.ValidationMessageFor(model => model.UrlInvitacion)
-            </div>
-
-            <p>
-                <input type="submit" value="Guardar" />
-            </p>
-        </fieldset>
-    </div>
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Nuevo.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,71 @@
+@model AltNetHispano.Agendas.Web.Models.EventoNewModel
+<h2>Agenda</h2>
+<p>
+    Complete los siguiente datos para agendar un nuevo evento
+</p>
+
+<link href="@Url.Content("~/Content/themes/base/jquery-ui.css")" rel="stylesheet" type="text/css" />
+<script src="@Url.Content("~/Scripts/jquery-ui.js")" type="text/javascript"></script>
+
+<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+<script type="text/javascript">
+	$(document).ready(function () {
+		$("#Fecha").datepicker({ dateFormat: 'dd-mm-yy' });
+	});
+</script>
+
+@using (Html.BeginForm())
+{
+    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
+    <div>
+        <fieldset>
+            <legend>Datos del evento:</legend>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.Tipo)
+            </div>
+            <div class="editor-field">
+              @Html.DropDownListFor(model => model.Tipo, new SelectList(Model.Tipos, "TipoEvento", "TipoEventoStr"))
+              @Html.ValidationMessageFor(model => model.Tipo)
+            </div>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.Titulo)
+            </div>
+            <div class="editor-field">
+              @Html.EditorFor(model=>model.Titulo)
+              @Html.ValidationMessageFor(model => model.Titulo)
+            </div>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.Ponente)
+            </div>
+            <div class="editor-field">
+              @Html.EditorFor(model=>model.Ponente)
+              @Html.ValidationMessageFor(model => model.Ponente)
+            </div>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.Fecha)
+            </div>
+            <div class="editor-field">
+              @Html.EditorFor(model=>model.Fecha)
+              @Html.ValidationMessageFor(model => model.Fecha)
+            </div>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.UrlInvitacion)
+            </div>
+            <div class="editor-field">
+              @Html.EditorFor(model => model.UrlInvitacion)
+              @Html.ValidationMessageFor(model => model.UrlInvitacion)
+            </div>
+
+            <p>
+                <input type="submit" value="Guardar" />
+            </p>
+        </fieldset>
+    </div>
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Proponer.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,54 @@
+@model AltNetHispano.Agendas.Web.Models.PropuestaNewModel
+<h2>Agenda</h2>
+<p>
+    Complete los siguiente datos para proponer un nuevo tema
+</p>
+
+<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+@using (Html.BeginForm())
+{
+    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
+    <div>
+        <fieldset>
+            <legend>Datos de la propuesta:</legend>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.Tipo)
+            </div>
+            <div class="editor-field">
+              @Html.DropDownListFor(model => model.Tipo, new SelectList(Model.Tipos, "TipoEvento", "TipoEventoStr"))
+              @Html.ValidationMessageFor(model => model.Tipo)
+            </div>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.Titulo)
+            </div>
+            <div class="editor-field">
+              @Html.EditorFor(model=>model.Titulo)
+              @Html.ValidationMessageFor(model => model.Titulo)
+            </div>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.Ponente)
+            </div>
+            <div class="editor-field">
+              @Html.EditorFor(model=>model.Ponente)
+              @Html.ValidationMessageFor(model => model.Ponente)
+            </div>
+
+            <div class="editor-label">
+              @Html.LabelFor(model=>model.UrlInvitacion)
+            </div>
+            <div class="editor-field">
+              @Html.EditorFor(model => model.UrlInvitacion)
+              @Html.ValidationMessageFor(model => model.UrlInvitacion)
+            </div>
+
+            <p>
+                <input type="submit" value="Guardar" />
+            </p>
+        </fieldset>
+    </div>
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Historico/Index.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,26 @@
+@model AltNetHispano.Agendas.Web.Models.HistoricoIndexModel
+<h2>Histórico</h2>
+<p>
+    Eventos ya realizados:
+</p>
+<table>
+    <thead>
+        <tr>
+            <th>Fecha</th>
+            <th>Evento</th>
+            <th>Ponente</th>
+            <th>Wiki</th>
+        </tr>
+    </thead>
+    <tbody>
+        @foreach (var item in Model.Items)
+        {
+        <tr>
+            <td>@item.Fecha</td>
+            <td>@item.Titulo</td>
+            <td>@item.Ponente</td>
+            <td>@item.Wiki</td>
+        </tr>
+		}
+    </tbody>
+</table>
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Perfil/Index.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Perfil/Index.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -28,5 +28,7 @@
 <p>
 @Html.ActionLink("Asociar cuenta de Twitter", "AddTwitterAccount")
 <br/>
-@Html.ActionLink("Asociar cuenta interna", "AddBuiltInAccount")
+@Html.ActionLink("Asociar cuenta de interna", "AddBuiltInAccount")
+<br/>
+@Html.ActionLink("Crear cuenta interna asociada", "Register", "Account", new { returnUrl = Url.Action("Index") }, null)
 </p>
--- a/Agendas/trunk/src/Agendas.Web/Views/Propuesta/Edit.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-@model AltNetHispano.Agendas.Web.Models.PropuestaEditModel
-<h2>Propuestas</h2>
-<p>
-    Modifique los datos que desea corregir y presione guardar
-</p>
-
-<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
-<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
-
-@using (Html.BeginForm())
-{
-    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
-    <div>
-        <fieldset>
-            <legend>Datos de la propuesta:</legend>
-            @Html.EditorForModel()
-            <p>
-                <input type="submit" value="Guardar" />
-            </p>
-        </fieldset>
-    </div>
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Propuesta/Index.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-@model AltNetHispano.Agendas.Web.Models.PropuestaIndexModel
-<h2>Propuestas</h2>
-<p>
-    Temas propuestos aun no agendados
-</p>
-<table>
-    <thead>
-        <tr>
-            <th>Propuesta</th>
-            <th>Ponente</th>
-            <th>Acciones</th>
-        </tr>
-    </thead>
-    <tbody>
-        @foreach (var item in Model.Propuestas)
-        {
-        <tr>
-            <td>@item.Titulo</td>
-            <td>@item.Ponente</td>
-            <td>
-				@Html.ActionLink("Modificar", "Edit", new { id = item.Id })
-				@Html.ActionLink("Agendar", "Edit", "Evento", new { id = item.Id }, null)
-			</td>
-        </tr>
-        }
-    </tbody>
-</table>
-
-<p>
-@Html.ActionLink("Nueva", "New")
-</p>
--- a/Agendas/trunk/src/Agendas.Web/Views/Propuesta/New.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-@model AltNetHispano.Agendas.Web.Models.PropuestaNewModel
-<h2>Agenda</h2>
-<p>
-    Complete los siguiente datos para proponer un nuevo tema
-</p>
-
-<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
-<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
-
-@using (Html.BeginForm())
-{
-    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
-    <div>
-        <fieldset>
-            <legend>Datos de la propuesta:</legend>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.Tipo)
-            </div>
-            <div class="editor-field">
-              @Html.DropDownListFor(model => model.Tipo, new SelectList(Model.Tipos, "TipoEvento", "TipoEventoStr"))
-              @Html.ValidationMessageFor(model => model.Tipo)
-            </div>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.Titulo)
-            </div>
-            <div class="editor-field">
-              @Html.EditorFor(model=>model.Titulo)
-              @Html.ValidationMessageFor(model => model.Titulo)
-            </div>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.Ponente)
-            </div>
-            <div class="editor-field">
-              @Html.EditorFor(model=>model.Ponente)
-              @Html.ValidationMessageFor(model => model.Ponente)
-            </div>
-
-            <div class="editor-label">
-              @Html.LabelFor(model=>model.UrlInvitacion)
-            </div>
-            <div class="editor-field">
-              @Html.EditorFor(model => model.UrlInvitacion)
-              @Html.ValidationMessageFor(model => model.UrlInvitacion)
-            </div>
-
-            <p>
-                <input type="submit" value="Guardar" />
-            </p>
-        </fieldset>
-    </div>
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/_Layout.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_Layout.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -3,10 +3,19 @@
 <head>
     <title>Gestión de VANs</title>
     <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
+    <link href="@Url.Content("~/Content/AltNetHispanoVans.css")" rel="stylesheet" type="text/css" />
     <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
 
 	<link href="@Url.Content("~/Content/themes/base/jquery-ui.css")" rel="stylesheet" type="text/css" />
 	<script src="@Url.Content("~/Scripts/jquery-ui.js")" type="text/javascript"></script>
+
+    <script type="text/javascript">
+    	$(document).ready(function () {
+    		$(".errorbox").addClass("ui-state-error ui-corner-all");
+    		$(".warningbox").addClass("ui-state-highlight ui-corner-all");
+    		$(".notificationbox").addClass("ui-corner-all");
+    	});
+	</script>
 </head>
 
 <body>
@@ -26,6 +35,7 @@
         </div>
 
         <div id="main">
+			@Html.Partial("_Messages")
 			<div class="logo">
 				<img alt="logo" src="@Url.Content("~/Content/altnetlogo.png")" />
 			</div>
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/_Menu.cshtml	Fri Jun 24 21:18:21 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_Menu.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -1,8 +1,7 @@
 <ul id="menu">
     <li>@Html.ActionLink("Home", "Index", "Home")</li>
-    <li>@Html.ActionLink("Propuestas", "Index", "Propuesta")</li>
     <li>@Html.ActionLink("Eventos", "Index", "Evento")</li>
-    <li>@Html.ActionLink("Histórico", "Index", "Histórico")</li>
+    <li>@Html.ActionLink("Histórico", "Index", "Historico")</li>
 @if (Request.IsAuthenticated)
 {
     <li>@Html.ActionLink("Perfil", "Index", "Perfil")</li>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_Messages.cshtml	Fri Jun 24 21:19:42 2011 -0300
@@ -0,0 +1,12 @@
+@if (TempData.ContainsKey("error"))
+{
+	<div class="errorbox"><label>@TempData["error"]</label></div>
+}
+@if (TempData.ContainsKey("warning"))
+{
+	<div class="warningbox"><label>@TempData["warning"]</label></div>
+}
+@if (TempData.ContainsKey("notification"))
+{
+	<div class="notificationbox"><label>@TempData["notification"]</label></div>
+}
\ No newline at end of file