Commits

Steve Losh committed 9ea5419

First open source version of the site.

Comments (0)

Files changed (79)

+syntax: glob
+*.pyc
+.DS_Store
+*.log
+*.tmproj
+
+fabfile.py
+*.db
+
+site-media/storage/*
+
+syntax: regexp
+# This is ugly but it works.
+deploy-[^t][^e][^m][^p].*
+deploy\.py
+

__init__.py

Empty file added.

blog/__init__.py

Empty file added.
+from lindyjam.blog.models import Entry, Comment
+from django.contrib import admin
+
+BLOG_INSTRUCTIONS = r'''<p>Make sure you choose yourself for the author!</p>
+<p>You can use <a href="http://daringfireball.net/projects/markdown/syntax">Markdown</a> when writing your entry, but <strong>not</strong> HTML.  That means you can do things like this:</p> 
+
+<p>*<em>italics</em>*<br/>
+**<strong>bold</strong>**<br/>
+[<a href="">link text</a>](http://lindyjam.com/)<br/>
+&lt;<a href="mailto:">email@example.com</a>&gt;</p>
+<p>Header<br/>
+----------------</p>
+'''
+
+class EntryAdmin(admin.ModelAdmin):
+    fieldsets = [
+        ('Entry', { 'fields': ['title', 'author', 'body'], 
+                    'description': BLOG_INSTRUCTIONS }),
+        ('Publishing', { 'fields': ['pub_date', 'published'],
+                         'description': "The entry won't be shown on the site unless the Published box is checked." }),
+        ('Advanced', { 'fields': ['slug',],
+                       'classes': ['collapse'],
+                       'description': "Please don't change this section unless you know what you're doing." } ),
+    ]
+    list_display = ('title', 'pub_date', 'author')
+    search_fields = ('title', 'slug', 'body')
+    list_filter = ('pub_date', 'author')
+    date_hierarchy = 'pub_date'
+    ordering = ('-pub_date',)
+    prepopulated_fields = { 'slug': ('title',) }
+
+class CommentAdmin(admin.ModelAdmin):
+    fields = ('name', 'body', 'submitted', 'entry')
+    list_display = ('entry', 'name', 'submitted', 'body')
+    search_fields = ('name', 'body')
+    list_filter = ('name', 'entry')
+    date_hierarchy = 'submitted'
+    ordering = ('-submitted',)
+
+
+admin.site.register(Entry, EntryAdmin)
+admin.site.register(Comment, CommentAdmin)
+from django.contrib.syndication.feeds import Feed
+from lindyjam.blog.models import Entry, Comment
+
+MAX = 10
+
+class LatestBlogEntries(Feed):
+    title = "Lindy Jam blog entries"
+    link = "/blog/"
+    description = "The newest blog entries from lindyjam.com"
+    
+    def items(self):
+        published_entries = Entry.objects.filter(published=True)
+        return published_entries.order_by('-pub_date')[:MAX]
+    
+    def item_pubdate(self, item):
+        return item.pub_date
+
+class LatestBlogComments(Feed):
+    title = "Lindy Jam blog comments"
+    link = "/blog/"
+    description = "The newest comments on blog entries at lindyjam.com"
+    
+    def items(self):
+        return Comment.objects.order_by('-submitted')[:MAX]
+    
+    def item_pubdate(self, item):
+        return item.submitted
+from django.db import models
+from django.contrib.auth.models import User
+import datetime
+
+class Entry(models.Model):
+    title = models.CharField(max_length=200)
+    slug = models.SlugField()
+    pub_date = models.DateTimeField('Date Published', default=datetime.datetime.now)
+    body = models.TextField()
+    author = models.ForeignKey(User)
+    published = models.BooleanField(default=False)
+    
+    def get_absolute_url(self):
+        return "/blog/entry/%i/%i/%i/%s/" % (self.pub_date.year, 
+            self.pub_date.month, self.pub_date.day, self.slug)
+    
+    def __unicode__(self):
+        return u'%s' % (self.title,)
+
+class Comment(models.Model):
+    name = models.CharField('Commenter', blank=False, null=False,
+                            max_length=40)
+    body = models.TextField('Comment', blank=False, null=False)
+    submitted = models.DateTimeField(default=datetime.datetime.now)
+    entry = models.ForeignKey(Entry)
+    
+    def get_absolute_url(self):
+        return self.entry.get_absolute_url() + "#comment-" + str(self.id)
+    
+    def __unicode__(self):
+        return u'%s on %s' % (self.name, self.entry.title)
+
+from lindyjam.blog.models import Entry, Comment
+from django.template import Context, loader
+from django.shortcuts import get_object_or_404, render_to_response
+from django.http import HttpResponse
+from markdown import markdown
+import simplejson as json
+
+ENTRIES_PER_PAGE = 3
+COMMENT_MESSAGE = """<p class="success">Thanks for speaking up!</p>"""
+
+def index(request, page=0):
+    page = int(page)
+    start_index = page * ENTRIES_PER_PAGE
+    end_index = start_index + ENTRIES_PER_PAGE
+    entries = Entry.objects.all().order_by('-pub_date')
+    entries = entries.filter(published=True)[start_index:end_index]
+    return render_to_response('blog/index.html', 
+        { 'entries': entries,
+          'older_page': page+1 if end_index < Entry.objects.count() else None,
+          'newer_page': page-1 if page != 0 else None } )
+
+def entry(request, year, month, day, slug):
+    entry = get_object_or_404(Entry, 
+        pub_date__year=year, pub_date__month=month, pub_date__day=day, 
+        slug=slug)
+    return render_to_response('blog/entry.html', { 'entry': entry, })
+
+def comment(request):
+    errors = []
+    status = 0
+    fields = request.POST
+    
+    if fields['name'] == '':
+        errors.append("You have to give a name!")
+    if fields['body'] == '':
+        errors.append("You have to say something!")
+    
+    if len(errors) > 0:
+        status = -1
+        error_message = '\n'.join(['<p class="error">%s</p>' % (e,) 
+                                   for e in errors])
+        return HttpResponse(json.dumps( { 'status': status,
+                                          'data': error_message }))
+                                          
+    entry = Entry.objects.get(pk=fields['entry_id'])
+    
+    new_comment = Comment(name=fields['name'], 
+                          body=fields['body'],
+                          entry=entry)
+    new_comment.save()
+    
+    t = loader.get_template('blog/single_comment.html')
+    c = Context({ 'comment': new_comment, })
+    
+    return HttpResponse(json.dumps( 
+        { 'status': status,
+          'data': COMMENT_MESSAGE,
+          'new_comment': t.render(c) }))

deploy-template.py

+# Rename this to deploy.py when you've filled in everything.
+
+DATABASE_ENGINE = ''
+DATABASE_NAME = ''
+DATABASE_USER = ''
+DATABASE_PASSWORD = ''
+DATABASE_HOST = ''
+DATABASE_PORT = ''
+
+DEBUG = False
+
+# The longer the better.  Django automatically generates one for you when you 
+# start a new project.
+SECRET_KEY = ''
+
+# Make sure it ends in a trailing slash! 
+BASE_DIR = '/full/path/to/project/directory/'
+
+# This is used for the Mint (http://haveamint.com/) Bird Feeder plugin hack.
+FEEDER_PASSWORD = ''

djschedule/__init__.py

Empty file added.

djschedule/admin.py

+from lindyjam.djschedule.models import Slot
+from django.contrib import admin
+
+class DJSlotAdmin(admin.ModelAdmin):
+    list_display = ('dj_date', 'name', 'approved', 'email', 
+                    'phone', 'carrier', 'submitted')
+    list_filter = ('dj_date', 'approved')
+    date_hierarchy = 'dj_date'
+    ordering = ('-dj_date',)
+    fieldsets = [
+        (None, { 'fields': ['dj_date', 'name'] }),
+        ('Submission Info', { 'fields': ['submitted', 'approved'],
+                       'description': "The filled slot won't show up on the site unless the Approved box is checked." }),
+        ('Notification Info', { 'fields': ['email', 'phone', 'carrier'],
+                       'description': "Information for notifications.",
+                       'classes': ['collapse'] }),
+    ]
+
+admin.site.register(Slot, DJSlotAdmin)

djschedule/models.py

+from django.db import models
+from lindyjam.sms.models import Carrier
+from django.contrib.localflavor.us.models import PhoneNumberField
+
+class Slot(models.Model):
+    dj_date = models.DateField('Date to DJ')
+    submitted = models.DateTimeField('Submitted', blank=True, null=True)
+    name = models.CharField(max_length=50)
+    email = models.EmailField(blank=True, null=True)
+    phone = PhoneNumberField(blank=True, null=True)
+    carrier = models.ForeignKey(Carrier, blank=True, null=True)
+    approved = models.BooleanField(default=False)
+    
+    def __unicode__(self):
+        return u'%s - %s' % (str(self.dj_date), self.name)
+

djschedule/views.py

+from lindyjam.djschedule.models import Slot
+from lindyjam.sms.models import Carrier
+from django.http import HttpResponse
+from django.shortcuts import render_to_response
+import simplejson as json
+import datetime
+
+WEEKS_TO_DISPLAY = 6
+SIGNUP_MESSAGE =  """<p class="success">Thanks for signing up! We got your request and it'll show up here once one of us approves it.</p>"""
+
+def index(request):
+    # All of this is one big ugly hack.  I hate it.
+    today = datetime.date.today()
+    this_wd = today.weekday()
+    days_til_next_wed = 2-this_wd if this_wd <= 2 else 9-this_wd
+    next_wed = today + datetime.timedelta(days=days_til_next_wed)
+    
+    one_week = datetime.timedelta(weeks=1)
+    dates_to_show = [next_wed]
+    for i in range(1, WEEKS_TO_DISPLAY):
+        dates_to_show.append(dates_to_show[-1] + one_week)
+    
+    filled_slots = Slot.objects.filter(dj_date__in=dates_to_show)
+    filled_slots = filled_slots.filter(approved=True)
+    
+    next_slots = []
+    filled_dates = [slot.dj_date for slot in filled_slots]
+    for d in dates_to_show:
+        if d not in filled_dates:
+            next_slots.append((d, None, None))
+        else:
+            for slot in filled_slots:
+                if slot.dj_date == d:
+                    plural = slot.name.lower().find('and') != -1 or \
+                             slot.name.lower().find('&') != -1
+                    next_slots.append((d, slot, plural))
+                    break
+    
+    return render_to_response('djschedule/index.html', 
+        { 'next_slots': next_slots, 
+          'carriers': ['Phone Company'] + [c.name for c 
+                              in Carrier.objects.all().order_by('name') ]} )
+
+def signup(request):
+    errors = []
+    status = 0
+    fields = request.POST
+    
+    if fields['date'] == 'undefined':
+        errors.append("You need to pick a free date from the list!")
+    if fields['name'] == '':
+        errors.append("You need to give us your name, or we won't know who's signing up!")
+    if len(errors) > 0:
+        status = -1
+        error_message = '\n'.join(['<p class="error">%s</p>' % (e,) 
+                                   for e in errors])
+        return HttpResponse(json.dumps( { 'status': status,
+                                          'data': error_message }))
+    
+    carrier = None
+    
+    if fields['carrier'] != 'Phone Company':
+        carrier = Carrier.objects.get(name=fields['carrier'])
+    
+    new_signup = Slot(
+        dj_date=datetime.date(*[int(s) for s in fields['date'].split('-')]), 
+        name=fields['name'], email=fields['email'],
+        submitted=datetime.datetime.now(),
+        phone=fields['phone'],
+        carrier=carrier )
+    new_signup.save()
+    
+    return HttpResponse(json.dumps( { 'status': status,
+                                      'data': SIGNUP_MESSAGE }))

links/__init__.py

Empty file added.
+from lindyjam.links.models import Link
+from django.contrib import admin
+
+class LinkAdmin(admin.ModelAdmin):
+    list_display = ('title', 'url', 'description', 'approved',)
+    list_filter = ('approved',)
+    ordering = ('title', )
+    fieldsets = [
+        (None, { 'fields': ['title', 'description', 'url', 'approved'],
+                 'description': "The link won't appear on the site until the Approved box is checked." }),
+    ]
+
+admin.site.register(Link, LinkAdmin)
+from django.contrib.syndication.feeds import Feed
+from lindyjam.links.models import Link
+
+MAX = 10
+
+class LatestLinks(Feed):
+    title = "Lindy Jam links"
+    link = "/links/"
+    description = "The newest links from lindyjam.com"
+    
+    def items(self):
+        links = Link.objects.filter(approved=True)
+        return links.order_by('submitted')[:MAX]
+    
+    def item_pubdate(self, item):
+        return item.submitted
+from django.db import models
+import datetime
+
+class Link(models.Model):
+    url = models.URLField(blank=False, verify_exists=True)
+    title = models.CharField(blank=False, max_length=80)
+    description = models.CharField(blank=False, max_length=160)
+    submitted = models.DateTimeField(default=datetime.datetime.now)
+    approved = models.BooleanField(default=False)
+    
+    def get_absolute_url(self):
+        return self.url
+    
+    def __unicode__(self):
+        return u'%s' % (str(self.title),)
+
+from lindyjam.links.models import Link
+from django.http import HttpResponse
+from django.shortcuts import render_to_response
+import simplejson as json
+
+SUBMIT_MESSAGE = """<p class="success">Thanks for the link!  We'll check it out and if we approve it will show up here.</p>"""
+
+def index(request):
+    link_list = Link.objects.all().order_by('title')
+    link_list = link_list.filter(approved=True)
+    return render_to_response('links/index.html', 
+                              { 'link_list': link_list } )
+
+def submit(request):
+    errors = []
+    status = 0
+    fields = request.POST
+    
+    if fields['title'] == '':
+        errors.append("You need to give the link a title so people know what it is!")
+    if fields['description'] == '':
+        errors.append("You need to fill out a description!")
+    if fields['url'] == '':
+        errors.append("You need to put in a link!  That's the whole point!")
+        
+    if len(errors) > 0:
+        status = -1
+        error_message = '\n'.join(['<p class="error">%s</p>' % (e,) 
+                                   for e in errors])
+        return HttpResponse(json.dumps( { 'status': status,
+                                          'data': error_message }))
+    
+    new_link = Link(title=fields['title'], url=fields['url'],
+                    description=fields['description'], approved=False)
+    new_link.save()
+    
+    return HttpResponse(json.dumps( { 'status': status,
+                                      'data': SUBMIT_MESSAGE }))
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)

playlists/__init__.py

Empty file added.

playlists/admin.py

+from lindyjam.playlists.models import Playlist, Song, PlaylistTrack
+from django.contrib import admin
+
+class TrackInline(admin.TabularInline):
+    model = PlaylistTrack
+    extra = 5
+
+
+class SongAdmin(admin.ModelAdmin):
+    list_display = ('title', 'artist', 'album', 'bpm',)
+    list_filter = ('artist',)
+    ordering = ('artist', )
+    fields = ('title', 'artist', 'album', 'bpm',)
+
+
+class PlaylistAdmin(admin.ModelAdmin):
+    list_display = ('date', 'name', 'where',)
+    list_filter = ('name', 'where')
+    ordering = ('-date', )
+    fieldsets = [
+        ('Playlist', { 'fields': ('date', 'name', 'where'), }),
+    ]
+    inlines = [TrackInline,]
+
+
+class TrackAdmin(admin.ModelAdmin):
+    list_display = ('date', 'DJ', 'where', 'number', 'song')
+    
+    def DJ(self, pl):
+        return pl.playlist.name
+    
+    def date(self, pl):
+        return pl.playlist.date
+    
+    def where(self, pl):
+        return pl.playlist.where
+    
+
+admin.site.register(Song, SongAdmin)
+admin.site.register(Playlist, PlaylistAdmin)
+admin.site.register(PlaylistTrack, TrackAdmin)

playlists/importer.py

+#!/usr/bin/env python
+
+from plistlib import readPlistFromString
+from lindyjam.playlists.models import Song, Playlist, PlaylistTrack
+import sys
+
+def import_itunes_playlist(playlist_file_contents, name, date, where):
+    """Import an iTunes whose content is the string passed into the 
+       function."""
+    
+    itunes_playlist = readPlistFromString(playlist_file_contents)
+    itunes_tracklist = [ track['Track ID'] for track in
+                         itunes_playlist['Playlists'][0]['Playlist Items'] ]
+    itunes_songs = itunes_playlist['Tracks']
+    
+    django_songs = {}
+    for song_id, itunes_song in itunes_songs.items():
+        itunes_song['Name'] = itunes_song.get('Name', '').strip()
+        itunes_song['Artist'] = itunes_song.get('Artist', '').strip()
+        itunes_song['Album'] = itunes_song.get('Album', '').strip()
+        itunes_song['BPM'] = itunes_song.get('BPM', None)
+        
+        try:
+            django_songs[song_id] = \
+                Song.objects.get(title__iexact=itunes_song['Name'],
+                                  artist__iexact=itunes_song['Artist'],
+                                  album__iexact=itunes_song['Album'])
+            if django_songs[song_id].bpm == None:
+                django_songs[song_id].bpm = itunes_song['BPM']
+        except Song.DoesNotExist:
+            django_songs[song_id] = Song(title=itunes_song['Name'],     
+                                         artist=itunes_song['Artist'],
+                                         album=itunes_song['Album'],
+                                         bpm=itunes_song['BPM'])
+        finally:
+            django_songs[song_id].save()
+    
+    django_playlist = Playlist(name=name, date=date, where=where)
+    django_playlist.save()
+    
+    for track_number, itunes_song_id in enumerate(itunes_tracklist):
+        django_track = PlaylistTrack(number=track_number+1, 
+                                     playlist=django_playlist,
+                                     song=django_songs[str(itunes_song_id)])
+        django_track.save()
+    

playlists/models.py

+from django.db import models
+import datetime
+
+
+class Song(models.Model):
+    title = models.CharField(blank=False, null=False, max_length=100)
+    artist = models.CharField(blank=False, null=False, max_length=100)
+    album = models.CharField(blank=True, null=False, max_length=100)
+    bpm = models.IntegerField(blank=True, null=True)
+    
+    def __unicode__(self):
+        return u"%s by %s on %s" % (self.title, self.artist, self.album)
+
+    
+class Playlist(models.Model):
+    date = models.DateField(blank=False, null=False,)
+    name = models.CharField(blank=False, null=False, max_length=50)
+    where = models.CharField(blank=False, null=False, max_length=80)
+    
+    def __unicode__(self):
+        return u"%s on %s" % (self.name, self.date)
+    
+
+class PlaylistTrack(models.Model):
+    number = models.IntegerField(blank=False, null=False)
+    song = models.ForeignKey(Song)
+    playlist = models.ForeignKey(Playlist)
+    
+    def __unicode__(self):
+        return u"%s. %s" % (self.number, self.song,)
+    

playlists/views.py

+from lindyjam.playlists.models import Playlist
+from django.shortcuts import get_list_or_404, render_to_response
+
+RECENT_PLAYLISTS = 30
+
+def index(request):
+    playlists_to_show = Playlist.objects.order_by('-date')[:RECENT_PLAYLISTS]
+    playlists = [(p, p.name.endswith('s')) for p in playlists_to_show]
+    return render_to_response('playlists/index.html', 
+        { 'playlists': playlists, } )
+
+def single_playlist(request, year, month, day, name):
+    playlist = get_list_or_404(Playlist, date__year=year, date__month=month, date__day=day, name=name)[0]
+    return render_to_response('playlists/single_playlist.html', 
+        { 'playlist': playlist, } )

quotes/__init__.py

Empty file added.
+from lindyjam.quotes.models import Quote
+from django.contrib import admin
+
+class QuoteAdmin(admin.ModelAdmin):
+    list_display = ('body', 'approved', 'submitted', )
+    list_filter = ('approved', )
+    ordering = ('-submitted', )
+    fields = ('body', 'approved', 'submitted', )
+
+admin.site.register(Quote, QuoteAdmin)
+from django.db import models
+import datetime
+
+class Quote(models.Model):
+    body = models.CharField(blank=False, max_length=160)
+    submitted = models.DateTimeField(default=datetime.datetime.now)
+    approved = models.BooleanField(default=False)
+    
+    def __unicode__(self):
+        return u'%s' % (str(self.body),)
+

quotes/templatetags/__init__.py

Empty file added.

quotes/templatetags/random_quote.py

+from django.template import Library, Node
+from lindyjam.quotes.models import Quote
+     
+register = Library()
+     
+class RandomQuoteNode(Node):
+    def render(self, context):
+        context['random_quote'] = \
+            Quote.objects.filter(approved=True).order_by('?')[0].body
+        return ''
+
+def get_random_quote(parser, token):
+    return RandomQuoteNode()
+
+register.tag('random_quote', get_random_quote)
+from lindyjam.quotes.models import Quote
+from django.http import HttpResponse
+from django.shortcuts import render_to_response
+import simplejson as json
+
+SUBMIT_MESSAGE = """<p class="success">Thanks for the quote!  We'll check it out and if we approve it you might see it up at the top.</p>"""
+
+def index(request):
+    return render_to_response('quotes/index.html', {})
+
+def submit(request):
+    errors = []
+    status = 0
+    fields = request.POST
+    
+    if fields['body'] == '':
+        errors.append("They must have said <em>something</em>!")
+        
+    if len(errors) > 0:
+        status = -1
+        error_message = '\n'.join(['<p class="error">%s</p>' % (e,) 
+                                   for e in errors])
+        return HttpResponse(json.dumps( { 'status': status,
+                                          'data': error_message }))
+    
+    new_quote = Quote(body=fields['body'], approved=False)
+    new_quote.save()
+    
+    return HttpResponse(json.dumps( { 'status': status,
+                                      'data': SUBMIT_MESSAGE }))
+import deploy
+
+DEBUG = deploy.DEBUG
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    ('Steve Losh', 'steve@stevelosh.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = deploy.DATABASE_ENGINE
+DATABASE_NAME = deploy.DATABASE_NAME
+DATABASE_USER = deploy.DATABASE_USER
+DATABASE_PASSWORD = deploy.DATABASE_PASSWORD
+DATABASE_HOST = deploy.DATABASE_HOST
+DATABASE_PORT = deploy.DATABASE_PORT
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'America/New_York'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = False
+
+# Base directory.
+BASE_DIR = deploy.BASE_DIR
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = BASE_DIR + 'site-media/'
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = '/site-media/'
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = deploy.SECRET_KEY
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+)
+
+ROOT_URLCONF = 'lindyjam.urls'
+
+TEMPLATE_DIRS = (
+    BASE_DIR + 'templates/',
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.admin',
+    'django.contrib.markup',
+    'django.contrib.flatpages',
+    'lindyjam.blog',
+    'lindyjam.djschedule',
+    'lindyjam.links',
+    'lindyjam.sms',
+    'lindyjam.splash',
+    'lindyjam.quotes',
+    'lindyjam.playlists',
+)

site-media/images/stripe.gif

Added
New image

site-media/scripts/blog_entry.js

+/**
+ * This javascript file handles the AJAX commenting functionality.
+ */
+
+function show_blog_message(message_text) {
+    $("#blog_message").fadeOut(fade_out_time, function(){
+       $("#blog_message").css("background-color", message_box_color);
+       $("#blog_message").html(message_text);
+       $("#blog_message").fadeIn(fade_in_time).fadeTo(message_display_time, 1).fadeOut(fade_out_time);
+   });
+}
+
+function show_blog_error(error_text) {
+    $("#blog_message").fadeOut(fade_out_time, function(){
+       $("#blog_message").css("background-color", error_box_color);
+       $("#blog_message").html(error_text);
+       $("#blog_message").fadeIn(fade_in_time);
+   });
+}
+
+$(document).ready(function() {
+    $("#blog_new_comment_form").submit(function() {
+        $.post("/blog/comment/", 
+               { entry_id: $("#blog_entry_id").val(), 
+                 name: $("#blog_comment_name").val(), 
+                 body: $("#blog_comment_body").val(), 
+               },
+               function(response) {
+                   if (response.status == 0) {
+                       show_blog_message(response.data);
+                       $(".with-instructions").attr("value", function() {
+                            $(this).css("color", instruction_color);
+                            return $(this).attr("title");
+                       });
+                       $("#blog_existing_comments").append(
+                                                        response.new_comment)
+                       $(".blog_comment:last").css("display", "none");
+                       $(".blog_comment:last").fadeIn(1500);
+                   } else {
+                       show_blog_error(response.data);
+                       $(".with-instructions").attr("value", function() {
+                            if ($(this).val() == '') {
+                                $(this).css("color", instruction_color);
+                                return $(this).attr("title");
+                            }
+                       });
+                   }
+        }, "json");
+        
+        return false;
+    });
+});

