#!/usr/bin/perl ################################################################### # reitti.cgi # ################################################################### # Reittihärveli - Sovellus suunnistuksen reittipiirrosten # # keräykseen ja esittämiseen tämiseen # # Version: 2004.6.11 # # Distributed by: jryyppo@welho.com # # ================================================================# # Copyright (c) 2003-2004 Jarkko Ryyppö - All Rights Reserved. # # Software by: Jarkko Ryyppö # # Sponsored by: - # ################################################################### # The software is free for non-commercial use. The software can # # be used only for purposes related to the sport of orienteering. # # # # This program comes as it is. Use it at your own risk. This is # # software with ABSOLUTELY NO WARRANTY. This program is # # distributed in the hope that it will be useful, but # # WITHOUT ANY WARRANTY; without even the implied warranty of # # FITNESS FOR A PARTICULAR PURPOSE. # # # # Developers of this software are not responsible for what the # # user does with help of this software. # # # # THE USER MUST NOT USE SOFTWARE FOR ILLEGAL ACTIONS. # # # # By installing and/or using our software, you agree with these # # terms of use. # ################################################################### use Fcntl ":flock"; use POSIX; use CGI qw(:cgi-lib); $CGI::POST_MAX=1024 * 500; # max 500K posts ######################################################################################### ## muuttujat, joita asennuksessa voi joutua muuttamaan: $polku="../kartat/"; #$polku="c:/inetpub/wwwroot/routeviewer/kartat/"; ## Hakemistopolku täältä kartat-hakemistoon ######################################################################################### print "Content-type: text/html\n\n"; ReadParse(); $in{'eventid'}=1*$in{'eventid'}; $kieli=$in{'kieli'}; if($kieli eq ""){$kieli="suomi";} ##################### viimeiset ############################# if($in{'act'} eq 'viimeiset5'){ open (SISAAN,"<$polku"."kommentit_$in{'eventid'}.txt"); @kommentit=; close(SISAAN); print "
"; print "

Tapahtuman viimeisimmät reittipiirrokset:

    "; ($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$kommentit[$#kommentit]); print "
  • $nimi"; ($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$kommentit[$#kommentit-1]); print "
  • $nimi"; ($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$kommentit[$#kommentit-2]); print "
  • $nimi"; ($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$kommentit[$#kommentit-3]); print "
  • $nimi"; ($idkilp,$id,$nimi,$aika,$kommentit)=split(/\|/,$kommentit[$#kommentit-4]); print "
  • $nimi"; print "

Siirry reittisivulle

"; exit; } ##################### menu #############################3 if($in{'act'} eq 'mobile'){ open(SISAAN, "<".$polku."kisat.txt"); @data=; close(SISAAN); $out= " MobiiliReittiHärveli Reittihärveliin tallennetut tapahtumat:
"; foreach $rec (@data){ chomp($rec); ($id,$karttaid,$tyyppi,$nimi)=split(/\|/,$rec,4); $out=$out."
$nimi | 5 uusinta\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=" MobiiliReittiHärveli Valitse sarja:
"; open (SISAAN,"<$polku"."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= " MobiiliReittiHärveli Valitse reitit: (max 3 kpl)
"; open (SISAAN,"<$polku"."merkinnat_$in{'eventid'}.txt"); $j=0; while (defined ($rec = )) { chomp($rec); ($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec); $i++; if($idkilp eq $in{"sarja"}){ ## eli on tässä sarjassa $j++; @ulos[$j]="$id,$nimi
\n"; } } close(SISAAN); @ulos = sort { (split '\,', $a, 2)[0] <=> (split '\,', $b, 2)[0] } @ulos; $out= $out.join('',@ulos)."

"; $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{'act'} eq 'menu' || $in{'act'} eq ''){ open(SISAAN, "<".$polku."kisat.txt"); @data=; close(SISAAN); $out= "

Reittihärveliin tallennetut tapahtumat:

