";
if($default_lang ne 'fi'){
print "Последние пути (".(1+$#kommentit)." routes):
";
}else{
print "Uusimmat reittipiirrokset (piirroksia yhteensä ".(1+$#kommentit)." kpl):
";
}
$i=0;
while(($i<20 || $in{'all'}== 1) && $#kommentit >= $i){
($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$kommentit[$#kommentit-$i]);
print "($classname{$idkilp} ) $nimi ";
$i++;
}
if($in{'all'} != 1){
if($default_lang ne 'fi'){
print " Посмотреть все
";
}else{
print "Näytä kaikki
";
}
}
print "
";
exit;
}
##################### menu #############################3
if($in{'act'} eq 'mobile'){
open(SISAAN, "<".$path."kisat.txt");
@data=;
close(SISAAN);
$out= "
mRouteGadget
Events: ";
foreach $rec (@data){
chomp($rec);
($id,$karttaid,$tyyppi,$nimi,$paiva,$seura,$taso,$notes)=split(/\|/,$rec,8);
$out=$out."$nimi \n";
}
$out=$out."";
$out =~s/ä/\ä\;/g;
$out =~s/ö/\ö\;/g;
$out =~s/å/\å\;/g;
$out =~s/Ä/\Ä\;/g;
$out =~s/Ö/\Ö\;/g;
$out =~s/Å/\Å\;/g;
print $out;
exit;
}
if($in{'act'} eq 'valitsesarja'){
$out="
mRouteGadget
Select Class: ";
open (SISAAN,"<$path"."sarjat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($id,$nimi)=split(/\|/,$rec);
$out=$out."$nimi \n";
}
close(SISAAN);
$out =~s/ä/\ä\;/g;
$out =~s/ö/\ö\;/g;
$out =~s/å/\å\;/g;
$out =~s/Ä/\Ä\;/g;
$out =~s/Ö/\Ö\;/g;
$out =~s/Å/\Å\;/g;
print $out;
exit;
exit;
}
if($in{'act'} eq 'valitsereitit'){
$out= "
mRouteGadget
";
$out =~s/ä/\ä\;/g;
$out =~s/ö/\ö\;/g;
$out =~s/å/\å\;/g;
$out =~s/Ä/\Ä\;/g;
$out =~s/Ö/\Ö\;/g;
$out =~s/Å/\Å\;/g;
print $out;
exit;
}
##################### menu #############################3
if($in{'get'} eq 'table'){
open(SISAAN, "<".$path."kisat.txt");
@data=;
close(SISAAN);
@data = sort {
(split /\|/, $a, 6)[4] cmp
(split /\|/, $b, 6)[4]
} @data;
print @data;
exit;
}
##################### RG index interface ############################
if($in{'info'} eq 'csv'){
open(SISAAN, "<".$path."kisat.txt");
@data=;
close(SISAAN);
@data = sort {
(split /\|/, $a, 6)[4] cmp
(split /\|/, $b, 6)[4]
} @data;
if($in{'first'}!=1){
@data = reverse @data;
}
foreach $rec (@data){
chomp($rec);
($id,$karttaid,$tyyppi,$nimi,$paiva,$seura,$taso,$notes)=split(/\|/,$rec,8);
open(SISAAN, "<".$path."kommentit_".$id.".txt");
@d=;
close(SISAAN);
$count=1+$#d;
print "$id|$tyyppi|$nimi|$paiva|$seura|$taso|$count\n";
}
exit;
}
##################### menu #############################3
if($in{'act'} eq 'menu' || $in{'act'} eq ''){
if($menuStyle eq 'list'){
open(SISAAN, "<".$path."kisat.txt");
@data=;
close(SISAAN);
$out= "
";
if($default_lang ne 'fi'){
$out=$out."$events ";
}else{
$out=$out."
Tapahtumat: ";
}
$out=$out."
";
$count=0;
@data = sort {
(split /\|/, $a, 6)[4] cmp
(split /\|/, $b, 6)[4]
} @data;
if($in{'first'}!=1){
@data = reverse @data;
}
foreach $rec (@data){
$count++;
chomp($rec);
($id,$karttaid,$tyyppi,$nimi,$paiva,$seura,$taso,$notes)=split(/\|/,$rec,8);
if($in{'count'}<$count && $in{'count'}+30>=$count ){
$out=$out."";
$bcolor="#f8f8ff";
if($count % 2 == 0){$bcolor="#E8E8F0";}
if($default_lang ne 'fi'){
$out=$out."$paiva $nimi $seura $eLevel{$taso} [$latestRoutes ] ";
}else{
$out=$out."$paiva $nimi $seura $eLevel{$taso} [Uusimmat piirrokset ] ";
}
if($Splitsbrowser==1 && $tyyppi != 3){
$out=$out. "[SplitsBrowser ] \n";
}else{
$out=$out. " \n";
}
if($splitalyzer==1 && $tyyppi != 3){
$out=$out. "[Splitalyzer ] \n";
}else{
$out=$out. " \n";
}
}
}
$out=$out. "
\n";
if($OGraphApplet ==1 && $tyyppi != 3){
if($default_lang eq 'fi'){
$out=$out."Väliaika-graafit: OGraphApplet
";
}else{
$out=$out."Split graphics: OGraphApplet
";
}
}
$out=$out." ";
if($in{'count'}>0){
$out=$out."<<< ";
}
if($in{'count'}+30 < $count){
$out=$out." >>> ";
}
$out=$out."
";
$out =~s/ä/\ä\;/g;
$out =~s/ö/\ö\;/g;
$out =~s/å/\å\;/g;
$out =~s/Ä/\Ä\;/g;
$out =~s/Ö/\Ö\;/g;
$out =~s/Å/\Å\;/g;
print $out;
}else{
$plusgif=" ";
$minusgif=" ";
$perloadimages=" ";
$igif=" ";
## event tree menu ####
open(SISAAN, "<".$path."kisat.txt");
@data=;
close(SISAAN);
$out= "
";
#if($default_lang ne 'fi'){
#$out.="$events ";
#}else{
#$out.="
Tapahtumat: ";
#}
if ((-e "".$path."coord.txt") eq "1") {
$out.="Live tracking ";
open(SISAAN, "<".$path."radat_0.txt");
@trradat=;
close(SISAAN);
foreach $tr (@trradat){
@r=split(/\|/,$tr);
$out.="$r[2] ";
}
$out.="Live GPS tracking with backround map ";
}
$out.="
";
$out.="
";
if($OGraphApplet ==1 && $tyyppi != 3){
if($default_lang eq 'fi'){
$out.="Väliaika-graafit: OGraphApplet
";
}else{
$out.="Split graphics: OGraphApplet
";
}
}
$out.="
$perloadimages
";
print $out;
}
exit;
}
################# sarjat ####################
if ($in{"act"} eq "sarjat"){
## lasketaan montako piirrosta on missäkin sarjassa
open (SISAAN,"<$path"."kommentit_$in{'eventid'}.txt");
@kommentit=;
close(SISAAN);
foreach $rec (@kommentit) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$rec);
$i++;
$lkm{$idkilp}++;
}
## luetaan saarjat
open (SISAAN,"<$path"."sarjat_$in{'eventid'}.txt");
if($in{'kohdistus'}eq "1"){
print "1;Koko rastikanta\n";
}else{
while (defined ($rec = )) {
chomp($rec);
($id,$nimi)=split(/\|/,$rec);
print "$id;$nimi (".(1*$lkm{$id}).")\n";
}
close(SISAAN);
print "99999;kaikki\n";
}
}
################# kilpailijat/sarja##############
if ($in{"act"} eq "kilpailijat"){
if($in{'sarja'} ne "99999"){
open (SISAAN,"<$path"."kilpailijat_$in{'eventid'}.txt");
if($in{'viesti'} ne '1'){
while (defined ($rec = )) {
chomp($rec);
($id,$sarjanro,$sarja,$nimi,$laika,$aika,$sija,$tulos,$valiajat)=split(/\|/,$rec);
if($sarjanro eq $in{'sarja'}){
print "$id;$sija $nimi $tulos\n";
}
}
}else{
while (defined ($rec = )) {
chomp($rec);
($id,$sarjanro,$sarja,$nimi,$laika,$osuus,$hajonta,$tulos,$valiajat)=split(/\|/,$rec);
if($sarjanro eq $in{'sarja'}){
print "$id;$hajonta;$sija $nimi $tulos\n";
}
}
}
close(SISAAN);
}else{
$j=0;$i=0;
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec);
$i++;
print $id.";$nimi\n";
$j++;
}
close(SISAAN);
}
}
################# piirtaneetkilpailijat/sarja##############
############# kilpailijalista ##############
if ($in{"act"} eq "piirtaneetkilpailijat"){
## Tästä appletti kysyy piirtaneetkilpailijat
if($in{'kaikki'} eq "1" && $in{"rata"} ne "99999"){
## tarkistetan piirtäneet tähtimerkintää varten
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec);
$tahti{$id}="*";
}
close(SISAAN);
###
open (SISAAN,"<$path"."kilpailijat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($id,$sarjanro,$sarja,$nimi,$laika,$aika,$sijahajonta,$tulos,$valiajat)=split(/\|/,$rec);
if($sarjanro eq $in{'rata'}){
if($in{'viesti'} ne '1'){
print "$tahti{$id}$sijahajonta $nimi $tulos ;$id\n";
}else{
print "$tahti{$id} $nimi $tulos;$sijahajonta;$id\n";
}
}
}
close(SISAAN);
}else{
$j=0;$i=0;
if($in{'viesti'} ne '1'){
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec);
$i++;
if($idkilp eq $in{"rata"} || $in{"rata"} eq "99999"){ ## eli on tässä sarjassa
@ulos[$j]=$nimi.";".$id."\n";
$j++;
}
}
close(SISAAN);
@ulos = sort {
(split '\;', $a, 2)[1] <=>
(split '\;', $b, 2)[1]
} @ulos;
print @ulos;
}else{ # viesti
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($idkilp,$id,$nimi,$hajonta,$viivat,$rastit)=split(/\|/,$rec);
$i++;
if($idkilp eq $in{"rata"} || $in{"rata"} eq "99999"){ ## eli on tässä sarjassa
@ulos[$j]=$nimi.';'.$hajonta.';'.$id."\n";
$j++;
}
}
close(SISAAN);
@ulos = sort {
(split '\;', $a, 3)[2] <=>
(split '\;', $b, 3)[2]
} @ulos;
print @ulos;
}
}
}
################# rastit kohdistukseen ##############
if ($in{"act"} eq "rastisto"){
open (SISAAN,"<$path"."sarjojenkoodit_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($sarjaid,$koodit)=split(/\|/,$rec,2);
$codes=$codes."|".$koodit;
}
@dat=split(/\|/,$codes);
$ulos="";
$rastilkm=1;
foreach $rec (@dat){
if($rec ne ''){
if($koodi{$rec}!=1){
$koodi{$rec}=1;
$ulos=$ulos.$rec."\n";
}
}
}
print $ulos;
}
################# fotot #############
if ($in{"act"} eq "valokuvat"){
open (SISAAN,"<$path"."valokuvat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($x,$y,$url)=split(/\|/,$rec,3);
if($x ne '' && $y ne '' && $url ne '' ){
$x=floor($x);
$y=floor($y);
print "$x;$y;$url\n";
}
}
}
################# valiajat ##############
if ($in{"act"} eq "valiajat"){
$nro=1;$otsikko="-------------------";
open (SISAAN,"<$path"."kilpailijat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($id,$sarjanro,$sarjanimi,$nimi,$laika,$aika,$sija,$tulos,$valiajat)=split(/\|/,$rec);
if($id eq $in{'k'.$nro} && $id < 50000){
@splits=split(/\;/,$valiajat);
$old=0;$i=1;
$ulos=' '.substr($nimi." ",0,19);
foreach $rec (@splits){
chomp($rec);
if($nro==1){
$otsikko=$otsikko.substr("--".$i."----",0,6);
$i++;
}
$min=floor(($rec-$old)/60);
$sec=($rec-$old)-60*floor(($rec-$old)/60);
if ($sec <10){$sec='0'.$sec;}
$old=$rec;
$ulos=$ulos.substr("$min.$sec ",0,6);
}
if($nro==1){
print "$otsikko\n";
}
print "$ulos $nimi\n";
$nro++;
}
}
close(SISAAN);
print "$otsikko\n";
print "\n Route lengths (in pixels) \n";
print "$otsikko------\n";
###
# Tästä apletti saa reittipituuded
# 2|gadget_060225.zip|RouteGadget 25.2.2006 (latest) Now you can make direct links to route drawings. Take a look at latest routes page. Route choice lengths are viewed under split times. A bug in SI csv parser fixed (non english SI files).
open (SISAAN,"<".$path."kisat.txt");
@kartat=;
close(SISAAN);
$viesti=0;
foreach $rec (@kartat) {
chomp($rec);
($id,$karttaid,$tyyppi,$nimi)=split(/\|/,$rec,4);
if($id==$in{'eventid'} && $tyyppi ==3){
$viesti=1;
}
}
$kilp=1;
while($in{"k".$kilp} ne ''){
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
$ok=0;
while (defined ($rec = )) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec);
if ($in{"k".$kilp} eq $id){
$viiva[$kilp]=$viivat;
$rast[$kilp]=$rastit;
$nim[$kilp]=$nimi;
$kilp++;$ok=1;
}
}
close(SISAAN);
if($ok==0){$kilp++;}
}
## nyt onreittipiirros ja rastipisteet selvillä
$kilp=1;
while($in{"k".$kilp} ne''){
if($viiva[$kilp] ne ''){
print substr($nim[$kilp]." ",0,20);
if($in{"k".$kilp}<100000){
@reitti=split(/N/,$viiva[$kilp]);
@rastit=split(/N/,$rast[$kilp]);
$i=0;
$viiva[$kilp]=$viiva[$kilp]."N";
$viivatemp="";
foreach $rec (@rastit){
$i++;
if($rec ne ""){
$j="NC".$i."N";$k="N".$rec."N";
($temp,$viiva[$kilp])=split(/${k}/,$viiva[$kilp],2);
$viiva[$kilp]="N".$viiva[$kilp];
$viivatemp.=$temp.$j;
}
}
$viiva[$kilp]=$viivatemp;
$i=0;
foreach $rec (@rastit){
$i++;$j="NC".$i."N";$k="N".$rec.'|'.$rec."N";
$viiva[$kilp]=~ s/${j}/${k}/;
}
$viiva[$kilp]=~ s/^\|//;
$viiva[$kilp]=~ s/NN/N/g;
$viiva[$kilp]=~ s/NN/N/g;
$viiva[$kilp]=~ s/NN/N/g;
@rastivalit=split(/\|/,$viiva[$kilp]);
$ulos=join("\n",@rastivalit);
$i=0;
foreach $rec (@rastivalit){
$rec=~ s/^N//;
}
$i_rastit=0;
$i_reitti=0;
$i_piste=0;
$aika=0;
$matka=0;
$totpit=0;
foreach $rc (@rastivalit){
$rastivalit[$i_rastit]=~ s/^N//;
@viivab=split(/N/,$rastivalit[$i_rastit]);
# lasketaan pituus
$x0=0;
$y0=0;
$pituus=0;
$i=0;
foreach $rec (@viivab){
($x1,$y1)=split(/\;/,$rec);
if($i>0){
$pituus=$pituus+sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1));
}else{
$alkux=$x1;$alkuy=$y1;
}
$x0=$x1;$y0=$y1;
$i++;
}
if($alkux !=$x1 && $alkuy !=$y1){
#print substr((floor($pituus/sqrt(($alkux-$x1)*($alkux-$x1)+($alkuy-$y1)*($alkuy-$y1))*1000)/10).' ',0,5).' ';
#print substr((($pituus-sqrt(($alkux-$x1)*($alkux-$x1)+($alkuy-$y1)*($alkuy-$y1)))).' ',0,5).' ';
print substr(floor($pituus).' ',0,5).' ';
$totpit+=$pituus;
}else{
print ' ';
}
$i_rastit++;
}
}
print ' '.floor($totpit).' '.$nim[$kilp]."\n";
}else{
print "\n";
}
$kilp++;
}
###
}
#############################################
if ($in{'act'} eq 'help' ){
# tsekataan kieli
$kieli=$default_lang;
foreach $rec (@languages){
if($in{'kieli'} eq $rec){$kieli=$rec;}
}
open (SISAAN,"<".$path."../lang_".$kieli.".txt");
@lang=;
close(SISAAN);
$lang=join('',@lang);
($lang, $langkiitos)=split(/####/,join('',@lang));
open (SISAAN,"<".$path."../map.txt");
@sivu=;
close(SISAAN);
$sivu= join('',@sivu);
($head,$applet,$end)=split(/applet/i,$sivu);
$head=$head.'table width=100% height=94% cellpadding=25 cellspacing=1>'.$lang.'
param('tracklog');
binmode $file;
@d =<$file>;
close($file);
open (SISAAN,"<".$path."kisat.txt");
@kartat=;
close(SISAAN);
foreach $rec (@kartat) {
chomp($rec);
($id,$karttaid,$tyyppi,$nimi,$paiva,$seura,$taso,$notes)=split(/\|/,$rec,8);
if($in{'id'} eq $id){
$mapid=$karttaid;
}
}
open(HANDLE, "<".$path."kartat.txt")|| die;
@kdata=;
close(HANDLE);
$coord[0]='';
$coord[4]='';
foreach $rec (@kdata){
chomp($rec);
($id,$nimi)=split(/\|/,$rec);
if($id eq $mapid){
($id,$nimi,$copyright,$s1x,$o1x,$s1y,$o1y,$s2x,$o2x,$s2y,$o2y,$s3x,$o3x,$s3y,$o3y)=split(/\|/,$rec);
if($o1x != 0){
$s1y=-$s1y;
$s2y=-$s2y;
$s3y=-$s3y;
$lat0=$o1y;
$lon0=$o1x;
$kaavao1y=$o1y;
$kaavao1x=$o1x;
$r=6370000;
$pi=3.1415926535897932384626433832795;
$lat=$o1y;
$lon=$o1x;
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$o1y=$north;
$o1x=$east;
$lat=$o2y;
$lon=$o2x;
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$o2y=$north;
$o2x=$east;
$lat=$o3y;
$lon=$o3x;
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$o3y=$north;
$o3x=$east;
$xnolla1=$o1x;
$ynolla1=$o1y;
$xi=$o2x-$xnolla1;$yi=$o2y-$ynolla1;$xj=$o3x-$xnolla1;$yj=$o3y-$ynolla1;
$xnolla=$s1x;
$ynolla=$s1y;
$x1 = $s2x-$xnolla;$y1 = $s2y-$ynolla;$x2 = $s3x-$xnolla;$y2 = $s3y-$ynolla;
#nollalla jakamisen esto
if($xj==0){$xj=0.000000000001;}
if($yj==0){$yj=0.000000000001;}
if(($xj * $yi - $yj * $xi)==0){$xj=$xj+0.000000000001;}
if(($yj * $xi - $xj * $yi)==0){$yj=$yj+0.0000000000001;}
$Gb = ($x1 * $xj - $x2 * $xi) / ($xj * $yi - $yj * $xi);
$Ga = ($x2 - $Gb * $yj) / $xj;
$Gd = ($y1 * $yj - $y2 * $yi) / ($yj * $xi - $xj * $yi);
$Gc = ($y2 - $Gd * $xj) / $yj;
}
}
}
if($in{'regtest'} eq '1'){ # reg test gpx
open(HANDLE,"<".$path.'coord.txt');
@f=;
close(HANDLE);
$compmax=0;
foreach $rec (@f){
chomp($rec);
if($rec =~/\|/){
@r=split(/\|/,$rec,2);
$rname{1*$r[0]}=$r[1];
if($compmax < 1*$r[0]){$compmax = 1*$r[0];}
}
}
($o1x,$o1y)=split(/\,/,$f[0]);
($o2x,$o2y)=split(/\,/,$f[1]);
($o3x,$o3y)=split(/\,/,$f[2]);
($s1x,$s1y)=split(/\,/,$f[3]);
($s2x,$s2y)=split(/\,/,$f[4]);
($s3x,$s3y)=split(/\,/,$f[5]);
$s1y=-$s1y;
$s2y=-$s2y;
$s3y=-$s3y;
$lat0=$o1y;
$lon0=$o1x;
$r=6370000;
$pi=3.1415926535897932384626433832795;
$lat=$o1y;
$lon=$o1x;
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$o1y=$north;
$o1x=$east;
$lat=$o2y;
$lon=$o2x;
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$o2y=$north;
$o2x=$east;
$lat=$o3y;
$lon=$o3x;
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$o3y=$north;
$o3x=$east;
$xnolla1=$o1x;
$ynolla1=$o1y;
$xi=$o2x-$xnolla1;$yi=$o2y-$ynolla1;$xj=$o3x-$xnolla1;$yj=$o3y-$ynolla1;
$xnolla=$s1x;
$ynolla=$s1y;
$x1 = $s2x-$xnolla;$y1 = $s2y-$ynolla;$x2 = $s3x-$xnolla;$y2 = $s3y-$ynolla;
#nollalla jakamisen esto
if($xj==0){$xj=0.000000000001;}
if($yj==0){$yj=0.000000000001;}
if(($xj * $yi - $yj * $xi)==0){$xj=$xj+0.000000000001;}
if(($yj * $xi - $xj * $yi)==0){$yj=$yj+0.0000000000001;}
$Gb = ($x1 * $xj - $x2 * $xi) / ($xj * $yi - $yj * $xi);
$Ga = ($x2 - $Gb * $yj) / $xj;
$Gd = ($y1 * $yj - $y2 * $yi) / ($yj * $xi - $xj * $yi);
$Gc = ($y2 - $Gd * $xj) / $yj;
###
$splitter="-1 && $p2>-1){
$lat=substr($point,$p1+5,$p2-$p1-5);
$lat =~ s/ //g;
$lat =~ s/\"//g;
}
$p1=index($point,"lon=\"");
$p2=index($point,"\"",$p1+5);
if($p1>-1 && $p2>-1){
$lon=substr($point,$p1+5,$p2-$p1-5);
$lon =~ s/ //g;
$lon =~ s/\"//g;
}
($lon,$lat)=($lat,$lon);
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$easting = floor($s1x+ ((($Ga*($east-$xnolla1) + $Gb*($north-$ynolla1)))));
$northing= -floor($s1y+ ((($Gc*($north-$ynolla1) + $Gd*($east-$xnolla1)))));
$GPSparam.="1,$easting,$northing;";
}
} # reg test gpx
if($in{'gpstype'} eq 'HST'){
$GPSparam='';
$pi=3.1415926535897932384626433832795;
$splitter="Run";
$start='<'.$splitter;
$end=''.$splitter.'>';
$sea=$start.'>';
$rep=$start.' >';
$d= join('',@d);
$d=~ s/${sea}/${rep}/g;
$start=$start.' ';
@routes=split(/${start}/,$d);
$routecount=0;
$rec= $routes[1];
$routecount++;
($rec,$del)=split(/${end}/,$rec);
$starttime="Start time unknown";
$p1=index($rec,'StartTime=');
$p2=index($rec,"\"",$p1+12);
if($p1>-1 && $p2>$p1){
$starttime=substr($rec,$p1+10,$p2-$p1-10);
$starttime =~ s/ //g;
$starttime =~ s/\"//g;
$starttime =~ s/t/ /gi;
$starttime =~ s/z/ /gi;
}
@trackpoints=split(//,$rec);
$lat0=-987654;
foreach $point (@trackpoints){
$lat=-9999999;
$lon=-9999999;
$alt=-9999999;
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
#2006-04-01T05:00:05Z
$tim=substr($point,$p1+6,$p2-$p1-6);
$tim=~ s/Z//g;
$tim=~ s/\-/\:/g;
$tim=~ s/T/\:/g;
($tyear,$tmon,$tday,$thour,$tmin,$tsec)=split(/\:/,$tim);
$tim=floor(3600*$thour+60*$tmin+$tsec);
$day=$tyear.'_'.$tmon.'_'.$tday;
}
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
$lat=substr($point,$p1+17,$p2-$p1-17);
$lat =~ s/ //g;
}
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
$lon=substr($point,$p1+18,$p2-$p1-18);
$lon =~ s/ //g;
}
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
$alt=substr($point,$p1+16,$p2-$p1-16);
$alt =~ s/ //g;
}
if($lat!=-9999999 && $lon !=-9999999){
$count++;
if($lat0==-987654){
$lat0=$lat;
$lon0=$lon;
$daycount=0;
$tim0=$tim;
$day0=$day;
$gpsstarttime=$tim0;
}
## this not very scientific, byt must do for now ...
$r=6370000;
$northing=-floor(($lat-$lat0)/360*2*$pi*$r);
$easting=floor(($lon-$lon0)/360*2*$r*$pi *cos(abs($lat0)/180*$pi));
if($day0 ne $day){
$day0 = $day;
$daycount++;
}
$tim=$tim+$daycount*60*60*24-$tim0;
$GPSparam.="$tim,$easting,$northing;";
}
}
# add points if too big gaps
@ad=split(/\;/,$GPSparam);
$GPSparam='';
foreach $pt (@ad){
@r=split(/\,/,$pt);
if($edtim ne '' && $ed +3 < $r[0]){
for($i=$edtim+1;$i<$r[0];$i++){
$tim=$i;
$easting=floor(($i-$edtim)/($r[0]-$edtim)*$r[1]+($r[0]-$i)/($r[0]-$edtim)*$edeast);
$northing=floor(($i-$edtim)/($r[0]-$edtim)*$r[2]+($r[0]-$i)/($r[0]-$edtim)*$ednorth);
$GPSparam.="$tim,$easting,$northing;";
}
}
$GPSparam.=join(',',@r).";";
$edtim=$r[0];
$edeast=$r[1];
$ednorth=$r[2];
}
} # HST
if($in{'gpstype'} eq 'TCX'){
$GPSparam='';
$pi=3.1415926535897932384626433832795;
$splitter="Activity";
$start='<'.$splitter;
$end=''.$splitter.'>';
$sea=$start.'>';
$rep=$start.' >';
$d= join('',@d);
$d=~ s/${sea}/${rep}/g;
$start=$start.' ';
@routes=split(/${start}/,$d);
$routecount=0;
$rec= $routes[1];
$routecount++;
($rec,$del)=split(/${end}/,$rec);
$starttime="Start time unknown";
$p1=index($rec,'StartTime=');
$p2=index($rec,"\"",$p1+12);
if($p1>-1 && $p2>$p1){
$starttime=substr($rec,$p1+10,$p2-$p1-10);
$starttime =~ s/ //g;
$starttime =~ s/\"//g;
$starttime =~ s/t/ /gi;
$starttime =~ s/z/ /gi;
}
@trackpoints=split(//,$rec);
$lat0=-987654;
foreach $point (@trackpoints){
$lat=-9999999;
$lon=-9999999;
$alt=-9999999;
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
#2006-04-01T05:00:05Z
$tim=substr($point,$p1+6,$p2-$p1-6);
$tim=~ s/Z//g;
$tim=~ s/\-/\:/g;
$tim=~ s/T/\:/g;
($tyear,$tmon,$tday,$thour,$tmin,$tsec)=split(/\:/,$tim);
$tim=3600*$thour+60*$tmin+$tsec;
$day=$tyear.'_'.$tmon.'_'.$tday;
}
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
$lat=substr($point,$p1+17,$p2-$p1-17);
$lat =~ s/ //g;
}
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
$lon=substr($point,$p1+18,$p2-$p1-18);
$lon =~ s/ //g;
}
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
$alt=substr($point,$p1+16,$p2-$p1-16);
$alt =~ s/ //g;
}
if($lat!=-9999999 && $lon !=-9999999){
$count++;
if($lat0==-987654){
$lat0=$lat;
$lon0=$lon;
$daycount=0;
$tim0=$tim;
$day0=$day;
}
## this not very scientific, byt must do for now ...
$r=6370000;
$northing=-floor(($lat-$lat0)/360*2*$pi*$r);
$easting=floor(($lon-$lon0)/360*2*$r*$pi *cos(abs($lat0)/180*$pi));
if($day0 ne $day){
$day0 == $day;
$daycount++;
}
$tim=$tim+$daycount*60*60*24-$tim0;
$GPSparam.="$tim,$easting,$northing;";
}
}
} # TCX
if($in{'gpstype'} eq 'GPX' || $in{'calib'} eq '1'){
$GPSparam='';
$pi=3.1415926535897932384626433832795;
$splitter="');
$p2=index($point,'');
if($p1>-1 && $p2>-1){
#2006-04-01T05:00:05Z
#2007-02-11T12:21:40.00-05:00
$tim=substr($point,$p1+6,$p2-$p1-6);
$tim=~ s/Z//g;
$tim=~ s/\-/\:/g;
$tim=~ s/T/\:/g;
($tyear,$tmon,$tday,$thour,$tmin,$tsec)=split(/\:/,$tim);
$tim=floor(3600*$thour+60*$tmin+$tsec);
$day=$tyear.'_'.$tmon.'_'.$tday;
}
$p1=index($point,"lat=\"");
$p2=index($point,"\"",$p1+1);
if($p1>-1 && $p2>-1){
$lat=substr($point,$p1+5,$p2-$p1-5);
$lat =~ s/ //g;
$lat =~ s/\"//g;
}
$p1=index($point,"lon=\"");
$p2=index($point,"\"",$p1+1);
if($p1>-1 && $p2>-1){
$lon=substr($point,$p1+5,$p2-$p1-5);
$lon =~ s/ //g;
$lon =~ s/\"//g;
}
$p1=index($point,'');
$p2=index($point,' ');
if($p1>-1 && $p2>-1){
$alt=substr($point,$p1+4,$p2-$p1-4);
$alt =~ s/ //g;
}
if($lat!=-9999999 && $lon !=-9999999){
$count++;
if($lat0==-987654){
$lat0=$lat;
$lon0=$lon;
$daycount=0;
$tim0=$tim;
$day0=$day;
$gpsstarttime=$tim0;
}
## this not very scientific, byt must do for now ...
$r=6370000;
$northing=-floor(($lat-$lat0)/360*2*$pi*$r);
$easting=floor(($lon-$lon0)/360*2*$r*$pi *cos(abs($lat0)/180*$pi));
###
if($Ga ne '' && $in{'calib'} ne '1'){
#($lon,$lat)=($lat,$lon);
$lat0=$kaavao1y;
$lon0=$kaavao1x;
$north= (($lat-$lat0)/360*2*$pi*$r);
$east= (($lon-$lon0)/360*2*$r*$pi *cos($lat0/180*$pi));
$easting = floor($s1x+ ((($Ga*($east-$xnolla1) + $Gb*($north-$ynolla1)))));
$northing= -floor($s1y+ ((($Gc*($north-$ynolla1) + $Gd*($east-$xnolla1)))));
}
##
if($day0 ne $day){
$day0 = $day;
$daycount++;
}
$tim=$tim+$daycount*60*60*24-$tim0;
$GPSparam.="$tim,$easting,$northing;";
if($easting>$gpsxmax){$gpsxmax=$easting;$gpsxmaxe=1*$lon;$gpsxmaxn=1*$lat;}
if($northing>$gpsymax){$gpsymax=$northing;$gpsymaxn=1*$lat;$gpsymaxe=1*$lon;}
if($easting<$gpsxmin){$gpsxmin=$easting;$gpsxmine=1*$lon;$gpsxminn=1*$lat;}
if($northing<$gpsymin){$gpsymin=$northing;$gpsyminn=1*$lat;$gpsymine=1*$lon;}
}
}
# add points if too big gaps
@ad=split(/\;/,$GPSparam);
$GPSparam='';
foreach $pt (@ad){
@r=split(/\,/,$pt);
if($edtim ne '' && $ed +3 < $r[0]){
for($i=$edtim+1;$i<$r[0];$i++){
$tim=$i;
$easting=floor(($i-$edtim)/($r[0]-$edtim)*$r[1]+($r[0]-$i)/($r[0]-$edtim)*$edeast);
$northing=floor(($i-$edtim)/($r[0]-$edtim)*$r[2]+($r[0]-$i)/($r[0]-$edtim)*$ednorth);
$GPSparam.="$tim,$easting,$northing;";
}
}
$GPSparam.=join(',',@r).";";
$edtim=$r[0];
$edeast=$r[1];
$ednorth=$r[2];
}
} # GPX
#KML (FRWD Google Earth Export)
if ($in{'gpstype'} eq 'KML')
{
$gpsstarttime=0; # unknown
$GPSparam = '';
$pi = 3.1415926535897932384626433832795;
$d = join('', @d);
($pois, $d) = split(//i, $d, 2);
($d, $pois) = split(/<\/coordinates>/i, $d, 2);
$d =~ s/\t/ /;
$d =~ s/\n/ /;
$d =~ s/ +/ /;
@trackpoints = split(/ /, $d);
$PMKparam = '';
$e = join('', @d);
@placemarks = split(//, $e);
$kesto = 0;
$placemarkcount = 0;
foreach $placemark (@placemarks)
{
$placemarkcount++;
$placemark =~ s/\t/ /;
$placemark =~ s/\n/ /;
$placemark =~ s/ +/ /;
$description = $placemark;
($pois, $description) = split(//, $description, 2);
($description, $pois) = split(/<\/description>/, $description, 2);
$timeindex = index($description, ':mm:ss): ');
if ($timeindex > -1)
{
$time = $description;
($pois, $time) = split(/\:mm\:ss\)\: /, $time, 2);
($time, $pois) = split(/<\/p>/, $time, 2);
($tunnit, $minuutit, $sekunnit) = split(/\:/, $time, 3);
$kesto = $tunnit * 60 * 60 + $minuutit * 60 + $sekunnit;
$coordinates = $placemark;
($pois, $coordinates) = split(//, $coordinates, 2);
($coordinates, $pois) = split(/<\/coordinates>/, $coordinates, 2);
($lon, $lat, $alt) = split(/\,/, $coordinates, 3);
$PMKparam .= "$kesto,$lon,$lat;";
}
}
$trackpointcount = @trackpoints;
$interval = int($kesto / $trackpointcount + .5);
@placemarks = split(/\;/, $PMKparam);
$currentplacemark = 0;
$lat0 = -987654;
$tim = 0;
$runningtim = $interval * -1;
foreach $point (@trackpoints)
{
if ($point)
{
$lat = -9999999;
$lon = -9999999;
$pmktim = 0;
$pmklat = -9999999;
$pmklon = -9999999;
($pmktim, $pmklon, $pmklat) = split(/\,/, @placemarks[$currentplacemark]);
($lon, $lat) = split(/\,/, $point);
if ($lon == $pmklon && $lat == $pmklat)
{
$tim = $pmktim;
$currentplacemark++;
if ($runningtim + $interval == $tim)
{
$runningtim = $tim;
}
}
else
{
$tim = $runningtim + $interval;
$runningtim = $tim;
}
if ($lat != -9999999 && $lon != -9999999 && $lat != 0 && $lon != 0)
{
$count++;
if ($lat0 == -987654)
{
$lat0 = $lat;
$lon0 = $lon;
}
## this not very scientific, byt must do for now ...
$r = 6370000;
$northing = -floor(($lat - $lat0) / 360 * 2 * $pi * $r);
$easting = floor(($lon - $lon0) / 360 * 2 * $r * $pi * cos(abs($lat0) / 180 * $pi));
$GPSparam .= "$tim,$easting,$northing;";
}
}
}
} # KML (FRWD Google Earth Export)
if($in{'gpstype'} eq 'FRWD'){
$route=join('',@d);
$route =~ s/\r//g;
($head,$route)=split(/Route data\:\n/,$route,2);
($route,$rest)=split(/\n\n/,$route,2);
@d=split(/\n/,$route);
@cols=split(/\t/,$d[0]);
$i=0;
foreach $rec (@cols){
$coli{$rec}=$i;
$i++;
}
$GPSparam='';
$lat0=-987654;
$i=0;
foreach $rec (@d){
if($i>0){
$rec =~ s/\,/\./g;
@cols=split(/\t/,$d[$i]);
$lat=&trim($cols[$coli{'N/S latitude (ddmm.mmmm)'}]);
$lon=&trim($cols[$coli{'E/W longitude (dddmm.mmmm)'}]);
if($lat ne '' && $lon ne '' ){
$lat=substr($lat,0,2)+substr($lat,2,10)/60;
$lon=substr($lon,0,2)+substr($lon,2,10)/60;
if($lat0==-987654){
$lat0=$lat;
$lon0=$lon;
$tim0=1*$cols[$coli{'Time'}];
$gpsstarttime=$tim0;
}
## this not very scientific, byt must do for now ...
$r=6370000;
$N=-floor(($lat-$lat0)/360*2*$pi*$r);
$E=floor(($lon-$lon0)/360*2*$r*$pi *cos(abs($lat0)/180*$pi));
$tim=1*$cols[$coli{'Time'}]-$tim0;
$GPSparam.="$tim,$E,$N;";
}
}
$i++;
}
# add points if too big gaps
@ad=split(/\;/,$GPSparam);
$GPSparam='';
foreach $pt (@ad){
@r=split(/\,/,$pt);
if($edtim ne '' && $ed +3 < $r[0]){
for($i=$edtim+1;$i<$r[0];$i++){
$tim=$i;
$easting=floor(($i-$edtim)/($r[0]-$edtim)*$r[1]+($r[0]-$i)/($r[0]-$edtim)*$edeast);
$northing=floor(($i-$edtim)/($r[0]-$edtim)*$r[2]+($r[0]-$i)/($r[0]-$edtim)*$ednorth);
$GPSparam.="$tim,$easting,$northing;";
}
}
$GPSparam.=join(',',@r).";";
$edtim=$r[0];
$edeast=$r[1];
$ednorth=$r[2];
}
} # FRWD
if($in{'gpstype'} eq 'SDF'){
$route=join('',@d);
$route =~ s/\r//g;
($head,$route)=split(/\[POINTS\]\n/,$route,2);
($route,$rest)=split(/\[/,$route,2);
@d=split(/\n/,$route);
$GPSparam='';
$lat0=-987654;
$i=0;
foreach $rec (@d){
if($i>0){
@cols=split(/\,/,$rec);
# "TP",06.03.2005,16:54.51,60.2565145,24.9067569,6,4.06,159.6,3061.6449732686
$lat=&trim($cols[3]);
$lon=&trim($cols[4]);
$tim=$cols[1].':'.$cols[2];
$tim=~s/\./\:/g;
($tday,$tmon,$tyear,$thour,$tmin,$tsec)=split(/\:/,$tim);
$tim=3600*$thour+60*$tmin+$tsec;
$day=$tyear.'_'.$tmon.'_'.$tday;
if($lat0==-987654){
$lat0=$lat;
$lon0=$lon;
$daycount=0;
$tim0=$tim;
$day0=$day;
$gpsstarttime=$tim0;
}
## this not very scientific, byt must do for now ...
$r=6370000;
$northing=-floor(($lat-$lat0)/360*2*$pi*$r);
$easting=floor(($lon-$lon0)/360*2*$r*$pi *cos(abs($lat0)/180*$pi));
if($day0 ne $day){
$day0 = $day;
$daycount++;
}
$tim=$tim+$daycount*60*60*24-$tim0;
$GPSparam.="$tim,$easting,$northing;";
}
$i++;
}
# add points if too big gaps
@ad=split(/\;/,$GPSparam);
$GPSparam='';
foreach $pt (@ad){
@r=split(/\,/,$pt);
if($edtim ne '' && $ed +3 < $r[0]){
for($i=$edtim+1;$i<$r[0];$i++){
$tim=$i;
$easting=floor(($i-$edtim)/($r[0]-$edtim)*$r[1]+($r[0]-$i)/($r[0]-$edtim)*$edeast);
$northing=floor(($i-$edtim)/($r[0]-$edtim)*$r[2]+($r[0]-$i)/($r[0]-$edtim)*$ednorth);
$GPSparam.="$tim,$easting,$northing;";
}
}
$GPSparam.=join(',',@r).";";
$edtim=$r[0];
$edeast=$r[1];
$ednorth=$r[2];
}
} # SDF
}
##
# tsekataan kieli
$kieli=$default_lang;
foreach $rec (@languages){
if($in{'kieli'} eq $rec){$kieli=$rec;}
}
open (SISAAN,"<".$path."../lang_".$kieli.".txt");
@lang=;
close(SISAAN);
$lang=join('',@lang);
($lang, $langkiitos)=split(/####/,join('',@lang));
if($in{'kohdistus'}eq "1"){
$muu=" \n \n";
}
if($in{'piirrarastit'}eq "1"){
$muu=$muu." \n \n";
}
if($in{'eipiirtaneet'} eq "1" || $norouteanim==1){
$muu=$muu.=" \n";
}
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
if($in{'calib'} eq '1'){
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n";
$muu=$muu." \n \n ";
}
if($in{'calib'} ne '1' && $in{'regtest'} ne '1' && ($in{'tracking'} ==1 || $in{'id'} eq '0' ) && ! ($in{'piirrarastit'} eq '1')){
$muu=$muu." \n";
}
if($in{'width'} eq''){$in{'width'}=775; }
if($in{'height'} eq''){$in{'height'}=500; }
$in{'width'}=1*$in{'width'};
$in{'height'}=1*$in{'height'};
open (SISAAN,"<".$path."kisat.txt");
@kartat=;
close(SISAAN);
if($in{'id'} eq '0'){
undef @kartat;
$kartat[0]="0|0|2| | | | |";
}
foreach $rec (@kartat) {
chomp($rec);
($id,$karttaid,$tyyppi,$nimi,$paiva,$seura,$taso,$notes)=split(/\|/,$rec,8);
$nimi=$paiva.' '.$nimi;
if($id eq $in{'id'}){
$muu=$muu." \n";
open (SISAAN,"<".$path."../map.txt");
@sivu=;
close(SISAAN);
if($id==0 && $in{'mapid'} ne ''){
$karttaid=1*$in{'mapid'};
}
$sivu= join('',@sivu);
$sivu =~ s/##httppath##/${httppath}/g;
$sivu =~ s/##extension##/${extension}/g;
$sivu =~ s/##logo##/${logo}/g;
$sivu =~ s/##icon##/${gadgeticon}/g;
$sivu =~ s/##piste##/${piste}/g;
$sivu =~ s/##kieli##/${kieli}/g;
$sivu =~ s/##nimi##/${nimi}/g;
$sivu =~ s/##status##/2/;
$sivu =~ s/##id##/${in{'id'}}/;
$sivu =~ s/##karttaid##/${karttaid}/;
$sivu =~ s/##ratapiirto##/${in{'ratapiirto'}}/;
$sivu =~ s/##muu##/${muu}/;
$sivu =~ s/##ohjeet##/${lang}/;
$sivu =~ s/##width##/${in{'width'}}/g;
$sivu =~ s/##height##/${in{'height'}}/g;
$temp='';
foreach $rec (@languages){
$temp=$temp."|$rec ";
}
$temp=$temp." GPS ";
$temp=~ s/\|//;
$sivu =~ s/##languages##/${temp}/;
print $sivu;
exit;
}}
}
################# gps upload ####################
if ($in{"act"} eq "gpsu"){
print"
GPS track log file upload [Help ]
";
#### If KML, saving interval (in seconds):
}
################# animaatio ####################
if ($in{"act"} eq "anim"){
# Tästä apletti pyytää animaatiopisteet
$raika=3; ## step - aika sekunteina
open (SISAAN,"<".$path."kisat.txt");
@kartat=;
close(SISAAN);
$viesti=0;
foreach $rec (@kartat) {
chomp($rec);
($id,$karttaid,$tyyppi,$nimi)=split(/\|/,$rec,4);
if($id==$in{'eventid'} && $tyyppi ==3){
$viesti=1;
}
}
## haetaan suora reitti
open (SISAAN,"<".$path."ratapisteet_$in{'eventid'}.txt");
@ratap=;
close(SISAAN);
foreach $rec (@ratap){
chomp($rec);
($id,$data)=split(/\|/,$rec,2);
@temp=split(/N/,$data);
$data="";
foreach $recb (@temp){
chomp($recb);
($x,$y)=split(/\;/,$recb,2);
$data=$data.($x).";".($y)."N";
}
$suorareitti{$id}=$data;
($pis,$data)=split(/N/,$data,2);
$suorarastit{$id}=$data;
}
## suora reitti ok
## haetaan valiajat
$kilp=1;$laikaMin=99999999;
#while($in{"k".$kilp} ne''){
open (SISAAN,"<$path"."kilpailijat_$in{'eventid'}.txt");
$ok=0;
while (defined ($rec = ) && $in{"k".$kilp} ne'') {
chomp($rec);
($id,$sarjanro,$sarjanimi,$nimi,$laika,$aika,$sija,$tulos,$valiajat,$GPSa)=split(/\|/,$rec);
if($id eq $in{'k'.$kilp}){
$lahtoaika[$kilp]=$laika;
if($laika<$laikaMin){
$laikaMin=$laika;
}
$vajat[$kilp]=$valiajat;
$gpsani[$kilp]=$GPSa;
$srj{$kilp}=$sarjanro;
if($viesti ==1){
$srj{$kilp}=$sija;
}
$kilp++;$ok=1;
seek(SISAAN, 0, 0);
}
}
if($ok==0){exit;}
#}
close(SISAAN);
# valiajat nyt muuttujassa $vajat[]
$kilp=1;
while($in{"k".$kilp} ne''){
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
$ok=0;
while (defined ($rec = )) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec);
if ($in{"k".$kilp} eq $id){
$viiva[$kilp]=$viivat;
$rast[$kilp]=$rastit;
$kilp++;$ok=1;
}
}
if($ok==0){ # ei ollut piirtänyt, tilalle suora reitti
$viiva[$kilp]="N".$suorareitti{$srj{$kilp}};
$rast[$kilp]="N".$suorarastit{$srj{$kilp}};
$kilp++;
#exit;
}
}
close(SISAAN);
## nyt on valiajat, reittipiirros ja rastipisteet selvillä
## nyt lasketaan animaatioille pisteet
## tämä pitäisi tehdä clientissä serveriä säästääksemme, mutta
## ei nyt jaksa javalla väsätä, ehkä sitten joskus
$kilp=1;
while($in{"k".$kilp} ne''){
$aikasiirto=0;
if($in{"k".$kilp}<50000){
print ''.($lahtoaika[$kilp]-$laikaMin).';';
@reitti=split(/N/,$viiva[$kilp]);
@valiajat=split(/\;/,$vajat[$kilp]);
@rastit=split(/N/,$rast[$kilp]);
$i=0;
$viiva[$kilp]=$viiva[$kilp]."N";
$viivatemp="";
foreach $rec (@rastit){
$i++;
if($rec ne ""){
$j="NC".$i."N";$k="N".$rec."N";
($temp,$viiva[$kilp])=split(/${k}/,$viiva[$kilp],2);
$viiva[$kilp]="N".$viiva[$kilp];
$viivatemp=$viivatemp.$temp.$j;
}
}
$viiva[$kilp]=$viivatemp;
$i=0;
foreach $rec (@rastit){
$i++;$j="NC".$i."N";$k="N".$rec.'|'.$rec."N";
$viiva[$kilp]=~ s/${j}/${k}/;
}
$viiva[$kilp]=~ s/^\|//;
$viiva[$kilp]=~ s/NN/N/g;
$viiva[$kilp]=~ s/NN/N/g;
$viiva[$kilp]=~ s/NN/N/g;
@rastivalit=split(/\|/,$viiva[$kilp]);
$ulos=join("\n",@rastivalit);
$i=0;
$matkasiirto=0;
foreach $rec (@rastivalit){
$rec=~ s/^N//;
$matkasiirto=0;
$i++;
}
$i_rastit=0;
$i_reitti=0;
$i_valiajat=0;
$i_piste=0;
$aika=0;
$matka=0;
$eka=1;
while ($valiajat[$i_rastit] ne '' && ($i_rastit==0 || $valiajat[$i_rastit]>$valiajat[$i_rastit-1])){
$rastivalit[$i_rastit]=~ s/^N//;
@viivab=split(/N/,$rastivalit[$i_rastit]);
# lasketaan pituus
$x0=0;
$y0=0;
$pituus=0;
$i=0;
$lisaaika=0;
foreach $rec (@viivab){
($x1,$y1)=split(/\;/,$rec);
if($i>0){
$pituus=$pituus+sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1));
if($x0 == $x1 && $y0 == $y1){
## 2 peräkkäistä klikkausta = pysähdys 3 sec
$lisaaika=$lisaaika+3;
}
}
$x0=$x1;$y0=$y1;
$i++;
}
$valiaika=$valiajat[$i_rastit]-$valiajat[$i_rastit-1];
if($i_rastit==0){
$valiaika=$valiajat[$i_rastit];
}
## hyomioidaan pysähdykset
$valiaika=$valiaika-$lisaaika;
if($valiaika ==0 || $valiaika<0 ){
$valiaika=0.00001;
}
$step=($pituus/($valiaika/$raika));
$matkasiirto=$aikasiirto*$step;
# pisteet polylinen varrelle
$i=0;$seis=0;
foreach $rec (@viivab){
($x1,$y1)=split(/\;/,$rec);
if($i>0){
if($x0 == $x1 && $y0 == $y1){
$seis++;
## ei kahta peräkkäistä klikkausta samaan pisteeseen
}else{
$plkm=1;
while($matka+$step*$plkm-$matkasiirto < $matka+sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1))){
$i_piste++;
#lasketaan animaatioreittipiste
$ax=floor((($step*$plkm-$matkasiirto)*$x1+$x0*(sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1))-($step*$plkm-$matkasiirto)))/(sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1))));
$ay=floor((($step*$plkm-$matkasiirto)*$y1+$y0*(sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1))-($step*$plkm-$matkasiirto)))/(sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1))));
$info="";
if($eka==1){
$eka=0;
$info='C';
}
print "$ax;".$ay.",".$info."N";
$info="";
if($seis > 0){
for($ii=0;$ii<$seis;$ii++){
print "$ax;$ay,".$info."N";
}
$seis=0;
}
$plkm++;
}
$matkasiirto=$matka+sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1))-($matka+$step*($plkm-1)-$matkasiirto);
$matka=$matka+sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1));
$aikasiirto=$matkasiirto/$step*1;
}
}
$x0=$x1;$y0=$y1;
$i++;
}
$i_rastit++;
$eka=1;
}
}else{
## gps animaatip
#print "0;0;0,0N";
print ''.($lahtoaika[$kilp]-$laikaMin).';';
print $gpsani[$kilp];
}
$kilp++;
print "\n";
}
}
################# viivat ####################
if ($in{"act"} eq "viivat"){
## tästä appletti lataa viivat
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
@merkinnat=;
close(SISAAN);
$kilp=1;
while($in{"k".$kilp} ne''){
$in{"id"}=$in{"k".$kilp};
$i=0;$loytyi=0;
foreach $rec (@merkinnat) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec);
$i++;
if ($in{"id"} eq $id){
$i++; $loytyi=1;
$viivat =~ s/N/\n/g;
$viivat =~ s/R/\r/g;
$viivat =~ s/#/g/;
print "\n1".$viivat;
}
}
if($i==0){
print " ";
}
if($loytyi==0){
print "\n1\n0;0";
}
print "\n";
$kilp++;
}
}
################# kommentit ####################
if ($in{"act"} eq "kommentit"){
## Tästä apletti pyytää kommentit
open (SISAAN,"<$path"."kommentit_$in{'eventid'}.txt");
@kommentit=;
close(SISAAN);
$kilp=1;
while($in{"k".$kilp} ne''){
$in{"id"}=$in{"k".$kilp};
$i=0;
foreach $rec (@kommentit) {
chomp($rec);
($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$rec);
$i++;
if ($in{"id"} eq $id){
$kommentit =~ s/#nl#/\n/g;
$kommentit =~ s/#cr#/\r/g;
#$kommentit=~ s/\;/#chsmcl#/g;
print "\n\n$nimi:\n".$kommentit;
}
}
$kilp++;
}
}
#
####### TALLENNUKSET##########################################
############# Reittipiirroksen tallennus ######################
if($in{'act'} eq "tallennapiirros"){
open (HANDLE,"<".$path."kilpailijat_$in{'eventid'}.txt");
@d=;
close HANDLE;
if($in{'lisaa'} eq '1'){ ## if add mode
## get ID
foreach $rec (@d){
($id,$rest)=split(/\|/,$rec,2);
if($id>50000){$id=$id-50000;}
if($in{'id'} < $id){$in{'id'}=$id;}
}
$in{'id'}=(1*$in{'id'})+1;
}else{
## read original version of name, to avoid some charset trouble
foreach $rec (@d){
@r=split(/\|/,$rec);
if($in{'id'} == $r[0] && $r[3] ne ''){$in{'suunnistaja'}=$r[3];}
}
}
## input
$in{'suunnistaja'}=~ s/#chsmcl#/\;/g;
$in{'suunnistaja'}=~ s/#chnd#/\&/g;
$in{'kommentit'}=~ s/#chsmcl#/\;/g;
$in{'kommentit'}=~ s/#chnd#/\&/g;
## gps
if($in{'GPS'}==1){
$lahtoaika=-1;
foreach $rec (@d){
($id_t,$sarjanro_t,$sarjanimi_t,$nimi_t,$laika_t,$aika_t,$sija_t,$tulos_t,$valiajat_t,$GPSa_t)=split(/\|/,$rec);
if($id_t == $in{'id'}){
$lahtoaika=$laika_t;
}
}
$in{'suunnistaja'}=' GPS '.$in{'suunnistaja'};
$in{'id'}=50000+$in{'id'};
}
open (SISAAN,"<$path"."merkinnat_$in{'eventid'}.txt");
@merkinnat=;
close(SISAAN);
$ok=1;
foreach $rec (@merkinnat) {
chomp($rec);
($idkilp,$id,$nimi,$hajonta,$viivat,$rastit)=split(/\|/,$rec);
if($id eq $in{'id'}){
$ok=0; ## eli piirros oli jo olemassa, ei tallenneta
}
}
$in{'rdata'}=~ s/\,/\;/g;
($reitti,$rastit)=split(/\|/,$in{'rdata'});
if($ok == 1){
if($in{'GPS'}!=1){
open (HANDLE,">>".$path."merkinnat_$in{'eventid'}.txt");
&lock_file;
print HANDLE $in{'rataid'}."|".$in{'id'}."| $in{'suunnistaja'}|$in{'hajonta'}|$reitti|$rastit\n";
&unlock_file;
close HANDLE;
}else{
@GPSD=split(/N/,$reitti);
$reitti='';
foreach $gd (@GPSD){
chomp($gd);
if($gd ne ''){
($Gx,$Gy,$Gt)=split(/\;/,$gd);
if($Gx ne $GxOLD && $Gy ne $GyOLD){
$reitti.='N'.$Gx.';'.$Gy;
$GxOLD=$Gx;
$GyOLD=$Gy;
}
}
}
$reitti.='|';
## gps animaatio
$GAIKA=0;$ani='';
foreach $gd (@GPSD){
chomp($gd);
if($gd ne ''){
($Gx,$Gy,$Gt)=split(/\;/,$gd);
while($Gt > $GAIKA){
$ani.=$Gx.';'.$Gy.',0N';
$GAIKA=$GAIKA+3;
}
}
}
open (HANDLE,">>".$path."merkinnat_$in{'eventid'}.txt");
&lock_file;
print HANDLE $in{'rataid'}."|".$in{'id'}."| $in{'suunnistaja'}|$in{'hajonta'}|$reitti|$rastit\n";
&unlock_file;
close HANDLE;
}
$in{'kommentit'}=~ s/\n/#nl#/g;
$in{'kommentit'}=~ s/\r/#cr#/g;
open (HANDLE,">>".$path."kommentit_$in{'eventid'}.txt");
&lock_file;
print HANDLE $in{'rataid'}."|".$in{'id'}."|$in{'suunnistaja'}||$in{'kommentit'}\n";
&unlock_file;
close HANDLE;
if($in{'lisaa'} eq '1' || $in{'GPS'}==1){ ## if add mode
if($in{'GPS'}!=1){
## leg lengths
($pois,$lahto,$muut)=split(/N/,$reitti,3);
$sLength=0;
@aControls=split(/N/,($lahto.$rastit));
$ai=0;
foreach $aControl (@aControls){
$ai++;
if($ai>1){
($ax1,$ay1)=split(/\;/,$aControls[$ai-2]);
($ax2,$ay2)=split(/\;/,$aControls[$ai-1]);
$aleg[$ai-1]=sqrt(($ax1-$ax2)*($ax1-$ax2)+($ay1-$ay2)*($ay1-$ay2)); # Pythagoras
}
}
##
$usersplits='';
$splitnro=0;$splitmissing=0;
@splits=split(/m/,$in{'usersplits'});
foreach $split (@splits){
$splitnro++;
($min,$sec)=split(/s/,$split);
if(floor(60*$min+(1*$sec))>0 && $splitmissing==0){
$usersplits.=floor(60*$min+(1*$sec)).';';
$lastsplit=floor(60*$min+(1*$sec));
}
if(floor(60*$min+(1*$sec))==0){# a split is missing
if($splitmissing==0){
$splitmissing=$splitnro;
}
}
if(floor(60*$min+(1*$sec))>0 && $splitmissing>0){ # there has been missing split before this split
$sLength=0;
for($j=$splitmissing;$j<$splitnro+1;$j++){
$sLength=$sLength+$aleg[$j];
}
$averagespeed=(floor(60*$min+(1*$sec))-$lastsplit)/$sLength;
$sLength=0;
for($j=$splitmissing;$j<$splitnro+1;$j++){
$sLength=$sLength+$aleg[$j];
$usersplits.=floor($lastsplit+$sLength*$averagespeed).';';
}
$splitmissing=0;
$lastsplit=floor(60*$min+(1*$sec));
}
}
$result=$min.':'.$sec;
}# if gps!=1
if($in{'GPS'}==1){
$GPSani=$ani;
}
open (HANDLE,">>".$path."kilpailijat_$in{'eventid'}.txt");
&lock_file;
if($in{'hajonta'} eq 'null'){
$in{'hajonta'}='';
}
$lahtoaika=floor(1*$lahtoaika);
if($lahtoaika ==-1){
$lahtoaika=floor(1*$in{'gpsstarttime'});
}
print HANDLE $in{'id'}."|".$in{'rataid'}."||$in{'suunnistaja'}|$lahtoaika||$in{'hajonta'}|$result|$usersplits|$GPSani\n";
&unlock_file;
close HANDLE;
}
}
print "\n";
exit;
}
###################### tallennusonnistui-sivu #################
if ($in{"act"} eq "tallennettu"){
## language check
$kieli="fi";
foreach $rec (@languages){
if($rec eq $in{'kieli'}){
$kieli=$rec;
}
}
open (SISAAN,"<".$path."../lang_".$kieli.".txt");
@lang=;
close(SISAAN);
$lang=join('',@lang);
($lang, $langkiitos)=split(/####/,join('',@lang));
print "
OK
$langkiitos
";
exit;
}
################# radat ####################
if ($in{"act"} eq "rata"){
if($in{'kohdistus'} ne '1'){
## tästä appletti kysyy radan ratapiirrokset
## jos viestimoodi
if($in{"hajonnat"} ne''){
open (SISAAN,"<$path"."radat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($id,$status,$nimi,$viivat)=split(/\|/,$rec);
if ($in{"id"} eq $id || index($in{"hajonnat"},'s'.$id.'s')>-1){
$viivat =~ s/N/\n/g;
$viivat =~ s/R/\r/g;
$viivat =~ s/#//g;
print "$viivat\n";
}
}
close(SISAAN);
}else{#henk koht
open (SISAAN,"<$path"."radat_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($id,$status,$nimi,$viivat)=split(/\|/,$rec);
if ($in{"id"} == $id || $in{"id"} eq '99999'){
$viivat =~ s/N/\n/g;
$viivat =~ s/R//g;
$viivat =~ s/#//g;
if($in{"id"} ne '99999'){
print "$viivat\n";
}else{
$count++;
$out.=$viivat."\n";
}
}
}
close(SISAAN);
if($in{"id"} eq '99999'){ ## vain ympyrät kaikkien ratojen systeemiin
if($count > 10){
@d=split(/\n/,$out);
$out='';
foreach $rec (@d){
($type,$rest)=split(/\;/,$rec,2);
if($e{$rec} eq'' && $type eq '1'){
$e{$rec}=1;
print "$rec\n";
}
}
}else{
print $out;
}
}
}# henkkoht moodi
}else{
open (SISAAN,"<$path"."rastikanta_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($id,$x,$y)=split(/\|/,$rec);
$x=floor($x*10); $y=floor($y*10);
print "1;$x;$y;0;0\n";
}
close(SISAAN);
}
}
################# ratapisteet ####################
if ($in{"act"} eq "ratapisteet"){
## tästä appletti kysyy radan ratapiirrokset
open (SISAAN,"<$path"."ratapisteet_$in{'eventid'}.txt");
while (defined ($rec = )) {
chomp($rec);
($id,$pisteet)=split(/\|/,$rec);
if ($in{"id"} == $id ){
$pisteet =~ s/N/\n/g;
print "$pisteet\n";
}
}
close(SISAAN);
}
###############################################################
sub lock_file{
if($locking eq '1'){
$exit=15; # max yritykset/sekunnit
$lock_i=0;
if (!flock (HANDLE,LOCK_EX) ){
$released=FALSE;
until ($released eq TRUE || $lock_i>$exit) {
$lock_i++;
sleep 1;
if (flock(HANDLE,2)) {
$released=TRUE;
}
}
}
if ($lock_i>$exit) {
print "Lock error. - Virhe lukituksessa. If this is new insall: path is wrong, there is no enough permissios or locking should be turned of on this server.";
exit;
}
}
}
sub trim {
my $string = shift;
for ($string) {
s/^\s+//;
s/\s+$//;
}
return $string;
}
sub unlock_file {
if($locking eq '1'){
flock(HANDLE,LOCK_UN);
}
}