site-media/scripts/djschedule.js

+/**
+ * This javascript file handles the AJAX signup functionality.
+ */
+
+$(document).ready(function() {
+    $("#djschedule_signup_form").submit(function() {
+        $.post("/schedule/signup/", 
+               { date: $(".djschedule_slot:checked").val(), 
+                 name: $("#djschedule_name").val(),
+                 email: $("#djschedule_email").val(),
+                 phone: $("#djschedule_phone").val(),
+                 carrier: $(".djschedule_carrier_option:selected").val()
+               },
+               function(response) {
+                   if (response.status == 0) {
+                       show_message(response.data);
+                       $("input.with-instructions").attr("value", function() {
+                            $(this).css("color", instruction_color);
+                            return $(this).attr("title");
+                       });
+                       $(".djschedule_slot:checked").attr("checked", false);
+                   } else {
+                       show_error(response.data);
+                       $("input.with-instructions").attr("value", function() {
+                            if ($(this).val() == '') {
+                                $(this).css("color", instruction_color);
+                                return $(this).attr("title");
+                            }
+                       });
+                   }
+        }, "json");
+        
+        return false;
+    });
+});

site-media/scripts/jquery.js

+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();

site-media/scripts/links.js

+/**
+ * This javascript file handles the AJAX link submit functionality.
+ */
+
+$(document).ready(function() {
+    $("#links_submit_form").submit(function() {
+        $.post("/links/submit/", 
+               { title: $("#links_title").val(), 
+                 description: $("#links_description").val(),
+                 url: $("#links_url").val()
+               },
+               function(response) {
+                   if (response.status == 0) {
+                       show_message(response.data);
+                       $("input.with-instructions").attr("value", function() {
+                            $(this).css("color", instruction_color);
+                            return $(this).attr("title");
+                       });
+                   } else {
+                       show_error(response.data);
+                       $("input.with-instructions").attr("value", function() {
+                            if ($(this).val() == '') {
+                                $(this).css("color", instruction_color);
+                                return $(this).attr("title");
+                            }
+                       });
+                   }
+        }, "json");
+        
+        return false;
+    });
+});

