#!/usr/bin/perl

require "../cgi-lib.pl";
ReadParse(*in);
*params = *in;
use LWP;
if($ENV{HTTP_USER_AGENT}) { $web = 1;} else { $web = 0; }
print "Content-type: text/html\n\n" if($web);
print "<HTML><BODY BACKGROUND=#FFFFFF>\n";

%rtdesc = (
	   '3Na' => "Rte. 3 North (Rte. 128/I-95 to I-495)",
	   '3Nb' => "Rte. 3 North (I-495 to NH Line)",
	   '3Sa' => "Rte. 3 South (I-495 to Rte. 128/I-95)",
	   '3Sb' => "Rte. 3 South (NH Line to I-495)",

	   '495Na' => "I-495 North (Mass Pike/I-90 to Rte. 3)",
	   '495Nb' => "I-495 North (Rte. 3 to I-93)",
	   '495Nc' => "I-495 North (I-93 to I-95)",
	   '495Sa' => "I-495 South (Rte. 3 to Mass Pike/I-90)",
	   '495Sb' => "I-495 South (I-93 to Rte. 3)",
	   '495Sc' => "I-495 South (I-95 to I-93)",

	   '93Na' => "I-93 North (Central Artery to Rte. 128/I-95)",
	   '93Nb' => "I-93 North (Rte. 128/I-95 to I-495)",
	   '93Nc' => "I-93 North (I-495 to NH Line)",
	   '93Sa' => "I-93 South (Rte. 128/I-95 to Central Artery)",
	   '93Sb' => "I-93 South (I-495 to Rte. 128/I-95)",
	   '93Sc' => "I-93 South (NH Line to I-495)",

	   '128Na' => "Rte. 128/I-95 North (Mass Pike/I-90 to Rte. 3)",
	   '128Nb' => "Rte. 128/I-95 North (Rte. 3 to I-93)",
	   '128Nc' => "Rte. 128/I-95 North (I-93 to I-95)",
	   '128Nd' => "Rte. 128 North (I-95 to Gloucester)",
	   '128Sa' => "Rte. 128/I-95 South (Rte. 3 to Mass Pike/I-90)",
	   '128Sb' => "Rte. 128/I-95 South (I-93 to Rte. 3)",
	   '128Sc' => "Rte. 128/I-95 South (I-95 to I-93)",
	   '128Sd' => "Rte. 128 South (Gloucester to I- 95)", #extra space!

	   '95Na' => "I-95 North (Rte. 128 to NH Line)",
	   '95Sa' => "I-95 South (NH Line to Rte. 128)",

	   '90Ea' => "Mass Pike/I-90 East (I-290/I-395 to I-495)",
	   '90Eb' => "Mass Pike/I-90 East (I-495 to the Weston Tolls)",
	   '90Ec' => "Mass Pike/I-90 East (Weston Tolls to Allston/Brighton Tolls)",
	   '90Ed' => "Mass Pike/I-90 East (Allston Tolls to Logan Airport)",
	   '90Wa' => "Mass Pike/I-90 West (I-495 to I-290/I-395)",
	   '90Wb' => "Mass Pike/I-90 West (Weston Tolls to I-495)",
	   '90Wc' => "Mass Pike/I-90 West (Allston/Brighton Tolls to the Weston Tolls)",
	   '90Wd' => "Mass Pike/I-90 West (Logan Airport to Allston Tolls)",

	   '9300Nd' => "Southeast Expressway/Rte. 3/I-93 North",
	   '9300Sd' => "Southeast Expressway/Rte. 3/I-93 South",

	   '300Nc' => "Rte. 3 North (Sagamore Bridge to Braintree)",
	   '300Sc' => "Rte. 3 South (Braintree to Sagamore Bridge)",

	   '49500Nd' => "I-495 North (I-95 to Mass Pike/I-90)",
	   '49500Ne' => "I-495 North (Bourne Bridge to I-95)",
	   '49500Sd' => "I-495 South (Mass Pike/I-90 to I-95)",
	   '49500Se' => "I-495 South (I-95 to Bourne Bridge)",

	   '9500Nb' => "I-95 North (I-495 to Rte. 128/I-93)",
	   '9500Nc' => "I-95 North (Rhode Island to I-495)",
	   '9500Sb' => "I-95 South (Rte. 128/I-93 to I-495)",
	   '9500Sc' => "I-95 South (I-495 to Rhode Island)",

	   '12800Ne' => "Rte. 128/I-95 North (I-95 to Mass Pike/I-90)",
	   '12800Nf' => "Rte. 128 North (Southeast Expressway to I-95)",
	   '12800Se' => "Rte. 128/I-95 South (Mass Pike/I-90 to I-95)",
	   '12800Sf' => "Rte. 128 South (I-95 to Southeast Expressway)",

	   );

