//private int SessionIndexPlaying = -1;

        private void StartPlayer(int index)
        {
            //SessionIndexPlaying = index;
            StartIndex   = index;
            CurrentIndex = index;
            CurrentState = EventsState.Playing;

            var lst = SessionElementOrderedList[CurrentIndex];

            Sessions.ForEach(x => x.State = SessionState.WaitingForStartingElement);
            foreach (var sessionElement in lst.Where(x => IsValidStartingEvent(x))) //TODO: Check if sessionElements are able to start
            {
                sessionElement.Session.State = SessionState.Playing;
                sessionElement.State         = SessionElementState.Playing;

                var logElementDTO = OnLoadLogElement?.Invoke(sessionElement);
                if (logElementDTO != null)
                {
                    sessionElement.LogElementInfo.GUID = logElementDTO.GUID;
                    var playElementResponse = OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: true);
                    if (playElementResponse == PlayElementResponse.WaitingToBeExecuted)
                    {
                        sessionElement.State = SessionElementState.WaitingToTestIfCalledAutomatically;
                        var t = new Thread(() => WaitForSessionElementToBeCalledAutomatically(logElementDTO));
                        t.IsBackground = true;
                        t.Start();
                    }
                }
            }
        }
        private NewEvent StartNewEventsIfPossible() //REMEMBER ONLY START CLIENTSIDE EVENTS!!! Serverside-events should have time to be executed before doing anything else... Denne metode sender blot information videre via OnPlayElement-eventet, som sørger for ikke at starte eventet hvis det er serverside
        {
            var lst = SessionElementOrderedList[CurrentIndex];

            if (lst.Any(x => x.State == SessionElementState.Playing))
            {
                return(NewEvent.WaitingForOtherClientEvents); //Still waiting for at least one element to complete
            }
            CurrentIndex++;
            if (SessionElementOrderedList.Count <= CurrentIndex)
            {
                return(NewEvent.None); //Completed everything!
            }
            var newEvent = NewEvent.None;

            lst = SessionElementOrderedList[CurrentIndex];
            foreach (var sessionElement in lst.Where(x => x.Session.State == SessionState.Playing || x.Session.State == SessionState.WaitingForStartingElement && IsValidStartingEvent(x)))
            {
                //if (LogTypeHelper.IsClientsideEvent(sessionElement.LogElementInfo.LogType))
                //{}

                sessionElement.Session.State = SessionState.Playing;
                sessionElement.State         = SessionElementState.Playing;
                var logElementDTO = OnLoadLogElement?.Invoke(sessionElement);
                if (logElementDTO != null)
                {
                    sessionElement.LogElementInfo.GUID = logElementDTO.GUID;
                    var playElementResponse = OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: true);

                    if (playElementResponse == PlayElementResponse.WaitingToBeExecuted)
                    {
                        //Hmm, noget er galt her... for den ovenstående foreach udfører alt for mange sessionElements på én gang... noget kalder BrowserJobComplete/done for events der overhovedet ikke er færdige????
                        sessionElement.State = SessionElementState.WaitingToTestIfCalledAutomatically;
                        var t = new Thread(() => WaitForSessionElementToBeCalledAutomatically(logElementDTO));
                        t.IsBackground = true;
                        t.Start();
                        newEvent = NewEvent.WaitingForServerEvents;
                    }
                    else
                    {
                        newEvent = NewEvent.StartedAtLeastOne;
                    }
                }
            }

            return(newEvent);
        }
        public FetchLogElementResponse FetchLogElement(Guid?sessionGUID, Guid?pageGUID, LogType logType, string handlerUrl = null, int?currentIndex = null)
        {
            currentIndex = currentIndex ?? CurrentIndex;

            if (SessionElementOrderedList.Count <= currentIndex.Value)
            {
                return new FetchLogElementResponse()
                       {
                           Type = FetchLogElementResponseType.NoMore
                       }
            }
            ;

            var lst = SessionElementOrderedList[currentIndex.Value];

            LRAPSessionElement sessionElement = null;

            if (sessionGUID.HasValue)
            {
                sessionElement = lst.FirstOrDefault(x => x.Session.GUID.Equals(sessionGUID));
            }
            if (sessionElement == null && pageGUID.HasValue)
            {
                sessionElement = lst.FirstOrDefault(x => x.LogElementInfo.PageGUID.Equals(pageGUID));
            }
            sessionElement = sessionElement ?? lst.First() /*Only one session is supported atm*/; //Skal være på samme linie som denne.. eller de efterfølgende "bundlede" events er ikke nødvendigvis på samme index

            switch (sessionElement.State)
            {
            case SessionElementState.Played:
                //Look at the next event if it matches the LogType for the current PageGUID
                return(FetchLogElement(sessionGUID, pageGUID, logType, handlerUrl, currentIndex.Value + 1));

            case SessionElementState.WaitingToTestIfCalledAutomatically:
            case SessionElementState.Playing:
                if (sessionElement.LogElementInfo.LogType == logType)
                {
                    var logElementDTO = OnLoadLogElement?.Invoke(sessionElement);

                    //"Element":"/TestHandler.ashx?request=%7B%22SomeValue%22%3A%22andersand%22%7D"
                    if (handlerUrl != null && logElementDTO.Element != handlerUrl)
                    {
                        throw new Exception($"LogType({logType}) was located, but with invalid url ({logElementDTO.Element}), should have been ({handlerUrl})");
                    }

                    sessionElement.LogElementInfo.GUID = logElementDTO.GUID;
                    return(new FetchLogElementResponse()
                    {
                        Type = FetchLogElementResponseType.OK, LogElementDTO = logElementDTO
                    });
                }
                return(new FetchLogElementResponse()
                {
                    Type = FetchLogElementResponseType.IncorrectLogType
                });

            //throw new Exception("Shouldn't happen, unless the running events are in a different order now");
            case SessionElementState.Waiting:
                throw new Exception("Shouldn't happen");

            default:
                throw new NotImplementedException();
            }
        }