site-media/scripts/ljscript.js

+var input_color = '#222';
+var instruction_color = '#999';
+
+var error_box_color = '#fb0';
+var message_box_color = '#F0E2FF';
+
+var fade_out_time = 500;
+var fade_in_time = 1500;
+var message_display_time = 5000;
+
+$(document).ready(function() {
+    // Input Instruction Handling
+    $(".with-instructions").css("color", instruction_color);
+    $(".with-instructions").attr("value", function() {
+        return $(this).attr("title");
+    });
+    
+    $(".with-instructions").focus(function() {
+        if (this.value == $(this).attr("title")) {
+            this.value = '';
+            this.style.color = input_color;
+        }
+        $(this).blur(function() {
+            if (this.value == '') {
+                this.style.color = instruction_color;
+                this.value = $(this).attr("title");
+            }
+        });
+    });
+    
+    $("form").submit(function() {
+        $(".with-instructions").attr("value", function() {
+            if (this.value == $(this).attr("title")) {
+                return '';
+            }
+        });
+        return false;
+    });
+});
+
+function show_message(message_text) {
+    $("#message").fadeOut(fade_out_time, function(){
+       $("#message").css("background-color", message_box_color);
+       $("#message").html(message_text);
+       $("#message").fadeIn(fade_in_time).fadeTo(message_display_time, 1).fadeOut(fade_out_time);
+   });
+}
+
+function show_error(error_text) {
+    $("#message").fadeOut(fade_out_time, function(){
+       $("#message").css("background-color", error_box_color);
+       $("#message").html(error_text);
+       $("#message").fadeIn(fade_in_time);
+   });
+}

