summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f <luxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f>2010-05-09 02:32:42 +0000
committerluxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f <luxagraf@c63593aa-01b0-44d9-8516-4b9c7e931d7f>2010-05-09 02:32:42 +0000
commite01eed46a5a017dd1bc82a1e80de37d9a69ab12c (patch)
tree5dbbf6cc0581951d835d59dee5d2b062ebc81197
parent3085c5781346993f09882936151bb70e212df420 (diff)
revamped national parks project files
-rw-r--r--apps/projects/admin.py153
-rw-r--r--apps/projects/models/__init__.py2
-rw-r--r--apps/projects/models/natparks.py46
-rw-r--r--apps/projects/shortcuts.py235
-rw-r--r--apps/projects/urls.py1
-rw-r--r--apps/projects/views.py14
-rw-r--r--media/css/base.css2
-rw-r--r--media/img/mapbg-dark.pngbin0 -> 5303 bytes
-rw-r--r--media/img/parkbg.pngbin0 -> 3835 bytes
-rw-r--r--media/js/natparks.js143
-rw-r--r--media/sass/_projects.sass171
-rw-r--r--templates/archives/projects.html36
-rw-r--r--templates/base.html2
-rw-r--r--templates/details/national-parks.html87
-rw-r--r--templates/details/photo_galleries.html2
15 files changed, 583 insertions, 311 deletions
diff --git a/apps/projects/admin.py b/apps/projects/admin.py
index e1142f8..66e1318 100644
--- a/apps/projects/admin.py
+++ b/apps/projects/admin.py
@@ -6,7 +6,7 @@ from django.conf import settings
from projects.models.base import Project
from projects.models.fiveby import FiveBy
-from projects.models.natparks import NationalParkBorders,NationalParkBordersTwo, NationalParks
+from projects.models.natparks import NationalParks
GMAP = GoogleMap(key=settings.GOOGLE_MAPS_API_KEY)
@@ -111,105 +111,7 @@ class FiveByAdmin(OSMGeoAdmin):
#debug = False
#widget = OpenLayersWidget
-class NationalParkBordersAdmin(OSMGeoAdmin):
-
- list_display = ('name1','name2','name3','url')
- search_fields = ['name1',]
- fieldsets = (
- ('Project', {'fields': ('name1', 'mpoly','url'), 'classes': ('show','extrapretty','wide')}),
- )
-
-
-
- class Media:
- js = ['/media/admin/custom/model.js']
- extra_js = [GMAP.api_url + GMAP.key]
- map_template = 'gis/admin/google.html'
- #map_template = 'gis/admin/google.html'
- # Default GeoDjango OpenLayers map options
- # Uncomment and modify as desired
- # To learn more about this jargon visit:
- # www.openlayers.org
-
- default_lon = -9314310
- default_lat = 3991847
- default_zoom = 6
- #display_wkt = False
- #display_srid = False
- #extra_js = []
- #num_zoom = 18
- #max_zoom = False
- #min_zoom = False
- #units = False
- #max_resolution = False
- #max_extent = False
- #modifiable = True
- #mouse_position = True
- #scale_text = True
- #layerswitcher = True
- scrollable = False
- #admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
- map_width = 700
- map_height = 325
- #map_srid = 4326
- #map_template = 'gis/admin/openlayers.html'
- #openlayers_url = 'http://openlayers.org/api/2.6/OpenLayers.js'
- #wms_url = 'http://labs.metacarta.com/wms/vmap0'
- #wms_layer = 'basic'
- #wms_name = 'OpenLayers WMS'
- #debug = False
- #widget = OpenLayersWidget
-
-class NationalParkBordersTwoAdmin(OSMGeoAdmin):
-
- list_display = ('name',)
- search_fields = ['name',]
- fieldsets = (
- ('Project', {'fields': ('name', 'mpoly','mline','mpoint'), 'classes': ('show','extrapretty','wide')}),
- )
-
-
-
- class Media:
- js = ['/media/admin/custom/model.js']
- extra_js = [GMAP.api_url + GMAP.key]
- map_template = 'gis/admin/google.html'
- #map_template = 'gis/admin/google.html'
- # Default GeoDjango OpenLayers map options
- # Uncomment and modify as desired
- # To learn more about this jargon visit:
- # www.openlayers.org
-
- default_lon = -9314310
- default_lat = 3991847
- default_zoom = 6
- #display_wkt = False
- #display_srid = False
- #extra_js = []
- #num_zoom = 18
- #max_zoom = False
- #min_zoom = False
- #units = False
- #max_resolution = False
- #max_extent = False
- #modifiable = True
- #mouse_position = True
- #scale_text = True
- #layerswitcher = True
- scrollable = False
- #admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
- map_width = 700
- map_height = 325
- #map_srid = 4326
- #map_template = 'gis/admin/openlayers.html'
- #openlayers_url = 'http://openlayers.org/api/2.6/OpenLayers.js'
- #wms_url = 'http://labs.metacarta.com/wms/vmap0'
- #wms_layer = 'basic'
- #wms_name = 'OpenLayers WMS'
- #debug = False
- #widget = OpenLayersWidget
-
class NationalParksAdmin(OSMGeoAdmin):
@@ -260,58 +162,7 @@ class NationalParksAdmin(OSMGeoAdmin):
#wms_name = 'OpenLayers WMS'
#debug = False
#widget = OpenLayersWidget
-'''
-class NPEntryAdmin(OSMGeoAdmin):
-
- list_display = ('title',)
- search_fields = ['title','park']
- fieldsets = (
- ('Project', {'fields': ('title', 'dek', 'park', 'post', ('slug', 'status'),'pub_date','point',), 'classes': ('show','extrapretty','wide')}),
- )
-
-
- class Media:
- js = ['/media/admin/custom/model.js']
- extra_js = [GMAP.api_url + GMAP.key]
- map_template = 'gis/admin/google.html'
- #map_template = 'gis/admin/google.html'
- # Default GeoDjango OpenLayers map options
- # Uncomment and modify as desired
- # To learn more about this jargon visit:
- # www.openlayers.org
-
- default_lon = -9314310
- default_lat = 3991847
- default_zoom = 6
- #display_wkt = False
- #display_srid = False
- #extra_js = []
- #num_zoom = 18
- #max_zoom = False
- #min_zoom = False
- #units = False
- #max_resolution = False
- #max_extent = False
- #modifiable = True
- #mouse_position = True
- #scale_text = True
- #layerswitcher = True
- scrollable = False
- #admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
- map_width = 700
- map_height = 325
- #map_srid = 4326
- #map_template = 'gis/admin/openlayers.html'
- #openlayers_url = 'http://openlayers.org/api/2.6/OpenLayers.js'
- #wms_url = 'http://labs.metacarta.com/wms/vmap0'
- #wms_layer = 'basic'
- #wms_name = 'OpenLayers WMS'
- #debug = False
- #widget = OpenLayersWidget
-'''
+
admin.site.register(Project, ProjectAdmin)
admin.site.register(FiveBy, FiveByAdmin)
-#admin.site.register(NPEntry, NPEntryAdmin)
-admin.site.register(NationalParkBorders, NationalParkBordersAdmin)
-admin.site.register(NationalParkBordersTwo, NationalParkBordersTwoAdmin)
admin.site.register(NationalParks, NationalParksAdmin) \ No newline at end of file
diff --git a/apps/projects/models/__init__.py b/apps/projects/models/__init__.py
index 5d544c1..fdee7fc 100644
--- a/apps/projects/models/__init__.py
+++ b/apps/projects/models/__init__.py
@@ -1,3 +1,3 @@
from base import Project
from fiveby import FiveBy
-from natparks import NationalParkBorders, NationalParkBordersTwo, NationalParks \ No newline at end of file
+from natparks import NationalParks \ No newline at end of file
diff --git a/apps/projects/models/natparks.py b/apps/projects/models/natparks.py
new file mode 100644
index 0000000..c78052c
--- /dev/null
+++ b/apps/projects/models/natparks.py
@@ -0,0 +1,46 @@
+from django.contrib.gis.db import models
+from blog.models import Entry
+from photos.models import PhotoGallery
+from locations.models import State
+
+PUB_STATUS = (
+ (0, 'Draft'),
+ (1, 'Published'),
+ )
+
+
+import datetime
+def get_upload_path(self, filename):
+ return "images/projects/np/%s/%s" %(datetime.datetime.today().strftime("%Y"), filename)
+
+
+class NationalParks(models.Model):
+ type = models.CharField(max_length=50)
+ name = models.CharField(max_length=254)
+ state = models.ForeignKey(State, null=True)
+ size = models.CharField(max_length=10, null=True)
+ fee = models.CharField(max_length=5, null=True)
+ camping_fee = models.CharField(max_length=10, null=True)
+ url = models.CharField(max_length=250, null=True)
+ code= models.CharField(max_length=16)
+ unit_name= models.CharField(max_length=254)
+ date_visited_begin = models.DateTimeField('Date Visited',null=True)
+ date_visited_end = models.DateTimeField('Date Visited',null=True)
+ zoom= models.IntegerField(null=True)
+ mpoly = models.MultiPolygonField(null=True)
+ visited = models.BooleanField(default=False)
+ dek = models.TextField(null=True, blank=True)
+ tag_line = models.CharField(max_length=254, null=True)
+ post = models.ForeignKey(Entry, null=True)
+ gallery = models.ForeignKey(PhotoGallery, blank=True, null=True, verbose_name='photo set')
+ image = models.FileField(upload_to=get_upload_path, null=True,blank=True,help_text="width: 980px, height: > 450px")
+ objects = models.GeoManager()
+
+ class Meta:
+ verbose_name_plural = "National Parks"
+ app_label = 'projects'
+ ordering = ('-visited','unit_name',)
+ # Returns the string representation of the model.
+ def __unicode__(self):
+ return self.unit_name
+
diff --git a/apps/projects/shortcuts.py b/apps/projects/shortcuts.py
new file mode 100644
index 0000000..d54410c
--- /dev/null
+++ b/apps/projects/shortcuts.py
@@ -0,0 +1,235 @@
+from django.contrib.gis.db.models.fields import GeometryField
+#from django.contrib.gis.gdal import Envelope
+from django.contrib.gis.geos import Polygon
+from django.utils import simplejson
+from django.http import HttpResponse
+#from django.db.models.fields.related import ManyRelatedManager
+
+# also need to check out:
+# http://code.google.com/p/dojango/source/browse/trunk/dojango/util/__init__.py#82
+
+
+# example usages:
+
+"""
+
+def a_shapes(request):
+ ids = request.GET.get('ids').split(',')
+ mimetype = 'text/plain' #'application/javascript; charset=utf8'
+ pretty_print = True
+ if ids:
+ qs = WorldBorders.objects.filter(affiliates__in=ids).annotate(num_a=Count('affiliates')).filter(num_a__gt=0)
+ else:
+ qs = WorldBorders.objects.none()
+ return render_to_geojson(qs,
+ extra_attributes=['num_a','affiliates_set'],
+ geom_attribute='point',
+ included_fields=['id','name'],
+ mimetype=mimetype,
+ proj_transform=900913,
+ pretty_print=pretty_print
+ )
+
+def responses(qs,type_='countries',pretty_print=True,mimetype='text/plain'):
+ if type_ == 'locations':
+ qs = qs.geolocations()
+ return render_to_geojson(qs,
+ excluded_fields=['json'],
+ geom_field='point',
+ proj_transform=900913,
+ mimetype=mimetype,
+ pretty_print=pretty_print
+ )
+ elif type_ == 'affiliates':
+ qs = qs.exclude(geokeywords='').attach_locations()
+ return render_to_geojson(qs,
+ included_fields=['id','_geokeywords_cache'],
+ geom_attribute='point',
+ extra_attributes=['name'],
+ proj_transform=900913,
+ mimetype=mimetype,
+ pretty_print=pretty_print
+ )
+ elif type_ == 'countries':
+ qs2 = W.objects.filter(affiliates__in=qs).annotate(num_a=Count('affiliates')).filter(num_a__gt=0)
+ return render_to_geojson(qs2,
+ extra_attributes=['num_a'],
+ #geom_attribute='point',
+ mimetype=mimetype,
+ pretty_print=pretty_print
+ )
+ else:# type_ == 'countries' or type is None:
+ if len(qs) > 10:
+ # this is a limit, weird huh?
+ # requires another all() otherwise it
+ # returns a list!
+ qs = qs.all()[:10]
+ return render_to_geojson(qs,
+ included_fields=['id','_geokeywords_cache'],
+ geom_attribute='countries.unionagg',
+ extra_attributes=['name'],
+ mimetype=mimetype,
+ pretty_print=pretty_print
+ )
+"""
+
+
+
+def render_to_geojson(query_set, geom_field=None, geom_attribute=None, extra_attributes=[],mimetype='text/plain', pretty_print=False, excluded_fields=[],included_fields=[],proj_transform=None):
+ '''
+
+ Shortcut to render a GeoJson FeatureCollection from a Django QuerySet.
+ Currently computes a bbox and adds a crs member as a sr.org link
+
+ '''
+ excluded_fields.append('_state')
+ collection = {}
+ if hasattr(query_set,'_meta'): # its a model instance
+ fields = query_set._meta.fields
+ query_set = [query_set]
+ else:
+ fields = query_set.model._meta.fields
+
+ if geom_attribute:
+ geometry_name = geom_attribute
+ geo_field = None
+ if '.' in geom_attribute:
+ prop, meth = geom_attribute.split('.')
+ if len(query_set):
+ p = getattr(query_set[0],prop)
+ geo_field = getattr(p,meth)
+ if callable(geo_field):
+ geo_field = geo_field()
+ else:
+ if len(query_set):
+ geo_field = getattr(query_set[0],geom_attribute)
+ if callable(geo_field):
+ geo_field = geo_field()
+ if not geo_field:
+ srid = 4326
+ else:
+ srid = geo_field.srid
+
+ else:
+ geo_fields = [f for f in fields if isinstance(f, GeometryField)]
+
+ #attempt to assign geom_field that was passed in
+ if geom_field:
+ #import pdb;pdb.set_trace()
+ geo_fieldnames = [x.name for x in geo_fields]
+ try:
+ geo_field = geo_fields[geo_fieldnames.index(geom_field)]
+ except:
+ raise Exception('%s is not a valid geometry on this model' % geom_field)
+ else:
+ if not len(geo_fields):
+ raise Exception('There appears to be no valid geometry on this model')
+ geo_field = geo_fields[0] # no support yet for multiple geometry fields
+
+
+ #remove other geom fields from showing up in attributes
+ if len(geo_fields) > 1:
+ for field in geo_fields:
+ if field.name not in excluded_fields:
+ excluded_fields.append(field.name)
+
+ geometry_name = geo_field.name
+
+
+ srid = geo_field.srid
+
+ if proj_transform:
+ to_srid = proj_transform
+ else:
+ to_srid = srid
+ # Gather the projection information
+ crs = {}
+ crs['type'] = "link"
+ crs_properties = {}
+ crs_properties['href'] = 'http://spatialreference.org/ref/epsg/%s/' % to_srid
+ crs_properties['type'] = 'proj4'
+ crs['properties'] = crs_properties
+ collection['crs'] = crs
+ collection['srid'] = to_srid
+
+ # Build list of features
+ features = []
+ if query_set.distinct():
+ for item in query_set:
+ feat = {}
+ feat['type'] = 'Feature'
+ if included_fields:
+ d = {}
+ for f in included_fields:
+ if hasattr(item,f):
+ d[f] = getattr(item,f)
+ else:
+ d = item.__dict__.copy()
+ for field in excluded_fields:
+ if field in d.keys():
+ d.pop(field)
+ if geometry_name in d:
+ d.pop(geometry_name)
+
+ for attr in extra_attributes:
+ a = getattr(item,attr)
+ # crappy way of trying to figure out it this is a
+ # m2m, aka 'ManyRelatedManager'
+ if hasattr(a,'values_list'):
+ a = list(a.values_list('id',flat=True))
+ if callable(a):
+ d[attr] = a()
+ else:
+ d[attr] = a
+ if '.' in geometry_name:
+ prop, meth = geometry_name.split('.')
+ a = getattr(item,prop)
+ g = getattr(a,meth)
+ if callable(g):
+ g = g()
+ else:
+ g = getattr(item,geometry_name)
+ if g:
+ if proj_transform:
+ g.transform(proj_transform)
+ feat['geometry'] = simplejson.loads(g.geojson)
+ feat['properties'] = d
+ features.append(feat)
+ else:
+ pass #features.append({'type':'Feature','geometry': {},'properties':{}})
+
+ # Label as FeatureCollection and add Features
+ collection['type'] = "FeatureCollection"
+ collection['features'] = features
+
+ # Attach extent of all features
+ if query_set:
+ ex = None
+ query_set.query.distinct = False
+ if hasattr(query_set,'agg_extent'):
+ ex = [x for x in query_set.agg_extent.tuple]
+ elif '.' in geometry_name:
+ prop, meth = geometry_name.split('.')
+ a = getattr(item,prop)
+ if a:
+ ex = [x for x in a.extent()]
+ else:
+ # make sure qs does not have .distinct() in it...
+ ex = [x for x in query_set.extent()]
+ if ex:
+ if proj_transform:
+ poly = Polygon.from_bbox(ex)
+ poly.srid = srid
+ poly.transform(proj_transform)
+ ex = poly.extent
+ collection['bbox'] = ex
+
+ # Return response
+ response = HttpResponse()
+ if pretty_print:
+ response.write('%s' % simplejson.dumps(collection, indent=1))
+ else:
+ response.write('%s' % simplejson.dumps(collection))
+ response['Content-length'] = str(len(response.content))
+ response['Content-Type'] = mimetype
+ return response \ No newline at end of file
diff --git a/apps/projects/urls.py b/apps/projects/urls.py
index 3ea4b45..14722a8 100644
--- a/apps/projects/urls.py
+++ b/apps/projects/urls.py
@@ -10,6 +10,7 @@ projects = {
}
urlpatterns = patterns('',
+ (r'data/(?P<id>\d+)/$', 'projects.views.data_json'),
(r'(?P<slug>[-\w]+)/$', 'projects.views.detail'),
(r'^$',list_detail.object_list, dict(projects, template_name='archives/projects.html')),
)
diff --git a/apps/projects/views.py b/apps/projects/views.py
index e3ed773..65de8ae 100644
--- a/apps/projects/views.py
+++ b/apps/projects/views.py
@@ -2,8 +2,10 @@ from django.shortcuts import render_to_response,get_object_or_404
from django.template import RequestContext
from django.views.generic.list_detail import object_list
from django.db.models import get_model
+from django.http import HttpResponse
+from django.core import serializers
-
+from projects.shortcuts import render_to_geojson
from projects.models.base import Project
from projects.models.fiveby import FiveBy
from projects.models.natparks import NationalParks
@@ -24,3 +26,13 @@ def detail(request,slug):
return object_list(request, queryset=qs, template_name=template,)
+def data_json(request, id):
+ qs = NationalParks.objects.filter(pk=id)
+ return render_to_geojson(
+ qs,
+ included_fields=['id',],
+ geom_attribute='mpoly',
+ mimetype = 'application/json',
+ pretty_print=True
+ )
+ \ No newline at end of file
diff --git a/media/css/base.css b/media/css/base.css
index 89d4d15..9c5d9ac 100644
--- a/media/css/base.css
+++ b/media/css/base.css
@@ -1 +1 @@
-ol,ul,li,dl{list-style:none;margin:0;padding:0;border:0;outline:0;background:transparent}blockquote,q{quotes:none}:focus{outline:0}header,section,footer,aside,article,nav{display:block;text-align:left}*:focus{outline:#b53a04 dotted thin}body{background:white;font-family:Hoefler Text, Georgia, Times New Roman, Times, serif;font-size:62.5%;line-height:23px;color:#201a11;text-align:center}p{margin:0.8em 0 0 0}a{text-decoration:none;color:#201a11}a:visited{color:#201a11;text-decoration:none}a:hover{color:#b53a04;text-decoration:none}header{width:980px;margin:0 auto 40px}header{border-bottom:#201a11 2px solid;height:160px}header h1 a{background:url('../img/logo.gif') no-repeat left bottom;height:158px;width:400px;float:left;text-indent:-1000px}header h2{float:left;text-indent:-1000px;display:none}header nav{float:left;margin-top:110px;margin-left:40px}header nav li{display:inline;font-size:1.1em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:1.2em;margin-left:4px}header nav a:hover{color:#b53a04}footer{width:980px;background:#201a11;height:36px;color:#888;font-size:1.2em;margin:80px auto 0}footer nav li{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;text-transform:uppercase;line-height:36px;margin-left:8px}footer a{color:#888 !important}footer a:hover{color:#b53a04 !important}footer nav{float:right;margin-right:8px}footer p{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;padding-left:8px;line-height:36px;margin:0}article{width:980px;margin:0 auto}article ul{font-size:1.5em}ul#breadcrumbs{font-weight:normal;font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:110%}ul#breadcrumbs li{display:inline}.hide{display:none}img.postpic,img.postpicright{display:block;margin:.3em .6em;border:#201a11 10px solid;clear:both}img.postpic{float:left;margin-left:0;margin-top:.3em}img.postpicright{float:right;margin-right:0}img.postpicleft{float:left;margin:5px}img.picfull{border:#201a11 10px solid;margin-top:20px}img.post-image{margin:0 10px 0 0;float:left;border:#201a11 10px solid !important}.hide,.dsq-brlink,img[src='http://maps.gstatic.com/intl/en_us/mapfiles/poweredby.png'],.terms-of-use-link,#dsq-comments-count{display:"none"}div[dir='ltr'] span{width:0;visibility:collapse}p.pull-quote{font-size:14px !important;font-style:italic !important}sup{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:.6em}#writing-archive{margin-top:72px;margin-bottom:36px}#writing-archive li{clear:both}#writing-archive h3{font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;margin:0}#writing-archive div{width:420px;float:left}#writing-archive div.img{width:520px;margin-left:20px;margin-bottom:36px}#writing-archive p{margin:0;font-size:1.1em}#writing-archive .location,#writing-archive time{font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;line-height:3em;font-size:.7em}#writing-archive img{border:#201a11 10px solid}body#writing-detail article{font-size:1.7em;line-height:1.5em}body#writing-detail article header{border:none;height:auto;width:auto;margin:0 0 0 0}body#writing-detail article h1{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;font-size:1.8em;line-height:1.2em;margin:0}body#writing-detail article aside{font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:0.7em;line-height:2.3em}body#writing-detail article aside a{color:#201a11}body#writing-detail article aside a:hover{color:#b53a04}body#writing-detail article dl{font-size:100%}body#writing-detail article dl dt{font-style:italic;margin:9px}body#writing-detail article a{color:#b53a04}body#writing-detail article h3{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;font-size:1.6em;line-height:1.2em}.single article header,.single article div#post-body{margin-left:200px !important;width:560px !important}.single article header p:nth-of-type(1),.single article div#post-body p:nth-of-type(1){font-size:1.2em;line-height:1.4em}.double article header{float:left;width:180px !important;text-align:right !important;margin-top:20px !important}.double article header aside section{text-align:right !important;font-size:1em;line-height:18px}.double article div#post-body{width:780px;float:left;margin-left:20px}.double article div#post-body div.col{width:350px;float:left;margin:0 40px 0 0}.double article div#post-body img.picwide{clear:both;margin:30px 0 30px -200px;border:#201a11 10px solid}.double article div#post-body div.narrow{width:520px}span.drop{font-size:4.8em;display:block;float:left;padding:38px 10px 5px 0;overflow:visible}span.drop-small{font-size:2.9em;display:block;float:left;padding:19px 8px 5px 0;overflow:visible}blockquote{font-size:.8em}ol.footnote{font-size:12px;margin:18px 0}ol.footnote li{margin:12px 0;line-height:.8em}ol.footnote li p{line-height:18px !important;font-size:12px !important}ol.footnote li a,ol.footnote li span{font-size:12px}section#post-metadata{width:560px;border-top:#201a11 1px dotted;border-bottom:#201a11 1px dotted;margin:24px 0 24px 200px;font-size:0.8em;padding-bottom:8px}section#page-navigation{width:980px;margin:24px 0 0 0;text-transform:uppercase;font-size:.5em}section#page-navigation li#next{float:right;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;margin-right:140px}section#page-navigation li#prev{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;margin-left:120px}section#comments{clear:both;width:520px;margin:24px 0 24px 200px;font-size:.8em}section#comments h4{margin-top:96px;font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;text-transform:uppercase;font-size:1.3em}h4 a.disqus-link-count{color:#201a11 !important}#pagination{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;width:980px;clear:both;margin:0;border-top:#201a11 1px dotted;border-bottom:#201a11 1px dotted;text-align:center}#pagination .pagination{margin:8px 0}#pagination .current{color:#b53a04}body.dubcol footer nav li{font-size:0.6em}h4.notes{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-weight:bold;text-transform:uppercase}dl.addendum dt{font-style:italic;margin:0.8em 0 0 0;margin-left:-30px !important;text-indent:-30px;padding-left:30px}dl.addendum dd{margin:0.8em 0 0 0}ul#dsq-comments{font-size:1.2em}.dsq-comment-cite{font-family:Helvetica, Verdana, sans-serif;font-size:.9em !important;font-weight:normal;text-transform:uppercase}.dsq-comment-header-time,.dsq-comment-footer{font-family:Helvetica, Verdana, sans-serif}.dsq-comment-footer{font-size:.8em}#dsq-comments-title{display:none !important}#photo-archive article{width:980px}#photo-archive article h1{display:none}ul#photo-galleries{margin-left:-10px}ul#photo-galleries li{float:left;margin:10px;width:310px;position:relative;display:block}ul#photo-galleries div.figure{border:10px #201a11 solid;height:350px}ul#photo-galleries div.figure img{border:none}ul#photo-galleries span.legend{display:block;color:#888;padding:10px 10px 10px 15px;font-size:85%;line-height:18px;width:285px;background:#201a11;-khtml-opacity:0.9;opacity:0.9;position:absolute;bottom:0;left:0}ul#photo-galleries h3{color:#fff;padding:0;margin:3px 0;font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase}ul#photo-galleries p{margin:0}.map-legend{width:160px;margin-top:24px;float:left}.map-legend h4{font-size:1.1em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:1.4em;margin:8px 0}.map-legend li{font-size:90%;margin:0;line-height:20px}.clearfix{clear:both}#map-canvas{float:left;width:760px;height:500px;border:#201a11 10px solid;margin-left:40px;margin-top:24px}section#location #map-canvas{width:295px;height:350px;border:#201a11 10px solid;margin:10px 0 0 5px}.infowin{line-height:18px;margin-bottom:16px}.infowin p{font-size:1.4em;line-height:1.4em}.infowin h4{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:2.4em;margin:6px 0 0 0}.infowin a{color:#b53a04 !important;border-bottom:1px dotted #b53a04}.infowin .date{color:#888;text-align:center;text-transform:uppercase;display:block;text-align:left;margin:6px 0 0;font-size:1.2em}body#about section{clear:both;margin-top:24px}body#about section ul{font-size:1em;margin:18px}body#about section li{margin:9px}body#about section li a{font-weight:bold}.image{float:left;width:180px;margin-top:48px}.image img{border:#201a11 10px solid}.content{float:left;margin-left:20px;width:540px;font-size:1.6em}.content h3{font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;margin:0}section#post{margin-left:200px}section#post h1{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal}.contact-form li{clear:both;width:440px;padding:4px 0}.contact-form dt{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;text-align:right;font-size:.9em}.contact-form dt label{font-style:normal;text-align:right}.contact-form dd{text-align:right;margin-top:4px}.contact-form dd input#id_name,.contact-form dd input#id_email,.contact-form dd input#id_subject_line{width:298px}div.top{margin:36px 0 106px 0;clear:both;width:940px}div.top a{color:#b53a04}p.col{width:360px;float:left;margin:0 40px 0 0}p.two{margin:0;margin-left:40px;width:450px}ul.project-tease{margin-top:200px}ul.project-tease li{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:18px;line-height:16px;margin-top:36px;clear:both}ul.project-tease li dl{float:left}ul.project-tease li dd{font-family:Hoefler Text,Georgia,Times New Roman,Times,serif;font-size:.9em;line-height:23px;clear:both;margin:0;padding-top:12px;width:380px}ul.project-tease li h4{font-size:24px;line-height:24px;margin:0;width:380px}ul.project-tease li span.proj{font-size:64px;line-height:50px;float:left;margin:2px 2px 0 0}ul.project-tease li span.proj span{font-size:36px}ul.project-tease li dt a{display:block;width:175px;float:left}ul.project-tease li div.img{float:right;width:540px;margin-bottom:72px}ul.project-tease li div.img img{border:#201a11 10px solid}ul#parks{margin-top:36px}ul#parks li{width:980px;position:relative;display:block;margin-top:36px;clear:both;margin-bottom:72px}ul#parks div.figure img{border:none}ul#parks h4{display:block;color:#888;padding:10px 10px 10px 15px;background:#201a11;-khtml-opacity:0.85;opacity:0.85;position:absolute;top:0;width:960px;color:#fff;font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;margin:0}ul#parks div.legend{display:block;padding:10px 10px 10px 15px;background:#201a11;-khtml-opacity:0.85;opacity:0.85;position:absolute;bottom:0;height:205px;width:980px}ul#parks div.desc{font-size:10px;line-height:16px;width:660px;float:left}ul#parks div.desc h5{font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;line-height:36px;font-size:18px;margin:0;padding:0}ul#parks div.desc p{margin:6px 0 10px 0}ul#parks div.desc div{width:400px;float:left}ul#parks div.desc div ul.buttons{padding-top:6px}ul#parks div.desc div ul.buttons li{float:left;clear:none;margin:0px 10px 0 0;width:auto;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:10px}ul#parks div.desc div ul.buttons li a{padding:9px 14px 7px 14px;font-weight:bold;line-height:25px;text-transform:uppercase;background:#463215;color:#fff;-moz-border-radius:25px;-webkit-border-radius:25px}ul#parks div.desc div ul.buttons li a:hover{background:#b53a04}ul#parks div.desc dl{float:left;margin-left:20px;margin-top:3px;padding-top:3px;border-right:1px #463215 solid;padding-right:20px;border-left:1px #463215 solid;padding-left:20px;min-height:130px}ul#parks div.desc dl dt,ul#parks div.desc dl dd{font-size:1.2em;padding-bottom:8px;margin:0;font-family:Helvetica, Verdana, sans-serif}ul#parks div.desc dl dt{clear:left;float:left;line-height:16px;margin:0;width:50px}ul#parks div.desc dl dd{float:left;width:125px;overflow:hidden;margin:0 0 0 4px}ul#parks div.desc dl dd a:hover{color:#b53a04}ul#parks div.map{width:280px;margin-top:42px;height:130px;float:left;margin-left:6px}ul#parks div.map a{display:none}ul#parks div.map div div span{display:none}ul#parks div.entry-foot{clear:both;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:12px;background:#f3f;width:980px;margin-top:4px}img[src='http://maps.gstatic.com/intl/en_us/mapfiles/poweredby.png']{display:none !important}body#projects h3{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal}body#projects article p{font-size:1.4em}#featured-image img{margin-left:20px;margin-bottom:78px}section#writing-tease,section#currently{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;text-transform:uppercase;font-size:.8em;clear:both;width:980px;padding-top:20px;border-top:#b9b9b9 1px dotted}section#currently{padding:0;margin-bottom:0px;margin-top:36px;border-top:#201a11 1px solid}section#currently div.project-tease{font-size:18px;line-height:16px;margin-top:8px}section#currently div.project-tease h4{font-size:64px;line-height:50px;float:left;margin:0}section#currently div.project-tease h4 span{font-size:36px}section#currently div.project-tease a{display:block;width:220px;float:left}section#currently div.project-tease p{font-size:.7em;text-transform:none;line-height:50px;margin-left:440px;font-family:Hoefler Text, Georgia, Times New Roman, Times, serif}section#currently div.project-tease p cite{padding-left:4px}section#fromthearc{clear:both}section#fromthearc li{float:left;width:300px;margin-bottom:20px}section#fromthearc h2{font-size:1.1em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:2em;margin:0}section#fromthearc .col2{margin-left:40px;margin-right:40px}section#fromthearc h3{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;font-size:1.2em;margin-bottom:12px;min-height:50px}section#fromthearc .location,section#fromthearc time{font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;line-height:2em;font-size:.7em}section#fromthearc p{margin:0;text-align:justify}
+ol,ul,li,dl{list-style:none;margin:0;padding:0;border:0;outline:0;background:transparent}blockquote,q{quotes:none}:focus{outline:0}header,section,footer,aside,article,nav{display:block;text-align:left}*:focus{outline:#b53a04 dotted thin}body{background:white;font-family:Hoefler Text, Georgia, Times New Roman, Times, serif;font-size:62.5%;line-height:23px;color:#201a11;text-align:center}p{margin:0.8em 0 0 0}a{text-decoration:none;color:#201a11}a:visited{color:#201a11;text-decoration:none}a:hover{color:#b53a04;text-decoration:none}header{width:980px;margin:0 auto 40px}header{border-bottom:#201a11 2px solid;height:160px}header h1 a{background:url('../img/logo.gif') no-repeat left bottom;height:158px;width:400px;float:left;text-indent:-1000px}header h2{float:left;text-indent:-1000px;display:none}header nav{float:left;margin-top:110px;margin-left:40px}header nav li{display:inline;font-size:1.1em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:1.2em;margin-left:4px}header nav a:hover{color:#b53a04}footer{width:980px;background:#201a11;height:36px;color:#888;font-size:1.2em;margin:80px auto 0}footer nav li{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;text-transform:uppercase;line-height:36px;margin-left:8px}footer a{color:#888 !important}footer a:hover{color:#b53a04 !important}footer nav{float:right;margin-right:8px}footer p{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;padding-left:8px;line-height:36px;margin:0}article{width:980px;margin:0 auto}article ul{font-size:1.5em}ul#breadcrumbs{font-weight:normal;font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:110%}ul#breadcrumbs li{display:inline}.hide{display:none}img.postpic,img.postpicright{display:block;margin:.3em .6em;border:#201a11 10px solid;clear:both}img.postpic{float:left;margin-left:0;margin-top:.3em}img.postpicright{float:right;margin-right:0}img.postpicleft{float:left;margin:5px}img.picfull{border:#201a11 10px solid;margin-top:20px}img.post-image{margin:0 10px 0 0;float:left;border:#201a11 10px solid !important}.hide,.dsq-brlink,img[src='http://maps.gstatic.com/intl/en_us/mapfiles/poweredby.png'],.terms-of-use-link,#dsq-comments-count{display:"none"}div[dir='ltr'] span{width:0;visibility:collapse}p.pull-quote{font-size:14px !important;font-style:italic !important}sup{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:.6em}#writing-archive{margin-top:72px;margin-bottom:36px}#writing-archive li{clear:both}#writing-archive h3{font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;margin:0}#writing-archive div{width:420px;float:left}#writing-archive div.img{width:520px;margin-left:20px;margin-bottom:36px}#writing-archive p{margin:0;font-size:1.1em}#writing-archive .location,#writing-archive time{font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;line-height:3em;font-size:.7em}#writing-archive img{border:#201a11 10px solid}body#writing-detail article{font-size:1.7em;line-height:1.5em}body#writing-detail article header{border:none;height:auto;width:auto;margin:0 0 0 0}body#writing-detail article h1{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;font-size:1.8em;line-height:1.2em;margin:0}body#writing-detail article aside{font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:0.7em;line-height:2.3em}body#writing-detail article aside a{color:#201a11}body#writing-detail article aside a:hover{color:#b53a04}body#writing-detail article dl{font-size:100%}body#writing-detail article dl dt{font-style:italic;margin:9px}body#writing-detail article a{color:#b53a04}body#writing-detail article h3{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;font-size:1.6em;line-height:1.2em}.single article header,.single article div#post-body{margin-left:200px !important;width:560px !important}.single article header p:nth-of-type(1),.single article div#post-body p:nth-of-type(1){font-size:1.2em;line-height:1.4em}.double article header{float:left;width:180px !important;text-align:right !important;margin-top:20px !important}.double article header aside section{text-align:right !important;font-size:1em;line-height:18px}.double article div#post-body{width:780px;float:left;margin-left:20px}.double article div#post-body div.col{width:350px;float:left;margin:0 40px 0 0}.double article div#post-body img.picwide{clear:both;margin:30px 0 30px -200px;border:#201a11 10px solid}.double article div#post-body div.narrow{width:520px}span.drop{font-size:4.8em;display:block;float:left;padding:38px 10px 5px 0;overflow:visible}span.drop-small{font-size:2.9em;display:block;float:left;padding:19px 8px 5px 0;overflow:visible}blockquote{font-size:.8em}ol.footnote{font-size:12px;margin:18px 0}ol.footnote li{margin:12px 0;line-height:.8em}ol.footnote li p{line-height:18px !important;font-size:12px !important}ol.footnote li a,ol.footnote li span{font-size:12px}section#post-metadata{width:560px;border-top:#201a11 1px dotted;border-bottom:#201a11 1px dotted;margin:24px 0 24px 200px;font-size:0.8em;padding-bottom:8px}section#page-navigation{width:980px;margin:24px 0 0 0;text-transform:uppercase;font-size:.5em}section#page-navigation li#next{float:right;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;margin-right:140px}section#page-navigation li#prev{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;margin-left:120px}section#comments{clear:both;width:520px;margin:24px 0 24px 200px;font-size:.8em}section#comments h4{margin-top:96px;font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;text-transform:uppercase;font-size:1.3em}h4 a.disqus-link-count{color:#201a11 !important}#pagination{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;width:980px;clear:both;margin:0;border-top:#201a11 1px dotted;border-bottom:#201a11 1px dotted;text-align:center}#pagination .pagination{margin:8px 0}#pagination .current{color:#b53a04}body.dubcol footer nav li{font-size:0.6em}h4.notes{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-weight:bold;text-transform:uppercase}dl.addendum dt{font-style:italic;margin:0.8em 0 0 0;margin-left:-30px !important;text-indent:-30px;padding-left:30px}dl.addendum dd{margin:0.8em 0 0 0}ul#dsq-comments{font-size:1.2em}.dsq-comment-cite{font-family:Helvetica, Verdana, sans-serif;font-size:.9em !important;font-weight:normal;text-transform:uppercase}.dsq-comment-header-time,.dsq-comment-footer{font-family:Helvetica, Verdana, sans-serif}.dsq-comment-footer{font-size:.8em}#dsq-comments-title{display:none !important}#photo-archive article{width:980px}#photo-archive article h1{display:none}ul#photo-galleries{margin-left:-10px}ul#photo-galleries li{float:left;margin:10px;width:310px;position:relative;display:block}ul#photo-galleries div.figure{border:10px #201a11 solid;height:350px}ul#photo-galleries div.figure img{border:none}ul#photo-galleries span.legend{display:block;color:#888;padding:10px 10px 10px 15px;font-size:85%;line-height:18px;width:285px;background:#201a11;-khtml-opacity:0.9;opacity:0.9;position:absolute;bottom:0;left:0}ul#photo-galleries h3{color:#fff;padding:0;margin:3px 0;font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase}ul#photo-galleries p{margin:0}.map-legend{width:160px;margin-top:24px;float:left}.map-legend h4{font-size:1.1em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:1.4em;margin:8px 0}.map-legend li{font-size:90%;margin:0;line-height:20px}.clearfix{clear:both}#map-canvas{float:left;width:760px;height:500px;border:#201a11 10px solid;margin-left:40px;margin-top:24px}section#location #map-canvas{width:295px;height:350px;border:#201a11 10px solid;margin:10px 0 0 5px}.infowin{line-height:18px;margin-bottom:16px}.infowin p{font-size:1.4em;line-height:1.4em}.infowin h4{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:2.4em;margin:6px 0 0 0}.infowin a{color:#b53a04 !important;border-bottom:1px dotted #b53a04}.infowin .date{color:#888;text-align:center;text-transform:uppercase;display:block;text-align:left;margin:6px 0 0;font-size:1.2em}body#about section{clear:both;margin-top:24px}body#about section ul{font-size:1em;margin:18px}body#about section li{margin:9px}body#about section li a{font-weight:bold}.image{float:left;width:180px;margin-top:48px}.image img{border:#201a11 10px solid}.content{float:left;margin-left:20px;width:540px;font-size:1.6em}.content h3{font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;margin:0}section#post{margin-left:200px}section#post h1{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal}.contact-form li{clear:both;width:440px;padding:4px 0}.contact-form dt{float:left;font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;text-align:right;font-size:.9em}.contact-form dt label{font-style:normal;text-align:right}.contact-form dd{text-align:right;margin-top:4px}.contact-form dd input#id_name,.contact-form dd input#id_email,.contact-form dd input#id_subject_line{width:298px}div.top{margin:36px 0 36px 0;clear:both;width:940px}div.top a{color:#b53a04}p.col{width:360px;float:left;margin:0 40px 0 0;font-size:14px}p.two{margin:0;margin-left:40px;width:450px}div.break{border-bottom:#e3e3e3 1px solid;width:980px;height:2px;padding-top:36px;clear:both;margin:0}ul.project-tease{margin-top:65px}ul.project-tease li{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:18px;line-height:16px;margin-top:36px;clear:both}ul.project-tease li .tease{float:left}ul.project-tease li .tease h4{font-size:24px;line-height:24px;margin:0;width:380px}ul.project-tease li .lede{clear:both;margin:0;padding-top:12px;width:380px}ul.project-tease li .lede p{font-family:Hoefler Text,Georgia,Times New Roman,Times,serif;font-size:.9em !important;line-height:23px}ul.project-tease li span.proj{font-size:64px;line-height:50px;float:left;margin:2px 2px 0 0}ul.project-tease li span.proj span{font-size:36px}ul.project-tease li dt a{display:block;width:175px;float:left}ul.project-tease li div.img{float:right;width:540px;margin-bottom:72px}ul.project-tease li div.img img{border:#201a11 10px solid}.map-container{width:469px;height:392px;position:absolute;right:20px;bottom:60px;z-index:2000;margin:0;padding:0;background:url('../img/mapbg-dark.png') no-repeat top left}.more-container{width:405px;height:260px;position:absolute;right:-30px;bottom:40px;z-index:2000;background:url('../img/parkbg.png') no-repeat top left}.more-container dl{margin-top:45px;margin-left:45px}.more-container dl dt,.more-container dl dd{font-size:.9em;line-height:25px;margin:4px 0;font-family:Helvetica, Verdana, sans-serif}.more-container dl dt{clear:left;float:left;width:65px;font-weight:bold;line-height:25px;font-size:.7em;text-transform:uppercase}.more-container dl dd{float:left;width:250px;overflow:hidden}.more-container dl dd a:hover{color:#b53a04}.map-wrapper{width:400px;height:328px;margin:37px 0 0 44px}ul#parks{margin-top:36px}ul#parks li{width:980px;position:relative;display:block;margin-top:36px;clear:both;margin-bottom:72px}ul#parks div.figure img{border:none}ul#parks h4{display:block;color:#888;padding:10px 10px 10px 15px;background:#201a11;-khtml-opacity:0.85;opacity:0.85;position:absolute;top:0;width:960px;color:#fff;font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;margin:0}ul#parks div.legend{display:block;padding:10px 10px 10px 15px;background:#201a11;-khtml-opacity:0.85;opacity:0.85;position:absolute;bottom:0;height:45px;width:980px;font-size:10px;line-height:16px}ul#parks div.legend h5{font-family:Helvetica, Verdana, sans-serif;font-size:1.6em;line-height:1.3em;font-weight:normal;line-height:36px;font-size:18px;margin:0;padding:0;float:left}ul#parks div.legend p{margin:6px 0 10px 0}ul#parks div.legend ul.buttons{padding-top:6px;float:right;margin-right:20px}ul#parks div.legend ul.buttons li{float:left;clear:none;margin:0px 10px 0 0;width:auto;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:10px}ul#parks div.legend ul.buttons li a{padding:9px 14px 7px 14px;font-weight:bold;line-height:25px;text-transform:uppercase;background:#463215;color:#fff;-moz-border-radius:25px;-webkit-border-radius:25px}ul#parks div.legend ul.buttons li a:hover{background:#b53a04}ul#parks div.map{width:280px;margin-top:42px;height:130px;float:left;margin-left:6px}ul#parks div.map a{display:none}ul#parks div.map div div span{display:none}ul#parks div.entry-foot{clear:both;font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;font-size:12px;background:#f3f;width:980px;margin-top:4px}img[src='http://maps.gstatic.com/intl/en_us/mapfiles/poweredby.png']{display:none !important}body#projects h3{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal}body#projects article p{font-size:1.4em}#featured-image img{margin-left:20px;margin-bottom:78px}section#writing-tease,section#currently{font-family:Helvetica, Verdana, sans-serif;font-size:1em;font-weight:normal;text-transform:uppercase;font-size:.8em;clear:both;width:980px;padding-top:20px;border-top:#b9b9b9 1px dotted}section#currently{padding:0;margin-bottom:0px;margin-top:36px;border-top:#201a11 1px solid}section#currently div.project-tease{font-size:18px;line-height:16px;margin-top:8px}section#currently div.project-tease h4{font-size:64px;line-height:50px;float:left;margin:0}section#currently div.project-tease h4 span{font-size:36px}section#currently div.project-tease a{display:block;width:220px;float:left}section#currently div.project-tease p{font-size:.7em;text-transform:none;line-height:50px;margin-left:440px;font-family:Hoefler Text, Georgia, Times New Roman, Times, serif}section#currently div.project-tease p cite{padding-left:4px}section#fromthearc{clear:both}section#fromthearc li{float:left;width:300px;margin-bottom:20px}section#fromthearc h2{font-size:1.1em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;font-size:2em;margin:0}section#fromthearc .col2{margin-left:40px;margin-right:40px}section#fromthearc h3{font-family:Helvetica, Verdana, sans-serif;font-size:2em;line-height:1.5em;font-weight:normal;font-size:1.2em;margin-bottom:12px;min-height:50px}section#fromthearc .location,section#fromthearc time{font-size:0.8em;letter-spacing:1px;line-height:1.2em;text-transform:uppercase;line-height:2em;font-size:.7em}section#fromthearc p{margin:0;text-align:justify}
diff --git a/media/img/mapbg-dark.png b/media/img/mapbg-dark.png
new file mode 100644
index 0000000..23b7d7f
--- /dev/null
+++ b/media/img/mapbg-dark.png
Binary files differ
diff --git a/media/img/parkbg.png b/media/img/parkbg.png
new file mode 100644
index 0000000..5e2789b
--- /dev/null
+++ b/media/img/parkbg.png
Binary files differ
diff --git a/media/js/natparks.js b/media/js/natparks.js
new file mode 100644
index 0000000..1a94e16
--- /dev/null
+++ b/media/js/natparks.js
@@ -0,0 +1,143 @@
+//Utility functions for map info window
+function mapit(lat,lon,zoom,id) {
+ var map;
+ //create a new map
+ var centerCoord = new google.maps.LatLng(lat, lon);
+ var mapOptions = {
+ zoom: zoom,
+ center: centerCoord,
+ mapTypeId: google.maps.MapTypeId.TERRAIN,
+ disableDefaultUI: true,
+ navigationControl: true,
+ navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
+ };
+ map = new google.maps.Map(document.getElementById('map-wrapper-'+id), mapOptions);
+ //get the geojson for this map
+ $.ajax({
+ url: "/projects/data/"+id+"/",
+ dataType: "json",
+ success: function(data, text, request) { draw_poly(data); }
+ //complete: function(xhr, status) {console.log(status); return false; },
+ });
+ //draw the polygon
+ function draw_poly(data) {
+ var poly = createPolygons(data.features[0].geometry);
+ for (i=0;i<=poly.length-1;i++) {
+ poly[i].setMap(map);
+ }
+
+ }
+}
+
+// utility functions to create/remove map container
+function create_map(obj) {
+ //break up the variable passed from the map link's title element
+ var lat = parseFloat(obj.title.split(',')[0]);
+ var lon = parseFloat(obj.title.split(',')[1]);
+ var zoom= parseInt(obj.title.split(',')[2]);
+ var id= obj.title.split(',')[3];
+
+ //create container divs
+ $(obj).parents().eq(3).append('<div class="map-container" id="map-container-'+id+'">');
+ $('#map-container-'+id).append('<div class="map-wrapper" id="map-wrapper-'+id+'">');
+
+
+ //deal with the variable height of div.legend
+ //$('#map-container').css({
+ // bottom: function(index, value) {
+ // return parseFloat($(obj).parent().parent().css("height"))-2;
+ // }
+ // });
+
+ mapit(lat,lon,zoom,id);
+}
+function remove_map(id) {
+ $(id).remove();
+}
+
+//function to parse and render polygons for GMaps
+//# taken from http://friism.com/drawing-geojson-based-polygons-on-google-maps
+function createPolygons(areajson, bounds){
+ var coords = areajson.coordinates;
+ var polygons = _(coords).reduce([], function(memo_n, n) {
+ var polygonpaths = _(n).reduce(new google.maps.MVCArray(), function(memo_o, o) {
+ var polygoncords = _(o).reduce(new google.maps.MVCArray(), function(memo_p, p) {
+ var mylatlng = new google.maps.LatLng(p[1], p[0]);
+ if(bounds){
+ bounds.extend(mylatlng);
+ }
+ memo_p.push(mylatlng);
+ return memo_p;
+ });
+ memo_o.push(polygoncords);
+ return memo_o;
+ });
+ var polygon = new google.maps.Polygon({
+ paths: polygonpaths,
+ strokeColor: "#201a11",
+ strokeOpacity: 0.8,
+ strokeWeight: 2,
+ fillColor: "#201a11",
+ fillOpacity: 0.35
+ });
+ memo_n.push(polygon);
+ return memo_n;
+ });
+ return polygons;
+}
+
+//functions to handle the "more" link
+// utility functions to create/remove camera info container
+function get_exif(obj,id) {
+ //$(obj).parents().eq(2).append('<div id="exif-container">');
+ $(obj).parents().eq(3).append('<div class="more-container" id="'+id+'">'); $(obj).parents().eq(2).children('.meta').clone().appendTo('#'+id).css('visibility', 'visible');
+
+
+
+ //deal with the variable height of div.legend
+ $('#exif-container').css({
+ bottom: function(index, value) {
+ return parseFloat($(obj).parent().parent().css("height"))-14;
+ }
+ });
+}
+function remove_exif(id) {
+ $('#'+id).remove();
+}
+
+
+
+
+$(document).ready(function(){
+//set up click events for map button
+ $('.map-link').click( function() {
+ var more_id = 'more-container-'+$(this).parent().next().children('.more-link').attr('id').split('-')[1];
+ var id = '#map-container-'+this.title.split(',')[3];
+ if ($('#'+more_id).is(":visible")){
+ remove_exif(more_id);
+ }
+ if ($(id).is(":visible")) {
+ remove_map(id);
+ } else {
+ create_map(this);
+ }
+ return false;
+
+ });
+
+ //set up click events for more info button
+ $('.more-link').click( function() {
+ var map_id = '#map-container-'+$(this).parent().prev().children('.map-link').attr('title').split(',')[3];
+ var id = 'more-container-'+this.id.split('-')[1];
+ if ($(map_id).is(":visible")){
+ remove_map(map_id);
+ }
+ if ($('#'+id).is(":visible")) {
+ remove_exif(id);
+ } else {
+ get_exif(this, id);
+ }
+ return false;
+ });
+
+}); \ No newline at end of file
diff --git a/media/sass/_projects.sass b/media/sass/_projects.sass
index 4a6d89e..dc4190d 100644
--- a/media/sass/_projects.sass
+++ b/media/sass/_projects.sass
@@ -1,5 +1,5 @@
div.top
- margin= 36px 0 106px 0
+ margin= 36px 0 36px 0
clear: both
width= !col16
a
@@ -8,36 +8,45 @@ p.col
width= 360px
float= left
margin= 0 !pad*2 0 0
+ font-size: 14px
p.two
margin: 0
margin-left= !col
width: 450px
+div.break
+ border-bottom: #e3e3e3 1px solid
+ width= !col16+!pad*2
+ height: 2px
+ padding-top: 36px
+ clear: both
+ margin: 0
ul.project-tease
- margin-top: 200px
+ margin-top: 65px
li
+sm-sans
font-size: 18px
line-height: 16px
margin-top: 36px
clear= both
- dl
+ .tease
float: left
-
- dd
- font-family: Hoefler Text,Georgia,Times New Roman,Times,serif
- font-size: .9em
- line-height: 23px
+ h4
+ font-size: 24px
+ line-height: 24px
+ margin: 0
+ width= !col7-!pad
+ .lede
+
clear: both
margin: 0
padding-top: 12px
width= !col7-!pad
-
+ p
+ font-family: Hoefler Text,Georgia,Times New Roman,Times,serif
+ font-size: .9em !important
+ line-height: 23px
+
- h4
- font-size: 24px
- line-height: 24px
- margin: 0
- width= !col7-!pad
span.proj
font-size: 64px
@@ -58,7 +67,59 @@ ul.project-tease
margin-bottom= 72px
img
border= !luxagraf_brown 10px solid
+
+.map-container
+ width: 469px
+ height: 392px
+ position: absolute
+ right: 20px
+ bottom: 60px
+ z-index: 2000
+ margin: 0
+ padding: 0
+ background: url('../img/mapbg-dark.png') no-repeat top left
+.more-container
+ width: 405px
+ height: 260px
+ position: absolute
+ right: -30px
+ bottom: 40px
+ z-index: 2000
+ background: url('../img/parkbg.png') no-repeat top left
+
+ dl
+ margin-top: 45px
+ margin-left: 45px
+
+ dt,dd
+ font-size: .9em
+ line-height: 25px
+ margin: 4px 0
+ font-family= Helvetica,Verdana,sans-serif
+
+ dt
+ clear: left
+ float: left
+ width= 65px
+ //border-bottom: 1px solid #999
+ font-weight: bold
+ line-height: 25px
+ font-size: .7em
+ text-transform: uppercase
+
+ dd
+ float: left
+ width= 250px
+ overflow: hidden
+ //border-bottom: 1px solid #999
+ a:hover
+ color= !luxagraf_orange
+.map-wrapper
+ width: 400px
+ height: 328px
+ margin: 37px 0 0 44px
+
ul#parks
margin-top: 36px
li
@@ -90,13 +151,12 @@ ul#parks
+transparent_class_light
position: absolute
bottom: 0
- height: 205px
+ height: 45px
width= !col16+!pad*2
- div.desc
font-size: 10px
line-height: 16px
- width= !col11 +!pad
- float: left
+
+
h5
+sm-headline-sans
@@ -104,62 +164,33 @@ ul#parks
font-size: 18px
margin: 0
padding: 0
+ float: left
p
margin: 6px 0 10px 0
- div
- width= !col7
- float: left
- ul.buttons
- padding-top: 6px
- li
- float: left
- clear: none
- margin: 0px 10px 0 0
- width: auto
- +sm-sans
- font-size: 10px
- a
- padding: 9px 14px 7px 14px
- font-weight: bold
- line-height: 25px
- text-transform: uppercase
- background= #463215
- color: #fff
- -moz-border-radius: 25px
- -webkit-border-radius: 25px
- a:hover
- background= !luxagraf_orange
- dl
- float: left
- margin-left= !pad
- margin-top: 3px
- padding-top: 3px
- border-right: 1px #463215 solid
- padding-right= !pad
- border-left: 1px #463215 solid
- padding-left= !pad
- min-height: 130px
- dt,dd
- font-size: 1.2em
- padding-bottom: 8px
- margin: 0
- font-family= Helvetica,Verdana,sans-serif
- dt
- clear: left
- float: left
- line-height: 16px
- margin: 0
- width= 50px
- //border-bottom: 1px solid #999
-
- dd
+
+ ul.buttons
+ padding-top: 6px
+ float: right
+ margin-right: 20px
+ li
float: left
- width= 125px
- overflow: hidden
- margin: 0 0 0 4px
- //border-bottom: 1px solid #999
+ clear: none
+ margin: 0px 10px 0 0
+ width: auto
+ +sm-sans
+ font-size: 10px
+ a
+ padding: 9px 14px 7px 14px
+ font-weight: bold
+ line-height: 25px
+ text-transform: uppercase
+ background= #463215
+ color: #fff
+ -moz-border-radius: 25px
+ -webkit-border-radius: 25px
a:hover
- color= !luxagraf_orange
+ background= !luxagraf_orange
+
diff --git a/templates/archives/projects.html b/templates/archives/projects.html
index 6ca2e2e..52edbb7 100644
--- a/templates/archives/projects.html
+++ b/templates/archives/projects.html
@@ -3,7 +3,7 @@
{% block pagetitle %}Luxagraf | Projects {% endblock %}
{% block metadescription %}Travel Themes and Experiments {% endblock %}
-{%block bodyid%}id="projects"{%endblock%}
+{%block bodyid%}id="projects-page"{%endblock%}
{% block primary %}
<article>
@@ -11,23 +11,23 @@
<li><a href="/" title="luxagraf homepage">Home</a> &rarr;</li>
<li>Projects</li>
</ul>
- <h1 class="hide">Projects</h1>
- <div class="top"><p class="col">These are a few of the things that I use to inspire myself to do more. The truth is, just about <a href="http://www.youtube.com/watch?v=8r1CZTLk-Gk" title="Louis CK talking about how everything is amazing">everything is amazing</a> when viewed from the proper perspective. </p>
-
- <p class="col two">The projects on luxagraf are more or less goals I've created in effort to get my body in motion, because the difference between the mundane and the amazing is often simply motion. To move is to do, and to do is to live.</p></div>
- {%for project in object_list %}
- <ul class="project-tease">
- <li>
- <dl>
- <dt>
- <a href="{{project.get_absolute_url}}"><h4>{{project.title|safe}}</h4> {{project.subtitle|safe}}</a>
- </dt>
- <dd>{{project.lede|safe}}</dd>
- </dl>
- <div class="img"><img src="{{project.image.url}}" /></div>
- </li>
- </ul>
- {% endfor %}
+ <h1 class="hide">Projects</h1>
+ <div class="top"><p class="col">These are a few of the things that I use to inspire myself to do more. The truth is, just about <a href="http://www.youtube.com/watch?v=8r1CZTLk-Gk" title="Louis CK talking about how everything is amazing">everything is amazing</a> when viewed from the proper perspective. </p>
+
+ <p class="col two">The projects on luxagraf are more or less goals I've created in effort to get my body in motion, because the difference between the mundane and the amazing is often simply motion. To move is to do, and to do is to live.</p></div>
+ <div class="break"></div>
+ {%for project in object_list %}
+ <ul class="project-tease">
+ <li>
+ <div class="tease">
+ <h4><a href="{{project.get_absolute_url}}">{{project.title|safe}}{{project.subtitle|safe}}</a></h4>
+
+ <div class="lede">{{project.lede|smartypants|safe}}</div>
+ </div>
+ <div class="img"><img src="{{project.image.url}}" /></div>
+ </li>
+ </ul>
+ {% endfor %}
</article>
{% endblock %}
diff --git a/templates/base.html b/templates/base.html
index bbe8b1c..7e5d5fd 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -90,7 +90,7 @@
<li><a href="http://feeds2.feedburner.com/luxagraf/blog" title="RSS feed">RSS</a></li>
<li><a href="http://twitter.com/luxagraf" rel="me" title="follow luxagraf on Twitter">Twitter</a></li>
<li><a href="http://www.flickr.com/photos/luxagraf" rel="me" title="luxagraf on Flickr">Flickr</a></li>
- <li><a href="/contact/" tile="contact luxagraf">Contact</a></li>
+ <li><a href="/contact/" title="contact luxagraf">Contact</a></li>
</ul>
</nav>
</footer>
diff --git a/templates/details/national-parks.html b/templates/details/national-parks.html
index 35b8efa..a71e078 100644
--- a/templates/details/national-parks.html
+++ b/templates/details/national-parks.html
@@ -3,9 +3,15 @@
{% block pagetitle %}Luxagraf | Projects | National Parks {% endblock %}
{% block metadescription %}{% endblock %}
-{% block extrahead %}<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
-
+{% block extrahead %}
+<script type="text/javascript" src="/media/js/jquery.js"></script>
<script src="http://documentcloud.github.com/underscore/underscore-min.js" type="text/javascript"></script>
+<script src="/media/js/natparks.js" type="text/javascript"></script>
+<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
+
+
+
+
<link rel="stylesheet"
href="http://127.0.0.1:8000/media/css/dark.css"
@@ -15,9 +21,9 @@
{% endblock %}
-{%block bodyid%}id="projects"{%endblock%}
+{%block bodyid%}id="projects-detail"{%endblock%}
-{% block bodyevents %}onload="initialize()"{% endblock %}
+{% block bodyevents %}{% endblock %}
{% block primary %}
<article>
@@ -29,34 +35,35 @@
<ul id="parks">
{% for object in object_list %}
- <li>
+ <li id="park-{{forloop.counter}}">
<div class="figure">
<img src="{{object.image.url}}" alt="{{object.title}}" />
</div>
<h4>{{object.unit_name}} {{object.type}}</h4>
<div class="legend">
- <div class="desc">
<h5>{{object.tag_line}}</h5>
- <div>{{object.dek|safe}}
+
<ul class="buttons">
<li><a href="{{object.post.get_absolute_url}}" title="{{object.post.title}}">Read Journal</a></li>
{%if object.gallery%}<li><a href="{{object.gallery.get_absolute_url}}" title="Photos of {{object.unit_name}}">View Photos</a></li>{%endif%}
+ <li><a href="#" class="map-link" title="{{object.mpoly.centroid.y}},{{object.mpoly.centroid.x}},{{object.zoom}},{{object.id}}">Map</a></li>
+ <li><a href="#" id="more-{{forloop.counter}}"class="more-link" title="More about {{object.unit_name}}">More</a></li>
</ul>
- </div>
- <dl>
+
+ <dl class="meta" style="visibility: hidden;">
<dt>Visited:</dt>
<dd>{{object.date_visited_begin|date:"m/d/y"}} - {{object.date_visited_end|date:"m/d/y"}}</dd>
<dt>State:</dt>
<dd>{{object.state}}</dd>
+ <dt>Size:</dt>
+ <dd>{{object.size}} sq miles</dd>
<dt>Cost:</dt>
- <dd>${{object.fee}} / ${{object.camping_fee}} (camping)</dd>
+ <dd>${{object.fee}} / ${{object.camping_fee}} (entry/camping)</dd>
<dt>Link:</dt>
<dd>{{object.url|urlize}}</dd>
</dl>
- </div>
- <div class="map" id="map-canvas-{{forloop.counter}}">
- </div>
+
</div>
</li>
@@ -67,58 +74,4 @@
{% endblock %}
-{% block js %}
-<script type="text/javascript">
-function createPolygons(areajson, bounds){
- var coords = areajson.coordinates;
- var polygons = _(coords).reduce([], function(memo_n, n) {
- var polygonpaths = _(n).reduce(new google.maps.MVCArray(), function(memo_o, o) {
- var polygoncords = _(o).reduce(new google.maps.MVCArray(), function(memo_p, p) {
- var mylatlng = new google.maps.LatLng(p[1], p[0]);
- if(bounds){
- bounds.extend(mylatlng);
- }
- memo_p.push(mylatlng);
- return memo_p;
- });
- memo_o.push(polygoncords);
- return memo_o;
- });
- var polygon = new google.maps.Polygon({
- paths: polygonpaths,
- strokeColor: "#201a11",
- strokeOpacity: 0.8,
- strokeWeight: 2,
- fillColor: "#201a11",
- fillOpacity: 0.35
- });
- memo_n.push(polygon);
- return memo_n;
- });
- return polygons;
-}
-function initialize() {
- {% for object in object_list %}
- var latlng = new google.maps.LatLng({{object.mpoly.centroid.y}},{{object.mpoly.centroid.x}});
- var myOptions = {
- zoom: {{object.zoom}},
- center: latlng,
- disableDefaultUI: true,
- navigationControl: true,
- navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
-
- mapTypeId: google.maps.MapTypeId.TERRAIN
-
- };
- var map = new google.maps.Map(document.getElementById("map-canvas-{{forloop.counter}}"), myOptions);
- var poly = createPolygons({{object.mpoly.geojson|safe}});
- for (i=0;i<=poly.length-1;i++) {
- poly[i].setMap(map);
-
- }
- {% endfor %}
- }
-
-</script>
-{%endblock%}
diff --git a/templates/details/photo_galleries.html b/templates/details/photo_galleries.html
index bd4c185..8c1e097 100644
--- a/templates/details/photo_galleries.html
+++ b/templates/details/photo_galleries.html
@@ -62,7 +62,7 @@
{%for photo in object.photos.all reversed %}
<li class="bigimg" id="{{photo.get_local_slideshow_url}}" style="height: {{photo.slideshowimage_height}}px; width:{{photo.slideshowimage_width}}px; margin-top:{{photo.slideshowimage_margintop}}px; margin-left:{{photo.slideshowimage_marginleft}}px;">
<div class="figure">
- <img src="{{photo.get_local_slideshow_url}}" alt="{{photo.title}}" title="{{photo.title}}" class="imgs" height="{{photo.slideshowimage_height}}px" width="{{photo.slideshowimage_width}}px" />
+ <img src="{{photo.get_local_slideshow_url}}" alt="{{photo.title}}" title="{{photo.title}}" class="imgs" height="{{photo.slideshowimage_height}}" width="{{photo.slideshowimage_width}}" />
</div>
<div class="legend">
<div class="caption">