Commit 045bd5a2 authored by Xavier de Blas's avatar Xavier de Blas

stats and graphs have now an:

	All simple jump stats (without TC, and mixing jumps with or without weight)
	All simple jump stats (with TC)

when adding a jumpType or a runType, these cannot be named "All Jumps" and "All runs" respectively
parent 37a39786
CHANGELOG:
21 aug 2005
stats and graphs have now an:
All simple jump stats (without TC, and mixing jumps with or without weight)
All simple jump stats (with TC)
when adding a jumpType or a runType, these cannot be named "All Jumps"
and "All runs" respectively
20 aug 2005
Added updated screenshots to the web site
......
No preview for this file type
......@@ -6,7 +6,7 @@
<requires lib="bonobo"/>
<widget class="GnomeApp" id="app1">
<property name="width_request">700</property>
<property name="width_request">640</property>
<property name="height_request">480</property>
<property name="visible">True</property>
<property name="title" translatable="yes">ChronoJump</property>
......
......@@ -98,7 +98,12 @@ public class JumpTypeAddWindow
void on_button_accept_clicked (object o, EventArgs args)
{
//check if this jump type exists, and check it's name is not "All jumps"
bool jumpTypeExists = SqliteJumpType.Exists (Util.RemoveTildeAndColonAndDot(entry_name.Text));
if(Util.RemoveTildeAndColonAndDot(entry_name.Text) == Catalog.GetString("All jumps")) {
jumpTypeExists = true;
}
if(jumpTypeExists) {
//string myString = Catalog.GetString ("Jump type: '") +
// Util.RemoveTildeAndColonAndDot(entry_name.Text) +
......
......@@ -72,6 +72,8 @@ public class StatsWindow {
//useful for deleting headers of lastStat just before making a new Stat
private Stat myStat;
private string allJumpsName = Catalog.GetString("All jumps");
private static string [] comboStatsOptions = {
Catalog.GetString("Global"),
Catalog.GetString("Jumper"),
......@@ -189,12 +191,12 @@ public class StatsWindow {
} else if (combo_stats_stat_name.Entry.Text == Catalog.GetString("Simple") )
{
combo_stats_stat_name2.PopdownStrings =
SqliteJumpType.SelectJumpTypes("", "nonTC", true); //only select name
SqliteJumpType.SelectJumpTypes(allJumpsName, "nonTC", true); //only select name
combo_stats_stat_name2.Sensitive = true;
} else if (combo_stats_stat_name.Entry.Text == Catalog.GetString("With TC") )
{
combo_stats_stat_name2.PopdownStrings =
SqliteJumpType.SelectJumpTypes("", "TC", true); //only select name
SqliteJumpType.SelectJumpTypes(allJumpsName, "TC", true); //only select name
combo_stats_stat_name2.Sensitive = true;
} else if (combo_stats_stat_name.Entry.Text == Catalog.GetString("Reactive") )
{
......@@ -303,7 +305,11 @@ public class StatsWindow {
else if(category == Catalog.GetString("Simple"))
{
JumpType myType = new JumpType(statistic);
if(myType.HasWeight) {
//manage all weight jumps and the "All jumps" (simple)
if(myType.HasWeight ||
statistic == allJumpsName)
{
if(graph) {
myStat = new GraphSjCmjAbkPlus (
sendSelectedSessions,
......
......@@ -149,7 +149,10 @@ class SqliteJumpType : Sqlite
public static string[] SelectJumpTypes(string allJumpsName, string filter, bool onlyName)
{
//allJumpsName: add and "allJumpsName" value
//filter: "" all jumps, "TC" only with previous fall, "nonTC" only not with previous fall
//filter:
// "" all jumps,
// "TC" only with previous fall,
// "nonTC" only not with previous fall
// used in gui/stats.cs
//onlyName: return only type name
......
......@@ -30,11 +30,25 @@ using System.Data.SqlClient;
class SqliteStat : Sqlite
{
//sj, cmj, abk (no sj+)
public static ArrayList SjCmjAbk (string sessionString, bool multisession, string ini, string end, string jumpType, bool showSex, bool heightPreferred)
//"All jumps" (simple) is not managed here, is done in SjCmjAbkPlus
public static ArrayList SjCmjAbk (string sessionString, bool multisession, string operationString, string jumpType, bool showSex, bool heightPreferred)
{
string ini = "";
string end = "";
if(operationString == "MAX") {
ini = "MAX(";
end = ")";
} else if(operationString == "AVG") {
ini = "AVG(";
end = ")";
}
string orderByString = "ORDER BY ";
string moreSelect = "";
moreSelect = ini + "jump.tv" + end;
string fromString = " FROM jump, person ";
string jumpTypeString = " AND jump.type == '" + jumpType + "' ";
//if we use AVG or MAX, then we have to group by the results
//if there's more than one session, it sends the avg or max
......@@ -49,9 +63,11 @@ class SqliteStat : Sqlite
dbcon.Open();
dbcmd.CommandText = "SELECT person.name, person.sex, sessionID, " + moreSelect +
" FROM jump, person " +
//" FROM jump, person " +
fromString +
sessionString +
" AND jump.type == '" + jumpType + "' " +
//" AND jump.type == '" + jumpType + "' " +
jumpTypeString +
" AND jump.personID == person.uniqueID " +
groupByString +
orderByString + ini + "jump.tv" + end + " DESC ";
......@@ -68,6 +84,7 @@ class SqliteStat : Sqlite
if(showSex) {
showSexString = "." + reader[1].ToString() ;
}
if(multisession) {
string returnSessionString = ":" + reader[2].ToString();
string returnValueString = "";
......@@ -94,12 +111,32 @@ class SqliteStat : Sqlite
}
//sj+, cmj+, abk+
public static ArrayList SjCmjAbkPlus (string sessionString, bool multisession, string ini, string end, string jumpType, bool showSex, bool weightPercent, bool heightPreferred)
//and "All jumps" (simple)
public static ArrayList SjCmjAbkPlus (string sessionString, bool multisession, string operationString, string jumpType, bool showSex, bool weightPercent, bool heightPreferred)
{
string ini = "";
string end = "";
if(operationString == "MAX") {
ini = "MAX(";
end = ")";
} else if(operationString == "AVG") {
ini = "AVG(";
end = ")";
}
string orderByString = "ORDER BY ";
string moreSelect = "";
moreSelect = ini + "jump.tv" + end + ", jump.weight, person.weight";
//manage allJumps
string fromString = " FROM jump, person ";
string jumpTypeString = " AND jump.type == '" + jumpType + "' ";
if(jumpType == Catalog.GetString("All jumps")) {
moreSelect = moreSelect + ", jump.type ";
fromString = " FROM jump, person, jumpType ";
jumpTypeString = " AND jumpType.startIn == 1 AND jump.Type == jumpType.name ";
}
//if we use AVG or MAX, then we have to group by the results
//if there's more than one session, it sends the avg or max, no more columns
//there's no chance of mixing tv and weight of different jumps in multisessions because only tv is returned
......@@ -114,9 +151,11 @@ class SqliteStat : Sqlite
dbcon.Open();
dbcmd.CommandText = "SELECT person.name, person.sex, sessionID, " + moreSelect +
" FROM jump, person " +
//" FROM jump, person " +
fromString +
sessionString +
" AND jump.type == '" + jumpType + "' " +
//" AND jump.type == '" + jumpType + "' " +
jumpTypeString +
" AND jump.personID == person.uniqueID " +
groupByString +
orderByString + ini + "jump.tv" + end + " DESC ";
......@@ -128,11 +167,18 @@ class SqliteStat : Sqlite
reader = dbcmd.ExecuteReader();
string showSexString = "";
string showJumpTypeString = "";
ArrayList myArray = new ArrayList(2);
while(reader.Read()) {
if(showSex) {
showSexString = "." + reader[1].ToString() ;
}
//manage allJumps (show jumpType beside name (and sex))
//but only if it's not an AVG of different jumps
if(jumpType == Catalog.GetString("All jumps") && operationString != "AVG") {
showJumpTypeString = " (" + reader[6].ToString() + ")";
}
if(multisession) {
string returnSessionString = ":" + reader[2].ToString();
string returnValueString = "";
......@@ -141,13 +187,13 @@ class SqliteStat : Sqlite
} else {
returnValueString = ":" + reader[3].ToString();
}
myArray.Add (reader[0].ToString() + showSexString +
myArray.Add (reader[0].ToString() + showSexString + showJumpTypeString +
returnSessionString + //session
returnValueString //tv or heightofJump
);
} else {
//in simple session return: name, sex, height, TV, Fall
myArray.Add (reader[0].ToString() + showSexString +
myArray.Add (reader[0].ToString() + showSexString + showJumpTypeString +
+ ":" + Util.GetHeightInCentimeters(reader[3].ToString())
+ ":" + reader[3].ToString()
+ ":" + convertWeight(
......@@ -162,6 +208,11 @@ class SqliteStat : Sqlite
}
private static string convertWeight (string jumpW, int personW, bool percentDesired) {
//if it was a nono weight jump, return 0
if(jumpW.Length == 0) {
return "0";
}
int i;
bool percentFound;
for (i=0 ; i< jumpW.Length ; i ++) {
......@@ -188,11 +239,31 @@ class SqliteStat : Sqlite
}
//dj index
public static ArrayList DjIndex (string sessionString, bool multisession, string ini, string end, string jumpType, bool showSex)
public static ArrayList DjIndex (string sessionString, bool multisession, string operationString, string jumpType, bool showSex)
{
string ini = "";
string end = "";
if(operationString == "MAX") {
ini = "MAX(";
end = ")";
} else if(operationString == "AVG") {
ini = "AVG(";
end = ")";
}
string orderByString = "ORDER BY ";
string moreSelect = "";
moreSelect = ini + "((tv-tc)*100/tc)" + end + " AS dj_index, jump.tv, jump.tc, jump.fall";
//manage allJumps
string fromString = " FROM jump, person ";
string jumpTypeString = " AND jump.type == '" + jumpType + "' ";
if(jumpType == Catalog.GetString("All jumps")) {
moreSelect = moreSelect + ", jump.type ";
fromString = " FROM jump, person, jumpType ";
jumpTypeString = " AND jumpType.startIn == 0 AND jump.Type == jumpType.name ";
}
//if we use AVG or MAX, then we have to group by the results
//if there's more than one session, it sends the avg or max
......@@ -207,9 +278,11 @@ class SqliteStat : Sqlite
dbcon.Open();
dbcmd.CommandText = "SELECT person.name, person.sex, sessionID, " + moreSelect +
" FROM jump, person " +
//" FROM jump, person " +
fromString +
sessionString +
" AND jump.type == '" + jumpType + "' " +
//" AND jump.type == '" + jumpType + "' " +
jumpTypeString +
" AND jump.personID == person.uniqueID " +
groupByString +
orderByString + " dj_index DESC, " + ini + "jump.tv" + end + " DESC ";
......@@ -221,6 +294,7 @@ class SqliteStat : Sqlite
reader = dbcmd.ExecuteReader();
string showSexString = "";
string showJumpTypeString = "";
string returnSessionString = "";
string returnHeightString = "";
string returnTvString = "";
......@@ -231,6 +305,12 @@ class SqliteStat : Sqlite
if(showSex) {
showSexString = "." + reader[1].ToString() ;
}
//manage allJumps (show jumpType beside name (and sex))
//but only if it's not an AVG of different jumps
if(jumpType == Catalog.GetString("All jumps") && operationString != "AVG") {
showJumpTypeString = " (" + reader[7].ToString() + ")";
}
if(multisession) {
returnSessionString = ":" + reader[2].ToString();
} else {
......@@ -244,7 +324,7 @@ class SqliteStat : Sqlite
returnFallString = ":" + reader[6].ToString();
}
myArray.Add (reader[0].ToString() + showSexString +
myArray.Add (reader[0].ToString() + showSexString + showJumpTypeString +
returnSessionString + ":" + //session
reader[3].ToString() + //index
returnHeightString + //height
......@@ -424,7 +504,12 @@ class SqliteStat : Sqlite
string myReturn = "";
int i;
for(i=0; i < TCFull.Length; i++) {
myReturn = myReturn + ":" + TCFull[i] + ":" + TVFull[i];
//myReturn = myReturn + ":" + TCFull[i] + ":" + TVFull[i];
myReturn = myReturn + ":" + TCFull[i];
if(TVFull.Length > i) {
myReturn = myReturn + ":" + TVFull[i];
}
}
//fill the row with 0's equalling largest row
for(int j=i; j < maxJumps; j++) {
......@@ -500,12 +585,15 @@ class SqliteStat : Sqlite
public static ArrayList IeIub (string sessionString, bool multisession, string ini, string end, string jump1, string jump2, bool showSex)
{
//What's this? TODO: check old versions of this file
/*
string ini2 = "";
if(ini == "MAX(") {
ini2 = "MIN(";
} else if (ini == "AVG("){
ini2 = "AVG(";
}
*/
string orderByString = "ORDER BY ";
string moreSelect = "";
......
......@@ -71,27 +71,32 @@ public class StatDjIndex : Stat
if(statsJumpsType == 3) { //avg of each jumper
if(multisession) {
string operation = "AVG";
processDataMultiSession (
SqliteStat.DjIndex(sessionString, multisession,
"AVG(", ")", jumpType, showSex),
operation, jumpType, showSex),
true, sessions.Count);
} else {
string operation = "AVG";
processDataSimpleSession ( cleanDontWanted (
SqliteStat.DjIndex(sessionString, multisession,
"AVG(", ")", jumpType, showSex),
operation, jumpType, showSex),
statsJumpsType, limit),
true, dataColumns);
}
} else {
//if more than on session, show only the avg or max of each jump/jumper
if(multisession) {
string operation = "MAX";
processDataMultiSession ( SqliteStat.DjIndex(sessionString, multisession,
"MAX(", ")", jumpType, showSex),
operation, jumpType, showSex),
true, sessions.Count);
} else {
string operation = ""; //no need of "MAX", there's an order by jump.tv desc
//and clenaDontWanted will do his work
processDataSimpleSession ( cleanDontWanted (
SqliteStat.DjIndex(sessionString, multisession,
"", "", jumpType, showSex),
operation, jumpType, showSex),
statsJumpsType, limit),
true, dataColumns);
}
......
......@@ -61,11 +61,11 @@ public class GraphSjCmjAbk : StatSjCmjAbk
}
if(this.operation == "MAX") {
CurrentGraphData.GraphTitle = string.Format(
Catalog.GetString("MAX values of index: {0} in"), jumpType)
Catalog.GetString("MAX values of jump: {0} in"), jumpType)
+ " " + mySessions;
} else {
CurrentGraphData.GraphTitle = string.Format(
Catalog.GetString("AVG values of index: {0} data in"), jumpType)
Catalog.GetString("AVG values of jump: {0} data in"), jumpType)
+ " " + mySessions;
}
......
......@@ -64,7 +64,6 @@ public class StatRjEvolution : Stat
completeConstruction (treeview, sessions, newPrefsDigitsNumber, showSex, statsJumpsType);
Console.WriteLine("maxjumps: {0}, datacolumns: {1}", maxJumps, dataColumns);
prepareHeaders(columnsString);
}
......
......@@ -69,23 +69,29 @@ public class StatSjCmjAbk : Stat
if(statsJumpsType == 3) { //avg of each jumper
if(multisession) {
string operation = "AVG";
processDataMultiSession (
SqliteStat.SjCmjAbk(sessionString, multisession, "AVG(", ")", jumpType, showSex, heightPreferred),
SqliteStat.SjCmjAbk(sessionString, multisession, operation, jumpType, showSex, heightPreferred),
true, sessions.Count);
} else {
string operation = "AVG";
processDataSimpleSession ( cleanDontWanted (
SqliteStat.SjCmjAbk(sessionString, multisession, "AVG(", ")", jumpType, showSex, heightPreferred),
SqliteStat.SjCmjAbk(sessionString, multisession, operation, jumpType, showSex, heightPreferred),
statsJumpsType, limit),
true, dataColumns);
}
} else {
//if more than on session, show only the avg or max of each jump/jumper
if(multisession) {
processDataMultiSession ( SqliteStat.SjCmjAbk(sessionString, multisession, "MAX(", ")", jumpType, showSex, heightPreferred),
string operation = "MAX";
processDataMultiSession ( SqliteStat.SjCmjAbk(sessionString, multisession, operation, jumpType, showSex, heightPreferred),
true, sessions.Count);
} else {
string operation = ""; //no need of "MAX", there's an order by jump.tv desc
//and clenaDontWanted will do his work
processDataSimpleSession ( cleanDontWanted (
SqliteStat.SjCmjAbk(sessionString, multisession, "", "", jumpType, showSex, heightPreferred),
SqliteStat.SjCmjAbk(sessionString, multisession, operation, jumpType, showSex, heightPreferred),
statsJumpsType, limit),
true, dataColumns);
}
......
......@@ -74,27 +74,32 @@ public class StatSjCmjAbkPlus : Stat
if(statsJumpsType == 3) { //avg of each jumper
if(multisession) {
string operation = "AVG";
processDataMultiSession (
SqliteStat.SjCmjAbkPlus(sessionString, multisession,
"AVG(", ")", jumpType, showSex, percent, heightPreferred),
operation, jumpType, showSex, percent, heightPreferred),
true, sessions.Count);
} else {
string operation = "AVG";
processDataSimpleSession ( cleanDontWanted (
SqliteStat.SjCmjAbkPlus(sessionString, multisession,
"AVG(", ")", jumpType, showSex, percent, heightPreferred),
operation, jumpType, showSex, percent, heightPreferred),
statsJumpsType, limit),
true, dataColumns);
}
} else {
//if more than on session, show only the avg or max of each jump/jumper
if(multisession) {
string operation = "MAX";
processDataMultiSession ( SqliteStat.SjCmjAbkPlus(sessionString, multisession,
"MAX(", ")", jumpType, showSex, percent, heightPreferred),
operation, jumpType, showSex, percent, heightPreferred),
true, sessions.Count);
} else {
string operation = ""; //no need of "MAX", there's an order by jump.tv desc
//and clenaDontWanted will do his work
processDataSimpleSession ( cleanDontWanted (
SqliteStat.SjCmjAbkPlus(sessionString, multisession,
"", "", jumpType, showSex, percent, heightPreferred),
operation, jumpType, showSex, percent, heightPreferred),
statsJumpsType, limit),
true, dataColumns);
}
......
<h4>Captures de pantalla</h4>
<tt>Cliqueu sobre les imatges per ampliar-les.</tt>
<table border="0" cellpadding="4" cellspacing="8">
<tr>
<td width="250"><a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a></td>
<tr>
<td width="250"><a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a>
<br>
v.0.2 estadístiques i gràfiques DjIndex (anglès)
</td>
<td width="250">
<a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 afegir nou tipus de cursa (espanyol)
</td>
</tr>
<tr>
<td width="250"><a href="images/chronojump_graphs_reactive.jpg"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 afegir múltiples individuus i preferències (espanyol)
</td>
<td width="250">
<a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a>
<br>
v.0.1 gràfiques (anglès)
</td>
</tr>
<tr>
<td width="250"><a href="images/plataforma_contactos_final.jpg"><img src="images/plataforma_contactos_final_small.png" width="250" height="188"></a></td>
<td>&nbsp;</td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_reactive.png"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a>
<br>
v.0.1 gràficas de salts reactius (anglès)
</td>
<td width="250">
<a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a>
<br>
propotipus de Chronopic (Skypic + targeta d'expansió)
</td>
</tr>
<tr>
<td colspan="2"><tt>Cliqueu sobre les imatges per ampliar-les.</tt></td>
<tr valign="top">
<td width="250">
<a href="images/plataforma_contactos_final.jpg"><img src="images/plataforma_contactos_final_small.png" width="250" height="188"></a>
<br>
Platforma de contactes construida seguint aquestes <a href="construction_contact_platform_ca.html">instruccions</a>
</td>
<td>
&nbsp;
</td>
</tr>
</table>
<h4>Screenshots</h4>
<tt>Click in the images to extend.</tt>
<table border="0" cellpadding="4" cellspacing="8">
<tr>
<td width="250"><a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a></td>
<tr>
<td width="250"><a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a>
<br>
v.0.2 stats and graph DjIndex (english)
</td>
<td width="250">
<a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 add new run type (spanish)
</td>
</tr>
<tr>
<td width="250"><a href="images/chronojump_graphs_reactive.jpg"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a></td>
</tr>
<tr>
<td width="250"><a href="images/plataforma_contactos_final.jpg"><img src="images/plataforma_contactos_final_small.png" width="250" height="188"></a></td>
<td>&nbsp;</td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 add multiple persons and preferences (spanish)
</td>
<td width="250">
<a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a>
<br>
v.0.1 graphs (english)
</td>
</tr>
<tr>
<td colspan="2"><tt>Click in the images to extend.</tt></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_reactive.png"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a>
<br>
v.0.1 graphs reactive jumps (english)
</td>
<td width="250">
<a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a>
<br>
Chronopic prototype (Skypic + expansion card)
</td>
</tr>
<tr valign="top">
<td width="250">
<a href="images/plataforma_contactos_final.jpg"><img src="images/plataforma_contactos_final_small.png" width="250" height="188"></a>
<br>
contact platform build following these <a href="construction_contact_platform_es.html">instructions</a> (spanish)
</td>
<td>
&nbsp;
</td>
</tr>
</table>
<h4>Capturas de pantalla</h4>
<tt>Haga clic en las imágenes para ampliar.</tt>
<table border="0" cellpadding="4" cellspacing="8">
<tr>
<td width="250"><a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a></td>
<tr>
<td width="250"><a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a>
<br>
v.0.2 estadísticas y gráfica DjIndex (inglés)
</td>
<td width="250">
<a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 añadir nuevo tipo de carrera (español)
</td>
</tr>
<tr>
<td width="250"><a href="images/chronojump_graphs_reactive.jpg"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a></td>
</tr>
<tr>
<td width="250"><a href="images/plataforma_contactos_final.jpg"><img src="images/plataforma_contactos_final_small.png" width="250" height="188"></a></td>
<td>&nbsp;</td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 añadir múltiples sujetos y preferencias (español)
</td>
<td width="250">
<a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a>
<br>
v.0.1 gráficas (inglés)
</td>
</tr>
<tr>
<td colspan="2"><tt>Haga clic en las imágenes para ampliar.</tt></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_reactive.png"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a>
<br>
v.0.1 gráficas de saltos reactivos (inglés)
</td>
<td width="250">
<a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a>
<br>
propotipo de Chronopic (Skypic + tarjeta de expansión)
</td>
</tr>
<tr valign="top">
<td width="250">
<a href="images/plataforma_contactos_final.jpg"><img src="images/plataforma_contactos_final_small.png" width="250" height="188"></a>
<br>
Platforma de contactos construida siguiendo estas <a href="construction_contact_platform_es.html">instrucciones</a>
</td>
<td>
&nbsp;
</td>
</tr>
</table>
<h4>Capturas de telas</h4>
<tt>Clique nas imagens para ampliar</tt>
<table border="0" cellpadding="4" cellspacing="8">
<tr>
<td width="250"><a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a></td>
<tr>
<td width="250"><a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a></td>
</tr>
<tr>
<td width="250"><a href="images/chronojump_graphs_reactive.jpg"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a></td>
<td width="250"><a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_volei.png"><img src="images/chronojump_graphs_volei_small.png" width="250" height="188"></a>
<br>
v.0.2 Estatística e gráfico DjIndex (Inglês)
</td>
<td width="250">
<a href="images/chronojump_new_run_type_spanish.png"><img src="images/chronojump_new_run_type_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 Adicionar novo tipo de carreira (Espanhol)
</td>
</tr>
<tr>
<td width="250"><a href="images/plataforma_contactos_final.jpg"><img src="images/plataforma_contactos_final_small.png" width="250" height="188"></a></td>
<td>&nbsp;</td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_add_persons_multiple_preferences_spanish.png"><img src="images/chronojump_add_persons_multiple_preferences_spanish_small.png" width="250" height="188"></a>
<br>
v.0.2 Adicionar sujeitos múltiples e preferências (Espanhol)
</td>
<td width="250">
<a href="images/chronojump_graphs.jpg"><img src="images/chronojump_graphs_small.png" width="250" height="188"></a>
<br>
v.0.1 Gráficos (Inglês)
</td>
</tr>
<tr>
<td colspan="2"><tt>Clique nas imagens para ampliar</tt></td>
<tr valign="top">
<td width="250">
<a href="images/chronojump_graphs_reactive.png"><img src="images/chronojump_graphs_reactive_small.png" width="250" height="188"></a>
<br>
v.0.1 Gráficos de saltos reativos (inglês)
</td>
<td width="250">
<a href="images/chronopic_foto.jpg"><img src="images/chronopic_foto_small.png" width="250" height="188"></a>
<br>
Protótipo do Chronojump (Skypic + cartão de expansão)
</td>
</tr>
<t