site-media/scripts/playlists.js

Empty file added.

site-media/scripts/quotes.js

+/**
+ * This javascript file handles the AJAX quote submit functionality.
+ */
+
+$(document).ready(function() {
+    $("#quotes_submit_form").submit(function() {
+        $.post("/quotes/submit/", 
+               { body: $("#quotes_body").val() },
+               function(response) {
+                   if (response.status == 0) {
+                       show_message(response.data);
+                       $(".with-instructions").attr("value", function() {
+                            $(this).css("color", instruction_color);
+                            return $(this).attr("title");
+                       });
+                   } else {
+                       show_error(response.data);
+                       $(".with-instructions").attr("value", function() {
+                            if ($(this).val() == '') {
+                                $(this).css("color", instruction_color);
+                                return $(this).attr("title");
+                            }
+                       });
+                   }
+        }, "json");
+        
+        return false;
+    });
+});

site-media/styles/adminstyle.css

+div#header {
+    background: transparent url(/site-media/images/stripe.gif) repeat scroll 0 0;
+    color: #f5f5f5;
+}
+
+div#user-tools {
+    color: inherit;
+}
+
+h1#site-name {
+    color: inherit;
+}
+
+div#header a:link, div#header a:visited {
+    color: #fa0;
+    text-decoration: none;
+}
+

