public string DTMatrix() { string strDiffTerrCombi = "Difficulty / Terrain combination"; string strDifficulty = "Difficulty"; string strTerrain = "Terrain"; RegisterText(new string[]{ strDiffTerrCombi, strDifficulty, strTerrain }); Layout skin = new Layout(1); Layout.Statistics stats = new Layout.Statistics(Translate(strDiffTerrCombi, false)); skin.StatisticsBlocks[0] = stats; stats.Width = "60%"; stats.Align = "center"; stats.AxisLabelX = Translate(strTerrain, false); stats.AxisLabelY = Translate(strDifficulty, false); Layout.Statistics.Row row = new Layout.Statistics.Row(); stats.Rows.Add(row); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = " "; for (double d = 1; d < 5.1; d += 0.5) { row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = d.ToString("0.#"); row.Items[row.Items.Count - 1].Width = "10%"; row.Items[row.Items.Count - 1].Align = "center"; row.Items[row.Items.Count - 1].IsMarker = true; } for (double d = 1; d < 5.1; d += 0.5) { row = new Layout.Statistics.Row(); stats.Rows.Add(row); string sd = d.ToString("0.#"); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = d.ToString("0.#"); row.Items[row.Items.Count - 1].Width = "10%"; row.Items[row.Items.Count - 1].Align = "center"; row.Items[row.Items.Count - 1].IsMarker = true; for (double t = 1; t < 5.1; t += 0.5) { string st = t.ToString("0.#"); int cnt = (from mf in _myFinds where mf.gc.Difficulty.ToString("0.#") == sd && mf.gc.Terrain.ToString("0.#") == st select mf).Count(); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = cnt.ToString(); row.Items[row.Items.Count - 1].Width = "10%"; row.Items[row.Items.Count - 1].Align = "center"; } } return stats.ToString(); }
private string totalFoundsPerMonthGraph() { string strTotalPerMonth = "Total founds per month"; RegisterText(new string[]{ strTotalPerMonth }); Layout skin = new Layout(1); Layout.Statistics stats = new Layout.Statistics(Translate(strTotalPerMonth, false)); skin.StatisticsBlocks[0] = stats; stats.Rows.Add(new Layout.Statistics.Row()); stats.Rows[0].Items.Add(new Layout.Statistics.Item()); //graph //http://chart.apis.google.com/chart?cht=lxy&chs=740x300&chf=bg,s,FFF4F4&chxt=r,x,y&chxr=0,0,2693|2,0,1612&chxs=0,0000FF|2,FF0000&chd=e:__,BIDKE5GPG3KGMPPnS3YKbcfxiijhl8potKxB0V82.-,AADMGZJmMz,B5FRILKcLe,MzP.TMWZZmcyf.jMmZplsyv.zM,AAFZI-OmUCc5iXpmuPv3z66E..,zM2Y5l8y..,AAGbL.aMfb&chxl=1:|2010|||||2011||||||||||||2012|||&chco=0000ff,ff0000,ff0000,ff0000&chm=B,76A4FBB0,0,0,0|v,6060FF,0,4,1.0|v,6060FF,0,16,1.0&chg=0,6.2&chls=2,1,0|2,2,4|2,2,4|2,2,4 Dictionary<string, string> pars = new Dictionary<string, string>(); //fixed (data independant) pars.Add("cht", "ls"); pars.Add("chs", "740x300"); pars.Add("chf", "bg,s,FFF4F4"); pars.Add("chxt", "r,x,y"); pars.Add("chxs", "0,0000FF|2,FF0000"); pars.Add("chco", "0000ff,ff0000,ff0000,ff0000"); pars.Add("chm", "B,76A4FBB0,0,0,0|v,6060FF,0,4,1.0|v,6060FF,0,16,1.0"); pars.Add("chg", "0,6.2"); pars.Add("chls", "2,1,0|2,2,4|2,2,4|2,2,4"); pars.Add("chds", "a"); //pars.Add("chdl", "Total found|Yearly found"); //variable, data dependant //pars.Add("chxr", ""); pars.Add("chd", ""); pars.Add("chxl", ""); DateTime startAt = (from mf in _myFinds where mf.logDate.Year >= 2000 orderby mf.logDate.Year select mf.logDate).FirstOrDefault(); if (startAt.Year >= 2000) { startAt = new DateTime(startAt.Year, startAt.Month, 1); DateTime endAt = startAt.AddMonths(1); DateTime startOfInterval = startAt; StringBuilder chxl = new StringBuilder(); StringBuilder serie1 = new StringBuilder(); StringBuilder serie2 = new StringBuilder(); while (startAt <= DateTime.Now) { if (chxl.Length == 0 || startAt.Month == 1) { chxl.AppendFormat("|{0}", startAt.Year); startOfInterval = startAt; } else { chxl.Append("|"); } if (serie1.Length == 0) { serie1.AppendFormat("{0}", (from mf in _myFinds where mf.logDate < endAt select mf).Count()); serie2.AppendFormat("{0}", (from mf in _myFinds where mf.logDate >= startOfInterval && mf.logDate < endAt select mf).Count()); } else { serie1.AppendFormat(",{0}", (from mf in _myFinds where mf.logDate < endAt select mf).Count()); serie2.AppendFormat(",{0}", (from mf in _myFinds where mf.logDate >= startOfInterval && mf.logDate < endAt select mf).Count()); } startAt = endAt; endAt = endAt.AddMonths(1); } //pars["chd"] = string.Format("t:{0}|{1}", serie1.ToString(), serie2.ToString()); pars["chd"] = string.Format("t:{0}", serie1.ToString()); pars["chxl"] = string.Format("1:{0}", chxl.ToString()); //pars["chxr"] = _myFinds.Count.ToString(); } stats.Rows[0].Items[0].Text = googleChartImgUrl(pars); stats.Rows[0].Items[0].IsHtml = true; return stats.ToString(); }
private string daysCached() { string strDaysCached = "Days cached"; string strEvery = "every"; string strDaysOr = "days or"; string strMostConsec = "Most consecutive days with founds"; string strMostOneMonth = "Most in 1 month"; string strMostConsecW = "Most consecutive days without founds"; RegisterText(new string[]{ strDaysCached, strEvery, strDaysOr, strMostConsec, strMostOneMonth, strMostConsecW }); Layout skin = new Layout(1); Layout.Statistics stats = new Layout.Statistics(Translate(strDaysCached, false)); skin.StatisticsBlocks[0] = stats; Layout.Statistics.Row row = new Layout.Statistics.Row(); stats.Rows.Add(row); int uniqueDays = (from mf in _myFinds select mf.logDate.ToString("d")).Distinct().Count(); DateTime minDate = _myFinds.Min(x => x.logDate); DateTime maxDate = _myFinds.Max(x => x.logDate); TimeSpan ts = (maxDate - minDate); DateTime startInterval = minDate; DateTime endInterval = minDate; DateTime startIntervalMarker = minDate; DateTime endIntervalMarker = minDate; for (int i = 1; i < _myFinds.Count; i++) { string send = endInterval.ToString("d"); string slg = _myFinds[i].logDate.ToString("d"); if (slg == send) { //same day } else if (endInterval.AddDays(1).ToString("d") == slg) { //next day endInterval = _myFinds[i].logDate; } else { //interval determined if ((int)(endIntervalMarker - startIntervalMarker).TotalDays < (int)(endInterval - startInterval).TotalDays) { //new record startIntervalMarker = startInterval; endIntervalMarker = endInterval; } startInterval = _myFinds[i].logDate; endInterval = _myFinds[i].logDate; } } row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strDaysCached, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items[row.Items.Count - 1].Width = "15%"; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} ({3} {1:0.0} {4} {2:0.0}%)", uniqueDays, ts.TotalDays / (double)uniqueDays, 100.0 * (double)uniqueDays / ts.TotalDays, Translate(strEvery, false), Translate(strDaysOr, false)); row.Items[row.Items.Count - 1].Width = "35%"; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strMostConsec, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items[row.Items.Count - 1].Width = "20%"; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} (<span style=\"font-size:75%\">{1} - {2}</span>)", (int)(endIntervalMarker - startIntervalMarker).TotalDays + 1, startIntervalMarker.ToString("d"), endIntervalMarker.ToString("d")); row.Items[row.Items.Count - 1].IsHtml = true; row.Items[row.Items.Count - 1].Width = "30%"; row = new Layout.Statistics.Row(); stats.Rows.Add(row); startInterval = minDate; endInterval = minDate; DateTime prevFoundDate = minDate; startIntervalMarker = minDate; endIntervalMarker = minDate; for (int i = 1; i < _myFinds.Count; i++) { string send = prevFoundDate.ToString("d"); string slg = _myFinds[i].logDate.ToString("d"); if (slg == send) { //same day } else if (prevFoundDate.AddDays(1).ToString("d") == slg) { //next day } else { //start of new gap startInterval = _myFinds[i - 1].logDate.AddDays(1); endInterval = _myFinds[i].logDate.AddDays(-1); //interval determined if ((int)(endIntervalMarker - startIntervalMarker).TotalDays < (int)(endInterval - startInterval).TotalDays) { //new record startIntervalMarker = startInterval; endIntervalMarker = endInterval; } prevFoundDate = _myFinds[i].logDate; } } string[] udays = (from mf in _myFinds select mf.logDate.ToString("yyyy-MM-dd")).Distinct().ToArray(); var cdayGroup = (from mf in udays group mf by mf.Substring(0, 7) into g select new { Month = g.Key, Days = g }).OrderByDescending(x => x.Days.Count()).FirstOrDefault(); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strMostOneMonth, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} (<span style=\"font-size:75%\">{1}</span>)", cdayGroup.Days.Count(), cdayGroup.Month); row.Items[row.Items.Count - 1].IsHtml = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strMostConsecW, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} (<span style=\"font-size:75%\">{1} - {2}</span>)", (int)(endIntervalMarker - startIntervalMarker).TotalDays + 1, startIntervalMarker.ToString("d"), endIntervalMarker.ToString("d")); row.Items[row.Items.Count - 1].IsHtml = true; return stats.ToString(); }
private string history() { string strHistory = "History"; string strYear = "Year"; string strTotalFound = "Total found"; string strDaysCachedFreq = "Days cached / frequency"; string strCachesPerDay = "Caches/day"; string strEvery = "Every"; string strDays = "days"; RegisterText(new string[]{ strHistory, strYear, strTotalFound, strDaysCachedFreq, strCachesPerDay, strEvery, strDays }); Layout skin = new Layout(1); Layout.Statistics stats = new Layout.Statistics(Translate(strHistory, false)); skin.StatisticsBlocks[0] = stats; Layout.Statistics.Row row = new Layout.Statistics.Row(); stats.Rows.Add(row); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strYear, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strTotalFound, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strCachesPerDay, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strDaysCachedFreq, false); row.Items[row.Items.Count - 1].IsMarker = true; DateTime startAt = (from mf in _myFinds where mf.logDate.Year >= 2000 orderby mf.logDate.Year select mf.logDate).FirstOrDefault(); int startYear = startAt.Year; if (startYear >= 2000) { for (int y = startYear; y <= DateTime.Now.Year; y++) { int cnt = (from mf in _myFinds where mf.logDate.Year == y select mf).Count(); int diny; DateTime start = new DateTime(y, 1, 1); DateTime end; if (y == startYear) { start = startAt; } else { start = new DateTime(y, 1, 1); } if (y == DateTime.Now.Year) { end = DateTime.Now; } else { end = new DateTime(y, 12, 31); } diny = (int)(end - start).TotalDays; if (diny == 0) diny++; int udays = (from mf in _myFinds where mf.logDate >= start && mf.logDate <= end select mf.logDate.ToString("d")).Distinct().Count(); row = new Layout.Statistics.Row(); stats.Rows.Add(row); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = y.ToString(); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = cnt.ToString(); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = ((double)cnt / (double)diny).ToString("0.00"); row.Items.Add(new Layout.Statistics.Item()); if (udays == 0) { row.Items[row.Items.Count - 1].Text = udays.ToString(); } else { row.Items[row.Items.Count - 1].Text = string.Format("{0} / {2} {1:0.0} {3}", udays, (double)diny / (double)udays, Translate(strEvery, false), Translate(strDays, false)); } } } return stats.ToString(); }
private string foundCaches() { string strFoundCaches = "Found caches"; string strTotalFound = "Total found"; string strFound = "Found"; string strAverage = "Average"; string strPerDay = "per day"; string strPerWeek = "per week"; string strPerYear = "per year"; string strArchived = "Archived"; string strAvgDiff = "Avg. Diff. / Terr."; string strAvgOnOneDay = "Avg. on 1 day"; string strOldestCache = "Oldest cache"; string strPublishedOn = "published on"; string strMostOnOneDay = "Most on 1 day"; string strMostOnOneMonth = "Most on 1 month"; RegisterText(new string[]{ strFoundCaches, strTotalFound, strFound, strAverage, strPerDay, strPerWeek, strPerYear, strArchived, strAvgDiff, strAvgOnOneDay, strOldestCache, strPublishedOn, strMostOnOneDay, strMostOnOneMonth }); Layout skin = new Layout(1); Layout.Statistics stats = new Layout.Statistics(Translate(strFoundCaches, false)); skin.StatisticsBlocks[0] = stats; Layout.Statistics.Row row = new Layout.Statistics.Row(); stats.Rows.Add(row); DateTime minDate = _myFinds.Min(x => x.logDate); DateTime maxDate = _myFinds.Max(x => x.logDate); TimeSpan ts = (maxDate - minDate); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strTotalFound, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items[row.Items.Count - 1].Width = "15%"; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} # {1}", _myFinds.Count, Translate(strFound, false)); row.Items[row.Items.Count - 1].Width = "35%"; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strAverage, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items[row.Items.Count - 1].Width = "20%"; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0:0.00} {3} ({1:0.0} {4}, {2:0.0} {5})", (double)_myFinds.Count / ts.TotalDays, 7.0 * (double)_myFinds.Count / ts.TotalDays, 365.0 * (double)_myFinds.Count / ts.TotalDays, Translate(strPerDay, false), Translate(strPerWeek, false), Translate(strPerYear, false)); row.Items[row.Items.Count - 1].Width = "30%"; row = new Layout.Statistics.Row(); stats.Rows.Add(row); int arch = (from mf in _myFinds where mf.gc.Archived select mf).Count(); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strArchived, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} ({1:0.0}%)", arch, 100.0 * (double)arch / (double)_myFinds.Count); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strAvgDiff, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0:0.00} / {1:0.00}", _myFinds.Average(x => x.gc.Difficulty), _myFinds.Average(x => x.gc.Terrain)); row = new Layout.Statistics.Row(); stats.Rows.Add(row); int uniqueDays = (from mf in _myFinds select mf.logDate.ToString("d")).Distinct().Count(); DateTime minPub = _myFinds.Min(x => x.gc.PublishedTime); Geocache gc = (from mf in _myFinds where mf.gc.PublishedTime == minPub select mf.gc).FirstOrDefault(); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strAvgOnOneDay, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0:0.00}", (double)_myFinds.Count / (double)uniqueDays); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strOldestCache, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("<a href=\"{1}\" target=\"_blank\">{0}</a> (<span style=\"font-size:75%\">{2} {4} {3})</span>", ToHtml(gc.Name), gc.Url, ToHtml(gc.Code), ToHtml(gc.PublishedTime.ToString("d")), Translate(strPublishedOn)); row.Items[row.Items.Count - 1].IsHtml = true; row = new Layout.Statistics.Row(); stats.Rows.Add(row); var cdayGroup = (from mf in _myFinds group mf by mf.logDate.ToString("d") into g select new { Day = g.Key, Founds = g }).OrderByDescending(x => x.Founds.Count()).FirstOrDefault(); var cmonthGroup = (from mf in _myFinds group mf by mf.logDate.ToString("yyyy-MM") into g select new { Month = g.Key, Founds = g }).OrderByDescending(x => x.Founds.Count()).FirstOrDefault(); row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strMostOnOneDay, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} (<span style=\"font-size:75%\">{1}</span>)", cdayGroup.Founds.Count(), ToHtml(cdayGroup.Day)); row.Items[row.Items.Count - 1].IsHtml = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = Translate(strMostOnOneMonth, false); row.Items[row.Items.Count - 1].IsMarker = true; row.Items.Add(new Layout.Statistics.Item()); row.Items[row.Items.Count - 1].Text = string.Format("{0} (<span style=\"font-size:75%\">{1}</span>)", cmonthGroup.Founds.Count(), ToHtml(cmonthGroup.Month)); row.Items[row.Items.Count - 1].IsHtml = true; return stats.ToString(); }