%rtpage = (
	   '3' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=5&city=bos&cityname=Boston',
	   '495' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=9&city=bos&cityname=Boston',
	   '93' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=7&city=bos&cityname=Boston',
	   '128' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=6&city=bos&cityname=Boston',
	   '90' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=10&city=bos&cityname=Boston',
	   '95' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=8&city=bos&cityname=Boston',
	   '300' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=26&city=bos&cityname=Boston',
	   '49500' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=27&city=bos&cityname=Boston',
	   '9300' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=11&city=bos&cityname=Boston',
	   '12800' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=29&city=bos&cityname=Boston',
	   '9500' => 'http://www.smartraveler.com/scripts/bostraffic.asp?index=28&city=bos&cityname=Boston',
	   );

$ua = new LWP::UserAgent;
$ua->agent("Foo/0.1 ".$ua->agent);
$ua->timeout(60);

my(%pagedata) = ();
#print "About to load pages\n";
foreach $route (keys %rtdesc) {
    my($baseroute) = $route;
    $baseroute =~ s/[A-Za-z]+//g;
    $url = $rtpage{$baseroute};
    #print "I want to load $url\n";
    if(!defined($pagedata{$url}) || !$pagedata{$url}->is_success) {
	#print "Loading $baseroute ...";
	my($request) = new HTTP::Request GET => $url;
	$request->content_type('application/x-www-form-urlencoded');
	$request->content('match=www&errors=0');
	$pagedata{$url} = $ua->request($request);
	#print "Done!<br>\n";
    }
    my($response) = $pagedata{$url};
    if($response->is_success) {
	if($response->content() =~ /\((\d+\:\d+\s+[ap]m\s+\d+\/\d+\/\d+)\)/) {
	    $time_loaded = $1;
	}
	#CONDITION OF SUBROUTE
	if($response->content() =~ /\/(\w+)\.gif\"? ALIGN=\"?center\"?\>\<\/td\>\s*\<td\>(<font size=\"?\d+\" face=\"?Arial\"?>)?\<b\>\Q$rtdesc{$route}\E\<\/B\>/i) {
	#if($response->content() =~ /\/(\w+)\.gif ALIGN=left VALIGN=bottom\>\<\/td\>\s*\<td\>\<b\>\Q$rtdesc{$route}\E\<\/B\>/i) {
	    $img = $1;
	    if($img =~ /ok/i) { $condition{$route} = 0; }
	    elsif($img =~ /slow/i) { $condition{$route} = 1; }
	    elsif($img =~ /delay/i) { $condition{$route} = 2; }
	    elsif($img =~ /alert/i) { $condition{$route} = 3; }
	} else {
	    print "Ack! $route had no associated gif!<br>\n";
	    $errflag++;
	}
    } else {
	print "Ack! Could not load $url<br>\n";
	$errflag++;
    }
}

if($errflag) { print "<font color=red size=+1><b>Warning!</b></font> SmartTraveler's website contained unexpected and/or incomplete data. All times are assumed to be normal. Encountered $errflag errors.<br><br>\n"; }

rmap();

print "</BODY></HTML>\n";

sub rmap {
    def_map();
    my(%key) = (
		A => '3Sb',
		B => '3Nb',
		C => '93Sc',
		D => '93Nc',
		E => '495Sc',
		F => '495Nc',
		G => '95Sa',
		H => '95Na',
		I => '495Sa',
		J => '495Sb',
		K => '495Na',
		L => '495Nb',
		M => '3Sa',
		N => '3Na',
		O => '93Sb',
		P => '93Nb',
		Q => '128Sa',
		R => '128Sb',
		S => '128Sc',
		T => '128Na',
		U => '128Nb',
		V => '128Nc',
		W => '93Sa',
		X => '93Na',
		Y => '90Wa',
		Z => '90Wb',
		a => '90Wc',
		b => '90Wd',
		c => '90Ea',
		d => '90Eb',
		e => '90Ec',
		f => '90Ed',
		g => '49500Sd',
		h => '49500Nd',
		i => '12800Se',
		j => '12800Ne',
		k => '9300Sd',
		l => '9300Nd',
		m => '12800Nf',
		n => '12800Sf',
		o => '9500Sb',
		p => '9500Nb',
		q => '300Sc',
		r => '300Nc',
		s => '49500Ne',
		t => '49500Se',
		u => '9500Sc',
		v => '9500Nc',
		w => '128Sd',
		x => '128Nd',
		);
    $w = 3;
    my(%color);
    foreach $k (keys %key) {
	$rt = $key{$k};
	if(defined $condition{$rt}) {
	    $color{$rt} = ("green","orange","red","blue")[$condition{$rt}];
	} else {
	    $color{$rt} = ($rt =~ /S|W/) ? "#AAAAAA" : "#CCCCCC";
	}
    }
    print "<Font size=-1><b>Data loaded at $time_loaded</b></font><br>\n";
    print "<table cellpadding=0 cellspacing=0 border=0>\n";
    foreach $line (@massmap) {
	print "<tr>\n";
	foreach $td (split //,$line) {
	    print "<td";
	    if($key{$td}) {
		print " bgcolor=$color{$key{$td}}";
	    } elsif($td eq "*") {
		print " bgcolor=#9CCEFF";
	    } elsif($td eq "-") {
		print " bgcolor=#DDDDDD";
	    }
	    print ">";
	    limg($key{$td},$w,$w);
	    print "</td>\n";
	}
	print "</tr>\n";
    }
    print "</table>\n";
}