site-media/styles/blogstyle.css

+h1.blog_title {
+    font-size: 1.5em;
+    margin-bottom: 0.2em;
+}
+
+h2#blog_comments_header {
+    margin-bottom: -0.5em;
+}
+
+h2#blog_new_comment_header {
+    margin-top: 2em;
+}
+
+a.blog_title_link {
+    color: #222;
+}
+
+div.blog_byline {
+    margin: 0em;
+    font-size: 0.9em;
+    font-style: italic;
+}
+
+div.blog_body {
+    margin-top: 1em;
+}
+
+div.blog_paging_nav {
+    margin-top: 1em;
+    display: block;
+}
+
+a.blog_newer {
+    float: right;
+}
+
+a.blog_older {
+    float: left;
+}
+
+div.blog_footer {
+    margin-bottom: 2.5em;
+    font-size: 0.8em;
+}
+
+div.blog_footer a.blog_permalink {
+    float: right;
+}
+div.blog_footer a.blog_commentlink {
+}
+
+hr.blog_footer_hr {
+    height: 1px;
+    margin-top: 0em;
+    background-color: black;
+    border: none;
+}
+
+
+
+div.blog_comment {
+    margin-top: 2.5em;
+}
+
+div.blog_comment_header {
+    font-size: 1.2em;
+}
+
+span.blog_comment_commenter {
+    font-weight: bold;
+}
+
+div.blog_comment_body {
+    border: 1px solid #222;
+    background-color: #F0E2FF;
+    padding: 0.5em;
+    padding-top: 0.2em;
+    padding-bottom: 0.2em;
+    margin-top: 0.5em;
+    margin-bottom: 0.5em;
+}
+
+div.blog_comment_footer {
+    margin: 0em;
+    font-size: 0.9em;
+    font-style: italic;
+}
+
+div#blog_new_comment {
+    display: table;
+    text-align: right;
+    width: 99%;
+}
+
+input#blog_comment_name {
+    width: 99%;
+}
+
+textarea#blog_comment_body {
+    width: 99.3%;
+    height: 10em;
+}
+
+div#blog_body_instructions {
+    margin-right: 2em;
+    text-align: left;
+    font-size: 0.8em;
+}
+
+div#blog_body_instructions a {
+    font-weight: normal;
+}
+
+input#blog_comment_submit {
+    float: right;
+    margin-left: 2em;
+}
+
+div#blog_message {
+    background-color: #ffbb00;
+    display: none;
+    margin-top: 1em;
+    margin-bottom: 1em;
+    border: 1px solid black;
+    padding-left: 1em;
+    padding-right: 1em;
+}

