From c2e7e2ee4657854f3ccabeb5f63b3bf6ee188d46 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Thu, 25 Jul 2013 16:25:11 +0100 Subject: [PATCH] Added embedding --- spa/api/v1/MixResource.py | 7 +- spa/api/v1/UserResource.py | 41 +- spa/api/v1/auth.py | 16 + spa/embedding/__init__.py | 1 + spa/embedding/urls.py | 7 + spa/embedding/views.py | 34 + spa/management/commands/debugRelations.py | 5 +- spa/management/commands/import_favourites.py | 15 + spa/management/commands/import_likes.py | 15 + spa/models/mix.py | 28 +- spa/templates.py | 15 +- spa/urls.py | 3 + static/bin/flashmediaelement.swf | Bin 0 -> 28712 bytes static/bin/silverlightmediaelement.xap | Bin 0 -> 12461 bytes static/css/controls.svg | 1 + static/css/mediaelementplayer.css | 869 +++ static/css/mejs-skins.css | 289 + static/js/app/appv2.coffee | 13 +- static/js/app/appv2.js | 6 +- static/js/app/lib/controller.coffee | 4 +- static/js/app/lib/controller.js | 6 +- static/js/app/lib/social.coffee | 39 + static/js/app/lib/utils.js | 7 +- static/js/app/models/mix/mixCollection.coffee | 1 - static/js/app/models/mix/mixCollection.js | 9 +- static/js/app/social.js | 60 - static/js/app/views/mix/mixItemView.coffee | 2 +- static/js/app/views/mix/mixItemView.js | 22 +- static/js/jwplayer.html5.js | 196 + static/js/jwplayer.js | 80 + .../mediaelement/mediaelement-and-player.js | 5067 +++++++++++++++++ .../mediaelement-and-player.min.js | 173 + static/js/libs/mediaelement/mediaelement.js | 1902 +++++++ .../js/libs/mediaelement/mediaelement.min.js | 68 + .../libs/mediaelement/mediaelementplayer.js | 3163 ++++++++++ .../mediaelement/mediaelementplayer.min.js | 103 + templates/base.html | 1 - templates/inc/embed/mix.html | 24 + templates/views/UserListItemView.html | 10 +- templates/views/_MixItemInsert.html | 6 + templates/views/dlg/EmbedCodes.html | 14 + 41 files changed, 12191 insertions(+), 131 deletions(-) create mode 100644 spa/api/v1/auth.py create mode 100644 spa/embedding/__init__.py create mode 100644 spa/embedding/urls.py create mode 100644 spa/embedding/views.py create mode 100644 spa/management/commands/import_favourites.py create mode 100644 spa/management/commands/import_likes.py create mode 100644 static/bin/flashmediaelement.swf create mode 100644 static/bin/silverlightmediaelement.xap create mode 100644 static/css/controls.svg create mode 100644 static/css/mediaelementplayer.css create mode 100644 static/css/mejs-skins.css create mode 100644 static/js/app/lib/social.coffee delete mode 100755 static/js/app/social.js create mode 100644 static/js/jwplayer.html5.js create mode 100644 static/js/jwplayer.js create mode 100644 static/js/libs/mediaelement/mediaelement-and-player.js create mode 100644 static/js/libs/mediaelement/mediaelement-and-player.min.js create mode 100644 static/js/libs/mediaelement/mediaelement.js create mode 100644 static/js/libs/mediaelement/mediaelement.min.js create mode 100644 static/js/libs/mediaelement/mediaelementplayer.js create mode 100644 static/js/libs/mediaelement/mediaelementplayer.min.js create mode 100644 templates/inc/embed/mix.html create mode 100644 templates/views/dlg/EmbedCodes.html diff --git a/spa/api/v1/MixResource.py b/spa/api/v1/MixResource.py index 9d62903..db7316b 100755 --- a/spa/api/v1/MixResource.py +++ b/spa/api/v1/MixResource.py @@ -22,7 +22,10 @@ from spa.models.mix import Mix class MixResource(BackboneCompatibleResource): comments = fields.ToManyField('spa.api.v1.CommentResource.CommentResource', 'comments', null=True) favourites = fields.ToManyField('spa.api.v1.UserResource.UserResource', 'favourites', - related_name='favourites', full=True, null=True) + related_name='favourites', full=False, null=True) + + likes = fields.ToManyField('spa.api.v1.UserResource.UserResource', 'likes', + related_name='likes', full=False, null=True) class Meta: queryset = Mix.objects.filter(is_active=True) @@ -33,7 +36,7 @@ class MixResource(BackboneCompatibleResource): filtering = { 'comments': ALL_WITH_RELATIONS, 'favourites': ALL_WITH_RELATIONS, - 'activity_likes': ALL_WITH_RELATIONS + 'likes': ALL_WITH_RELATIONS, } authorization = Authorization() diff --git a/spa/api/v1/UserResource.py b/spa/api/v1/UserResource.py index ee497b3..b5fbec1 100755 --- a/spa/api/v1/UserResource.py +++ b/spa/api/v1/UserResource.py @@ -1,9 +1,11 @@ +from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.db.models import Count, Q from tastypie import fields -from tastypie.authentication import Authentication -from tastypie.authorization import DjangoAuthorization +from tastypie.authentication import Authentication, BasicAuthentication +from tastypie.authorization import DjangoAuthorization, Authorization from django.conf.urls import url from tastypie.constants import ALL +from tastypie.http import HttpGone, HttpMultipleChoices from tastypie.utils import trailing_slash from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource @@ -13,9 +15,11 @@ from spa.models.mix import Mix class UserResource(BackboneCompatibleResource): + followers = fields.ToManyField(to='self', attribute='followers', + related_name='followers', null=True) + class Meta: - queryset = UserProfile.objects.all().annotate(mix_count=Count('mixes'))\ - .extra(select={'u':'user'}).order_by('-mix_count') + queryset = UserProfile.objects.all().annotate(mix_count=Count('mixes')).order_by('-mix_count') favourites = fields.ToManyField('spa.api.v1.MixResource.MixResource', 'favourites', null=True) resource_name = 'user' excludes = ['is_active', 'is_staff', 'is_superuser', 'password'] @@ -23,8 +27,8 @@ class UserResource(BackboneCompatibleResource): filtering = { 'slug': ALL, } - authorization = DjangoAuthorization() - authentication = Authentication() + authorization = Authorization() + authentication = BasicAuthentication() favourites = fields.ToManyField('spa.api.v1.MixResource', 'favourites') def _hydrateBitmapOption(self, source, comparator): @@ -39,15 +43,10 @@ class UserResource(BackboneCompatibleResource): self.wrap_view('dispatch_detail'), name="api_dispatch_detail"), url(r"^(?P%s)/(?P[\w\d_.-]+)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"), + url(r"^(?P%s)/(?P\w[\w/-]*)/followers%s$" % (self._meta.resource_name, trailing_slash()), + self.wrap_view('get_followers'), name="api_get_followers"), ] - """ - Stub method, not actually needed just yet - but take heed of note below when implementing in the future - def apply_sorting(self, obj_list, options=None): - #apply the sort to the obj_list, not the super call - """ - def apply_filters(self, request, applicable_filters): semi_filtered = super(UserResource, self).apply_filters(request, applicable_filters) return semi_filtered @@ -77,6 +76,7 @@ class UserResource(BackboneCompatibleResource): bundle.obj.remove_follower(bundle.request.user.get_profile()) def obj_update(self, bundle, skip_errors=False, **kwargs): + """ This feels extremely hacky - but for some reason, deleting from the bundle in hydrate is not preventing the fields from being serialized at the ORM @@ -94,7 +94,6 @@ class UserResource(BackboneCompatibleResource): except: pass - return super(UserResource, self).obj_update(bundle, skip_errors, **kwargs) def dehydrate_description(self, bundle): @@ -123,7 +122,7 @@ class UserResource(BackboneCompatibleResource): self._hydrateBitmapOption(bundle.obj.activity_sharing_networks, UserProfile.ACTIVITY_SHARE_NETWORK_TWITTER) - bundle.data['like_count'] = Mix.objects.filter(activity_likes__user=bundle.obj).count() + bundle.data['like_count'] = Mix.objects.filter(likes__user=bundle.obj).count() bundle.data['favourite_count'] = Mix.objects.filter(favourites__user=bundle.obj).count() bundle.data['follower_count'] = bundle.obj.followers.count() bundle.data['following_count'] = bundle.obj.following.count() @@ -155,3 +154,15 @@ class UserResource(BackboneCompatibleResource): del bundle.data['activity_sharing_networks_twitter'] return bundle + + def get_followers(self, request, **kwargs): + try: + basic_bundle = self.build_bundle(request=request) + obj = self.cached_obj_get(bundle=basic_bundle, **self.remove_api_resource_names(kwargs)) + except ObjectDoesNotExist: + return HttpGone() + except MultipleObjectsReturned: + return HttpMultipleChoices("More than one resource is found at this URI.") + + child_resource = UserResource() + return child_resource.get_list(request, mix=obj) diff --git a/spa/api/v1/auth.py b/spa/api/v1/auth.py new file mode 100644 index 0000000..d1bf67c --- /dev/null +++ b/spa/api/v1/auth.py @@ -0,0 +1,16 @@ +from tastypie.authorization import Authorization + + +class UserOwnsRowAuthorisation(Authorization): + """ + If the user is already authenticated by a django session it will + allow the request (useful for ajax calls) . + In addition, we will check that the user owns the row being updated + or is an admin + """ + + def apply_limits(self, request, object_list): + if request and hasattr(request, 'user'): + return object_list.filter(author__username=request.user.username) + + return object_list.none() \ No newline at end of file diff --git a/spa/embedding/__init__.py b/spa/embedding/__init__.py new file mode 100644 index 0000000..6d4caf8 --- /dev/null +++ b/spa/embedding/__init__.py @@ -0,0 +1 @@ +__author__ = 'fergalm' diff --git a/spa/embedding/urls.py b/spa/embedding/urls.py new file mode 100644 index 0000000..10a3e67 --- /dev/null +++ b/spa/embedding/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import patterns, url + +urlpatterns = patterns( + '', + url(r'^mix/(?P\d+)/$', 'spa.embedding.views.mix', name='embed_mix'), + url(r'^mix/(?P[\w\d_.-]+)/$', 'spa.embedding.views.mix', name='embed_mix_slug'), +) \ No newline at end of file diff --git a/spa/embedding/views.py b/spa/embedding/views.py new file mode 100644 index 0000000..eb16419 --- /dev/null +++ b/spa/embedding/views.py @@ -0,0 +1,34 @@ +from django.contrib.sites.models import Site +from django.http import Http404 +from django.shortcuts import render_to_response +from django.template import RequestContext +from spa.models import Mix + + +def mix(request, **args): + try: + if 'mix_id' in args: + mix = Mix.objects.get(pk=args['mix_id']) + else: + mix = Mix.objects.get(slug=args['slug']) + except Mix.DoesNotExist: + raise Http404 + + image = mix.get_image_url('1500x1500') + audio_url = mix.get_stream_path() + mix_url = mix.get_absolute_url() + payload = { + "description": mix.description.replace('
', '\n'), + "title": mix.title, + "image_url": image, + "audio_url": audio_url, + "mix_url": 'http://%s%s' % (Site.objects.get_current().domain, mix_url) + } + response = render_to_response( + 'inc/embed/mix.html', + payload, + context_instance=RequestContext(request) + ) + response['X-XSS-Protection'] = 0 + response['X-Frame-Options'] = 'IGNORE' + return response diff --git a/spa/management/commands/debugRelations.py b/spa/management/commands/debugRelations.py index bf29653..f534eb0 100644 --- a/spa/management/commands/debugRelations.py +++ b/spa/management/commands/debugRelations.py @@ -5,8 +5,9 @@ from spa.models import Mix class Command(NoArgsCommand): def handle_noargs(self, **options): try: - list = Mix.objects.filter(slug='dss-on-deepvibes-radio-17th-july-jamie-o-sullivan')[0] - for fav in list.favourites.all(): + #l = Mix.objects.filter(slug='dss-on-deepvibes-radio-17th-july-jamie-o-sullivan')[0] + l = Mix.objects.filter(favourites__slug='fergalmoran')[0] + for fav in l.favourites.all(): print fav.slug pass except Exception, ex: diff --git a/spa/management/commands/import_favourites.py b/spa/management/commands/import_favourites.py new file mode 100644 index 0000000..2a8cd37 --- /dev/null +++ b/spa/management/commands/import_favourites.py @@ -0,0 +1,15 @@ +from django.core.management.base import NoArgsCommand +from spa.models.activity import ActivityFavourite + + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + try: + l = ActivityFavourite.objects.all() + for item in l: + m = item.mix + m.favourites.add(item.user) + m.save() + + except Exception, ex: + print "Debug exception: %s" % ex.message \ No newline at end of file diff --git a/spa/management/commands/import_likes.py b/spa/management/commands/import_likes.py new file mode 100644 index 0000000..1438e59 --- /dev/null +++ b/spa/management/commands/import_likes.py @@ -0,0 +1,15 @@ +from django.core.management.base import NoArgsCommand +from spa.models.activity import ActivityFavourite, ActivityLike + + +class Command(NoArgsCommand): + def handle_noargs(self, **options): + try: + l = ActivityLike.objects.all() + for item in l: + m = item.mix + m.favourites.add(item.user) + m.save() + + except Exception, ex: + print "Debug exception: %s" % ex.message \ No newline at end of file diff --git a/spa/models/mix.py b/spa/models/mix.py index fa9d127..0e5e888 100755 --- a/spa/models/mix.py +++ b/spa/models/mix.py @@ -50,7 +50,8 @@ class Mix(_BaseModel): genres = models.ManyToManyField(Genre) #activity based stuff - favourites = models.ManyToManyField(UserProfile, blank=True, null=True) + favourites = models.ManyToManyField(UserProfile, related_name='favourites', blank=True, null=True) + likes = models.ManyToManyField(UserProfile, related_name='likes', blank=True, null=True) def __unicode__(self): return self.title @@ -168,14 +169,6 @@ class Mix(_BaseModel): except Exception, e: self.logger.exception("Unable to add mix play: %s" % e.message) - def is_liked(self, user): - if user is None: - return False - if user.is_authenticated(): - return self.activity_likes.filter(user=user).count() != 0 - - return False - def update_favourite(self, user, value): try: if user is None: @@ -198,10 +191,12 @@ class Mix(_BaseModel): return if user.is_authenticated(): if value: - if self.activity_likes.filter(user=user).count() == 0: - ActivityLike(user=user.get_profile(), mix=self).save() + if self.likes.filter(user=user).count() == 0: + self.likes.add(user.get_profile()) + self.save() else: - self.activity_likes.filter(user=user).delete() + self.likes.remove(user.get_profile()) + self.save() except Exception, ex: self.logger.error("Exception updating like: %s" % ex.message) @@ -212,3 +207,12 @@ class Mix(_BaseModel): return self.favourites.filter(user=user).count() != 0 else: return False + + def is_liked(self, user): + if user is None: + return False + if user.is_authenticated(): + return self.likes.filter(user=user).count() != 0 + + return False + diff --git a/spa/templates.py b/spa/templates.py index d0580af..b7d1688 100755 --- a/spa/templates.py +++ b/spa/templates.py @@ -1,9 +1,9 @@ +from django.contrib.sites.models import Site from django.shortcuts import render_to_response from django.template.context import RequestContext from htmlmin.decorators import not_minified_response from dss import localsettings from spa.forms import UserForm -from spa.models import UserProfile __author__ = 'fergalm' @@ -24,7 +24,18 @@ def get_template_ex(request, template_name): @not_minified_response -def get_dialog(request, dialog_name): +def get_embed_codes_dialog(request, slug): + payload = { + 'embed_code': 'http://%s/embed/%s' % (Site.objects.get_current().domain, slug) + } + return render_to_response( + 'views/dlg/EmbedCodes.html', + payload, + context_instance=RequestContext(request)) + + +@not_minified_response +def get_dialog(request, dialog_name, **kwargs): return render_to_response( 'views/dlg/%s.html' % dialog_name, context_instance=RequestContext(request)) diff --git a/spa/urls.py b/spa/urls.py index 697cd4e..6e1cabc 100755 --- a/spa/urls.py +++ b/spa/urls.py @@ -33,12 +33,15 @@ urlpatterns = patterns( url(r'^$', 'spa.views.app', name='home'), url(r'^tpl/(?P\w+)/$', 'spa.templates.get_template'), url(r'^dlg/(?P\w+)/$', 'spa.templates.get_dialog'), + url(r'^dlg/embed/(?P[\w\d_.-]+)/$', 'spa.templates.get_embed_codes_dialog'), + url(r'^js/(?P\w+)/$', 'spa.templates.get_javascript'), url(r'^tplex/(?P\w+)/$', 'spa.templates.get_template_ex'), url(r'^podcast\.xml', 'spa.podcast.get_default_podcast'), url(r'^podcast', 'spa.podcast.get_default_podcast'), url(r'^podcasts', 'spa.podcast.get_default_podcast'), url(r'^social/', include('spa.social.urls')), + url(r'^embed/', include('spa.embedding.urls')), url(r'^ajax/', include(ajax.urls)), url(r'^audio/', include(audio.urls)), url(r'^api/', include(v1_api.urls)), diff --git a/static/bin/flashmediaelement.swf b/static/bin/flashmediaelement.swf new file mode 100644 index 0000000000000000000000000000000000000000..d8c66d2799823fd2c49d96b4032f7b24a7facf43 GIT binary patch literal 28712 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

e?B>y1Pg4rUHEDvR&=)@5=D^ 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 literal 0 HcmV?d00001 diff --git a/static/bin/silverlightmediaelement.xap b/static/bin/silverlightmediaelement.xap new file mode 100644 index 0000000000000000000000000000000000000000..9d55c2e46ae51017ab91f61b05cf4f4838ab10ab GIT binary patch literal 12461 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 Y;npiigG2o9V37YT{69ou_}||D0@79*!2kdN literal 0 HcmV?d00001 diff --git a/static/css/controls.svg b/static/css/controls.svg new file mode 100644 index 0000000..af3bd41 --- /dev/null +++ b/static/css/controls.svg @@ -0,0 +1 @@ + cc \ No newline at end of file diff --git a/static/css/mediaelementplayer.css b/static/css/mediaelementplayer.css new file mode 100644 index 0000000..4d9472d --- /dev/null +++ b/static/css/mediaelementplayer.css @@ -0,0 +1,869 @@ +.mejs-container { + position: relative; + background: #000; + font-family: Helvetica, Arial; + text-align: left; + vertical-align: top; + text-indent: 0; +} + +.me-plugin { + position: absolute; +} + +.mejs-embed, .mejs-embed body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + background: #000; + overflow: hidden; +} + +.mejs-fullscreen { + /* set it to not show scroll bars so 100% will work */ + overflow: hidden !important; +} + +.mejs-container-fullscreen { + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; + z-index: 1000; +} +.mejs-container-fullscreen .mejs-mediaelement, +.mejs-container-fullscreen video { + width: 100%; + height: 100%; +} + +.mejs-clear { + clear: both; +} + +/* Start: LAYERS */ +.mejs-background { + position: absolute; + top: 0; + left: 0; +} + +.mejs-mediaelement { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.mejs-poster { + position: absolute; + top: 0; + left: 0; + background-size: contain ; + background-position: 50% 50% ; + background-repeat: no-repeat ; +} +:root .mejs-poster img { + display: none ; +} + +.mejs-poster img { + border: 0; + padding: 0; + border: 0; +} + +.mejs-overlay { + position: absolute; + top: 0; + left: 0; +} + +.mejs-overlay-play { + cursor: pointer; +} + +.mejs-overlay-button { + position: absolute; + top: 50%; + left: 50%; + width: 100px; + height: 100px; + margin: -50px 0 0 -50px; + background: url(bigplay.svg) no-repeat; +} + +.no-svg .mejs-overlay-button { + background-image: url(bigplay.png); +} + +.mejs-overlay:hover .mejs-overlay-button { + background-position: 0 -100px ; +} + +.mejs-overlay-loading { + position: absolute; + top: 50%; + left: 50%; + width: 80px; + height: 80px; + margin: -40px 0 0 -40px; + background: #333; + background: url(background.png); + background: rgba(0, 0, 0, 0.9); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.9)), to(rgba(0,0,0,0.9))); + background: -webkit-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); + background: -moz-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); + background: -o-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); + background: -ms-linear-gradient(top, rgba(50,50,50,0.9), rgba(0,0,0,0.9)); + background: linear-gradient(rgba(50,50,50,0.9), rgba(0,0,0,0.9)); +} + +.mejs-overlay-loading span { + display: block; + width: 80px; + height: 80px; + background: transparent url(loading.gif) 50% 50% no-repeat; +} + +/* End: LAYERS */ + +/* Start: CONTROL BAR */ +.mejs-container .mejs-controls { + position: absolute; + list-style-type: none; + margin: 0; + padding: 0; + bottom: 0; + left: 0; + background: url(background.png); + background: rgba(0, 0, 0, 0.7); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7))); + background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + height: 30px; + width: 100%; +} +.mejs-container .mejs-controls div { + list-style-type: none; + background-image: none; + display: block; + float: left; + margin: 0; + padding: 0; + width: 26px; + height: 26px; + font-size: 11px; + line-height: 11px; + font-family: Helvetica, Arial; + border: 0; +} + +.mejs-controls .mejs-button button { + cursor: pointer; + display: block; + font-size: 0; + line-height: 0; + text-decoration: none; + margin: 7px 5px; + padding: 0; + position: absolute; + height: 16px; + width: 16px; + border: 0; + background: transparent url(controls.svg) no-repeat; +} + +.no-svg .mejs-controls .mejs-button button { + background-image: url(controls.png); +} + +/* :focus for accessibility */ +.mejs-controls .mejs-button button:focus { + outline: solid 1px yellow; +} + +/* End: CONTROL BAR */ + +/* Start: Time (Current / Duration) */ +.mejs-container .mejs-controls .mejs-time { + color: #fff; + display: block; + height: 17px; + width: auto; + padding: 8px 3px 0 3px ; + overflow: hidden; + text-align: center; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +.mejs-container .mejs-controls .mejs-time span { + color: #fff; + font-size: 11px; + line-height: 12px; + display: block; + float: left; + margin: 1px 2px 0 0; + width: auto; +} +/* End: Time (Current / Duration) */ + +/* Start: Play/Pause/Stop */ +.mejs-controls .mejs-play button { + background-position: 0 0; +} + +.mejs-controls .mejs-pause button { + background-position: 0 -16px; +} + +.mejs-controls .mejs-stop button { + background-position: -112px 0; +} +/* Start: Play/Pause/Stop */ + +/* Start: Progress Bar */ +.mejs-controls div.mejs-time-rail { + width: 200px; + padding-top: 5px; +} + +.mejs-controls .mejs-time-rail span { + display: block; + position: absolute; + width: 180px; + height: 10px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + cursor: pointer; +} + +.mejs-controls .mejs-time-rail .mejs-time-total { + margin: 5px; + background: #333; + background: rgba(50,50,50,0.8); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8))); + background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8)); +} + +.mejs-controls .mejs-time-rail .mejs-time-buffering { + width: 100%; + 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: -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: 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: 15px 15px; + -moz-background-size: 15px 15px; + -o-background-size: 15px 15px; + background-size: 15px 15px; + -webkit-animation: buffering-stripes 2s linear infinite; + -moz-animation: buffering-stripes 2s linear infinite; + -ms-animation: buffering-stripes 2s linear infinite; + -o-animation: buffering-stripes 2s linear infinite; + animation: buffering-stripes 2s linear infinite; +} + +@-webkit-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } +@-moz-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } +@-ms-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } +@-o-keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } +@keyframes buffering-stripes { from {background-position: 0 0;} to {background-position: 30px 0;} } + +.mejs-controls .mejs-time-rail .mejs-time-loaded { + background: #3caac8; + background: rgba(60,170,200,0.8); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(44,124,145,0.8)), to(rgba(78,183,212,0.8))); + background: -webkit-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); + background: -moz-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); + background: -o-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); + background: -ms-linear-gradient(top, rgba(44,124,145,0.8), rgba(78,183,212,0.8)); + background: linear-gradient(rgba(44,124,145,0.8), rgba(78,183,212,0.8)); + width: 0; +} + +.mejs-controls .mejs-time-rail .mejs-time-current { + background: #fff; + background: rgba(255,255,255,0.8); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8))); + background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + width: 0; +} + +.mejs-controls .mejs-time-rail .mejs-time-handle { + display: none; + position: absolute; + margin: 0; + width: 10px; + background: #fff; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + cursor: pointer; + border: solid 2px #333; + top: -2px; + text-align: center; +} + +.mejs-controls .mejs-time-rail .mejs-time-float { + position: absolute; + display: none; + background: #eee; + width: 36px; + height: 17px; + border: solid 1px #333; + top: -26px; + margin-left: -18px; + text-align: center; + color: #111; +} + +.mejs-controls .mejs-time-rail .mejs-time-float-current { + margin: 2px; + width: 30px; + display: block; + text-align: center; + left: 0; +} + +.mejs-controls .mejs-time-rail .mejs-time-float-corner { + position: absolute; + display: block; + width: 0; + height: 0; + line-height: 0; + border: solid 5px #eee; + border-color: #eee transparent transparent transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + top: 15px; + left: 13px; +} + +.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float { + width: 48px; +} + +.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-current { + width: 44px; +} + +.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-corner { + left: 18px; +} + +/* +.mejs-controls .mejs-time-rail:hover .mejs-time-handle { + visibility:visible; +} +*/ +/* End: Progress Bar */ + +/* Start: Fullscreen */ +.mejs-controls .mejs-fullscreen-button button { + background-position: -32px 0; +} + +.mejs-controls .mejs-unfullscreen button { + background-position: -32px -16px; +} +/* End: Fullscreen */ + + +/* Start: Mute/Volume */ +.mejs-controls .mejs-volume-button { +} + +.mejs-controls .mejs-mute button { + background-position: -16px -16px; +} + +.mejs-controls .mejs-unmute button { + background-position: -16px 0; +} + +.mejs-controls .mejs-volume-button { + position: relative; +} + +.mejs-controls .mejs-volume-button .mejs-volume-slider { + display: none; + height: 115px; + width: 25px; + background: url(background.png); + background: rgba(50, 50, 50, 0.7); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + top: -115px; + left: 0; + z-index: 1; + position: absolute; + margin: 0; +} + +.mejs-controls .mejs-volume-button:hover { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +/* +.mejs-controls .mejs-volume-button:hover .mejs-volume-slider { + display: block; +} +*/ + +.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total { + position: absolute; + left: 11px; + top: 8px; + width: 2px; + height: 100px; + background: #ddd; + background: rgba(255, 255, 255, 0.5); + margin: 0; +} + +.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current { + position: absolute; + left: 11px; + top: 8px; + width: 2px; + height: 100px; + background: #ddd; + background: rgba(255, 255, 255, 0.9); + margin: 0; +} + +.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle { + position: absolute; + left: 4px; + top: -3px; + width: 16px; + height: 6px; + background: #ddd; + background: rgba(255, 255, 255, 0.9); + cursor: N-resize; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + margin: 0; +} + +/* horizontal version */ +.mejs-controls div.mejs-horizontal-volume-slider { + height: 26px; + width: 60px; + position: relative; +} + +.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total { + position: absolute; + left: 0; + top: 11px; + width: 50px; + height: 8px; + margin: 0; + padding: 0; + font-size: 1px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + background: #333; + background: rgba(50,50,50,0.8); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(30,30,30,0.8)), to(rgba(60,60,60,0.8))); + background: -webkit-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: -moz-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: -o-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: -ms-linear-gradient(top, rgba(30,30,30,0.8), rgba(60,60,60,0.8)); + background: linear-gradient(rgba(30,30,30,0.8), rgba(60,60,60,0.8)); +} + +.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { + position: absolute; + left: 0; + top: 11px; + width: 50px; + height: 8px; + margin: 0; + padding: 0; + font-size: 1px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + background: #fff; + background: rgba(255,255,255,0.8); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(255,255,255,0.9)), to(rgba(200,200,200,0.8))); + background: -webkit-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: -moz-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: -o-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: -ms-linear-gradient(top, rgba(255,255,255,0.9), rgba(200,200,200,0.8)); + background: linear-gradient(rgba(255,255,255,0.9), rgba(200,200,200,0.8)); +} + +.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle { + display: none; +} + +/* End: Mute/Volume */ + +/* Start: Track (Captions and Chapters) */ +.mejs-controls .mejs-captions-button { + position: relative; +} + +.mejs-controls .mejs-captions-button button { + background-position: -48px 0; +} +.mejs-controls .mejs-captions-button .mejs-captions-selector { + visibility: hidden; + position: absolute; + bottom: 26px; + right: -10px; + width: 130px; + height: 100px; + background: url(background.png); + background: rgba(50,50,50,0.7); + border: solid 1px transparent; + padding: 10px; + overflow: hidden; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +/* +.mejs-controls .mejs-captions-button:hover .mejs-captions-selector { + visibility: visible; +} +*/ + +.mejs-controls .mejs-captions-button .mejs-captions-selector ul { + margin: 0; + padding: 0; + display: block; + list-style-type: none !important; + overflow: hidden; +} + +.mejs-controls .mejs-captions-button .mejs-captions-selector ul li { + margin: 0 0 6px 0; + padding: 0; + list-style-type: none !important; + display: block; + color: #fff; + overflow: hidden; +} + +.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input { + clear: both; + float: left; + margin: 3px 3px 0 5px; +} + +.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label { + width: 100px; + float: left; + padding: 4px 0 0 0; + line-height: 15px; + font-family: helvetica, arial; + font-size: 10px; +} + +.mejs-controls .mejs-captions-button .mejs-captions-translations { + font-size: 10px; + margin: 0 0 5px 0; +} + +.mejs-chapters { + position: absolute; + top: 0; + left: 0; + -xborder-right: solid 1px #fff; + width: 10000px; + z-index: 1; +} + +.mejs-chapters .mejs-chapter { + position: absolute; + float: left; + background: #222; + background: rgba(0, 0, 0, 0.7); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(50,50,50,0.7)), to(rgba(0,0,0,0.7))); + background: -webkit-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: -moz-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: -o-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: -ms-linear-gradient(top, rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + background: linear-gradient(rgba(50,50,50,0.7), rgba(0,0,0,0.7)); + filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#323232,endColorstr=#000000); + overflow: hidden; + border: 0; +} + +.mejs-chapters .mejs-chapter .mejs-chapter-block { + font-size: 11px; + color: #fff; + padding: 5px; + display: block; + border-right: solid 1px #333; + border-bottom: solid 1px #333; + cursor: pointer; +} + +.mejs-chapters .mejs-chapter .mejs-chapter-block-last { + border-right: none; +} + +.mejs-chapters .mejs-chapter .mejs-chapter-block:hover { + background: #666; + background: rgba(102,102,102, 0.7); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(102,102,102,0.7)), to(rgba(50,50,50,0.6))); + background: -webkit-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); + background: -moz-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); + background: -o-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); + background: -ms-linear-gradient(top, rgba(102,102,102,0.7), rgba(50,50,50,0.6)); + background: linear-gradient(rgba(102,102,102,0.7), rgba(50,50,50,0.6)); + filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#666666,endColorstr=#323232); +} + +.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title { + font-size: 12px; + font-weight: bold; + display: block; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0 0 3px 0; + line-height: 12px; +} + +.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan { + font-size: 12px; + line-height: 12px; + margin: 3px 0 4px 0; + display: block; + white-space: nowrap; + text-overflow: ellipsis; +} + +.mejs-captions-layer { + position: absolute; + bottom: 0; + left: 0; + text-align:center; + line-height: 22px; + font-size: 12px; + color: #fff; +} + +.mejs-captions-layer a { + color: #fff; + text-decoration: underline; +} + +.mejs-captions-layer[lang=ar] { + font-size: 20px; + font-weight: normal; +} + +.mejs-captions-position { + position: absolute; + width: 100%; + bottom: 15px; + left: 0; +} + +.mejs-captions-position-hover { + bottom: 45px; +} + +.mejs-captions-text { + padding: 3px 5px; + background: url(background.png); + background: rgba(20, 20, 20, 0.8); + +} +/* End: Track (Captions and Chapters) */ + +/* Start: Error */ +.me-cannotplay { +} + +.me-cannotplay a { + color: #fff; + font-weight: bold; +} + +.me-cannotplay span { + padding: 15px; + display: block; +} +/* End: Error */ + + +/* Start: Loop */ +.mejs-controls .mejs-loop-off button { + background-position: -64px -16px; +} + +.mejs-controls .mejs-loop-on button { + background-position: -64px 0; +} + +/* End: Loop */ + +/* Start: backlight */ +.mejs-controls .mejs-backlight-off button { + background-position: -80px -16px; +} + +.mejs-controls .mejs-backlight-on button { + background-position: -80px 0; +} +/* End: backlight */ + +/* Start: Picture Controls */ +.mejs-controls .mejs-picturecontrols-button { + background-position: -96px 0; +} +/* End: Picture Controls */ + + +/* context menu */ +.mejs-contextmenu { + position: absolute; + width: 150px; + padding: 10px; + border-radius: 4px; + top: 0; + left: 0; + background: #fff; + border: solid 1px #999; + z-index: 1001; /* make sure it shows on fullscreen */ +} +.mejs-contextmenu .mejs-contextmenu-separator { + height: 1px; + font-size: 0; + margin: 5px 6px; + background: #333; +} + +.mejs-contextmenu .mejs-contextmenu-item { + font-family: Helvetica, Arial; + font-size: 12px; + padding: 4px 6px; + cursor: pointer; + color: #333; +} +.mejs-contextmenu .mejs-contextmenu-item:hover { + background: #2C7C91; + color: #fff; +} + +/* Start: Source Chooser */ +.mejs-controls .mejs-sourcechooser-button { + position: relative; +} + +.mejs-controls .mejs-sourcechooser-button button { + background-position: -128px 0; +} + +.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector { + visibility: hidden; + position: absolute; + bottom: 26px; + right: -10px; + width: 130px; + height: 100px; + background: url(background.png); + background: rgba(50,50,50,0.7); + border: solid 1px transparent; + padding: 10px; + overflow: hidden; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul { + margin: 0; + padding: 0; + display: block; + list-style-type: none !important; + overflow: hidden; +} + +.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li { + margin: 0 0 6px 0; + padding: 0; + list-style-type: none !important; + display: block; + color: #fff; + overflow: hidden; +} + +.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input { + clear: both; + float: left; + margin: 3px 3px 0 5px; +} + +.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label { + width: 100px; + float: left; + padding: 4px 0 0 0; + line-height: 15px; + font-family: helvetica, arial; + font-size: 10px; +} +/* End: Source Chooser */ + +/* Start: Postroll */ +.mejs-postroll-layer { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + background: url(background.png); + background: rgba(50,50,50,0.7); + z-index: 1000; + overflow: hidden; +} +.mejs-postroll-layer-content { + width: 100%; + height: 100%; +} +.mejs-postroll-close { + position: absolute; + right: 0; + top: 0; + background: url(background.png); + background: rgba(50,50,50,0.7); + color: #fff; + padding: 4px; + z-index: 100; + cursor: pointer; +} +/* End: Postroll */ diff --git a/static/css/mejs-skins.css b/static/css/mejs-skins.css new file mode 100644 index 0000000..5c27cf1 --- /dev/null +++ b/static/css/mejs-skins.css @@ -0,0 +1,289 @@ +/* TED player */ +.mejs-container.mejs-ted { + +} +.mejs-ted .mejs-controls { + background: #eee; + height: 65px; +} + +.mejs-ted .mejs-button, +.mejs-ted .mejs-time { + position: absolute; + background: #ddd; +} +.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-total { + background-color: none; + background: url(controls-ted.png) repeat-x 0 -52px; + height: 6px; +} +.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-buffering { + height: 6px; +} +.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-loaded { + background-color: none; + background: url(controls-ted.png) repeat-x 0 -52px; + width: 0; + height: 6px; +} +.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-current { + width: 0; + height: 6px; + background-color: none; + background: url(controls-ted.png) repeat-x 0 -59px; +} +.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-handle { + display: block; + margin: 0; + width: 14px; + height: 21px; + top: -7px; + border: 0; + background: url(controls-ted.png) no-repeat 0 0; +} +.mejs-ted .mejs-controls .mejs-time-rail .mejs-time-float { + display: none; +} +.mejs-ted .mejs-controls .mejs-playpause-button { + top: 29px; + left: 9px; + width: 49px; + height: 28px; +} +.mejs-ted .mejs-controls .mejs-playpause-button button { + width: 49px; + height: 28px; + background: url(controls-ted.png) no-repeat -50px -23px; + margin: 0; + padding: 0; +} +.mejs-ted .mejs-controls .mejs-pause button { + background-position: 0 -23px; +} + +.mejs-ted .mejs-controls .mejs-fullscreen-button { + top: 34px; + right: 9px; + width: 17px; + height: 15px; + background : none; +} +.mejs-ted .mejs-controls .mejs-fullscreen-button button { + width: 19px; + height: 17px; + background: transparent url(controls-ted.png) no-repeat 0 -66px; + margin: 0; + padding: 0; +} +.mejs-ted .mejs-controls .mejs-unfullscreen button { + background: transparent url(controls-ted.png) no-repeat -21px -66px; + margin: 0; + padding: 0; +} +.mejs-ted .mejs-controls .mejs-volume-button { + top: 30px; + right: 35px; + width: 24px; + height: 22px; +} +.mejs-ted .mejs-controls .mejs-mute button { + background: url(controls-ted.png) no-repeat -15px 0; + width: 24px; + height: 22px; + margin: 0; + padding: 0; +} +.mejs-ted .mejs-controls .mejs-unmute button { + background: url(controls-ted.png) no-repeat -40px 0; + width: 24px; + height: 22px; + margin: 0; + padding: 0; +} +.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-slider { + background: #fff; + border: solid 1px #aaa; + border-width: 1px 1px 0 1px; + width: 22px; + height: 65px; + top: -65px; +} +.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-total { + background: url(controls-ted.png) repeat-y -41px -66px; + left: 8px; + width: 6px; + height: 50px; +} +.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-current { + left: 8px; + width: 6px; + background: url(controls-ted.png) repeat-y -48px -66px; + height: 50px; +} + +.mejs-ted .mejs-controls .mejs-volume-button .mejs-volume-handle { + display: none; +} + +.mejs-ted .mejs-controls .mejs-time span { + color: #333; +} +.mejs-ted .mejs-controls .mejs-currenttime-container { + position: absolute; + top: 32px; + right: 100px; + border: solid 1px #999; + background: #fff; + color: #333; + padding-top: 2px; + border-radius: 3px; + color: #333; +} +.mejs-ted .mejs-controls .mejs-duration-container { + + position: absolute; + top: 32px; + right: 65px; + border: solid 1px #999; + background: #fff; + color: #333; + padding-top: 2px; + border-radius: 3px; + color: #333; +} + +.mejs-ted .mejs-controls .mejs-time button{ + color: #333; +} +.mejs-ted .mejs-controls .mejs-captions-button { + display: none; +} +/* END: TED player */ + + +/* WMP player */ +.mejs-container.mejs-wmp { + +} +.mejs-wmp .mejs-controls { + background: transparent url(controls-wmp-bg.png) center 16px no-repeat; + height: 65px; +} + +.mejs-wmp .mejs-button, +.mejs-wmp .mejs-time { + position: absolute; + background: transparent; +} +.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-total { + background-color: transparent; + border: solid 1px #ccc; + height: 3px; +} +.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-buffering { + height: 3px; +} +.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-loaded { + background-color: rgba(255,255,255,0.3); + width: 0; + height: 3px; +} +.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-current { + width: 0; + height: 1px; + background-color: #014CB6; + border: solid 1px #7FC9FA; + border-width: 1px 0; + border-color: #7FC9FA #fff #619FF2 #fff; +} +.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-handle { + display: block; + margin: 0; + width: 16px; + height: 9px; + top: -3px; + border: 0; + background: url(controls-wmp.png) no-repeat 0 -80px; +} +.mejs-wmp .mejs-controls .mejs-time-rail .mejs-time-float { + display: none; +} +.mejs-wmp .mejs-controls .mejs-playpause-button { + top: 10px; + left: 50%; + margin: 10px 0 0 -20px; + width: 40px; + height: 40px; + +} +.mejs-wmp .mejs-controls .mejs-playpause-button button { + width: 40px; + height: 40px; + background: url(controls-wmp.png) no-repeat 0 0; + margin: 0; + padding: 0; +} +.mejs-wmp .mejs-controls .mejs-pause button { + background-position: 0 -40px; +} + +.mejs-wmp .mejs-controls .mejs-currenttime-container { + position: absolute; + top: 25px; + left: 50%; + margin-left: -93px; +} +.mejs-wmp .mejs-controls .mejs-duration-container { + position: absolute; + top: 25px; + left: 50%; + margin-left: -58px; +} + + +.mejs-wmp .mejs-controls .mejs-volume-button { + top: 32px; + right: 50%; + margin-right: -55px; + width: 20px; + height: 15px; +} +.mejs-wmp .mejs-controls .mejs-volume-button button { + margin: 0; + padding: 0; + background: url(controls-wmp.png) no-repeat -42px -17px; + width: 20px; + height: 15px; +} +.mejs-wmp .mejs-controls .mejs-unmute button { + margin: 0; + padding: 0; + background: url(controls-wmp.png) no-repeat -42px 0; + width: 20px; + height: 15px; +} +.mejs-wmp .mejs-controls .mejs-volume-button .mejs-volume-slider { + background: rgba(102,102,102,0.6); +} + +.mejs-wmp .mejs-controls .mejs-fullscreen-button { + top: 32px; + right: 50%; + margin-right: -82px; + width: 15px; + height: 14px; +} +.mejs-wmp .mejs-controls .mejs-fullscreen-button button { + margin: 0; + padding: 0; + background: url(controls-wmp.png) no-repeat -63px 0; + width: 15px; + height: 14px; +} +.mejs-wmp .mejs-controls .mejs-captions-button { + display: none; +} +/* END: WMP player */ + + + diff --git a/static/js/app/appv2.coffee b/static/js/app/appv2.coffee index 5b3d801..0e85047 100755 --- a/static/js/app/appv2.coffee +++ b/static/js/app/appv2.coffee @@ -1,9 +1,7 @@ -define ['backbone', 'marionette', 'vent', 'utils' - 'app.lib/router', 'app.lib/panningRegion', 'app.lib/realtimeController', 'app.lib/audioController', +define ['backbone', 'marionette', 'vent', 'utils', + 'app.lib/social', 'app.lib/router', 'app.lib/panningRegion', 'app.lib/realtimeController', 'app.lib/audioController', 'views/widgets/headerView', 'views/sidebar/sidebarView', 'models/mix/mixCollection'], -(Backbone, Marionette, vent, utils, - DssRouter, PanningRegion, RealtimeController, AudioController, - HeaderView, SidebarView, MixCollection) -> +(Backbone, Marionette, vent, utils, social, DssRouter, PanningRegion, RealtimeController, AudioController, HeaderView, SidebarView, MixCollection) -> App = new Marionette.Application(); App.audioController = new AudioController(); App.realtimeController = new RealtimeController(); @@ -64,11 +62,14 @@ define ['backbone', 'marionette', 'vent', 'utils' true @listenTo vent, "mix:share", (mode, model) -> - console.log "App(vent): mix:share" + console.log "App(vent): mix:share (" + mode + ")" if (mode == "facebook") social.sharePageToFacebook(model); else if (mode == "twitter") social.sharePageToTwitter(model); + else if (mode == "embed") + social.generateEmbedCode(model) + true App.headerRegion.show(new HeaderView()); diff --git a/static/js/app/appv2.js b/static/js/app/appv2.js index 2577d7f..e76c371 100755 --- a/static/js/app/appv2.js +++ b/static/js/app/appv2.js @@ -1,6 +1,6 @@ // Generated by CoffeeScript 1.6.2 (function() { - define(['backbone', 'marionette', 'vent', 'utils', 'app.lib/router', 'app.lib/panningRegion', 'app.lib/realtimeController', 'app.lib/audioController', 'views/widgets/headerView', 'views/sidebar/sidebarView', 'models/mix/mixCollection'], function(Backbone, Marionette, vent, utils, DssRouter, PanningRegion, RealtimeController, AudioController, HeaderView, SidebarView, MixCollection) { + define(['backbone', 'marionette', 'vent', 'utils', 'app.lib/social', 'app.lib/router', 'app.lib/panningRegion', 'app.lib/realtimeController', 'app.lib/audioController', 'views/widgets/headerView', 'views/sidebar/sidebarView', 'models/mix/mixCollection'], function(Backbone, Marionette, vent, utils, social, DssRouter, PanningRegion, RealtimeController, AudioController, HeaderView, SidebarView, MixCollection) { var App, sidebarView; App = new Marionette.Application(); @@ -76,11 +76,13 @@ return true; }); return this.listenTo(vent, "mix:share", function(mode, model) { - console.log("App(vent): mix:share"); + console.log("App(vent): mix:share (" + mode + ")"); if (mode === "facebook") { social.sharePageToFacebook(model); } else if (mode === "twitter") { social.sharePageToTwitter(model); + } else if (mode === "embed") { + social.generateEmbedCode(model); } return true; }); diff --git a/static/js/app/lib/controller.coffee b/static/js/app/lib/controller.coffee index 66fb142..2254a35 100755 --- a/static/js/app/lib/controller.coffee +++ b/static/js/app/lib/controller.coffee @@ -71,12 +71,12 @@ define ['app', 'marionette', 'vent', showUserFavourites: (slug) -> console.log("Controller: showUserFavourites") @_showMixList() - vent.trigger("mix:showlist", {order_by: 'latest', type: 'favourites', user: slug}) + vent.trigger("mix:showlist", {order_by: 'latest', favourites__slug: slug}) showUserLikes: (slug) -> console.log("Controller: showUserLikes") @_showMixList() - vent.trigger("mix:showlist", {order_by: 'latest', type: 'likes', user: slug}) + vent.trigger("mix:showlist", {order_by: 'latest', likes__slug: slug}) showUserFollowing: (slug) -> console.log("Controller: showUserFollowing") diff --git a/static/js/app/lib/controller.js b/static/js/app/lib/controller.js index fec518b..dadf88c 100755 --- a/static/js/app/lib/controller.js +++ b/static/js/app/lib/controller.js @@ -120,8 +120,7 @@ this._showMixList(); return vent.trigger("mix:showlist", { order_by: 'latest', - type: 'favourites', - user: slug + favourites__slug: slug }); }; @@ -130,8 +129,7 @@ this._showMixList(); return vent.trigger("mix:showlist", { order_by: 'latest', - type: 'likes', - user: slug + likes__slug: slug }); }; diff --git a/static/js/app/lib/social.coffee b/static/js/app/lib/social.coffee new file mode 100644 index 0000000..e786c39 --- /dev/null +++ b/static/js/app/lib/social.coffee @@ -0,0 +1,39 @@ +define ['jquery', 'utils'], ($, utils) -> + postFacebookLike: (mixId) -> + + #first off, find if the current user has allowed facebook likes + $.getJSON "social/like/" + mixId + "/", (data) -> + com.podnoms.utils.showAlert "Posted your like to facebook, you can stop this in your settings page.", "Cheers feen" + + + generateEmbedCode: (model) -> + console.log("Generating embed code"); + utils.modal "/dlg/embed/" + model.get('slug') + + sharePageToTwitter: (model) -> + + #We get the URL of the link + loc = $(this).attr("href") + + #We get the title of the link + title = $(this).attr("title") + + #We trigger a new window with the Twitter dialog, in the middle of the page + window.open "http://twitter.com/share?url=" + "http://" + window.location.host + "/" + model.get("item_url") + "&text=" + model.get("title"), "twitterwindow", "height=450, width=550, top=" + ($(window).height() / 2 - 225) + ", left=" + $(window).width() / 2 + ", toolbar=0, location=0, menubar=0, directories=0, scrollbars=0" + + sharePageToFacebook: (model) -> + FB.ui + method: "feed" + name: "Check out this mix on Deep South Sounds" + display: "popup" + link: "http://" + window.location.host + "/" + model.get("item_url") + picture: model.get("mix_image") + caption: model.get("title") + description: model.get("description") + , (response) -> + if response and response.post_id + com.podnoms.utils.showAlert "Success", "Post shared to facebook" + else + com.podnoms.utils.showError "Error", "Failure sharing post" + + diff --git a/static/js/app/lib/utils.js b/static/js/app/lib/utils.js index e216899..7dbf1c1 100755 --- a/static/js/app/lib/utils.js +++ b/static/js/app/lib/utils.js @@ -1,8 +1,8 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.6.2 (function() { - define(['jquery', 'bootstrap', 'toastr'], function($, bootstrap, toastr) { var _this = this; + return { modal: function(url) { if (url) { @@ -24,6 +24,7 @@ }, checkPlayCount: function() { var _this = this; + if (document.cookie.indexOf("sessionId")) { $.getJSON("/ajax/session_play_count", function(data) { console.log("utils: got playcount"); @@ -46,6 +47,7 @@ generateGuid: function() { return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { var r, v; + r = Math.random() * 16 | 0; v = (c === "x" ? r : r & 0x3 | 0x8); return v.toString(16); @@ -53,6 +55,7 @@ }, downloadURL: function(url) { var iframe; + iframe = document.getElementById("hiddenDownloader"); if (iframe === null) { iframe = document.createElement("iframe"); diff --git a/static/js/app/models/mix/mixCollection.coffee b/static/js/app/models/mix/mixCollection.coffee index 80495ac..0440d2c 100755 --- a/static/js/app/models/mix/mixCollection.coffee +++ b/static/js/app/models/mix/mixCollection.coffee @@ -8,4 +8,3 @@ define ['backbone', 'models/mix/mixItem', 'app.lib/backbone.dss.model.collection console.log("MixCollection: parse") MixCollection - diff --git a/static/js/app/models/mix/mixCollection.js b/static/js/app/models/mix/mixCollection.js index 68d2ad3..cbe2c86 100755 --- a/static/js/app/models/mix/mixCollection.js +++ b/static/js/app/models/mix/mixCollection.js @@ -1,16 +1,17 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.6.2 (function() { var __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; define(['backbone', 'models/mix/mixItem', 'app.lib/backbone.dss.model.collection'], function(Backbone, MixItem, DssCollection) { - var MixCollection; - MixCollection = (function(_super) { + var MixCollection, _ref; + MixCollection = (function(_super) { __extends(MixCollection, _super); function MixCollection() { - return MixCollection.__super__.constructor.apply(this, arguments); + _ref = MixCollection.__super__.constructor.apply(this, arguments); + return _ref; } MixCollection.prototype.model = MixItem; diff --git a/static/js/app/social.js b/static/js/app/social.js deleted file mode 100755 index f43f5dc..0000000 --- a/static/js/app/social.js +++ /dev/null @@ -1,60 +0,0 @@ -/** @license - - ---------------------------------------------- - - Copyright (c) 2012, Fergal Moran. All rights reserved. - Code provided under the BSD License: - - */ - -social = { - postFacebookLike: function (mixId) { - //first off, find if the current user has allowed facebook likes - $.getJSON( - 'social/like/' + mixId + '/', - function (data) { - com.podnoms.utils.showAlert("Posted your like to facebook, you can stop this in your settings page.", "Cheers feen"); - } - ); - }, - - postFacebookFavourite: function (mixId) { - - }, - - sharePageToTwitter: function (model) { - //We get the URL of the link - var loc = $(this).attr('href'); - - //We get the title of the link - var title = $(this).attr('title'); - - //We trigger a new window with the Twitter dialog, in the middle of the page - window.open( - 'http://twitter.com/share?url=' + 'http://' + window.location.host + "/" + model.get('item_url') + - '&text=' + model.get('title'), - 'twitterwindow', - 'height=450, width=550, top=' + ($(window).height() / 2 - 225) + - ', left=' + $(window).width() / 2 + - ', toolbar=0, location=0, menubar=0, directories=0, scrollbars=0'); - }, - sharePageToFacebook: function (model) { - FB.ui({ - method: 'feed', - name: 'Check out this mix on Deep South Sounds', - display: 'popup', - link: 'http://' + window.location.host + "/" + model.get('item_url'), - picture: model.get('mix_image'), - caption: model.get('title'), - description: model.get('description') - }, - function (response) { - if (response && response.post_id) { - com.podnoms.utils.showAlert("Success", "Post shared to facebook"); - } else { - com.podnoms.utils.showError("Error", "Failure sharing post"); - } - } - ); - } -}; \ No newline at end of file diff --git a/static/js/app/views/mix/mixItemView.coffee b/static/js/app/views/mix/mixItemView.coffee index 8840d66..f9f2926 100755 --- a/static/js/app/views/mix/mixItemView.coffee +++ b/static/js/app/views/mix/mixItemView.coffee @@ -31,7 +31,7 @@ define ['moment', 'app', 'vent', 'marionette', 'utils', 'models/comment/commentC id = @model.get('id') if @model.get('duration') totalDuration = moment.duration(this.model.get('duration'), "seconds") - totalDurationText = if totalDuration.hours() != 0 then moment(totalDuration).format("HH:mm:ss") else moment(totalDuration).format("mm:ss"); + totalDurationText = if totalDuration.hours() != 0 then moment(totalDuration).format("h:mm:ss") else moment(totalDuration).format("mm:ss"); $('#player-duration-' + id, this.el).text(totalDurationText) diff --git a/static/js/app/views/mix/mixItemView.js b/static/js/app/views/mix/mixItemView.js index 079ee1b..3389fad 100755 --- a/static/js/app/views/mix/mixItemView.js +++ b/static/js/app/views/mix/mixItemView.js @@ -1,26 +1,22 @@ -// Generated by CoffeeScript 1.3.3 +// Generated by CoffeeScript 1.6.2 (function() { var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; define(['moment', 'app', 'vent', 'marionette', 'utils', 'models/comment/commentCollection', 'views/comment/commentListView', 'text!/tpl/MixListItemView'], function(moment, App, vent, Marionette, utils, CommentsCollection, CommentsListView, Template) { - var MixItemView; - MixItemView = (function(_super) { + var MixItemView, _ref; + MixItemView = (function(_super) { __extends(MixItemView, _super); function MixItemView() { this.doStart = __bind(this.doStart, this); - this.renderComments = __bind(this.renderComments, this); - this.renderGenres = __bind(this.renderGenres, this); - this.onRender = __bind(this.onRender, this); - - this.initialize = __bind(this.initialize, this); - return MixItemView.__super__.constructor.apply(this, arguments); + this.initialize = __bind(this.initialize, this); _ref = MixItemView.__super__.constructor.apply(this, arguments); + return _ref; } MixItemView.prototype.template = _.template(Template); @@ -54,10 +50,11 @@ MixItemView.prototype.onRender = function() { var id, totalDuration, totalDurationText; + id = this.model.get('id'); if (this.model.get('duration')) { totalDuration = moment.duration(this.model.get('duration'), "seconds"); - totalDurationText = totalDuration.hours() !== 0 ? moment(totalDuration).format("HH:mm:ss") : moment(totalDuration).format("mm:ss"); + totalDurationText = totalDuration.hours() !== 0 ? moment(totalDuration).format("h:mm:ss") : moment(totalDuration).format("mm:ss"); $('#player-duration-' + id, this.el).text(totalDurationText); } this.renderGenres(); @@ -73,6 +70,7 @@ MixItemView.prototype.renderGenres = function() { var el; + el = this.el; $.each(this.model.get("genre-list"), function(data) { $("#genre-list", el).append('' + this.text + ''); @@ -83,6 +81,7 @@ MixItemView.prototype.renderComments = function() { var comments; + comments = new CommentsCollection(); comments.url = this.model.get("resource_uri") + "comments/"; comments.mix_id = this.model.id; @@ -90,6 +89,7 @@ comments.fetch({ success: function(data) { var content; + console.log(data); content = new CommentsListView({ collection: comments @@ -139,6 +139,7 @@ MixItemView.prototype.mixFavourite = function() { var app; + console.log("MixItemView: favouriteMix"); app = require('app'); vent.trigger("mix:favourite", this.model); @@ -153,6 +154,7 @@ MixItemView.prototype.mixShare = function(e) { var mode; + console.log("MixItemView: shareMix"); mode = $(e.currentTarget).data("mode"); console.log("MixItemView: " + mode); diff --git a/static/js/jwplayer.html5.js b/static/js/jwplayer.html5.js new file mode 100644 index 0000000..05c179e --- /dev/null +++ b/static/js/jwplayer.html5.js @@ -0,0 +1,196 @@ +(function(f){f.html5={};f.html5.version="6.5.3609"})(jwplayer); +(function(f){function h(a){return function(){a("Error loading file")}}function e(a,b,c,e){return function(){try{var g=a.responseXML;if(g&&g.firstChild)return c(a)}catch(d){}(g=f.parseXML(a.responseText))&&g.firstChild?(a=f.extend({},a,{responseXML:g}),c(a)):e&&e(a.responseText?"Invalid XML":b)}}var d=window;f.serialize=function(a){return null==a?null:"true"==a.toString().toLowerCase()?!0:"false"==a.toString().toLowerCase()?!1:isNaN(Number(a))||5c?"0":"")+c+":"+(10>a?"0":"")+a}return"00:00"};f.seconds=function(a){a=a.replace(",", +".");var b=a.split(":"),c=0;"s"==a.substr(-1)?c=Number(a.substr(0,a.length-1)):"m"==a.substr(-1)?c=60*Number(a.substr(0,a.length-1)):"h"==a.substr(-1)?c=3600*Number(a.substr(0,a.length-1)):1e.indexOf("url")?"url("+e+")":e+k;else switch(a){case "z-index":case "opacity":b=e+k;break a;default:b=a.match(/color/i)?"#"+f.pad(e.toString(16).replace(/^0x/i,""),6)+k:0===e?0+k:Math.ceil(e)+"px"+k}}}g(c[d][a])&&!g(b)?delete c[d][a]:g(b)&&(c[d][a]=b)}); +0r?(c*=g,k*=g):(c*=r,k*=r);case h.NONE:g=r=1;case h.EXACTFIT:j=!0;break;default:g>r?0.95=x.length||(x[D].data?y.populate(x[D].data):(E=a=x[D].file,h.ajax(a,q,m)),s(!1))}function A(){var a=[];a.push({label:"Off"});for(var b=0;b=q)){b=c;break}-1==b?a(""):b!=j&&(j=b,a(g[c].text))}function f(a,b){h(b, +function(b,c){a.style[b]=c})}var g,r,l,j,q,m="visible",p;this.hide=function(){f(r,{display:"none"});p&&(clearInterval(p),p=null)};this.populate=function(a){j=-1;g=a;c()};this.resize=function(){b()};r=document.createElement("div");l=document.createElement("span");r.appendChild(l);d.appendChild(r);f(r,{display:"block",height:"auto",position:"absolute",bottom:"20px",textAlign:"center",width:"100%"});f(l,{color:"#"+e.color.substr(-6),display:"inline-block",fontFamily:e.fontFamily,fontStyle:e.fontStyle, +fontWeight:e.fontWeight,height:"auto",margin:"auto",position:"relative",textAlign:"center",textDecoration:e.textDecoration,wordWrap:"break-word",width:"auto"});e.back?f(l,{background:"#000"}):f(l,{textShadow:"-2px 0px 1px #000,2px 0px 1px #000,0px -2px 1px #000,0px 2px 1px #000,-1px 1px 1px #000,1px 1px 1px #000,1px -1px 1px #000,1px 1px 1px #000"});this.show=function(){f(r,{display:"block"});p||(p=setInterval(b,250));b()};this.update=function(a){q=a;g&&c()}}})(jwplayer.html5); +(function(f){var h=f.html5,e=f.utils,d=f.events,a=d.state,b=e.css;f=e.transitionStyle;var c="button",k="text",g="divider",r="slider",l="100%",j={display:"none"},q={display:v},m=!1,p=!0,s=null,v=void 0,u=window,A=document;h.controlbar=function(f,B){function t(a,b,c){return{name:a,type:b,className:c}}function y(a){var b=m,c;K.elapsed&&(c=e.timeFormat(a.position),K.elapsed.innerHTML=c,b=c.length!=e.timeFormat(wa).length);K.duration&&(c=e.timeFormat(a.duration),K.duration.innerHTML=c,b=b||c.length!=e.timeFormat(ia).length); +0ka.right?a.offsetX(ka.right-b.right):b.lefta&&(a=0);0.9ca.maxwidth;c=ua?0:ca.margin;b(C(),{left:a?"50%":c,right:a?v:c,"margin-left":a?O.clientWidth/-2:v,width:a?l:v});ka=e.bounds(O);e.foreach(Ea,function(a,b){pa(b)})};ha.audioMode=function(a){a!=ua&&(ua=a,b(C(".jwfullscreen"),{display:a?"none":v}),b(C(".jwhd"),{display:a?"none":v}), +b(C(".jwcc"),{display:a?"none":v}),a&&(b(C(".fsdiv"),j),b(C(".hddiv"),j)),ya())};ha.element=function(){return O};ha.margin=function(){return parseInt(ca.margin)};ha.height=function(){return V};ha.show=function(){ha.visible||(clearTimeout(Ha),Ha=v,ha.visible=!0,O.style.display="inline-block",ya(),w(),Ha=setTimeout(function(){O.style.opacity=1},10))};ha.hide=function(){ha.visible&&(ha.visible=!1,O.style.opacity=0,clearTimeout(Ha),Ha=v,Ha=setTimeout(function(){O.style.display="none"},150))};K={};H=f; +$=H.id+"_controlbar";ia=wa=0;O=M();O.id=$;O.className="jwcontrolbar";R=H.skin;ga=R.getComponentLayout("controlbar");ga||(ga=W.layout);e.clearCss("#"+$);E();var Ia=G("capLeft"),U=G("capRight"),ab=G("background",{position:"absolute",left:Q("capLeft").width,right:Q("capRight").width,"background-repeat":"repeat-x"},p);ab&&O.appendChild(ab);Ia&&O.appendChild(Ia);Ga("left");Ga("center");Ga("right");O.appendChild(xa.left);O.appendChild(xa.center);O.appendChild(xa.right);K.hd&&(la=new h.menu("hd",$+"_hd", +R,Ta),aa(la,K.hd,oa,va),Ea.hd=la);K.cc&&(ma=new h.menu("cc",$+"_cc",R,Ua),aa(ma,K.cc,ea,P),Ea.cc=ma);K.mute&&(K.volume&&K.volume.vertical)&&(ra=new h.overlay($+"_volumeoverlay",R),ra.setContents(K.volume),aa(ra,K.mute,X),Ea.volume=ra);K.fullscreen&&(Ma=new h.overlay($+"_fullscreenoverlay",R),Ia=A.createElement("div"),Ia.className="jwoverlaytext",Ia.innerHTML="Fullscreen",Ma.setContents(Ia),aa(Ma,K.fullscreen,da),Ea.fullscreen=Ma);b(C(".jwright"),{right:Q("capRight").width});U&&O.appendChild(U);H.jwAddEventListener(d.JWPLAYER_MEDIA_TIME, +y);H.jwAddEventListener(d.JWPLAYER_PLAYER_STATE,function(c){switch(c.newstate){case a.BUFFERING:case a.PLAYING:b(C(".jwtimeSliderThumb"),{opacity:1});Z("play",p);break;case a.PAUSED:ta||Z("play",m);break;case a.IDLE:Z("play",m),b(C(".jwtimeSliderThumb"),{opacity:0}),K.timeRail&&(K.timeRail.className="jwrail",setTimeout(function(){K.timeRail.className+=" jwsmooth"},100)),Da(0),y({position:0,duration:0})}});H.jwAddEventListener(d.JWPLAYER_PLAYLIST_ITEM,function(a){a=H.jwGetPlaylist()[a.index].tracks; +if("array"==e.typeOf(a))for(var b=0;b=M)clearInterval(C);else{M--;var b=Math.max(I.width,h.bounds(t).width- +w.width-y.width);(h.isFF()||h.isIE())&&b++;h.isChrome()&&1==t.parentNode.clientWidth%2&&b++;e(j(),{"background-size":[y.width+a,b+a,w.width+a].join()},!0)}}function u(){N=(N+G)%360;h.rotate(z,N)}var A=g,n=A.skin,B=f,t,y,w,D,x,z,I,E=0,C,M;this.element=function(){return t};this.setText=function(b){var c=x.style;x.innerHTML=b?b.replace(":",":\x3cbr\x3e"):"";c.height="0";c.display="block";if(b)for(;2b.left&&a.offsetX(c.left-b.left+8);m.show();h.foreach(B,function(a,b){a!=g&&b.hide()})},!1);j.addEventListener("mouseout",function(){s=setTimeout(m.hide,100)},!1);t.appendChild(m.element());B[g]=m}A++;p()}};w.removeButton=function(a){n[a]&&(y.removeChild(n[a].element),y.removeChild(n[a].divider),delete n[a],A--,p())};w.numButtons=function(){return A};w.visible=!1;t=q("div","jwdock");y=q("div","jwdockbuttons");t.appendChild(y); +t.id=v;var D=m("button"),x=m("buttonOver"),z=m("buttonActive");D&&(e(j(),{height:D.height,padding:s.margin}),e(a,{height:D.height}),e(j("button"),{width:D.width,cursor:"pointer",border:c,background:D.src}),x.src&&e(j("button:hover"),{background:x.src}),z.src&&e(j("button:active"),{background:z.src}),e(j("button\x3ediv"),{opacity:s.iconalpha}),e(j("button:hover\x3ediv"),{opacity:s.iconalphaover}),e(j("button:active\x3ediv"),{opacity:s.iconalphaactive}),e(j(".jwoverlay"),{top:s.margin+D.height}),l("capLeft", +y),l("capRight",y),l("divider"));setTimeout(function(){d(t)})};e(".jwdock",{opacity:0,display:c});e(".jwdock \x3e *",{height:"100%","float":"left"});e(".jwdock \x3e .jwoverlay",{height:"auto","float":c,"z-index":99});e(a+" button",{position:"relative"});e(a+" \x3e *",{height:"100%","float":"left"});e(a+" .divider",{display:c});e(a+" button ~ .divider",{display:k});e(a+" .capLeft, "+a+" .capRight",{display:c});e(a+" .capRight",{"float":"right"});e(a+" button \x3e div",{left:0,right:0,top:0,bottom:0, +margin:5,position:"absolute","background-position":"center","background-repeat":"no-repeat"});h.transitionStyle(".jwdock","background .15s, opacity .15s");h.transitionStyle(".jwdock .jwoverlay","opacity .15s");h.transitionStyle(a+" button div","opacity .15s")})(jwplayer.html5); +(function(f){var h=jwplayer,e=h.utils,d=h.events,a=d.state,b=h.playlist;f.instream=function(c,h,g,r){function l(a){a.type==d.JWPLAYER_MEDIA_ERROR&&(a=e.extend({},a),a.type=d.JWPLAYER_ERROR);s(a.type,a);N=!0;G.jwInstreamDestroy(!1)}function j(a){E&&s(a.type,a)}function q(){E&&x.play()}function m(){E&&setTimeout(function(){G.jwInstreamDestroy(!0)},10)}function p(a){a.width&&a.height&&B.resizeMedia()}function s(a,b,c){(E||c)&&C.sendEvent(a,b)}function v(){z&&z.redraw();I&&I.redraw()}var u={controlbarseekable:"never", +controlbarpausable:!0,controlbarstoppable:!0,playlistclickable:!0},A,n,B=g,t,y,w,D,x,z,I,E=!1,C,M,F,G=this,N=!1,T=!0;this.load=function(g,C){e.isAndroid(2.3)?l({type:d.JWPLAYER_ERROR,message:"Error loading instream: Cannot play instream on Android 2.3"}):(E=!0,n=e.extend(u,C),A=new b.item(g),M=document.createElement("div"),M.id=G.id+"_instream_container",t=r.detachMedia(),x=new f.video(t),x.addGlobalListener(j),x.addEventListener(d.JWPLAYER_MEDIA_META,p),x.addEventListener(d.JWPLAYER_MEDIA_COMPLETE, +m),x.addEventListener(d.JWPLAYER_MEDIA_BUFFER_FULL,q),x.addEventListener(d.JWPLAYER_MEDIA_ERROR,l),x.attachMedia(),x.mute(h.mute),x.volume(h.volume),F=new f.model({},x),F.setVolume(h.volume),F.setMute(h.mute),F.addEventListener(d.JWPLAYER_ERROR,l),D=h.playlist[h.item],w=h.getVideo().checkComplete()?a.IDLE:c.jwGetState(),r.checkBeforePlay()&&(w=a.PLAYING,T=!1),y=t.currentTime,F.setPlaylist([g]),N||((w==a.BUFFERING||w==a.PLAYING)&&t.pause(),I=new f.display(G),I.setAlternateClickHandler(function(b){F.state== +a.PAUSED?G.jwInstreamPlay():(G.jwInstreamPause(),s(d.JWPLAYER_INSTREAM_CLICK,b))}),M.appendChild(I.element()),e.isMobile()||(z=new f.controlbar(G),M.appendChild(z.element()),z.show()),B.setupInstream(M,z,I,t),v(),x.load(F.playlist[0])))};this.jwInstreamDestroy=function(b){if(E){E=!1;w!=a.IDLE?x.load(D,!1):x.stop();C.resetEventListeners();N||I.revertAlternateClickHandler();x.detachMedia();B.destroyInstream();if(z)try{z.element().parentNode.removeChild(z.getDisplayElement())}catch(c){}s(d.JWPLAYER_INSTREAM_DESTROYED, +{reason:b?"complete":"destroyed"},!0);r.attachMedia();if(w==a.BUFFERING||w==a.PLAYING)t.play(),h.playlist[h.item]==D&&T&&h.getVideo().seek(y)}};this.jwInstreamAddEventListener=function(a,b){C.addEventListener(a,b)};this.jwInstreamRemoveEventListener=function(a,b){C.removeEventListener(a,b)};this.jwInstreamPlay=function(){E&&(x.play(!0),h.state=jwplayer.events.state.PLAYING,I.show())};this.jwInstreamPause=function(){E&&(x.pause(!0),h.state=jwplayer.events.state.PAUSED,I.show())};this.jwInstreamSeek= +function(a){E&&x.seek(a)};this.jwPlay=function(){"true"==n.controlbarpausable.toString().toLowerCase()&&this.jwInstreamPlay()};this.jwPause=function(){"true"==n.controlbarpausable.toString().toLowerCase()&&this.jwInstreamPause()};this.jwStop=function(){"true"==n.controlbarstoppable.toString().toLowerCase()&&(this.jwInstreamDestroy(),c.jwStop())};this.jwSeek=function(a){switch(n.controlbarseekable.toLowerCase()){case "always":this.jwInstreamSeek(a);break;case "backwards":F.position>a&&this.jwInstreamSeek(a)}}; +this.jwSeekDrag=function(a){F.seekDrag(a)};this.jwGetPosition=function(){};this.jwGetDuration=function(){};this.jwGetWidth=c.jwGetWidth;this.jwGetHeight=c.jwGetHeight;this.jwGetFullscreen=c.jwGetFullscreen;this.jwSetFullscreen=c.jwSetFullscreen;this.jwGetVolume=function(){return h.volume};this.jwSetVolume=function(a){F.setVolume(a);c.jwSetVolume(a)};this.jwGetMute=function(){return h.mute};this.jwSetMute=function(a){F.setMute(a);c.jwSetMute(a)};this.jwGetState=function(){return h.state};this.jwGetPlaylist= +function(){return[A]};this.jwGetPlaylistIndex=function(){return 0};this.jwGetStretching=function(){return h.config.stretching};this.jwAddEventListener=function(a,b){C.addEventListener(a,b)};this.jwRemoveEventListener=function(a,b){C.removeEventListener(a,b)};this.jwSetCurrentQuality=function(){};this.jwGetQualityLevels=function(){return[]};this.skin=c.skin;this.id=c.id+"_instream";C=new d.eventdispatcher;c.jwAddEventListener(d.JWPLAYER_RESIZE,v);c.jwAddEventListener(d.JWPLAYER_FULLSCREEN,function(a){j(a); +v()});return this}})(jwplayer.html5); +(function(f){var h=f.utils,e=h.css,d=f.events.state,a=f.html5.logo=function(b,c){function k(a){h.exists(a)&&a.stopPropagation();if(!m||!l.link)g.jwGetState()==d.IDLE||g.jwGetState()==d.PAUSED?g.jwPlay():g.jwPause();m&&l.link&&(g.jwPause(),g.jwSetFullscreen(!1),window.open(l.link,l.linktarget))}var g=b,r=g.id+"_logo",l,j,q=a.defaults,m=!1;this.resize=function(){};this.element=function(){return j};this.offset=function(a){e("#"+r+" ",{"margin-bottom":a})};this.position=function(){return l.position}; +this.margin=function(){return parseInt(l.margin)};this.hide=function(a){if(l.hide||a)m=!1,j.style.visibility="hidden",j.style.opacity=0};this.show=function(){m=!0;j.style.visibility="visible";j.style.opacity=1};var p="o";g.edition&&(p=g.edition(),p="pro"==p?"p":"premium"==p?"r":"ads"==p?"a":"free"==p?"f":"o");if("o"==p||"f"==p)q.link="http://www.longtailvideo.com/jwpabout/?a\x3dl\x26v\x3d"+f.version+"\x26m\x3dh\x26e\x3d"+p;l=h.extend({},q,c);l.hide="true"==l.hide.toString();j=document.createElement("img"); +j.className="jwlogo";j.id=r;if(l.file){var q=/(\w+)-(\w+)/.exec(l.position),p={},s=l.margin;3==q.length?(p[q[1]]=s,p[q[2]]=s):p.top=p.right=s;e("#"+r+" ",p);j.src=(l.prefix?l.prefix:"")+l.file;j.onclick=k}else j.style.display="none";return this};a.defaults={prefix:h.repo(),file:"logo.png",linktarget:"_top",margin:8,hide:!1,position:"top-right"};e(".jwlogo",{cursor:"pointer",position:"absolute","z-index":100,opacity:0});h.transitionStyle(".jwlogo","visibility .15s, opacity .15s")})(jwplayer); +(function(f){var h=f.html5,e=f.utils,d=e.css,a=void 0;h.menu=function(b,c,f,g){function r(a,b){return function(){v(a);q&&q(b)}}function l(a,b){var c=document.createElement("div");a&&(c.className=a);b&&b.appendChild(c);return c}function j(b){return(b=f.getSkinElement("tooltip",b))?b:{width:0,height:0,src:a}}var q=g,m=new h.overlay(c+"_overlay",f);g=e.extend({fontcase:a,fontcolor:"#cccccc",fontsize:11,fontweight:a,activecolor:"#ffffff",overcolor:"#ffffff"},f.getComponentSettings("tooltip"));var p,s= +[];this.element=function(){return m.element()};this.addOption=function(a,b){var d=l("jwoption",p);d.id=c+"_option_"+b;d.innerHTML=a;d.addEventListener("click",r(s.length,b));s.push(d)};this.clearOptions=function(){for(;0a?(a= +0,b=!0):a=-1==a||a>c.playlist.length?c.playlist.length-1:a;if(b||a!=c.item)c.item=a,c.sendEvent(e.JWPLAYER_PLAYLIST_ITEM,{index:c.item})};c.setVolume=function(a){c.mute&&0a&&(a=0);1parseFloat(jwplayer.version))&&s("Incompatible player version");if(0===a.length)p(m);else for(b=0;br[b].end;)b++;b==r.length&&b--;if(r[b].text)if(a=r[b].text,0>a.indexOf("://")&&(a=l?l+"/"+a:a),0D)&&Z(D);f()}},emptied:c,ended:function(){F&&z!=d.IDLE&&(N=-1,X=!0,b(e.JWPLAYER_MEDIA_BEFORECOMPLETE), +F&&(m(d.IDLE),X=!1,b(e.JWPLAYER_MEDIA_COMPLETE)))},error:function(){F&&(h.log("Error playing media: %o",n.error),M.sendEvent(e.JWPLAYER_MEDIA_ERROR,{message:"Error loading media: File could not be played"}),m(d.IDLE))},loadeddata:c,loadedmetadata:g,loadstart:c,pause:r,play:r,playing:r,progress:function(){y&&(0N&&(N=0);for(a=0;aa)&&(N=a,h.saveCookie("qualityLabel",G[a].label),b(e.JWPLAYER_MEDIA_LEVEL_CHANGED,{currentQuality:a, +levels:j(G)}),a=n.currentTime,q(),L.seek(a)))};L.getCurrentQuality=function(){return N};L.getQualityLevels=function(){return j(G)};n=a;h.foreach(v,function(a,b){n.addEventListener(a,b,!1)});n.controls=!0;n.controls=!1;n.setAttribute("x-webkit-airplay","allow");F=!0}})(jwplayer); +(function(f){var h=jwplayer.utils,e=jwplayer.events,d=e.state,a=h.css,b=h.isMobile(),c=h.isIPad(),k=h.isIPod(),g=h.isAndroid(),r=h.isIOS(),l=document,j="aspectMode",q="jwmain",m="jwvideo",p="jwplaylistcontainer",s=!0,v=!1,u="hidden",A="none",n="block";f.view=function(B,t){function y(a){a&&(a.element().addEventListener("mousemove",x,v),a.element().addEventListener("mouseout",z,v))}function w(a,b){var c=l.createElement(a);b&&(c.className=b);return c}function D(){clearTimeout(pa);if(S.jwGetState()== +d.PLAYING||S.jwGetState()==d.PAUSED)oa(),Aa||(pa=setTimeout(I,Da))}function x(){clearTimeout(pa);Aa=s}function z(){Aa=v}function I(){S.jwGetState()!=d.BUFFERING&&(H&&(!V&&!O)&&H.hide(),U&&(!ia&&!O)&&U.hide(),X());clearTimeout(pa);pa=0}function E(a){ba.sendEvent(a.type,a)}function C(b,c,d){h.exists(d)||(d=!0);h.exists(b)&&h.exists(c)&&(J.width=b,J.height=c);P.style.width=isNaN(b)?b:b+"px";-1==P.className.indexOf(j)&&(P.style.height=isNaN(c)?c:c+"px");R&&R.redraw();H&&H.redraw();W&&(W.offset(H&&0<= +W.position().indexOf("bottom")?H.height()+H.margin():0),setTimeout(function(){U&&U.offset("top-left"==W.position()?W.element().clientWidth+W.margin():0)},500));b=J.playlistsize;var f=J.playlistposition;M(c);if(K&&b&&("right"==f||"bottom"==f)){K.redraw();c={display:n};var g={};c[f]=0;g[f]=b;"right"==f?c.width=b:c.height=b;a(fa(p),c);a(fa(q),g)}F();d&&ba.sendEvent(e.JWPLAYER_RESIZE)}function M(a){V=b&&!O?v:0=a;H&&(V?(H.audioMode(s), +oa(),R.hidePreview(s),Z(),ea(v)):(H.audioMode(v),Pa(S.jwGetState())));W&&V&&X();P.style.backgroundColor=V?"transparent":"#000"}function F(){Y&&-1==P.className.indexOf(j)&&h.stretch(J.stretching,Y,ja.clientWidth,ja.clientHeight,Y.videoWidth,Y.videoHeight)}function G(a){if(J.fullscreen)switch(a.keyCode){case 27:Ba(v)}}function N(a){r||(a?(P.className+=" jwfullscreen",l.getElementsByTagName("body")[0].style["overflow-y"]=u):(P.className=P.className.replace(/\s+jwfullscreen/,""),l.getElementsByTagName("body")[0].style["overflow-y"]= +""))}function T(){var a;a:{a=[l.mozFullScreenElement,l.webkitCurrentFullScreenElement,Y.webkitDisplayingFullscreen];for(var b=0;bc||c>d)}else d=void 0;if(d)return h;d=a.substring(0,a.indexOf("://")+3);var c=a.substring(d.length,a.indexOf("/",d.length+1)),e;0===h.indexOf("/")?e=h.split("/"):(e=a.split("?")[0],e=e.substring(d.length+c.length+1,e.lastIndexOf("/")),e=e.split("/").concat(h.split("/"))); +for(var g=[],m=0;md&&0>c&&(!a||!isNaN(a))?n.CDN:n.RELATIVE}};b.getPluginName=function(a){return a.replace(/^(.*\/)?([^-]*)-?.*\.(swf|js)$/,"$2")};b.getPluginVersion=function(a){return a.replace(/[^-]*-?([^\.]*).*$/,"$1")}; +b.isYouTube=function(a){return-1=d.length&&(d[1]=0);for(var n=a.strToLongs(e.encode(b).slice(0,16)),h=d.length,f=d[h-1],p=d[0],q,j=Math.floor(6+52/h),g=0;0>>2&3;for(var m=0;m>>5^p<<2)+(p>>>3^f<<4)^(g^p)+(n[m&3^q]^f),f=d[m]+=f}d=a.longsToStr(d);return k.encode(d)};a.decrypt=function(c, +b){if(0==c.length)return"";for(var d=a.strToLongs(k.decode(c)),n=a.strToLongs(e.encode(b).slice(0,16)),h=d.length,f=d[h-1],p=d[0],q,j=2654435769*Math.floor(6+52/h);0!=j;){q=j>>>2&3;for(var g=h-1;0<=g;g--)f=d[0>>5^p<<2)+(p>>>3^f<<4)^(j^p)+(n[g&3^q]^f),p=d[g]-=f;j-=2654435769}d=a.longsToStr(d);d=d.replace(/\0+$/,"");return e.decode(d)};a.strToLongs=function(a){for(var b=Array(Math.ceil(a.length/4)),d=0;d>>8&255,a[d]>>>16&255,a[d]>>>24&255);return b.join("")};var k={code:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\x3d",encode:function(a,b){var d,n,h,f,p=[],q="",j,g,m=k.code;g=("undefined"==typeof b?0:b)?e.encode(a):a;j=g.length%3;if(0j++;)q+="\x3d",g+="\x00";for(j=0;j>18&63,n=f>>12&63,h=f>>6&63,f&=63,p[j/3]=m.charAt(d)+m.charAt(n)+m.charAt(h)+m.charAt(f);p=p.join("");return p=p.slice(0,p.length-q.length)+q},decode:function(a,b){b="undefined"==typeof b?!1:b;var d,f,h,r,p,q=[],j,g=k.code;j=b?e.decode(a):a;for(var m=0;m>>16&255,f=h>>>8&255,h&=255,q[m/4]=String.fromCharCode(d,f, +h),64==p&&(q[m/4]=String.fromCharCode(d,f)),64==r&&(q[m/4]=String.fromCharCode(d));r=q.join("");return b?e.decode(r):r}},e={encode:function(a){a=a.replace(/[\u0080-\u07ff]/g,function(a){a=a.charCodeAt(0);return String.fromCharCode(192|a>>6,128|a&63)});return a=a.replace(/[\u0800-\uffff]/g,function(a){a=a.charCodeAt(0);return String.fromCharCode(224|a>>12,128|a>>6&63,128|a&63)})},decode:function(a){a=a.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,function(a){a=(a.charCodeAt(0)&15)<<12| +(a.charCodeAt(1)&63)<<6|a.charCodeAt(2)&63;return String.fromCharCode(a)});return a=a.replace(/[\u00c0-\u00df][\u0080-\u00bf]/g,function(a){a=(a.charCodeAt(0)&31)<<6|a.charCodeAt(1)&63;return String.fromCharCode(a)})}}}(jwplayer.utils),function(f){f.events={COMPLETE:"COMPLETE",ERROR:"ERROR",API_READY:"jwplayerAPIReady",JWPLAYER_READY:"jwplayerReady",JWPLAYER_FULLSCREEN:"jwplayerFullscreen",JWPLAYER_RESIZE:"jwplayerResize",JWPLAYER_ERROR:"jwplayerError",JWPLAYER_SETUP_ERROR:"jwplayerSetupError",JWPLAYER_MEDIA_BEFOREPLAY:"jwplayerMediaBeforePlay", +JWPLAYER_MEDIA_BEFORECOMPLETE:"jwplayerMediaBeforeComplete",JWPLAYER_COMPONENT_SHOW:"jwplayerComponentShow",JWPLAYER_COMPONENT_HIDE:"jwplayerComponentHide",JWPLAYER_MEDIA_BUFFER:"jwplayerMediaBuffer",JWPLAYER_MEDIA_BUFFER_FULL:"jwplayerMediaBufferFull",JWPLAYER_MEDIA_ERROR:"jwplayerMediaError",JWPLAYER_MEDIA_LOADED:"jwplayerMediaLoaded",JWPLAYER_MEDIA_COMPLETE:"jwplayerMediaComplete",JWPLAYER_MEDIA_SEEK:"jwplayerMediaSeek",JWPLAYER_MEDIA_TIME:"jwplayerMediaTime",JWPLAYER_MEDIA_VOLUME:"jwplayerMediaVolume", +JWPLAYER_MEDIA_META:"jwplayerMediaMeta",JWPLAYER_MEDIA_MUTE:"jwplayerMediaMute",JWPLAYER_MEDIA_LEVELS:"jwplayerMediaLevels",JWPLAYER_MEDIA_LEVEL_CHANGED:"jwplayerMediaLevelChanged",JWPLAYER_CAPTIONS_CHANGED:"jwplayerCaptionsChanged",JWPLAYER_CAPTIONS_LIST:"jwplayerCaptionsList",JWPLAYER_PLAYER_STATE:"jwplayerPlayerState",state:{BUFFERING:"BUFFERING",IDLE:"IDLE",PAUSED:"PAUSED",PLAYING:"PLAYING"},JWPLAYER_PLAYLIST_LOADED:"jwplayerPlaylistLoaded",JWPLAYER_PLAYLIST_ITEM:"jwplayerPlaylistItem",JWPLAYER_PLAYLIST_COMPLETE:"jwplayerPlaylistComplete", +JWPLAYER_DISPLAY_CLICK:"jwplayerViewClick",JWPLAYER_CONTROLS:"jwplayerViewControls",JWPLAYER_INSTREAM_CLICK:"jwplayerInstreamClicked",JWPLAYER_INSTREAM_DESTROYED:"jwplayerInstreamDestroyed",JWPLAYER_AD_TIME:"jwplayerAdTime",JWPLAYER_AD_ERROR:"jwplayerAdError",JWPLAYER_AD_CLICK:"jwplayerAdClicked",JWPLAYER_AD_COMPLETE:"jwplayerAdComplete",JWPLAYER_AD_IMPRESSION:"jwplayerAdImpression",JWPLAYER_AD_COMPANIONS:"jwplayerAdCompanions"}}(jwplayer),function(f){var a=jwplayer.utils;f.eventdispatcher=function(f, +e){var c,b;this.resetEventListeners=function(){c={};b=[]};this.resetEventListeners();this.addEventListener=function(b,e,h){try{a.exists(c[b])||(c[b]=[]),"string"==a.typeOf(e)&&(e=(new Function("return "+e))()),c[b].push({listener:e,count:h})}catch(f){a.log("error",f)}return!1};this.removeEventListener=function(b,e){if(c[b]){try{for(var h=0;hparseFloat(f.version)))p=!0,q="Incompatible player version",d()}); +0==b&&d()}}var h=a.loaderstatus.NEW,r=!1,p=!1,q,j=b,g=new k.eventdispatcher;a.extend(this,g);this.setupPlugins=function(b,d,g){var h={length:0,plugins:{}},m=0,f={},j=c.getPlugins();e(d.plugins,function(c,e){var A=a.getPluginName(c),n=j[A],k=n.getFlashPath(),p=n.getJS(),q=n.getURL();k&&(h.plugins[k]=a.extend({},e),h.plugins[k].pluginmode=n.getPluginmode(),h.length++);try{if(p&&d.plugins&&d.plugins[q]){var r=document.createElement("div");r.id=b.id+"_"+A;r.style.position="absolute";r.style.top=0;r.style.zIndex= +m+10;f[A]=n.getNewInstance(b,a.extend({},d.plugins[q]),r);m++;b.onReady(g(f[A],r,!0));b.onResize(g(f[A],r))}}catch(E){a.log("ERROR: Failed to load "+A+".")}});b.plugins=f;return h};this.load=function(){if(!(a.exists(b)&&"object"!=a.typeOf(b))){h=a.loaderstatus.LOADING;e(b,function(b){a.exists(b)&&(b=c.addPlugin(b),b.addEventListener(k.COMPLETE,n),b.addEventListener(k.ERROR,m))});var d=c.getPlugins();e(d,function(a,b){b.load()})}n()};var m=this.pluginFailed=function(){p||(p=!0,q="File not found",d())}; +this.getStatus=function(){return h}}}(jwplayer),function(f){f.playlist=function(a){var k=[];if("array"==f.utils.typeOf(a))for(var e=0;em.playlist.length&&(0==m.playlist.length||!m.playlist[0].sources|| +0==m.playlist[0].sources.length))p();else if(y.getStatus()==a.loaderstatus.COMPLETE){for(var f=0;f=d||0>=c?0:100*(c/d)+"%")}-1==b.width.toString().indexOf("%")?delete b.aspectratio:d?b.aspectratio=d:delete b.aspectratio;return b}).addConfig=function(b,c){a(c);return e.extend(b,c)}}(jwplayer),function(f){var a=f.utils,k=document;f.embed.download=function(e,c,b){function d(b,c){for(var d=k.querySelectorAll(b),e=0;eg)return j.sendEvent(k.ERROR,{message:"Flash version must be 10.0 or greater"}), +!1;var f,l,t=h.config.listbar,u=a.extend({},d);if(c.id+"_wrapper"==c.parentNode.id)f=document.getElementById(c.id+"_wrapper");else{f=document.createElement("div");l=document.createElement("div");l.style.display="none";l.id=c.id+"_aspect";f.id=c.id+"_wrapper";f.style.position="relative";f.style.display="block";f.style.width=a.styleDimension(u.width);f.style.height=a.styleDimension(u.height);if(h.config.aspectratio){var w=parseFloat(h.config.aspectratio);l.style.display="block";l.style.marginTop=h.config.aspectratio; +f.style.height="auto";f.style.display="inline-block";t&&("bottom"==t.position?l.style.paddingBottom=t.size+"px":"right"==t.position&&(l.style.marginBottom=-1*t.size*(w/100)+"px"))}c.parentNode.replaceChild(f,c);f.appendChild(c);f.appendChild(l)}f=n.setupPlugins(h,u,p);0= +u.height?"transparent":"opaque";l="height width modes events primary base fallback volume".split(" ");for(t=0;t and

+ + + + \ No newline at end of file diff --git a/templates/views/UserListItemView.html b/templates/views/UserListItemView.html index 044cdec..fcbde3f 100755 --- a/templates/views/UserListItemView.html +++ b/templates/views/UserListItemView.html @@ -44,12 +44,12 @@

- | <%= mix_count%> Mixes - | <%= favourite_count %> + | <%= mix_count%> Mixes + | <%= favourite_count %> Favourites - | <%= like_count %> Likes - | <%= follower_count %> Followers - | <%= following_count %> Following + | <%= like_count %> Likes + | <%= follower_count %> Followers + | <%= following_count %> Following

diff --git a/templates/views/_MixItemInsert.html b/templates/views/_MixItemInsert.html index 74ade6e..a7a5faf 100755 --- a/templates/views/_MixItemInsert.html +++ b/templates/views/_MixItemInsert.html @@ -95,6 +95,12 @@ Twitter +
  • + +
  • diff --git a/templates/views/dlg/EmbedCodes.html b/templates/views/dlg/EmbedCodes.html new file mode 100644 index 0000000..73aca0f --- /dev/null +++ b/templates/views/dlg/EmbedCodes.html @@ -0,0 +1,14 @@ +{% extends 'views/dlg/_DialogBase.html' %} + +{% load account %} +{% load socialaccount %} +{% block header %} +

    Embed Codes!!

    +{% endblock %} +{% block content %} + + +{% endblock %} +{% block primarybutton %}Got it...{% endblock %} \ No newline at end of file