From e49f36eb14d3baf3e52b7ad632d1c0de5a6cf772 Mon Sep 17 00:00:00 2001 From: "fergal.moran" Date: Thu, 9 Aug 2012 11:02:18 +0100 Subject: [PATCH] Initial commit after change to backbone/SPA --- README | 1 + core/__init__.py | 1 + core/decorators.py | 26 + core/tasks/__init__.py | 1 + core/tasks/waveform.py | 8 + core/utils/__init__.py | 1 + core/utils/file.py | 5 + core/utils/html.py | 18 + core/utils/live.py | 35 + core/utils/waveform.py | 36 + dss/__init__.py | 0 dss/settings.py | 161 + dss/urls.py | 30 + dss/wsgi.py | 28 + manage.py | 10 + requirements.txt | 15 + spa/__init__.py | 0 spa/admin.py | 16 + spa/ajax.py | 111 + spa/api/__init__.py | 1 + spa/api/v1/BackboneCompatibleResource.py | 21 + spa/api/v1/CommentResource.py | 36 + spa/api/v1/MixResource.py | 43 + spa/api/v1/ReleaseAudioResource.py | 17 + spa/api/v1/ReleaseResource.py | 24 + spa/api/v1/__init__.py | 1 + spa/management/__init__.py | 1 + spa/management/commands/__init__.py | 1 + spa/management/commands/drop.py | 21 + spa/management/commands/generate_waveforms.py | 29 + spa/models.py | 261 + spa/templates.py | 9 + spa/templatetags/__init__.py | 1 + spa/templatetags/spa_extras.py | 40 + spa/tests.py | 16 + spa/urls.py | 25 + spa/views.py | 5 + static/bin/sm/soundmanager2.swf | Bin 0 -> 2888 bytes static/bin/sm/soundmanager2_debug.swf | Bin 0 -> 3304 bytes static/bin/sm/soundmanager2_flash9.swf | Bin 0 -> 8928 bytes static/bin/sm/soundmanager2_flash9_debug.swf | Bin 0 -> 17214 bytes static/bin/sm/soundmanager2_flash_xdomain.zip | Bin 0 -> 33129 bytes static/css/bootstrap-responsive.css | 808 +++ static/css/bootstrap.css | 4326 ++++++++++++++ static/css/colorbox.css | 52 + static/css/fmplayer.css | 167 + static/css/style.css | 155 + static/css/sup.css | 0 static/img/colorbox/border.png | Bin 0 -> 163 bytes static/img/colorbox/controls.png | Bin 0 -> 2033 bytes static/img/colorbox/loading.gif | Bin 0 -> 9427 bytes static/img/colorbox/loading_background.png | Bin 0 -> 166 bytes static/img/default-avatar-32.png | Bin 0 -> 1757 bytes static/img/default-avatar.png | Bin 0 -> 50727 bytes static/img/default-track.png | Bin 0 -> 2490 bytes static/img/download-progress-overlay.png | Bin 0 -> 173 bytes static/img/favicon.ico | Bin 0 -> 1150 bytes static/img/glyphicons-halflings-white.png | Bin 0 -> 4352 bytes static/img/glyphicons-halflings.png | Bin 0 -> 4352 bytes static/img/info.png | Bin 0 -> 189 bytes static/img/noise.png | Bin 0 -> 11157 bytes static/img/pause.png | Bin 0 -> 4567 bytes static/img/play.png | Bin 0 -> 1868 bytes static/img/playhead.png | Bin 0 -> 170 bytes static/img/sheen3.png | Bin 0 -> 1155 bytes static/img/signin_facebook.png | Bin 0 -> 8549 bytes static/img/signin_twitter.png | Bin 0 -> 7603 bytes static/img/site-logo-gr.png | Bin 0 -> 859 bytes static/img/slide-nav.png | Bin 0 -> 3930 bytes static/img/variables.less | 206 + static/js/app/app.js | 92 + static/js/app/models/comment.js | 10 + static/js/app/models/mix.js | 7 + static/js/app/models/release.js | 7 + static/js/app/models/release_audio.js | 7 + static/js/app/settings.js | 4 + static/js/app/site.js | 38 + static/js/app/utils.js | 90 + static/js/app/views/comment.js | 46 + static/js/app/views/header.js | 54 + static/js/app/views/mix.js | 91 + static/js/app/views/release.js | 37 + static/js/app/views/release_audio.js | 40 + static/js/app/views/sidebar.js | 16 + static/js/dss_sound_handler.js | 137 + static/js/libs/ICanHaz.js | 543 ++ .../js/libs/backbone/backbone-localstorage.js | 84 + static/js/libs/backbone/backbone.js | 1290 +++++ static/js/libs/backbone/underscore.js | 999 ++++ static/js/libs/bootstrap/alert.js | 91 + static/js/libs/bootstrap/bootstrap.js | 1720 ++++++ static/js/libs/bootstrap/bootstrap.min.js | 1 + static/js/libs/bootstrap/button.js | 98 + static/js/libs/bootstrap/carousel.js | 154 + static/js/libs/bootstrap/collapse.js | 136 + static/js/libs/bootstrap/dropdown.js | 92 + static/js/libs/bootstrap/modal.js | 209 + static/js/libs/bootstrap/popover.js | 95 + static/js/libs/bootstrap/scrollspy.js | 125 + static/js/libs/bootstrap/tab.js | 130 + static/js/libs/bootstrap/tooltip.js | 270 + static/js/libs/bootstrap/transition.js | 51 + static/js/libs/bootstrap/typeahead.js | 271 + static/js/libs/jquery-1.7.1.min.js | 4 + static/js/libs/jquery-ui-1.8.18.custom.min.js | 68 + static/js/libs/jquery.colorbox.js | 926 +++ .../libs/modernizr-2.5.3-respond-1.1.0.min.js | 11 + static/js/libs/sm/soundmanager2-jsmin.js | 105 + .../js/libs/sm/soundmanager2-nodebug-jsmin.js | 77 + static/js/libs/sm/soundmanager2-nodebug.js | 2403 ++++++++ static/js/libs/sm/soundmanager2.js | 5105 +++++++++++++++++ tasks/__init__.py | 1 + tasks/waveform.py | 50 + templates/account/base.html | 3 + templates/account/email.html | 71 + templates/account/login.html | 53 + templates/account/logout.html | 19 + templates/account/password_change.html | 14 + templates/account/password_delete.html | 14 + templates/account/password_delete_done.html | 10 + templates/account/password_reset.html | 30 + templates/account/password_reset_done.html | 16 + .../account/password_reset_from_key.html | 24 + .../account/password_reset_key_message.txt | 9 + templates/account/password_set.html | 15 + templates/account/registration_form.html | 6 + templates/account/signup.html | 28 + .../account/snippets/already_logged_in.html | 5 + templates/account/user_details.html | 22 + templates/account/verification_sent.html | 12 + .../account/verified_email_required.html | 26 + templates/base.html | 87 + .../emailconfirmation/confirm_email.html | 20 + .../email_confirmation_message.txt | 4 + .../email_confirmation_subject.txt | 5 + templates/inc/_MixItemInsert.html | 69 + templates/inc/ancient_browser.html | 3 + templates/inc/app.html | 17 + templates/inc/comment_list.html | 15 + templates/inc/mix_edit_toolbar.html | 74 + templates/inc/track_player_ajax.html | 0 templates/inc/twitter.html | 41 + templates/openid/base.html | 1 + templates/openid/login.html | 19 + templates/socialaccount/account_inactive.html | 11 + .../socialaccount/authentication_error.html | 11 + templates/socialaccount/base.html | 2 + templates/socialaccount/connections.html | 56 + templates/socialaccount/login_cancelled.html | 17 + templates/socialaccount/signup.html | 25 + .../socialaccount/snippets/login_extra.html | 4 + .../socialaccount/snippets/provider_list.html | 19 + templates/views/CommentItemView.html | 15 + templates/views/CommentListView.html | 12 + templates/views/HeaderView.html | 47 + templates/views/LoginView.html | 46 + templates/views/MixItemView.html | 1 + templates/views/MixListView.html | 8 + templates/views/MixView.html | 4 + templates/views/ReleaseAudioItemView.html | 2 + templates/views/ReleaseAudioListView.html | 110 + templates/views/ReleaseItemView.html | 19 + templates/views/ReleaseListView.html | 1 + templates/views/ReleaseView.html | 5 + templates/views/SidebarView.html | 1 + utils.py | 3 + 166 files changed, 23705 insertions(+) create mode 100644 README create mode 100644 core/__init__.py create mode 100644 core/decorators.py create mode 100644 core/tasks/__init__.py create mode 100644 core/tasks/waveform.py create mode 100644 core/utils/__init__.py create mode 100644 core/utils/file.py create mode 100644 core/utils/html.py create mode 100644 core/utils/live.py create mode 100644 core/utils/waveform.py create mode 100644 dss/__init__.py create mode 100644 dss/settings.py create mode 100644 dss/urls.py create mode 100644 dss/wsgi.py create mode 100644 manage.py create mode 100644 requirements.txt create mode 100644 spa/__init__.py create mode 100644 spa/admin.py create mode 100644 spa/ajax.py create mode 100644 spa/api/__init__.py create mode 100644 spa/api/v1/BackboneCompatibleResource.py create mode 100644 spa/api/v1/CommentResource.py create mode 100644 spa/api/v1/MixResource.py create mode 100644 spa/api/v1/ReleaseAudioResource.py create mode 100644 spa/api/v1/ReleaseResource.py create mode 100644 spa/api/v1/__init__.py create mode 100644 spa/management/__init__.py create mode 100644 spa/management/commands/__init__.py create mode 100644 spa/management/commands/drop.py create mode 100644 spa/management/commands/generate_waveforms.py create mode 100644 spa/models.py create mode 100644 spa/templates.py create mode 100644 spa/templatetags/__init__.py create mode 100644 spa/templatetags/spa_extras.py create mode 100644 spa/tests.py create mode 100644 spa/urls.py create mode 100644 spa/views.py create mode 100644 static/bin/sm/soundmanager2.swf create mode 100644 static/bin/sm/soundmanager2_debug.swf create mode 100644 static/bin/sm/soundmanager2_flash9.swf create mode 100644 static/bin/sm/soundmanager2_flash9_debug.swf create mode 100644 static/bin/sm/soundmanager2_flash_xdomain.zip create mode 100644 static/css/bootstrap-responsive.css create mode 100644 static/css/bootstrap.css create mode 100644 static/css/colorbox.css create mode 100644 static/css/fmplayer.css create mode 100644 static/css/style.css create mode 100644 static/css/sup.css create mode 100644 static/img/colorbox/border.png create mode 100644 static/img/colorbox/controls.png create mode 100644 static/img/colorbox/loading.gif create mode 100644 static/img/colorbox/loading_background.png create mode 100644 static/img/default-avatar-32.png create mode 100644 static/img/default-avatar.png create mode 100644 static/img/default-track.png create mode 100644 static/img/download-progress-overlay.png create mode 100644 static/img/favicon.ico create mode 100644 static/img/glyphicons-halflings-white.png create mode 100644 static/img/glyphicons-halflings.png create mode 100644 static/img/info.png create mode 100644 static/img/noise.png create mode 100644 static/img/pause.png create mode 100644 static/img/play.png create mode 100644 static/img/playhead.png create mode 100644 static/img/sheen3.png create mode 100644 static/img/signin_facebook.png create mode 100644 static/img/signin_twitter.png create mode 100644 static/img/site-logo-gr.png create mode 100644 static/img/slide-nav.png create mode 100644 static/img/variables.less create mode 100644 static/js/app/app.js create mode 100644 static/js/app/models/comment.js create mode 100644 static/js/app/models/mix.js create mode 100644 static/js/app/models/release.js create mode 100644 static/js/app/models/release_audio.js create mode 100644 static/js/app/settings.js create mode 100644 static/js/app/site.js create mode 100644 static/js/app/utils.js create mode 100644 static/js/app/views/comment.js create mode 100644 static/js/app/views/header.js create mode 100644 static/js/app/views/mix.js create mode 100644 static/js/app/views/release.js create mode 100644 static/js/app/views/release_audio.js create mode 100644 static/js/app/views/sidebar.js create mode 100644 static/js/dss_sound_handler.js create mode 100644 static/js/libs/ICanHaz.js create mode 100644 static/js/libs/backbone/backbone-localstorage.js create mode 100644 static/js/libs/backbone/backbone.js create mode 100644 static/js/libs/backbone/underscore.js create mode 100644 static/js/libs/bootstrap/alert.js create mode 100644 static/js/libs/bootstrap/bootstrap.js create mode 100644 static/js/libs/bootstrap/bootstrap.min.js create mode 100644 static/js/libs/bootstrap/button.js create mode 100644 static/js/libs/bootstrap/carousel.js create mode 100644 static/js/libs/bootstrap/collapse.js create mode 100644 static/js/libs/bootstrap/dropdown.js create mode 100644 static/js/libs/bootstrap/modal.js create mode 100644 static/js/libs/bootstrap/popover.js create mode 100644 static/js/libs/bootstrap/scrollspy.js create mode 100644 static/js/libs/bootstrap/tab.js create mode 100644 static/js/libs/bootstrap/tooltip.js create mode 100644 static/js/libs/bootstrap/transition.js create mode 100644 static/js/libs/bootstrap/typeahead.js create mode 100644 static/js/libs/jquery-1.7.1.min.js create mode 100644 static/js/libs/jquery-ui-1.8.18.custom.min.js create mode 100644 static/js/libs/jquery.colorbox.js create mode 100644 static/js/libs/modernizr-2.5.3-respond-1.1.0.min.js create mode 100644 static/js/libs/sm/soundmanager2-jsmin.js create mode 100644 static/js/libs/sm/soundmanager2-nodebug-jsmin.js create mode 100644 static/js/libs/sm/soundmanager2-nodebug.js create mode 100644 static/js/libs/sm/soundmanager2.js create mode 100644 tasks/__init__.py create mode 100644 tasks/waveform.py create mode 100644 templates/account/base.html create mode 100644 templates/account/email.html create mode 100644 templates/account/login.html create mode 100644 templates/account/logout.html create mode 100644 templates/account/password_change.html create mode 100644 templates/account/password_delete.html create mode 100644 templates/account/password_delete_done.html create mode 100644 templates/account/password_reset.html create mode 100644 templates/account/password_reset_done.html create mode 100644 templates/account/password_reset_from_key.html create mode 100644 templates/account/password_reset_key_message.txt create mode 100644 templates/account/password_set.html create mode 100644 templates/account/registration_form.html create mode 100644 templates/account/signup.html create mode 100644 templates/account/snippets/already_logged_in.html create mode 100644 templates/account/user_details.html create mode 100644 templates/account/verification_sent.html create mode 100644 templates/account/verified_email_required.html create mode 100644 templates/base.html create mode 100644 templates/emailconfirmation/confirm_email.html create mode 100644 templates/emailconfirmation/email_confirmation_message.txt create mode 100644 templates/emailconfirmation/email_confirmation_subject.txt create mode 100644 templates/inc/_MixItemInsert.html create mode 100644 templates/inc/ancient_browser.html create mode 100644 templates/inc/app.html create mode 100644 templates/inc/comment_list.html create mode 100644 templates/inc/mix_edit_toolbar.html create mode 100644 templates/inc/track_player_ajax.html create mode 100644 templates/inc/twitter.html create mode 100644 templates/openid/base.html create mode 100644 templates/openid/login.html create mode 100644 templates/socialaccount/account_inactive.html create mode 100644 templates/socialaccount/authentication_error.html create mode 100644 templates/socialaccount/base.html create mode 100644 templates/socialaccount/connections.html create mode 100644 templates/socialaccount/login_cancelled.html create mode 100644 templates/socialaccount/signup.html create mode 100644 templates/socialaccount/snippets/login_extra.html create mode 100644 templates/socialaccount/snippets/provider_list.html create mode 100644 templates/views/CommentItemView.html create mode 100644 templates/views/CommentListView.html create mode 100644 templates/views/HeaderView.html create mode 100644 templates/views/LoginView.html create mode 100644 templates/views/MixItemView.html create mode 100644 templates/views/MixListView.html create mode 100644 templates/views/MixView.html create mode 100644 templates/views/ReleaseAudioItemView.html create mode 100644 templates/views/ReleaseAudioListView.html create mode 100644 templates/views/ReleaseItemView.html create mode 100644 templates/views/ReleaseListView.html create mode 100644 templates/views/ReleaseView.html create mode 100644 templates/views/SidebarView.html create mode 100644 utils.py diff --git a/README b/README new file mode 100644 index 0000000..56b130c --- /dev/null +++ b/README @@ -0,0 +1 @@ +Deep 'n Corky like.. diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/core/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/core/decorators.py b/core/decorators.py new file mode 100644 index 0000000..e803e25 --- /dev/null +++ b/core/decorators.py @@ -0,0 +1,26 @@ +from decorator import decorator +from django.http import HttpResponseRedirect +from django.shortcuts import render_to_response +from django.template.context import RequestContext + +@decorator +def render_template(func, *args, **kwargs): + """ + using example: + @render_template + def view(request, template='abc.html'): + slot = "this is a slot" + return template, {'slot' : slot} + """ + request = args[0] + _call = func(*args, **kwargs) + + if isinstance(_call, HttpResponseRedirect): + return _call + + if isinstance(_call, tuple): + template, context = _call + else: + template, context = _call, {} + + return render_to_response(template, context_instance=RequestContext(request, context)) diff --git a/core/tasks/__init__.py b/core/tasks/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/core/tasks/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/core/tasks/waveform.py b/core/tasks/waveform.py new file mode 100644 index 0000000..9696b7a --- /dev/null +++ b/core/tasks/waveform.py @@ -0,0 +1,8 @@ +from celery.task import task +from core.utils.waveform import generate_waveform + +@task(name='dss.create_waveform_task') +def create_waveform_task(in_file, out_file): + generate_waveform(in_file, out_file) + + diff --git a/core/utils/__init__.py b/core/utils/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/core/utils/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/core/utils/file.py b/core/utils/file.py new file mode 100644 index 0000000..f697da8 --- /dev/null +++ b/core/utils/file.py @@ -0,0 +1,5 @@ +import uuid + +__author__ = 'fergalm' +def generate_save_file_name(prefix, filename): + return '/'.join([prefix, str(uuid.uuid1()), filename]) diff --git a/core/utils/html.py b/core/utils/html.py new file mode 100644 index 0000000..2bf8848 --- /dev/null +++ b/core/utils/html.py @@ -0,0 +1,18 @@ +from HTMLParser import HTMLParser + +class HTMLStripper(HTMLParser): + """ + Class that cleans HTML, removing all tags and HTML entities. + """ + def __init__(self): + self.reset() + self.fed = [] + def handle_data(self, d): + self.fed.append(d) + def get_data(self): + return ''.join(self.fed) + def strip(self, d): + self.reset() + self.fed = [] + self.feed(d) + return self.get_data().strip() \ No newline at end of file diff --git a/core/utils/live.py b/core/utils/live.py new file mode 100644 index 0000000..e30d485 --- /dev/null +++ b/core/utils/live.py @@ -0,0 +1,35 @@ +import urllib2 +from bs4 import BeautifulSoup + +def get_server_details(server, port, mount): + server = "http://%s:%s/status.xsl?mount=/%s" % (server, port, mount) + print "Getting info for %s" % (server) + try: + response = urllib2.urlopen(server) + html = response.read() + if html: + soup = BeautifulSoup(html) + + info = {} + info['stream_title'] = soup.find(text="Stream Title:").findNext('td').contents[0] + info['stream_description'] = soup.find(text="Stream Description:").findNext('td').contents[0] + info['content_type'] = soup.find(text="Content Type:").findNext('td').contents[0] + info['mount_started'] = soup.find(text="Mount started:").findNext('td').contents[0] + info['quality'] = soup.find(text="Quality:").findNext('td').contents[0] + info['current_listeners'] = soup.find(text="Current Listeners:").findNext('td').contents[0] + info['peak_listeners'] = soup.find(text="Peak Listeners:").findNext('td').contents[0] + info['stream_genre'] = soup.find(text="Stream Genre:").findNext('td').contents[0] + info['stream_url'] = soup.find(text="Stream URL:").findNext('td').findNext('a').contents[0] + info['current_song'] = soup.find(text="Current Song:").findNext('td').contents[0] + + return info + else: + print "Invalid content found" + return None + + except urllib2.URLError: + print "Unable to read url, please check your parameters" + return None + +def get_now_playing(server, port, mount): + return get_server_details(server, port, mount)['current_song'] \ No newline at end of file diff --git a/core/utils/waveform.py b/core/utils/waveform.py new file mode 100644 index 0000000..b00b65f --- /dev/null +++ b/core/utils/waveform.py @@ -0,0 +1,36 @@ +import subprocess +import traceback +import uuid +import os +from dss import settings + +__author__ = 'fergalm' + +def generate_waveform(input_file, output_file): + print "Generating waveform" + try: + working_file = "%s%s.wav" % (settings.DSS_TEMP_PATH, uuid.uuid1()) + try: + print "Starting decode : %s\nInput File: %s\nOutput File: %s" % (settings.DSS_LAME_PATH, input_file, working_file) + p = subprocess.call([settings.DSS_LAME_PATH, "--decode", input_file, working_file]) + print "Finished decode" + if os.path.exists(working_file): + print "Starting waveform generation" + print "%s -m -l -i %s -o -b 000000 %s" % (settings.DSS_WAVE_PATH, working_file, output_file) + subprocess.call([settings.DSS_WAVE_PATH, "-t", "-m", "-l", "-i", working_file, "-o", output_file]) + + if os.path.isfile(output_file): + os.remove(working_file) + print "Generated waveform" + return output_file + else: + print "Failed generating waveform: %s" % output_file + else: + print "Unable to find working file, did LAME succeed?" + return "" + except Exception, ex: + print "Error generating waveform %s" % (ex) + + except: + print "Error generating waveform" + traceback.print_exc() diff --git a/dss/__init__.py b/dss/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dss/settings.py b/dss/settings.py new file mode 100644 index 0000000..2a5592f --- /dev/null +++ b/dss/settings.py @@ -0,0 +1,161 @@ +# Django settings for dss project. +from datetime import timedelta +from django.core.urlresolvers import reverse_lazy +import djcelery +import os +from utils import here +from django.conf import global_settings + +DEBUG = True +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( +# ('Your Name', 'your_email@example.com'), +) + +MANAGERS = ADMINS +AUTH_PROFILE_MODULE = 'spa.UserProfile' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'deepsouthsounds', + 'USER': 'deepsouthsounds', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', + } +} +ROOT_URLCONF = 'dss.urls' +TIME_ZONE = 'America/Chicago' +LANGUAGE_CODE = 'en-us' +SITE_ID = 1 +USE_I18N = False +USE_L10N = True +USE_TZ = False + +SITE_ROOT = here('') +MEDIA_ROOT = here('media') +MEDIA_URL = '/media/' + +STATIC_ROOT = '' +STATIC_URL = '/static/' + +STATICFILES_DIRS = ( + here('static'), + ) + +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + ) + +SECRET_KEY = '8*&j)j4lnq*ft*=jhajvc7&upaifb2f2s5(v6i($$+3p(4^bvd' + +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + 'django.template.loaders.eggs.Loader', + #'django.template.loaders.app_directories.load_template_source', + ) +TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + ( + 'django.core.context_processors.request', + 'django.contrib.auth.context_processors.auth', + "allauth.socialaccount.context_processors.socialaccount", + "allauth.account.context_processors.account" + ) +AUTHENTICATION_BACKENDS = global_settings.AUTHENTICATION_BACKENDS + ( + "allauth.account.auth_backends.AuthenticationBackend", + ) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + ) + +WSGI_APPLICATION = 'dss.wsgi.application' +TEMPLATE_DIRS = (here('templates'),) +INSTALLED_APPS = ( + 'grappelli', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django.contrib.admin', + 'django.contrib.admindocs', + 'djcelery', + 'avatar', + 'notification', + 'spa', + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'allauth.socialaccount.providers.facebook', + 'allauth.socialaccount.providers.google', + 'allauth.socialaccount.providers.github', + 'allauth.socialaccount.providers.linkedin', + 'allauth.socialaccount.providers.openid', + 'allauth.socialaccount.providers.twitter', + 'emailconfirmation', + 'backbone_tastypie', + ) + +# where to redirect users to after logging in +LOGIN_REDIRECT_URL = reverse_lazy('home') +LOGOUT_URL = reverse_lazy('home') + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +BROKER_HOST = "127.0.0.1" +BROKER_PORT = 5672 +BROKER_VHOST = "/" +BROKER_USER = "guest" +BROKER_PASSWORD = "guest" +CELERYBEAT_SCHEDULE = { + "runs-every-30-seconds": { + "task": "dss.generate_missing_waveforms_task", + "schedule": timedelta(seconds=30), + }, + } +djcelery.setup_loader() + +SOCIALACCOUNT_AVATAR_SUPPORT = True +AVATAR_STORAGE_DIR = MEDIA_ROOT + 'avatars/' + +if os.name == 'posix': + DSS_TEMP_PATH = "/tmp/" + DSS_LAME_PATH = "/usr/bin/lame" + DSS_WAVE_PATH = "/usr/local/bin/waveformgen" +else: + DSS_TEMP_PATH = "d:\\temp\\" + DSS_LAME_PATH = "D:\\Apps\\lame\\lame.exe" + DSS_WAVE_PATH = "d:\\Apps\\waveformgen.exe" \ No newline at end of file diff --git a/dss/urls.py b/dss/urls.py new file mode 100644 index 0000000..4d08f75 --- /dev/null +++ b/dss/urls.py @@ -0,0 +1,30 @@ +from django.conf.urls import patterns, include, url +from django.contrib import admin +from dss import settings + +admin.autodiscover() + +# Uncomment the next two lines to enable the admin: +# from django.contrib import admin +# admin.autodiscover() + +urlpatterns = patterns('', + url(r'^admin/', include(admin.site.urls)), + (r'^favicon\.ico$', 'django.views.generic.simple.redirect_to', {'url': '/static/img/favicon.ico'}), + url(r'^', include('spa.urls')), + (r'^grappelli/', include('grappelli.urls')), + url(r'^accounts/', include('allauth.urls')), + (r'^avatar/', include('avatar.urls')), +) + +if settings.DEBUG: + from django.views.static import serve + + _media_url = settings.MEDIA_URL + if _media_url.startswith('/'): + _media_url = _media_url[1:] + urlpatterns += patterns('', + (r'^%s(?P.*)$' % _media_url, + serve, + {'document_root': settings.MEDIA_ROOT})) + del(_media_url, serve) \ No newline at end of file diff --git a/dss/wsgi.py b/dss/wsgi.py new file mode 100644 index 0000000..8765705 --- /dev/null +++ b/dss/wsgi.py @@ -0,0 +1,28 @@ +""" +WSGI config for dss project. + +This module contains the WSGI application used by Django's development server +and any production WSGI deployments. It should expose a module-level variable +named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover +this application via the ``WSGI_APPLICATION`` setting. + +Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework. + +""" +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dss.settings") + +# This application object is used by any WSGI server configured to use this +# file. This includes Django's development server, if the WSGI_APPLICATION +# setting points here. +from django.core.wsgi import get_wsgi_application +application = get_wsgi_application() + +# Apply WSGI middleware here. +# from helloworld.wsgi import HelloWorldApplication +# application = HelloWorldApplication(application) diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..3de7571 --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dss.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0f0afcb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,15 @@ +Django>=1.4 +MySQL-python>=1.2.3 +pillow>=1.7.7 +beautifulsoup4>=4.1.1 +decorator>=3.3.3 +django-allauth>=0.7.0 +django-annoying>=0.7.6 +django-celery>=3.0.4 +django-gravatar2>=1.0.6 +django-avatar>=1.0.5 +django-notification>=0.2 +django-socialauth>=0.1.2c +django-tastypie>=0.9.11 +django-grappelli +humanize diff --git a/spa/__init__.py b/spa/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/spa/admin.py b/spa/admin.py new file mode 100644 index 0000000..bd4bfbe --- /dev/null +++ b/spa/admin.py @@ -0,0 +1,16 @@ +from django.contrib import admin +from spa.models import Mix, Label, Release, ReleaseAudio, MixLike + +class DefaultAdmin(admin.ModelAdmin): + def save_model(self, request, obj, form, change): + obj.user = request.user.get_profile() + obj.save() + +#admin.site.register(Event, EventTestPageAdmin) +admin.site.register(Mix) +admin.site.register(MixLike) +#admin.site.register(Venue) +#admin.site.register(Genre) +admin.site.register(Label) +admin.site.register(Release, DefaultAdmin) +admin.site.register(ReleaseAudio) diff --git a/spa/ajax.py b/spa/ajax.py new file mode 100644 index 0000000..6274193 --- /dev/null +++ b/spa/ajax.py @@ -0,0 +1,111 @@ +from django.conf.urls import url +from django.contrib.auth.decorators import login_required +from django.http import HttpResponse +from annoying.decorators import render_to +from django.shortcuts import render_to_response +import json +from django.utils import simplejson +from core.utils import live +from spa.models import Mix, Comment, MixLike + +class AjaxHandler(object): + import logging + + # Get an instance of a logger + logger = logging.getLogger(__name__) + + def __init__(self, api_name="v1"): + self.api_name = api_name + + @property + def urls(self): + pattern_list = [ + url(r'^mix-description/(?P\d+)/$', 'spa.ajax.get_mix_description', name='ajax_mix-description'), + url(r'^mix/add_comment/$', 'spa.ajax.mix_add_comment', name='mix_add_comment'), + url(r'^mix/comments/(?P\d+)/$', 'spa.ajax.mix_comments', name='ajax_mix_comments'), + url(r'^header/$', 'spa.ajax.header', name='header'), + url(r'^mix_stream_url/(?P\d+)/$', 'spa.ajax.get_mix_stream_url'), + url(r'^release_player/(?P\d+)/$', 'spa.ajax.release_player'), + url(r'^live_now_playing/$', 'spa.ajax.live_now_playing'), + url(r'^like/$', 'spa.ajax.like', name='ajax_mix-description'), + ] + return pattern_list + + def wrap_view(self, view): + def wrapper(request, *args, **kwargs): + return getattr(self, view)(request, *args, **kwargs) + + return wrapper + + +def _get_json(payload, key='value'): + data = { + key: payload + } + return data + + +def get_mix_description(request, mix_id): + return HttpResponse(json.dumps(_get_json('ArgleBargle')), mimetype="application/json") + + +@render_to('inc/header.html') +def header(request): + return HttpResponse(render_to_response('inc/header.html')) + + +def get_mix_stream_url(request, mix_id): + try: + mix = Mix.objects.get(pk=mix_id) + mix.add_play(request.user) + data = { + 'stream_url': mix.get_stream_path(), + 'description': mix.description, + 'title': mix.title + } + return HttpResponse(json.dumps(data), mimetype="application/json") + except Exception, e: + self.logger.exception("Error getting mix stream url") + +def live_now_playing(request): + return HttpResponse( + json.dumps({ + 'stream_url': "radio.deepsouthsounds.com", + 'description': 'Description', + 'title': live.get_now_playing("radio.deepsouthsounds.com", "8000", "live") + }), mimetype="application/json") + + +@render_to('inc/release_player.html') +def release_player(request, release_id): + return HttpResponse('Hello Sailor') + +def mix_add_comment(request): + if request.POST: + comment = Comment() + comment.mix_id = request.POST['mixid'] + comment.user = request.user + comment.comment = request.POST['comment'] + comment.time_index = request.POST['position'] + comment.save() + + return HttpResponse(simplejson.dumps({'description': 'Hello Sailor'})) + else: + return HttpResponse(simplejson.dumps({'description': 'Error posting'})) + +@render_to('inc/comment_list.html') +def mix_comments(request, mix_id): + return { + "results": Comment.objects.filter(mix_id=mix_id), + } + +@login_required() +def like(request): + if request.is_ajax(): + if request.method == 'POST': + if request.POST['dataMode'] == 'mix': + mix = Mix.objects.get(pk = request.POST['dataId']) + if mix is not None: + mix.likes.add(MixLike(mix = mix, user = request.user)) + mix.save() + return HttpResponse(simplejson.dumps(request.raw_post_data)) diff --git a/spa/api/__init__.py b/spa/api/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/spa/api/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/spa/api/v1/BackboneCompatibleResource.py b/spa/api/v1/BackboneCompatibleResource.py new file mode 100644 index 0000000..4f4308b --- /dev/null +++ b/spa/api/v1/BackboneCompatibleResource.py @@ -0,0 +1,21 @@ +from django.conf.urls import url +from tastypie import fields +from tastypie.resources import ModelResource + +__author__ = 'fergalm' + +class BackboneCompatibleResource(ModelResource): + + def override_urls(self): + urls = [] + + for name, field in self.fields.items(): + if isinstance(field, fields.ToManyField): + resource = r"^(?P{resource_name})/(?P<{related_name}>.+)/{related_resource}/$".format( + resource_name=self._meta.resource_name, + related_name=field.related_name, + related_resource=field.attribute, + ) + resource = url(resource, field.to_class().wrap_view('get_list'), name="api_dispatch_detail") + urls.append(resource) + return urls \ No newline at end of file diff --git a/spa/api/v1/CommentResource.py b/spa/api/v1/CommentResource.py new file mode 100644 index 0000000..76450d3 --- /dev/null +++ b/spa/api/v1/CommentResource.py @@ -0,0 +1,36 @@ +import datetime +import humanize +from tastypie import fields +from tastypie.authentication import Authentication +from tastypie.authorization import Authorization +from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource +from spa.models import Comment + +class CommentResource(BackboneCompatibleResource): + mix = fields.ToOneField('spa.api.v1.MixResource.MixResource', 'mix') + + class Meta: + queryset = Comment.objects.all().order_by('-date_created') + resource_name = 'comments' + filtering = { + "mix": ('exact',), + } + authorization = Authorization() + authentication = Authentication() + always_return_data = True + + def obj_create(self, bundle, request, **kwargs): + bundle.data['user'] = {'pk': request.user.pk} + return super(CommentResource, self).obj_create(bundle, request, user=request.user) + + def dehydrate_date_created(self, bundle): + if (datetime.datetime.now() - bundle.obj.date_created) <= datetime.timedelta(days=1): + return humanize.naturaltime(bundle.obj.date_created) + else: + return humanize.naturalday(bundle.obj.date_created) + + def dehydrate(self, bundle): + bundle.data['avatar_image'] = bundle.obj.user.get_profile().get_avatar_image(150) + bundle.data['user_url'] = bundle.obj.user.get_absolute_url() + bundle.data['user_name'] = bundle.obj.user.get_profile().nice_name() + return bundle \ No newline at end of file diff --git a/spa/api/v1/MixResource.py b/spa/api/v1/MixResource.py new file mode 100644 index 0000000..7a4e4e0 --- /dev/null +++ b/spa/api/v1/MixResource.py @@ -0,0 +1,43 @@ +from django.db.models.aggregates import Count +from tastypie import fields +from tastypie.authorization import Authorization +from tastypie.constants import ALL_WITH_RELATIONS +from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource + +from spa.models import Mix + +class MixResource(BackboneCompatibleResource): + comments = fields.ToManyField('spa.api.v1.CommentResource.CommentResource', 'comments', 'mix') + + class Meta: + queryset = Mix.objects.filter(is_active=True) + excludes = ['download_url', 'is_active', 'local_file', 'upload_date'] + filtering = { + 'comments' : ALL_WITH_RELATIONS + } + authorization = Authorization() + + def obj_get_list(self, request=None, **kwargs): + sort = 'latest' + if 'sort' in request.GET and request.GET['sort']: + sort = request.GET['sort'] + + return Mix.get_listing(sort) + + def dehydrate_mix_image(self, bundle): + return bundle.obj.get_image() + + def dehydrate_description(self, bundle): + return bundle.obj.description.replace("\n", "
") + + def dehydrate(self, bundle): + bundle.data['waveform_url'] = bundle.obj.get_waveform_url() + bundle.data['user_name'] = bundle.obj.user.nice_name() + bundle.data['item_url'] = 'mix/%s' % bundle.obj.id + + bundle.data['play_count'] = bundle.obj.plays.count() + bundle.data['like_count'] = bundle.obj.likes.count() + bundle.data['mode'] = 'mix' + bundle.data['comment_count'] = bundle.obj.comments.count() + return bundle + diff --git a/spa/api/v1/ReleaseAudioResource.py b/spa/api/v1/ReleaseAudioResource.py new file mode 100644 index 0000000..1395311 --- /dev/null +++ b/spa/api/v1/ReleaseAudioResource.py @@ -0,0 +1,17 @@ +from tastypie import fields +from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource +from spa.models import ReleaseAudio + +class ReleaseAudioResource(BackboneCompatibleResource): + release = fields.ToOneField('spa.api.v1.ReleaseResource.ReleaseResource', 'release') + + class Meta: + queryset = ReleaseAudio.objects.all() + resource_name = 'audio' + filtering = { + "release": ('exact',), + } + + def dehydrate(self, bundle): + bundle.data['waveform_url'] = bundle.obj.get_waveform_url() + return bundle \ No newline at end of file diff --git a/spa/api/v1/ReleaseResource.py b/spa/api/v1/ReleaseResource.py new file mode 100644 index 0000000..d4a5a22 --- /dev/null +++ b/spa/api/v1/ReleaseResource.py @@ -0,0 +1,24 @@ +import datetime +import humanize +from tastypie import fields +from tastypie.authorization import Authorization +from tastypie.constants import ALL_WITH_RELATIONS +from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource +from spa.models import Release + +class ReleaseResource(BackboneCompatibleResource): + release_audio = fields.ToManyField('spa.api.v1.ReleaseAudioResource.ReleaseAudioResource', 'release_audio', 'release') + class Meta: + queryset = Release.objects.all() + filtering = { + 'release_audio' : ALL_WITH_RELATIONS + } + authorization = Authorization() + + def dehydrate(self, bundle): + bundle.data['item_url'] = 'release/%s' % bundle.obj.id + bundle.data['mode'] = 'release' + return bundle + + def dehydrate_release_date(self, bundle): + return humanize.naturalday(bundle.obj.release_date) \ No newline at end of file diff --git a/spa/api/v1/__init__.py b/spa/api/v1/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/spa/api/v1/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/spa/management/__init__.py b/spa/management/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/spa/management/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/spa/management/commands/__init__.py b/spa/management/commands/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/spa/management/commands/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/spa/management/commands/drop.py b/spa/management/commands/drop.py new file mode 100644 index 0000000..19fd4cf --- /dev/null +++ b/spa/management/commands/drop.py @@ -0,0 +1,21 @@ +from django.conf import settings + +from django.core.management.base import NoArgsCommand + +class Command(NoArgsCommand): + help = "Drop and re-create the database" + def handle_noargs(self, **options): + import MySQLdb + + print "Connecting..." + db = MySQLdb.connect( + host=settings.DATABASES['default']['HOST'] or "localhost", + user=settings.DATABASES['default']['USER'], + passwd=settings.DATABASES['default']['PASSWORD'], + port=int(settings.DATABASES['default']['PORT'] or 3306)) + + cursor = db.cursor() + print "Dropping database %s" % settings.DATABASES['default']['NAME'] + cursor.execute("drop database %s; create database %s;" % (settings.DATABASES['default']['NAME'], settings.DATABASES['default']['NAME'])) + print "Dropped" + diff --git a/spa/management/commands/generate_waveforms.py b/spa/management/commands/generate_waveforms.py new file mode 100644 index 0000000..df86985 --- /dev/null +++ b/spa/management/commands/generate_waveforms.py @@ -0,0 +1,29 @@ +import os +from dss import settings +from core.utils.waveform import generate_waveform +from spa.models import Mix, ReleaseAudio +from django.core.management.base import NoArgsCommand + +class Command(NoArgsCommand): + + help = "Generate all outstanding waveforms" + + def _check_file(self, local_file, output_file): + if os.path.isfile(os.path.join(settings.MEDIA_ROOT, local_file)): + file = os.path.join(settings.MEDIA_ROOT, output_file) + if not os.path.isfile(file): + print "Found missing waveform" + generate_waveform(local_file, file) + + def handle_noargs(self, **options): + print "Generating waveforms for mix" + objects = Mix.objects.all() + for object in objects: + output_file = 'waveforms/mix/%d.png' % object.pk + self._check_file(object.local_file.file.name, output_file) + + print "Generating waveforms for release" + objects = ReleaseAudio.objects.all() + for object in objects: + output_file = 'waveforms/release/%d.png' % object.pk + self._check_file(object.local_file.file.name, output_file) diff --git a/spa/models.py b/spa/models.py new file mode 100644 index 0000000..72e43ab --- /dev/null +++ b/spa/models.py @@ -0,0 +1,261 @@ +from datetime import datetime +import logging +import urlparse +from allauth.socialaccount.models import SocialAccount +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse +from django.db import models +from django.db.models.aggregates import Count +from django.db.models.signals import post_save +from django_gravatar.helpers import has_gravatar, get_gravatar_url +import os +from core.utils.file import generate_save_file_name +from dss import settings +from tasks.waveform import create_waveform_task + +def mix_file_name(instance, filename): + return generate_save_file_name('mixes', filename) + + +def mix_image_name(instance, filename): + return generate_save_file_name('mix-images', filename) + + +def venue_image_name(instance, filename): + return generate_save_file_name('venue-images', filename) + + +def release_image_name(instance, filename): + return generate_save_file_name('release-images', filename) + + +def release_file_name(instance, filename): + return generate_save_file_name('release-audio', filename) + +class BaseModel(models.Model): + logger = logging.getLogger(__name__) + class Meta: + abstract = True + +class UserProfile(BaseModel): + class Meta: + db_table = 'www_userprofile' + + # This field is required. + user = models.ForeignKey(User, unique=True) + avatar_type = models.CharField(max_length=15) + avatar_image = models.ImageField(blank=True, upload_to='avatars/') + + def create_user_profile(sender, instance, created, **kwargs): + if created: + UserProfile.objects.create(user=instance) + post_save.connect(create_user_profile, sender=User) + + def get_username(self): + return self.user.username + username = property(get_username) + + def get_email(self): + return self.user.email + email = property(get_email) + + def get_first_name(self): + return self.user.first_name + first_name = property(get_first_name) + + def get_last_name(self): + return self.user.last_name + last_name = property(get_last_name) + + def get_absolute_url(self): + return reverse('user_details', kwargs={'user_name': self.user.username}) + + def nice_name(self): + return self.first_name + ' ' + self.last_name + + def get_avatar_image(self, size=150): + avatar_type = self.avatar_type + if avatar_type == 'gravatar': + gravatar_exists = has_gravatar(self.email) + if gravatar_exists: + return get_gravatar_url(self.email, size) + elif avatar_type == 'social': + try: + social_account = SocialAccount.objects.filter(user = self)[0] + if social_account: + provider = social_account.get_provider_account() + return provider.get_avatar_url() + except: + pass + elif avatar_type == 'custom': + return self.avatar_image.url + + return urlparse.urljoin(settings.STATIC_URL, "img/default-avatar-32.png") + +class Mix(BaseModel): + class Meta: + db_table = 'www_mix' + + title = models.CharField(max_length=50) + description = models.TextField() + upload_date = models.DateTimeField(default=datetime.now()) + mix_image = models.ImageField(blank=True, upload_to=mix_image_name) + local_file = models.FileField(upload_to=mix_file_name) + download_url = models.CharField(max_length=255) + stream_url = models.CharField(max_length=255) + is_active = models.BooleanField(default=True) + user = models.ForeignKey(UserProfile, editable=False) + + def __unicode__(self): + return self.title + + def save(self, force_insert=False, force_update=False, using=None): + super(Mix, self).save(force_insert, force_update, using) + if not os.path.exists(self.get_waveform_path()): + create_waveform_task.delay(id=self.id, in_file=self.local_file.file.name) + + def get_absolute_url(self): + return '/mix/%i' % self.id + + def get_waveform_path(self): + return os.path.join(settings.MEDIA_ROOT, "waveforms/mix/", "%d.%s" % (self.id, "png")) + + def get_waveform_url(self): + return settings.MEDIA_URL + 'waveforms/mix/%d.%s' % (self.id, "png") + + def get_image(self): + try: + if self.mix_image: + if os.path.exists(self.mix_image.file.name): + return self.mix_image.url + except Exception as ex: + pass + + return settings.STATIC_URL + 'img/default-track.png' + + def get_stream_path(self): + return settings.MEDIA_URL + self.local_file.name + + @classmethod + def get_listing(cls, listing_type): + queryset = None + if listing_type == 'latest': + queryset = Mix.objects.all().order_by( 'id') + elif listing_type == 'toprated': + queryset = Mix.objects.all()\ + .annotate(karma=Count('likes'))\ + .order_by('-karma') + elif listing_type == 'mostactive': + queryset = Mix.objects.all()\ + .annotate(karma=Count('comments'))\ + .order_by('-karma') + elif listing_type == 'mostplayed': + queryset = Mix.objects.all()\ + .annotate(karma=Count('likes'))\ + .order_by('-karma') + elif listing_type == 'recommended': + queryset = Mix.objects.all().order_by( '-id') + + return queryset + + @classmethod + def get_user_mixes(cls, user_name): + mixes = Mix.objects.filter(user__user__username=user_name) + if mixes.count(): + return { + "inline_play": False, + "heading": "Some mixes from " + mixes[0].user.user.get_full_name() or mixes[0].user.user.username, + "latest_mix_list": mixes, + } + + return { + "heading": "No mixes found for this user", + "latest_mix_list": None, + } + + def add_play(self, user): + try: + self.plays.add(MixPlay(user = user if user.is_authenticated() else None)) + except Exception, e: + self.logger.exception("Error getting mix stream url") + +class Comment(BaseModel): + class Meta: + db_table = 'www_comment' + + user = models.ForeignKey(User, editable=False) + mix = models.ForeignKey(Mix, editable=False, related_name='comments') + comment = models.CharField(max_length=1024) + date_created = models.DateTimeField(auto_now=True) + time_index = models.IntegerField() + + def get_absolute_url(self): + return '/comment/%i' % self.id + + def save(self, force_insert=False, force_update=False, using=None): + super(Comment, self).save(force_insert, force_update, using) + +class Label(BaseModel): + class Meta: + db_table = 'www_label' + + name = models.CharField(max_length=100) + + def __unicode__(self): + return self.name + +class Release(BaseModel): + class Meta: + db_table = 'www_release' + + release_artist = models.CharField(max_length=100) + release_title = models.CharField(max_length=100) + release_description = models.TextField() + release_image = models.ImageField(blank=True, upload_to=release_image_name) + release_label = models.ForeignKey(Label) + release_date = models.DateField(default=datetime.now()) + + is_active = models.BooleanField(default=True) + user = models.ForeignKey(UserProfile, editable=False) + + def __unicode__(self): + return self.release_title + + def save(self, force_insert=False, force_update=False, using=None): + super(Release, self).save(force_insert, force_update, using) + + def get_absolute_url(self): + return '/release/%i' % self.id + + @classmethod + def get_view_model(cls): + qs = cls.objects.get(is_active=True) + return qs + +class ReleaseAudio(BaseModel): + class Meta: + db_table = 'www_releaseaudio' + + def __unicode__(self): + return self.description + + def get_waveform_url(self): + return settings.MEDIA_URL + 'waveforms/release/%d.%s' % (self.id, "png") + + local_file = models.FileField(upload_to=release_file_name) + release = models.ForeignKey(Release, related_name='release_audio') + description = models.TextField() + +class __Like(BaseModel): + date = models.DateTimeField(auto_now=True) + user = models.ForeignKey(User, null=True ) + +class MixLike(__Like): + class Meta: + db_table = 'www_like' + mix = models.ForeignKey(Mix, related_name='likes') + +class MixPlay(__Like): + class Meta: + db_table = 'www_play' + mix = models.ForeignKey(Mix, related_name='plays') \ No newline at end of file diff --git a/spa/templates.py b/spa/templates.py new file mode 100644 index 0000000..6cb44c1 --- /dev/null +++ b/spa/templates.py @@ -0,0 +1,9 @@ +from django.shortcuts import render_to_response +from django.template.context import RequestContext + +__author__ = 'fergalm' + +def get_template(request, template_name): + return render_to_response( + 'views/%s.html' % (template_name), + context_instance=RequestContext(request)) \ No newline at end of file diff --git a/spa/templatetags/__init__.py b/spa/templatetags/__init__.py new file mode 100644 index 0000000..8133f5e --- /dev/null +++ b/spa/templatetags/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/spa/templatetags/spa_extras.py b/spa/templatetags/spa_extras.py new file mode 100644 index 0000000..344a86a --- /dev/null +++ b/spa/templatetags/spa_extras.py @@ -0,0 +1,40 @@ +from allauth.socialaccount.models import SocialAccount +from django import template +from django.contrib.auth.models import User +from django_gravatar.helpers import has_gravatar, get_gravatar_url +from dss import settings +from spa.models import UserProfile + +register = template.Library() + +@register.filter +def nice_name(user): + if user == "": + return "Unknown User" + + if type(user) is UserProfile: + return user.user.get_full_name() or user.user.username + elif type(user) is User: + return user.get_full_name() or user.username + +@register.filter +def avatar_image(user, size=150): + profile = user.get_profile() + avatar_type = profile.avatar_type + + if avatar_type == 'gravatar': + gravatar_exists = has_gravatar(user.email) + if gravatar_exists: + return get_gravatar_url(user.email, size) + elif avatar_type == 'social': + try: + social_account = SocialAccount.objects.filter(user = user)[0] + if social_account: + provider = social_account.get_provider_account() + return provider.get_avatar_url() + except: + pass + elif avatar_type == 'custom': + return profile.avatar_image.url + + return settings.STATIC_URL + "/images/default-avatar-32.png" diff --git a/spa/tests.py b/spa/tests.py new file mode 100644 index 0000000..178f860 --- /dev/null +++ b/spa/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/spa/urls.py b/spa/urls.py new file mode 100644 index 0000000..b4c5a84 --- /dev/null +++ b/spa/urls.py @@ -0,0 +1,25 @@ +from django.conf.urls import patterns, url, include +import django.conf.urls +from tastypie.api import Api +from spa.ajax import AjaxHandler +from spa.api.v1.CommentResource import CommentResource +from spa.api.v1.MixResource import MixResource +from spa.api.v1.ReleaseAudioResource import ReleaseAudioResource +from spa.api.v1.ReleaseResource import ReleaseResource +import spa + +v1_api = Api(api_name='v1') +v1_api.register(MixResource()) +v1_api.register(CommentResource()) +v1_api.register(ReleaseResource()) +v1_api.register(ReleaseAudioResource()) + +ajax = AjaxHandler() + +urlpatterns = django.conf.urls.patterns( + '', + url(r'^$', 'spa.views.app', name='home'), + url(r'^tpl/(?P\w+)/$', 'spa.templates.get_template'), + (r'^ajax/', include(ajax.urls)), + (r'^api/', include(v1_api.urls)), +) \ No newline at end of file diff --git a/spa/views.py b/spa/views.py new file mode 100644 index 0000000..99e1742 --- /dev/null +++ b/spa/views.py @@ -0,0 +1,5 @@ +from core.decorators import render_template + +@render_template +def app(request): + return "inc/app.html" diff --git a/static/bin/sm/soundmanager2.swf b/static/bin/sm/soundmanager2.swf new file mode 100644 index 0000000000000000000000000000000000000000..b74496c6efd016e33bf29a9d225d21a63c83e64f GIT binary patch literal 2888 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 literal 0 HcmV?d00001 diff --git a/static/bin/sm/soundmanager2_debug.swf b/static/bin/sm/soundmanager2_debug.swf new file mode 100644 index 0000000000000000000000000000000000000000..d840f5f8cb2f7fc475cb6706f6cf1ae4ce2f12a5 GIT binary patch literal 3304 zcmVWi5S5pWF9smG%+O!#4a~o&%XtlC7&8LFTgP^NixW4t zWF$9fNrPBvKTDgecE#>0w%gJR4YXXUQeZsO2WEKT2f*;i6T=I`KVX>Qi5VXG1%z|X zw>Q~I-52~IedqhmckZ`O-U2ua0KWw|oq+}A0sb8r!VOr<;K!>+hVc_uYxVk?(Y$N4 zgkP$;J;z)%90a@xcyOdiIBTE$OZznp9@Sg6+c0dnCp_PB9k?-3dgUdfG;#jLiSw5x zUW)eXh7V`wY7^s2w&Az+mq+0RsBQa!=zuSpJmIL~j-t=7GA2S)& zg<~{qVM4?3#cQ<%*9kn=wuJ|NN}BMr(zqj<0hIX2hxC^`@*%J~h~7mKmeaZt(l$k- z7Xuq4=VE%tw9J~}m<@MpRro&ggQn4IwSy%iK>h0-x#`C%n%gD&vFq)*EZKv!2>xjGLdL1JG-+EiX2Fe6; zo`sh;Ei-6CTUclhXnMj31Y=vmHen04q0_Si3ym$H9dr=i^~{@|(FI#<1Yq<6w?-7{ zjPAi>aL2_c@I{bfS{J)TTo*pdBAv3n-4#F^=uurp+1T@~;IjT&tyC(3CpvB*z;;oq zbq}qE#+zz*GgFNjcHpF53*%4^3F^Z0TyIjp>IV70 zcVrx$zgQvzkIXP;B3p!~cMV6_Q{%>rzJZ!Kt}}LReSHlTZN+ z68|5Cl&DO)RXNzinOt&Z8h)eLEG~6j(g9-W5?8+ZP)dMzJc=K zk z1WJ3OvT_{;<4?z(n})@aNtVSOdBkWGowd~oy>@d+hruJdh&zEh&f3I#r8=6emWq1; zm_dPu44`gWK3PfT>;QCj6q;?(yu0SPEf0$nW}nl-yhUB+w*%p?xQ2;o5rOM26*jZy zu@SIZ`W)7PQUo^)yN9)|L3mhMz+Ya3Gq+3i%{In~jdVy9EMZ~;bKXpj$n|vOI>e0k zU5D^-XL<1gSmp)jdTuv7Ao3*F&WoCUYjwFMgAb+|sputY{y7FIN}%~~w0>vnxK zzULsXA?sYx3J z^~8<}nxbW==v&otQ+S?(k29bY2y+NmSz4*e3Q-vX2C}psg`ESq%+u_p<(aTnrq2V_ zf~2PM=3`ff2|TDBVkU>RgS>s@>eNmiw4-?vWuDiMN9!zTPbiFiEC>93JeT3`6CwO$ z_|DieXSymqKx7PYONNKEECoA zS%hj8+HvW%Az**Z5ca65FiUB^7ZSeTvXddtDbjO=VoI(PyVyo1I6o@`fgG;Am_LMj71A@SO=uS)JL2cXGTuH6 zWbj#}{)GaEAblzg8*f}n(EkH_&@Yvx-EnzJ%Jn(yoJK&+sVd8rd}ycg^b!bN{;le; zyhWk$5+hWSjh6>D(6X=OGAU?s0J=N?oz|vO&~z@QauBo`?bWnJXRDP|ew^aHxoRP~ zeNk0Yv@T&Ru+QeD&vNK9%U`lQKcJcef6mZhI?Wc!?32$l$gO9VNF~lwveVxwHMK>_ zdVHFhK3P1*Df|pjcB1F5EX$3@qK&0xHu4C_1j}&RURARkb=NrFVuDd%EYHR+Rf@=z zcQH*~t0tj(ov&se8LFXl#Jk9XuOxgBT8$x$k2@?}`JqY3XlLc6$^ePAw7IghgZHz|5F((xe2O@2)xpndYH zc8xS?a>zYij4!GAa#_-h96hAHQI%39J8xE{Xet5UDX$=<1F%a{KD!m?ci3I@u)8pD z9JrDyi1-$J=GM0PkB=zf~&k59Qm~Kfdn&mz~}0AB!45qtBhsOVT5(MVS(7!08t5Z=m|vwE2^rGrDEuWRKR*!D^Ks;4 zw2kuX2m!_MGDASZ-0df^>{J5 zQl=q8D6(8z{lnxs8XM^CU_g>H^&;QD6DRz_pi9%nWOV+zo7A$0$|Bj?{fnp`=7nAoBXJ z0G3rPQrv&Nx&mqgAC1E3K&~-|Pn0!$p}W=-1?$%SC%1l&sipFZ|cxP z?+q1pSv1d;Bd-Zf6f1Js)SA)Kr)h#$fjU&#Im~rS>YmqnGLCb(j5O@=ME^YL|3zpL z?OwXoMRS}rEe*8UKaRo1^Fv}Ff4AegTVS8YFqVs^Qjr6$PeaXd=^8m-DYB)LYmx?! z@}T&+OeDU_;t!m&I9vVa0J1!SvN-Y~tL}bd{vk?mJ!V!5INOjg)m33HN z`vHedj>`D&9;D@nWSo?4daqxgs8J&~VM4jxIh;Go5I^_|iI3!%Eo1UrvK{Fi9;Qt} z)tgMu+}`hB7_46M2MN_#_2V+Or+AqOA8Wes=t34UO2d1-$hnsdZ57v@Xh!>>e|jK? zc8l`qL(++T^^OeH^B{BS9ZGjThzhLA1$H1!(1g=5J|y^DE7Q;|uEqbx;5$qdlC)%* zKa_bNd(feuPM%J`(bL}fVR-AK-M4PI_M>mT9p1X%e>S?+h<=XA^8X^@UsV1o<3<+E zjbrglF%gfh^tx9SeyBZB5Bt+CmyX9e4qF z^bW)k!F$vw@iUndn<3ujK6vkic<=3l_kM`?{yumggm@q9gJ*|$_C9zYhIk+DgZEL0 z_t8Fh_d~q<`{2!oc=P+BsQx8|n{(KGDJ9=Tz>?G@nDvV2Do-+qFtMPo!ZHAQ?DpVOSpbqBOxP&LaGB=C9v zQ1mS6G^zjc&xv&Rmr^H~tyFf7N}&`rBhB)w=>oi(y^hOIovOe*`s&6z5z1?0l+zUHz)7tE;N3tNZ!$QKtWxvCxBzEdbUNS;!cBuBpGts83nCAA_U;#5u0b#>D;sdr~GpY0kgr zE|0aY>R!1@i9xMbbj{GV+kysM$9lp))vjQh_|(+YwT6Zk_9E!;!a62@7oRzF>*Z+i zNn;>i&ZV}SIUKOC>fnZf)$F;s{p%USm&`7hS!*Q=vrgt&1q|7IjWc~LKa%nelnNuc zVX-lv&sb(ID2>r+jgbXCz4TZ(o$I@Vh#10}OmE=tPA4d{x=TF(Y0RBEI+nlX=g2S#x)ON?2C zBI>Gf@2buOTr}UzWb#K29!=%5=1A_Kt8ARQ z+XBnO3A1SR4{XZkN`-tTgYp;aBn_&!YR+Eyrs&yFD453-nR-zSC}GQ`kxbF(8A*~o z&B8HHX(VeEJiDn3jUsm(xi@DfGFB>>vJ&MA5|Q0|>RP;+yqU664XEP+Dnkw9A2rdW z+eV5dU)CxXQNE(TWF0N_jaZqKp+q3uzq`^XUk{XyWh_Is$)y%ajid(5Tq==2x?Qme zB+c@0y3}Wu%#2Z!C3vuCl{S=1`JHG1;|Li*wl^I_UREJzX13<=X`4xFw^b}P97JQ0 z^pYr&Ok2sr+i)5?3;E#!4iuFw(hn+44YH|%1@bwfmp3Ljp$e(PCcBf z&}@-2Ei`7Wl1bBZ@leu~A-(b%J!YDo5m$QlNXPRZ%;%IA{p7Dw*g)OV^H&|wt6Vcg zyXvv(e0=%b#(h2coE6OHh~AYym3Jd?FqN+b*FY*?onq8XrK*ZhN}X3g*B-NGwx-J2 z?6Dm)rtQH+Yn4Q&3XAS8QapwWHS4P^&VUTSJu=wNZ(Y%vEaZ#D6)O0)S}NG-g?zqb z$cR_inzQqUjB~ii3q_wBSVsb`?{Bwq<;J@DRvfIMes5`oR^jpuB+IzGvqVx{>ZS;_ z^nkXBRo&f}btTFp8Qc@}(Q+{zNY+?~+-=c~b&=kgLC)xN9|~QdoL#meBJHI(n)VD5@P}_pwncn8_#2%K(< zZONOla>J!Gzpf+PG1z(VNE+86c??EmkEHVERrpP8$GG0M%{hHprP_|6G2&3aKZug?Pe+Mu`xmwd>P9w zQ9Sh*MsNqE+MH_S>7>QjIeF@FC(|fD%4uO# zuu`=Nlfh`hMT|ri#Pmb?k(`$#=)FeB@q4d{ssYrTk{F4HEdygj(%M8ZtU*?LX+J`Y z=XUbUPF~pAkgwmQ0y*nQb&J6Iw9tjP3SIt@;!Y)wH*FSoSVw~Dp)40fx@x@lrz*7o z&A`Gqj zW-(gS@gOi7RQ*(#4GqNi?C3eTDZYK@w%*;ndeO2D>y!x?IgDFz+eSb2;r!$V7m^Wd zdl_TIKssN7qDZK;*;ncB+ZsREyK7f`mq;kX`xBMW?aj%#ss>U`II(H^W)i@CZI`7o z6i+gfFJh1%mG&KhLxP0bfV-jG9|O7V#fo^i?20Ioe4xiB-0UQjlhH>m!7*Gl12P&1 zO0vgOO)11Z!>Tfo76rTELcekN8C_OjpQ4YrCb&+MkzI~&sxD$-;u}s8Tl=G`M#SZ z=X1R5ld^hbeC2Cfd8-jp^PR8UqjwH9c zj2dxk8!cn9JBq9d<*Xk?PxWC0E9qoKonl$2I4vETKV!O;6gymNSMpylgOJ=8aXe$A zX}0Fj-$qh%XXy?ToTgf%3Zk98+0oLmd9#`+^Yh^xrMu7W)t8|ydc(kh9h=mGThs(i zo~FoxP*ZDDtm*0nqUjnBn-5L5LDT!dcP}*E4<6=W&7tN;q4_arejJ*gfaWKm*@umy z`F^f9gaZ(Y=+QZI=QYh=01z~QFARhlea$WN7kr!xz&}lZF1S~K5a1KsFTfByARs89 zK|o0GM!~~Eiwc+{V4i^a0u~5p7O+UbVgcs~SRy=21)MKD7YJw*aG`*90UZLC3AjkW zasd|$?+O8(!rLXFTfj;Is|2hTaEX9R1zaZJasjUrutvaI0k0Ntg@7vstP^mRfb{}4 z2-qlKlYkxpy#o3KY!M|k!M*e77WfCB=q z6>yz^>jex7xIw@{0Yd^z0SN&~0V#nA3)ljN1*8Rx2#ii}SU^TVRzOZbUcjjEzeYeo z_=^HcLX-uJ2{jk_)z#9b|2VvX@0>%;Egm4qW34}Kz+>G!R zgtsER4dLwww;;R&;hi7?=L>ijh~Vvrz8m4a2qzKl0MYP%ggdc*55fmPgihh}J`jx$ z;PZnB9|FN2#OH?*9zu8+;UmcMG{Pg$g4jo~*C+7#47Pj{;VFbqA^vIbe+Iz+S%l{h zQs5s1|6%Yy4@f{PzJTyWgfAg{8R0AFGhfAyUqkph!e{gl{3d z0RBVx_Aq_zR+cMVLZ3&PCux?!OlN*Ma|f@E-yHG4Q_@{8=(EuB4lg;06&m zfsZ#M+>G!RgtsER4WS_5_hf4B9|nIK{6jd=Td@5d2=B!1??Skh`x7|SZP;`>qVMMZ z6R4S+NW%AE+k3ePp2YS$xCnh4{2?y*`?%2Fk8mf#UHIw)2=^kK;{N-%=6`_W`u-sI zo0@+RYY%b%!`S)}Yz;igTQq+PD<4D77z_fRKzIhbehT5!98HKFK7;koa{t}f=^kSB z97oIG^Q#yr_!@a%2eRY4h8ola`dW}tz3FqJu zbRo!n)E(!~7)C0tX)cZ=A&Fy)kBG3DxjkukUBe+X7o*ZA1@kFcIcNbX1dwdiUx)== zmM%wMLlA$4`{P)V1W_ErFy>%=AvNvII zIb*GiFM%Mgq*sAQXRwA`%&$4!o6(0jx@c(VCWxN^HW+J<#{gTot{IJwAjQ7rFLqnd zdb}m8IgULyb}O7p&vW*&bdxiWN`_+|tuVY_PsrNbdm6iHcj(u6BzS*(YRq9(D`>INPt7EUP)Gu}HSfzfM zW3Q;x`yG2jrM}Uz*Hr489D8l0zS^;uQ$36e*y*0=zLqUNyS)42EG+inlm}bd=C-l^ z7EWfsd1^!N0sFnM9^xl~G@`}JY%^}Jzv92+cfk8Vdp|JD8Q7f|GH(HP6Ryw}rUCaG z%H}%P{lU}q-dN6Gje(ELUNy%&U0mSdFNvCc8fb_QRy=3rV{Y zr&s2~a1M6L@9MOOirWm!e+j>ldh>n+^`^7as5dWr1odXHM=|6Z>@f`b274UCK4*Tz zYc#$kN}5aR-BLqM7A(uom(>NbTqw(CS+=<9nIAo|94B zXE)c|2JBtRGz}6t99_bhtPMvLsY2|JqTPK}?5V035cV`kgAW=KKQO*LqDwaz?=$d? zw@UXhxbUaq{vzoB@qN({nN!w>?2m(L7j5i`<)g0%adh-YYMui2?*B&*pa1e6-Y#Rw+-Tc04wWc7%^%#L9UQBhL3}LQCwuzc zkv=zlq4>?u$&oOsWek_(^V3NT^Yaywj_f?wQ_T87_My(&E68DtbPKBpk_9VBHg*P; zJw{K%A!&| zaNlAy0}`HRpznELxN+culdrG&TSh6>jl%zyQMS3t{Q}IHTc=!nVSYiXw^3p{T(U3D zB->$rQIg@NlbJU*P10yLQO<}zFVgnmI!Wv-J(^BYXzuXdvhS|Qq1 zVcIiZw?iEsN6ZaIysoZ|qpccY_SoN1TNk2@6uQ(j+t`K2dEb|S$G!)BUj{f4#>B7n zgxt0z<-!W3qJx=q3ng8+%5ldzIX1hL6^=X3!Lg;bh$tL{$RlGD)Z~v%(!+V6vZ3EtR1wH8dKz{9?ZDHR_5z6SC>;1QWrJt~tb zOs%{I`#L752Kxq{rw#T3o~V87n|P-7v2Wq2+ROeP&(*z@el>9B01Ihs0#Dc)o5VA= z#?Ig=TVvk_7S-5`c-q$3Sv+rR>?J&LYwREJ%+1+%@YL;N-^Ft`XWzq{AbF{itYz3A9YxHA;bhSBr=czRoa4RmhfF=kI< zT0M#BwCnGa80kst`b=^f6x=}@bdS+E2{SVL*5mUj^`wU`^GMIjW%YZRB9l){L|&3v z^^agYsfS~z5DOCene$|4H>t)$X*C=F5mh}jJ8WI0YmskGP5E@6HZ3txIsb2EU8eW) z%=0pNInfU3_CI0Y)$t$W)S&%Qcv9x+p87ofpV6o0vwuOCn$P|fU5c}it_4ClI?@lF zhA66dunQ~g?eQ*+p5}G3+>K%lNvVc@f)f1+C^P|W=hM%nNZcX2bePwM=gA~!cDKzi z@3OTd8oH%s1h1)S-$QzpnnvqOWz$Jio$zZRl-oUH(FN)h(_!vbEjassgY_Xg{cdLb zCpc#==j>r&I=ZSuZbTPG5g(q)q~3vNCks(Sx!k&^Y~8z9O)lj5dNggr-u?=Rg3>SxIKQz;w;vAu~*q zax?!P{27kR`-VID{ro{$^C)Bd2O7i2{*!_l`x!c*#(s_t=wVUL4Z}C|bC`&~fo>Y+ zG#W9=XyxCj#(z96Nt|>X$K{u8J}&o z&s_*I8KC6V+wWy+IGJMk>|N%E!9_fkOdQ6Qx)nv-{6!7fY5uZ?Tx0%M4LNN7poV13 zU)7MD`Rf{TKqjRwk~e=Nk#_U9(mp6oe66e*wiJuYsv6%`Bim|BTa9L`acm{8tp>8? z5W1}XwsHYr*uR1Jn$S#*$zjnwl&&H&_s{sM0Y}|95&k>GR}tW^ReL*AF`l0qF{brqNhH|n$$XlF0N+12OGC-brY!HrX6f5wedx}DF%{(>8)#{P;MrXkS&D*!2rqa#*gQSDUE z?ST_nZEy;z%9sMKP^F8h$_3u+fZbv4Q?bikMZCJ!d40Oh?IkDcki#dbE>(1#vnp?x z&KpBgw@WqdvK%IQS+l0~U9AFnccoT=u2zArR)MZofv#48u2zArR)OxW z0{ceZA)jg_wF+u3&~Cm7lee||uP0Z#8J>n`0eb3-31qI z*6xN6!b8&P&%;^xuB`nLcfFhVEKfMW>00#7oHF?NbiuyY=|JuQ%O@J`lvnr{F=I%&(Us)T=de5D2ykef=-NIjc zJDilteF&bwB`5Ekm2xqrbA!E2Dz`qBcsr*kzmRhJTcl^dG%d%QHgoBRmBdc7_eI{Q zoU~mAWeq*BM>W{P?p2Pard+*(Rdd%|!$e)0>)q(Ab;OT?>vI}fY|%6xJ@zM|(qEb} ze8BBh9X?bUK7I?bU#u|2!ghNOsaVD_t*a`O7GL)nscqfWr@k5E)bHU>>T`!u;m_!d zNovzPc(lU=xw-o3hwgve>SX*KoN}_3SD<*Oq*w%C7~a9|csE0Av924z!!s=)WlS$} z?B>?fm9K$|#-bg_Y_LV;v;8eR-HZh8$E-z^5g-~bv+zP1v$^^ianVUy1oZ9%CZ3GH zi!;E}@~xcl0BGj{$j?b#Pd^u+b}?MW3qs;5pda-^MrBHIbs;i#zm zLM1fc&D&D3dpO1CHmHlr`&wfMT4UdWRu!Lv=^0@}oR0Kvge3@j5cVSMcUn=j)^yfMi1cA6;ZNtBgpoer zB!cOLlW0f}CVZqxC*ezHoJ1&{chKjqA&us$IvyNzzsud=$h;t(at7^wo24zswjA^Q zXc}v%!M+opqsmgb);WxLSP6gpE)HSUeGh8ze2*@I_tfWDj-9|o!@~DrCgu#Lu~UB< z%wfmIzr2~3PdrFDgNOPLF>}PRQ;z)_^KLFH1@j&*DN<65;r93kI5_be0mn1<)K4NY z7HxJv5^holYlkjuKE&Nyfbhl{y9+Y7msbz2j(v)siam(%VR;p2-^cCytF;H{d!tUf z%X*qcyScY^ewV{g$J6KR7&gw`>ydN!`ZhafuX76-{=m6=!8tpPpn)v+{!6yL6nm7P zY4*}FHjL+h*kdjRVcd&jkGmKTqt0VbxR@5kfI&C?Z93h$wdp>sWo&9n5B+uO+kc%h zrl!_UO(DJ+=2t>Kd=Qs&1G_-eydpqxXVb)F-^F|j4aB7s+>5x zbo?cy$~BBBMV@VANqu5G=?S->teDQ~=Z(KKd4_a1ai*rVv#UIMK?8`M?+tY@%jm*?C)q}@zY$xAZl)t*Npv`Y_{nS6wijwlj-KRK?5869^tI+ z`x2={-Z_3>-Z?I-XSuz-#&U;bxqSx99mI0`E3>>v_jtv}(d9alIuN~(8 zy67}yKgwGx|H46`6Q@s(;eH&IMsUNLy^rFOqxN?PPt`J3nkI7F7w%%RsoA9;h(CtW zt;4*bN)VF6-cWm+(4$LT>Ku(cq3)Y-xlNSi4U;`IVLr;8`0H4BKN0qvR5wFs#-d9Q z$J0sQW1O2kj=V{8>@gY9iTol-uC`m5th@rTBQMgua^^j)k5CNm2m|Gpj4ju|E5f*% ztDUB#@h{eKYk2*%o#AkFh13SB*leG(aGDzI>s?jdK$?&eUg@fCkdisTJ<;rQ2DhRH za3|^C%FQjfZTC6$miXhGzx+RIxGJ5Iapw;*JBo4c72Onf)WVrCuO~O5r=v1FQhqo< za#f|lnXJ&TUxfM%O|+#RFrSb*!55t~UOZWO(M2!TVNP<0Jmm@LK2P%gL;U!m7fB6K zId!G`;R*AjTw1#dyf`)WUFqnnNUE0l`+CRyL|(nFUk$u6$2SZ&<7_2I5+XLOiL zDG;or)i691vT+Z$->A~ZVKRO*&Mjdxf?>IH1<23wDvlz+OwX9V| upv!B{{3<*ocoyP<{8;snuo3_E1Dy&yba66={-y2g|7QR_k^L_v9nUDPz=K-= literal 0 HcmV?d00001 diff --git a/static/bin/sm/soundmanager2_flash9_debug.swf b/static/bin/sm/soundmanager2_flash9_debug.swf new file mode 100644 index 0000000000000000000000000000000000000000..44f6075d901a8eb4e328a45f1708c7be76d8694d GIT binary patch literal 17214 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[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∈%h0%+wWN=KmBjM>U*-~Hi3SWFJL6*RB;}@=Ibf+u8;nbk#b>lebhNY*ccb+N2p49l+D`OnGHME=*dg*0X{n)8{F3I@VZ@Usk58;L;B zaMcf=-+wC)dI6UiZSnv7ylXHVS_T)q^D^Jln-93`0N<&Pt=8ztE$mE$guze+7OVh; zEKgxNAk~QU)5xPa_5wYvv!2(c;V{x5KNeg>`q}5;H@N>Bvf2QYiUIHy{MoOG8Q?q` zXdMF9KnFlWn}BuWPyACb3_}qR?Bbb!CJ=&+<8@d#6p|b!Kl5mQ0qnTZRMNE07;U`SQ3=4F_E*@Pv#QXZt zAY6(8kQ^B=(@S_k(hvq2VpHcO#Gw?dNu4*_=OutB!dR&DWJ8tm~84o=1+Fm>a_bPz5(aeylL-HE*b~2-phC&#c09Pq6DihPfGq@%| zXb92M@gV`gC?G5bwKWryl}zUwvn= zJ?a5O8uAcN&BZ(HF~fITC|IDk^C#s%f-yUc<5dg=zXJkKj)0ml<8gSe6f#^s?+L0? z3QHyp1!tzBanuhxlaj;!od$lP3@2 zl98Jk^a9Oj@<0X?2P7&r3trmL*-Fqr6e{YU0>GiR2E>4$+GfJ=X%`SC!Jz{E z99?L}p+{#VrA$m|;|QNDo`C~52rDFGAeC9zRxTQM=Cj>Fl3iFn07(uAC9>D$B4H;a z89cftdCNq6Is{mhKxN?oj=4faDI?;+QB;5mDuz!^iVz4Z6yeZ{x-1phtiID6X?5Ow za~Oz`M_lrP-H|{?d+Tv#wu6AQG8<;#2qqMp3`nTFLC``b3Kk(&Inm!iKY%V0KT%{n zc+W)f8H8(5eT_msApX|lPm~=075A&_waP|o<9_W z)*vVzPn@*E056qNj5Bdj1d2$S2LVp}gsi0FO*?c6AtNbp8I1rYfM)R%9Mb?39J0du zlWYNIk;|)-?tq^dT?2b+%ApxYBS$waj7CCZqY+wqHE@(MF9B8pym4)NqRoqDg}?yp z3eboItrQAQ9z942r$Cg7ekvb}eFhBMPqfYOfIis)0D!l0pdS-%=_fJ`M(fkD^DL6D z1l(2~#0)@_Rp!h>=s$1+kQ=l0QsAeC+k@7Mk@KkY4u{7!fm)9SS!yKkg+xHW1`R|K z8Gu)#7qLWvk*0Wb63tTBJdA>u-^U#&$s9_2KP>;Bgm3Zx z&-?pBXN#=>!MG@MYAOf7v?#TN8B$(Vp;lCsm*WS}DugJ5pBng8Rl=_d5G)n5h?+%y z)#Y$jSL3G!U@R3i0C%aVsi7Z$yHw1sti=y;nO!?at(ZfcftxY}%}}kVEiWGoX$a41 z;J^S*1wXT9;fD}rkOh9gt+Kkj5q< zTY)IG)pOM9S=HqLhN-AhYXLK3tEi~1n4LFhfnlqttgNZDpb_Do4U`u?#o5pnHPtr2 z(bUvhxLt71nNyPqKWsz2D{Cx3B3s3r$~o00j1e3J3{x?uy1Lep(%H6(+N!EK*_oOf zUey(q_?=xd2T(QT)qtQWub2&}npu?<)x%?LA#4_4Zz`(+n==@0=KsKrDX*BN%qg#Q z<7K#9P*5?BL!5(V99& zlgDZDcuk(5$rClXSW~8Ja)~C-(B#84*{1=pLUw4fQ?t#~CNI(C zWtx19CLgQG$7%8j&J&qtJ6V%CB8*IkFwSNa^>pVd{Qg{%1DY$S$*VQFO_ST5Rm^!N za~{r|5#~%V&9Oq0f1$~}Y&>)3AU@DvQfMzupujkKU{G<#MKBk`Tmp2Cs}biKm}_CK zg8?dxT;!aD-`in!!Vvt+T`(r>iyg2p^8HN16E}gQ@-XaNjsPPA0Y-iTjD1cob54fi zd8XNc+amt~_Uo{L(IUUYoYP=^0P}Ykf?xssikyO9A=njyN4W@QiiQVxnoLkAcfjCE z5XUbe>=ME)c?jkanBTx~+z|USGHx`>Qm#~5R#uL`iZUpM^75sdbF%SA5Fqr&l6P4w-))GMdFQND%lSfiKFk7FHW&jWDh>wm}NNIB7r!P@;%2Q&$Y;n7P-kH z&$GzQ7P-YD&$q}6E%IWEyu>0ewaCjX@^Xv3!XmG<$g3=Jt3_UIk=Iz{wHA4uMP6@_ zH(2C0i@ebyZ?ecfi@ez)Z?VW*E%G*tyxk&qTI8J;d6z}rW0Ch++t7WuUNtZYijbC&P(xM|I@oLLf^mor}~1?-2!<^z@n&?8I+0oV+6 zK0X;RW#oKm1TcEq=Syu8v)SiMHlU7Z^QGlL9dU4%!^vGvV3m|(NW1cdo#hdBb}r|a zlgF*xQSg;mUIDko{rj0|15n41s*u|3ttLcZ=OEN2&QV%?o8NfravBT>K3B~toLPD9@!w3nb z^lVs8Ru&{6l=5CUvRK7Au(Da@xv+9r)kavkY*v8aP^ve<;bt}G!OCZ|*VjuPHfJrN zqSUSG3dpGP)GBQ8Y?mM4(|BlqYxXLXV)&H%f=_u zXFpXs`2e#q{McpuXbOHDDt??c{J8A+$%C64m0NBBFZG=Nc`p) z^YH66jw%fLCL8lXPciBXnQy9bH0VNO0e;6D3%$OH#v-q8n&J2Qij2j$zmnbNGLA_$ zXD!Pjpp}yeUgeZze_M`mYH|@&10-eHjmi5 zYy@i?Y5W|I^hX&1{1zB3_#F*cl;XBAMi9SajZo5yD(UzgXRJ=PXl>(-wq%R5ZGzFB zY;mK zPr>)lIG{2-Yw-cGGpSEVU7AShle*|hz0n2mg{ek&vbk_sq0~0bSf6YzT2>?hRHX;s z%ZrnN=>!;}7dMyaCHjn{ez@OWTYv;kKwnH#GQCn1Lv;nEI}LVQuq=3%oy z>EeLPn&G$rNW^_Av3N$Xcy^eCXAPV1Ib;^&nLW?kqlpF3Kd2Od_3+VkcIrI8sMRaO za2>W%#;eTz3fG> zm#qE1wE&&jI}XEPnnbU?ed~+|OgE#4CcbXqr-*Qw?nL<31M@_<6*q3}6w^qWrqXM@ zX?UA6e(Ax3>Z%_OuKn@g6F(mO;m3n;8-D?c#Jn%qH*9`AKss0nkaB=bISC`-uNVmj z*e`K8_W=79!`ryOK^$}X_xPvC_*Sn<*l^?!jEi(GeRMxphJv-(ZJP4}y8ZHTdKjI} z*vF_69x0*f8Bdjv@MGK!A)fkD&l#xsr-;^EwyaE|$4CFd-8p)i#NQ>AX1q&ELw?v0 zDgz>hH#*V!GQ2cmeSIQ1JxY4Xe3WFMpEgpv+C+zc!T8k){TMvYxFs;r_%}*Xu+>91 z)V>8^E;MV{2p11-}G>~fLEF>NQp-oy)qQtRzfd8KR|cPR|B=^giYuZ z+wqvVr4uB%Ogd3gmP-H-Tn?Z#TN$u)>~?KC-8k7S;|AQueUp1}2M*nWb?*7#Lfx{8 zZoFN>a1-hPyAXR)8Q>bCi}nFsqfly9`+Hk$BzsQW0#y&|-4CpdJ$tEF`uC>$gW^`& z)cm*59X5vw6pp0tGPXzb#kFSTGL+NhNDWLJv;}FX>q)XS6;c^PS+}9A2iR3ix*0{< z${5zAH_6Q_^_5B8UW^xhC*h4spNvU1paDliJSw#7O@->Mcvd)##_lbso7N00F}wd1 zi3GrZGQIY{l{fs&viZL7O^l80l(Qq1^Nv)`cZ!^`p1s4&*->QXyp!kbH10HWb_~dQ z7jkw|&H#uQlJlLJIp0k=J89o{BQ00%Mb^cHR|V9_dyzX}bI9sr0CNNi2lU!u#)Du! z-qT3XRW~yQ3*Cp&%C`VO$#*O3+tY_jvXJ9yf;ziRP^a>jib>t2pC)?ZF*#Wr7z?b8 z^tAL8NCbN=FbwYQrHqcTqv?GMBNF8?ZwnAa%9RO5A#J}J^q zLZZD$bhpUy4H4(f%yjQkaf=b}J>ffn<9+l~-*=LZ?CJ{s3-2 ztwWN(!Bgcg`f**T1SnUyk#GE6PT~f%f0Z0ijep2Vy04^T)(!Hd$j4^tIz;>zrRKQ- z7XqX|gr+buQhz=;^%o+w@in54=db+HWVqL*dhg=vqv9?qaZwjEu}i_eV*;e)dq|1# zLnbF3!{bO&sNW3}kSO%!vgv00%`1dxMhF~S_Um_klBE>W<~Bz=jcW?-aoDV%L+ajc7$ zwaI~Y<1%_>pGzv#`CuElFqloX0F3+1_9N%jX;yD^m*+c;_5NY&tBH&OAYx`B&h^jUSg zS=4Piy%)|=z`O{|cW~xUGiiqc3v!r-leuyKc|I-nL1J2w@37mxiclXfY zK&?GQWPc#SAxa*D1A^v6MII*-{>GD(hnqo2vXIBK$isM^yz*(H55wyPp6v+Ml|i%H@A*@0QvLmuW(1}2BF$bi&0gG*MX6q8 z{rVcA9^RyQBW5HJTzZhJO zeRyJf6nYTvs*L}ddF>Z<#ZV~Wr31VNZxGAlEqHkFlK%jEo3V{p!yumt9A_dsod|Kb zkBt{}YL^GgQhGuU^&UroexL&Vj2_ODhCUlF4Br)H#w&Tg1xYVq-eY~me0txg9-=r@ zU;rYXr|zLKkQh;eoHnbV_XHAn8$XC2;52wNzW2;PRU$FEY(N$?fY8X}2!Vwp0)vG+ z|3uZl7MWa*OeWHX6ni~{RO_9zN`T+A$41|Lcb5k%Z{rG7?a!E>u$B5yOs70jpYJc^ zn%D>Q3o(dDon8rsW4C&0L0+Zu9@~oKSYM|$XjdbG=+SEi*DKYPbXEKMbUj9rM%#u| z=B#^*nikeu=~?wCniCdcDD1#jirjmIfq3@!-U4(AtyCo}`Mwoos`1!01ODsRrxv-l6c3*5Ga=DKlI`Vlyz R9_D{Q29ApK{{Zx1Tt$-!iaP)R literal 0 HcmV?d00001 diff --git a/static/bin/sm/soundmanager2_flash_xdomain.zip b/static/bin/sm/soundmanager2_flash_xdomain.zip new file mode 100644 index 0000000000000000000000000000000000000000..034de77651145c47e3ecf51eb53060e2410ee9f8 GIT binary patch literal 33129 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 literal 0 HcmV?d00001 diff --git a/static/css/bootstrap-responsive.css b/static/css/bootstrap-responsive.css new file mode 100644 index 0000000..96b08cf --- /dev/null +++ b/static/css/bootstrap-responsive.css @@ -0,0 +1,808 @@ +/*! + * Bootstrap Responsive v2.0.3 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +@media (max-width: 767px) { + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 18px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-group > label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .modal { + position: absolute; + top: 10px; + right: 10px; + left: 10px; + width: auto; + margin: 0; + } + .modal.fade.in { + top: auto; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + [class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: auto; + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 20px; + } + .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.762430939%; + *margin-left: 2.709239449638298%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 99.999999993%; + *width: 99.9468085036383%; + } + .row-fluid .span11 { + width: 91.436464082%; + *width: 91.38327259263829%; + } + .row-fluid .span10 { + width: 82.87292817100001%; + *width: 82.8197366816383%; + } + .row-fluid .span9 { + width: 74.30939226%; + *width: 74.25620077063829%; + } + .row-fluid .span8 { + width: 65.74585634900001%; + *width: 65.6926648596383%; + } + .row-fluid .span7 { + width: 57.182320438000005%; + *width: 57.129128948638304%; + } + .row-fluid .span6 { + width: 48.618784527%; + *width: 48.5655930376383%; + } + .row-fluid .span5 { + width: 40.055248616%; + *width: 40.0020571266383%; + } + .row-fluid .span4 { + width: 31.491712705%; + *width: 31.4385212156383%; + } + .row-fluid .span3 { + width: 22.928176794%; + *width: 22.874985304638297%; + } + .row-fluid .span2 { + width: 14.364640883%; + *width: 14.311449393638298%; + } + .row-fluid .span1 { + width: 5.801104972%; + *width: 5.747913482638298%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 714px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 652px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 590px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 528px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 466px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 404px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 342px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 280px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 218px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 156px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 94px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 32px; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 30px; + } + .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.564102564%; + *margin-left: 2.510911074638298%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145300001%; + *width: 91.3997999636383%; + } + .row-fluid .span10 { + width: 82.905982906%; + *width: 82.8527914166383%; + } + .row-fluid .span9 { + width: 74.358974359%; + *width: 74.30578286963829%; + } + .row-fluid .span8 { + width: 65.81196581200001%; + *width: 65.7587743226383%; + } + .row-fluid .span7 { + width: 57.264957265%; + *width: 57.2117657756383%; + } + .row-fluid .span6 { + width: 48.717948718%; + *width: 48.6647572286383%; + } + .row-fluid .span5 { + width: 40.170940171000005%; + *width: 40.117748681638304%; + } + .row-fluid .span4 { + width: 31.623931624%; + *width: 31.5707401346383%; + } + .row-fluid .span3 { + width: 23.076923077%; + *width: 23.0237315876383%; + } + .row-fluid .span2 { + width: 14.529914530000001%; + *width: 14.4767230406383%; + } + .row-fluid .span1 { + width: 5.982905983%; + *width: 5.929714493638298%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1160px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1060px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 960px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 860px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 760px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 660px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 560px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 460px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 360px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 260px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 160px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 60px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top { + position: static; + margin-bottom: 18px; + } + .navbar-fixed-top .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 9px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #999999; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 6px 15px; + font-weight: bold; + color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #222222; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: block; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 9px 15px; + margin: 9px 0; + border-top: 1px solid #222222; + border-bottom: 1px solid #222222; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/static/css/bootstrap.css b/static/css/bootstrap.css new file mode 100644 index 0000000..9ffe42b --- /dev/null +++ b/static/css/bootstrap.css @@ -0,0 +1,4326 @@ +@import url(https://fonts.googleapis.com/css?family=Ubuntu); +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, +a:active { + outline: 0; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} +#map_canvas img { + max-width: none; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} +body { + margin: 0; + font-family: 'Ubuntu', Tahoma, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} +a { + color: #33332D; + text-decoration: none; +} +a:hover { + color: #9FB4CC; + text-decoration: underline; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, +.row:after { + display: table; + content: ""; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + margin-left: 20px; +} +.container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.span12 { + width: 940px; +} +.span11 { + width: 860px; +} +.span10 { + width: 780px; +} +.span9 { + width: 700px; +} +.span8 { + width: 620px; +} +.span7 { + width: 540px; +} +.span6 { + width: 460px; +} +.span5 { + width: 380px; +} +.span4 { + width: 300px; +} +.span3 { + width: 220px; +} +.span2 { + width: 140px; +} +.span1 { + width: 60px; +} +.offset12 { + margin-left: 980px; +} +.offset11 { + margin-left: 900px; +} +.offset10 { + margin-left: 820px; +} +.offset9 { + margin-left: 740px; +} +.offset8 { + margin-left: 660px; +} +.offset7 { + margin-left: 580px; +} +.offset6 { + margin-left: 500px; +} +.offset5 { + margin-left: 420px; +} +.offset4 { + margin-left: 340px; +} +.offset3 { + margin-left: 260px; +} +.offset2 { + margin-left: 180px; +} +.offset1 { + margin-left: 100px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; +} +.row-fluid:after { + clear: both; +} +.row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.127659574%; + *margin-left: 2.0744680846382977%; +} +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .span12 { + width: 99.99999998999999%; + *width: 99.94680850063828%; +} +.row-fluid .span11 { + width: 91.489361693%; + *width: 91.4361702036383%; +} +.row-fluid .span10 { + width: 82.97872339599999%; + *width: 82.92553190663828%; +} +.row-fluid .span9 { + width: 74.468085099%; + *width: 74.4148936096383%; +} +.row-fluid .span8 { + width: 65.95744680199999%; + *width: 65.90425531263828%; +} +.row-fluid .span7 { + width: 57.446808505%; + *width: 57.3936170156383%; +} +.row-fluid .span6 { + width: 48.93617020799999%; + *width: 48.88297871863829%; +} +.row-fluid .span5 { + width: 40.425531911%; + *width: 40.3723404216383%; +} +.row-fluid .span4 { + width: 31.914893614%; + *width: 31.8617021246383%; +} +.row-fluid .span3 { + width: 23.404255317%; + *width: 23.3510638276383%; +} +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.8404255306383%; +} +.row-fluid .span1 { + width: 6.382978723%; + *width: 6.329787233638298%; +} +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} +.container:before, +.container:after { + display: table; + content: ""; +} +.container:after { + clear: both; +} +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 9px; +} +p small { + font-size: 11px; + color: #999999; +} +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-family: inherit; + font-weight: bold; + color: inherit; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} +h1 { + font-size: 30px; + line-height: 36px; +} +h1 small { + font-size: 18px; +} +h2 { + font-size: 24px; + line-height: 36px; +} +h2 small { + font-size: 18px; +} +h3 { + font-size: 18px; + line-height: 27px; +} +h3 small { + font-size: 14px; +} +h4, +h5, +h6 { + line-height: 18px; +} +h4 { + font-size: 14px; +} +h4 small { + font-size: 12px; +} +h5 { + font-size: 12px; +} +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #f5f5f5; +} +.page-header h1 { + line-height: 1; +} +ul, +ol { + padding: 0; + margin: 0 0 9px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li { + line-height: 18px; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} +dl { + margin-bottom: 18px; +} +dt, +dd { + line-height: 18px; +} +dt { + font-weight: bold; + line-height: 17px; +} +dd { + margin-left: 9px; +} +.dl-horizontal dt { + float: left; + width: 120px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 130px; +} +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #f5f5f5; + border-bottom: 1px solid #ffffff; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +.muted { + color: #999999; +} +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #f5f5f5; +} +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #f5f5f5; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 18px; + font-style: normal; + line-height: 18px; +} +small { + font-size: 100%; +} +cite { + font-style: normal; +} +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 18px; +} +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +form { + margin: 0 0 18px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +legend small { + font-size: 13.5px; + color: #999999; +} +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} +input, +button, +select, +textarea { + font-family: 'Ubuntu', Tahoma, sans-serif; +} +label { + display: block; + margin-bottom: 5px; +} +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; +} +input, +textarea { + width: 210px; +} +textarea { + height: auto; +} +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; +} +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} +.uneditable-textarea { + width: auto; + height: auto; +} +select, +input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} +select { + width: 220px; + border: 1px solid #bbb; +} +select[multiple], +select[size] { + height: auto; +} +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} +input, +textarea, +.uneditable-input { + margin-left: 0; +} +input.span12, textarea.span12, .uneditable-input.span12 { + width: 930px; +} +input.span11, textarea.span11, .uneditable-input.span11 { + width: 850px; +} +input.span10, textarea.span10, .uneditable-input.span10 { + width: 770px; +} +input.span9, textarea.span9, .uneditable-input.span9 { + width: 690px; +} +input.span8, textarea.span8, .uneditable-input.span8 { + width: 610px; +} +input.span7, textarea.span7, .uneditable-input.span7 { + width: 530px; +} +input.span6, textarea.span6, .uneditable-input.span6 { + width: 450px; +} +input.span5, textarea.span5, .uneditable-input.span5 { + width: 370px; +} +input.span4, textarea.span4, .uneditable-input.span4 { + width: 290px; +} +input.span3, textarea.span3, .uneditable-input.span3 { + width: 210px; +} +input.span2, textarea.span2, .uneditable-input.span2 { + width: 130px; +} +input.span1, textarea.span1, .uneditable-input.span1 { + width: 50px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #f5f5f5; + border-color: #ddd; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #eca918; +} +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #eca918; + border-color: #eca918; +} +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #c18910; + -webkit-box-shadow: 0 0 6px #f4cc76; + -moz-box-shadow: 0 0 6px #f4cc76; + box-shadow: 0 0 6px #f4cc76; +} +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #eca918; + background-color: #fcefd4; + border-color: #eca918; +} +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #df382c; +} +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #df382c; + border-color: #df382c; +} +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #bc271c; + -webkit-box-shadow: 0 0 6px #ec8c85; + -moz-box-shadow: 0 0 6px #ec8c85; + box-shadow: 0 0 6px #ec8c85; +} +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #df382c; + background-color: #fadfdd; + border-color: #df382c; +} +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #38b44a; +} +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #38b44a; + border-color: #38b44a; +} +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #2c8d3a; + -webkit-box-shadow: 0 0 6px #7cd689; + -moz-box-shadow: 0 0 6px #7cd689; + box-shadow: 0 0 6px #7cd689; +} +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #38b44a; + background-color: #caeecf; + border-color: #38b44a; +} +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: transparent; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} +.form-actions:before, +.form-actions:after { + display: table; + content: ""; +} +.form-actions:after { + clear: both; +} +.uneditable-input { + overflow: hidden; + white-space: nowrap; + cursor: not-allowed; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} +:-moz-placeholder { + color: #999999; +} +:-ms-input-placeholder { + color: #999999; +} +::-webkit-input-placeholder { + color: #999999; +} +.help-block, +.help-inline { + color: #555555; +} +.help-block { + display: block; + margin-bottom: 9px; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + vertical-align: middle; + padding-left: 5px; +} +.input-prepend, +.input-append { + margin-bottom: 5px; +} +.input-prepend input, +.input-append input, +.input-prepend select, +.input-append select, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: middle; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend input:focus, +.input-append input:focus, +.input-prepend select:focus, +.input-append select:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + z-index: 2; +} +.input-prepend .uneditable-input, +.input-append .uneditable-input { + border-left-color: #ccc; +} +.input-prepend .add-on, +.input-append .add-on { + display: inline-block; + width: auto; + height: 18px; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #f5f5f5; + border: 1px solid #ccc; +} +.input-prepend .add-on, +.input-append .add-on, +.input-prepend .btn, +.input-append .btn { + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend .active, +.input-append .active { + background-color: #a3e2ac; + border-color: #38b44a; +} +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append .uneditable-input { + border-right-color: #ccc; + border-left-color: #eee; +} +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 0; +} +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label { + display: inline-block; +} +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} +.control-group { + margin-bottom: 9px; +} +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 160px; +} +.form-horizontal .help-block { + margin-top: 9px; + margin-bottom: 0; +} +.form-horizontal .form-actions { + padding-left: 160px; +} +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 18px; +} +.table th, +.table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #dddddd; +} +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapsed; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +.table tbody tr:hover td, +.table tbody tr:hover th { + background-color: #f5f5f5; +} +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} +[class^="icon-"]:last-child, +[class*=" icon-"]:last-child { + *margin-left: 0; +} +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} +.icon-glass { + background-position: 0 0; +} +.icon-music { + background-position: -24px 0; +} +.icon-search { + background-position: -48px 0; +} +.icon-envelope { + background-position: -72px 0; +} +.icon-heart { + background-position: -96px 0; +} +.icon-star { + background-position: -120px 0; +} +.icon-star-empty { + background-position: -144px 0; +} +.icon-user { + background-position: -168px 0; +} +.icon-film { + background-position: -192px 0; +} +.icon-th-large { + background-position: -216px 0; +} +.icon-th { + background-position: -240px 0; +} +.icon-th-list { + background-position: -264px 0; +} +.icon-ok { + background-position: -288px 0; +} +.icon-remove { + background-position: -312px 0; +} +.icon-zoom-in { + background-position: -336px 0; +} +.icon-zoom-out { + background-position: -360px 0; +} +.icon-off { + background-position: -384px 0; +} +.icon-signal { + background-position: -408px 0; +} +.icon-cog { + background-position: -432px 0; +} +.icon-trash { + background-position: -456px 0; +} +.icon-home { + background-position: 0 -24px; +} +.icon-file { + background-position: -24px -24px; +} +.icon-time { + background-position: -48px -24px; +} +.icon-road { + background-position: -72px -24px; +} +.icon-download-alt { + background-position: -96px -24px; +} +.icon-download { + background-position: -120px -24px; +} +.icon-upload { + background-position: -144px -24px; +} +.icon-inbox { + background-position: -168px -24px; +} +.icon-play-circle { + background-position: -192px -24px; +} +.icon-repeat { + background-position: -216px -24px; +} +.icon-refresh { + background-position: -240px -24px; +} +.icon-list-alt { + background-position: -264px -24px; +} +.icon-lock { + background-position: -287px -24px; +} +.icon-flag { + background-position: -312px -24px; +} +.icon-headphones { + background-position: -336px -24px; +} +.icon-volume-off { + background-position: -360px -24px; +} +.icon-volume-down { + background-position: -384px -24px; +} +.icon-volume-up { + background-position: -408px -24px; +} +.icon-qrcode { + background-position: -432px -24px; +} +.icon-barcode { + background-position: -456px -24px; +} +.icon-tag { + background-position: 0 -48px; +} +.icon-tags { + background-position: -25px -48px; +} +.icon-book { + background-position: -48px -48px; +} +.icon-bookmark { + background-position: -72px -48px; +} +.icon-print { + background-position: -96px -48px; +} +.icon-camera { + background-position: -120px -48px; +} +.icon-font { + background-position: -144px -48px; +} +.icon-bold { + background-position: -167px -48px; +} +.icon-italic { + background-position: -192px -48px; +} +.icon-text-height { + background-position: -216px -48px; +} +.icon-text-width { + background-position: -240px -48px; +} +.icon-align-left { + background-position: -264px -48px; +} +.icon-align-center { + background-position: -288px -48px; +} +.icon-align-right { + background-position: -312px -48px; +} +.icon-align-justify { + background-position: -336px -48px; +} +.icon-list { + background-position: -360px -48px; +} +.icon-indent-left { + background-position: -384px -48px; +} +.icon-indent-right { + background-position: -408px -48px; +} +.icon-facetime-video { + background-position: -432px -48px; +} +.icon-picture { + background-position: -456px -48px; +} +.icon-pencil { + background-position: 0 -72px; +} +.icon-map-marker { + background-position: -24px -72px; +} +.icon-adjust { + background-position: -48px -72px; +} +.icon-tint { + background-position: -72px -72px; +} +.icon-edit { + background-position: -96px -72px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-check { + background-position: -144px -72px; +} +.icon-move { + background-position: -168px -72px; +} +.icon-step-backward { + background-position: -192px -72px; +} +.icon-fast-backward { + background-position: -216px -72px; +} +.icon-backward { + background-position: -240px -72px; +} +.icon-play { + background-position: -264px -72px; +} +.icon-pause { + background-position: -288px -72px; +} +.icon-stop { + background-position: -312px -72px; +} +.icon-forward { + background-position: -336px -72px; +} +.icon-fast-forward { + background-position: -360px -72px; +} +.icon-step-forward { + background-position: -384px -72px; +} +.icon-eject { + background-position: -408px -72px; +} +.icon-chevron-left { + background-position: -432px -72px; +} +.icon-chevron-right { + background-position: -456px -72px; +} +.icon-plus-sign { + background-position: 0 -96px; +} +.icon-minus-sign { + background-position: -24px -96px; +} +.icon-remove-sign { + background-position: -48px -96px; +} +.icon-ok-sign { + background-position: -72px -96px; +} +.icon-question-sign { + background-position: -96px -96px; +} +.icon-info-sign { + background-position: -120px -96px; +} +.icon-screenshot { + background-position: -144px -96px; +} +.icon-remove-circle { + background-position: -168px -96px; +} +.icon-ok-circle { + background-position: -192px -96px; +} +.icon-ban-circle { + background-position: -216px -96px; +} +.icon-arrow-left { + background-position: -240px -96px; +} +.icon-arrow-right { + background-position: -264px -96px; +} +.icon-arrow-up { + background-position: -289px -96px; +} +.icon-arrow-down { + background-position: -312px -96px; +} +.icon-share-alt { + background-position: -336px -96px; +} +.icon-resize-full { + background-position: -360px -96px; +} +.icon-resize-small { + background-position: -384px -96px; +} +.icon-plus { + background-position: -408px -96px; +} +.icon-minus { + background-position: -433px -96px; +} +.icon-asterisk { + background-position: -456px -96px; +} +.icon-exclamation-sign { + background-position: 0 -120px; +} +.icon-gift { + background-position: -24px -120px; +} +.icon-leaf { + background-position: -48px -120px; +} +.icon-fire { + background-position: -72px -120px; +} +.icon-eye-open { + background-position: -96px -120px; +} +.icon-eye-close { + background-position: -120px -120px; +} +.icon-warning-sign { + background-position: -144px -120px; +} +.icon-plane { + background-position: -168px -120px; +} +.icon-calendar { + background-position: -192px -120px; +} +.icon-random { + background-position: -216px -120px; +} +.icon-comment { + background-position: -240px -120px; +} +.icon-magnet { + background-position: -264px -120px; +} +.icon-chevron-up { + background-position: -288px -120px; +} +.icon-chevron-down { + background-position: -313px -119px; +} +.icon-retweet { + background-position: -336px -120px; +} +.icon-shopping-cart { + background-position: -360px -120px; +} +.icon-folder-close { + background-position: -384px -120px; +} +.icon-folder-open { + background-position: -408px -120px; +} +.icon-resize-vertical { + background-position: -432px -119px; +} +.icon-resize-horizontal { + background-position: -456px -118px; +} +.icon-hdd { + background-position: 0 -144px; +} +.icon-bullhorn { + background-position: -24px -144px; +} +.icon-bell { + background-position: -48px -144px; +} +.icon-certificate { + background-position: -72px -144px; +} +.icon-thumbs-up { + background-position: -96px -144px; +} +.icon-thumbs-down { + background-position: -120px -144px; +} +.icon-hand-right { + background-position: -144px -144px; +} +.icon-hand-left { + background-position: -168px -144px; +} +.icon-hand-up { + background-position: -192px -144px; +} +.icon-hand-down { + background-position: -216px -144px; +} +.icon-circle-arrow-right { + background-position: -240px -144px; +} +.icon-circle-arrow-left { + background-position: -264px -144px; +} +.icon-circle-arrow-up { + background-position: -288px -144px; +} +.icon-circle-arrow-down { + background-position: -312px -144px; +} +.icon-globe { + background-position: -336px -144px; +} +.icon-wrench { + background-position: -360px -144px; +} +.icon-tasks { + background-position: -384px -144px; +} +.icon-filter { + background-position: -408px -144px; +} +.icon-briefcase { + background-position: -432px -144px; +} +.icon-fullscreen { + background-position: -456px -144px; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + opacity: 0.3; + filter: alpha(opacity=30); +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown:hover .caret, +.open .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #33332D; + white-space: nowrap; +} +.dropdown-menu li > a:hover, +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #33332D; +} +.open { + *z-index: 1000; +} +.open > .dropdown-menu { + display: block; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.collapse.in { + height: auto; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.btn { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding: 4px 10px 4px; + margin-bottom: 0; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e6e6e6; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #cccccc; + *border: 0; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} +.btn:active, +.btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-large [class^="icon-"] { + margin-top: 1px; +} +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} +.btn-small [class^="icon-"] { + margin-top: -1px; +} +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} +.btn-primary { + background-color: #dd5c14; + background-image: -moz-linear-gradient(top, #33332D, #dd7a14); + background-image: -ms-linear-gradient(top, #33332D, #dd7a14); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#33332D), to(#dd7a14)); + background-image: -webkit-linear-gradient(top, #33332D, #dd7a14); + background-image: -o-linear-gradient(top, #33332D, #dd7a14); + background-image: linear-gradient(top, #33332D, #dd7a14); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33332D', endColorstr='#dd7a14', GradientType=0); + border-color: #dd7a14 #dd7a14 #97530e; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #dd7a14; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #dd7a14; + *background-color: #c66d12; +} +.btn-primary:active, +.btn-primary.active { + background-color: #ae6010 \9; +} +.btn-warning { + background-color: #e86537; + background-image: -moz-linear-gradient(top, #ef784e, #33332D); + background-image: -ms-linear-gradient(top, #ef784e, #33332D); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ef784e), to(#33332D)); + background-image: -webkit-linear-gradient(top, #ef784e, #33332D); + background-image: -o-linear-gradient(top, #ef784e, #33332D); + background-image: linear-gradient(top, #ef784e, #33332D); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ef784e', endColorstr='#33332D', GradientType=0); + border-color: #33332D #33332D #9FB4CC; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #33332D; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #33332D; + *background-color: #c64012; +} +.btn-warning:active, +.btn-warning.active { + background-color: #ae3910 \9; +} +.btn-danger { + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #bd362f; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #51a351; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} +.btn-info { + background-color: #99356b; + background-image: -moz-linear-gradient(top, #b03d7b, #772953); + background-image: -ms-linear-gradient(top, #b03d7b, #772953); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b03d7b), to(#772953)); + background-image: -webkit-linear-gradient(top, #b03d7b, #772953); + background-image: -o-linear-gradient(top, #b03d7b, #772953); + background-image: linear-gradient(top, #b03d7b, #772953); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b03d7b', endColorstr='#772953', GradientType=0); + border-color: #772953 #772953 #3e152b; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #772953; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #772953; + *background-color: #642246; +} +.btn-info:active, +.btn-info.active { + background-color: #511c39 \9; +} +.btn-inverse { + background-color: #414141; + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #222222; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} +button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} +.btn-group { + position: relative; + *zoom: 1; + *margin-left: .3em; +} +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} +.btn-group:after { + clear: both; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + *padding-top: 4px; + *padding-bottom: 4px; +} +.btn-group > .btn-mini.dropdown-toggle { + padding-left: 5px; + padding-right: 5px; +} +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} +.btn-group > .btn-large.dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #dd7a14; +} +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #33332D; +} +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} +.btn-group.open .btn-info.dropdown-toggle { + background-color: #772953; +} +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} +.btn .caret { + margin-top: 7px; + margin-left: 0; +} +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.btn-mini .caret { + margin-top: 5px; +} +.btn-small .caret { + margin-top: 6px; +} +.btn-large .caret { + margin-top: 6px; + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.dropup .btn-large .caret { + border-bottom: 5px solid #000000; + border-top: 0; +} +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcefd4; + border: 1px solid #fae1c6; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + color: #eca918; +} +.alert-heading { + color: inherit; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} +.alert-success { + background-color: #caeecf; + border-color: #b7e8b6; + color: #38b44a; +} +.alert-danger, +.alert-error { + background-color: #fadfdd; + border-color: #f8d0d4; + color: #df382c; +} +.alert-info { + background-color: #e7b8d1; + border-color: #de9ecb; + color: #772953; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +.nav { + margin-left: 0; + margin-bottom: 18px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.nav > .pull-right { + float: right; +} +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav li + .nav-header { + margin-top: 9px; +} +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #33332D; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.nav-tabs, +.nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} +.nav-tabs:after, +.nav-pills:after { + clear: both; +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #f5f5f5 #f5f5f5 #dddddd; +} +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #33332D; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.nav-tabs .dropdown-toggle .caret, +.nav-pills .dropdown-toggle .caret { + border-top-color: #33332D; + border-bottom-color: #33332D; + margin-top: 6px; +} +.nav-tabs .dropdown-toggle:hover .caret, +.nav-pills .dropdown-toggle:hover .caret { + border-top-color: #9FB4CC; + border-bottom-color: #9FB4CC; +} +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, +.tabbable:after { + display: table; + content: ""; +} +.tabbable:after { + clear: both; +} +.tab-content { + overflow: auto; +} +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-below > .nav-tabs > li > a:hover { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-left > .nav-tabs > li > a:hover { + border-color: #f5f5f5 #dddddd #f5f5f5 #f5f5f5; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-right > .nav-tabs > li > a:hover { + border-color: #f5f5f5 #f5f5f5 #f5f5f5 #dddddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.navbar { + *position: relative; + *z-index: 2; + overflow: visible; + margin-bottom: 18px; +} +.navbar-inner { + min-height: 40px; + padding-left: 20px; + padding-right: 20px; + background-color: #33332D; + background-image: -moz-linear-gradient(top, #CCCC9F, #33332D); + background-image: -ms-linear-gradient(top, #CCCC9F, #33332D); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#CCCC9F), to(#33332D)); + background-image: -webkit-linear-gradient(top, #CCCC9F, #33332D); + background-image: -o-linear-gradient(top, #CCCC9F, #33332D); + background-image: linear-gradient(top, #CCCC9F, #33332D); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ce4213', endColorstr='#33332D', GradientType=0); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); + -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); + box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1); +} +.navbar .container { + width: auto; +} +.nav-collapse.collapse { + height: auto; +} +.navbar { + color: #ffffff; +} +.navbar .brand:hover { + text-decoration: none; +} +.navbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #ffffff; +} +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; +} +.navbar .navbar-link { + color: #ffffff; +} +.navbar .navbar-link:hover { + color: #ffffff; +} +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn { + margin: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input, +.navbar-form select { + display: inline-block; + margin-bottom: 0; +} +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} +.navbar-search .search-query { + padding: 4px 9px; + font-family: 'Ubuntu', Tahoma, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + background-color: #f39c7d; + border: 1px solid #c64012; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +.navbar-search .search-query:-moz-placeholder { + color: #ffffff; +} +.navbar-search .search-query:-ms-input-placeholder { + color: #ffffff; +} +.navbar-search .search-query::-webkit-input-placeholder { + color: #ffffff; +} +.navbar-search .search-query:focus, +.navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-bottom { + bottom: 0; +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; +} +.navbar .nav > li { + display: block; + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 9px 10px 11px; + line-height: 19px; + color: #ffffff; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar .btn { + display: inline-block; + padding: 4px 10px 4px; + margin: 5px 5px 6px; + line-height: 18px; +} +.navbar .btn-group { + margin: 0; + padding: 5px 5px 6px; +} +.navbar .nav > li > a:hover { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #33332D; +} +.navbar .divider-vertical { + height: 40px; + width: 1px; + margin: 0 9px; + overflow: hidden; + background-color: #33332D; + border-right: 1px solid #ce4213; +} +.navbar .nav.pull-right { + margin-left: 10px; + margin-right: 0; +} +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + background-color: #d44413; + background-image: -moz-linear-gradient(top, #ce4213, #33332D); + background-image: -ms-linear-gradient(top, #ce4213, #33332D); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ce4213), to(#33332D)); + background-image: -webkit-linear-gradient(top, #ce4213, #33332D); + background-image: -o-linear-gradient(top, #ce4213, #33332D); + background-image: linear-gradient(top, #ce4213, #33332D); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ce4213', endColorstr='#33332D', GradientType=0); + border-color: #33332D #33332D #9FB4CC; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #33332D; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); +} +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + background-color: #33332D; + *background-color: #c64012; +} +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #ae3910 \9; +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.navbar .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar-fixed-bottom .dropdown-menu:before { + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + border-bottom: 0; + bottom: -7px; + top: auto; +} +.navbar-fixed-bottom .dropdown-menu:after { + border-top: 6px solid #ffffff; + border-bottom: 0; + bottom: -6px; + top: auto; +} +.navbar .nav li.dropdown .dropdown-toggle .caret, +.navbar .nav li.dropdown.open .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar .nav li.dropdown.active .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: transparent; +} +.navbar .nav li.dropdown.active > .dropdown-toggle:hover { + color: #ffffff; +} +.navbar .pull-right .dropdown-menu, +.navbar .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar .pull-right .dropdown-menu:before, +.navbar .dropdown-menu.pull-right:before { + left: auto; + right: 12px; +} +.navbar .pull-right .dropdown-menu:after, +.navbar .dropdown-menu.pull-right:after { + left: auto; + right: 13px; +} +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + list-style: none; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} +.breadcrumb li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} +.breadcrumb .active a { + color: #333333; +} +.pagination { + height: 36px; + margin: 18px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination li { + display: inline; +} +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} +.pagination a:hover, +.pagination .active a { + background-color: #f5f5f5; +} +.pagination .active a { + color: #999999; + cursor: default; +} +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pager { + margin-left: 0; + margin-bottom: 18px; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, +.pager:after { + display: table; + content: ""; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next a { + float: right; +} +.pager .previous a { + float: left; +} +.pager .disabled a, +.pager .disabled a:hover { + color: #999999; + background-color: #fff; + cursor: default; +} +.modal-open .dropdown-menu { + z-index: 2050; +} +.modal-open .dropdown.open { + *z-index: 2050; +} +.modal-open .popover { + z-index: 2060; +} +.modal-open .tooltip { + z-index: 2070; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + overflow: auto; + width: 560px; + margin: -250px 0 0 -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -ms-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 50%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-body { + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +.modal-form { + margin-bottom: 0; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + *zoom: 1; +} +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.tooltip { + position: absolute; + z-index: 1020; + display: block; + visibility: visible; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -2px; +} +.tooltip.right { + margin-left: 2px; +} +.tooltip.bottom { + margin-top: 2px; +} +.tooltip.left { + margin-left: -2px; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} +.popover.top { + margin-top: -5px; +} +.popover.right { + margin-left: 5px; +} +.popover.bottom { + margin-top: 5px; +} +.popover.left { + margin-left: -5px; +} +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} +.popover-inner { + padding: 3px; + width: 280px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; +} +.thumbnails:after { + clear: both; +} +.row-fluid .thumbnails { + margin-left: 0; +} +.thumbnails > li { + float: left; + margin-bottom: 18px; + margin-left: 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} +a.thumbnail:hover { + border-color: #33332D; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; +} +.label, +.badge { + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; +} +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label-important, +.badge-important { + background-color: #df382c; +} +.label-important[href], +.badge-important[href] { + background-color: #bc271c; +} +.label-warning, +.badge-warning { + background-color: #33332D; +} +.label-warning[href], +.badge-warning[href] { + background-color: #ae3910; +} +.label-success, +.badge-success { + background-color: #38b44a; +} +.label-success[href], +.badge-success[href] { + background-color: #2c8d3a; +} +.label-info, +.badge-info { + background-color: #772953; +} +.label-info[href], +.badge-info[href] { + background-color: #511c39; +} +.label-inverse, +.badge-inverse { + background-color: #333333; +} +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 18px; + margin-bottom: 18px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 18px; + color: #ffffff; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-warning .bar { + background-color: #e86537; + background-image: -moz-linear-gradient(top, #ef784e, #33332D); + background-image: -ms-linear-gradient(top, #ef784e, #33332D); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ef784e), to(#33332D)); + background-image: -webkit-linear-gradient(top, #ef784e, #33332D); + background-image: -o-linear-gradient(top, #ef784e, #33332D); + background-image: linear-gradient(top, #ef784e, #33332D); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ef784e', endColorstr='#33332D', GradientType=0); +} +.progress-warning.progress-striped .bar { + background-color: #ef784e; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.accordion { + margin-bottom: 18px; +} +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} +.accordion-toggle { + cursor: pointer; +} +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.carousel .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel .item > img { + display: block; + line-height: 1; +} +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} +.carousel .active { + left: 0; +} +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel .next { + left: 100%; +} +.carousel .prev { + left: -100%; +} +.carousel .next.left, +.carousel .prev.right { + left: 0; +} +.carousel .active.left { + left: -100%; +} +.carousel .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.carousel-control.right { + left: auto; + right: 15px; +} +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #f5f5f5; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + color: inherit; + letter-spacing: -1px; +} +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; + color: inherit; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.navbar .nav > li > a { + border-right: 1px solid #FFF8E3; + border-left: 1px solid #CCCC9F; +} +.navbar .nav > li > a:hover { + background-color: #9FB4CC; +} +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + background-color: rgba(0, 0, 0, 0.2); +} +.navbar .divider-vertical { + background-color: inherit; + border-right: 0px solid #CE4213; +} +.navbar .navbar-text { + padding: 9px 10px 11px; + line-height: 19px; + color: #ffffff; +} +.navbar .navbar-search .search-query { + margin-bottom: 3px; + border: 1px solid #9FB4CC; +} +.navbar .nav-collapse.in > .nav li > a { + color: #ffffff; + border-left: 0px solid #33332D; + border-right: 0px solid #33332D; +} +.navbar .nav-collapse.in > .nav li > a:hover { + background-color: #9FB4CC; +} +.navbar .nav-collapse.in .navbar-form, +.navbar .nav-collapse.in .navbar-search { + border-top: 0px solid #33332D; + border-bottom: 0px solid #33332D; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-primary { + background-color: #e86537; + background-image: -moz-linear-gradient(top, #ef784e, #33332D); + background-image: -ms-linear-gradient(top, #ef784e, #33332D); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ef784e), to(#33332D)); + background-image: -webkit-linear-gradient(top, #ef784e, #33332D); + background-image: -o-linear-gradient(top, #ef784e, #33332D); + background-image: linear-gradient(top, #ef784e, #33332D); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ef784e', endColorstr='#33332D', GradientType=0); + border-color: #33332D #33332D #9FB4CC; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #33332D; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #33332D; + *background-color: #c64012; +} +.btn-primary:active, +.btn-primary.active { + background-color: #ae3910 \9; +} +.btn-warning { + background-color: #f3c768; + background-image: -moz-linear-gradient(top, #f5d185, #efb73e); + background-image: -ms-linear-gradient(top, #f5d185, #efb73e); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5d185), to(#efb73e)); + background-image: -webkit-linear-gradient(top, #f5d185, #efb73e); + background-image: -o-linear-gradient(top, #f5d185, #efb73e); + background-image: linear-gradient(top, #f5d185, #efb73e); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5d185', endColorstr='#efb73e', GradientType=0); + border-color: #efb73e #efb73e #cf9311; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #efb73e; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #efb73e; + *background-color: #edae26; +} +.btn-warning:active, +.btn-warning.active { + background-color: #e7a413 \9; +} +.alert { + text-shadow: none; +} +.hero-unit { + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.hero-unit h1 { + line-height: 1.6em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} \ No newline at end of file diff --git a/static/css/colorbox.css b/static/css/colorbox.css new file mode 100644 index 0000000..5ab7cd1 --- /dev/null +++ b/static/css/colorbox.css @@ -0,0 +1,52 @@ +/* + ColorBox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;} +.cboxIframe{width:100%; height:100%; display:block; border:0;} +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;} + +/* + User Style: + Change the following styles to modify the appearance of ColorBox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:#000;} +#colorbox{} + #cboxTopLeft{width:14px; height:14px; background:url(../img/colorbox/controls.png) no-repeat 0 0;} + #cboxTopCenter{height:14px; background:url(../img/colorbox/border.png) repeat-x top left;} + #cboxTopRight{width:14px; height:14px; background:url(../img/colorbox/controls.png) no-repeat -36px 0;} + #cboxBottomLeft{width:14px; height:43px; background:url(../img/colorbox/controls.png) no-repeat 0 -32px;} + #cboxBottomCenter{height:43px; background:url(../img/colorbox/border.png) repeat-x bottom left;} + #cboxBottomRight{width:14px; height:43px; background:url(../img/colorbox/controls.png) no-repeat -36px -32px;} + #cboxMiddleLeft{width:14px; background:url(../img/colorbox/controls.png) repeat-y -175px 0;} + #cboxMiddleRight{width:14px; background:url(../img/colorbox/controls.png) repeat-y -211px 0;} + #cboxContent{background:#fff; overflow:visible;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{margin-bottom:5px;} + #cboxLoadingOverlay{background:url(../img/colorbox/loading_background.png) no-repeat center center;} + #cboxLoadingGraphic{background:url(../img/colorbox/loading.gif) no-repeat center center;} + #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;} + #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;} + + #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(../img/colorbox/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;} + #cboxPrevious{left:0px; background-position: -51px -25px;} + #cboxPrevious:hover{background-position:-51px 0px;} + #cboxNext{left:27px; background-position:-75px -25px;} + #cboxNext:hover{background-position:-75px 0px;} + #cboxClose{right:0; background-position:-100px -25px;} + #cboxClose:hover{background-position:-100px 0px;} + + .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;} + .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;} + .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;} + .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} \ No newline at end of file diff --git a/static/css/fmplayer.css b/static/css/fmplayer.css new file mode 100644 index 0000000..394f5c1 --- /dev/null +++ b/static/css/fmplayer.css @@ -0,0 +1,167 @@ +.player-wrapper { + margin-bottom: 3px; +} + +.player-header { + border: 1px #CCC solid; + border-bottom: 0; + padding: 0px 4px 0px 4px; + background: #C7BF9E; + position: relative; + height: 20px; + overflow: hidden; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-top-right-radius: 4px; +} + +.player-seekhead { + height: 100%; + position: absolute; + top: 0; + z-index: 1000; + background: none repeat scroll 0 0 #EB0C7A; + height: 92px; + position: absolute; + top: 0; + width: 1px; + z-index: 1001; +} + +.player-body { + height: 104px; + position: relative; + border: 1px #CCC solid; + background-color: #EEE; + -webkit-box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.1); +} + +div.player-body ul.player-controls a { + display: block; + overflow: hidden; + text-indent: -9999px; +} + +.player-title a { + text-decoration: none; + color: #3A1E20; +} + +.player-title li { + display: block; + text-decoration: none; +} + +.player-title li { + font-size: 10px; + line-height: 21px; + color: #C7BF9E; +} + +.cp_container { + border-right: 1px #CCC solid; + +} + +.player-progress { + margin-top: 2px; +} + +.bottom-wrapper { + z-index: 9999; +} + +.player-bottom { + border-top: 1px #CCC solid; + width: 100%; + height: 14px; + color: #423B35; + background-color: #283031; + font-size: 12px; + cursor: pointer; + top: 90px; + z-index: 9999; +} + +.waveform img { + width: 100%; + height: 90px; +} + +.download-progress-overlay { + + background-image: url('../img/download-progress-overlay.png'); + position: absolute; + width: 0px; + height: 81px; + display: block; + background-position: top right; + -webkit-box-shadow: 0px 0px 4px rgba(255, 0, 140, 0.2); +} + +.playhead { + background-image: url('../img/playhead.png'); + position: absolute; + top: 0; + width: 0px; + height: 81px; + display: block; + background-position: top right; + -webkit-box-shadow: 0px 0px 4px rgba(255, 0, 140, 0.2); +} + +/* Listing CSS */ +.audio-listing { + list-style: none; + margin: 0; +} + +.mix-image-image { + height: 100%; + width: 100%; + /* + width: 220px; + height: 120px; + */ + position: relative; + display: block; +} + +.audio-listing-item { + padding-bottom: 15px; +} + +.player-footer { + position: relative; + height: 25px; + padding-top: 12px; + border-bottom: 1px solid #F4F4F4; +} + +.play-button-small { + display: block; + width: 28px; + height: 28px; + border: none; +} + +.play-button-small-playing { + background: url(../img/play.png) no-repeat; +} + +.play-button-small-paused { + background: url(../img/pause.png) no-repeat; +} + +.footer-button { + float: left; + padding-right: 14px; +} + +.footer-button-right { + float: right; +} \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..bb6977c --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,155 @@ +body { + /* background: url(../images/pattern1.jpg) repeat #ffffff;*/ + font-family: 'Lato', sans-serif; + font-size: 14px; + font-weight: 300; + line-height: 1.5em; + padding-top: 45px; + padding-bottom: 40px; + padding-right: 32px; +} + +#header { + margin-top: 20px; +} + +.nav-tabs { + margin-top: 10px; +} + +.bordered { + border-bottom: 3px solid #CEC3B3; +} + +#mix-comments-list ul { + list-style-type: none; +} + +ul.comment-listing .comment-entry { + border-bottom: 1px solid #D2D9E7; +} + +.comment-entry { + padding-top: 5px; +} + +.comment-details { + padding-top: 1px; + padding-left: 5px; + display: table-cell; + vertical-align: top; + width: 10000px; +} + +.image-avatar-small { + float: left; +} + +.image-avatar-small { + width: 32px; + height: 32px; +} + +.socialaccount_provider { + display: block; + height: 116px; + width: 250px; +} + +.signin_button { + display: block; + height: 22px; + width: 150px; + font-size: .1em; +} + +.social_login_providers { + display: inline; + list-style-type: none; +} + +.social_login_providers li { + padding: 7px; + float: left; +} + +#twitter_button { + background: transparent url(../img/signin_twitter.png) top left no-repeat; +} + +#facebook_button { + background: transparent url(../img/signin_facebook.png) top left no-repeat; +} + +#twitter_button:hover, #facebook_button:hover { + background-position: 0px -24px; +} + +#twitter_button:active, #facebook_button:active { + background-position: 0px -48px; +} + +.release-image { + max-width: 100%; + height: 200px; + width: 200px; /* ie8 */ +} + +#release-audio-slide-nav li { + display: inline; + list-style-type: none; + padding-right: 20px; +} + +.selector-button a.on { + background-position: 0 -24px; +} + +.selector-button a { + background-image: url(../img/slide-nav.png); + + float: left; + width: 24px; + height: 24px; + display: inline; + font-size: 11px; + margin: 0 5px 0 0; + line-height: 24px; + font-weight: bold; + text-align: center; + text-decoration: none; + background-position: 0 0; + background-repeat: no-repeat; +} + +.selector-button a:link, .selector-button a:visited { + color: white; + text-decoration: none; +} + +.list-nostyle { + list-style: none outside none; + margin: 0; +} + +.list-horiz li { + float: left; + position: relative; +} + +.bordered-right { + border-right: 1px solid #F2F2F2; +} + +.stats-item { + border-right-color: #E5E5E5; + margin-right: 7px; + padding-right: 7px; +} +.stats{ + border: 0; + font: 0/0 a; + text-shadow: none; + color: transparent; + background-color: transparent; +} \ No newline at end of file diff --git a/static/css/sup.css b/static/css/sup.css new file mode 100644 index 0000000..e69de29 diff --git a/static/img/colorbox/border.png b/static/img/colorbox/border.png new file mode 100644 index 0000000000000000000000000000000000000000..df13bb6daf79307915e7dd1cf29d48730a50c29d GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j6m$o!3-qZIAk{hDdPa25Z9ofAa{3ne}8{RM@MgO z?|^^+D=VvngoLiHE@NZkOP4N1MMVV$27dbVsk5{5|NsBbo<1!vSziv+uI=gK7*Y|p z^k6G*gM$FWhIux5zx_}1v|LF#mgu27<@e;v&wgfZpEc#erGmW@9n6=)zqo$~YGd$p L^>bP0l+XkK8G}75 literal 0 HcmV?d00001 diff --git a/static/img/colorbox/controls.png b/static/img/colorbox/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..65cfd1dc95c5ee4c6c3d0848b1dcfc0ec69f6aea GIT binary patch literal 2033 zcmVY16Dl9G~IT3Xc9)Z^ph#l^+1udkq>pj%s8x3{-FJw3a- zyTZc4tgNhJVPUGOs=2wjTUuIPU0s)#m&C-xo0^)sxw(yvjeLB3^78U4D=RH6Ei5c7 zO-)TME-o-IFwM=)IXOA(>+9v^gnk!Dk@A&OhZFMI5;>mGBP$cHrd(PIyySo z*x1a>%u7p4z`(#lLPF^0=SN3JF)=YpN=iXNLGSMFH#av(NJvFRMNv^v@$vCHJ3Bl) zJTo&hNl8iR>FGvBMo>^t>+0%WUS93(?OFDTAPEK`obwEHsK0ZFDr>E}i?Y_RgTwGjIQc{VDiO$Z>?Ck7QQ&aZ#_VDoVc6N4O zUti|s<#>2_pP!#*wE#@J%|ZXjkIv8d15RfRBQxe$bh z9TUw{N+{bY1z&)8>k2t;d{xYxg76&eJ5GSmab7cm2*kJn zLPONkBzslPWkA+%7~Rthzj+ZdH;HAk-Pq6JDgZ%}1qZgnS8` z|A!BGUTY0vuJ8~Q8k9-cggFrxrb5iS-G06qcV|ScTS@l&{bZ%90njJ((hDH>go-Ov zZbB$mN3X(#_fF&Gsyr1MX$KPpfH2>rC?r$(w4Y$dt3?|Rbk9;C`p(jcaF$k70KON_ zQXS~iuoPW9OL=;PXDK^qs;!en!tGwM8Dm32zK3Hnob~aBRzMgVd)VIwFSb@T|pRnFQtL^ zQVJ_)!)j6(b&PC(dhopzE0a4<>r<@qU z`!EtA#BilIes-lde&oVm?AXss0zni9@U)s;c2)_BE*-ve3qd+Xkx|kwB9dCkgI$6` z2)acBb&UMSYiGCKj*SBn@)q-Z5n&E~kT-AMBO%kChC#@X|0tXb=fe3-(?1oCZXuoB zLi}_KX?F|Z?iRyJn&Er?*=Fkav37KPz4^Q2i%?hdj$hRY5$X6y8bhS1yyTxuueKWC z5CSWPU;%-YXn=qr((#(QE2FU06#>QwQ5V+BI|UkI(*RRqvv@oZ-B#&@=C_U&BCHmt zC#jJURR)BX9qafF9iN(TLwU10A{?j~CXS78W{8Uu@HZ?#PAyEpFp1S*%EGlpZ`N&L zTO`O5246{p*$9hz`Xxjbs;;d1D5fGugh*6-y27O=ZrgP)q5m%J z%*b8(_kO793Uc&AR^jAtn*OA38fGEGyOcr5Fk7$*{qtd@niJ25{6h8_pFvpWJ0e#STIxNJ)pDn{H0&eE#G130bNngTwLQ z{r-aw>G;0=r|=|0AtWIQNk~Exl8}TXBq0e&sC~j#A{E;EQlD^{NCv_KN?|hzt4p`= zmiMYgEZpwcxm$P_8++%CQ5bCMy}oe)uer?ORv)df%L>+~SMRSwxVo4v42N~krH0-D zsqp7BEemF3oQ#jZH?};MT1`)gSQr3NRVET5olgiEnaToD3Vmr;&eR^luC95&D|F|1 zySmIE&VwgJDV!&k+duls&IXn^h1S?O8(9D%7J?Dx?3|Gb?cRJt`cH*#(!#mIWIQCf P00000NkvXXu0mjf=5OWV literal 0 HcmV?d00001 diff --git a/static/img/colorbox/loading.gif b/static/img/colorbox/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4695d811d4f84ed693eff7b5e6b4d61a3e8c48d GIT binary patch literal 9427 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 literal 0 HcmV?d00001 diff --git a/static/img/default-avatar.png b/static/img/default-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..f0082d167b179991a900e96d597e11fee18db703 GIT binary patch literal 50727 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 literal 0 HcmV?d00001 diff --git a/static/img/default-track.png b/static/img/default-track.png new file mode 100644 index 0000000000000000000000000000000000000000..127c5235bcd9485f27885f65ee955c41490bb44d GIT binary patch literal 2490 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 Iol`;+0E|>DOaK4? literal 0 HcmV?d00001 diff --git a/static/img/favicon.ico b/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8c9109f9078077d8ad976b915b2c98a40843274d GIT binary patch literal 1150 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 literal 0 HcmV?d00001 diff --git a/static/img/info.png b/static/img/info.png new file mode 100644 index 0000000000000000000000000000000000000000..c315e6f4beb139a580da18e17d422701a2ed3119 GIT binary patch literal 189 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 literal 0 HcmV?d00001 diff --git a/static/img/pause.png b/static/img/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..e8bf6759c37308308d906c41e8892ea057de3f20 GIT binary patch literal 4567 zcmV;|5h(77P)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( 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 BzoY;F literal 0 HcmV?d00001 diff --git a/static/img/play.png b/static/img/play.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5be48adb434022ca47f2c97293df488b78e38a GIT binary patch literal 1868 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 literal 0 HcmV?d00001 diff --git a/static/img/signin_facebook.png b/static/img/signin_facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..b011037672e5c499652d68e1d4fc5dbaff7394f8 GIT binary patch literal 8549 zcmW-n1ymbd6NZCRiW7>v7I)VI!L1M+f?IJZE`=gRTPPN+NRi;~P`o%4FH$HHJh(&u ze1Fc~-Lp57**TMY_dfIPe$vrW#>1h+0RRAasw#?ak;imo17Tw#_dK$$6UYO)_ZwAx zY~&{x+cp+?{=!4W*c$+NN&H_!`L!1Mi0q{HQ8Mz;bGP^Lv+}Y7$lJPG+tGuZyzKnk zz214#E9ePf*3W)J+L8Wer{HC0<>Tb;Mz8PWY6lSJ<>%w&6DK Q;`0ji4f`u;h` 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 literal 0 HcmV?d00001 diff --git a/static/img/slide-nav.png b/static/img/slide-nav.png new file mode 100644 index 0000000000000000000000000000000000000000..346994304b5fa9c45245a0592c150531e5909efa GIT binary patch literal 3930 zcmV-g52f&lP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000DqNkll(_Gs8JYk|cQV@!kti7Lj8ja(Dil$;rvZ3ASz9w#&@U z#2EXEq9De|a`qTm&CK?z>IGG8XW*ZZWmH7YXIa))uh$77U}nogRS6*wLg-V~^JX@> zAb|M{wr<_J$IO0dG#W_=ffq679Du0m`%_a>V{L*hTeg&dD@9TC7e&Ep%sGduJ_O#F zo}R9F05dxpW9%=A;+c}HL^7a1#&{IKZQ8VHqnX_-iXwT|fj&Nbq^dd?W9&FVD~s)^st$CEKvf4)Rb5a+I-CKis#eXc z)D7omR!v3Zx~i7CAP;7C)vM~o#~3??7QrRAcJ12Dzzs7?Iw_Bc2=KbE*Xt9iTAn}b zPM~$K${~aaXJ+*D^pt>WKwl@KSJfIYBqGgXR}@9X%tq$B(Q0&W{qiFsQsK$N_1=$q z?=4A^=Z5#*oO9-!8};6|eLfY1b8e4wZq|EmD@DukY-=ye60}H4&biahx!BsgB!CE< z21?F3=F#@GR1Nap1C-2cAFvx30N!aW{|QuqbHG{WTxGF~29PfIHyj?nLyva^H53pt z$;41I#2{DWK_UG5-m6QO?Zq-UJbq_GU+Ry~L_K&Xi^+d;1(hr?6O=ho)+L^S-h@|r zQ(o>#Byp4{vv{nMg}e6)X$JJ+n~M`1`S!$Qaoy!Et1Uyo0Y&IbAE^1V9a_cP)OdPJ^pyCyuyL*Gkja$eL9^*B2< zzuqPoy?kp=CVKL>=^EE&8qarof!SP%Q2|b7q7%TQx#;uXCrS>kjNh;K|8;MU)%3P? zsiz*BbCG`XZnIQG(W8~Qy#JqjHB1#&fvkvl(|$ynbJ2lI*EX8j%|EKOd{IeSkVBY`wTFiV*&RQ43emlY)S8=C5_v1? zC^ba)VtR_lI-!3`!tcKrLv;v|G7_bg^5RY2zX`{rlBO29sB o`MC&31?K?wD9|6i1mOPx0MT6xi6M$n+yDRo07*qoM6N<$g6;!rpa1{> literal 0 HcmV?d00001 diff --git a/static/img/variables.less b/static/img/variables.less new file mode 100644 index 0000000..2a1f7c1 --- /dev/null +++ b/static/img/variables.less @@ -0,0 +1,206 @@ +// Variables.less +// Variables to customize the look and feel of Bootstrap +// Swatch: United +// Version: 2.0.4 +// ----------------------------------------------------- + +// GLOBAL VALUES +// -------------------------------------------------- + + +// Grays +// ------------------------- +@black: #000; +@grayDarker: #222; +@grayDark: #333; +@gray: #555; +@grayLight: #999; +@grayLighter: #F5F5F5; +@white: #fff; + + +// Accent colors +// ------------------------- +@blue: #19B6EE; +@blueDark: #0064cd; +@green: #38B44A; +@red: #DF382C; +@yellow: #EFB73E; +@orange: #DD4814; +@pink: #c3325f; +@purple: #772953; + + +// Scaffolding +// ------------------------- +@bodyBackground: @white; +@textColor: @grayDark; + + +// Links +// ------------------------- +@linkColor: @orange; +@linkColorHover: darken(@linkColor, 15%); + + +// Typography +// ------------------------- +@sansFontFamily: 'Ubuntu', Tahoma, sans-serif; +@serifFontFamily: Georgia, "Times New Roman", Times, serif; +@monoFontFamily: Menlo, Monaco, Consolas, "Courier New", monospace; + +@baseFontSize: 13px; +@baseFontFamily: @sansFontFamily; +@baseLineHeight: 18px; +@altFontFamily: @serifFontFamily; + +@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily +@headingsFontWeight: bold; // instead of browser default, bold +@headingsColor: inherit; // empty to use BS default, @textColor + + +// Tables +// ------------------------- +@tableBackground: transparent; // overall background-color +@tableBackgroundAccent: #f9f9f9; // for striping +@tableBackgroundHover: #f5f5f5; // for hover +@tableBorder: #ddd; // table and cell border + + +// Buttons +// ------------------------- +@btnBackground: @white; +@btnBackgroundHighlight: darken(@white, 10%); +@btnBorder: darken(@white, 20%); + +@btnPrimaryBackground: @linkColor; +@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 15%); + +@btnInfoBackground: lighten(@purple, 15%); +@btnInfoBackgroundHighlight: @purple; + +@btnSuccessBackground: #62c462; +@btnSuccessBackgroundHighlight: #51a351; + +@btnWarningBackground: lighten(@orange, 15%); +@btnWarningBackgroundHighlight: @orange; + +@btnDangerBackground: #ee5f5b; +@btnDangerBackgroundHighlight: #bd362f; + +@btnInverseBackground: @gray; +@btnInverseBackgroundHighlight: @grayDarker; + + +// Forms +// ------------------------- +@inputBackground: @white; +@inputBorder: #ccc; +@inputBorderRadius: 3px; +@inputDisabledBackground: @grayLighter; +@formActionsBackground: transparent; + +// Dropdowns +// ------------------------- +@dropdownBackground: @white; +@dropdownBorder: rgba(0,0,0,.2); +@dropdownLinkColor: @linkColor; +@dropdownLinkColorHover: @white; +@dropdownLinkBackgroundHover: @linkColor; +@dropdownDividerTop: #e5e5e5; +@dropdownDividerBottom: @white; + + + +// COMPONENT VARIABLES +// -------------------------------------------------- + +// Z-index master list +// ------------------------- +// Used for a bird's eye view of components dependent on the z-axis +// Try to avoid customizing these :) +@zindexDropdown: 1000; +@zindexPopover: 1010; +@zindexTooltip: 1020; +@zindexFixedNavbar: 1030; +@zindexModalBackdrop: 1040; +@zindexModal: 1050; + + +// Sprite icons path +// ------------------------- +@iconSpritePath: "../img/glyphicons-halflings.png"; +@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png"; + + +// Input placeholder text color +// ------------------------- +@placeholderText: @grayLight; + + +// Hr border color +// ------------------------- +@hrBorder: @grayLighter; + + +// Navbar +// ------------------------- +@navbarHeight: 40px; +@navbarBackground: @orange; +@navbarBackgroundHighlight: #CE4213; + +@navbarText: @white; +@navbarLinkColor: @white; +@navbarLinkColorHover: @white; +@navbarLinkColorActive: @navbarLinkColorHover; +@navbarLinkBackgroundHover: transparent; +@navbarLinkBackgroundActive: @navbarBackground; + +@navbarSearchBackground: lighten(@navbarBackground, 25%); +@navbarSearchBackgroundFocus: @white; +@navbarSearchBorder: darken(@navbarSearchBackground, 30%); +@navbarSearchPlaceholderColor: @white; +@navbarBrandColor: @navbarLinkColor; + + +// Hero unit +// ------------------------- +@heroUnitBackground: @grayLighter; +@heroUnitHeadingColor: inherit; +@heroUnitLeadColor: inherit; + + +// Form states and alerts +// ------------------------- +@warningText: #ECA918; +@warningBackground: lighten(@warningText, 40%); +@warningBorder: darken(spin(@warningBackground, -10), 3%); + +@errorText: #DF382C; +@errorBackground: lighten(@errorText, 40%); +@errorBorder: darken(spin(@errorBackground, -10), 3%); + +@successText: #38B44A; +@successBackground: lighten(@successText, 40%); +@successBorder: darken(spin(@successBackground, -10), 5%); + +@infoText: @purple; +@infoBackground: lighten(@purple, 50%); +@infoBorder: darken(spin(@infoBackground, -10), 7%); + + + +// GRID +// -------------------------------------------------- + +// Default 940px grid +// ------------------------- +@gridColumns: 12; +@gridColumnWidth: 60px; +@gridGutterWidth: 20px; +@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); + +// Fluid grid +// ------------------------- +@fluidGridColumnWidth: 6.382978723%; +@fluidGridGutterWidth: 2.127659574%; diff --git a/static/js/app/app.js b/static/js/app/app.js new file mode 100644 index 0000000..32f32bc --- /dev/null +++ b/static/js/app/app.js @@ -0,0 +1,92 @@ +var AppRouter = Backbone.Router.extend({ + routes:{ + "application/":"defaultRoute", + "/mixes":"mixList", + "/mixes/:type":"mixList", + "/mix/:id":"mixDetails", + "/releases":"releaseList", + "/release/:id":"releaseDetails", + "/accounts/login/":"login", + "/accounts/logout/":"logout" + }, + initialize:function () { + this.headerView = new HeaderView(); + $('#header').html(this.headerView.el); + this.sidebarView = new SidebarView(); + //$('#sidebar').html(this.sidebarView.el); + $('#site-content-fill').html(''); + }, + defaultRoute:function (path) { + if (path == "" || path == "/") + this.mixList(0); + }, + mixList:function (type) { + var mixList = new MixCollection(); + mixList.type = type || 'latest'; + $('#site-content-fill').html(''); + var data = type != undefined ? $.param({sort: type}) : null; + mixList.fetch({ + data: data, + success:function () { + var content = new MixListView({collection:mixList}).el; + $('#content').html(content); + } + }); + }, + mixDetails:function (id) { + var mix = new Mix({id:id}); + mix.fetch({success:function () { + var html = new MixView({model:mix}); + $('#content').html(html.el); + $('#site-content-fill').html(''); + var comments = new CommentCollection(); + comments.url = window.appSettings.urlRoot + mix.attributes.item_url + "/comments/"; + comments.mix_id = id; + comments.mix = mix.get("resource_uri"); + comments.fetch({success:function (data) { + var content = new CommentListView({collection:comments}).render(); + $('#site-content-fill').html(content.el); + }}); + }}); + }, + releaseList:function (page) { + + }, + releaseDetails:function (id) { + var release = new Release({id:id}); + $('#site-content-fill').html(''); + release.fetch({success:function () { + var content = new ReleaseView({model:release}).el; + $('#content').html(content); + var audio = new ReleaseAudioCollection(); + audio.url = window.appSettings.urlRoot + release.attributes.item_url + "/release_audio/"; + audio.audio_id = id; + audio.release = release.get("resource_uri"); + audio.fetch({success:function (data) { + var content = new ReleaseAudioListView({collection:audio}); + $('#release-description').html(content.el); + }}); + }}); + }, + login:function () { + $.colorbox({ + href:"/tpl/LoginView/", + onClosed:function () { + app.navigate('/'); + } + }) + }, + logout:function () { + window.utils.showAlert("Success", "You are now logged out", "alert-success"); + } +}); + +utils.loadTemplate([ + 'HeaderView', 'SidebarView', + 'MixListView', 'MixItemView', 'MixView', + 'CommentListView', 'CommentItemView', + 'ReleaseListView', 'ReleaseItemView', 'ReleaseView', 'ReleaseAudioListView', 'ReleaseAudioItemView'], function () { + window.app = new AppRouter(); + Backbone.history.start(); +}); +var _eventAggregator = _.extend({}, Backbone.Events); diff --git a/static/js/app/models/comment.js b/static/js/app/models/comment.js new file mode 100644 index 0000000..3784090 --- /dev/null +++ b/static/js/app/models/comment.js @@ -0,0 +1,10 @@ +var Comment = TastypieModel.extend({ + urlRoot:window.appSettings.urlRoot + "comments/" +}); + +var CommentCollection = TastypieCollection.extend({ + model:Comment, + comparator: function(comment){ + return -comment.get("id"); + } +}); \ No newline at end of file diff --git a/static/js/app/models/mix.js b/static/js/app/models/mix.js new file mode 100644 index 0000000..ccdad19 --- /dev/null +++ b/static/js/app/models/mix.js @@ -0,0 +1,7 @@ +window.Mix = TastypieModel.extend({ + urlRoot:window.appSettings.urlRoot + "mix/" +}); +window.MixCollection = TastypieCollection.extend({ + url:window.appSettings.urlRoot + "mix/", + model:Mix +}); diff --git a/static/js/app/models/release.js b/static/js/app/models/release.js new file mode 100644 index 0000000..c48e785 --- /dev/null +++ b/static/js/app/models/release.js @@ -0,0 +1,7 @@ +var Release = TastypieModel.extend({ + urlRoot:window.appSettings.urlRoot + "release/" +}); +var ReleaseCollection = TastypieCollection.extend({ + url:window.appSettings.urlRoot + "release/", + model:Release +}); diff --git a/static/js/app/models/release_audio.js b/static/js/app/models/release_audio.js new file mode 100644 index 0000000..4080ff7 --- /dev/null +++ b/static/js/app/models/release_audio.js @@ -0,0 +1,7 @@ +var ReleaseAudio = TastypieModel.extend({ + urlRoot:window.appSettings.urlRoot + "release_audio/" +}); + +var ReleaseAudioCollection = TastypieCollection.extend({ + model:ReleaseAudio +}); \ No newline at end of file diff --git a/static/js/app/settings.js b/static/js/app/settings.js new file mode 100644 index 0000000..2e97aa3 --- /dev/null +++ b/static/js/app/settings.js @@ -0,0 +1,4 @@ +if (!window.appSettings){ + window.appSettings = {}; + appSettings.urlRoot = "/api/v1/"; +} \ No newline at end of file diff --git a/static/js/app/site.js b/static/js/app/site.js new file mode 100644 index 0000000..fc68e28 --- /dev/null +++ b/static/js/app/site.js @@ -0,0 +1,38 @@ +$(document).ajaxSend(function (event, xhr, settings) { + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + + function sameOrigin(url) { + // url could be relative or scheme relative or absolute + var host = document.location.host; // host + port + var protocol = document.location.protocol; + var sr_origin = '//' + host; + var origin = protocol + sr_origin; + // Allow absolute or scheme relative URLs to same origin + return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || + (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || + // or any other URL that isn't scheme relative or absolute i.e relative. + !(/^(\/\/|http:|https:).*/.test(url)); + } + + function safeMethod(method) { + return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); + } + + if (!safeMethod(settings.type) && sameOrigin(settings.url)) { + xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); + } +}); \ No newline at end of file diff --git a/static/js/app/utils.js b/static/js/app/utils.js new file mode 100644 index 0000000..47ff0a3 --- /dev/null +++ b/static/js/app/utils.js @@ -0,0 +1,90 @@ +window.utils = { + // Asynchronously load templates located in separate .html files + loadTemplate:function (views, callback) { + + var deferreds = []; + + $.each(views, function (index, view) { + if (window[view]) { + deferreds.push($.get('/tpl/' + view + '/', function (data) { + window[view].prototype.template = _.template(data); + })); + } else { + alert(view + " not found"); + } + }); + + $.when.apply(null, deferreds).done(callback); + }, + + uploadFile:function (file, callbackSuccess) { + var self = this; + var data = new FormData(); + data.append('file', file); + $.ajax({ + url:'api/upload.php', + type:'POST', + data:data, + processData:false, + cache:false, + contentType:false + }) + .done(function () { + console.log(file.name + " uploaded successfully"); + callbackSuccess(); + }) + .fail(function () { + self.showAlert('Error!', 'An error occurred while uploading ' + file.name, 'alert-error'); + }); + }, + + displayValidationErrors:function (messages) { + for (var key in messages) { + if (messages.hasOwnProperty(key)) { + this.addValidationError(key, messages[key]); + } + } + this.showAlert('Warning!', 'Fix validation errors and try again', 'alert-warning'); + }, + + addValidationError:function (field, message) { + var controlGroup = $('#' + field).parent().parent(); + controlGroup.addClass('error'); + $('.help-inline', controlGroup).html(message); + }, + + removeValidationError:function (field) { + var controlGroup = $('#' + field).parent().parent(); + controlGroup.removeClass('error'); + $('.help-inline', controlGroup).html(''); + }, + + showAlert:function (title, text, klass) { + $('.alert').removeClass("alert-error alert-warning alert-success alert-info"); + $('.alert').addClass(klass); + $('.alert').html('' + title + ' ' + text); + $('.alert').show(); + }, + + hideAlert:function () { + $('.alert').hide(); + } + +}; + +window.TastypieModel = Backbone.Model.extend({ + base_url:function () { + var temp_url = Backbone.Model.prototype.url.call(this); + return (temp_url.charAt(temp_url.length - 1) == '/' ? temp_url : temp_url + '/'); + }, + url:function () { + return this.base_url(); + } +}); + +window.TastypieCollection = Backbone.Collection.extend({ + parse:function (response) { + this.recent_meta = response.meta || {}; + return response.objects || response; + } +}); diff --git a/static/js/app/views/comment.js b/static/js/app/views/comment.js new file mode 100644 index 0000000..e75f17f --- /dev/null +++ b/static/js/app/views/comment.js @@ -0,0 +1,46 @@ +window.CommentItemView = Backbone.View.extend({ + tagName:"li", + initialize:function () { + $(this.el).data("id", this.model.get("id")); + $(this.el).addClass("comment-entry"); + }, + render:function () { + $(this.el).html(this.template({"item":this.model.toJSON()})); + return this; + } +}); +window.CommentListView = Backbone.View.extend({ + initialize:function () { + //this.collection.bind('add', this.render); + }, + events:{ + "click #id-btn-add-comment":"addComment" + }, + addComment:function (ev) { + var comment = $('textarea[name=new-comment]').val(); + var view = this; + if (comment) { + this.collection.create({ + mix:this.collection.mix, + comment:comment, + time_index:15 + }, { + success:function () { + view.collection.sort(); + view.render(); + }, + error:function () { + utils.showAlert("Error", "Unable to save comment", "alert-error"); + }}); + $('textarea[name=new-comment]').val(''); + } + return false; + }, + render:function () { + $(this.el).html(this.template()).append('

    '); + this.collection.each(function (item) { + $('.comment-listing', this.el).append(new CommentItemView({model:item}).render().el); + }, this); + return this; + } +}); diff --git a/static/js/app/views/header.js b/static/js/app/views/header.js new file mode 100644 index 0000000..d2172ac --- /dev/null +++ b/static/js/app/views/header.js @@ -0,0 +1,54 @@ +window.HeaderView = Backbone.View.extend({ + events:{ + "click #header-play-pause-button":"togglePlayState", + "click #header-live-button":"playLive" + }, + initialize:function () { + this.render(); + _.bindAll(this, "trackChanged"); + _.bindAll(this, "trackPlaying"); + _.bindAll(this, "trackPaused"); + _eventAggregator.bind("track_changed", this.trackChanged); + _eventAggregator.bind("track_playing", this.trackPlaying); + _eventAggregator.bind("track_paused", this.trackPaused); + }, + trackChanged:function (data) { + $(this.el).find('#track-description').text(data.title); + }, + trackPlaying:function (data) { + $(this.el).find('#header-play-button-icon').removeClass('icon-play'); + $(this.el).find('#header-play-button-icon').addClass('icon-pause'); + }, + trackPaused:function (data) { + $(this.el).find('#header-play-button-icon').removeClass('icon-pause'); + $(this.el).find('#header-play-button-icon').addClass('icon-play'); + }, + render:function () { + $(this.el).html(this.template()); + return this; + }, + playLive:function () { + dssSoundHandler.playLive(); + _eventAggregator.trigger("track_playing") + var button = $(this.el).find('#header-play-pause-button'); + button.data("mode", "pause"); + $.getJSON( + 'ajax/live_now_playing/', + function (data) { + _eventAggregator.trigger("track_changed", data); + }); + }, + togglePlayState:function () { + var button = $(this.el).find('#header-play-pause-button'); + var mode = button.data("mode"); + if (mode == "play") { + dssSoundHandler.resumeSound(); + _eventAggregator.trigger("track_playing"); + button.data("mode", "pause"); + } else { + dssSoundHandler.pauseSound(); + _eventAggregator.trigger("track_paused"); + button.data("mode", "play"); + } + } +}); \ No newline at end of file diff --git a/static/js/app/views/mix.js b/static/js/app/views/mix.js new file mode 100644 index 0000000..13f43bb --- /dev/null +++ b/static/js/app/views/mix.js @@ -0,0 +1,91 @@ +window.MixItemView = Backbone.View.extend({ + tagName:"li", + events:{ + "click .play-button-small":"playMix", + "click .like-button a":"likeMix", + "click .share-button a":"shareLink" + }, + initialize:function () { + $(this.el).attr("id", "mixitem-" + this.model.get("id")); + $(this.el).addClass("audio-listing-item"); + $(this.el).data("id", this.model.get("id")); + }, + render:function () { + $(this.el).html(this.template({"item":this.model.toJSON()})); + return this; + }, + shareLink:function (e) { + alert("Sharing"); + }, + likeMix:function (e) { + var id = $(e.currentTarget).data("id"); + var mode = $(e.currentTarget).data("mode"); + $.post( + "/ajax/like/", + { dataId:id, dataMode:mode }, + function (data) { + alert(data); + } + ); + }, + playMix:function () { + var id = $(this.el).data("id"); + var mode = "play"; + + //check if we're currently playing a sound + var playingId = dssSoundHandler.getPlayingId(); + if (playingId != -1 && dssSoundHandler.isPlaying()) { + var newMode = dssSoundHandler.togglePlaying(playingId); + //only set the mode if we're toggling an existing track + //otherwise default mode of "play" is what we want + if (playingId == id) + mode = newMode; + } + var button = $(this.el).find('#play-pause-button-small-' + id); + $(button).blur(); + if (mode == "play") { + dssSoundHandler.togglePlayVisual(id); + $.getJSON( + 'ajax/mix_stream_url/' + id + '/', + function (data) { + dssSoundHandler.playSound(id, data.stream_url); + _eventAggregator.trigger("track_changed", data); + _eventAggregator.trigger("track_playing"); + }); + } else if (mode == "resume") { + _eventAggregator.trigger("track_playing"); + } else { + _eventAggregator.trigger("track_paused"); + } + } +}); + +window.MixListView = Backbone.View.extend({ + initialize:function () { + this.render(); + }, + render:function () { + var mixes = this.collection; + var el = this.el; + $(this.el).html(this.template()).append('
      '); + this.collection.each(function (item) { + $('.mix-listing', el).append(new MixItemView({model:item}).render().el); + }); + var type = this.collection.type; + $('#' + type, this.el).parent().addClass('active'); + return this; + } +}); + +window.MixView = Backbone.View.extend({ + initialize:function () { + this.render(); + }, + render:function () { + $(this.el).html(this.template()); + var item = new MixItemView({model:this.model}).render(); + $('.mix-listing', this.el).append(item.el); + $('#mix-description', this.el).html(this.model.get("description")); + return this; + } +}); \ No newline at end of file diff --git a/static/js/app/views/release.js b/static/js/app/views/release.js new file mode 100644 index 0000000..1bd330c --- /dev/null +++ b/static/js/app/views/release.js @@ -0,0 +1,37 @@ +var ReleaseItemView = Backbone.View.extend({ + tagName:"li", + initialize:function () { + /*$(this.el).attr("id", "releaseitem-" + this.model.get("id")); + $(this.el).addClass("release-listing-item"); + $(this.el).data("id", this.model.get("id"));*/ + }, + render:function () { + $(this.el).html(this.template({"item":this.model.toJSON()})); + return this; + } +}); +var ReleaseListView = Backbone.View.extend({ + initialize:function () { + this.render(); + }, + render:function () { + $(this.el).html(this.template()).append('
        '); + var el = this.el; + this.collection.each(function (item) { + $('.release-listing', el).append(new ReleaseItemView({model:item}).render().el); + }); + return this; + } +}); +var ReleaseView = Backbone.View.extend({ + initialize:function () { + this.render(); + }, + render:function () { + $(this.el).html(this.template()); + var item = new ReleaseItemView({model:this.model}).render(); + $('.release-listing', this.el).append(item.el); + $('#release-description', this.el).html(this.model.get("description")); + return this; + } +}); \ No newline at end of file diff --git a/static/js/app/views/release_audio.js b/static/js/app/views/release_audio.js new file mode 100644 index 0000000..f03c2f1 --- /dev/null +++ b/static/js/app/views/release_audio.js @@ -0,0 +1,40 @@ +window.ReleaseAudioItemView = Backbone.View.extend({ + tagName:"li", + initialize:function () { + $(this.el).data("id", this.model.get("id")); + $(this.el).addClass("release-audio-entry"); + }, + render:function () { + $(this.el).html(this.template({"item":this.model.toJSON()})); + return this; + } +}); +window.ReleaseAudioListView = Backbone.View.extend({ + initialize:function () { + this.render(); + + }, + events: { + "click a": "clicked" + }, + clicked: function(e){ + e.preventDefault(); + this.renderItem($(e.currentTarget).attr("id")); + }, + render:function () { + $(this.el).html(this.template()).append('
          '); + var i=0; + this.collection.each(function (item) { + $('#release-audio-slide-nav', this.el).append('
        • ' + (i) + '
        • '); + }, this); + this.renderItem(0); + return this; + }, + renderItem: function(id){ + $('.release-audio-listing', this.el).empty(); + $('#' + id, this.el).blur(); + $('#' + id, this.el).addClass('on'); + $('a:not([id="' + id + '"]', this.el).removeClass('on'); + $('.release-audio-listing', this.el).append(new ReleaseAudioItemView({model:this.collection.models[id]}).render().el); + } +}); diff --git a/static/js/app/views/sidebar.js b/static/js/app/views/sidebar.js new file mode 100644 index 0000000..e7c144f --- /dev/null +++ b/static/js/app/views/sidebar.js @@ -0,0 +1,16 @@ +/** + * Created with PyCharm. + * User: fergalm + * Date: 08/08/12 + * Time: 22:10 + * To change this template use File | Settings | File Templates. + */ +window.SidebarView = Backbone.View.extend({ + initialize: function(){ + this.render(); + }, + render: function(){ + $(this.el).html(this.template()); + return this; + } +}); \ No newline at end of file diff --git a/static/js/dss_sound_handler.js b/static/js/dss_sound_handler.js new file mode 100644 index 0000000..518bc17 --- /dev/null +++ b/static/js/dss_sound_handler.js @@ -0,0 +1,137 @@ +$(document).ready(function () { + soundManager.url = '/static/bin/sm/'; + soundManager.flashVersion = 10; + soundManager.debugMode = false; + soundManager.useHTML5Audio = true; +}); + +function DssSoundHandler() { + var _currentSound = null; + var _currentId = -1; + this.stop_sound = function () { + if (_currentSound) { + this.togglePlaying(this.getPlayingId()); + _currentSound.stop(); + _currentId = -1; + } + }; + this.getPlayingId = function () { + return _currentId; + }; + this.isPlaying = function () { + if (_currentSound != null) + return _currentSound.playState == 1; + }; + + this.togglePlaying = function (id) { + this.togglePlayState(id); + return this.togglePlayVisual(id); + }; + + this.togglePlayVisual = function (id) { + var button = $('#play-pause-button-small-' + id); + var mode = button.data("mode"); + if (mode == "play" || mode == "resume") { + button.data('mode', 'pause'); + button.removeClass('play-button-small-playing'); + button.addClass('play-button-small-paused'); + } else { + button.data('mode', 'resume'); + button.removeClass('play-button-small-paused'); + button.addClass('play-button-small-playing'); + } + return mode; + }; + this.togglePlayState = function (id) { + var button = $('#play-pause-button-small-' + id); + var mode = button.data("mode"); + if (mode == 'pause') + this.pauseSound(); + else if (mode == 'resume') + this.resumeSound(); + }; + this.playSound = (function (itemId, stream_url) { + + _currentId = itemId; + var waveformTop = $('#waveform-' + _currentId).position().top; + var waveformWidth = $('#waveform-' + _currentId).width(); + + $('#player-seekhead').css('top', waveformTop); + if (_currentSound) _currentSound.stop(); + soundManager.destroySound('current_sound'); + _currentSound = soundManager.createSound({ + id:'current_sound', + url:stream_url, + volume:50, + stream:true, + whileloading:function () { + var percentageFinished = (_currentSound.bytesLoaded / _currentSound.bytesTotal) * 100; + var percentageWidth = (waveformWidth / 100) * percentageFinished; + $('#progress-player-' + _currentId).css('width', percentageWidth); + }, + whileplaying:function () { + /* Should move to an aggregator viewChanged callback */ + waveformTop = $('#waveform-' + _currentId).position().top; + waveformWidth = $('#waveform-' + _currentId).width(); + $('#playhead-player-' + _currentId).css('top', waveformTop); + $('#progress-player-' + _currentId).css('top', waveformTop); + $('#player-seekhead').css('top', waveformTop); + + var currentPosition = _currentSound.position; + var totalLength = _currentSound.duration; + var percentageFinished = (currentPosition / totalLength) * 100; + var percentageWidth = (waveformWidth / 100) * percentageFinished; + $('#playhead-player-' + _currentId).css('width', percentageWidth); + } + }); + _currentSound.loaded = false; + _currentSound.readyState = 0; + dssSoundHandler._setupEvents(_currentId, _currentSound); + _currentSound.play(); + }); + this.playLive = function () { + this.stop_sound(); + _currentSound = soundManager.createSound({ + id:'current_sound', + url:'http://streams.deepsouthsounds.com:8000/live', + volume:50, + type:'audio/mp3' + }); + _currentSound.play(); + }; + this.pauseSound = function () { + this.togglePlaying(); + if (_currentSound) { + _currentSound.pause(); + } + }; + this.resumeSound = function () { + this.togglePlaying(); + if (_currentSound) + _currentSound.resume(); + }; + this.getPosition = function () { + if (_currentSound) + return _currentSound.position; + }; + this._setupEvents = function (itemId, sound) { + $('#waveform-' + itemId).mousemove(function (event) { + $('#player-seekhead').show(); + $('#player-seekhead').css('left', (event.pageX) + 'px').fadeIn('fast'); + }); + $('#waveform-' + itemId).mousedown(function (event) { + var width = $('#waveform-image-' + itemId).width(); + if (sound != null) { + var fullLength = sound.duration; + var left = $('#waveform-image-' + itemId).offset().left; + var clickPerc = ((event.pageX - left) / width) * 100; + sound.setPosition((fullLength / 100) * clickPerc); + } + }); + $('#waveform-' + itemId).mouseleave(function (event) { + $('#player-seekhead').hide(); + }); + }; +} +dssSoundHandler = new DssSoundHandler(); +window.dssSoundHandler = dssSoundHandler; diff --git a/static/js/libs/ICanHaz.js b/static/js/libs/ICanHaz.js new file mode 100644 index 0000000..c131265 --- /dev/null +++ b/static/js/libs/ICanHaz.js @@ -0,0 +1,543 @@ +/*! + ICanHaz.js version 0.10 -- by @HenrikJoreteg + More info at: http://icanhazjs.com + */ +(function () { + /* + mustache.js — Logic-less templates in JavaScript + + See http://mustache.github.com/ for more info. + */ + + var Mustache = function () { + var _toString = Object.prototype.toString; + + Array.isArray = Array.isArray || function (obj) { + return _toString.call(obj) == "[object Array]"; + } + + var _trim = String.prototype.trim, trim; + + if (_trim) { + trim = function (text) { + return text == null ? "" : _trim.call(text); + } + } else { + var trimLeft, trimRight; + + // IE doesn't match non-breaking spaces with \s. + if ((/\S/).test("\xA0")) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; + } else { + trimLeft = /^\s+/; + trimRight = /\s+$/; + } + + trim = function (text) { + return text == null ? "" : + text.toString().replace(trimLeft, "").replace(trimRight, ""); + } + } + + var escapeMap = { + "&":"&", + "<":"<", + ">":">", + '"':'"', + "'":''' + }; + + function escapeHTML(string) { + return String(string).replace(/&(?!\w+;)|[<>"']/g, function (s) { + return escapeMap[s] || s; + }); + } + + var regexCache = {}; + var Renderer = function () { + }; + + Renderer.prototype = { + otag:"{{", + ctag:"}}", + pragmas:{}, + buffer:[], + pragmas_implemented:{ + "IMPLICIT-ITERATOR":true + }, + context:{}, + + render:function (template, context, partials, in_recursion) { + // reset buffer & set context + if (!in_recursion) { + this.context = context; + this.buffer = []; // TODO: make this non-lazy + } + + // fail fast + if (!this.includes("", template)) { + if (in_recursion) { + return template; + } else { + this.send(template); + return; + } + } + + // get the pragmas together + template = this.render_pragmas(template); + + // render the template + var html = this.render_section(template, context, partials); + + // render_section did not find any sections, we still need to render the tags + if (html === false) { + html = this.render_tags(template, context, partials, in_recursion); + } + + if (in_recursion) { + return html; + } else { + this.sendLines(html); + } + }, + + /* + Sends parsed lines + */ + send:function (line) { + if (line !== "") { + this.buffer.push(line); + } + }, + + sendLines:function (text) { + if (text) { + var lines = text.split("\n"); + for (var i = 0; i < lines.length; i++) { + this.send(lines[i]); + } + } + }, + + /* + Looks for %PRAGMAS + */ + render_pragmas:function (template) { + // no pragmas + if (!this.includes("%", template)) { + return template; + } + + var that = this; + var regex = this.getCachedRegex("render_pragmas", function (otag, ctag) { + return new RegExp(otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" + ctag, "g"); + }); + + return template.replace(regex, function (match, pragma, options) { + if (!that.pragmas_implemented[pragma]) { + throw({message:"This implementation of mustache doesn't understand the '" + + pragma + "' pragma"}); + } + that.pragmas[pragma] = {}; + if (options) { + var opts = options.split("="); + that.pragmas[pragma][opts[0]] = opts[1]; + } + return ""; + // ignore unknown pragmas silently + }); + }, + + /* + Tries to find a partial in the curent scope and render it + */ + render_partial:function (name, context, partials) { + name = trim(name); + if (!partials || partials[name] === undefined) { + throw({message:"unknown_partial '" + name + "'"}); + } + if (!context || typeof context[name] != "object") { + return this.render(partials[name], context, partials, true); + } + return this.render(partials[name], context[name], partials, true); + }, + + /* + Renders inverted (^) and normal (#) sections + */ + render_section:function (template, context, partials) { + if (!this.includes("#", template) && !this.includes("^", template)) { + // did not render anything, there were no sections + return false; + } + + var that = this; + + var regex = this.getCachedRegex("render_section", function (otag, ctag) { + // This regex matches _the first_ section ({{#foo}}{{/foo}}), and captures the remainder + return new RegExp( + "^([\\s\\S]*?)" + // all the crap at the beginning that is not {{*}} ($1) + + otag + // {{ + "(\\^|\\#)\\s*(.+)\\s*" + // #foo (# == $2, foo == $3) + ctag + // }} + + "\n*([\\s\\S]*?)" + // between the tag ($2). leading newlines are dropped + + otag + // {{ + "\\/\\s*\\3\\s*" + // /foo (backreference to the opening tag). + ctag + // }} + + "\\s*([\\s\\S]*)$", // everything else in the string ($4). leading whitespace is dropped. + + "g"); + }); + + + // for each {{#foo}}{{/foo}} section do... + return template.replace(regex, function (match, before, type, name, content, after) { + // before contains only tags, no sections + var renderedBefore = before ? that.render_tags(before, context, partials, true) : "", + + // after may contain both sections and tags, so use full rendering function + renderedAfter = after ? that.render(after, context, partials, true) : "", + + // will be computed below + renderedContent, + + value = that.find(name, context); + + if (type === "^") { // inverted section + if (!value || Array.isArray(value) && value.length === 0) { + // false or empty list, render it + renderedContent = that.render(content, context, partials, true); + } else { + renderedContent = ""; + } + } else if (type === "#") { // normal section + if (Array.isArray(value)) { // Enumerable, Let's loop! + renderedContent = that.map(value,function (row) { + return that.render(content, that.create_context(row), partials, true); + }).join(""); + } else if (that.is_object(value)) { // Object, Use it as subcontext! + renderedContent = that.render(content, that.create_context(value), + partials, true); + } else if (typeof value == "function") { + // higher order section + renderedContent = value.call(context, content, function (text) { + return that.render(text, context, partials, true); + }); + } else if (value) { // boolean section + renderedContent = that.render(content, context, partials, true); + } else { + renderedContent = ""; + } + } + + return renderedBefore + renderedContent + renderedAfter; + }); + }, + + /* + Replace {{foo}} and friends with values from our view + */ + render_tags:function (template, context, partials, in_recursion) { + // tit for tat + var that = this; + + var new_regex = function () { + return that.getCachedRegex("render_tags", function (otag, ctag) { + return new RegExp(otag + "(=|!|>|&|\\{|%)?([^#\\^]+?)\\1?" + ctag + "+", "g"); + }); + }; + + var regex = new_regex(); + var tag_replace_callback = function (match, operator, name) { + switch (operator) { + case "!": // ignore comments + return ""; + case "=": // set new delimiters, rebuild the replace regexp + that.set_delimiters(name); + regex = new_regex(); + return ""; + case ">": // render partial + return that.render_partial(name, context, partials); + case "{": // the triple mustache is unescaped + case "&": // & operator is an alternative unescape method + return that.find(name, context); + default: // escape the value + return escapeHTML(that.find(name, context)); + } + }; + var lines = template.split("\n"); + for (var i = 0; i < lines.length; i++) { + lines[i] = lines[i].replace(regex, tag_replace_callback, this); + if (!in_recursion) { + this.send(lines[i]); + } + } + + if (in_recursion) { + return lines.join("\n"); + } + }, + + set_delimiters:function (delimiters) { + var dels = delimiters.split(" "); + this.otag = this.escape_regex(dels[0]); + this.ctag = this.escape_regex(dels[1]); + }, + + escape_regex:function (text) { + // thank you Simon Willison + if (!arguments.callee.sRE) { + var specials = [ + '/', '.', '*', '+', '?', '|', + '(', ')', '[', ']', '{', '}', '\\' + ]; + arguments.callee.sRE = new RegExp( + '(\\' + specials.join('|\\') + ')', 'g' + ); + } + return text.replace(arguments.callee.sRE, '\\$1'); + }, + + /* + find `name` in current `context`. That is find me a value + from the view object + */ + find:function (name, context) { + name = trim(name); + + // Checks whether a value is thruthy or false or 0 + function is_kinda_truthy(bool) { + return bool === false || bool === 0 || bool; + } + + var value; + + // check for dot notation eg. foo.bar + if (name.match(/([a-z_]+)\./ig)) { + var childValue = this.walk_context(name, context); + if (is_kinda_truthy(childValue)) { + value = childValue; + } + } else { + if (is_kinda_truthy(context[name])) { + value = context[name]; + } else if (is_kinda_truthy(this.context[name])) { + value = this.context[name]; + } + } + + if (typeof value == "function") { + return value.apply(context); + } + if (value !== undefined) { + return value; + } + // silently ignore unkown variables + return ""; + }, + + walk_context:function (name, context) { + var path = name.split('.'); + // if the var doesn't exist in current context, check the top level context + var value_context = (context[path[0]] != undefined) ? context : this.context; + var value = value_context[path.shift()]; + while (value != undefined && path.length > 0) { + value_context = value; + value = value[path.shift()]; + } + // if the value is a function, call it, binding the correct context + if (typeof value == "function") { + return value.apply(value_context); + } + return value; + }, + + // Utility methods + + /* includes tag */ + includes:function (needle, haystack) { + return haystack.indexOf(this.otag + needle) != -1; + }, + + // by @langalex, support for arrays of strings + create_context:function (_context) { + if (this.is_object(_context)) { + return _context; + } else { + var iterator = "."; + if (this.pragmas["IMPLICIT-ITERATOR"]) { + iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator; + } + var ctx = {}; + ctx[iterator] = _context; + return ctx; + } + }, + + is_object:function (a) { + return a && typeof a == "object"; + }, + + /* + Why, why, why? Because IE. Cry, cry cry. + */ + map:function (array, fn) { + if (typeof array.map == "function") { + return array.map(fn); + } else { + var r = []; + var l = array.length; + for (var i = 0; i < l; i++) { + r.push(fn(array[i])); + } + return r; + } + }, + + getCachedRegex:function (name, generator) { + var byOtag = regexCache[this.otag]; + if (!byOtag) { + byOtag = regexCache[this.otag] = {}; + } + + var byCtag = byOtag[this.ctag]; + if (!byCtag) { + byCtag = byOtag[this.ctag] = {}; + } + + var regex = byCtag[name]; + if (!regex) { + regex = byCtag[name] = generator(this.otag, this.ctag); + } + + return regex; + } + }; + + return({ + name:"mustache.js", + version:"0.4.0", + + /* + Turns a template and view into HTML + */ + to_html:function (template, view, partials, send_fun) { + var renderer = new Renderer(); + if (send_fun) { + renderer.send = send_fun; + } + renderer.render(template, view || {}, partials); + if (!send_fun) { + return renderer.buffer.join("\n"); + } + } + }); + }(); + /*! + ICanHaz.js -- by @HenrikJoreteg + */ + /*global */ + (function () { + function trim(stuff) { + if (''.trim) return stuff.trim(); + else return stuff.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + var ich = { + VERSION:"0.10", + templates:{}, + + // grab jquery or zepto if it's there + $:(typeof window !== 'undefined') ? window.jQuery || window.Zepto || null : null, + + // public function for adding templates + // can take a name and template string arguments + // or can take an object with name/template pairs + // We're enforcing uniqueness to avoid accidental template overwrites. + // If you want a different template, it should have a different name. + addTemplate:function (name, templateString) { + if (typeof name === 'object') { + for (var template in name) { + this.addTemplate(template, name[template]); + } + return; + } + if (ich[name]) { + console.error("Invalid name: " + name + "."); + } else if (ich.templates[name]) { + console.error("Template \"" + name + " \" exists"); + } else { + ich.templates[name] = templateString; + ich[name] = function (data, raw) { + data = data || {}; + var result = Mustache.to_html(ich.templates[name], data, ich.templates); + return (ich.$ && !raw) ? ich.$(result) : result; + }; + } + }, + + // clears all retrieval functions and empties cache + clearAll:function () { + for (var key in ich.templates) { + delete ich[key]; + } + ich.templates = {}; + }, + + // clears/grabs + refresh:function () { + ich.clearAll(); + ich.grabTemplates(); + }, + + // grabs templates from the DOM and caches them. + // Loop through and add templates. + // Whitespace at beginning and end of all templates inside +{% endblock %} diff --git a/templates/account/login.html b/templates/account/login.html new file mode 100644 index 0000000..38d51ee --- /dev/null +++ b/templates/account/login.html @@ -0,0 +1,53 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account_tags %} +{% load url from future %} + +{% block head_title %}{% trans "Sign In" %}{% endblock %} + + +{% block content %} + +

          {% trans "Sign In" %}

          + +{% if not user.is_authenticated %} + +{% if socialaccount.providers %} +

          {% blocktrans with site.name as site_name %}Please sign in with one +of your existing third party accounts. Or, sign up for a {{site_name}} account and sign in +below:{% endblocktrans %}

          + +
          + +
            +{% include "socialaccount/snippets/provider_list.html" %} +
          + + + +
          + +{% include "socialaccount/snippets/login_extra.html" %} + +{% endif %} +{% endif %} + + + +{% if user.is_authenticated %} +{% include "account/snippets/already_logged_in.html" %} +{% endif %} + + +{% endblock %} + diff --git a/templates/account/logout.html b/templates/account/logout.html new file mode 100644 index 0000000..da8f7a2 --- /dev/null +++ b/templates/account/logout.html @@ -0,0 +1,19 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Signed Out" %}{% endblock %} + +{% block content %} +

          {% trans "Signed Out" %}

          + +

          {% trans "You have signed out." %}

          +{% endblock %} + +{% block footerscripts %} + +{% endblock %} \ No newline at end of file diff --git a/templates/account/password_change.html b/templates/account/password_change.html new file mode 100644 index 0000000..cf3d7b1 --- /dev/null +++ b/templates/account/password_change.html @@ -0,0 +1,14 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% block head_title %}{% trans "Change Password" %}{% endblock %} + +{% block content %} +

          {% trans "Change Password" %}

          + +
          + {% csrf_token %} + {{ password_change_form.as_p }} + +
          +{% endblock %} diff --git a/templates/account/password_delete.html b/templates/account/password_delete.html new file mode 100644 index 0000000..ade1c48 --- /dev/null +++ b/templates/account/password_delete.html @@ -0,0 +1,14 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Delete Password" %}{% endblock %} + +{% block content %} +

          {% trans "Delete Password" %}

          +

          {% blocktrans %}You may delete your password since you are currently logged in using OpenID.{% endblocktrans %}

          +
          + {% csrf_token %} + +
          +{% endblock %} diff --git a/templates/account/password_delete_done.html b/templates/account/password_delete_done.html new file mode 100644 index 0000000..5b23700 --- /dev/null +++ b/templates/account/password_delete_done.html @@ -0,0 +1,10 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Password Deleted" %}{% endblock %} + +{% block content %} +

          {% trans "Password Deleted" %}

          +

          {% blocktrans %}Your password has been deleted.{% endblocktrans %}

          +{% endblock %} diff --git a/templates/account/password_reset.html b/templates/account/password_reset.html new file mode 100644 index 0000000..92ac0d0 --- /dev/null +++ b/templates/account/password_reset.html @@ -0,0 +1,30 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account_tags %} + +{% block head_title %}{% trans "Password Reset" %}{% endblock %} + +{% block content %} + +

          {% trans "Password Reset" %}

          + {% if user.is_authenticated %} + {% include "account/snippets/already_logged_in.html" %} + {% endif %} + +

          {% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}

          + +
          + {% csrf_token %} + {{ password_reset_form.as_p }} + +
          + +

          {% blocktrans %}If you have any trouble resetting your password, contact us at {{ CONTACT_EMAIL }}.{% endblocktrans %}

          +{% endblock %} + +{% block extra_body %} + +{% endblock %} diff --git a/templates/account/password_reset_done.html b/templates/account/password_reset_done.html new file mode 100644 index 0000000..c9d946c --- /dev/null +++ b/templates/account/password_reset_done.html @@ -0,0 +1,16 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account_tags %} + +{% block head_title %}{% trans "Password Reset" %}{% endblock %} + +{% block content %} +

          {% trans "Password Reset" %}

          + + {% if user.is_authenticated %} + {% include "account/snippets/already_logged_in.html" %} + {% endif %} + +

          {% blocktrans %}We have sent you an e-mail. If you do not receive it within a few minutes, contact us at {{ CONTACT_EMAIL }}.{% endblocktrans %}

          +{% endblock %} diff --git a/templates/account/password_reset_from_key.html b/templates/account/password_reset_from_key.html new file mode 100644 index 0000000..1c93c40 --- /dev/null +++ b/templates/account/password_reset_from_key.html @@ -0,0 +1,24 @@ +{% extends "account/base.html" %} + +{% load url from future %} +{% load i18n %} +{% block head_title %}{% trans "Change Password" %}{% endblock %} + +{% block content %} +

          {% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}

          + + {% if token_fail %} + {% url 'account_reset_password' as passwd_reset_url %} +

          {% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a new password reset.{% endblocktrans %}

          + {% else %} + {% if form %} +
          + {% csrf_token %} + {{ form.as_p }} + +
          + {% else %} +

          {% trans 'Your password is now changed.' %}

          + {% endif %} + {% endif %} +{% endblock %} diff --git a/templates/account/password_reset_key_message.txt b/templates/account/password_reset_key_message.txt new file mode 100644 index 0000000..1a39222 --- /dev/null +++ b/templates/account/password_reset_key_message.txt @@ -0,0 +1,9 @@ +{% load i18n %}{% blocktrans with site.domain as site_domain and user.username as username %}You're receiving this e-mail because you or someone else has requested a password for your user account at {{site_domain}}. +It can be safely ignored if you did not request a password reset. Click the link below to reset your password. + +{{password_reset_url}} + +In case you forgot, your username is {{username}}. + +Thanks for using our site! +{% endblocktrans %} diff --git a/templates/account/password_set.html b/templates/account/password_set.html new file mode 100644 index 0000000..cf14619 --- /dev/null +++ b/templates/account/password_set.html @@ -0,0 +1,15 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Set Password" %}{% endblock %} + +{% block content %} +

          {% trans "Set Password" %}

          + +
          + {% csrf_token %} + {{ password_set_form.as_p }} + +
          +{% endblock %} diff --git a/templates/account/registration_form.html b/templates/account/registration_form.html new file mode 100644 index 0000000..4390572 --- /dev/null +++ b/templates/account/registration_form.html @@ -0,0 +1,6 @@ +{%extends "base.html" %} +{% load crispy_forms_tags %} + +{% block content %} + {% crispy form %} +{% endblock %} \ No newline at end of file diff --git a/templates/account/signup.html b/templates/account/signup.html new file mode 100644 index 0000000..4b80968 --- /dev/null +++ b/templates/account/signup.html @@ -0,0 +1,28 @@ +{% extends "account/base.html" %} + +{% load url from future %} +{% load i18n %} + +{% block head_title %}{% trans "Signup" %}{% endblock %} + +{% block content %} +

          {% trans "Sign Up" %}

          + + {% if user.is_authenticated %} +{% include "account/snippets/already_logged_in.html" %} + {% else %} +

          {% blocktrans %}Already have an account? Then please sign in.{% endblocktrans %}

          + + + + {% endif %} +{% endblock %} + + diff --git a/templates/account/snippets/already_logged_in.html b/templates/account/snippets/already_logged_in.html new file mode 100644 index 0000000..d038ef5 --- /dev/null +++ b/templates/account/snippets/already_logged_in.html @@ -0,0 +1,5 @@ +{% load i18n %} +{% load account_tags %} + +{% user_display user as user_display %} +

          {% trans "Note" %}: {% blocktrans %}you are already logged in as {{ user_display }}.{% endblocktrans %}

          diff --git a/templates/account/user_details.html b/templates/account/user_details.html new file mode 100644 index 0000000..bc3a1da --- /dev/null +++ b/templates/account/user_details.html @@ -0,0 +1,22 @@ +{%extends "base.html" %} +{% load crispy_forms_tags %} +{% block scripts %} + + + +{% endblock %} +{% block content %} +{% crispy form form.helper %} +{% endblock %} \ No newline at end of file diff --git a/templates/account/verification_sent.html b/templates/account/verification_sent.html new file mode 100644 index 0000000..c59655c --- /dev/null +++ b/templates/account/verification_sent.html @@ -0,0 +1,12 @@ +{% extends "account/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} + +{% block content %} +

          {% trans "Verify Your E-mail Address" %}

          + +

          {% blocktrans %}We have sent you an e-mail to {{ email }} for verification. Follow the link provided to finalize the signup process. If you do not receive it within a few minutes, contact us at {{ CONTACT_EMAIL }}.{% endblocktrans %}

          + +{% endblock %} diff --git a/templates/account/verified_email_required.html b/templates/account/verified_email_required.html new file mode 100644 index 0000000..634355c --- /dev/null +++ b/templates/account/verified_email_required.html @@ -0,0 +1,26 @@ +{% extends "account/base.html" %} + +{% load url from future %} +{% load i18n %} + +{% block head_title %}{% trans "Verify Your E-mail Address" %}{% endblock %} + +{% block content %} +

          {% trans "Verify Your E-mail Address" %}

          + +{% url 'account_email' as email_url %} + +

          {% blocktrans %}This part of the site requires us to verify that +you are who you claim to be. For this purpose, we require that you +verify ownership of your e-mail address. {% endblocktrans %}

          + +

          {% blocktrans %}We have sent an e-mail to you for +verification. Please click on the link inside this +e-mail. If you do not receive it within a few minutes, contact us +at {{ CONTACT_EMAIL }}. +{% endblocktrans %}

          + +

          {% blocktrans %}Note: you can still change your e-mail address.{% endblocktrans %}

          + + +{% endblock %} diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..9fc0ed3 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,87 @@ + + + + + + + + + + Deep South Sounds + + + + + + + + + + + + + + + + + + + +{% include 'inc/ancient_browser.html' %} +
          +
          + +
          +
          + +
          +
          +
          + {% block content %} + + {% endblock %} +
          +
          + {% block sidecontent %} + + {% endblock %} + +
          +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + +{% block footerscripts %} +{% endblock %} + + + \ No newline at end of file diff --git a/templates/emailconfirmation/confirm_email.html b/templates/emailconfirmation/confirm_email.html new file mode 100644 index 0000000..f696e13 --- /dev/null +++ b/templates/emailconfirmation/confirm_email.html @@ -0,0 +1,20 @@ +{% extends "account/base.html" %} + +{% load i18n %} +{% load account_tags %} + +{% block head_title %}{% trans "E-mail Address Confirmation" %}{% endblock %} + + +{% block content %} + {% user_display email_address.user as user_display %} + +

          {% trans "E-mail Address Confirmation" %}

          + + {% if email_address %} + +

          {% blocktrans with email_address.email as email %}You have confirmed that {{ email }} is an e-mail address for user {{ user_display }}.{% endblocktrans %}

          + {% else %} +

          {% trans "Invalid confirmation key." %}

          + {% endif %} +{% endblock %} diff --git a/templates/emailconfirmation/email_confirmation_message.txt b/templates/emailconfirmation/email_confirmation_message.txt new file mode 100644 index 0000000..13b4257 --- /dev/null +++ b/templates/emailconfirmation/email_confirmation_message.txt @@ -0,0 +1,4 @@ +{% load account_tags %}{% user_display user as user_display %}{% load i18n %}{% autoescape off %}{% blocktrans with current_site.name as site_name %}User {{ user_display }} at {{ site_name }} has given this as an email address. + +To confirm this is correct, go to {{ activate_url }} +{% endblocktrans %}{% endautoescape %} diff --git a/templates/emailconfirmation/email_confirmation_subject.txt b/templates/emailconfirmation/email_confirmation_subject.txt new file mode 100644 index 0000000..605a924 --- /dev/null +++ b/templates/emailconfirmation/email_confirmation_subject.txt @@ -0,0 +1,5 @@ +{% load i18n %}{% autoescape off %}[{{current_site.name}}] {% blocktrans %}Confirm E-mail Address{% endblocktrans %}{% endautoescape %}{% comment %} +Local Variables: +require-final-newline: nil; +End: +{% endcomment %} \ No newline at end of file diff --git a/templates/inc/_MixItemInsert.html b/templates/inc/_MixItemInsert.html new file mode 100644 index 0000000..8333fa4 --- /dev/null +++ b/templates/inc/_MixItemInsert.html @@ -0,0 +1,69 @@ +
          + {% if model.has_image %} +
          +
          + mix-logo +
          +
          + {% endif %} +
          + +
          + +
          + Waveform generating... Stall the balls and check back later. + +
          +
          +
          +
          + +
          +
          diff --git a/templates/inc/ancient_browser.html b/templates/inc/ancient_browser.html new file mode 100644 index 0000000..8fa3cc2 --- /dev/null +++ b/templates/inc/ancient_browser.html @@ -0,0 +1,3 @@ + diff --git a/templates/inc/app.html b/templates/inc/app.html new file mode 100644 index 0000000..b32f008 --- /dev/null +++ b/templates/inc/app.html @@ -0,0 +1,17 @@ +{% extends 'base.html' %} +{% block footerscripts %} + +{% endblock %} + +{% block content %} +
          + +
          + +
          + +
          +{% endblock %} + +{% block sidecontent %} +{% endblock %} \ No newline at end of file diff --git a/templates/inc/comment_list.html b/templates/inc/comment_list.html new file mode 100644 index 0000000..cab47d3 --- /dev/null +++ b/templates/inc/comment_list.html @@ -0,0 +1,15 @@ +
          + + + + +
          + + <%= item.user_name %> + +
          +

          <%= item.comment %>

          + <%= item.date_created %> +
          +
          +
          diff --git a/templates/inc/mix_edit_toolbar.html b/templates/inc/mix_edit_toolbar.html new file mode 100644 index 0000000..b764f4a --- /dev/null +++ b/templates/inc/mix_edit_toolbar.html @@ -0,0 +1,74 @@ + + + +
          +
          + + Play + + {% if model.user.user == user %} + + + + {% endif %} +
          +
          diff --git a/templates/inc/track_player_ajax.html b/templates/inc/track_player_ajax.html new file mode 100644 index 0000000..e69de29 diff --git a/templates/inc/twitter.html b/templates/inc/twitter.html new file mode 100644 index 0000000..558ac47 --- /dev/null +++ b/templates/inc/twitter.html @@ -0,0 +1,41 @@ + + + + \ No newline at end of file diff --git a/templates/openid/base.html b/templates/openid/base.html new file mode 100644 index 0000000..7e8ac08 --- /dev/null +++ b/templates/openid/base.html @@ -0,0 +1 @@ +{% extends "socialaccount/base.html" %} diff --git a/templates/openid/login.html b/templates/openid/login.html new file mode 100644 index 0000000..e0900c7 --- /dev/null +++ b/templates/openid/login.html @@ -0,0 +1,19 @@ +{% extends "openid/base.html" %} + +{% load url from future %} +{% load i18n %} + +{% block head_title %}OpenID Sign In{% endblock %} + +{% block content %} + +

          {% trans 'OpenID Sign In' %}

          + + + + +{% endblock %} diff --git a/templates/socialaccount/account_inactive.html b/templates/socialaccount/account_inactive.html new file mode 100644 index 0000000..9d295e4 --- /dev/null +++ b/templates/socialaccount/account_inactive.html @@ -0,0 +1,11 @@ +{% extends "socialaccount/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Account Inactive" %}{% endblock %} + +{% block content %} +

          {% trans "Account Inactive" %}

          + +

          {% trans "This account is inactive." %}

          +{% endblock %} diff --git a/templates/socialaccount/authentication_error.html b/templates/socialaccount/authentication_error.html new file mode 100644 index 0000000..ae11a5e --- /dev/null +++ b/templates/socialaccount/authentication_error.html @@ -0,0 +1,11 @@ +{% extends "socialaccount/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Social Network Login Failure" %}{% endblock %} + +{% block content %} +

          {% trans "Social Network Login Failure" %}

          + +

          {% trans "An error occured while attempting to login via your social network account." %}

          +{% endblock %} diff --git a/templates/socialaccount/base.html b/templates/socialaccount/base.html new file mode 100644 index 0000000..0f400ed --- /dev/null +++ b/templates/socialaccount/base.html @@ -0,0 +1,2 @@ +{% extends "account/base.html" %} + diff --git a/templates/socialaccount/connections.html b/templates/socialaccount/connections.html new file mode 100644 index 0000000..9de05ac --- /dev/null +++ b/templates/socialaccount/connections.html @@ -0,0 +1,56 @@ +{% extends "socialaccount/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Account Connections" %}{% endblock %} + +{% block content %} +

          {% trans "Account Connections" %}

          + +{% if form.accounts %} +

          {% blocktrans %}You can sign in to your account using any of the following third party accounts:{% endblocktrans %}

          + + +
          +{% csrf_token %} + +
          +{% if form.non_field_errors %} +
          {{form.non_field_errors}}
          +{% endif %} + +{% for base_account in form.accounts %} +{% with base_account.get_provider_account as account %} +
          + +
          +{% endwith %} +{% endfor %} + +
          + +
          + +
          + +
          + +{% else %} +

          You currently have no social network accounts connected to this account.

          +{% endif %} + +

          {% trans 'Add a 3rd Party Account' %}

          + +
            +{% include "socialaccount/snippets/provider_list.html" %} +
          + +{% include "socialaccount/snippets/login_extra.html" %} + +{% endblock %} + + diff --git a/templates/socialaccount/login_cancelled.html b/templates/socialaccount/login_cancelled.html new file mode 100644 index 0000000..74be043 --- /dev/null +++ b/templates/socialaccount/login_cancelled.html @@ -0,0 +1,17 @@ +{% extends "socialaccount/base.html" %} + +{% load url from future %} +{% load i18n %} + +{% block head_title %}{% trans "Login Cancelled" %}{% endblock %} + +{% block content %} + +

          {% trans "Login Cancelled" %}

          + +{% url 'socialaccount_login' as login_url %} + +

          {% blocktrans %}You decided to cancel logging in to our site using one of your exisiting accounts. If this was a mistake, please proceed to sign in.{% endblocktrans %}

          + +{% endblock %} + diff --git a/templates/socialaccount/signup.html b/templates/socialaccount/signup.html new file mode 100644 index 0000000..b854ef9 --- /dev/null +++ b/templates/socialaccount/signup.html @@ -0,0 +1,25 @@ +{% extends "socialaccount/base.html" %} + +{% load i18n %} + +{% block head_title %}{% trans "Signup" %}{% endblock %} + +{% block content %} +

          {% trans "Sign Up" %}

          + +

          {% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to +{{site_name}}. As a final step, please complete the following form:{% endblocktrans %}

          + + + + +{% endblock %} + + diff --git a/templates/socialaccount/snippets/login_extra.html b/templates/socialaccount/snippets/login_extra.html new file mode 100644 index 0000000..4dfecaf --- /dev/null +++ b/templates/socialaccount/snippets/login_extra.html @@ -0,0 +1,4 @@ +{% load socialaccount_tags %} + +{% providers_media_js %} + diff --git a/templates/socialaccount/snippets/provider_list.html b/templates/socialaccount/snippets/provider_list.html new file mode 100644 index 0000000..ed637d1 --- /dev/null +++ b/templates/socialaccount/snippets/provider_list.html @@ -0,0 +1,19 @@ +{% load socialaccount_tags %} + +{% for provider in socialaccount.providers %} +{% if provider.id == "openid" %} +{% for brand in provider.get_brands %} +
        • + {{brand.name}} +
        • +{% endfor %} +{% endif %} +
        • + {{provider.name}} +
        • +{% endfor %} + diff --git a/templates/views/CommentItemView.html b/templates/views/CommentItemView.html new file mode 100644 index 0000000..cab47d3 --- /dev/null +++ b/templates/views/CommentItemView.html @@ -0,0 +1,15 @@ +
          + + + + +
          + + <%= item.user_name %> + +
          +

          <%= item.comment %>

          + <%= item.date_created %> +
          +
          +
          diff --git a/templates/views/CommentListView.html b/templates/views/CommentListView.html new file mode 100644 index 0000000..26781dd --- /dev/null +++ b/templates/views/CommentListView.html @@ -0,0 +1,12 @@ +
          + {% if request.user.is_authenticated %} +
          + + +
          + {% else %} +

          Please login to add comments

          + {% endif %} +
          +

          Comments

          +
          diff --git a/templates/views/HeaderView.html b/templates/views/HeaderView.html new file mode 100644 index 0000000..bd6f815 --- /dev/null +++ b/templates/views/HeaderView.html @@ -0,0 +1,47 @@ +{% load account_tags %} + diff --git a/templates/views/LoginView.html b/templates/views/LoginView.html new file mode 100644 index 0000000..1121141 --- /dev/null +++ b/templates/views/LoginView.html @@ -0,0 +1,46 @@ + + +{% load socialaccount_tags %} + +
          +

          Login to Deep South Sounds

          +
          + +
          +
          + + {% include "socialaccount/snippets/login_extra.html" %} +
          + {% csrf_token %} + {% if form.errors %} +

          Warning!

          + Unknown username or password. +
          + {% endif %} +
          +
          + + +
          + +
          + + +
          + +
          + +
          +
          +
          + Sign up +
          \ No newline at end of file diff --git a/templates/views/MixItemView.html b/templates/views/MixItemView.html new file mode 100644 index 0000000..9ff79b3 --- /dev/null +++ b/templates/views/MixItemView.html @@ -0,0 +1 @@ +{% include 'inc/_MixItemInsert.html' %} \ No newline at end of file diff --git a/templates/views/MixListView.html b/templates/views/MixListView.html new file mode 100644 index 0000000..571b63d --- /dev/null +++ b/templates/views/MixListView.html @@ -0,0 +1,8 @@ + +
          \ No newline at end of file diff --git a/templates/views/MixView.html b/templates/views/MixView.html new file mode 100644 index 0000000..48b8777 --- /dev/null +++ b/templates/views/MixView.html @@ -0,0 +1,4 @@ +
          +
            +
            +
            diff --git a/templates/views/ReleaseAudioItemView.html b/templates/views/ReleaseAudioItemView.html new file mode 100644 index 0000000..8ac6720 --- /dev/null +++ b/templates/views/ReleaseAudioItemView.html @@ -0,0 +1,2 @@ +{% include 'inc/_MixItemInsert.html' %} +
          • <%= item.description %>
          • diff --git a/templates/views/ReleaseAudioListView.html b/templates/views/ReleaseAudioListView.html new file mode 100644 index 0000000..d195fcd --- /dev/null +++ b/templates/views/ReleaseAudioListView.html @@ -0,0 +1,110 @@ + +
            +
              +
            +
            \ No newline at end of file diff --git a/templates/views/ReleaseItemView.html b/templates/views/ReleaseItemView.html new file mode 100644 index 0000000..b8a6a6e --- /dev/null +++ b/templates/views/ReleaseItemView.html @@ -0,0 +1,19 @@ +
            +
            +
            +

            + <%= item.release_date %> +  -  + <%= item.release_artist %>

            +
            +
            +
            +
            + +
            +
            + <%= item.release_description %> +
            +
            +
            +
            \ No newline at end of file diff --git a/templates/views/ReleaseListView.html b/templates/views/ReleaseListView.html new file mode 100644 index 0000000..20f84f0 --- /dev/null +++ b/templates/views/ReleaseListView.html @@ -0,0 +1 @@ +
            \ No newline at end of file diff --git a/templates/views/ReleaseView.html b/templates/views/ReleaseView.html new file mode 100644 index 0000000..84e4d9b --- /dev/null +++ b/templates/views/ReleaseView.html @@ -0,0 +1,5 @@ +
            +
              +
              + +
              \ No newline at end of file diff --git a/templates/views/SidebarView.html b/templates/views/SidebarView.html new file mode 100644 index 0000000..eec58de --- /dev/null +++ b/templates/views/SidebarView.html @@ -0,0 +1 @@ +{% include 'inc/twitter.html' %} \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..12c335c --- /dev/null +++ b/utils.py @@ -0,0 +1,3 @@ +import os +def here(x): + return os.path.join(os.path.abspath(os.path.dirname(__file__)), x)