site-media/styles/djschedulestyle.css

+div.djschedule_slot {
+    margin-top: 1em;
+    margin-bottom: 1em;
+    font-size: 1.2em;
+}
+
+div#djschedule_signup {
+    display: table;
+    text-align: right;
+    width: 99%;
+}
+
+input#djschedule_name {
+    float: left;
+    width: 25%;
+}
+
+input#djschedule_email {
+    float: right;
+    width: 70%;
+}
+
+input#djschedule_phone {
+    float: left;
+    width: 70%;
+}
+
+select#djschedule_carrier {
+    float: right;
+    width: 25%;
+}
+
+p#djschedule_pick {
+    margin-top: 0em;
+    margin-bottom: 0.3em;
+}

site-media/styles/linksstyle.css

+div.links_single {
+    margin-top: 1.5em;
+    margin-bottom: 1.5em;
+}
+
+a.links_link {
+    font-size: 1.3em;
+}
+
+span.links_description {
+    margin-left: 1.3em;
+}
+
+
+div#links_submit {
+    display: table;
+    text-align: right;
+    width: 44em;
+}
+
+input#links_title {
+    float: left;
+    width: 32%;
+}
+
+input#links_description {
+    float: right;
+    width: 63%;
+}
+
+input#links_url {
+    width: 99.4%;
+}

site-media/styles/ljstyle.css

+/* @override http://localhost:8000/site-media/styles/ljstyle.css */
+
+body {
+    background: transparent url(/site-media/images/stripe.gif) repeat scroll 0 0;
+    font-size: 62.5%;
+    font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+    color: #222;
+    text-align: center;
+}
+
+div#canvas {
+    width: 60em;
+    margin: auto;
+    text-align: left;
+}
+
+
+
+div#header {
+    position: relative;
+    text-align: right;
+    color: #f5f5f5;
+    height: 6.5em;
+    margin: 0em;
+    padding: 0em;
+}
+
+h1#pagetitle {
+    position: relative;
+    font-size: 6em;
+    float: left;
+    z-index: 2;
+	margin: 0em 0em -0.3em -1.5em;
+}
+
+h2#headerquote {
+    color: #999;
+    font-size: 1.3em;
+    display: inline;
+    margin: 0em;
+    margin-left: 0.5em;
+    line-height: 1.4em;
+    font-weight: normal;
+}
+
+div#quotediv {
+    position: relative;
+    height: 6em;
+    z-index: 1;
+}
+
+div#quotelink {
+    position: absolute;
+    text-align: left;
+    display: inline;
+    width: 10em;
+    right: -11em;
+}
+
+div#quotelink a {
+    font-weight: normal;
+    font-size: 1.3em;
+    line-height: 1.4em;
+}
+
+div#lame-spacer {
+    padding-left: 1em;
+    padding-bottom: 1.3em;
+}
+
+a#title {
+    color: #f5f5f5;
+	font-weight: normal;
+	font-style: inherit;
+}
+
+
+
+div#footer {
+    font-size: 1em;
+    margin-top: 0.3em;
+    color: #f5f5f5;
+    padding: 0em;
+    text-align: center;
+}
+
+div#footer a {
+    color: #fa0;
+    font-weight: normal;
+}
+
+div#copyright {
+    margin-top: 2em;
+    margin-bottom: 2em;
+    color: #999;
+}
+
+
+
+div#outerpane {
+    margin: 0em;
+    padding: 0em;
+    border: 4px solid #aaa;
+}
+
+div#innerpane {
+    border: 1px solid black;
+    margin: 0em;
+    padding: 0em;
+}
+
+
+
+div#navigation {
+    position: relative;
+    padding: 0em;
+    margin: 0em;
+    margin-top: 2em;
+    margin-bottom: -0.1em;
+    text-align: left;
+    z-index: 2;
+}
+
+a.navlink {
+    font-size: 1.6em;
+    margin-right: 1em;
+    color: #dedede;
+    font-weight: normal;
+    font-variant: small-caps;
+}
+
+div#rss {
+    float:right;
+    line-height: 2em;
+}
+
+div#rss a {
+    color: #fa0;
+}
+
+
+
+div#content {
+    width: auto;
+    height: 100%;
+    margin: 0em;
+    background-color: #f5f5f5;
+    padding-left: 1.6em;
+    padding-right: 1.6em;
+    padding-top: 0.5em;
+    padding-bottom: 1.5em;
+    font-size: 1.2em;
+}
+
+div#message {
+    display: none;
+    margin-top: 1em;
+    border: 1px solid black;
+    padding-left: 1em;
+    padding-right: 1em;
+}
+
+p.error {
+    font-weight: bold;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+p.success {
+    font-weight: bold;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+
+
+a {
+    text-decoration: none;
+    color: #e19100;
+    font-weight: bold;
+}
+
+h1 {
+    font-size: 1.5em;
+    margin-bottom: 0.5em;
+    margin-top: 1.5em;
+}
+
+h1:first-child {
+    margin-top: 1em;
+}
+
+div#message + h1 {
+    margin-top: 1em;
+}
+
+h2 {
+    font-size: 1.2em;
+    margin-top: 1.5em;
+    margin-bottom: 0.5em;
+}
+
+p {
+    line-height: 1.4em;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.centered {
+    text-align: center;
+}
+
+div.splash_image {
+    width: 336px;
+    margin-left: auto;
+    margin-right: auto;
+    margin-top: 2em;
+    margin-bottom: 3em;
+}
+
+img.splash_photo {
+    border: 2px solid black;
+}
+
+div.photo_credit {
+    margin: 0em;
+    padding: 0em;
+    text-align: right;
+    font-size: 0.8em;
+    font-style: italic;
+}
+
+div.photo_credit a {
+    font-weight: normal;
+}
+
+
+
+input.input_text {
+    background: white;
+    font-size: 1.2em;
+    color: #222;
+    margin-left: 0em;
+    margin-right: 0em;
+    margin-top: 0.2em;
+    margin-bottom: 0.2em;
+    border: 1px solid black;
+}
+
+select.input_select {
+    margin-top: 0.3em;
+    margin-bottom: 0.2em;
+}
+
+input.input_submit {
+    font-size: 1.4em;
+    width: 6em;
+    margin-top: 0.5em;
+}
+
+textarea.input_text {
+    background: white;
+    font-size: 1.2em;
+    font-family: inherit;
+    color: #222;
+    margin-left: 0em;
+    margin-right: 0em;
+    margin-top: 0.2em;
+    margin-bottom: 0.2em;
+    border: 1px solid black;
+}
+
+
+
+div#lindylist_signup {
+    display: table;
+    text-align: right;
+}
+
+input#lindylist_email {
+    width: 20em;
+}

