diff --git a/configure.ac b/configure.ac
index 5f0dae1a8..75ef75a4f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -837,6 +837,7 @@ AC_CONFIG_FILES([ \
scripts/debug/Makefile \
scripts/perl/Makefile \
scripts/perl/examples/Makefile \
+ scripts/perl/traffic/Makefile \
scripts/python/Makefile \
src/Makefile \
src/Include/Makefile \
diff --git a/scripts/perl/Makefile.am b/scripts/perl/Makefile.am
index aee2d7baa..9538e129c 100644
--- a/scripts/perl/Makefile.am
+++ b/scripts/perl/Makefile.am
@@ -1 +1,2 @@
-SUBDIRS = examples
+SUBDIRS = examples \
+ traffic
diff --git a/scripts/perl/traffic/Makefile.am b/scripts/perl/traffic/Makefile.am
new file mode 100644
index 000000000..b14050c96
--- /dev/null
+++ b/scripts/perl/traffic/Makefile.am
@@ -0,0 +1,3 @@
+EXTRA_DIST = \
+ conf2xml.pl \
+ xml2conf.pl
diff --git a/scripts/perl/traffic/conf2xml.pl b/scripts/perl/traffic/conf2xml.pl
new file mode 100644
index 000000000..0305ebd11
--- /dev/null
+++ b/scripts/perl/traffic/conf2xml.pl
@@ -0,0 +1,117 @@
+#!/usr/bin/perl -w
+
+sub parseTime {
+ # print "Parsing time @_\n";
+ #die;
+ my $timeStr = $_[0];
+ @timeArray = split(":", $timeStr);
+ # print STDERR "TimeArray: @timeArray\n";
+ return ($timeArray[0] + $timeArray[1]/60.0);
+}
+
+ sub writeFlight {
+ print XMLFILE " \n";
+ print XMLFILE " $_[0]\n";
+ print XMLFILE " $_[1]\n";
+ print XMLFILE " $_[2]\n";
+ print XMLFILE " \n";
+ print XMLFILE " $_[3]\n";
+ if ($_[4] =~ /[0-6]/) { print XMLFILE " \n" }
+ else { print XMLFILE " \n" };
+ print XMLFILE " \n";
+ print XMLFILE " $_[6]\n";
+ print XMLFILE " \n";
+ print XMLFILE " $_[7]\n";
+ if ($_[8] =~ /[0-6]/) { print XMLFILE " \n" }
+ else { print XMLFILE " \n" };
+ print XMLFILE " \n";
+ if (($_[4] =~ /[0-6]/) && ($_[8] =~ /[0-6]/)) { print XMLFILE " WEEK\n" }
+ else { print XMLFILE " 24Hr\n" };
+ print XMLFILE " \n";
+ return;
+}
+
+@inputfiles = glob("???.conf");
+while ($infile = shift(@inputfiles)) {
+ open (CONF, $infile) or die "Unable to open input configuration file";
+ ($outname = $infile) =~ s/conf/xml/;
+ print "Opening $outname\n";
+ open XMLFILE, ">$outname";
+ while ($buf = readline(CONF)) {
+ push @DataList, $buf;
+ }
+ close (CONF);
+ print XMLFILE "\n";
+ print XMLFILE "\n";
+ while ($dataline = shift(@DataList)) {
+ # print STDERR "Dataline: $dataline\n";
+ @token = split(" ", $dataline);
+ if (scalar(@token) > 0) {
+ # print STDERR "Token: @token\n";
+ if ($token[0] eq "AC")
+ {
+ print XMLFILE " \n";
+ print XMLFILE " $token[12]\n";
+ print XMLFILE " $token[6]\n";
+ print XMLFILE " $token[5]\n";
+ print XMLFILE " $token[1]\n";
+ print XMLFILE " $token[3]$token[5]\n";
+ print XMLFILE " $token[4]\n";
+ print XMLFILE " $token[7]\n";
+ print XMLFILE " $token[8]\n";
+ print XMLFILE " $token[9]\n";
+ print XMLFILE " $token[10]\n";
+ print XMLFILE " $token[2]\n";
+ print XMLFILE " $token[11]\n";
+ print XMLFILE " \n";
+ }
+ if ($token[0] eq "FLIGHT") {
+ $weekdays = $token[3];
+ if (!(($weekdays =~ /^(0|\.)?(1|\.)?(2|\.)?(3|\.)?(4|\.)?(5|\.)?(6|\.)?$/) || ($weekdays eq "DAILY"))) {
+ die "Syntax Error! Check days $weekdays for flight no. $token[1]!\n";
+ }
+ if ($token[4] !~ /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])$/) {
+ die "Syntax Error! Check departure time $token[4] for flight no. $token[1]!\n"
+ }
+ if ($token[6] !~ /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])$/) {
+ die "Syntax Error! Check arrival time $token[6] for flight no. $token[1]!\n"
+ }
+ # print STDERR "Weekdays: $weekdays\n";
+ if ($weekdays =~ /^(0|\.)?(1|\.)?(2|\.)?(3|\.)?(4|\.)?(5|\.)?(6|\.)?$/) {
+ # print STDERR "Weekly for flight no. $token[1]\n";
+ # print STDERR "Day: $_\n";
+ @day = split(//, $weekdays);
+ foreach (@day) {
+ if ($_ eq "\.") {
+ next;
+ } else {
+ $depTime = parseTime($token[4]);
+ # print STDERR "depTime: $depTime\n";
+ $arrTime = parseTime($token[6]);
+ # print STDERR "arrTime: $arrTime\n";
+ $depDay = $_ + 1;
+ if ($depDay > 6) { $depDay = 0 };
+ $arrDay = $depDay;
+ if ($depTime > $arrTime) { $arrDay++ };
+ if ($arrDay > 6) { $arrDay = 0 };
+ # print STDERR "depDay: $depDay, arrDay: $arrDay\n";
+ writeFlight ($token[1], $token[9], $token[2], $token[5], $depDay, $token[4], $token[8], $token[7], $arrDay, $token[6]);
+ }
+ }
+ }
+ elsif ($weekdays eq "DAILY") {
+ # print STDERR "Daily flights for flight no. $token[1]\n";
+ $depTime = parseTime($token[4]);
+ $arrTime = parseTime($token[6]);
+ writeFlight ($token[1], $token[9], $token[2], $token[5], 7, $token[4], $token[8], $token[7], 7, $token[6]);
+ }
+ else {
+ die "System Error! Can't find days to place a flight!\n";
+ }
+ }
+ }
+ }
+ print XMLFILE "\n";
+ close XMLFILE;
+# print "Closing $outname\n";
+}
diff --git a/scripts/perl/traffic/xml2conf.pl b/scripts/perl/traffic/xml2conf.pl
new file mode 100644
index 000000000..e66da0841
--- /dev/null
+++ b/scripts/perl/traffic/xml2conf.pl
@@ -0,0 +1,91 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+
+# DEBUG
+# use Data::Dumper;
+# print Dumper($data) . "\n";
+# END
+
+use Switch;
+use XML::LibXML;
+my $parser = XML::LibXML->new();
+my $doc = $parser->load_xml(location => './CEB.xml');
+my $data;
+
+# reformatting days
+# According to http://wiki.flightgear.org/index.php/Interactive_Traffic
+# 0 = Sunday and 6 = saturday
+# For convenience we switch here to "classical" numbering
+# where 0 = Monday and 6 = sunday
+sub parseDay {
+ my $day;
+ $day = substr($_[0],0,1);
+ switch ($day) {
+ case 0 {$day="......6"} # Sunday
+ case 1 {$day="0......"} # Monday
+ case 2 {$day=".1....."} # Tuesday
+ case 3 {$day="..2...."} # Wednesday
+ case 4 {$day="...3..."} # Thrusday
+ case 5 {$day="....4.."} # Friday
+ case 6 {$day=".....5."} # Saturday
+ else {$day="0123456"} # Daily
+ };
+ return $day;
+}
+
+# reformatting times
+sub parseTime {
+ return substr($_[0],2,5);
+}
+
+print "# AC Homeport Registration RequiredAC AcTyp Airline Livery Offset Radius Flighttype PerfClass Heavy Model\n";
+# get aircraft data
+foreach $data ($doc->findnodes('/trafficlist/aircraft')) {
+ my $AcMdl = $data->findnodes('./model');
+ my $AcLvy = $data->findnodes('./livery');
+ my $AcAln = $data->findnodes('./airline');
+ my $AcHp = $data->findnodes('./home-port');
+ my $AcReq = $data->findnodes('./required-aircraft');
+ my $AcTyp = $data->findnodes('./actype');
+ my $AcO = $data->findnodes('./offset');
+ my $AcRad = $data->findnodes('./radius');
+ my $AcFt = $data->findnodes('./flighttype');
+ my $AcPrf = $data->findnodes('./performance-class');
+ my $AcReg = $data->findnodes('./registration');
+ my $AcHvy = $data->findnodes('./heavy');
+ print "AC $AcHp $AcReg $AcReq $AcTyp $AcAln $AcLvy $AcO $AcRad $AcFt $AcPrf $AcHvy $AcMdl\n";
+}
+print "\n# FLIGHT Callsign Flightrule Days DeparTime DepartPort ArrivalTime ArrivalPort Altitude RequiredAc\n# 0 = Monday, 6 = Sunday\n";
+# get flight data
+foreach $data ($doc->findnodes('/trafficlist/flight')) {
+ my $FlRep = $data->findnodes('repeat');
+ my $FlDepPrt = $data->findnodes('departure/port');
+ my $FlArrPrt = $data->findnodes('arrival/port');
+ my $FlCs = $data->findnodes('callsign');
+ my $FlFr = $data->findnodes('fltrules');
+ my $FlCa = $data->findnodes('cruise-alt');
+ my $FlReq = $data->findnodes('required-aircraft');
+ my $FlDepDay = $data->findnodes('departure/time');
+ my $FlDepTime = $data->findnodes('departure/time');
+ my $FlArrDay = $data->findnodes('arrival/time');
+ my $FlArrTime = $data->findnodes('arrival/time');
+ my $FlDays = ".......";
+# handle flights depending on weekly or daily schedule
+ if (lc($FlRep) eq "week") {
+ $FlDays = parseDay($FlDepTime);
+ $FlDepTime = parseTime($FlDepTime);
+ $FlArrTime = parseTime($FlArrTime);
+ } elsif (lc($FlRep) eq "24hr") {
+ $FlDepDay = $data->findnodes('departure/time');
+ $FlDepTime = substr($data->findnodes('departure/time'),0,5);
+ $FlArrDay = $data->findnodes('arrival/time');
+ $FlArrTime = substr($data->findnodes('arrival/time'),0,5);
+ $FlDays = "0123456";
+ } else {
+ die "Error! No proper repetition found in XML!\n";
+ }
+# output data
+ print "FLIGHT $FlCs $FlFr $FlDays $FlDepTime $FlDepPrt $FlArrTime $FlArrPrt $FlCa $FlReq\n";
+}