private eventOverallValues sessionSummary(List<uniqueEventValues> sessionList)
        {
            eventOverallValues sessionValues = new eventOverallValues();

            bool    firstEntry      = true;
            double[] oldPosition    = new double[3];

            List<int> uniqueBiomeValues         = new List<int>();

            //parse data for each entry
            foreach (var value in sessionList)
            {
                uniqueEventValues dataPoint = new uniqueEventValues();
                dataPoint = value;

                if (dataPoint.type < 10)
                {
                    sessionValues.numberEvents++;

                    //generate list of unique biomes
                    if (!uniqueBiomeValues.Contains(dataPoint.biome))
                        uniqueBiomeValues.Add(dataPoint.biome);

                    //info to calculate total time
                    if(dataPoint.deltaTime > 0) sessionValues.sessionLenght += dataPoint.deltaTime;

                    //events position
                    double[] position = new double[3] { dataPoint.x, dataPoint.y, dataPoint.z };

                    //calculate distance between positions
                    if (!firstEntry)
                    {
                        sessionValues.traveledDistance += Math.Sqrt((position[0] - oldPosition[0]) * (position[0] - oldPosition[0]) +
                                                                    (position[1] - oldPosition[1]) * (position[1] - oldPosition[1]) +
                                                                    (position[2] - oldPosition[2]) * (position[2] - oldPosition[2]));
                    }
                    else
                    {
                        sessionValues.playerName = dataPoint.name;
                        sessionValues.sessionID = dataPoint.sessionID;
                        firstEntry = false;
                    }

                    oldPosition[0] = position[0];
                    oldPosition[1] = position[1];
                    oldPosition[2] = position[2];

                    //Populate all the lists according to actions ID
                    //0 session id, 1 player name, 2 action ID, 3 date, 4 deltaTime, 5 sub action, 6 unique value, 7 biome, 8 x, 9 y, 10 z
                    if (dataPoint.type == 1) { sessionValues.miningEvents++; }
                    if (dataPoint.type == 2) { sessionValues.buildingEvents++; }
                    if (dataPoint.type == 3) { sessionValues.harvestingEvents++; }
                    if (dataPoint.type == 4) { sessionValues.craftingEvents++; }
                    if (dataPoint.type == 5) { sessionValues.farmingEvents++; }
                    if (dataPoint.type == 6) { sessionValues.exploringEvents++; }
                    if (dataPoint.type == 7) { sessionValues.deathsEvents++; }
                    if (dataPoint.type == 8)
                    {
                        if (dataPoint.subAction == "Fight") { sessionValues.fightEvents++; }
                        else { sessionValues.huntEvents++; }
                    }
                    if (dataPoint.type == 9) { sessionValues.consumableEvents++; }
                }
            }

            sessionValues.uniqueBiomes = uniqueBiomeValues.Count();
            sessionValues.sessionLenght /= 10000;
            sessionValues.traveledDistance /= 10;

            return sessionValues;
        }
        //Display session(s) statistcs on viewer according to session ID. -1 all sessions.
        private void displayAllSessionsOnViewer(int sessionID)
        {
            List<string> miningEquipment = new List<string>();
            List<string> minedMaterials = new List<string>();
            List<string> buildingMaterials = new List<string>();
            List<string> harvestingEquipment = new List<string>();
            List<string> harvestedObj = new List<string>();
            List<string> craftedObjects = new List<string>();
            List<string> plantedSeeds = new List<string>();
            List<string> deathEvents = new List<string>();
            List<string> huntedPlayers = new List<string>();
            List<string> huntedCreatures = new List<string>();
            List<string> consumedCateg = new List<string>();
            List<string> consumedObj = new List<string>();

            int exploringEvents = 0;
            int deathsByStarve = 0;
            int deathsByHealth = 0;
            string playerName = "";
            int sID = 0;

            emptyData();

            foreach (var subList in allEventsBySessions)
            {
                foreach(var a in subList)
                {
                    uniqueEventValues dataPoint = new uniqueEventValues();
                    dataPoint = a;

                    //add to list only the selected sessionID or all if session ID == -1
                    if (dataPoint.sessionID == sessionID || sessionID == -1)
                    {
                        playerName = dataPoint.name;
                        sID = dataPoint.sessionID;

                        //Populate all the lists according to actions ID
                        if (dataPoint.type == 1)
                        {
                            miningEquipment.Add(dataPoint.subAction);
                            minedMaterials.Add(dataPoint.uniqueValue);
                        }
                        if (dataPoint.type == 2)
                        {
                            buildingMaterials.Add(dataPoint.uniqueValue);
                        }
                        if (dataPoint.type == 3)
                        {
                            harvestingEquipment.Add(dataPoint.subAction);
                            harvestedObj.Add(dataPoint.uniqueValue);
                        }
                        if (dataPoint.type == 4)
                        {
                            craftedObjects.Add(dataPoint.uniqueValue);
                        }
                        if (dataPoint.type == 5)
                        {
                            plantedSeeds.Add(dataPoint.uniqueValue);
                        }
                        if (dataPoint.type == 6)
                        {
                            exploringEvents++;
                        }
                        if (dataPoint.type == 7)
                        {
                            deathEvents.Add(dataPoint.uniqueValue);
                            if (dataPoint.subAction == "Starved") deathsByStarve++;
                            else deathsByHealth++;
                        }
                        if (dataPoint.type == 8)
                        {
                            if (dataPoint.subAction == "Fight") { huntedPlayers.Add(dataPoint.uniqueValue); }
                            else { huntedCreatures.Add(dataPoint.uniqueValue); }
                        }
                        if (dataPoint.type == 9)
                        {
                            consumedCateg.Add(dataPoint.subAction);
                            consumedObj.Add(dataPoint.uniqueValue);
                        }
                    }
                }
            }

            //call function to order and print lists
            printListsScreen(minedMaterials, lbMinMat, tbTotalMinedMat);
            printListsScreen(miningEquipment, lbMinEquip, tbTotalMinEquip);
            printListsScreen(harvestedObj, lbHarvObj, tbTotalHavObj);
            printListsScreen(harvestingEquipment, lbHarvEquip, tbTotalHavEquip);
            printListsScreen(buildingMaterials, lbBuildMat, tbTotalBuildMat);
            printListsScreen(craftedObjects, lbCraftObj, tbTotalCrafted);
            printListsScreen(huntedCreatures, lbHunted, tbTotalHunted);
            printListsScreen(plantedSeeds, lbPlantedSeed, tbTotalPlanted);
            printListsScreen(consumedCateg, lbConsumCat, tbTotalConCat);
            printListsScreen(consumedObj, lbConsumObj, tbTotalConObj);
            printListsScreen(huntedPlayers, lbHuntedPlayers, tbTotalHuntedPlayers);

            //fill status values
            //int uniqueBiomes = uniqueBiomeValues.Count;
            //tbUniqueBiomes.Text = uniqueBiomes.ToString();

            //tbSessionLenght.Text = sessionLenght.ToString();
            //tbTraveledDist.Text = distance.ToString();
            //tbAvgWalkSpeed.Text = (distance / sessionLenght).ToString();

            if (sessionID == -1)
            {
                tbPlayerName.Text = "all";
                tbSessionID.Text = "all";
            }
            else
            {
                tbPlayerName.Text = playerName;
                tbSessionID.Text = sID.ToString();
            }

            tbExploringTotal.Text = exploringEvents.ToString();
            tbDeathHealth.Text = deathsByHealth.ToString();
            tbDeathStarved.Text = deathsByStarve.ToString();
        }
        //analyze all events at file loaded using analyzeFile() and add them to lists based on their unique IDs
        private void parseInputBySession()
        {        
            //get the file, create a list AllEntriesList with all entries by line 
            string[] dataEntries = analyzeFile();

            //calculate the number of unique sessions
            int oldSessionID = -1;
            int numberOfSessions = 0;

            for(int i = 0 ; i < dataEntries.Length - 1 ; i++)
            {
                string[] dataPoint = dataEntries[i].Split(delimiterChars);
                if (System.Convert.ToInt16(dataPoint[0]) != oldSessionID)
                {
                    numberOfSessions++;
                    oldSessionID = System.Convert.ToInt16(dataPoint[0]);
                }
            }

            //all this crazy stuff is just to remove marcelo_SR1 from the events without chaging their IDs =/
            int[] correctSessionIDs = new int[numberOfSessions+1];
            int counter = 0;

            for (int i = 0; i < dataEntries.Length; i++)
            {
                string[] dataPoint = dataEntries[i].Split(delimiterChars);
                correctSessionIDs[counter] = System.Convert.ToInt16(dataPoint[0]);
                if (System.Convert.ToInt16(dataPoint[0]) != oldSessionID)
                {
                    counter++;
                    oldSessionID = System.Convert.ToInt16(dataPoint[0]);
                }
            }

            for (int i = 0; i < numberOfSessions; i++)
            {
                List<uniqueEventValues> thisSessionEvents = new List<uniqueEventValues>();

                for (int j = 0; j < dataEntries.Length; j++)
                {
                    string[] dataPoint = dataEntries[j].Split(delimiterChars);

                    if (System.Convert.ToInt16(dataPoint[0]) == correctSessionIDs[i])
                    {
                        oldSessionID = System.Convert.ToInt16(dataPoint[0]);
                        uniqueEventValues a = new uniqueEventValues();
                        a.sessionID = System.Convert.ToInt16(dataPoint[0]);
                        a.name = dataPoint[1];
                        a.type = System.Convert.ToInt16(dataPoint[2]);
                        a.date = dataPoint[3];
                        if (a.type <= 9)
                        {
                            a.deltaTime = System.Convert.ToDouble(dataPoint[4]);
                            a.subAction = dataPoint[5];
                            a.uniqueValue = dataPoint[6];
                            a.biome = System.Convert.ToInt16(dataPoint[7]);
                            a.x = System.Convert.ToDouble(dataPoint[8]);
                            a.y = System.Convert.ToDouble(dataPoint[9]);
                            a.z = System.Convert.ToDouble(dataPoint[10]);
                        }                      
                        thisSessionEvents.Add(a);                        
                    }
                }
                allEventsBySessions.Add(thisSessionEvents);
            }

            outputMessageToUser("Import successful. There were " + dataEntries.Length + " events in " + numberOfSessions + " unique sessions");
        }