site-media/styles/playlistsstyle.css

+#playlists_list {
+    margin-bottom: 0em;
+    line-height: 1.5em;
+}
+
+#playlists_playlist_table {
+    width: 100%;
+}
+
+.playlists_playlist_table_entry td {
+    background-color: #e5e5e5;
+    padding: 0.2em;
+    padding-left: 0.4em;
+    padding-right: 0.4em;
+}
+
+.playlists_playlist_table_header td {
+    font-size: 1.2em;
+    font=weight: bold;
+    background-color: inherit;
+}
+
+.playlists_playlist_table_entry {
+    
+}

site-media/styles/quotesstyle.css

+div#quotes_submit {
+    display: table;
+    text-align: right;
+    width: 99%;
+}
+
+input#quotes_body {
+    float: left;
+    width: 99%;
+}

sms/__init__.py

Empty file added.
+from lindyjam.sms.models import Carrier
+from django.contrib import admin
+
+class CarrierAdmin(admin.ModelAdmin):
+    fields = ('name', 'email_postfix')
+    list_display = ('name', 'email_postfix')
+    ordering = ('name',)
+
+admin.site.register(Carrier, CarrierAdmin)
+from django.db import models
+
+class Carrier(models.Model):
+    name = models.CharField(max_length=40)
+    email_postfix = models.CharField(max_length=60)
+    
+    def __unicode__(self):
+        return u'%s' % (self.name,)
+# Create your views here.

splash/__init__.py

Empty file added.
+from lindyjam.splash.models import SplashImage
+from django.contrib import admin
+
+class SplashImageAdmin(admin.ModelAdmin):
+    list_display = ('image', 'photographer',)
+    list_filter = ('photographer',)
+    fields = ('image', 'photographer', 'credit_link',)
+
+admin.site.register(SplashImage, SplashImageAdmin)
+from django.db import models
+from django.contrib.auth.models import User
+from django.conf import settings
+
+class SplashImage(models.Model):
+    photographer = models.ForeignKey(User)
+    credit_link = models.URLField(blank=True, null=True, verify_exists=True)
+    height = models.IntegerField(blank=True, null=True)
+    width = models.IntegerField(blank=True, null=True)
+    image = models.ImageField(upload_to='storage/splash', 
+                              height_field='height', width_field='width')
+    
+    def __unicode__(self):
+        return u'%s by %s' % (self.image, self.photographer.get_full_name())
+
+from lindyjam.splash.models import SplashImage
+from django.shortcuts import render_to_response
+
+def index(request):
+    random_image = SplashImage.objects.filter(width__lte=400).order_by('?')[0]
+    return render_to_response('splash/index.html', 
+                              { 'image': random_image } )
+

standalone/djschedule_remind.py

+#!/usr/local/bin/python2.5
+
+import re, sys, os, datetime
+
+sys.path.append('/home/sjl/webapps/django')
+sys.path.append('/home/sjl/webapps/django/lib/python2.5/')
+os.environ['DJANGO_SETTINGS_MODULE'] = 'lindyjam.settings'
+
+from lindyjam.djschedule.models import Slot
+from lindyjam.sms.models import Carrier
+from send_email import send_reminder
+
+USER = 'reminder'
+PASS = 'mask-1justly'
+FROM = 'reminder@sjl.lindyjam.com'
+SMS_SUBJECT = ''
+EMAIL_SUBJECT = 'Lindy Jam DJ reminder'
+REMINDER = "Don't forget: you've signed up to DJ at Lindy Jam tonight at 8:30 PM!"
+
+digits = re.compile(r'\d+')
+today = datetime.date.today()
+now = datetime.datetime.now()
+
+try:
+    slot_today = Slot.objects.get(dj_date__year=today.year, 
+                                  dj_date__month=today.month,
+                                  dj_date__day=today.day, 
+                                  approved=True)
+except Slot.DoesNotExist:
+    print now, "No one signed up for today.  Not sending any reminders."
+else:
+    print now, "Someone is signed up to DJ. Reminders may be sent."
+    phone = ''.join(digits.findall(slot_today.phone))
+    postfix = slot_today.carrier.email_postfix if slot_today.carrier else None
+    if (len(phone) == 10 and postfix):
+        phone_address = "%s@%s" % (phone, postfix)
+        send_reminder(phone_address, FROM, SMS_SUBJECT, REMINDER, USER, PASS)
+        print now, "Sent %s an SMS reminder." % (phone_address, )
+    
+    email = slot_today.email
+    if (len(email.strip()) > 0 and '@' in email):
+        send_reminder(email, FROM, EMAIL_SUBJECT, REMINDER, USER, PASS)
+        print now, "Sent %s an email reminder." % (email, )
+
+#eof

standalone/handle_quote_email.py