"; $out =~s/ä/\ä\;/g; $out =~s/ö/\ö\;/g; $out =~s/å/\å\;/g; $out =~s/Ä/\Ä\;/g; $out =~s/Ö/\Ö\;/g; $out =~s/Å/\Å\;/g; print $out; exit; } ################# sarjat #################### if ($in{"act"} eq "sarjat"){ ## lasketaan montako piirrosta on missäkin sarjassa open (SISAAN,"<$polku"."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,"<$polku"."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,"<$polku"."kilpailijat_$in{'eventid'}.txt"); while (defined ($rec = )) { chomp($rec); ($id,$sarjanro,$sarja,$nimi,$seura,$aika,$sija,$tulos,$valiajat)=split(/\|/,$rec); if($sarjanro eq $in{'sarja'}){ print "$id;$sija $nimi $tulos\n"; } } close(SISAAN); }else{ $j=0;$i=0; open (SISAAN,"<$polku"."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"){ ## tarkistetan piirtäneet tähtimerkintää varten open (SISAAN,"<$polku"."merkinnat_$in{'eventid'}.txt"); while (defined ($rec = )) { chomp($rec); ($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec); $tahti{$id}="*"; } close(SISAAN); ### open (SISAAN,"<$polku"."kilpailijat_$in{'eventid'}.txt"); while (defined ($rec = )) { chomp($rec); ($id,$sarjanro,$sarja,$nimi,$seura,$aika,$sija,$tulos,$valiajat)=split(/\|/,$rec); if($sarjanro eq $in{'rata'}){ print "$tahti{$id}$sija $nimi $tulos ;$id\n"; } } close(SISAAN); }else{ $j=0;$i=0; open (SISAAN,"<$polku"."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; } } ################# valiajat sarja############## if ($in{"act"} eq "valiajat"){ $nro=1;$otsikko="-------------------"; while($in{'k'.$nro} ne ''){ open (SISAAN,"<$polku"."kilpailijat_$in{'eventid'}.txt"); while (defined ($rec = )) { chomp($rec); ($id,$sarjanro,$sarjanimi,$nimi,$seura,$aika,$sija,$tulos,$valiajat)=split(/\|/,$rec); if($id eq $in{'k'.$nro}){ @splits=split(/\;/,$valiajat); $old=0;$i=1; $ulos=substr($nimi." ",0,20); 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); } } } close(SISAAN); if($nro==1){ print "$otsikko\n"; } $nro++; print "$ulos\n"; } print "$otsikko\n"; } ############################################# if ($in{'act'} eq 'map' ){ # tsekataan kili $kieli="fi"; if($in{'kieli'} eq 'en'){$kieli="en";} if($in{'kieli'} eq 'no'){$kieli="no";} open (SISAAN,"<".$polku."../lang_".$kieli.".txt"); @lang=; close(SISAAN); $lang=join('',@lang); ($lang, $langkiitos)=split(/####/,join('',@lang)); if($in{'kohdistus'}eq "1"){ $muu="\n"; } if($in{'eipiirtaneet'} eq "1"){ $muu="\n"; } open (SISAAN,"<".$polku."kisat.txt"); @kartat=; close(SISAAN); foreach $rec (@kartat) { chomp($rec); ($id,$karttaid,$tyyppi,$nimi)=split(/\|/,$rec,4); if($id eq $in{'id'}){ open (SISAAN,"<".$polku."../map.txt"); @sivu=; close(SISAAN); $sivu= join('',@sivu); $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}/; print $sivu; exit; }} } ################# animaatio #################### if ($in{"act"} eq "anim"){ ## Tästä apletti pyytää animaatiopisteet $raika=3; ## step - aika sekunteina ## haetaan suora reitti open (SISAAN,"<".$polku."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-250).";".($y-250)."N"; } $suorareitti{$id}=$data; ($pis,$data)=split(/N/,$data,2); $suorarastit{$id}=$data; } ## suora reitti ok ## haetaan valiajat $kilp=1; while($in{"k".$kilp} ne''){ open (SISAAN,"<$polku"."kilpailijat_$in{'eventid'}.txt"); $ok=0; while (defined ($rec = )) { chomp($rec); ($id,$sarjanro,$sarjanimi,$nimi,$seura,$aika,$sija,$tulos,$valiajat)=split(/\|/,$rec); if($id eq $in{'k'.$kilp}){ $vajat[$kilp]=$valiajat; $srj{$kilp}=$sarjanro; $kilp++;$ok=1; } } if($ok==0){exit;} } close(SISAAN); # valiajat nyt muuttujassa $vajat[] $kilp=1; while($in{"k".$kilp} ne''){ open (SISAAN,"<$polku"."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''){ @reitti=split(/N/,$viiva[$kilp]); @valiajat=split(/\;/,$vajat[$kilp]); @rastit=split(/N/,$rast[$kilp]); $i=0; $viiva[$kilp]=$viiva[$kilp]."N"; foreach $rec (@rastit){ $i++;$j="NC".$i."N"; $viiva[$kilp]=~ s/N${rec}N/${j}/; } $i=0; foreach $rec (@rastit){ $i++;$j="NC".$i."N";$k="N".$rec.'|'.$rec."N"; $viiva[$kilp]=~ s/${j}/${k}/; } $viiva[$kilp]=~ s/^\|//; @rastivalit=split(/\|/,$viiva[$kilp]); $ulos=join("\n",@rastivalit); $i=0; $matkasiirto=0; foreach $rec (@rastivalit){ $rec=~ s/^N//; $i++; } $i_rastit=0; $i_reitti=0; $i_valiajat=0; $i_piste=0; $aika=0; $matka=0; 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; foreach $rec (@viivab){ ($x1,$y1)=split(/\;/,$rec); if($i>0){ $pituus=$pituus+sqrt(($x0-$x1)*($x0-$x1)+($y0-$y1)*($y0-$y1)); } $x0=$x1;$y0=$y1; $i++; } $valiaika=$valiajat[$i_rastit]-$valiajat[$i_rastit-1]; if($i_rastit==0){ $valiaika=$valiajat[$i_rastit]; } $step=($pituus/($valiaika/$raika)); # pisteet polylinen varrelle $i=0; foreach $rec (@viivab){ ($x1,$y1)=split(/\;/,$rec); if($i>0){ if($x0 == $x1 && $y0 == $y1){ ## 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=""; print "$ax;".$ay.",".$info."N"; $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)); } } $x0=$x1;$y0=$y1; $i++; } $i_rastit++; } $kilp++; print "\n"; } } ################# viivat #################### if ($in{"act"} eq "viivat"){ ## Tästä apletti pyytää viivapiirrokset open (SISAAN,"<$polku"."merkinnat_$in{'eventid'}.txt"); @merkinnat=; close(SISAAN); $kilp=1; while($in{"k".$kilp} ne''){ $in{"id"}=$in{"k".$kilp}; $i=0; foreach $rec (@merkinnat) { chomp($rec); ($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec); $i++; if ($in{"id"} eq $id){ $viivat =~ s/N/\n/g; $viivat =~ s/R/\r/g; $viivat =~ s/#/g/; print "\n1".$viivat; } } print "\n"; $kilp++; } } ################# kommentit #################### if ($in{"act"} eq "kommentit"){ ## Tästä apletti pyytää kommentit open (SISAAN,"<$polku"."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; print "\n\n$nimi:\n".$kommentit; } } $kilp++; } } # ####### TALLENNUKSET########################################## ############# Reittipiirroksen tallennus ###################### if($in{'act'} eq "tallennapiirros"){ open (SISAAN,"<$polku"."merkinnat_$in{'eventid'}.txt"); @merkinnat=; close(SISAAN); $ok=1; foreach $rec (@merkinnat) { chomp($rec); ($idkilp,$id,$nimi,$aika,$viivat,$rastit)=split(/\|/,$rec); if($id eq $in{'id'}){ $ok=0; ## eli piirros oli jo olemassa, ei tallenneta } } #$in{'rdata'}=~ s/\;/N/g; $in{'rdata'}=~ s/\,/\;/g; ($reitti,$rastit)=split(/\|/,$in{'rdata'}); if($ok == 1){ open (HANDLE,">>".$polku."merkinnat_$in{'eventid'}.txt"); &lock_file; print HANDLE $in{'rataid'}."|".$in{'id'}."|$in{'suunnistaja'}|$ENV{'REMOTE_HOST'}|$reitti|$rastit\n"; &unlock_file; close HANDLE; $in{'kommentit'}=~ s/\n/#nl#/g; $in{'kommentit'}=~ s/\r/#cr#/g; open (HANDLE,">>".$polku."kommentit_$in{'eventid'}.txt"); &lock_file; print HANDLE $in{'rataid'}."|".$in{'id'}."|$in{'suunnistaja'}|$ENV{'REMOTE_HOST'}|$in{'kommentit'}\n"; &unlock_file; close HANDLE; } print"\n"; exit; } ###################### tallennusonnistui-sivu ################# if ($in{"act"} eq "tallennettu"){ $kieli="fi"; if($in{'kieli'} eq 'en'){$kieli="en";} if($in{'kieli'} eq 'no'){$kieli="no";} open (SISAAN,"<".$polku."../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 open (SISAAN,"<$polku"."radat_$in{'eventid'}.txt"); while (defined ($rec = )) { chomp($rec); ($id,$status,$nimi,$viivat)=split(/\|/,$rec); if ($in{"id"} == $id ){ $viivat =~ s/N/\n/g; $viivat =~ s/R/\r/g; $viivat =~ s/#//g; print "$viivat\n"; } } close(SISAAN); }else{ open (SISAAN,"<$polku"."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,"<$polku"."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); } ########## lukitusfunktiot ################ sub lock_file{ $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 "Tiedosto oli varattu. Tietoja ei voitu tallentaa."; exit; } } sub unlock_file { flock(HANDLE,LOCK_UN); }