#!/usr/bin/perl
use strict;
use lib '/WWW/web/MarginalHacks.com/bin/';
use makeKML;

my $LIST	= 'list';
my $HEADER	= 'header';
my $HEADER_SHORT	= 'header.short';
my $FOOTER	= 'footer';
my $STAR_FULL	= '<img src="http://DavePics.com/Icons/Star.full.gif" width=11 height=12 alt="" border=0>';
my $STAR_HALF	= '<img src="http://DavePics.com/Icons/Star.half.gif" width=11 height=12 alt="" border=0>';
my $STAR_EMPTY	= '<img src="http://DavePics.com/Icons/Star.empty.gif" width=11 height=12 alt="" border=0>';

my $HERE = 'http://Daveola.com/Vegetarian/Restaurants/';

my $CITY	= 'San Francisco';
my $STATE	= 'CA';
my @NEAR_CITIES = ('Oakland','Berkeley','Mill Valley','Half Moon Bay');

makeKML->latlongCache("latlong.cache");
makeKML->useAPI('opencagedata');

sub get_line {
	$_ = <LIST>;
	return $_ unless $_;	# End of file
	s/#.*//g;		# Ignore comments
	next if (/^\s*$/);	# Ignore blank lines
	chomp;
	s/^\s+//;
	$_;
}

sub category {
	my ($cat, $long) = @_;

	$cat =~ s/\s*img=(.+)//i unless $long;

	my $bar = $long ? "" : "<hr />";

	if ($cat =~ /(.+)\s*img=(.+)/i) {
		print OUT <<END_OF_CATEGORY_IMG;
	<tr>
		<td colspan=4>
			<table width='100%'><tr><td valign=top>
				$bar
				<font color=red><b>$1</b></font>
			</td><td align=right>
				<img src='$2' alt=comic>
			</td></tr></table>
			<br><hr />
		</td>
	</tr>
END_OF_CATEGORY_IMG
	} else {
		print OUT <<END_OF_CATEGORY;
	<tr>
		<td colspan=4><font size='+1'>
			$bar
			<font color=red><b>$cat</b></font>
			<br><hr />
		</font></td>
	</tr>
END_OF_CATEGORY
	}
}

