public override void ProcessRequest( HttpContextBase context )
        {
            HttpRequestBase request = context.Request;
            var sDate = request.QueryString["s"];
            var uId = request.QueryString["u"];
            var st = request.QueryString["st"];
            HttpResponseBase response = context.Response;

            Guid userId;
            DateTime showDate;
            int status = 0;
            bool success = false;
            string final;
            bool displayAttended = false;
            int displayStatus = 0;

            //Get the show date, user id, and status from the request and parse them into concrete types
            if ( !( DateTime.TryParse( sDate, out showDate ) && Guid.TryParse( uId, out userId ) && int.TryParse( st, out status ) ) ) {
                return;
            }

            var listenedShowService = Ioc.GetInstance<IListenedShowService>(); ;
            var showService = new ShowService( Ioc.GetInstance<IShowRepository>() );

            var show = showService.GetShow( showDate );

            //see if the user has an entry for this show yet
            var listenedShow = listenedShowService.GetByUserAndShowId( userId, show.Id );
            //Setup the JSON Builder
            var jsonifier = new BasicJSONifier( "records", "Question", "Answer" );

            //If status is EditNotes don't do anything and just get out of here
            if ( status == (int)ListenedStatus.EditNotes ) return;

            try {

                //If the user has one then update it
                if ( listenedShow != null ) {

                    //if ( status != (int)ListenedStatus.EditNotes ) {
                    using ( IUnitOfWork uow = UnitOfWork.Begin() ) {

                        if ( status != (int)ListenedStatus.Attended ) {
                            var prevStatus = listenedShow.Status;

                            if ( status == (int)ListenedStatus.EditNotes ) status = prevStatus;

                            listenedShow.Status = status;
                            listenedShow.UpdatedDate = Constants.Now();

                            //For display purposes on Main.
                            displayAttended = listenedShow.Attended;
                            //This needs to be here because if edit notes is the status we need to make sure we take the previous status
                            displayStatus = status;

                            writer.Write( string.Format( "Updating listenedShow with Id:{0}, from the status: {1}, to the status: {2}", listenedShow.Id, prevStatus, status ) );

                        }
                        else {
                            //What it was before, make it the opposite
                            listenedShow.Attended = !listenedShow.Attended;
                            listenedShow.UpdatedDate = Constants.Now();

                            //For display purposes on Main.
                            displayAttended = listenedShow.Attended;
                            //This needs to be here b/c we don't know what old status was otherwise
                            displayStatus = listenedShow.Status;

                            writer.Write( "Updating listenedShow with Id:" + listenedShow.Id + "with Attended = " + !listenedShow.Attended );
                        }

                        uow.Commit();
                        success = true;
                        writer.Write( "Successfully updated listenedShow id: " + listenedShow.Id );
                    }
                    //}
                }
                else {
                    //If the user does not have one then create it
                    var objectFactory = Ioc.GetInstance<IDomainObjectFactory>();

                    bool attended;
                    if ( status == (int)ListenedStatus.Attended ) {
                        attended = true;
                    }
                    else {
                        attended = false;
                    }

                    var newListenedShow = objectFactory.CreateListenedShow( show.Id, userId, show.ShowDate.Value, status, string.Empty, attended );
                    displayAttended = attended;
                    displayStatus = status;

                    writer.Write( string.Format( "Saving a new listenedShow with Id:{0} with a status of {1}, and attended is {2}", newListenedShow.Id, status, attended ) );

                    listenedShowService.SaveCommit( newListenedShow, out success );

                    if ( success ) writer.Write( "Successfully saved the new listenedShow with id: " + newListenedShow.Id );
                }

            }
            catch ( Exception ex ) {
                writer.WriteFatal( "There was an error saving a listenedShow. The exception is: " + ex.Message );
                success = false;
            }

            if ( success ) {
                jsonifier.Add( "success", "true" );
                jsonifier.Add( "attended", displayAttended.ToString() );
                jsonifier.Add( "status", displayStatus.ToString() );
            }
            else {
                jsonifier.Add( "success", "false" );
            }

            final = jsonifier.GetFinalizedJSON();

            response.ContentType = "application/json";
            response.ContentEncoding = Encoding.UTF8;
            response.Write( final );
            response.End();
        }
        private void Bind()
        {
            DateTime showDate;
            Guid showId;

            var showService = new ShowService( Ioc.GetInstance<IShowRepository>() );

            IShow show = null;

            var segment = Request.GetFriendlyUrlSegments().FirstOrDefault();

            //Check to see if the show date or show id is passed in then get the IShow for that show
            if ( DateTime.TryParse( segment, out showDate ) ) {
                show = showService.GetShow( showDate );
            }
            else if ( Guid.TryParse( segment, out showId ) ) {
                show = showService.GetShow( showId );
            }

            //If it is not a valid show then get out of here
            if ( show == null ) Response.Redirect( LinkBuilder.DefaultMainLink() );

            hdnShowId.Value = show.Id.ToString();

            lnkPhishShows.NavigateUrl = GetPhishowsLink( showDate );
            lnkPhishTracks.NavigateUrl = GetPhishTracksLink( showDate );

            //Get the user Id and Bind the notes and tags
            BindNotes( show );
            BindTags( show.Id );
            BindListenedShow( show );
            BindSetlist( show.ShowDate.Value );
        }