sub limg {
    my($route,$height,$width) = @_;
    my($base) = $route;
    $base =~ s/\D//g;
    if($rtpage{$base}) { print "<a href=\"$rtpage{$base}\">"; }
    print "<img src=\"/~dave/images/spacer.gif\" border=0 width=$width height=$height>";
    if($rtpage{$base}) { print "</a>"; }
}

sub def_map {
    @massmap = (
"------------------AB------------------CD---------EF------------GH--------------*********************",
"------------------ABB-----------------CDD--------EF------------GH------------***********************",
"------------------AAB-----------------CCD-------EEF-----------GGH------------***********************",
"-------------------AB------------------CDD------EFF-----------GHH-----------************************",
"-------------------ABB-----------------CCD-----EEF-----------GGH-----------*************************",
"-------------------AAB------------------CD-----EFF-----------GHH-----------*--**********************",
"--------------------AB------------------CD-----EF-----------GGH---------------**********************",
"--------------------ABB-----------------CD-----EF-----------GHH----------------*********************",
"--------------------AAB-----------------CD-----EF-----------GH-----------------**********---********",
"---------------------AB-----------------CD-----EF-----------GH-------------------*******---*********",
"---------------------AB-----------------CDD---EEF-----------GH--------------------*****----*********",
"---------------------ABB----------------CCD-EEEFF-----------GH-------------------*--**-----*********",
"---------------------AAB-----------------CCEEFFF------------GH-------------------*------------******",
"----------------------ABBB---------------JCFFF--------------GH--------------------------------******",
"----------------------AAABB-------------JJOP----------------GH-------------------------------*******",
"------------------------AABB----------JJJLOP----------------GH-----------------------------*********",
"-------------------------AABBBBB-----JJLLLOP----------------GH-------------------wwwww----**********",
"--------------------------AAAAAB---JJJLL--OPP---------------GH------------------wwxxxx----**********",
"-----------------------------IIJJJJJLLL---OOP---------------GGH----------------wwxx---*---**********",
"----------------------IIIIIIIIKMMNLLL------OPP---------------GH---------------wwxx----*--***********",
"----------------------IKKKKKKKK-MNN--------OOPP--------------GH----------wwwwwwxx----**-************",
"--------------------IIIK--------MMN---------OOP--------------GH----wwwwwwwxxxxxx--******************",
"-------------------IIKKK---------MNN---------OP--------------GH---wwxxxxxxx---**********************",
"-----------------IIIKK-----------MMNN--------OPP------------GGH--wwxx-------************************",
"-----------------IKKK-------------MMN--------OOP------------GHH-wwxx------**************************",
"----------------IIK----------------MNN--------OP-----------GGH--wxx---******************************",
"----------------IKK----------------MMNN-------OP-----------Swwwwwx----******************************",
"----------------IK------------------MMN-------OPP--SSSS---SSxxxxxx---*******************************",
"---------------IIK-------------------MN-------OOP-SSVVSSSSSVx--------*--****************************",
"---------------IKK-------------------MNN-------RSSSVVVVVVVVV-------------***************************",
"--------------IIK--------------------MMNN--RRRRRWVVV---------------------***************************",
"-----------IIIIKK---------------------MMRRRRUUUUWXX--------------------*****************************",
"-----------IKKKK-----------------------QRUUUU---WWX-------------------******************************",
"----------IIK-------------------------QQTU-------WXX----------------********************************",
"---------IIKK------------------------QQTT--------WWX--------------**********************************",
"--------IIKK-------------------------QTT----------WX-----------*-***********************************",
"--------IKK--------------------------QT-----------WX-----------*--**********************************",
"-------IIK---------------------------QT-----------WXX---------**---*********************************",
"-------IKK---------------------------QT-----------WWX---------***--*********************************",
"-------IK----------------------------QT------------WX--------***************************************",
"------IIK----------------------------QT------------WXX--------**************************************",
"------IKK---------------------------QQT------------WWXX-------**************************************",
"------IIK---------------------------QTT-------------WWX-------**************************************",
"-------IK--------------------------QQT---------------WXX--******************************************",
"-------IKK-------------------------QTT-bbbbbbbbbbbbbbWWX--**-***************************************",
"-------IIK-------------------------Qbbbbffffffffffffffkl-*-*****************************************",
"--------IK-------------------------Qbffff-------------kl---*****************************************",
"--------IKK--------------------aaaaQff----------------kl---*****************************************",
"--------IIK-----------aaaaaaaaaaeeeiijjjj-------------kl-*******************************************",
"---------IKK-------ZZZaeeeeeeeeee---iiiijj------------kll*******************************************",
"---------IIK------ZZddee---------------iij------------kkl--*****************************************",
"----------IK----ZZZdd-------------------ijj------------kl---*********--*****************************",
"----------IK-ZZZZddd--------------------iij------------kl----*********--****************************",
"----------IKZZdddd-----------------------ijj-----------kll------******----**************************",
"----------IKZdd--------------------------iijj----------kkl------*****--------***********************",
"-------YYYIddd----------------------------iijj----------kll----*--*-------------********************",
"------YYcccdh------------------------------iij----------kkl---------------------********************",
"-----YYcc-ggh-------------------------------ij-----------krrr--------------------*******************",
"--YYYYcc---gh-------------------------------ij---------mmkqqr---------------------******************",
"YYYcccc----gh-------------------------------ijmm------mmnn-qrr---------------------*****************",
"cccc-------ghh-----------------------------oinnmmm---mmnn--qqrr---------------------****************",
"-----------ggh-----------------------------op-nnnmmmmmnn----qqrrr-------------------****************",
"------------ghh----------------------------op---nnnnnnn------qqqrrrrrr--------------****************",
"------------gghh---------------------------op------------------qqqqqqrrr-------------***************",
"-------------ggh---------------------------op-----------------------qqqrrr-----------***************",
"--------------gh--------------------------oop-------------------------qqqrr-----------**************",
"--------------ghhh-----------------------oopp---------------------------qqrrr---------**************",
"--------------ggghh----------------------opp-----------------------------qqqrr---------*************",
"----------------gghhh--------------------op--------------------------------qqrr--------*************",
"-----------------ggghh------------------oop---------------------------------qqrr---------***********",
"-------------------gghhh----------------opp----------------------------------qqrr---------**********",
"--------------------gggh----------------op------------------------------------qqrr--------**********",
"----------------------ghh---------------op-------------------------------------qqr---------*********",
"----------------------gghh--------------op--------------------------------------qrr-------**********",
"-----------------------gghhh-----------oop--------------------------------------qqrr------**********",
"------------------------ggghh----------opp---------------------------------------qqr-------*********",
"--------------------------gghh--------oop-----------------------------------------qr-----*-*********",
"---------------------------gghh-------opp-----------------------------------------qrr---***-********",
"----------------------------gghhhhh--oop------------------------------------------qqr---***--*******",
"-----------------------------ggggghhhopp-------------------------------------------qr---****-*******",
"---------------------------------gggguss-------------------------------------------qrr******--******",
"------------------------------------uutsss-----------------------------------------qqr*****---******",
"-----------------------------------uuvtttsss----------------------------------------qr**************",
"----------------------------------uuvv--tttsss--------------------------------------qr**************",
"---------------------------------uuvv-----tttsss------------------------------------qrr-*--*********",
"--------------------------------uuvv--------tttsssssssss----------------------------qqrr*--*********",
"--------------------------------uvv-----------tttttttttss----------------------------qqrrr--**-*****",
"--------------------------------uv--------------------ttss----------------------------qqqrr-----****",
"------------------------------uuuv---------------------ttss-----------------------------qqrrr-----**",
"------------------------------uvvv----------------------tts------------------------------qqqr------*",
"------------------------------uv-------------------------tssss-----------------------------qr------*",
"------------------------------uv-------------------------ttttss----------------------------qrr------",
"-----------------------------uuv----------------------------ttss---------------------------qqrr-----",
"----------------------------uuvv-----------------------------ttsss--------------------------qqrr----",
"----------------------------uvv-------------------------------tttssss------------------------qqrr---",
"---------------------------uuv----------------------------------ttttsss-----------------------qqrr--",
"---------------------------uvv-------------------------------------tttssss---------------------qqrr-",
"---------------------------uv----------------------------------------ttttsss--------------------qqrr",
"--------------------------uuv-------------------------------------------tttsss-------------------qqr",
"--------------------------uvv---------------------------------------------tttss-------------------qr",
		);
}