+#!/usr/local/bin/python2.5
+
+import re, sys, os
+from datetime import datetime
+
+sys.path.append('/home/sjl/webapps/django')
+sys.path.append('/home/sjl/webapps/django/lib/python2.5/')
+os.environ['DJANGO_SETTINGS_MODULE'] = 'lindyjam.settings'
+
+from lindyjam.quotes.models import Quote
+from lindyjam import settings
+
+log_filename = settings.BASE_DIR + '/standalone/logs/handle_quote_email.log'
+log_file = open(log_filename, 'a')
+
+log_file.write(str(datetime.now()) + " -> " + 
+               "Got an email at the quote account.  Handling.\n")
+
+email_contents = [line for line in sys.stdin if line.strip != '']
+new_quote = Quote(body=email_contents[-1], approved=False)
+new_quote.save()
+log_file.write(str(datetime.now()) + " -> " + 
+               "Saved a new quote: " + new_quote.body + "\n")
+    
+log_file.write(str(datetime.now()) + " -> " + 
+               "Quote handling finished.\n")
+
+
+log_file.close()

standalone/send_email.py

+import smtplib
+
+def send_reminder(to_addr, from_addr, subject, message, user, password):
+    server = smtplib.SMTP('smtp.webfaction.com') 
+    server.login(user, password) 
+ 
+    msg = "To: %s\r\nFrom: %s\r\nSubject: %s\r\nContent-type: text/plain\r\n\r\n%s\r\n" % (to_addr, from_addr, subject, message, ) 
+ 
+    server.sendmail(from_addr, to_addr, msg) 
+    server.quit()

templates/admin/base_site.html

+{% extends "admin/base.html" %}
+{% load i18n %}
+
+{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}
+
+{% block extrastyle %}
+<link rel="stylesheet" type="text/css" href="/site-media/styles/adminstyle.css"/>
+{% endblock %}
+
+{% block branding %}
+<h1 id="site-name"><a href="/">Lindy Jam</a> Administration</h1>
+{% endblock %}
+
+{% block nav-global %}{% endblock %}

templates/base.html

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+	
+	<link rel="stylesheet" href="/site-media/styles/ljstyle.css" 
+		  type="text/css"/>
+	{% block style %}{% endblock %}
+	
+	<script type="text/javascript" 
+			src="/site-media/scripts/jquery.js"></script>
+	<script type="text/javascript"
+	 		src="/site-media/scripts/ljscript.js"></script>
+	{% block scripts %}{% endblock %}
+	
+	<title>Lindy Jam - {% block title %}Home{% endblock %}</title>
+</head>
+
+<body>
+	<div id="canvas">
+		<div id="header">
+			<h1 id="pagetitle"><a id="title" href="/">Lindy Jam</a></h1>
+			<div id="lame-spacer">&nbsp;</div>
+			<div id="quotediv">
+				<h2 id="headerquote">
+					{% load random_quote %}{% random_quote %} {{ random_quote }}
+				</h2>
+				<div id="quotelink">
+					<a href="/quotes/">&laquo; Add a quote!</a>
+				</div>
+			</div>
+			
+		</div>
+
+		<div id="navigation">
+			<div id="rss"><a href="/rss/">RSS</a></div>
+			<a href="/" class="navlink">Home</a>
+			<a href="/blog/" class="navlink">Blog</a>
+			<a href="/schedule/" class="navlink">DJ Schedule</a>
+			<a href="/links/" class="navlink">Links</a>
+			<a href="/about/" class="navlink">About</a>
+		</div>
+
+
+		<div id="outerpane"><div id="innerpane">
+			<div id="content">
+				<div id="message"></div>
+				{% block content %}
+				borkborkbork
+				{% endblock %}
+			</div>
+		</div></div>
+
+		<div id="footer">
+			Site by <a href="http://stevelosh.com">Steve</a>.
+			Built with <a href="http://djangoproject.com">Django</a>.
+			Powered by <a href="http://python.org">Python</a>.
+			Deployed with <a href="http://www.nongnu.org/fab/">Fabric</a>.
+			Magic by <a href="http://jquery.com/">jQuery</a>.
+			It's all <a href="http://validator.w3.org/check/referer">valid</a>.<br/>
+		</div>
+	</div>
+	<div id="copyright">Copyright 2008.</div>
+</body>
+</html>

templates/blog/entry.html

+{% extends "base.html" %}
+
+{% block title %}Blog - {{ entry.title }}{% endblock %}
+
+{% block style %}
+	<link rel="stylesheet" type="text/css" href="/site-media/styles/blogstyle.css"/>
+{% endblock %}
+
+{% block scripts %}
+	<script type="text/javascript"
+	 		src="/site-media/scripts/blog_entry.js"></script>
+{% endblock %}
+
+{% block content %}
+	{% url lindyjam.blog.views.entry entry.pub_date.year, entry.pub_date.month, entry.pub_date.day, entry.slug as permalink %}
+	{% include "blog/single_entry.html" %}
+	<a name="comments"></a>
+	<h2 id="blog_comments_header">Comments</h2>
+	{% include "blog/entry_comments.html" %}
+	<h2 id="blog_new_comment_header">Say Something</h2>
+	<div id="blog_message"></div>
+	<form id="blog_new_comment_form" action="">
+		<div id="blog_new_comment">
+			<input type="hidden" name="entry_id" id="blog_entry_id" 
+				   value="{{ entry.id }}" />
+			<input id="blog_comment_name" class="input_text with-instructions"
+			 	   name="name" type="text" 
+				   title="Who are you?" />
+			<textarea id="blog_comment_body" 
+					  rows="" cols=""
+				      class="input_text with-instructions" name="body"
+				      title="What do you want to say?"></textarea>
+			<input id="blog_comment_submit" class="input_submit"
+			 	   name="submit" type="submit" value="Comment" />
+			<div id="blog_body_instructions">
+				You can use <a href="http://daringfireball.net/projects/markdown/syntax">Markdown</a> when writing your comment.  That means you can do things like *<em>italics</em>*, **<strong>bold</strong>**, and [<a href="">links to stuff</a>](http://lindyjam.com/) and they'll show up when you post it.  <strong>Don't</strong> use HTML.
+			</div>
+		</div>
+	</form>
+{% endblock %}

templates/blog/entry_comments.html

+	<div id="blog_existing_comments">
+		{% for comment in entry.comment_set.all|dictsort:"submitted" %}
+			{% include "blog/single_comment.html" %}
+		{% endfor %}
+	</div>

templates/blog/entry_footer.html