sub addrFull {
	my ($addr) = @_;
	return '' unless $addr;
	my $city = $CITY;
	my $near = join("|",@NEAR_CITIES);
	($addr,$city) = ($`,$1) if ($addr =~ /, ($near)$/i);
	$addr =~ s/\'//g;
	$addr =~ s/\(.+//;  $addr =~ s/\@.+//;
	$addr =~ s/^\s+//;  $addr =~ s/\s+$//;
	($addr,$city,$STATE);
}

sub addrLink {
	my ($addr,$city,$state) = @_;
	return '' unless $addr;
	my $link = $addr;
	$link =~ s/\&/%26/g;
	#YAHOO#$link = "addr=${link}&csz=${city}, $state";
	$link =~ s/,/%2C/g;
	$link =~ s/\s+/+/g;
	#YAHOO#return "<a rel=nofollow href=\"http://maps.yahoo.com/py/maps.py?$addr\">$addr</a>";
	return "<a rel=nofollow href=\"http://maps.google.com/maps?f=q&hl=en&q=${link}%2C+$city+$state\">$addr</a>";
}

sub stars {
	my ($what,$stars) = @_;

	$what="<font size=-1>$what:</font> ";
	return "$what$stars" unless ($stars =~ /^\s*(\d)?(.5)?\s*$/);
	my ($num,$half) = ($1,$2);
	$what .= $STAR_FULL x $num;
	$what .= $STAR_HALF if $half;
	my $left = 5 - $num - ($half ? 1 : 0);
	$what .= $STAR_EMPTY x $left if $left;
	$what;
}

sub realPhone {
	my ($phone) = @_;
	return "415-$phone" if $phone =~ /^\d{3}-\d{4}$/;
	return "$phone" if $phone =~ /^[\d-]+$/;
	return undef;
}

sub header {
	my ($long) = @_;
	open(HEADER,$long ? $HEADER : $HEADER_SHORT) || die("Couldn't read $HEADER\n");
	while(<HEADER>) { print OUT; }
}

sub footer {
	if (open(FOOTER,$FOOTER) || die("Couldn't read $FOOTER\n")) {
		while(<FOOTER>) { print OUT; }
	}
}

sub make {
	my ($out, $kml) = @_;
	my $COUNT=0;
	my $long = $kml ? 1 : 0;

	open(LIST,"<$LIST") || die("Couldn't read $LIST\n");
	open(OUT,">$out") || die("Couldn't write $out\n");

	my $kmlOb = makeKML->new({
			file => $kml,
			name => "$CITY Vegetarian Restaurants",
		}) if $kml;

	header($long);

	my $name = undef;
	my $category;
	while(get_line()) {

		# New category
		if (/^CATEGORY:(.+)/) {
			$category = $1;
			category($category,$long);
			next;
		}

		# Get the info
			# name
			# taste selection health vegan [stars]
			# phone
			# address
			# description
		$name = $_;
		my ($type) = get_line();
		my ($taste,$selection,$health,$vegan) = split(/\s+/,get_line());
		if ($taste,$selection,$health,$vegan) {
			$taste=stars("Taste",$taste);
			$selection=stars("Selection",$selection);
			$health=stars("Health",$health);
			$vegan=stars("Vegan",$vegan);
		}
		my $phone = get_line();
		my $realPhone = realPhone($phone);
		my $aPhone = $realPhone ? "<a href=\"tel:$realPhone\">$phone</a>" : $phone;
		my $addr = get_line();
		my ($addrFull,$city,$state) = addrFull($addr);
		my ($addrLink) = addrLink($addrFull,$city,$state);
		my $desc;
		while(<LIST>) {
			last if (/^\s*$/);
			$desc.=$_;
		}

		my $clean_name = $name;
		$clean_name = $1 if ($name =~ />([^<]+)</);
		$clean_name =~ s/<br>/_/g;
		$clean_name =~ s/[<>\s]/_/g;
		$clean_name =~ s/[\'\"]//g;
		$clean_name =~ s/é/e/g;
		$clean_name =~ s/([\x00-\x20\x7F-\xFF])/"%".sprintf("%2.2x",ord($1))/eg;
		$clean_name =~ s/&/&amp;/g;

		my $visibility = $category =~ /outside/i ? 0 : 1;

		$kmlOb->add({
			name => $name,
			phone => $realPhone,
			desc => $desc,
			link => "$HERE#%name%",
			address => $addrFull,
			city => $city,
			visibility => $visibility,
			state => $STATE,
		}) if $kml && $addrFull && $addrFull ne "San Francisco"
			&& $category !~ /no longer around/i
			&& $visibility;	# Google maps is ignoring the <visibility> tag..


		$COUNT++;
		print OUT <<END_OF_ENTRY1;
	<tr valign=top>
		<td>
			<a name='$clean_name'><b>$name</b></a>
		</td><td>
			$type
		</td><td>
			$aPhone
		</td><td>
			$addrLink
		</td>
	</tr>
END_OF_ENTRY1
		print OUT <<END_OF_ENTRY2 if $long && ($taste || $selection || $health || $vegan);
	<tr>
		<td width='25%'>
			$taste
		</td> <td width='25%'>
			$selection
		</td> <td width='25%'>
			$health
		</td> <td width='25%'>
			$vegan
		</td>
	</tr>
END_OF_ENTRY2
		print OUT <<END_OF_ENTRY3 if $long
	<tr>
		<td colspan=4><font size='-1'>
			$desc
			<br><hr>
		</font></td>
	</tr>
END_OF_ENTRY3

	}
	footer();

	close LIST;
	close OUT;

	if ($kml) {
		$kmlOb->write();

		open(OUT,">Map/index.html") || die("Couldn't write Map/index.html\n");
		header();
		print OUT <<MAP;
<script type="text/javascript"
	src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBUrNHTUFToba61ZyU4nQClRKNW3KWg-Ok">
</script>
<script type="text/javascript">
	function initialize() {
		var mapOptions = {
			center: { lat: 37.765622, lng: -122.444344},
			zoom: 13
		};
		var map = new google.maps.Map(document.getElementById('map-canvas'),
				mapOptions);

		// Timestamp that changes every 500 seconds so Google will reload KML
		var time500 = parseInt((new Date().getTime())/500000);
		var georssLayer = new google.maps.KmlLayer(
			'http://Daveola.com/Vegetarian/Restaurants/Map.kml?a='+time500,
			{ map: map, preserveViewport: true }
		);
		georssLayer.setMap(map);

	}
	google.maps.event.addDomListener(window, 'load', initialize);
</script>
<div style="color: black; height: 600px; width: 100%; margin: 0; padding: 0;" id="map-canvas"></div>
MAP
		footer();
		close OUT;
	}

	print STDERR "$COUNT restaurants\n" if $long;
}

make("index.html","Map.kml");
make("short.html");

