From 980e28eb54f7e0e1f9524a434a5b3d0e5e27b8df Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 6 Nov 2017 11:22:31 -0500 Subject: [PATCH 001/109] deleting author should return to edit page --- frontend/views/bibedit.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/views/bibedit.py b/frontend/views/bibedit.py index b2f504d4..2ccf6117 100644 --- a/frontend/views/bibedit.py +++ b/frontend/views/bibedit.py @@ -218,6 +218,7 @@ def edit_edition(request, work_id, edition_id, by=None): 'title': title, } if request.method == 'POST': + keep_editing = request.POST.has_key('add_author_submit') form = None edition.new_authors = zip( request.POST.getlist('new_author'), @@ -229,12 +230,14 @@ def edit_edition(request, work_id, edition_id, by=None): if request.POST.has_key('delete_author_%s' % author.id): edition.remove_author(author) form = EditionForm(instance=edition, data=request.POST, files=request.FILES) + keep_editing = True break work_rels = models.WorkRelation.objects.filter(Q(to_work=work) | Q(from_work=work)) for work_rel in work_rels: if request.POST.has_key('delete_work_rel_%s' % work_rel.id): work_rel.delete() form = EditionForm(instance=edition, data=request.POST, files=request.FILES) + keep_editing = True break activate_all = request.POST.has_key('activate_all_ebooks') deactivate_all = request.POST.has_key('deactivate_all_ebooks') @@ -247,6 +250,7 @@ def edit_edition(request, work_id, edition_id, by=None): ebook.deactivate() ebookchange = True if ebookchange: + keep_editing = True form = EditionForm(instance=edition, data=request.POST, files=request.FILES) if request.POST.get('add_author', None) and admin: @@ -255,7 +259,7 @@ def edit_edition(request, work_id, edition_id, by=None): if (new_author_name, new_author_relation) not in edition.new_authors: edition.new_authors.append((new_author_name, new_author_relation)) form = EditionForm(instance=edition, data=request.POST, files=request.FILES) - if not request.POST.has_key('add_author_submit') and admin: + if not keep_editing and admin: if form.is_valid(): form.save() if not work: From 6487916adb1c2a44950387efdeec7f29c6a93bb0 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 6 Nov 2017 12:38:06 -0500 Subject: [PATCH 002/109] omit review metadata --- core/loaders/scrape.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index 8167412e..c0d00c4f 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -30,6 +30,8 @@ class BaseScraper(object): if response.status_code == 200: self.base = response.url self.doc = BeautifulSoup(response.content, 'lxml') + for review in self.doc.find_all(itemtype="http://schema.org/Review"): + review.clear() self.setup() self.get_genre() self.get_title() From 98cbef710418a84f0813da804944fc5709ce4f59 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 6 Nov 2017 12:42:52 -0500 Subject: [PATCH 003/109] gather isbns from schema.org and stop raising unwanted exceptions --- core/loaders/scrape.py | 20 +++++++++++++------- core/validation.py | 20 +++++++++++++------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index c0d00c4f..a55ca25a 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -143,15 +143,21 @@ class BaseScraper(object): def get_isbns(self): '''return a dict of edition keys and ISBNs''' isbns = {} + isbn_cleaner = identifier_cleaner('isbn', quiet=True) label_map = {'epub': 'EPUB', 'mobi': 'Mobi', 'paper': 'Paperback', 'pdf':'PDF', 'hard':'Hardback'} for key in label_map.keys(): isbn_key = 'isbn_{}'.format(key) value = self.check_metas(['citation_isbn'], type=label_map[key]) - value = identifier_cleaner('isbn')(value) + value = isbn_cleaner(value) if value: isbns[isbn_key] = value self.identifiers[isbn_key] = value + if not isbns: + values = self.get_itemprop('isbn') + if values: + value = isbn_cleaner(values[0]) + isbns = {'':value} if value else {} return isbns def get_identifiers(self): @@ -159,11 +165,11 @@ class BaseScraper(object): if not value: value = self.doc.select_one('link[rel=canonical]') value = value['href'] if value else None - value = identifier_cleaner('http')(value) + value = identifier_cleaner('http', quiet=True)(value) if value: self.identifiers['http'] = value value = self.check_metas(['DC.Identifier.DOI', 'citation_doi']) - value = identifier_cleaner('doi')(value) + value = identifier_cleaner('doi', quiet=True)(value) if value: self.identifiers['doi'] = value @@ -172,7 +178,7 @@ class BaseScraper(object): for link in links: oclcmatch = CONTAINS_OCLCNUM.search(link['href']) if oclcmatch: - value = identifier_cleaner('oclc')(oclcmatch.group(1)) + value = identifier_cleaner('oclc', quiet=True)(oclcmatch.group(1)) if value: self.identifiers['oclc'] = value break @@ -191,7 +197,7 @@ class BaseScraper(object): value = self.check_metas(['citation_isbn'], list_mode='list') if len(value): for isbn in value: - isbn = identifier_cleaner('isbn')(isbn) + isbn = identifier_cleaner('isbn', quiet=True)(isbn) if isbn: ed_list.append({ '_edition': isbn, @@ -297,7 +303,7 @@ class PressbooksScraper(BaseScraper): '''add isbn identifiers and return a dict of edition keys and ISBNs''' isbns = {} for (key, label) in [('electronic', 'Ebook ISBN'), ('paper', 'Print ISBN')]: - isbn = identifier_cleaner('isbn')(self.get_dt_dd(label)) + isbn = identifier_cleaner('isbn', quiet=True)(self.get_dt_dd(label)) if isbn: self.identifiers['isbn_{}'.format(key)] = isbn isbns[key] = isbn @@ -337,7 +343,7 @@ class HathitrustScraper(BaseScraper): def get_isbns(self): isbn = self.record.get('issn', []) - value = identifier_cleaner('isbn')(isbn) + value = identifier_cleaner('isbn', quiet=True)(isbn) return {'print': value} if value else {} def get_title(self): diff --git a/core/validation.py b/core/validation.py index 2306b83d..26ab5446 100644 --- a/core/validation.py +++ b/core/validation.py @@ -70,7 +70,7 @@ ID_MORE_VALIDATION = { 'olwk': doi_cleaner, } -def identifier_cleaner(id_type): +def identifier_cleaner(id_type, quiet=False): if ID_VALIDATION.has_key(id_type): (regex, err_msg) = ID_VALIDATION[id_type] extra = ID_MORE_VALIDATION.get(id_type, None) @@ -79,12 +79,18 @@ def identifier_cleaner(id_type): def cleaner(value): if not value: return None - if regex.match(value): - if extra: - value = extra(value) - return value - else: - raise ValidationError(err_msg) + try: + if regex.match(value): + if extra: + value = extra(value) + return value + else: + raise ValidationError(err_msg) + except ValidationError as ve: + if quiet: + return None + else: + raise ve return cleaner return lambda value: value From 96f40a85149541ba8e2dcc525b4220fbfbd2492f Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 7 Nov 2017 10:43:40 -0500 Subject: [PATCH 004/109] add rh agreement form --- core/migrations/0011_auto_20171106_2218.py | 59 +++++++++++ core/models/__init__.py | 12 ++- frontend/forms/__init__.py | 28 +----- frontend/forms/rh_forms.py | 65 ++++++++++++ frontend/templates/agreed.html | 19 ++++ frontend/templates/base.html | 4 +- frontend/templates/manage_campaign.html | 4 - frontend/templates/programs.html | 30 ++++++ frontend/templates/rh_agree.html | 111 +++++++++++++++++++++ frontend/templates/rh_tools.html | 16 ++- frontend/urls.py | 4 +- frontend/views/__init__.py | 21 +++- static/css/sitewide4.css | 2 +- static/less/sitewide4.less | 4 +- 14 files changed, 327 insertions(+), 52 deletions(-) create mode 100644 core/migrations/0011_auto_20171106_2218.py create mode 100644 frontend/forms/rh_forms.py create mode 100644 frontend/templates/agreed.html create mode 100644 frontend/templates/programs.html create mode 100644 frontend/templates/rh_agree.html diff --git a/core/migrations/0011_auto_20171106_2218.py b/core/migrations/0011_auto_20171106_2218.py new file mode 100644 index 00000000..8214b680 --- /dev/null +++ b/core/migrations/0011_auto_20171106_2218.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0010_userprofile_works'), + ] + + operations = [ + migrations.RenameField( + model_name='rightsholder', + old_name='can_sell', + new_name='approved', + ), + migrations.AddField( + model_name='rightsholder', + name='address', + field=models.CharField(default=b'', max_length=400), + ), + migrations.AddField( + model_name='rightsholder', + name='mailing', + field=models.CharField(default=b'', max_length=400), + ), + migrations.AddField( + model_name='rightsholder', + name='signature', + field=models.CharField(default=b'', max_length=100), + ), + migrations.AddField( + model_name='rightsholder', + name='signer', + field=models.CharField(default=b'', max_length=100), + ), + migrations.AddField( + model_name='rightsholder', + name='signer_ip', + field=models.CharField(max_length=20, null=True), + ), + migrations.AddField( + model_name='rightsholder', + name='signer_title', + field=models.CharField(default=b'', max_length=30), + ), + migrations.AddField( + model_name='rightsholder', + name='telephone', + field=models.CharField(max_length=30, blank=True), + ), + migrations.AlterField( + model_name='rightsholder', + name='email', + field=models.CharField(default=b'', max_length=100), + ), + ] diff --git a/core/models/__init__.py b/core/models/__init__.py index 54d6596d..974e9fb5 100755 --- a/core/models/__init__.py +++ b/core/models/__init__.py @@ -201,10 +201,18 @@ post_save.connect(notify_claim, sender=Claim) class RightsHolder(models.Model): created = models.DateTimeField(auto_now_add=True) - email = models.CharField(max_length=100, blank=True) + email = models.CharField(max_length=100, blank=False, default='') rights_holder_name = models.CharField(max_length=100, blank=False) owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="rights_holder", null=False) - can_sell = models.BooleanField(default=False) + approved = models.BooleanField(default=False) + address = models.CharField(max_length=400, blank=False, default='') + mailing = models.CharField(max_length=400, blank=False, default='') + telephone = models.CharField(max_length=30, blank=True) + signer = models.CharField(max_length=100, blank=False, default='') + signer_ip = models.CharField(max_length=20, null=True) + signer_title = models.CharField(max_length=30, blank=False, default='') + signature = models.CharField(max_length=100, blank=False, default='' ) + def __unicode__(self): return self.rights_holder_name diff --git a/frontend/forms/__init__.py b/frontend/forms/__init__.py index 5f6cafb8..e9af19af 100644 --- a/frontend/forms/__init__.py +++ b/frontend/forms/__init__.py @@ -64,6 +64,8 @@ from regluit.utils.fields import ISBNField from .bibforms import EditionForm, IdentifierForm +from .rh_forms import RightsHolderForm + from questionnaire.models import Questionnaire logger = logging.getLogger(__name__) @@ -192,32 +194,6 @@ def UserClaimForm ( user_instance, *args, **kwargs ): return ClaimForm() -class RightsHolderForm(forms.ModelForm): - owner = AutoCompleteSelectField( - OwnerLookup, - label='Owner', - widget=AutoCompleteSelectWidget(OwnerLookup), - required=True, - error_messages={'required': 'Please ensure the owner is a valid Unglue.it account.'}, - ) - email = forms.EmailField( - label=_("notification email address for rights holder"), - max_length=100, - error_messages={'required': 'Please enter an email address for the rights holder.'}, - ) - class Meta: - model = RightsHolder - exclude = () - - def clean_rights_holder_name(self): - rights_holder_name = self.data["rights_holder_name"] - try: - RightsHolder.objects.get(rights_holder_name__iexact=rights_holder_name) - except RightsHolder.DoesNotExist: - return rights_holder_name - raise forms.ValidationError(_("Another rights holder with that name already exists.")) - - class ProfileForm(forms.ModelForm): clear_facebook = forms.BooleanField(required=False) clear_twitter = forms.BooleanField(required=False) diff --git a/frontend/forms/rh_forms.py b/frontend/forms/rh_forms.py new file mode 100644 index 00000000..aaa6ff22 --- /dev/null +++ b/frontend/forms/rh_forms.py @@ -0,0 +1,65 @@ +from django import forms + +from regluit.core.models import RightsHolder + +class RightsHolderForm(forms.ModelForm): + email = forms.EmailField( + help_text='notification email address for rights holder', + max_length=100, + error_messages={ + 'required': 'Please enter a contact email address for the rights holder.' + }, + ) + use4both = forms.BooleanField(label='use business address as mailing address') + def clean_rights_holder_name(self): + rights_holder_name = self.data["rights_holder_name"] + try: + RightsHolder.objects.get(rights_holder_name__iexact=rights_holder_name) + except RightsHolder.DoesNotExist: + return rights_holder_name + raise forms.ValidationError('Another rights holder with that name already exists.') + + class Meta: + model = RightsHolder + exclude = ('approved', 'signer_ip') + widgets = { + 'address': forms.Textarea(attrs={'rows': 4}), + 'mailing': forms.Textarea(attrs={'rows': 4}), + 'owner': forms.HiddenInput() + } + help_texts = { + 'signature': 'Type your name to enter your electronic signature.', + 'rights_holder_name': 'Enter the rights holder\'s legal name.', + } + error_messages = { + 'address': { + 'required': 'A business address for the rights holder is required.' + }, + 'mailing': { + 'required': 'Enter a mailing address for the rights holder, if different from the \ + business address.' + }, + 'rights_holder_name': { + 'required': 'Enter the rights holder\'s legal name.' + }, + 'signature': { + 'required': 'Type your name to enter your electronic signature.' + }, + 'signer': { + 'required': 'Please enter the name of the person signing on behalf of the rights \ + holder.' + }, + 'signer_title': { + 'required': 'Please enter the signer\'s title. (Use \'self\' if you are \ + personally the rights holder.)' + }, + } + +'''class RightsHolderApprovalForm(RightsHolderForm): + owner = AutoCompleteSelectField( + OwnerLookup, + label='Owner', + widget=AutoCompleteSelectWidget(OwnerLookup), + required=True, + ) +''' diff --git a/frontend/templates/agreed.html b/frontend/templates/agreed.html new file mode 100644 index 00000000..f2d8535b --- /dev/null +++ b/frontend/templates/agreed.html @@ -0,0 +1,19 @@ +{% extends 'basedocumentation.html' %} + +{% block title %} Agreement Submitted {% endblock %} +{% block extra_extra_head %} +{{ block.super }} + + + +{% endblock %} + +{% block topsection %} +{% endblock %} + +{% block doccontent %} +

You're a pending Unglue.it Rights Holder!

+ +Your Unglue.it Rights Holder Agreement has been submitted. Our staff will verify your existence and email you a countersigned agreement. At that point, you'll be able to use all of the Unglue.it rights holder tools. + +{% endblock %} \ No newline at end of file diff --git a/frontend/templates/base.html b/frontend/templates/base.html index a2f38781..032cb560 100644 --- a/frontend/templates/base.html +++ b/frontend/templates/base.html @@ -135,8 +135,9 @@ diff --git a/frontend/templates/manage_campaign.html b/frontend/templates/manage_campaign.html index d4afbef8..94f47dd0 100644 --- a/frontend/templates/manage_campaign.html +++ b/frontend/templates/manage_campaign.html @@ -117,7 +117,6 @@ Please fix the following before launching your campaign: {% csrf_token %} {{ form.media }}

Edit the editions (if needed)

- {% if campaign.rh.can_sell %} {% if campaign.work.ebookfiles.0 %}

You have uploaded ebook files for this work.

{% else %} @@ -128,7 +127,6 @@ Please fix the following before launching your campaign:

To distribute ebooks as part of a thanks for ungluing campaign, you will need to upload the ebook files to unglue.it.

{% endifequal %} {% endif %} - {% endif %}

Please choose the edition that most closely matches the edition to be unglued. This is the edition whose cover image will display on your book's page. Your unglued edition should be identical to this edition if possible; you should note any differences under Rights Details below.

{{ form.edition.errors }} @@ -138,13 +136,11 @@ Please fix the following before launching your campaign:
  • Edit this edition
  • {% ifnotequal campaign.type 1 %} - {% if campaign.rh.can_sell %} {% if edition.ebook_files.all.0 %}
  • You have uploaded ebook files for this edition. You can manage its ebooks or upload another
  • {% else %}
  • You can Manage ebooks for this edition.
  • {% endif %} - {% endif %} {% endifnotequal %}

diff --git a/frontend/templates/programs.html b/frontend/templates/programs.html new file mode 100644 index 00000000..92c5cfc9 --- /dev/null +++ b/frontend/templates/programs.html @@ -0,0 +1,30 @@ +

Unglue Program Terms

+

Pledge-to-Unglue Program

+

1. Description. Under the Pledge-to-Unglue program, the Rights Holder conducts a pledge campaign to raise a designated level of donated funds to facilitate the immediate Ungluing of an Uploaded Uploaded Work. The Ungluing Date shall be scheduled no later than 90 days after the Campaign Goal has been met.

+

2. Campaign Goal Specifications. The Rights Holder will designate, for each Uploaded Work:

+

(a) the dollar amount for the Campaign Goal;

+

(b) the date upon which the campaign will commence;

+

(c) the date upon which the campaign will end.

+

Once an Unglue.it campaign has been launched, the Campaign Goal cannot be increased at any time for any reason.

+

3. Unglue.it Service Fees.

+

Processing Fee in the amount of the greater of $60 or six percent (6%) of total gross aggregate contributions received in connection with the campaign. All Processing Fees shall be payable out of the proceeds of a successfully completed campaign, and shall be payable in addition to third party payment processing fees.

+

Buy-to-Unglue Program

+

1. Description. Under the Buy-to-Unglue program, the Rights Holder charges a License Fee to make copies of a Uploaded Work available to individuals, libraries and institutions through Unglue.it and agrees to Unglue the Uploaded Work once the Rights Holder’s designated sales target has been met. The Ungluing Date is determined by the fraction of the Campaign goal that has been met, together with the Campaign Goal Specifications.

+

2. Campaign Goal Specifications. The Rights Holder will designate, for each Uploaded Work:

+

(a) the dollar amount for the Campaign Goal;

+

(b) the initial Ungluing Date*;

+

(c) the date upon which the campaign will commence;

+

(d) the License Fees.

+

Once an Unglue.it campaign has been launched, the Campaign Goal cannot be increased at any time for any reason, and the initial Ungluing Date cannot be changed. Notwithstanding the above, the License Fees can be increased or decreased at any time at the sole discretion of the Rights Holder.

+

*In the case of the Buy-to-Unglue program, the Ungluing Date advances according to the progress towards the Campaign Goal. The mechanism of advance shall be determined by the website terms of service in effect on the date of the launch of the campaign.

+

3. Unglue.it Service Fees

+

(a) Distribution Fee in the amount of twenty-five percent (25%) of the gross revenues received by the Distributor from (i) the sale of the Uploaded Works through the Program; (ii) the licensing of the Uploaded Works by the Distributor to libraries and other third party distributors; and (iii) from any other sources in connection with the distribution of the Uploaded Work by the Distributor.

+

(b) Transaction Fee in the amount of twenty-five cents ($0.25) per transaction.

+

The Distribution Fee and Transaction Fee shall be deducted from proceeds of sale and other license fees collected by the Distributor, and paid to the Distributor prior to the remission of revenues to the Rights Holder. The Distribution Fee is inclusive of third party processing fees up to a cap of 3% of the gross amount plus 33 cents ($0.33) per transaction.

+

Thanks-for-Ungluing Program

+

1. Description. Under the Thanks-for-Ungluing program, the Rights Holder immediately releases an Unglued Edition to the licensee, but suggests a “Thank-You” donation amount. The licensee has the option of paying the suggested “Thank You” donation, or a greater or lesser amount (may be zero).

+

2. Campaign Goal Specifications. The Rights Holder will designate a suggested “Thank You” donation amount for each Uploaded Work.

+

3. Unglue.it Service Fees

+

(a) Distribution Fee in the amount of eight percent (8%) of the gross revenues received by the Distributor from payments made as “Thank You” donations.

+

(b) Transaction Fee in the amount of twenty-five cents ($0.25) per transaction.

+

The Distribution Fee and Transaction Fee shall be deducted from the donations collected by the Distributor, and paid to the Distributor prior to the remission of revenues to the Rights Holder. The Distribution Fee is inclusive of third party payment processing fees up to a cap of 3% of the gross amount plus 33 cents ($0.33) per transaction.

diff --git a/frontend/templates/rh_agree.html b/frontend/templates/rh_agree.html new file mode 100644 index 00000000..ce0eb4a0 --- /dev/null +++ b/frontend/templates/rh_agree.html @@ -0,0 +1,111 @@ +{% extends 'basedocumentation.html' %} + +{% block title %} Rights Holder Agreement {% endblock %} +{% block extra_extra_head %} +{{ block.super }} + + + + +{% endblock %} + +{% block topsection %} +{% endblock %} + +{% block doccontent %} +{% if request.user.is_authenticated %} +
+
+
{% csrf_token %} {{ form.owner }} +

UNGLUE.IT RIGHTS HOLDER AGREEMENT

+{{ form.rights_holder_name.errors }} +

Rights Holder: {{ form.rights_holder_name }}

+

Unglue.it Username for Rights Holder: {{ request.user.username }}

+{{ form.address.errors }} +

Business Address:
{{ form.address }}

+{{ form.mailing.errors }} +

Mailing Address: copy from Business Address {{ form.use4both }}
{{ form.mailing }}

+{{ form.telephone.errors }}{{ form.email.errors }} +

Tel: {{ form.telephone }} Email: {{ form.email }}

+{{ form.signer.errors }} +

Signer Name: {{ form.signer }}

+{{ form.signer_title.errors }} +

Signer Title: {{ form.signer_title }}

+

FREE EBOOK FOUNDATION, INC., a New Jersey Not-for-profit corporation (Distributor), and the above described Rights Holder, agree as follows:

+

1. Parties. The Distributor is the owner and operator of Unglue.it, a platform for the digital distribution of written materials via the unglue.it website and any other URLs designated by the Distributor for such purpose. The Rights Holder is the copyright owner or authorized publisher or licensed distributor of certain published written materials which the Rights Holder wants to distribute on Unglue.it.

+

2. Purpose. This Agreement sets forth the rights and obligations of the parties and applies to all written materials uploaded by the Rights Holder onto the Unglue.it platform using the Unglue.it web interface (individually, a Uploaded Work and collectively, Uploaded Works). The parties intend to collaborate in the release and distribution of the Uploaded Works under a Creative Commons License or such other "free" license as shall then pertain to release of creative works (CC License). For works not yet released under such a license, the date that the Rights Holder agrees, as determined by terms of the applicable Programs, to release a Uploaded Work under a CC License pursuant to this Agreement shall be referred to as the Ungluing Date.

+

3. Term and Termination. The term of this Agreement shall begin on the Effective Date. Either party may terminate this Agreement at any time upon thirty (30) days’ notice to the other party. All licenses issued to third parties during the Term are irrevocable (except in the case of a breach by the third party licensee) and shall survive termination. In particular, the Rights Holder must release of the Uploaded Works pursuant to a CC License on or before the determined Ungluing Date, even if the Ungluing Date occurs after the termination of this Agreement.

+

4. Programs. The Distributor has one or more models for the distribution and release of Uploaded Works on Unglue.it, as specified in the Program Terms. Under each Program, the Rights Holder agrees to release and distribute the Uploaded Work in a digital format under a CC License (Unglue the Uploaded Work) pursuant to the applicable Program Terms.

+

5. Grant of Rights. The Rights Holder hereby authorizes the Distributor as follows:

+

(a) to display and market Uploaded Works on the Platform, and to copy and transmit Uploaded Works as may be required in order to fulfill its obligations to Ungluers and other licensees pursuant to the terms of use set forth on the Unglue.it website or any applicable licensing agreement or CC License as applicable;

+

(b) to use the Rights Holder’s name or trademark in association with Uploaded Works or for promotional or editorial purposes in connection with the Programs;

+

(c) to collect revenues on behalf of the Rights Holder from supporters, purchasers and licensees of Uploaded Works (Ungluers) using a third party payment processor selected in the sole discretion of the Distributor;

+

(d) to retain, reserve and distribute payments to the Rights Holder and to the Distributor or otherwise pursuant to the terms of this Agreement, or to any agreement that the Distributor may have with a third party payment processor (including, but not limited to, a reasonable reserve against chargebacks or returns for a period of up to six months);

+

(e) to convey licenses for the Uploaded Works to individuals pursuant to the terms set forth in the Terms of Use set forth on the Unglue.it website (as amended from time to time in the sole discretion of the Distributor);

+

(f) to convey licenses for the Uploaded Works to libraries and similar non-profit institutions based on the terms set forth in the then current version of the Unglue.it Library License Agreement, a copy of which shall be provided to the Rights Holder upon request; and

+

(g) to insert the corresponding license notices into the Uploaded Works that reflect the then current Ungluing Date and other applicable license terms.

+

6. Service Fees. As full compensation for the services provided by the Distributor in connection with the Programs, the Rights Holder shall pay to the Distributor, and hereby authorizes the Distributor to withhold from revenues collected by the Distributor on behalf of the Rights Holder the fees set forth in the applicable Program Terms.

+

7. Payments to Rights Holder.

+

(a) In no event shall payment be made until the Rights Holder has delivered to the Distributor a digital file for the applicable Uploaded Work that complies with the delivery specifications set forth on the then-current Unglue.it website terms of use.

+

(b) The Distributor shall pay the Rights Holder the proceeds due and owing pursuant to the applicable Program Terms no less than quarterly (or more frequently at the discretion of the Distributor) in arrears, payable on the fifteenth day of the month following the close of each calendar quarter, such payment to cover the previous calendar quarter. For example, payments due in connection with transactions that occur January 1 through March 31 will be paid to the Rights Holder on April 15 of the same year. Each payment shall be accompanied by a statement detailing sales and licensing data, revenues received, return data, reserve and Distribution Fees withheld. Notwithstanding the above, quarterly payments may be deferred until the following pay period in the event that the amount payable to the Rights Holder for any given pay period is less than $100.

+

8. Rights Holder Warrantees and Representations. The Rights Holder warrants and represents as follows:

+

(a) The Rights Holder is the sole owner of the copyright in the each Uploaded Work, or has the full power and authority to enter into this Agreement on behalf of the copyright owners of each Uploaded Work.

+

(b) The signer of this Agreement has full authority to enter into this Agreement on behalf of this Rights Holder and to bind the Rights Holder by their signature.

+

(c) The Rights Holder has all rights necessary to grant the rights granted to the Distributor pursuant to this Agreement, including but not limited to the right to display, market, copy, distribute and transmit the Uploaded Works on the Unglue.it website, the right to license the Uploaded Works to third party individuals, libraries and institutions as contemplated under this Agreement, and to release digital copies of the Uploaded Works under a Creative Commons license upon the successful completion of a campaign.

+

(d) Neither the Rights Holder nor the copyright owner has entered any agreements with any third party that impact the ability of the Rights Holder to enter into this Agreement or to comply with its obligations hereunder, including but not limited to the obligation to release the Uploaded Work under a CC License on the Ungluing Date.

+

(e) The Rights Holder assumes sole responsibility for the payment of any royalties or other fees that may be due to third parties in connection with revenues collected by the Distributor in connection with the Uploaded Work.

+

(f) Each Uploaded Work is original to the copyright owner or the credited author and does not infringe on any statutory or common law copyright or any proprietary right of any third party.

+

(g) Each Uploaded Work does not invade the privacy of any third party, or contain matter libelous or otherwise in contravention of the rights of any third person.

+

(h) Each Uploaded Work contains no matter the publication or distribution of which would otherwise violate any federal or state statute or regulation, nor is the Uploaded Work in any manner unlawful, and nothing in the Uploaded Work shall be injurious to the health of a reader of the Uploaded Work.

+

(i) There is no threatened or pending litigation or third party claim that relates to any Uploaded Work.

+

(j) The Rights Holder shall comply with the terms set forth in the then current Terms of Use set forth on the Unglue.it website pertaining to the content that may be posted on the Unglue.it site in connection with any campaign.

+

(k) The Rights Holder shall timely pay any sales taxes, withholding or other taxes relating to revenues processed by the Distributor on behalf of the Rights Holder.

+

(l) The Rights Holder agrees that any data obtained from Unglue.it or the distributor must always be handled in accordance with the Unglue.it Terms of Service and Privacy Notice.

+

9. Reliance of the Distributor on the Rights Holder Representations and Warrantees. Each of the representations and warrantees of the Rights Holder set forth in this Agreement is true as of the date of this Agreement and shall remain true during the Term. The Distributor may rely on the truth of such representations and warrantees in dealing with any third party including but not limited to Ungluers and licensees. The Distributor is under no obligation to make an independent investigation to determine whether the above representations are true and accurate. Upon the Distributor’s request, the Rights Holder shall provide the Distributor with copies of any and all prior publishing agreements and rights agreements, assignments, releases and consents relating to any Uploaded Work submitted to the Distributor in connection with a Program. The Distributor may, in its sole discretion, decline to accept any Uploaded Work as part of any Program, for any reason or for no reason.

+

10. Indemnification. The Rights Holder shall indemnify and hold harmless the Distributor, its officers, directors, employees, agents, licensees and assigns (Indemnified Parties) from any losses, liabilities, damages, costs and expenses (including reasonable attorneys’ fees) that may arise out of any claim by the Distributor or any third party relating to the alleged breach of any of the Rights Holder’s warrantees and representation as set forth in this Agreement.

+

11. Limitation of Liability. Under no circumstances, including, without limitation, negligence, shall the Distributor or its directors, affiliates, officers, employees, or agents be responsible for any indirect, incidental, special, or consequential damages arising from or in connection with the use of or the inability to use the Program or the web interface, or any content contained on the Unglue.it website, including, without limitation, damages for loss of profits, use, data, or other intangibles.

+

12. No Joint Venture. This Agreement shall not be deemed to have created an agency relationship, partnership or joint venture between the parties.

+

13. Entire Understanding. This Agreement, together with the Terms of Service contained on the Distributor’s website as updated by the Distributor from time to time without notice to the Rights Holder, and any applicable CC licenses, constitute the entire agreement between the parties and supersedes any previous agreements and understandings had between the parties with respect to the Uploaded Works.

+

14. Governing Law; Venue. This Agreement is governed by and shall be interpreted and construed according to the laws of the United States with respect to copyright law and the laws of New York with regard to all other matters. At the Distributor’s option, any claim arising out of or related to this Agreement shall be settled by arbitration administered by a neutral arbitrator selected by the parties. If the Distributor elects to use the court system as its preferred mode of dispute resolution, then the dispute shall be subject to the exclusive jurisdiction of New York State. Prior to the commencement of any arbitration or litigation proceeding, the Distributor may elect to require that the parties’ participate in good faith effort to resolve the dispute through mediation. The venue for all dispute resolution proceedings shall be the city and state of New York.

+

15. Execution. This Agreement may be executed by exchange of emails. Electronic signatures, faxed or scanned signatures shall be as binding as an original signature.

+

AGREED AND ACCEPTED:

+

For FREE EBOOK FOUNDATION, INC. , Distributor

+

Eric Hellman, President

+
+{{ form.rh_name.errors }} +

For [Rights Holder], Rights Holder

+{{ form.signature.errors }} +

Signature: {{ form.signature }}, [Title]

+

(Type your name to enter your electronic signature.)

+ + + +
+ +
+{% else %} +Please log in or create an account to use the rights holder agreement. +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/frontend/templates/rh_tools.html b/frontend/templates/rh_tools.html index a9ceb449..6e25dc60 100644 --- a/frontend/templates/rh_tools.html +++ b/frontend/templates/rh_tools.html @@ -1,6 +1,6 @@ {% extends 'basedocumentation.html' %} -{% block title %}Tools for Rightsholders {% endblock %} +{% block title %} for Rightsholders {% endblock %} {% block extra_extra_head %} {{ block.super }} @@ -15,7 +15,7 @@ {% block doccontent %} -

unglue.it Tools for Rightsholders

+

Unglue.it for Rightsholders

Any questions not covered here? Please email us at rights@gluejar.com. @@ -38,7 +38,7 @@ Any questions not covered here? Please email us at Getting Started

-If you're an author, publisher, or other rights holder, you can participate more fully in Unglue.it by registering as a rights holder. Registered rights holders can: +If you're an author, publisher, or other rights holder, you can participate more fully in Unglue.it by registering as a rights holder. Participating rights holders can:

  • Add books to the unglue.it database.
  • Set metadata and descriptions for their books.
  • @@ -116,7 +116,6 @@ If you're an author, publisher, or other rights holder, you can participate more
    {% csrf_token %} {{ claim.campaign_form.name }}{{ claim.campaign_form.name.errors }} - {% if claim.rights_holder.can_sell %} {% ifequal claim.can_open_new 1 %}

    Choose the Campaign Type: {{ claim.campaign_form.type }}{{ claim.campaign_form.type.errors }}

      @@ -128,9 +127,6 @@ If you're an author, publisher, or other rights holder, you can participate more Your previous campaign succeeded, but you can open a new Thanks-For-Ungluing campaign. {{ claim.campaign_form.type.errors }} {% endifequal %} - {% else %} - - {% endif %}

      Add another Campaign Manager(s) by their Unglue.it username:

      {{ claim.campaign_form.managers }}{{ claim.campaign_form.managers.errors }}
      @@ -213,9 +209,9 @@ If you're an author, publisher, or other rights holder, you can participate more {% else %}

      Your Books/Campaigns

      -If you were a registered rights holder with Unglue.it, you'd be able to see and manage your campaigns here. +If you were a registered rights holder with Unglue.it, you'd be able to see and manage your books and campaigns here. {% endif %} -

      Registering Your Rights

      +

      Becoming an Unglue.it Rights Holder

        {% if not request.user.is_authenticated %} @@ -223,7 +219,7 @@ If you're an author, publisher, or other rights holder, you can participate more {% else %}
      1. You've already set up an Unglue.it account.
      2. {% endif %} - {% if not request.user.rights_holder.count %}
      3. {% else %}
      4. {% endif %}Sign a Platform Services Agreement. Unglue.it uses Docracy.com to manage rights holder agreements. If you have any questions, ask us.
      5. + {% if not request.user.rights_holder.count %}
      6. {% else %}
      7. {% endif %}Sign a Unglue.it Rights Holder Agreement. If you have any questions, ask us.
      8. {% if claims %}
      9. You have claimed {{ claims.count }} work(s). You can claim more. {% else %} diff --git a/frontend/urls.py b/frontend/urls.py index a0c71694..2c4236b6 100644 --- a/frontend/urls.py +++ b/frontend/urls.py @@ -5,11 +5,9 @@ from django.contrib.auth.decorators import login_required from django.contrib.sites.models import Site from django.views.generic import ListView, DetailView from django.views.generic.base import TemplateView -#from django.views.generic.simple import direct_to_template from django.views.decorators.csrf import csrf_exempt from regluit.core.feeds import SupporterWishlistFeed -from regluit.core.models import Campaign from regluit.frontend import views @@ -25,6 +23,8 @@ urlpatterns = [ url(r"^privacy/$", TemplateView.as_view(template_name="privacy.html"), name="privacy"), url(r"^terms/$", TemplateView.as_view(template_name="terms.html"), name="terms"), url(r"^rightsholders/$", views.rh_tools, name="rightsholders"), + url(r"^rightsholders/agree/$", views.RHAgree.as_view(), name="agree"), + url(r"^rightsholders/agree/submitted$", TemplateView.as_view(template_name='agreed.html'), name="agreed"), url(r"^rightsholders/campaign/(?P\d+)/$", views.manage_campaign, name="manage_campaign"), url(r"^rightsholders/campaign/(?P\d+)/results/$", views.manage_campaign, {'action': 'results'}, name="campaign_results"), url(r"^rightsholders/campaign/(?P\d+)/(?P\d+)/makemobi/$", views.manage_campaign, {'action': 'makemobi'}, name="makemobi"), diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 796c8f7a..15ae03cb 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -47,7 +47,7 @@ from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST -from django.views.generic.edit import FormView +from django.views.generic.edit import FormView, CreateView from django.views.generic.list import ListView from django.views.generic.base import ( TemplateView, @@ -1776,7 +1776,7 @@ def rh_tools(request): claim.campaign_form.save_m2m() claim.campaign_form = None else: - c_type = 2 if claim.rights_holder.can_sell else 1 + c_type = 2 claim.campaign_form = OpenCampaignForm( initial={'work': claim.work, 'name': claim.work.title, 'userid': request.user.id, 'managers': [request.user.id], 'type': c_type}, prefix = 'cl_'+str(claim.id), @@ -1802,6 +1802,20 @@ def rh_tools(request): campaign.clone_form = CloneCampaignForm(initial={'campaign_id':campaign.id}, prefix='c%s' % campaign.id) return render(request, "rh_tools.html", {'claims': claims , 'campaigns': campaigns}) +class RHAgree(CreateView): + template_name = "rh_agree.html" + form_class = RightsHolderForm + success_url = reverse_lazy('agreed') + + def get_initial(self): + return {'owner':self.request.user.id, 'signature':''} + + def form_valid(self, form): + form.instance.signer_ip = self.request.META['REMOTE_ADDR'] + return super(RHAgree, self).form_valid(form) + #self.form.instance.save() + #return response + def rh_admin(request, facet='top'): if not request.user.is_authenticated() : return render(request, "admins_only.html") @@ -1812,9 +1826,10 @@ def rh_admin(request, facet='top'): active_data = models.Claim.objects.filter(status = 'active') if request.method == 'POST': if 'create_rights_holder' in request.POST.keys(): - form = RightsHolderForm(data=request.POST) + form = RightsHolderApprovalForm(data=request.POST) pending_formset = PendingFormSet (queryset=pending_data) if form.is_valid(): + form.instance.approved = True form.save() form = RightsHolderForm() if 'set_claim_status' in request.POST.keys(): diff --git a/static/css/sitewide4.css b/static/css/sitewide4.css index 4de442df..2a9550f8 100644 --- a/static/css/sitewide4.css +++ b/static/css/sitewide4.css @@ -1 +1 @@ -@import "font-awesome.min.css";.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px!important;height:28px;line-height:28px!important;margin:0!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}.download_container{width:75%;margin:auto}#lightbox_content a{color:#6994a3}#lightbox_content .signuptoday a{color:white}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-top:15px}#lightbox_content h2 a{font-size:18.75px}#lightbox_content .ebook_download a{margin:auto 5px auto 0;font-size:15px}#lightbox_content .ebook_download img{vertical-align:middle}#lightbox_content .logo{font-size:15px}#lightbox_content .logo img{-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;height:50px;width:50px;margin-right:5px}#lightbox_content .one_click,#lightbox_content .ebook_download_container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-left:-0.25%;padding:.5%;padding-bottom:15px;margin-bottom:5px;width:74%}#lightbox_content .one_click h3,#lightbox_content .ebook_download_container h3{margin-top:5px}#lightbox_content .one_click{border:solid 2px #8dc63f}#lightbox_content .ebook_download_container{border:solid 2px #d6dde0}#lightbox_content a.add-wishlist .on-wishlist,#lightbox_content a.success,a.success:hover{text-decoration:none;color:#3d4e53}#lightbox_content a.success,a.success:hover{cursor:default}#lightbox_content ul{padding-left:50px}#lightbox_content ul li{margin-bottom:4px}.border{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 2px #d6dde0;margin:5px auto;padding-right:5px;padding-left:5px}.sharing{float:right;padding:.5%!important;width:23%!important;min-width:105px}.sharing ul{padding:.5%!important}.sharing .jsmod-title{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;height:auto}.sharing .jsmod-title span{padding:5%!important;color:white!important;font-style:normal}#widgetcode2{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode2 textarea{max-width:90%}.btn_support.kindle{height:40px}.btn_support.kindle a{width:auto;font-size:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#6994a3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#496b77;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon :first-child{border:0;text-align:center;width:100%!important}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active:hover,.btn-adn.active:hover,.open>.dropdown-toggle.btn-adn:hover,.btn-adn:active:focus,.btn-adn.active:focus,.open>.dropdown-toggle.btn-adn:focus,.btn-adn:active.focus,.btn-adn.active.focus,.open>.dropdown-toggle.btn-adn.focus{color:#fff;background-color:#b94630;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn.disabled,.btn-adn[disabled],fieldset[disabled] .btn-adn,.btn-adn.disabled:hover,.btn-adn[disabled]:hover,fieldset[disabled] .btn-adn:hover,.btn-adn.disabled:focus,.btn-adn[disabled]:focus,fieldset[disabled] .btn-adn:focus,.btn-adn.disabled.focus,.btn-adn[disabled].focus,fieldset[disabled] .btn-adn.focus,.btn-adn.disabled:active,.btn-adn[disabled]:active,fieldset[disabled] .btn-adn:active,.btn-adn.disabled.active,.btn-adn[disabled].active,fieldset[disabled] .btn-adn.active{background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active:hover,.btn-bitbucket.active:hover,.open>.dropdown-toggle.btn-bitbucket:hover,.btn-bitbucket:active:focus,.btn-bitbucket.active:focus,.open>.dropdown-toggle.btn-bitbucket:focus,.btn-bitbucket:active.focus,.btn-bitbucket.active.focus,.open>.dropdown-toggle.btn-bitbucket.focus{color:#fff;background-color:#0f253c;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket.disabled,.btn-bitbucket[disabled],fieldset[disabled] .btn-bitbucket,.btn-bitbucket.disabled:hover,.btn-bitbucket[disabled]:hover,fieldset[disabled] .btn-bitbucket:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket[disabled]:focus,fieldset[disabled] .btn-bitbucket:focus,.btn-bitbucket.disabled.focus,.btn-bitbucket[disabled].focus,fieldset[disabled] .btn-bitbucket.focus,.btn-bitbucket.disabled:active,.btn-bitbucket[disabled]:active,fieldset[disabled] .btn-bitbucket:active,.btn-bitbucket.disabled.active,.btn-bitbucket[disabled].active,fieldset[disabled] .btn-bitbucket.active{background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active:hover,.btn-dropbox.active:hover,.open>.dropdown-toggle.btn-dropbox:hover,.btn-dropbox:active:focus,.btn-dropbox.active:focus,.open>.dropdown-toggle.btn-dropbox:focus,.btn-dropbox:active.focus,.btn-dropbox.active.focus,.open>.dropdown-toggle.btn-dropbox.focus{color:#fff;background-color:#0a568c;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox.disabled,.btn-dropbox[disabled],fieldset[disabled] .btn-dropbox,.btn-dropbox.disabled:hover,.btn-dropbox[disabled]:hover,fieldset[disabled] .btn-dropbox:hover,.btn-dropbox.disabled:focus,.btn-dropbox[disabled]:focus,fieldset[disabled] .btn-dropbox:focus,.btn-dropbox.disabled.focus,.btn-dropbox[disabled].focus,fieldset[disabled] .btn-dropbox.focus,.btn-dropbox.disabled:active,.btn-dropbox[disabled]:active,fieldset[disabled] .btn-dropbox:active,.btn-dropbox.disabled.active,.btn-dropbox[disabled].active,fieldset[disabled] .btn-dropbox.active{background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active:hover,.btn-facebook.active:hover,.open>.dropdown-toggle.btn-facebook:hover,.btn-facebook:active:focus,.btn-facebook.active:focus,.open>.dropdown-toggle.btn-facebook:focus,.btn-facebook:active.focus,.btn-facebook.active.focus,.open>.dropdown-toggle.btn-facebook.focus{color:#fff;background-color:#23345a;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook.disabled,.btn-facebook[disabled],fieldset[disabled] .btn-facebook,.btn-facebook.disabled:hover,.btn-facebook[disabled]:hover,fieldset[disabled] .btn-facebook:hover,.btn-facebook.disabled:focus,.btn-facebook[disabled]:focus,fieldset[disabled] .btn-facebook:focus,.btn-facebook.disabled.focus,.btn-facebook[disabled].focus,fieldset[disabled] .btn-facebook.focus,.btn-facebook.disabled:active,.btn-facebook[disabled]:active,fieldset[disabled] .btn-facebook:active,.btn-facebook.disabled.active,.btn-facebook[disabled].active,fieldset[disabled] .btn-facebook.active{background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active:hover,.btn-flickr.active:hover,.open>.dropdown-toggle.btn-flickr:hover,.btn-flickr:active:focus,.btn-flickr.active:focus,.open>.dropdown-toggle.btn-flickr:focus,.btn-flickr:active.focus,.btn-flickr.active.focus,.open>.dropdown-toggle.btn-flickr.focus{color:#fff;background-color:#a80057;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr.disabled,.btn-flickr[disabled],fieldset[disabled] .btn-flickr,.btn-flickr.disabled:hover,.btn-flickr[disabled]:hover,fieldset[disabled] .btn-flickr:hover,.btn-flickr.disabled:focus,.btn-flickr[disabled]:focus,fieldset[disabled] .btn-flickr:focus,.btn-flickr.disabled.focus,.btn-flickr[disabled].focus,fieldset[disabled] .btn-flickr.focus,.btn-flickr.disabled:active,.btn-flickr[disabled]:active,fieldset[disabled] .btn-flickr:active,.btn-flickr.disabled.active,.btn-flickr[disabled].active,fieldset[disabled] .btn-flickr.active{background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active:hover,.btn-foursquare.active:hover,.open>.dropdown-toggle.btn-foursquare:hover,.btn-foursquare:active:focus,.btn-foursquare.active:focus,.open>.dropdown-toggle.btn-foursquare:focus,.btn-foursquare:active.focus,.btn-foursquare.active.focus,.open>.dropdown-toggle.btn-foursquare.focus{color:#fff;background-color:#e30742;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare.disabled,.btn-foursquare[disabled],fieldset[disabled] .btn-foursquare,.btn-foursquare.disabled:hover,.btn-foursquare[disabled]:hover,fieldset[disabled] .btn-foursquare:hover,.btn-foursquare.disabled:focus,.btn-foursquare[disabled]:focus,fieldset[disabled] .btn-foursquare:focus,.btn-foursquare.disabled.focus,.btn-foursquare[disabled].focus,fieldset[disabled] .btn-foursquare.focus,.btn-foursquare.disabled:active,.btn-foursquare[disabled]:active,fieldset[disabled] .btn-foursquare:active,.btn-foursquare.disabled.active,.btn-foursquare[disabled].active,fieldset[disabled] .btn-foursquare.active{background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active:hover,.btn-github.active:hover,.open>.dropdown-toggle.btn-github:hover,.btn-github:active:focus,.btn-github.active:focus,.open>.dropdown-toggle.btn-github:focus,.btn-github:active.focus,.btn-github.active.focus,.open>.dropdown-toggle.btn-github.focus{color:#fff;background-color:#191919;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github.disabled,.btn-github[disabled],fieldset[disabled] .btn-github,.btn-github.disabled:hover,.btn-github[disabled]:hover,fieldset[disabled] .btn-github:hover,.btn-github.disabled:focus,.btn-github[disabled]:focus,fieldset[disabled] .btn-github:focus,.btn-github.disabled.focus,.btn-github[disabled].focus,fieldset[disabled] .btn-github.focus,.btn-github.disabled:active,.btn-github[disabled]:active,fieldset[disabled] .btn-github:active,.btn-github.disabled.active,.btn-github[disabled].active,fieldset[disabled] .btn-github.active{background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github .badge{color:#444;background-color:#fff}.btn-google-plus{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus:focus,.btn-google-plus.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.dropdown-toggle.btn-google-plus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active:hover,.btn-google-plus.active:hover,.open>.dropdown-toggle.btn-google-plus:hover,.btn-google-plus:active:focus,.btn-google-plus.active:focus,.open>.dropdown-toggle.btn-google-plus:focus,.btn-google-plus:active.focus,.btn-google-plus.active.focus,.open>.dropdown-toggle.btn-google-plus.focus{color:#fff;background-color:#a32b1c;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.dropdown-toggle.btn-google-plus{background-image:none}.btn-google-plus.disabled,.btn-google-plus[disabled],fieldset[disabled] .btn-google-plus,.btn-google-plus.disabled:hover,.btn-google-plus[disabled]:hover,fieldset[disabled] .btn-google-plus:hover,.btn-google-plus.disabled:focus,.btn-google-plus[disabled]:focus,fieldset[disabled] .btn-google-plus:focus,.btn-google-plus.disabled.focus,.btn-google-plus[disabled].focus,fieldset[disabled] .btn-google-plus.focus,.btn-google-plus.disabled:active,.btn-google-plus[disabled]:active,fieldset[disabled] .btn-google-plus:active,.btn-google-plus.disabled.active,.btn-google-plus[disabled].active,fieldset[disabled] .btn-google-plus.active{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active:hover,.btn-instagram.active:hover,.open>.dropdown-toggle.btn-instagram:hover,.btn-instagram:active:focus,.btn-instagram.active:focus,.open>.dropdown-toggle.btn-instagram:focus,.btn-instagram:active.focus,.btn-instagram.active.focus,.open>.dropdown-toggle.btn-instagram.focus{color:#fff;background-color:#26455d;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram.disabled,.btn-instagram[disabled],fieldset[disabled] .btn-instagram,.btn-instagram.disabled:hover,.btn-instagram[disabled]:hover,fieldset[disabled] .btn-instagram:hover,.btn-instagram.disabled:focus,.btn-instagram[disabled]:focus,fieldset[disabled] .btn-instagram:focus,.btn-instagram.disabled.focus,.btn-instagram[disabled].focus,fieldset[disabled] .btn-instagram.focus,.btn-instagram.disabled:active,.btn-instagram[disabled]:active,fieldset[disabled] .btn-instagram:active,.btn-instagram.disabled.active,.btn-instagram[disabled].active,fieldset[disabled] .btn-instagram.active{background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active:hover,.btn-linkedin.active:hover,.open>.dropdown-toggle.btn-linkedin:hover,.btn-linkedin:active:focus,.btn-linkedin.active:focus,.open>.dropdown-toggle.btn-linkedin:focus,.btn-linkedin:active.focus,.btn-linkedin.active.focus,.open>.dropdown-toggle.btn-linkedin.focus{color:#fff;background-color:#00405f;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin.disabled,.btn-linkedin[disabled],fieldset[disabled] .btn-linkedin,.btn-linkedin.disabled:hover,.btn-linkedin[disabled]:hover,fieldset[disabled] .btn-linkedin:hover,.btn-linkedin.disabled:focus,.btn-linkedin[disabled]:focus,fieldset[disabled] .btn-linkedin:focus,.btn-linkedin.disabled.focus,.btn-linkedin[disabled].focus,fieldset[disabled] .btn-linkedin.focus,.btn-linkedin.disabled:active,.btn-linkedin[disabled]:active,fieldset[disabled] .btn-linkedin:active,.btn-linkedin.disabled.active,.btn-linkedin[disabled].active,fieldset[disabled] .btn-linkedin.active{background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active:hover,.btn-microsoft.active:hover,.open>.dropdown-toggle.btn-microsoft:hover,.btn-microsoft:active:focus,.btn-microsoft.active:focus,.open>.dropdown-toggle.btn-microsoft:focus,.btn-microsoft:active.focus,.btn-microsoft.active.focus,.open>.dropdown-toggle.btn-microsoft.focus{color:#fff;background-color:#0f4bac;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft.disabled,.btn-microsoft[disabled],fieldset[disabled] .btn-microsoft,.btn-microsoft.disabled:hover,.btn-microsoft[disabled]:hover,fieldset[disabled] .btn-microsoft:hover,.btn-microsoft.disabled:focus,.btn-microsoft[disabled]:focus,fieldset[disabled] .btn-microsoft:focus,.btn-microsoft.disabled.focus,.btn-microsoft[disabled].focus,fieldset[disabled] .btn-microsoft.focus,.btn-microsoft.disabled:active,.btn-microsoft[disabled]:active,fieldset[disabled] .btn-microsoft:active,.btn-microsoft.disabled.active,.btn-microsoft[disabled].active,fieldset[disabled] .btn-microsoft.active{background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active:hover,.btn-openid.active:hover,.open>.dropdown-toggle.btn-openid:hover,.btn-openid:active:focus,.btn-openid.active:focus,.open>.dropdown-toggle.btn-openid:focus,.btn-openid:active.focus,.btn-openid.active.focus,.open>.dropdown-toggle.btn-openid.focus{color:#fff;background-color:#b86607;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid.disabled,.btn-openid[disabled],fieldset[disabled] .btn-openid,.btn-openid.disabled:hover,.btn-openid[disabled]:hover,fieldset[disabled] .btn-openid:hover,.btn-openid.disabled:focus,.btn-openid[disabled]:focus,fieldset[disabled] .btn-openid:focus,.btn-openid.disabled.focus,.btn-openid[disabled].focus,fieldset[disabled] .btn-openid.focus,.btn-openid.disabled:active,.btn-openid[disabled]:active,fieldset[disabled] .btn-openid:active,.btn-openid.disabled.active,.btn-openid[disabled].active,fieldset[disabled] .btn-openid.active{background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active:hover,.btn-pinterest.active:hover,.open>.dropdown-toggle.btn-pinterest:hover,.btn-pinterest:active:focus,.btn-pinterest.active:focus,.open>.dropdown-toggle.btn-pinterest:focus,.btn-pinterest:active.focus,.btn-pinterest.active.focus,.open>.dropdown-toggle.btn-pinterest.focus{color:#fff;background-color:#801419;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest.disabled,.btn-pinterest[disabled],fieldset[disabled] .btn-pinterest,.btn-pinterest.disabled:hover,.btn-pinterest[disabled]:hover,fieldset[disabled] .btn-pinterest:hover,.btn-pinterest.disabled:focus,.btn-pinterest[disabled]:focus,fieldset[disabled] .btn-pinterest:focus,.btn-pinterest.disabled.focus,.btn-pinterest[disabled].focus,fieldset[disabled] .btn-pinterest.focus,.btn-pinterest.disabled:active,.btn-pinterest[disabled]:active,fieldset[disabled] .btn-pinterest:active,.btn-pinterest.disabled.active,.btn-pinterest[disabled].active,fieldset[disabled] .btn-pinterest.active{background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active:hover,.btn-reddit.active:hover,.open>.dropdown-toggle.btn-reddit:hover,.btn-reddit:active:focus,.btn-reddit.active:focus,.open>.dropdown-toggle.btn-reddit:focus,.btn-reddit:active.focus,.btn-reddit.active.focus,.open>.dropdown-toggle.btn-reddit.focus{color:#000;background-color:#98ccff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit.disabled,.btn-reddit[disabled],fieldset[disabled] .btn-reddit,.btn-reddit.disabled:hover,.btn-reddit[disabled]:hover,fieldset[disabled] .btn-reddit:hover,.btn-reddit.disabled:focus,.btn-reddit[disabled]:focus,fieldset[disabled] .btn-reddit:focus,.btn-reddit.disabled.focus,.btn-reddit[disabled].focus,fieldset[disabled] .btn-reddit.focus,.btn-reddit.disabled:active,.btn-reddit[disabled]:active,fieldset[disabled] .btn-reddit:active,.btn-reddit.disabled.active,.btn-reddit[disabled].active,fieldset[disabled] .btn-reddit.active{background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active:hover,.btn-soundcloud.active:hover,.open>.dropdown-toggle.btn-soundcloud:hover,.btn-soundcloud:active:focus,.btn-soundcloud.active:focus,.open>.dropdown-toggle.btn-soundcloud:focus,.btn-soundcloud:active.focus,.btn-soundcloud.active.focus,.open>.dropdown-toggle.btn-soundcloud.focus{color:#fff;background-color:#a83800;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud.disabled,.btn-soundcloud[disabled],fieldset[disabled] .btn-soundcloud,.btn-soundcloud.disabled:hover,.btn-soundcloud[disabled]:hover,fieldset[disabled] .btn-soundcloud:hover,.btn-soundcloud.disabled:focus,.btn-soundcloud[disabled]:focus,fieldset[disabled] .btn-soundcloud:focus,.btn-soundcloud.disabled.focus,.btn-soundcloud[disabled].focus,fieldset[disabled] .btn-soundcloud.focus,.btn-soundcloud.disabled:active,.btn-soundcloud[disabled]:active,fieldset[disabled] .btn-soundcloud:active,.btn-soundcloud.disabled.active,.btn-soundcloud[disabled].active,fieldset[disabled] .btn-soundcloud.active{background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active:hover,.btn-tumblr.active:hover,.open>.dropdown-toggle.btn-tumblr:hover,.btn-tumblr:active:focus,.btn-tumblr.active:focus,.open>.dropdown-toggle.btn-tumblr:focus,.btn-tumblr:active.focus,.btn-tumblr.active.focus,.open>.dropdown-toggle.btn-tumblr.focus{color:#fff;background-color:#111c26;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr.disabled,.btn-tumblr[disabled],fieldset[disabled] .btn-tumblr,.btn-tumblr.disabled:hover,.btn-tumblr[disabled]:hover,fieldset[disabled] .btn-tumblr:hover,.btn-tumblr.disabled:focus,.btn-tumblr[disabled]:focus,fieldset[disabled] .btn-tumblr:focus,.btn-tumblr.disabled.focus,.btn-tumblr[disabled].focus,fieldset[disabled] .btn-tumblr.focus,.btn-tumblr.disabled:active,.btn-tumblr[disabled]:active,fieldset[disabled] .btn-tumblr:active,.btn-tumblr.disabled.active,.btn-tumblr[disabled].active,fieldset[disabled] .btn-tumblr.active{background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active:hover,.btn-twitter.active:hover,.open>.dropdown-toggle.btn-twitter:hover,.btn-twitter:active:focus,.btn-twitter.active:focus,.open>.dropdown-toggle.btn-twitter:focus,.btn-twitter:active.focus,.btn-twitter.active.focus,.open>.dropdown-toggle.btn-twitter.focus{color:#fff;background-color:#1583d7;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter.disabled,.btn-twitter[disabled],fieldset[disabled] .btn-twitter,.btn-twitter.disabled:hover,.btn-twitter[disabled]:hover,fieldset[disabled] .btn-twitter:hover,.btn-twitter.disabled:focus,.btn-twitter[disabled]:focus,fieldset[disabled] .btn-twitter:focus,.btn-twitter.disabled.focus,.btn-twitter[disabled].focus,fieldset[disabled] .btn-twitter.focus,.btn-twitter.disabled:active,.btn-twitter[disabled]:active,fieldset[disabled] .btn-twitter:active,.btn-twitter.disabled.active,.btn-twitter[disabled].active,fieldset[disabled] .btn-twitter.active{background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active:hover,.btn-vimeo.active:hover,.open>.dropdown-toggle.btn-vimeo:hover,.btn-vimeo:active:focus,.btn-vimeo.active:focus,.open>.dropdown-toggle.btn-vimeo:focus,.btn-vimeo:active.focus,.btn-vimeo.active.focus,.open>.dropdown-toggle.btn-vimeo.focus{color:#fff;background-color:#0f7b9f;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo.disabled,.btn-vimeo[disabled],fieldset[disabled] .btn-vimeo,.btn-vimeo.disabled:hover,.btn-vimeo[disabled]:hover,fieldset[disabled] .btn-vimeo:hover,.btn-vimeo.disabled:focus,.btn-vimeo[disabled]:focus,fieldset[disabled] .btn-vimeo:focus,.btn-vimeo.disabled.focus,.btn-vimeo[disabled].focus,fieldset[disabled] .btn-vimeo.focus,.btn-vimeo.disabled:active,.btn-vimeo[disabled]:active,fieldset[disabled] .btn-vimeo:active,.btn-vimeo.disabled.active,.btn-vimeo[disabled].active,fieldset[disabled] .btn-vimeo.active{background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active:hover,.btn-vk.active:hover,.open>.dropdown-toggle.btn-vk:hover,.btn-vk:active:focus,.btn-vk.active:focus,.open>.dropdown-toggle.btn-vk:focus,.btn-vk:active.focus,.btn-vk.active.focus,.open>.dropdown-toggle.btn-vk.focus{color:#fff;background-color:#3a526b;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk.disabled,.btn-vk[disabled],fieldset[disabled] .btn-vk,.btn-vk.disabled:hover,.btn-vk[disabled]:hover,fieldset[disabled] .btn-vk:hover,.btn-vk.disabled:focus,.btn-vk[disabled]:focus,fieldset[disabled] .btn-vk:focus,.btn-vk.disabled.focus,.btn-vk[disabled].focus,fieldset[disabled] .btn-vk.focus,.btn-vk.disabled:active,.btn-vk[disabled]:active,fieldset[disabled] .btn-vk:active,.btn-vk.disabled.active,.btn-vk[disabled].active,fieldset[disabled] .btn-vk.active{background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active:hover,.btn-yahoo.active:hover,.open>.dropdown-toggle.btn-yahoo:hover,.btn-yahoo:active:focus,.btn-yahoo.active:focus,.open>.dropdown-toggle.btn-yahoo:focus,.btn-yahoo:active.focus,.btn-yahoo.active.focus,.open>.dropdown-toggle.btn-yahoo.focus{color:#fff;background-color:#39074e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo.disabled,.btn-yahoo[disabled],fieldset[disabled] .btn-yahoo,.btn-yahoo.disabled:hover,.btn-yahoo[disabled]:hover,fieldset[disabled] .btn-yahoo:hover,.btn-yahoo.disabled:focus,.btn-yahoo[disabled]:focus,fieldset[disabled] .btn-yahoo:focus,.btn-yahoo.disabled.focus,.btn-yahoo[disabled].focus,fieldset[disabled] .btn-yahoo.focus,.btn-yahoo.disabled:active,.btn-yahoo[disabled]:active,fieldset[disabled] .btn-yahoo:active,.btn-yahoo.disabled.active,.btn-yahoo[disabled].active,fieldset[disabled] .btn-yahoo.active{background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.preview{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%}.preview a{color:#8dc63f}.launch_top{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;border-color:#8dc63f;margin:10px auto 0 auto;font-size:15px;line-height:22.5px}.launch_top a{color:#8dc63f}.launch_top.pale{border-color:#d6dde0;font-size:13px}.launch_top.alert{border-color:#e35351;font-size:13px}.preview_content{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;width:80%;margin:10px auto}.preview_content a{color:#8dc63f}.utilityheaders{text-transform:uppercase;color:#3d4e53;font-size:15px;display:block}html,body{height:100%}body{background:url("/static/images/bg-body.png") 0 0 repeat-x;padding:0 0 20px 0;margin:0;font-size:13px;line-height:16.900000000000002px;font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Arial,Helvetica,sans-serif;color:#3d4e53}#feedback{position:fixed;bottom:10%;right:0;z-index:500}#feedback p{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);white-space:nowrap;display:block;bottom:0;width:160px;height:32px;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;background:#8dc63f;margin-bottom:0;text-align:center;margin-right:-67px;line-height:normal}#feedback p a{color:white;font-size:24px;font-weight:normal}#feedback p a:hover{color:#3d4e53}a{font-weight:bold;font-size:inherit;text-decoration:none;cursor:pointer;color:#6994a3}a:hover{text-decoration:underline}h1{font-size:22.5px}h2{font-size:18.75px}h3{font-size:17.549999999999997px}h4{font-size:15px}img{border:0}img.user-avatar{float:left;margin-right:10px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px}input,textarea,a.fakeinput{border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}input:focus,textarea:focus,a.fakeinput:focus{border:2px solid #8dc63f;outline:0}a.fakeinput:hover{text-decoration:none}.js-search input{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}h2.content-heading{padding:15px;margin:0;font-size:19px;font-weight:normal;color:#3d4e53;float:left;width:50%}h2.content-heading span{font-style:italic}h3.jsmod-title{-moz-border-radius:8px 8px 0 0;-webkit-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0;background:#edf3f4;padding:0;margin:0;height:2.3em}h3.jsmod-title span{font-size:19px;font-style:italic;color:#3d4e53;padding:.7em 2em .5em 2em;display:block}input[type="submit"],a.fakeinput{background:#8dc63f;color:white;font-weight:bold;padding:.5em 1em;cursor:pointer}.loader-gif[disabled="disabled"],.loader-gif.show-loading{background:url('/static/images/loading.gif') center no-repeat!important}.js-page-wrap{position:relative;min-height:100%}.js-main{width:960px;margin:0 auto;clear:both;padding:0}.bigger{font-size:15px}ul.menu{list-style:none;padding:0;margin:0}.errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errorlist li{list-style:none;border:0}.errorlist li{list-style:none;border:0}.errorlist li{list-style:none;border:0}.errorlist+input{border:2px solid #e35351!important}.errorlist+input:focus{border:1px solid #8dc63f!important}.errorlist+textarea{border:2px solid #e35351!important}.errorlist+textarea:focus{border:2px solid #8dc63f!important}.p_form .errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:0;color:#e35351;clear:none;width:100%;height:auto;line-height:16px;padding:0;font-weight:normal;text-align:left;display:inline}.p_form .errorlist li{display:inline}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}#js-header{height:90px}.js-logo{float:left;padding-top:10px}.js-logo a img{border:0}.js-topmenu{float:right;margin-top:25px;font-size:15px}.js-topmenu#authenticated{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:36px}.js-topmenu#authenticated:hover,.js-topmenu#authenticated.highlight{background:#d6dde0;cursor:pointer;position:relative}.js-topmenu ul#user_menu{white-space:nowrap;display:none;z-index:100;position:absolute;top:36px;left:0;padding:0;overflow:visible;margin:0}.js-topmenu ul#user_menu li{border-top:1px solid white;list-style-type:none;float:none;background:#d6dde0;padding:7px 10px}.js-topmenu ul#user_menu li:hover{background:#8dc63f}.js-topmenu ul#user_menu li:hover a{color:white}.js-topmenu ul#user_menu li:hover #i_haz_notifications{border-color:white;background-color:white;color:#3d4e53}.js-topmenu ul#user_menu li a{height:auto;line-height:26.25px}.js-topmenu ul#user_menu li span{margin-right:10px}.js-topmenu ul li{float:left;position:relative;z-index:50}.js-topmenu ul li .notbutton{color:#3d4e53;line-height:36px}.js-topmenu ul li a{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.js-topmenu ul li span#welcome{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em;padding:0 10px}.js-topmenu ul li img{padding:0;margin:0}.js-topmenu ul li.last{padding-left:20px}.js-topmenu ul li.last a span{-moz-border-radius:32px 0 0 32px;-webkit-border-radius:32px 0 0 32px;border-radius:32px 0 0 32px;background-color:#8dc63f;margin-right:29px;display:block;padding:0 5px 0 15px;color:white}.js-topmenu ul .unseen_count{border:solid 2px;-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;padding:3px;line-height:16px;width:16px;cursor:pointer;text-align:center}.js-topmenu ul .unseen_count#i_haz_notifications{background-color:#8dc63f;color:white;border-color:white}.js-topmenu ul .unseen_count#no_notifications_for_you{border-color:#edf3f4;background-color:#edf3f4;color:#3d4e53}.btn-signup{color:#fff;background-color:#8dc63f;border-color:#ccc}.btn-signup:focus,.btn-signup.focus{color:#fff;background-color:#72a230;border-color:#8c8c8c}.btn-signup:hover{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active,.btn-signup.active,.open>.dropdown-toggle.btn-signup{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active:hover,.btn-signup.active:hover,.open>.dropdown-toggle.btn-signup:hover,.btn-signup:active:focus,.btn-signup.active:focus,.open>.dropdown-toggle.btn-signup:focus,.btn-signup:active.focus,.btn-signup.active.focus,.open>.dropdown-toggle.btn-signup.focus{color:#fff;background-color:#5e8628;border-color:#8c8c8c}.btn-signup:active,.btn-signup.active,.open>.dropdown-toggle.btn-signup{background-image:none}.btn-signup.disabled,.btn-signup[disabled],fieldset[disabled] .btn-signup,.btn-signup.disabled:hover,.btn-signup[disabled]:hover,fieldset[disabled] .btn-signup:hover,.btn-signup.disabled:focus,.btn-signup[disabled]:focus,fieldset[disabled] .btn-signup:focus,.btn-signup.disabled.focus,.btn-signup[disabled].focus,fieldset[disabled] .btn-signup.focus,.btn-signup.disabled:active,.btn-signup[disabled]:active,fieldset[disabled] .btn-signup:active,.btn-signup.disabled.active,.btn-signup[disabled].active,fieldset[disabled] .btn-signup.active{background-color:#8dc63f;border-color:#ccc}.btn-signup .badge{color:#8dc63f;background-color:#fff}.btn-readon{color:#fff;background-color:#8ac3d7;border-color:#ccc}.btn-readon:focus,.btn-readon.focus{color:#fff;background-color:#64b0ca;border-color:#8c8c8c}.btn-readon:hover{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active,.btn-readon.active,.open>.dropdown-toggle.btn-readon{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active:hover,.btn-readon.active:hover,.open>.dropdown-toggle.btn-readon:hover,.btn-readon:active:focus,.btn-readon.active:focus,.open>.dropdown-toggle.btn-readon:focus,.btn-readon:active.focus,.btn-readon.active.focus,.open>.dropdown-toggle.btn-readon.focus{color:#fff;background-color:#49a2c1;border-color:#8c8c8c}.btn-readon:active,.btn-readon.active,.open>.dropdown-toggle.btn-readon{background-image:none}.btn-readon.disabled,.btn-readon[disabled],fieldset[disabled] .btn-readon,.btn-readon.disabled:hover,.btn-readon[disabled]:hover,fieldset[disabled] .btn-readon:hover,.btn-readon.disabled:focus,.btn-readon[disabled]:focus,fieldset[disabled] .btn-readon:focus,.btn-readon.disabled.focus,.btn-readon[disabled].focus,fieldset[disabled] .btn-readon.focus,.btn-readon.disabled:active,.btn-readon[disabled]:active,fieldset[disabled] .btn-readon:active,.btn-readon.disabled.active,.btn-readon[disabled].active,fieldset[disabled] .btn-readon.active{background-color:#8ac3d7;border-color:#ccc}.btn-readon .badge{color:#8ac3d7;background-color:#fff}#i_haz_notifications_badge{-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;font-size:13px;border:solid 2px white;margin-left:-7px;margin-top:-10px;padding:3px;background:#8dc63f;color:white;position:absolute;line-height:normal}form.login label,#login form label{display:block;line-height:20px;font-size:15px}form.login input,#login form input{width:90%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0;height:18px;line-height:18px;margin-bottom:6px}form.login input[type=submit],#login form input[type=submit]{text-decoration:capitalize;width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}form.login input:focus,#login form input:focus{border:solid 1px #8dc63f}form.login input[type="text"],#login form input[type="text"],form.login input[type="password"],#login form input[type="password"]{height:22.75px;line-height:22.75px;margin-bottom:13px;border-width:2px}form.login input[type="submit"],#login form input[type="submit"]{font-size:15px}form.login span.helptext,#login form span.helptext{display:block;margin-top:-11px;font-style:italic;font-size:13px}#lightbox_content a.btn{color:#FFF}.js-search{float:left;padding-top:25px;margin-left:81px}.js-search input{float:left}.js-search .inputbox{padding:0 0 0 15px;margin:0;border-top:solid 4px #8ac3d7;border-left:solid 4px #8ac3d7;border-bottom:solid 4px #8ac3d7;border-right:0;-moz-border-radius:50px 0 0 50px;-webkit-border-radius:50px 0 0 50px;border-radius:50px 0 0 50px;outline:0;height:28px;line-height:28px;width:156px;float:left;color:#6994a3}.js-search .button{background:url("/static/images/blue-search-button.png") no-repeat;padding:0;margin:0;width:40px;height:36px;display:block;border:0;text-indent:-10000px;cursor:pointer}.js-search-inner{float:right}#locationhash{display:none}#block-intro-text{padding-right:10px}#block-intro-text span.def{font-style:italic}a#readon{color:#fff;text-transform:capitalize;display:block;float:right;font-size:13px;font-weight:bold}.spread_the_word{height:24px;width:24px;position:top;margin-left:5px}#js-leftcol{float:left;width:235px;margin-bottom:20px}#js-leftcol a{font-weight:normal}#js-leftcol a:hover{text-decoration:underline}#js-leftcol .jsmod-content{border:solid 1px #edf3f4;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px}#js-leftcol ul.level1>li>a,#js-leftcol ul.level1>li>span{border-bottom:1px solid #edf3f4;border-top:1px solid #edf3f4;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:10px}#js-leftcol ul.level2 li{padding:5px 20px}#js-leftcol ul.level2 li a{color:#6994a3;font-size:15px}#js-leftcol ul.level2 li img{vertical-align:middle;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}#js-leftcol ul.level2 li .ungluer-name{height:30px;line-height:30px}#js-leftcol ul.level2 li.first{font-size:15px;color:#3d4e53;padding-left:10px}#js-leftcol ul.level3 li{padding:0 20px}#js-leftcol ul.level3 li a{color:#6994a3;font-size:15px}#js-topsection{padding:15px 0 0 0;overflow:hidden}.js-topnews{float:left;width:100%}.js-topnews1{background:url("/static/images/header/header-m.png") 0 0 repeat-y}.js-topnews2{background:url("/static/images/header/header-t.png") 0 0 no-repeat}.js-topnews3{background:url("/static/images/header/header-b.png") 0 100% no-repeat;display:block;overflow:hidden;padding:10px}#main-container{margin:15px 0 0 0}#js-maincol-fr{float:right;width:725px}div#content-block{overflow:hidden;background:url("/static/images/bg.png") 100% -223px no-repeat;padding:0 0 0 7px;margin-bottom:20px}div#content-block.jsmodule{background:0}.content-block-heading a.block-link{float:right;padding:15px;font-size:13px;color:#3d4e53;text-decoration:underline;font-weight:normal}div#content-block-content,div#content-block-content-1{width:100%;overflow:hidden;padding-left:10px}div#content-block-content .cols3 .column,div#content-block-content-1 .cols3 .column{width:33.33%;float:left}#footer{background-color:#edf3f4;clear:both;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:15px 0 45px 0;margin-top:15px;overflow:hidden}#footer .column{float:left;width:25%;padding-top:5px}#footer .column ul{padding-top:5px;margin-left:0;padding-left:0}#footer .column li{padding:5px 0;text-transform:none;list-style:none;margin-left:0}#footer .column li a{color:#6994a3;font-size:15px}.pagination{width:100%;text-align:center;margin-top:20px;clear:both;border-top:solid #3d4e53 thin;padding-top:7px}.pagination .endless_page_link{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px}.pagination .endless_page_current{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px;background-color:#edf3f4}a.nounderline{text-decoration:none}.slides_control{height:325px!important}#about_expandable{display:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;background:white;z-index:500;top:25%;padding:9px;max-width:90%}#about_expandable .collapser_x{margin-top:-27px;margin-right:-27px}#lightbox_content p,#lightbox_content li{padding:9px 0;font-size:15px;line-height:20px}#lightbox_content p a,#lightbox_content li a{font-size:15px;line-height:20px}#lightbox_content p b,#lightbox_content li b{color:#8dc63f}#lightbox_content p.last,#lightbox_content li.last{border-bottom:solid 2px #d6dde0;margin-bottom:5px}#lightbox_content .right_border{border-right:solid 1px #d6dde0;float:left;padding:9px}#lightbox_content .signuptoday{float:right;margin-top:0;clear:none}#lightbox_content h2+form,#lightbox_content h3+form,#lightbox_content h4+form{margin-top:15px}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-bottom:10px}.nonlightbox .about_page{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;width:75%;margin:10px auto auto auto;padding:9px}.collapser_x{float:right;height:24px;line-height:24px;width:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px;-moz-box-shadow:-1px 1px #3d4e53;-webkit-box-shadow:-1px 1px #3d4e53;box-shadow:-1px 1px #3d4e53;border:solid 3px white;text-align:center;color:white;background:#3d4e53;font-size:17px;z-index:5000;margin-top:-12px;margin-right:-22px}.signuptoday{padding:0 15px;height:36px;line-height:36px;float:left;clear:both;margin:10px auto;cursor:pointer;font-style:normal}.signuptoday a{padding-right:17px;color:white}.signuptoday a:hover{text-decoration:none}.central{width:480px;margin:0 auto}li.checked{list-style-type:none;background:transparent url(/static/images/checkmark_small.png) no-repeat 0 0;margin-left:-20px;padding-left:20px}.btn_support{margin:10px;width:215px}.btn_support a,.btn_support form input,.btn_support>span{font-size:22px;border:4px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;display:block;text-align:center;padding-top:14.25px;padding-bottom:14.25px;background-color:#8dc63f;color:white!important}.btn_support a span,.btn_support form input span,.btn_support>span span{color:white!important;font-weight:bold;padding-left:0;margin-left:0!important;background:0}.btn_support.create-account span{padding:0;margin:0;background:0}.btn_support a:hover,.btn_support form input:hover{background-color:#7aae34;text-decoration:none}.btn_support a{width:207px}.btn_support form input{width:215px}.btn_support.modify a,.btn_support.modify form input{background-color:#a7c1ca}.btn_support.modify a:hover,.btn_support.modify form input:hover{background-color:#91b1bd}.instructions h4{border-top:solid #d6dde0 1px;border-bottom:solid #d6dde0 1px;padding:.5em 0}.instructions>div{padding-left:1%;padding-right:1%;font-size:15px;line-height:22.5px;width:98%}.instructions>div.active{float:left}.one_click{float:left}.one_click>div{float:left}.one_click>div #kindle a,.one_click>div .kindle a,.one_click>div #marvin a,.one_click>div .marvin a,.one_click>div #mac_ibooks a,.one_click>div .mac_ibooks a{font-size:15px;padding:9px 0}.one_click>div div{margin:0 10px 0 0}.ebook_download_container{clear:left}.other_instructions_paragraph{display:none}#iOS_app_div,#ios_div{display:none}.yes_js{display:none}.std_form,.std_form input,.std_form select{line-height:30px;font-size:15px}.contrib_amount{padding:10px;font-size:19px;text-align:center}#id_preapproval_amount{width:50%;line-height:30px;font-size:15px}#askblock{float:right;min-width:260px;background:#edf3f4;padding:10px;width:30%}.rh_ask{font-size:15px;width:65%}#contribsubmit{text-align:center;font-size:19px;margin:0 0 10px;cursor:pointer}#anoncontribbox{padding-bottom:10px}.faq_tldr{font-style:italic;font-size:19px;text-align:center;line-height:24.7px;color:#6994a3;margin-left:2em}.deletebutton,input[type='submit'].deletebutton{height:20px;padding:.2em .6em;background-color:lightgray;margin-left:1em;color:white;font-weight:bold;cursor:pointer} \ No newline at end of file +@import "font-awesome.min.css";.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px!important;height:28px;line-height:28px!important;margin:0!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}.download_container{width:75%;margin:auto}#lightbox_content a{color:#6994a3}#lightbox_content .signuptoday a{color:white}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-top:15px}#lightbox_content h2 a{font-size:18.75px}#lightbox_content .ebook_download a{margin:auto 5px auto 0;font-size:15px}#lightbox_content .ebook_download img{vertical-align:middle}#lightbox_content .logo{font-size:15px}#lightbox_content .logo img{-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;height:50px;width:50px;margin-right:5px}#lightbox_content .one_click,#lightbox_content .ebook_download_container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-left:-0.25%;padding:.5%;padding-bottom:15px;margin-bottom:5px;width:74%}#lightbox_content .one_click h3,#lightbox_content .ebook_download_container h3{margin-top:5px}#lightbox_content .one_click{border:solid 2px #8dc63f}#lightbox_content .ebook_download_container{border:solid 2px #d6dde0}#lightbox_content a.add-wishlist .on-wishlist,#lightbox_content a.success,a.success:hover{text-decoration:none;color:#3d4e53}#lightbox_content a.success,a.success:hover{cursor:default}#lightbox_content ul{padding-left:50px}#lightbox_content ul li{margin-bottom:4px}.border{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 2px #d6dde0;margin:5px auto;padding-right:5px;padding-left:5px}.sharing{float:right;padding:.5%!important;width:23%!important;min-width:105px}.sharing ul{padding:.5%!important}.sharing .jsmod-title{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;height:auto}.sharing .jsmod-title span{padding:5%!important;color:white!important;font-style:normal}#widgetcode2{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode2 textarea{max-width:90%}.btn_support.kindle{height:40px}.btn_support.kindle a{width:auto;font-size:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#6994a3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#496b77;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon :first-child{border:0;text-align:center;width:100%!important}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active:hover,.btn-adn.active:hover,.open>.dropdown-toggle.btn-adn:hover,.btn-adn:active:focus,.btn-adn.active:focus,.open>.dropdown-toggle.btn-adn:focus,.btn-adn:active.focus,.btn-adn.active.focus,.open>.dropdown-toggle.btn-adn.focus{color:#fff;background-color:#b94630;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn.disabled,.btn-adn[disabled],fieldset[disabled] .btn-adn,.btn-adn.disabled:hover,.btn-adn[disabled]:hover,fieldset[disabled] .btn-adn:hover,.btn-adn.disabled:focus,.btn-adn[disabled]:focus,fieldset[disabled] .btn-adn:focus,.btn-adn.disabled.focus,.btn-adn[disabled].focus,fieldset[disabled] .btn-adn.focus,.btn-adn.disabled:active,.btn-adn[disabled]:active,fieldset[disabled] .btn-adn:active,.btn-adn.disabled.active,.btn-adn[disabled].active,fieldset[disabled] .btn-adn.active{background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active:hover,.btn-bitbucket.active:hover,.open>.dropdown-toggle.btn-bitbucket:hover,.btn-bitbucket:active:focus,.btn-bitbucket.active:focus,.open>.dropdown-toggle.btn-bitbucket:focus,.btn-bitbucket:active.focus,.btn-bitbucket.active.focus,.open>.dropdown-toggle.btn-bitbucket.focus{color:#fff;background-color:#0f253c;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket.disabled,.btn-bitbucket[disabled],fieldset[disabled] .btn-bitbucket,.btn-bitbucket.disabled:hover,.btn-bitbucket[disabled]:hover,fieldset[disabled] .btn-bitbucket:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket[disabled]:focus,fieldset[disabled] .btn-bitbucket:focus,.btn-bitbucket.disabled.focus,.btn-bitbucket[disabled].focus,fieldset[disabled] .btn-bitbucket.focus,.btn-bitbucket.disabled:active,.btn-bitbucket[disabled]:active,fieldset[disabled] .btn-bitbucket:active,.btn-bitbucket.disabled.active,.btn-bitbucket[disabled].active,fieldset[disabled] .btn-bitbucket.active{background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active:hover,.btn-dropbox.active:hover,.open>.dropdown-toggle.btn-dropbox:hover,.btn-dropbox:active:focus,.btn-dropbox.active:focus,.open>.dropdown-toggle.btn-dropbox:focus,.btn-dropbox:active.focus,.btn-dropbox.active.focus,.open>.dropdown-toggle.btn-dropbox.focus{color:#fff;background-color:#0a568c;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox.disabled,.btn-dropbox[disabled],fieldset[disabled] .btn-dropbox,.btn-dropbox.disabled:hover,.btn-dropbox[disabled]:hover,fieldset[disabled] .btn-dropbox:hover,.btn-dropbox.disabled:focus,.btn-dropbox[disabled]:focus,fieldset[disabled] .btn-dropbox:focus,.btn-dropbox.disabled.focus,.btn-dropbox[disabled].focus,fieldset[disabled] .btn-dropbox.focus,.btn-dropbox.disabled:active,.btn-dropbox[disabled]:active,fieldset[disabled] .btn-dropbox:active,.btn-dropbox.disabled.active,.btn-dropbox[disabled].active,fieldset[disabled] .btn-dropbox.active{background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active:hover,.btn-facebook.active:hover,.open>.dropdown-toggle.btn-facebook:hover,.btn-facebook:active:focus,.btn-facebook.active:focus,.open>.dropdown-toggle.btn-facebook:focus,.btn-facebook:active.focus,.btn-facebook.active.focus,.open>.dropdown-toggle.btn-facebook.focus{color:#fff;background-color:#23345a;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook.disabled,.btn-facebook[disabled],fieldset[disabled] .btn-facebook,.btn-facebook.disabled:hover,.btn-facebook[disabled]:hover,fieldset[disabled] .btn-facebook:hover,.btn-facebook.disabled:focus,.btn-facebook[disabled]:focus,fieldset[disabled] .btn-facebook:focus,.btn-facebook.disabled.focus,.btn-facebook[disabled].focus,fieldset[disabled] .btn-facebook.focus,.btn-facebook.disabled:active,.btn-facebook[disabled]:active,fieldset[disabled] .btn-facebook:active,.btn-facebook.disabled.active,.btn-facebook[disabled].active,fieldset[disabled] .btn-facebook.active{background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active:hover,.btn-flickr.active:hover,.open>.dropdown-toggle.btn-flickr:hover,.btn-flickr:active:focus,.btn-flickr.active:focus,.open>.dropdown-toggle.btn-flickr:focus,.btn-flickr:active.focus,.btn-flickr.active.focus,.open>.dropdown-toggle.btn-flickr.focus{color:#fff;background-color:#a80057;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr.disabled,.btn-flickr[disabled],fieldset[disabled] .btn-flickr,.btn-flickr.disabled:hover,.btn-flickr[disabled]:hover,fieldset[disabled] .btn-flickr:hover,.btn-flickr.disabled:focus,.btn-flickr[disabled]:focus,fieldset[disabled] .btn-flickr:focus,.btn-flickr.disabled.focus,.btn-flickr[disabled].focus,fieldset[disabled] .btn-flickr.focus,.btn-flickr.disabled:active,.btn-flickr[disabled]:active,fieldset[disabled] .btn-flickr:active,.btn-flickr.disabled.active,.btn-flickr[disabled].active,fieldset[disabled] .btn-flickr.active{background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active:hover,.btn-foursquare.active:hover,.open>.dropdown-toggle.btn-foursquare:hover,.btn-foursquare:active:focus,.btn-foursquare.active:focus,.open>.dropdown-toggle.btn-foursquare:focus,.btn-foursquare:active.focus,.btn-foursquare.active.focus,.open>.dropdown-toggle.btn-foursquare.focus{color:#fff;background-color:#e30742;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare.disabled,.btn-foursquare[disabled],fieldset[disabled] .btn-foursquare,.btn-foursquare.disabled:hover,.btn-foursquare[disabled]:hover,fieldset[disabled] .btn-foursquare:hover,.btn-foursquare.disabled:focus,.btn-foursquare[disabled]:focus,fieldset[disabled] .btn-foursquare:focus,.btn-foursquare.disabled.focus,.btn-foursquare[disabled].focus,fieldset[disabled] .btn-foursquare.focus,.btn-foursquare.disabled:active,.btn-foursquare[disabled]:active,fieldset[disabled] .btn-foursquare:active,.btn-foursquare.disabled.active,.btn-foursquare[disabled].active,fieldset[disabled] .btn-foursquare.active{background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active:hover,.btn-github.active:hover,.open>.dropdown-toggle.btn-github:hover,.btn-github:active:focus,.btn-github.active:focus,.open>.dropdown-toggle.btn-github:focus,.btn-github:active.focus,.btn-github.active.focus,.open>.dropdown-toggle.btn-github.focus{color:#fff;background-color:#191919;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github.disabled,.btn-github[disabled],fieldset[disabled] .btn-github,.btn-github.disabled:hover,.btn-github[disabled]:hover,fieldset[disabled] .btn-github:hover,.btn-github.disabled:focus,.btn-github[disabled]:focus,fieldset[disabled] .btn-github:focus,.btn-github.disabled.focus,.btn-github[disabled].focus,fieldset[disabled] .btn-github.focus,.btn-github.disabled:active,.btn-github[disabled]:active,fieldset[disabled] .btn-github:active,.btn-github.disabled.active,.btn-github[disabled].active,fieldset[disabled] .btn-github.active{background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github .badge{color:#444;background-color:#fff}.btn-google-plus{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus:focus,.btn-google-plus.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.dropdown-toggle.btn-google-plus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active:hover,.btn-google-plus.active:hover,.open>.dropdown-toggle.btn-google-plus:hover,.btn-google-plus:active:focus,.btn-google-plus.active:focus,.open>.dropdown-toggle.btn-google-plus:focus,.btn-google-plus:active.focus,.btn-google-plus.active.focus,.open>.dropdown-toggle.btn-google-plus.focus{color:#fff;background-color:#a32b1c;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.dropdown-toggle.btn-google-plus{background-image:none}.btn-google-plus.disabled,.btn-google-plus[disabled],fieldset[disabled] .btn-google-plus,.btn-google-plus.disabled:hover,.btn-google-plus[disabled]:hover,fieldset[disabled] .btn-google-plus:hover,.btn-google-plus.disabled:focus,.btn-google-plus[disabled]:focus,fieldset[disabled] .btn-google-plus:focus,.btn-google-plus.disabled.focus,.btn-google-plus[disabled].focus,fieldset[disabled] .btn-google-plus.focus,.btn-google-plus.disabled:active,.btn-google-plus[disabled]:active,fieldset[disabled] .btn-google-plus:active,.btn-google-plus.disabled.active,.btn-google-plus[disabled].active,fieldset[disabled] .btn-google-plus.active{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active:hover,.btn-instagram.active:hover,.open>.dropdown-toggle.btn-instagram:hover,.btn-instagram:active:focus,.btn-instagram.active:focus,.open>.dropdown-toggle.btn-instagram:focus,.btn-instagram:active.focus,.btn-instagram.active.focus,.open>.dropdown-toggle.btn-instagram.focus{color:#fff;background-color:#26455d;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram.disabled,.btn-instagram[disabled],fieldset[disabled] .btn-instagram,.btn-instagram.disabled:hover,.btn-instagram[disabled]:hover,fieldset[disabled] .btn-instagram:hover,.btn-instagram.disabled:focus,.btn-instagram[disabled]:focus,fieldset[disabled] .btn-instagram:focus,.btn-instagram.disabled.focus,.btn-instagram[disabled].focus,fieldset[disabled] .btn-instagram.focus,.btn-instagram.disabled:active,.btn-instagram[disabled]:active,fieldset[disabled] .btn-instagram:active,.btn-instagram.disabled.active,.btn-instagram[disabled].active,fieldset[disabled] .btn-instagram.active{background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active:hover,.btn-linkedin.active:hover,.open>.dropdown-toggle.btn-linkedin:hover,.btn-linkedin:active:focus,.btn-linkedin.active:focus,.open>.dropdown-toggle.btn-linkedin:focus,.btn-linkedin:active.focus,.btn-linkedin.active.focus,.open>.dropdown-toggle.btn-linkedin.focus{color:#fff;background-color:#00405f;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin.disabled,.btn-linkedin[disabled],fieldset[disabled] .btn-linkedin,.btn-linkedin.disabled:hover,.btn-linkedin[disabled]:hover,fieldset[disabled] .btn-linkedin:hover,.btn-linkedin.disabled:focus,.btn-linkedin[disabled]:focus,fieldset[disabled] .btn-linkedin:focus,.btn-linkedin.disabled.focus,.btn-linkedin[disabled].focus,fieldset[disabled] .btn-linkedin.focus,.btn-linkedin.disabled:active,.btn-linkedin[disabled]:active,fieldset[disabled] .btn-linkedin:active,.btn-linkedin.disabled.active,.btn-linkedin[disabled].active,fieldset[disabled] .btn-linkedin.active{background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active:hover,.btn-microsoft.active:hover,.open>.dropdown-toggle.btn-microsoft:hover,.btn-microsoft:active:focus,.btn-microsoft.active:focus,.open>.dropdown-toggle.btn-microsoft:focus,.btn-microsoft:active.focus,.btn-microsoft.active.focus,.open>.dropdown-toggle.btn-microsoft.focus{color:#fff;background-color:#0f4bac;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft.disabled,.btn-microsoft[disabled],fieldset[disabled] .btn-microsoft,.btn-microsoft.disabled:hover,.btn-microsoft[disabled]:hover,fieldset[disabled] .btn-microsoft:hover,.btn-microsoft.disabled:focus,.btn-microsoft[disabled]:focus,fieldset[disabled] .btn-microsoft:focus,.btn-microsoft.disabled.focus,.btn-microsoft[disabled].focus,fieldset[disabled] .btn-microsoft.focus,.btn-microsoft.disabled:active,.btn-microsoft[disabled]:active,fieldset[disabled] .btn-microsoft:active,.btn-microsoft.disabled.active,.btn-microsoft[disabled].active,fieldset[disabled] .btn-microsoft.active{background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active:hover,.btn-openid.active:hover,.open>.dropdown-toggle.btn-openid:hover,.btn-openid:active:focus,.btn-openid.active:focus,.open>.dropdown-toggle.btn-openid:focus,.btn-openid:active.focus,.btn-openid.active.focus,.open>.dropdown-toggle.btn-openid.focus{color:#fff;background-color:#b86607;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid.disabled,.btn-openid[disabled],fieldset[disabled] .btn-openid,.btn-openid.disabled:hover,.btn-openid[disabled]:hover,fieldset[disabled] .btn-openid:hover,.btn-openid.disabled:focus,.btn-openid[disabled]:focus,fieldset[disabled] .btn-openid:focus,.btn-openid.disabled.focus,.btn-openid[disabled].focus,fieldset[disabled] .btn-openid.focus,.btn-openid.disabled:active,.btn-openid[disabled]:active,fieldset[disabled] .btn-openid:active,.btn-openid.disabled.active,.btn-openid[disabled].active,fieldset[disabled] .btn-openid.active{background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active:hover,.btn-pinterest.active:hover,.open>.dropdown-toggle.btn-pinterest:hover,.btn-pinterest:active:focus,.btn-pinterest.active:focus,.open>.dropdown-toggle.btn-pinterest:focus,.btn-pinterest:active.focus,.btn-pinterest.active.focus,.open>.dropdown-toggle.btn-pinterest.focus{color:#fff;background-color:#801419;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest.disabled,.btn-pinterest[disabled],fieldset[disabled] .btn-pinterest,.btn-pinterest.disabled:hover,.btn-pinterest[disabled]:hover,fieldset[disabled] .btn-pinterest:hover,.btn-pinterest.disabled:focus,.btn-pinterest[disabled]:focus,fieldset[disabled] .btn-pinterest:focus,.btn-pinterest.disabled.focus,.btn-pinterest[disabled].focus,fieldset[disabled] .btn-pinterest.focus,.btn-pinterest.disabled:active,.btn-pinterest[disabled]:active,fieldset[disabled] .btn-pinterest:active,.btn-pinterest.disabled.active,.btn-pinterest[disabled].active,fieldset[disabled] .btn-pinterest.active{background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active:hover,.btn-reddit.active:hover,.open>.dropdown-toggle.btn-reddit:hover,.btn-reddit:active:focus,.btn-reddit.active:focus,.open>.dropdown-toggle.btn-reddit:focus,.btn-reddit:active.focus,.btn-reddit.active.focus,.open>.dropdown-toggle.btn-reddit.focus{color:#000;background-color:#98ccff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit.disabled,.btn-reddit[disabled],fieldset[disabled] .btn-reddit,.btn-reddit.disabled:hover,.btn-reddit[disabled]:hover,fieldset[disabled] .btn-reddit:hover,.btn-reddit.disabled:focus,.btn-reddit[disabled]:focus,fieldset[disabled] .btn-reddit:focus,.btn-reddit.disabled.focus,.btn-reddit[disabled].focus,fieldset[disabled] .btn-reddit.focus,.btn-reddit.disabled:active,.btn-reddit[disabled]:active,fieldset[disabled] .btn-reddit:active,.btn-reddit.disabled.active,.btn-reddit[disabled].active,fieldset[disabled] .btn-reddit.active{background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active:hover,.btn-soundcloud.active:hover,.open>.dropdown-toggle.btn-soundcloud:hover,.btn-soundcloud:active:focus,.btn-soundcloud.active:focus,.open>.dropdown-toggle.btn-soundcloud:focus,.btn-soundcloud:active.focus,.btn-soundcloud.active.focus,.open>.dropdown-toggle.btn-soundcloud.focus{color:#fff;background-color:#a83800;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud.disabled,.btn-soundcloud[disabled],fieldset[disabled] .btn-soundcloud,.btn-soundcloud.disabled:hover,.btn-soundcloud[disabled]:hover,fieldset[disabled] .btn-soundcloud:hover,.btn-soundcloud.disabled:focus,.btn-soundcloud[disabled]:focus,fieldset[disabled] .btn-soundcloud:focus,.btn-soundcloud.disabled.focus,.btn-soundcloud[disabled].focus,fieldset[disabled] .btn-soundcloud.focus,.btn-soundcloud.disabled:active,.btn-soundcloud[disabled]:active,fieldset[disabled] .btn-soundcloud:active,.btn-soundcloud.disabled.active,.btn-soundcloud[disabled].active,fieldset[disabled] .btn-soundcloud.active{background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active:hover,.btn-tumblr.active:hover,.open>.dropdown-toggle.btn-tumblr:hover,.btn-tumblr:active:focus,.btn-tumblr.active:focus,.open>.dropdown-toggle.btn-tumblr:focus,.btn-tumblr:active.focus,.btn-tumblr.active.focus,.open>.dropdown-toggle.btn-tumblr.focus{color:#fff;background-color:#111c26;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr.disabled,.btn-tumblr[disabled],fieldset[disabled] .btn-tumblr,.btn-tumblr.disabled:hover,.btn-tumblr[disabled]:hover,fieldset[disabled] .btn-tumblr:hover,.btn-tumblr.disabled:focus,.btn-tumblr[disabled]:focus,fieldset[disabled] .btn-tumblr:focus,.btn-tumblr.disabled.focus,.btn-tumblr[disabled].focus,fieldset[disabled] .btn-tumblr.focus,.btn-tumblr.disabled:active,.btn-tumblr[disabled]:active,fieldset[disabled] .btn-tumblr:active,.btn-tumblr.disabled.active,.btn-tumblr[disabled].active,fieldset[disabled] .btn-tumblr.active{background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active:hover,.btn-twitter.active:hover,.open>.dropdown-toggle.btn-twitter:hover,.btn-twitter:active:focus,.btn-twitter.active:focus,.open>.dropdown-toggle.btn-twitter:focus,.btn-twitter:active.focus,.btn-twitter.active.focus,.open>.dropdown-toggle.btn-twitter.focus{color:#fff;background-color:#1583d7;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter.disabled,.btn-twitter[disabled],fieldset[disabled] .btn-twitter,.btn-twitter.disabled:hover,.btn-twitter[disabled]:hover,fieldset[disabled] .btn-twitter:hover,.btn-twitter.disabled:focus,.btn-twitter[disabled]:focus,fieldset[disabled] .btn-twitter:focus,.btn-twitter.disabled.focus,.btn-twitter[disabled].focus,fieldset[disabled] .btn-twitter.focus,.btn-twitter.disabled:active,.btn-twitter[disabled]:active,fieldset[disabled] .btn-twitter:active,.btn-twitter.disabled.active,.btn-twitter[disabled].active,fieldset[disabled] .btn-twitter.active{background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active:hover,.btn-vimeo.active:hover,.open>.dropdown-toggle.btn-vimeo:hover,.btn-vimeo:active:focus,.btn-vimeo.active:focus,.open>.dropdown-toggle.btn-vimeo:focus,.btn-vimeo:active.focus,.btn-vimeo.active.focus,.open>.dropdown-toggle.btn-vimeo.focus{color:#fff;background-color:#0f7b9f;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo.disabled,.btn-vimeo[disabled],fieldset[disabled] .btn-vimeo,.btn-vimeo.disabled:hover,.btn-vimeo[disabled]:hover,fieldset[disabled] .btn-vimeo:hover,.btn-vimeo.disabled:focus,.btn-vimeo[disabled]:focus,fieldset[disabled] .btn-vimeo:focus,.btn-vimeo.disabled.focus,.btn-vimeo[disabled].focus,fieldset[disabled] .btn-vimeo.focus,.btn-vimeo.disabled:active,.btn-vimeo[disabled]:active,fieldset[disabled] .btn-vimeo:active,.btn-vimeo.disabled.active,.btn-vimeo[disabled].active,fieldset[disabled] .btn-vimeo.active{background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active:hover,.btn-vk.active:hover,.open>.dropdown-toggle.btn-vk:hover,.btn-vk:active:focus,.btn-vk.active:focus,.open>.dropdown-toggle.btn-vk:focus,.btn-vk:active.focus,.btn-vk.active.focus,.open>.dropdown-toggle.btn-vk.focus{color:#fff;background-color:#3a526b;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk.disabled,.btn-vk[disabled],fieldset[disabled] .btn-vk,.btn-vk.disabled:hover,.btn-vk[disabled]:hover,fieldset[disabled] .btn-vk:hover,.btn-vk.disabled:focus,.btn-vk[disabled]:focus,fieldset[disabled] .btn-vk:focus,.btn-vk.disabled.focus,.btn-vk[disabled].focus,fieldset[disabled] .btn-vk.focus,.btn-vk.disabled:active,.btn-vk[disabled]:active,fieldset[disabled] .btn-vk:active,.btn-vk.disabled.active,.btn-vk[disabled].active,fieldset[disabled] .btn-vk.active{background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active:hover,.btn-yahoo.active:hover,.open>.dropdown-toggle.btn-yahoo:hover,.btn-yahoo:active:focus,.btn-yahoo.active:focus,.open>.dropdown-toggle.btn-yahoo:focus,.btn-yahoo:active.focus,.btn-yahoo.active.focus,.open>.dropdown-toggle.btn-yahoo.focus{color:#fff;background-color:#39074e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo.disabled,.btn-yahoo[disabled],fieldset[disabled] .btn-yahoo,.btn-yahoo.disabled:hover,.btn-yahoo[disabled]:hover,fieldset[disabled] .btn-yahoo:hover,.btn-yahoo.disabled:focus,.btn-yahoo[disabled]:focus,fieldset[disabled] .btn-yahoo:focus,.btn-yahoo.disabled.focus,.btn-yahoo[disabled].focus,fieldset[disabled] .btn-yahoo.focus,.btn-yahoo.disabled:active,.btn-yahoo[disabled]:active,fieldset[disabled] .btn-yahoo:active,.btn-yahoo.disabled.active,.btn-yahoo[disabled].active,fieldset[disabled] .btn-yahoo.active{background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.preview{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%}.preview a{color:#8dc63f}.launch_top{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;border-color:#8dc63f;margin:10px auto 0 auto;font-size:15px;line-height:22.5px}.launch_top a{color:#8dc63f}.launch_top.pale{border-color:#d6dde0;font-size:13px}.launch_top.alert{border-color:#e35351;font-size:13px}.preview_content{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;width:80%;margin:10px auto}.preview_content a{color:#8dc63f}.utilityheaders{text-transform:uppercase;color:#3d4e53;font-size:15px;display:block}html,body{height:100%}body{background:url("/static/images/bg-body.png") 0 0 repeat-x;padding:0 0 20px 0;margin:0;font-size:13px;line-height:16.900000000000002px;font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Arial,Helvetica,sans-serif;color:#3d4e53}#feedback{position:fixed;bottom:10%;right:0;z-index:500}#feedback p{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);white-space:nowrap;display:block;bottom:0;width:160px;height:32px;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;background:#8dc63f;margin-bottom:0;text-align:center;margin-right:-67px;line-height:normal}#feedback p a{color:white;font-size:24px;font-weight:normal}#feedback p a:hover{color:#3d4e53}a{font-weight:bold;font-size:inherit;text-decoration:none;cursor:pointer;color:#6994a3}a:hover{text-decoration:underline}h1{font-size:22.5px}h2{font-size:18.75px}h3{font-size:17.549999999999997px}h4{font-size:15px}img{border:0}img.user-avatar{float:left;margin-right:10px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px}input,textarea,a.fakeinput{border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}input:focus,textarea:focus,a.fakeinput:focus{border:2px solid #8dc63f;outline:0}a.fakeinput:hover{text-decoration:none}.js-search input{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}h2.content-heading{padding:15px;margin:0;font-size:19px;font-weight:normal;color:#3d4e53;float:left;width:50%}h2.content-heading span{font-style:italic}h3.jsmod-title{-moz-border-radius:8px 8px 0 0;-webkit-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0;background:#edf3f4;padding:0;margin:0;height:2.3em}h3.jsmod-title span{font-size:19px;font-style:italic;color:#3d4e53;padding:.7em 2em .5em 2em;display:block}input[type="submit"],a.fakeinput{background:#8dc63f;color:white;font-weight:bold;padding:.5em 1em;cursor:pointer}.loader-gif[disabled="disabled"],.loader-gif.show-loading{background:url('/static/images/loading.gif') center no-repeat!important}.js-page-wrap{position:relative;min-height:100%}.js-main{width:960px;margin:0 auto;clear:both;padding:0}.bigger{font-size:15px}ul.menu{list-style:none;padding:0;margin:0}.errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errorlist li{list-style:none;border:0}.errorlist li{list-style:none;border:0}.errorlist li{list-style:none;border:0}.errorlist+input{border:2px solid #e35351!important}.errorlist+input:focus{border:1px solid #8dc63f!important}.errorlist+textarea{border:2px solid #e35351!important}.errorlist+textarea:focus{border:2px solid #8dc63f!important}.p_form .errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:0;color:#e35351;clear:none;width:100%;height:auto;line-height:16px;padding:0;font-weight:normal;text-align:left;display:inline}.p_form .errorlist li{display:inline}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}#js-header{height:90px}.js-logo{float:left;padding-top:10px}.js-logo a img{border:0}.js-topmenu{float:right;margin-top:25px;font-size:15px}.js-topmenu#authenticated{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:36px}.js-topmenu#authenticated:hover,.js-topmenu#authenticated.highlight{background:#d6dde0;cursor:pointer;position:relative}.js-topmenu ul#user_menu{white-space:nowrap;display:none;z-index:100;position:absolute;top:36px;left:0;padding:0;overflow:visible;margin:0}.js-topmenu ul#user_menu li{border-top:1px solid white;list-style-type:none;float:none;background:#d6dde0;padding:7px 10px}.js-topmenu ul#user_menu li:hover{background:#8dc63f}.js-topmenu ul#user_menu li:hover a{color:white}.js-topmenu ul#user_menu li:hover #i_haz_notifications{border-color:white;background-color:white;color:#3d4e53}.js-topmenu ul#user_menu li a{height:auto;line-height:26.25px}.js-topmenu ul#user_menu li span{margin-right:10px}.js-topmenu ul li{float:left;position:relative;z-index:50}.js-topmenu ul li .notbutton{color:#3d4e53;line-height:36px}.js-topmenu ul li a{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.js-topmenu ul li span#welcome{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em;padding:0 10px}.js-topmenu ul li img{padding:0;margin:0}.js-topmenu ul li.last{padding-left:20px}.js-topmenu ul li.last a span{-moz-border-radius:32px 0 0 32px;-webkit-border-radius:32px 0 0 32px;border-radius:32px 0 0 32px;background-color:#8dc63f;margin-right:29px;display:block;padding:0 5px 0 15px;color:white}.js-topmenu ul .unseen_count{border:solid 2px;-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;padding:3px;line-height:16px;width:16px;cursor:pointer;text-align:center}.js-topmenu ul .unseen_count#i_haz_notifications{background-color:#8dc63f;color:white;border-color:white}.js-topmenu ul .unseen_count#no_notifications_for_you{border-color:#edf3f4;background-color:#edf3f4;color:#3d4e53}.btn-signup{color:#fff;background-color:#8dc63f;border-color:#ccc}.btn-signup:focus,.btn-signup.focus{color:#fff;background-color:#72a230;border-color:#8c8c8c}.btn-signup:hover{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active,.btn-signup.active,.open>.dropdown-toggle.btn-signup{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active:hover,.btn-signup.active:hover,.open>.dropdown-toggle.btn-signup:hover,.btn-signup:active:focus,.btn-signup.active:focus,.open>.dropdown-toggle.btn-signup:focus,.btn-signup:active.focus,.btn-signup.active.focus,.open>.dropdown-toggle.btn-signup.focus{color:#fff;background-color:#5e8628;border-color:#8c8c8c}.btn-signup:active,.btn-signup.active,.open>.dropdown-toggle.btn-signup{background-image:none}.btn-signup.disabled,.btn-signup[disabled],fieldset[disabled] .btn-signup,.btn-signup.disabled:hover,.btn-signup[disabled]:hover,fieldset[disabled] .btn-signup:hover,.btn-signup.disabled:focus,.btn-signup[disabled]:focus,fieldset[disabled] .btn-signup:focus,.btn-signup.disabled.focus,.btn-signup[disabled].focus,fieldset[disabled] .btn-signup.focus,.btn-signup.disabled:active,.btn-signup[disabled]:active,fieldset[disabled] .btn-signup:active,.btn-signup.disabled.active,.btn-signup[disabled].active,fieldset[disabled] .btn-signup.active{background-color:#8dc63f;border-color:#ccc}.btn-signup .badge{color:#8dc63f;background-color:#fff}.btn-readon{color:#fff;background-color:#8ac3d7;border-color:#ccc}.btn-readon:focus,.btn-readon.focus{color:#fff;background-color:#64b0ca;border-color:#8c8c8c}.btn-readon:hover{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active,.btn-readon.active,.open>.dropdown-toggle.btn-readon{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active:hover,.btn-readon.active:hover,.open>.dropdown-toggle.btn-readon:hover,.btn-readon:active:focus,.btn-readon.active:focus,.open>.dropdown-toggle.btn-readon:focus,.btn-readon:active.focus,.btn-readon.active.focus,.open>.dropdown-toggle.btn-readon.focus{color:#fff;background-color:#49a2c1;border-color:#8c8c8c}.btn-readon:active,.btn-readon.active,.open>.dropdown-toggle.btn-readon{background-image:none}.btn-readon.disabled,.btn-readon[disabled],fieldset[disabled] .btn-readon,.btn-readon.disabled:hover,.btn-readon[disabled]:hover,fieldset[disabled] .btn-readon:hover,.btn-readon.disabled:focus,.btn-readon[disabled]:focus,fieldset[disabled] .btn-readon:focus,.btn-readon.disabled.focus,.btn-readon[disabled].focus,fieldset[disabled] .btn-readon.focus,.btn-readon.disabled:active,.btn-readon[disabled]:active,fieldset[disabled] .btn-readon:active,.btn-readon.disabled.active,.btn-readon[disabled].active,fieldset[disabled] .btn-readon.active{background-color:#8ac3d7;border-color:#ccc}.btn-readon .badge{color:#8ac3d7;background-color:#fff}#i_haz_notifications_badge{-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;font-size:13px;border:solid 2px white;margin-left:-7px;margin-top:-10px;padding:3px;background:#8dc63f;color:white;position:absolute;line-height:normal}form.login label,#login form label{display:block;line-height:20px;font-size:15px}form.login input,#login form input{width:90%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0;height:18px;line-height:18px;margin-bottom:6px}form.login input[type=submit],#login form input[type=submit]{text-decoration:capitalize;width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}form.login input:focus,#login form input:focus{border:solid 1px #8dc63f}form.login input[type="text"],#login form input[type="text"],form.login input[type="password"],#login form input[type="password"]{height:22.75px;line-height:22.75px;margin-bottom:13px;border-width:2px}form.login input[type="submit"],#login form input[type="submit"]{font-size:15px}form.login span.helptext,#login form span.helptext{display:block;margin-top:-11px;font-style:italic;font-size:13px}#lightbox_content a.btn{color:#FFF}.js-search{float:left;padding-top:25px;margin-left:81px}.js-search input{float:left}.js-search .inputbox{padding:0 0 0 15px;margin:0;border-top:solid 4px #8ac3d7;border-left:solid 4px #8ac3d7;border-bottom:solid 4px #8ac3d7;border-right:0;-moz-border-radius:50px 0 0 50px;-webkit-border-radius:50px 0 0 50px;border-radius:50px 0 0 50px;outline:0;height:28px;line-height:28px;width:156px;float:left;color:#6994a3}.js-search .button{background:url("/static/images/blue-search-button.png") no-repeat;padding:0;margin:0;width:40px;height:36px;display:block;border:0;text-indent:-10000px;cursor:pointer}.js-search-inner{float:right}#locationhash{display:none}#block-intro-text{padding-right:10px}#block-intro-text span.def{font-style:italic}a#readon{color:#fff;text-transform:capitalize;display:block;float:right;font-size:13px;font-weight:bold}.spread_the_word{height:24px;width:24px;position:top;margin-left:5px}#js-leftcol{float:left;width:235px;margin-bottom:20px}#js-leftcol a{font-weight:normal}#js-leftcol a:hover{text-decoration:underline}#js-leftcol .jsmod-content{border:solid 1px #edf3f4;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px}#js-leftcol ul.level1>li>a,#js-leftcol ul.level1>li>span{border-bottom:1px solid #edf3f4;border-top:1px solid #edf3f4;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:10px}#js-leftcol ul.level2 li{padding:5px 20px}#js-leftcol ul.level2 li a{color:#6994a3;font-size:15px}#js-leftcol ul.level2 li img{vertical-align:middle;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}#js-leftcol ul.level2 li .ungluer-name{height:30px;line-height:30px}#js-leftcol ul.level2 li.first{font-size:15px;color:#3d4e53;padding-left:10px}#js-leftcol ul.level3 li{padding:0 20px}#js-leftcol ul.level3 li a{color:#6994a3;font-size:15px}#js-topsection{padding:15px 0 0 0;overflow:hidden}.js-topnews{float:left;width:100%}.js-topnews1{background:url("/static/images/header/header-m.png") 0 0 repeat-y}.js-topnews2{background:url("/static/images/header/header-t.png") 0 0 no-repeat}.js-topnews3{background:url("/static/images/header/header-b.png") 0 100% no-repeat;display:block;overflow:hidden;padding:10px}#main-container{margin:15px 0 0 0}#js-maincol-fr{float:right;width:725px}div#content-block{overflow:hidden;background:url("/static/images/bg.png") 100% -223px no-repeat;padding:0 0 0 7px;margin-bottom:20px}div#content-block.jsmodule{background:0}.content-block-heading a.block-link{float:right;padding:15px;font-size:13px;color:#3d4e53;text-decoration:underline;font-weight:normal}div#content-block-content,div#content-block-content-1{width:100%;overflow:hidden;padding-left:10px}div#content-block-content .cols3 .column,div#content-block-content-1 .cols3 .column{width:33.33%;float:left}#footer{background-color:#edf3f4;clear:both;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:15px 0 45px 0;margin-top:15px;overflow:hidden}#footer .column{float:left;width:25%;padding-top:5px}#footer .column ul{padding-top:5px;margin-left:0;padding-left:0}#footer .column li{padding:5px 0;text-transform:none;list-style:none;margin-left:0}#footer .column li a{color:#6994a3;font-size:15px}.pagination{width:100%;text-align:center;margin-top:20px;clear:both;border-top:solid #3d4e53 thin;padding-top:7px}.pagination .endless_page_link{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px}.pagination .endless_page_current{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px;background-color:#edf3f4}a.nounderline{text-decoration:none}.slides_control{height:325px!important}#about_expandable{display:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;background:white;z-index:500;top:25%;padding:9px;max-width:90%}#about_expandable .collapser_x{margin-top:-27px;margin-right:-27px}#lightbox_content p,#lightbox_content li{padding:9px 0;font-size:15px;line-height:20px}#lightbox_content p a,#lightbox_content li a{font-size:15px;line-height:20px}#lightbox_content p b,#lightbox_content li b{color:#8dc63f}#lightbox_content p.last,#lightbox_content li.last{border-bottom:solid 2px #d6dde0;margin-bottom:5px}#lightbox_content .right_border{border-right:solid 1px #d6dde0;float:left;padding:9px}#lightbox_content .signuptoday{float:right;margin-top:0;clear:none}#lightbox_content h2+form,#lightbox_content h3+form,#lightbox_content h4+form{margin-top:15px}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-bottom:10px}.nonlightbox .about_page{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;width:75%;margin:10px auto auto auto;padding:9px}.collapser_x{float:right;height:24px;line-height:24px;width:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px;-moz-box-shadow:-1px 1px #3d4e53;-webkit-box-shadow:-1px 1px #3d4e53;box-shadow:-1px 1px #3d4e53;border:solid 3px white;text-align:center;color:white;background:#3d4e53;font-size:17px;z-index:5000;margin-top:-12px;margin-right:-22px}.signuptoday{padding:0 15px;height:36px;line-height:36px;float:left;clear:both;margin:10px auto;cursor:pointer;font-style:normal}.signuptoday a{padding-right:17px;color:white}.signuptoday a:hover{text-decoration:none}.central{width:480px;margin:0 auto}li.checked{list-style-type:decimal;background:transparent url(/static/images/checkmark_small.png) no-repeat 0 0;margin-left:0;padding-left:20px}.btn_support{margin:10px;width:215px}.btn_support a,.btn_support form input,.btn_support>span{font-size:22px;border:4px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;display:block;text-align:center;padding-top:14.25px;padding-bottom:14.25px;background-color:#8dc63f;color:white!important}.btn_support a span,.btn_support form input span,.btn_support>span span{color:white!important;font-weight:bold;padding-left:0;margin-left:0!important;background:0}.btn_support.create-account span{padding:0;margin:0;background:0}.btn_support a:hover,.btn_support form input:hover{background-color:#7aae34;text-decoration:none}.btn_support a{width:207px}.btn_support form input{width:215px}.btn_support.modify a,.btn_support.modify form input{background-color:#a7c1ca}.btn_support.modify a:hover,.btn_support.modify form input:hover{background-color:#91b1bd}.instructions h4{border-top:solid #d6dde0 1px;border-bottom:solid #d6dde0 1px;padding:.5em 0}.instructions>div{padding-left:1%;padding-right:1%;font-size:15px;line-height:22.5px;width:98%}.instructions>div.active{float:left}.one_click{float:left}.one_click>div{float:left}.one_click>div #kindle a,.one_click>div .kindle a,.one_click>div #marvin a,.one_click>div .marvin a,.one_click>div #mac_ibooks a,.one_click>div .mac_ibooks a{font-size:15px;padding:9px 0}.one_click>div div{margin:0 10px 0 0}.ebook_download_container{clear:left}.other_instructions_paragraph{display:none}#iOS_app_div,#ios_div{display:none}.yes_js{display:none}.std_form,.std_form input,.std_form select{line-height:30px;font-size:15px}.contrib_amount{padding:10px;font-size:19px;text-align:center}#id_preapproval_amount{width:50%;line-height:30px;font-size:15px}#askblock{float:right;min-width:260px;background:#edf3f4;padding:10px;width:30%}.rh_ask{font-size:15px;width:65%}#contribsubmit{text-align:center;font-size:19px;margin:0 0 10px;cursor:pointer}#anoncontribbox{padding-bottom:10px}.faq_tldr{font-style:italic;font-size:19px;text-align:center;line-height:24.7px;color:#6994a3;margin-left:2em}.deletebutton,input[type='submit'].deletebutton{height:20px;padding:.2em .6em;background-color:lightgray;margin-left:1em;color:white;font-weight:bold;cursor:pointer} \ No newline at end of file diff --git a/static/less/sitewide4.less b/static/less/sitewide4.less index ef0f7b13..8984f129 100644 --- a/static/less/sitewide4.less +++ b/static/less/sitewide4.less @@ -856,9 +856,9 @@ a.nounderline { } li.checked { - list-style-type:none; + list-style-type:decimal; background:transparent url(/static/images/checkmark_small.png) no-repeat 0 0; - margin-left: -20px; + margin-left: 0px; padding-left: 20px; } From 50a0296eee49b828fef0b375d96ef4abfba40637 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 8 Nov 2017 17:29:41 -0500 Subject: [PATCH 005/109] add supporter facet --- core/facets.py | 41 ++++++++++++++++++++++-- frontend/templates/facets/supporter.html | 5 +++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 frontend/templates/facets/supporter.html diff --git a/core/facets.py b/core/facets.py index 20272808..52d32f9a 100644 --- a/core/facets.py +++ b/core/facets.py @@ -1,7 +1,8 @@ from django.apps import apps +from django.contrib.auth.models import User from django.db.models import Q from regluit.core import cc - + class BaseFacet(object): facet_name = 'all' model_filters ={} @@ -276,6 +277,42 @@ class SearchFacetGroup(FacetGroup): def description(self): return "eBooks for {}".format(self.term) return KeywordFacet + +class SupporterFacetGroup(FacetGroup): + + def __init__(self): + super(FacetGroup,self).__init__() + self.title = 'Supporter Faves' + # make facets in TOPKW available for display + self.facets = [] + self.label = '{} are ...'.format(self.title) + + def has_facet(self, facet_name): + + # recognize any facet_name that starts with "@" as a valid facet name + return facet_name.startswith('@') + + def get_facet_class(self, facet_name): + class SupporterFacet(NamedFacet): + def set_name(self): + self.facet_name = facet_name + self.username = self.facet_name[1:] + try: + user = User.objects.get(username=self.username) + self.fave_set = user.wishlist.works.all() + except User.DoesNotExist: + self.fave_set = self.model.objects.none() + + def get_query_set(self): + return self._get_query_set().filter(pk__in=self.fave_set) + + def template(self): + return 'facets/supporter.html' + + @property + def description(self): + return "eBooks faved by @{}".format(self.username) + return SupporterFacet class PublisherFacetGroup(FacetGroup): @@ -325,7 +362,7 @@ class PublisherFacetGroup(FacetGroup): return PublisherFacet # order of groups in facet_groups determines order of display on /free/ -facet_groups = [KeywordFacetGroup(), FormatFacetGroup(), LicenseFacetGroup(), PublisherFacetGroup(), IdFacetGroup(), SearchFacetGroup()] +facet_groups = [KeywordFacetGroup(), FormatFacetGroup(), LicenseFacetGroup(), PublisherFacetGroup(), IdFacetGroup(), SearchFacetGroup(), SupporterFacetGroup()] def get_facet(facet_name): for facet_group in facet_groups: diff --git a/frontend/templates/facets/supporter.html b/frontend/templates/facets/supporter.html new file mode 100644 index 00000000..c9f355b2 --- /dev/null +++ b/frontend/templates/facets/supporter.html @@ -0,0 +1,5 @@ +
        +

        + These books were faved by {{ facet.username }} +

        +
        \ No newline at end of file From 2f95c195c6ff24fac0e2c7d2868488ab56af1715 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 8 Nov 2017 17:45:22 -0500 Subject: [PATCH 006/109] add documentation --- api/templates/api_help.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/api/templates/api_help.html b/api/templates/api_help.html index 02e4ba62..97fd8239 100644 --- a/api/templates/api_help.html +++ b/api/templates/api_help.html @@ -76,6 +76,20 @@ XML: OPDS feeds. You don't need a key to use them. The starting point is {{base_url}}{% url 'opds' %}

        +

        + Examples: +

        +
        filtered by format
        +
        {{base_url}}{% url 'opds_acqusition' 'epub' %}
        +
        filtered by license
        +
        {{base_url}}{% url 'opds_acqusition' 'by-sa' %}
        +
        filtered by title search
        +
        {{base_url}}{% url 'opds_acqusition' 's.open' %}
        +
        filtered by keyword
        +
        {{base_url}}{% url 'opds_acqusition' 'kw.fiction' %}
        +
        filtered by ungluer
        +
        {{base_url}}{% url 'opds_acqusition' '@eric' %}
        +

        There's also an OPDS record available for every work on unglue.it. For example, requesting, {{base_url}}{% url 'opds_acqusition' 'all'%}?work=13950 get you to the web page or opds record for A Christmas Carol.

        ONIX Catalog Feeds

        From ce003c56076e1834e7d4ceb947b59d05638b675d Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 13 Nov 2017 15:30:00 -0500 Subject: [PATCH 007/109] revise rh signup workflow --- ...106_2218.py => 0011_auto_20171110_1253.py} | 2 +- core/models/__init__.py | 68 +---- core/models/rh_models.py | 113 ++++++++ core/signals.py | 3 +- frontend/forms/__init__.py | 20 +- frontend/forms/rh_forms.py | 45 ++- frontend/templates/_template_map.txt | 12 +- frontend/templates/accepted_agreement.html | 3 + frontend/templates/add_your_books.html | 20 ++ .../rights_holder_accepted/full.txt | 14 + .../rights_holder_accepted/notice.html | 4 + .../rights_holder_accepted/short.txt | 1 + .../notification/rights_holder_claim/full.txt | 6 +- .../rights_holder_claim/notice.html | 4 +- .../rights_holder_created/full.txt | 19 +- .../rights_holder_created/notice.html | 2 +- .../rights_holder_created/short.txt | 2 +- frontend/templates/programs.html | 7 + frontend/templates/rh_agree.html | 79 +---- frontend/templates/rh_campaigns.html | 58 ++++ frontend/templates/rh_intro.html | 65 +++++ frontend/templates/rh_tools.html | 272 +----------------- frontend/templates/rh_works.html | 102 +++++++ frontend/templates/rh_yours.html | 22 ++ .../templates/rights_holder_agreement.html | 107 +++++++ frontend/templates/rights_holders.html | 69 ++--- frontend/templates/work.html | 2 +- frontend/urls.py | 5 +- frontend/views/__init__.py | 133 +-------- frontend/views/bibedit.py | 4 +- frontend/views/rh_views.py | 133 +++++++++ 31 files changed, 784 insertions(+), 612 deletions(-) rename core/migrations/{0011_auto_20171106_2218.py => 0011_auto_20171110_1253.py} (96%) create mode 100644 core/models/rh_models.py create mode 100644 frontend/templates/accepted_agreement.html create mode 100644 frontend/templates/add_your_books.html create mode 100644 frontend/templates/notification/rights_holder_accepted/full.txt create mode 100644 frontend/templates/notification/rights_holder_accepted/notice.html create mode 100644 frontend/templates/notification/rights_holder_accepted/short.txt create mode 100644 frontend/templates/rh_campaigns.html create mode 100644 frontend/templates/rh_intro.html create mode 100644 frontend/templates/rh_works.html create mode 100644 frontend/templates/rh_yours.html create mode 100644 frontend/templates/rights_holder_agreement.html create mode 100644 frontend/views/rh_views.py diff --git a/core/migrations/0011_auto_20171106_2218.py b/core/migrations/0011_auto_20171110_1253.py similarity index 96% rename from core/migrations/0011_auto_20171106_2218.py rename to core/migrations/0011_auto_20171110_1253.py index 8214b680..80748bd3 100644 --- a/core/migrations/0011_auto_20171106_2218.py +++ b/core/migrations/0011_auto_20171110_1253.py @@ -39,7 +39,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='rightsholder', name='signer_ip', - field=models.CharField(max_length=20, null=True), + field=models.CharField(max_length=40, null=True), ), migrations.AddField( model_name='rightsholder', diff --git a/core/models/__init__.py b/core/models/__init__.py index 974e9fb5..67bf0b67 100755 --- a/core/models/__init__.py +++ b/core/models/__init__.py @@ -93,6 +93,7 @@ from .bibmodels import ( WorkRelation, ) +from .rh_models import Claim, RightsHolder pm = PostMonkey(settings.MAILCHIMP_API_KEY) logger = logging.getLogger(__name__) @@ -148,73 +149,6 @@ class CeleryTask(models.Model): f = getattr(regluit.core.tasks, self.function_name) return f.AsyncResult(self.task_id).info -class Claim(models.Model): - STATUSES = ((u'active', u'Claim has been accepted.'), - (u'pending', u'Claim is pending acceptance.'), - (u'release', u'Claim has not been accepted.'), - ) - created = models.DateTimeField(auto_now_add=True) - rights_holder = models.ForeignKey("RightsHolder", related_name="claim", null=False) - work = models.ForeignKey("Work", related_name="claim", null=False) - user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="claim", null=False) - status = models.CharField(max_length=7, choices=STATUSES, default='active') - - @property - def can_open_new(self): - # whether a campaign can be opened for this claim - - #must be an active claim - if self.status != 'active': - return False - #can't already be a campaign - for campaign in self.campaigns: - if campaign.status in ['ACTIVE', 'INITIALIZED']: - return 0 # cannot open a new campaign - if campaign.status in ['SUCCESSFUL']: - return 2 # can open a THANKS campaign - return 1 # can open any type of campaign - - def __unicode__(self): - return self.work.title - - @property - def campaign(self): - return self.work.last_campaign() - - @property - def campaigns(self): - return self.work.campaigns.all() - -def notify_claim(sender, created, instance, **kwargs): - if 'example.org' in instance.user.email or hasattr(instance, 'dont_notify'): - return - try: - (rights, new_rights) = User.objects.get_or_create(email='rights@gluejar.com', defaults={'username':'RightsatUnglueit'}) - except: - rights = None - if instance.user == instance.rights_holder.owner: - ul = (instance.user, rights) - else: - ul = (instance.user, instance.rights_holder.owner, rights) - notification.send(ul, "rights_holder_claim", {'claim': instance,}) -post_save.connect(notify_claim, sender=Claim) - -class RightsHolder(models.Model): - created = models.DateTimeField(auto_now_add=True) - email = models.CharField(max_length=100, blank=False, default='') - rights_holder_name = models.CharField(max_length=100, blank=False) - owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="rights_holder", null=False) - approved = models.BooleanField(default=False) - address = models.CharField(max_length=400, blank=False, default='') - mailing = models.CharField(max_length=400, blank=False, default='') - telephone = models.CharField(max_length=30, blank=True) - signer = models.CharField(max_length=100, blank=False, default='') - signer_ip = models.CharField(max_length=20, null=True) - signer_title = models.CharField(max_length=30, blank=False, default='') - signature = models.CharField(max_length=100, blank=False, default='' ) - - def __unicode__(self): - return self.rights_holder_name class Premium(models.Model): PREMIUM_TYPES = ((u'00', u'Default'), (u'CU', u'Custom'), (u'XX', u'Inactive')) diff --git a/core/models/rh_models.py b/core/models/rh_models.py new file mode 100644 index 00000000..792e729b --- /dev/null +++ b/core/models/rh_models.py @@ -0,0 +1,113 @@ +from notification import models as notification + +from django.conf import settings +from django.contrib.auth.models import User +from django.db import models +from django.db.models.signals import post_save +from django.template.loader import render_to_string +from django.utils.html import strip_tags + +class Claim(models.Model): + STATUSES = ((u'active', u'Claim has been accepted.'), + (u'pending', u'Claim is pending acceptance.'), + (u'release', u'Claim has not been accepted.'), + ) + created = models.DateTimeField(auto_now_add=True) + rights_holder = models.ForeignKey("RightsHolder", related_name="claim", null=False) + work = models.ForeignKey("Work", related_name="claim", null=False) + user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="claim", null=False) + status = models.CharField(max_length=7, choices=STATUSES, default='active') + + @property + def can_open_new(self): + # whether a campaign can be opened for this claim + + #must be an active claim + if self.status != 'active': + return False + #can't already be a campaign + for campaign in self.campaigns: + if campaign.status in ['ACTIVE', 'INITIALIZED']: + return 0 # cannot open a new campaign + if campaign.status in ['SUCCESSFUL']: + return 2 # can open a THANKS campaign + return 1 # can open any type of campaign + + def __unicode__(self): + return self.work.title + + @property + def campaign(self): + return self.work.last_campaign() + + @property + def campaigns(self): + return self.work.campaigns.all() + +def notify_claim(sender, created, instance, **kwargs): + if 'example.org' in instance.user.email or hasattr(instance, 'dont_notify'): + return + try: + (rights, new_rights) = User.objects.get_or_create( + email='rights@ebookfoundation.org', + defaults={'username':'RightsatFEF'} + ) + except: + rights = None + if instance.user == instance.rights_holder.owner: + user_list = (instance.user, rights) + else: + user_list = (instance.user, instance.rights_holder.owner, rights) + notification.send(user_list, "rights_holder_claim", {'claim': instance,}) + +post_save.connect(notify_claim, sender=Claim) + +class RightsHolder(models.Model): + created = models.DateTimeField(auto_now_add=True) + email = models.CharField(max_length=100, blank=False, default='') + rights_holder_name = models.CharField(max_length=100, blank=False) + owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="rights_holder", null=False) + approved = models.BooleanField(default=False) + address = models.CharField(max_length=400, blank=False, default='') + mailing = models.CharField(max_length=400, blank=False, default='') + telephone = models.CharField(max_length=30, blank=True) + signer = models.CharField(max_length=100, blank=False, default='') + signer_ip = models.CharField(max_length=40, null=True) + signer_title = models.CharField(max_length=30, blank=False, default='') + signature = models.CharField(max_length=100, blank=False, default='' ) + + def __unicode__(self): + return self.rights_holder_name + +def notify_rh(sender, created, instance, **kwargs): + # don't notify for tests or existing rights holders + if 'example.org' in instance.email or instance.id < 47: + return + try: + (rights, new_rights) = User.objects.get_or_create( + email='rights@ebookfoundation.org', + defaults={'username':'RightsatFEF'} + ) + except: + rights = None + user_list = (instance.owner, rights) + if created: + notification.send(user_list, "rights_holder_created", {'rights_holder': instance,}) + elif instance.approved: + agreement = strip_tags( + render_to_string( + 'accepted_agreement.html', + {'rights_holder': instance,} + ) + ) + signature = '' + notification.send( + user_list, + "rights_holder_accepted", + {'rights_holder': instance, 'agreement':agreement, 'signature':signature, } + ) + for claim in instance.claim.filter(status='pending'): + claim.status = 'active' + claim.save() + +post_save.connect(notify_rh, sender=RightsHolder) diff --git a/core/signals.py b/core/signals.py index 7134c1ba..49f23e51 100644 --- a/core/signals.py +++ b/core/signals.py @@ -81,7 +81,8 @@ def create_notice_types( **kwargs): notification.create_notice_type("pledge_status_change", _("Your Pledge Has Been Modified"), _("Your ungluing pledge has been modified.")) notification.create_notice_type("pledge_charged", _("Your Pledge has been Executed"), _("You have contributed to a successful ungluing campaign.")) notification.create_notice_type("pledge_failed", _("Unable to charge your credit card"), _("A charge to your credit card did not go through.")) - notification.create_notice_type("rights_holder_created", _("Agreement Accepted"), _("You have become a verified Unglue.it rights holder.")) + notification.create_notice_type("rights_holder_created", _("Agreement Accepted"), _("You have applied to become an Unglue.it rights holder.")) + notification.create_notice_type("rights_holder_accepted", _("Agreement Accepted"), _("You have become a verified Unglue.it rights holder.")) notification.create_notice_type("rights_holder_claim", _("Claim Entered"), _("A claim has been entered.")) notification.create_notice_type("wishlist_unsuccessful_amazon", _("Campaign shut down"), _("An ungluing campaign that you supported had to be shut down due to an Amazon Payments policy change.")) notification.create_notice_type("pledge_gift_credit", _("Gift Credit Balance"), _("You have a gift credit balance")) diff --git a/frontend/forms/__init__.py b/frontend/forms/__init__.py index e9af19af..d7de809d 100644 --- a/frontend/forms/__init__.py +++ b/frontend/forms/__init__.py @@ -64,7 +64,7 @@ from regluit.utils.fields import ISBNField from .bibforms import EditionForm, IdentifierForm -from .rh_forms import RightsHolderForm +from .rh_forms import RightsHolderForm, UserClaimForm from questionnaire.models import Questionnaire @@ -176,24 +176,6 @@ class EbookForm(forms.ModelForm): self.cleaned_data['url'] = '' return self.cleaned_data -def UserClaimForm ( user_instance, *args, **kwargs ): - class ClaimForm(forms.ModelForm): - i_agree = forms.BooleanField(error_messages={'required': 'You must agree to the Terms in order to claim a work.'}) - rights_holder = forms.ModelChoiceField(queryset=user_instance.rights_holder.all(), empty_label=None) - - class Meta: - model = Claim - exclude = ('status',) - widgets = { - 'user': forms.HiddenInput, - 'work': forms.HiddenInput, - } - - def __init__(self): - super(ClaimForm, self).__init__(*args, **kwargs) - - return ClaimForm() - class ProfileForm(forms.ModelForm): clear_facebook = forms.BooleanField(required=False) clear_twitter = forms.BooleanField(required=False) diff --git a/frontend/forms/rh_forms.py b/frontend/forms/rh_forms.py index aaa6ff22..698e7eb8 100644 --- a/frontend/forms/rh_forms.py +++ b/frontend/forms/rh_forms.py @@ -1,6 +1,6 @@ from django import forms -from regluit.core.models import RightsHolder +from regluit.core.models import RightsHolder, Claim class RightsHolderForm(forms.ModelForm): email = forms.EmailField( @@ -10,7 +10,7 @@ class RightsHolderForm(forms.ModelForm): 'required': 'Please enter a contact email address for the rights holder.' }, ) - use4both = forms.BooleanField(label='use business address as mailing address') + use4both = forms.BooleanField(label='use business address as mailing address', required=False) def clean_rights_holder_name(self): rights_holder_name = self.data["rights_holder_name"] try: @@ -55,11 +55,36 @@ class RightsHolderForm(forms.ModelForm): }, } -'''class RightsHolderApprovalForm(RightsHolderForm): - owner = AutoCompleteSelectField( - OwnerLookup, - label='Owner', - widget=AutoCompleteSelectWidget(OwnerLookup), - required=True, - ) -''' +class UserClaimForm (forms.ModelForm): + i_agree = forms.BooleanField( + error_messages={'required': 'You must agree to the Terms in order to claim a work.'} + ) + + def __init__(self, user_instance, *args, **kwargs): + super(UserClaimForm, self).__init__(*args, **kwargs) + self.fields['rights_holder'] = forms.ModelChoiceField( + queryset=user_instance.rights_holder.filter(approved=False), + empty_label=None, + ) + + def clean_work(self): + work = self.cleaned_data.get('work', None) + if not work: + try: + workids = self.data['claim-work'] + if workids: + work = models.WasWork.objects.get(was = workids[0]).work + else: + raise forms.ValidationError('That work does not exist.') + except models.WasWork.DoesNotExist: + raise forms.ValidationError('That work does not exist.') + return work + + class Meta: + model = Claim + exclude = ('status',) + widgets = { + 'user': forms.HiddenInput, + 'work': forms.HiddenInput, + } + diff --git a/frontend/templates/_template_map.txt b/frontend/templates/_template_map.txt index d1894adc..fe1abdb9 100644 --- a/frontend/templates/_template_map.txt +++ b/frontend/templates/_template_map.txt @@ -36,6 +36,7 @@ base.html extra_css(empty) extra_js(empty) extra_head(empty) about.html about_smashwords.html admins_only.html + agreed.html api_help.html ask_rh.html campaign_admin.html extra_extra_head @@ -69,7 +70,13 @@ base.html extra_css(empty) extra_js(empty) extra_head(empty) press_new.html press_submitterator.html privacy.html + programs.html + rh_agree.html rh_tools.html extra_extra_head + rh_campaigns.html + rh_intro.html + rh_works.html + rh_yours.html rights_holders.html extra_extra_head surveys.html terms.html extra_css @@ -131,7 +138,9 @@ base.html extra_css(empty) extra_js(empty) extra_head(empty) recommended.html COMPONENT TEMPLATES -about_lightbox_footer.html +about_lightbox_footer.html +accepted_agreement.html +add_your_books.html book_plain.html book_panel_addbutton.html cardform.html @@ -158,6 +167,7 @@ registration/login_form.html registration/password_reset_email.html registration/registration_closed.html registration/test_template_name.html +rights_holder_agreement.html sidebar_pledge_complete.html slideshow.html split.html diff --git a/frontend/templates/accepted_agreement.html b/frontend/templates/accepted_agreement.html new file mode 100644 index 00000000..41fadbd0 --- /dev/null +++ b/frontend/templates/accepted_agreement.html @@ -0,0 +1,3 @@ +{% with form=rights_holder rights_holder_name=rights_holder.rights_holder_name signer_title=rights_holder.signer_title owner=rights_holder.owner.username created=rights_holder.created fef_sig='ERIC HELLMAN' %} + {% include 'rights_holder_agreement.html' %} +{% endwith %} diff --git a/frontend/templates/add_your_books.html b/frontend/templates/add_your_books.html new file mode 100644 index 00000000..b285e3d5 --- /dev/null +++ b/frontend/templates/add_your_books.html @@ -0,0 +1,20 @@ +

        Claiming a work

        +

        If your book is indexed in Google books, we can add it to our database automagically. Click on the result list to add your book to our database.

        + +
        + + +
        + +
          +
        • Use the Claim option on the More... tab of each book's page.
        • +
        • Agree to our Terms on the following page. This includes agreeing that you are making the claim in good faith.
        • +
        • If you have any questions or you claim a work by mistake, email us.
        • +
        +

        Entering a work

        +

        If your book is not in Google books, you'll need to enter the metadata yourself.

        +
          +
        • Use this form to enter the metadata.
        • +
        • Your metadata should have title, authors, language, description.
        • +
        • If you have a lot of books to enter, contact us to load ONIX or CSV files for you.
        • +
        \ No newline at end of file diff --git a/frontend/templates/notification/rights_holder_accepted/full.txt b/frontend/templates/notification/rights_holder_accepted/full.txt new file mode 100644 index 00000000..9f3f679e --- /dev/null +++ b/frontend/templates/notification/rights_holder_accepted/full.txt @@ -0,0 +1,14 @@ +The Rights Holder Agreement, reproduced in plain text below, for {{ rights_holder.rights_holder_name }} has been accepted and is now an official Unglue.it rights holder. + +Here's what to do next: Find on Unglue.it. On the More... tab of the book page, you'll now see an option to claim the book. Once you've claimed the book, you can edit its metadata. + +If you can't find your books Unglue.it, that's okay. You can add your books to Unglue.it directly - use this link: https://unglue.it{% url 'rightsholders' %}#add_your_books + +Need help with any of this? Email us at rights@ebookfoundation.org and we'll do our best to help. + +The Unglue.it team + +################## +{{ agreement }} +################## +{{ signature }} \ No newline at end of file diff --git a/frontend/templates/notification/rights_holder_accepted/notice.html b/frontend/templates/notification/rights_holder_accepted/notice.html new file mode 100644 index 00000000..0a4a534b --- /dev/null +++ b/frontend/templates/notification/rights_holder_accepted/notice.html @@ -0,0 +1,4 @@ +{% extends "notification/notice_template.html" %} +{% block comments_textual %} + You are now an approved rights holder on Unglue.it. For your next step, find your works in our database and claim them or add them directly. +{% endblock %} \ No newline at end of file diff --git a/frontend/templates/notification/rights_holder_accepted/short.txt b/frontend/templates/notification/rights_holder_accepted/short.txt new file mode 100644 index 00000000..b38a1274 --- /dev/null +++ b/frontend/templates/notification/rights_holder_accepted/short.txt @@ -0,0 +1 @@ +You're now an accepted rights holder on Unglue.it. \ No newline at end of file diff --git a/frontend/templates/notification/rights_holder_claim/full.txt b/frontend/templates/notification/rights_holder_claim/full.txt index 507b12bd..dbaf4435 100644 --- a/frontend/templates/notification/rights_holder_claim/full.txt +++ b/frontend/templates/notification/rights_holder_claim/full.txt @@ -3,7 +3,7 @@ You are now free to start a campaign to sell or unglue your work. If you're logged in, you will see the option to open a campaign at https://{{ current_site.domain }}/rightsholders . (You can also find this page by clicking on "Rights Holder Tools" at the bottom of any Unglue.it page.) -To run a campaign, you'll need to set up campaign parameters. You'll also need to write a pitch. For Pledge-to-Unglue and Buy-to-Unglue campaigns, this will appear in the Description tab on your book's page (https://{{ current_site.domain }}{% url 'work' claim.work_id %}). Think about who your book's audience is, and remind them why they'll love this book -- your pitch is not a catalog page! We encourage video, audio, and links to make your pitch come alive. For Thanks-for-Ungluing, your pitch will occur when the user clicks a Download button. You should emphasize how the ungluer's support enables you to keep doing what you do. Feel free to email us (rights@gluejar.com) if you need any help with this. +To run a campaign, you'll need to set up campaign parameters. You'll also need to write a pitch. For Pledge-to-Unglue and Buy-to-Unglue campaigns, this will appear in the Description tab on your book's page (https://{{ current_site.domain }}{% url 'work' claim.work_id %}). Think about who your book's audience is, and remind them why they'll love this book -- your pitch is not a catalog page! We encourage video, audio, and links to make your pitch come alive. For Thanks-for-Ungluing, your pitch will occur when the user clicks a Download button. You should emphasize how the ungluer's support enables you to keep doing what you do. Feel free to email us (rights@ebookfoundation.org) if you need any help with this. If you're running a Buy-to-Unglue or Thanks-for-Ungluing Campaign, now is the time to upload your digital files. For Buy-to-Unglue, you need to decide on revenue targets and pricing for individual and library licenses. @@ -14,10 +14,10 @@ Finally, think about how you're going to publicize your campaign: social media, We're thrilled to be working with you. {% endifequal %} {% ifequal claim.status 'pending' %} -{{ claim.rights_holder }}'s claim to {{ claim.work.title }} (https://{{ current_site.domain }}{% url 'work' claim.work_id %}) on Unglue.it has been entered. Our team will examine the claim and get back to you soon. +{{ claim.rights_holder }}'s claim to {{ claim.work.title }} (https://{{ current_site.domain }}{% url 'work' claim.work_id %}) on Unglue.it has been entered. {% endifequal %} {% ifequal claim.status 'release' %} -{{ claim.rights_holder }}'s claim to {{ claim.work.title }} (https://{{ current_site.domain }}{% url 'work' claim.work_id %}) on Unglue.it has been released. email us (rights@gluejar.com) if you have any questions about this. +{{ claim.rights_holder }}'s claim to {{ claim.work.title }} (https://{{ current_site.domain }}{% url 'work' claim.work_id %}) on Unglue.it has been released. email us (rights@ebookfoundation.org) if you have any questions about this. {% endifequal %} The Unglue.it team \ No newline at end of file diff --git a/frontend/templates/notification/rights_holder_claim/notice.html b/frontend/templates/notification/rights_holder_claim/notice.html index 340844ee..611fd89b 100644 --- a/frontend/templates/notification/rights_holder_claim/notice.html +++ b/frontend/templates/notification/rights_holder_claim/notice.html @@ -17,7 +17,7 @@

        You are now free to start a campaign to sell or unglue your work. If you're logged in, you can open a campaign. (You can also find this page by clicking on "Rights Holder Tools" at the bottom of any Unglue.it page.)

        -To run a campaign, you'll need to set up campaign parameters. You'll also need to write a pitch. For Pledge-to-Unglue and Buy-to-Unglue campaigns, this will appear in the Description tab on your book's work page. Think about who your book's audience is, and remind them why they'll love this book -- your pitch is not a catalog page! We encourage video, audio, and links to make your pitch come alive. For Thanks-for-Ungluing, your pitch will occur when the user clicks a Download button. You should emphasize how the ungluer's support enables you to keep doing what you do. Feel free to email us (rights@gluejar.com) if you need any help with this. +To run a campaign, you'll need to set up campaign parameters. You'll also need to write a pitch. For Pledge-to-Unglue and Buy-to-Unglue campaigns, this will appear in the Description tab on your book's work page. Think about who your book's audience is, and remind them why they'll love this book -- your pitch is not a catalog page! We encourage video, audio, and links to make your pitch come alive. For Thanks-for-Ungluing, your pitch will occur when the user clicks a Download button. You should emphasize how the ungluer's support enables you to keep doing what you do. Feel free to email us (rights@ebookfoundation.org) if you need any help with this.

        If you're running a Buy-to-Unglue or Thanks-for-Ungluing Campaign, now is the time to upload your digital files. For Buy-to-Unglue, you need to decide on revenue targets and pricing for individual and library licenses.

        @@ -31,6 +31,6 @@ We're thrilled to be working with you. The claim for {{ claim.work.title }} will be examined, and we'll email you. Contact us if you need any help. {% endifequal %} {% ifequal claim.status 'release' %} - The claim for {{ claim.work.title }} has been released. Contact us at rights@gluejar.com if you have questions. + The claim for {{ claim.work.title }} has been released. Contact us at rights@ebookfoundation.org if you have questions. {% endifequal %} {% endblock %} diff --git a/frontend/templates/notification/rights_holder_created/full.txt b/frontend/templates/notification/rights_holder_created/full.txt index 50db688e..9c2516b0 100644 --- a/frontend/templates/notification/rights_holder_created/full.txt +++ b/frontend/templates/notification/rights_holder_created/full.txt @@ -1,11 +1,20 @@ -Your Platform Services Agreement has been accepted and you're now an official Unglue.it rights holder. +Your Rights Holder Agreement for {{ rights_holder.rights_holder_name }} has been received and Unglue.it staff is reviewing it. -Here's what to do next. Find your book(s) on Unglue.it. On the More... tab of the book page, you'll now see an option to claim the book. Do this. We'll follow up. Once we've approved your claim, you'll be able to run campaigns for the book. +Here's the information we received - we'll use this to verify that you really exist and can be relied upon to fulfill your obligations. Once we've reviewed and approved the agreement, you'll receive by email a digitally signed copy for your reference. -If your book isn't listed in Google Books (which powers our search), you won't be able to find it at Unglue.it. That's okay. You can submit your books for inclusion in Google's search results: https://books.google.com/googlebooks/publishers.html . We can also create a custom page for you; just notify us. +Rights Holder: {{ rights_holder.rights_holder_name }} +Unglue.it Username for Rights Holder: {{ rights_holder.owner.username }} +Business Address: +{{ rights_holder.address }} +Mailing Address: +{{ rights_holder.mailing }} +Tel: {{ rights_holder.telephone }} +Email: {{ rights_holder.email }} +Signer Name: {{ rights_holder.signer }} +Signer Title: {{ rights_holder.signer_title }} +Signature: {{ rights_holder.signature }} -You can also start thinking ahead about what you'd like your campaigns to look like and how you'd like to publicize them. Some good things to brainstorm: your campaign pitch; any photos or video you can include; compelling premiums you might be able to offer; what you want your target to be and how long you think your campaign should last; and how to share your campaign with your social networks (online and off) and media contacts. -Need help with any of this? We'd be delighted. Email us at rights@gluejar.com. We're thrilled to be working with you. +Need help with any of this? Email us at rights@ebookfoundation.org. The Unglue.it team \ No newline at end of file diff --git a/frontend/templates/notification/rights_holder_created/notice.html b/frontend/templates/notification/rights_holder_created/notice.html index 82ac0d44..ec3f99eb 100644 --- a/frontend/templates/notification/rights_holder_created/notice.html +++ b/frontend/templates/notification/rights_holder_created/notice.html @@ -1,4 +1,4 @@ {% extends "notification/notice_template.html" %} {% block comments_textual %} - You are now an approved rights holder on Unglue.it. For your next step, find your works in our database and claim them (under the More... tab). See your email for more details. + The Unglue.it rights holder agreement for {{ rights_holder.rights_holder_name }} has been received. Unglue.it staff will use the information you've supplied to verify that you really exist and can be relied upon to fulfill your obligations. Once we've reviewed and approved the agreement, you'll receive by email a digitally signed copy for your reference. {% endblock %} \ No newline at end of file diff --git a/frontend/templates/notification/rights_holder_created/short.txt b/frontend/templates/notification/rights_holder_created/short.txt index f570a67c..9a06815b 100644 --- a/frontend/templates/notification/rights_holder_created/short.txt +++ b/frontend/templates/notification/rights_holder_created/short.txt @@ -1 +1 @@ -You're now a confirmed rights holder on Unglue.it. \ No newline at end of file +Your Unglue.it rights holder agreement has been received. \ No newline at end of file diff --git a/frontend/templates/programs.html b/frontend/templates/programs.html index 92c5cfc9..5d01aba0 100644 --- a/frontend/templates/programs.html +++ b/frontend/templates/programs.html @@ -1,3 +1,9 @@ +{% extends 'basedocumentation.html' %} + +{% block title %} Programs {% endblock %} + + +{% block doccontent %}

        Unglue Program Terms

        Pledge-to-Unglue Program

        1. Description. Under the Pledge-to-Unglue program, the Rights Holder conducts a pledge campaign to raise a designated level of donated funds to facilitate the immediate Ungluing of an Uploaded Uploaded Work. The Ungluing Date shall be scheduled no later than 90 days after the Campaign Goal has been met.

        @@ -28,3 +34,4 @@

        (a) Distribution Fee in the amount of eight percent (8%) of the gross revenues received by the Distributor from payments made as “Thank You” donations.

        (b) Transaction Fee in the amount of twenty-five cents ($0.25) per transaction.

        The Distribution Fee and Transaction Fee shall be deducted from the donations collected by the Distributor, and paid to the Distributor prior to the remission of revenues to the Rights Holder. The Distribution Fee is inclusive of third party payment processing fees up to a cap of 3% of the gross amount plus 33 cents ($0.33) per transaction.

        +{% endblock %} \ No newline at end of file diff --git a/frontend/templates/rh_agree.html b/frontend/templates/rh_agree.html index ce0eb4a0..14566679 100644 --- a/frontend/templates/rh_agree.html +++ b/frontend/templates/rh_agree.html @@ -35,77 +35,16 @@ onload = function(){ {% endblock %} {% block doccontent %} +{% with rights_holder_name='[Rights Holder]' signer_title='[Signer Title]' signer_note='(Type your name to enter your electronic signature.)' %} {% if request.user.is_authenticated %} -
        -
        -
        {% csrf_token %} {{ form.owner }} -

        UNGLUE.IT RIGHTS HOLDER AGREEMENT

        -{{ form.rights_holder_name.errors }} -

        Rights Holder: {{ form.rights_holder_name }}

        -

        Unglue.it Username for Rights Holder: {{ request.user.username }}

        -{{ form.address.errors }} -

        Business Address:
        {{ form.address }}

        -{{ form.mailing.errors }} -

        Mailing Address: copy from Business Address {{ form.use4both }}
        {{ form.mailing }}

        -{{ form.telephone.errors }}{{ form.email.errors }} -

        Tel: {{ form.telephone }} Email: {{ form.email }}

        -{{ form.signer.errors }} -

        Signer Name: {{ form.signer }}

        -{{ form.signer_title.errors }} -

        Signer Title: {{ form.signer_title }}

        -

        FREE EBOOK FOUNDATION, INC., a New Jersey Not-for-profit corporation (Distributor), and the above described Rights Holder, agree as follows:

        -

        1. Parties. The Distributor is the owner and operator of Unglue.it, a platform for the digital distribution of written materials via the unglue.it website and any other URLs designated by the Distributor for such purpose. The Rights Holder is the copyright owner or authorized publisher or licensed distributor of certain published written materials which the Rights Holder wants to distribute on Unglue.it.

        -

        2. Purpose. This Agreement sets forth the rights and obligations of the parties and applies to all written materials uploaded by the Rights Holder onto the Unglue.it platform using the Unglue.it web interface (individually, a Uploaded Work and collectively, Uploaded Works). The parties intend to collaborate in the release and distribution of the Uploaded Works under a Creative Commons License or such other "free" license as shall then pertain to release of creative works (CC License). For works not yet released under such a license, the date that the Rights Holder agrees, as determined by terms of the applicable Programs, to release a Uploaded Work under a CC License pursuant to this Agreement shall be referred to as the Ungluing Date.

        -

        3. Term and Termination. The term of this Agreement shall begin on the Effective Date. Either party may terminate this Agreement at any time upon thirty (30) days’ notice to the other party. All licenses issued to third parties during the Term are irrevocable (except in the case of a breach by the third party licensee) and shall survive termination. In particular, the Rights Holder must release of the Uploaded Works pursuant to a CC License on or before the determined Ungluing Date, even if the Ungluing Date occurs after the termination of this Agreement.

        -

        4. Programs. The Distributor has one or more models for the distribution and release of Uploaded Works on Unglue.it, as specified in the Program Terms. Under each Program, the Rights Holder agrees to release and distribute the Uploaded Work in a digital format under a CC License (Unglue the Uploaded Work) pursuant to the applicable Program Terms.

        -

        5. Grant of Rights. The Rights Holder hereby authorizes the Distributor as follows:

        -

        (a) to display and market Uploaded Works on the Platform, and to copy and transmit Uploaded Works as may be required in order to fulfill its obligations to Ungluers and other licensees pursuant to the terms of use set forth on the Unglue.it website or any applicable licensing agreement or CC License as applicable;

        -

        (b) to use the Rights Holder’s name or trademark in association with Uploaded Works or for promotional or editorial purposes in connection with the Programs;

        -

        (c) to collect revenues on behalf of the Rights Holder from supporters, purchasers and licensees of Uploaded Works (Ungluers) using a third party payment processor selected in the sole discretion of the Distributor;

        -

        (d) to retain, reserve and distribute payments to the Rights Holder and to the Distributor or otherwise pursuant to the terms of this Agreement, or to any agreement that the Distributor may have with a third party payment processor (including, but not limited to, a reasonable reserve against chargebacks or returns for a period of up to six months);

        -

        (e) to convey licenses for the Uploaded Works to individuals pursuant to the terms set forth in the Terms of Use set forth on the Unglue.it website (as amended from time to time in the sole discretion of the Distributor);

        -

        (f) to convey licenses for the Uploaded Works to libraries and similar non-profit institutions based on the terms set forth in the then current version of the Unglue.it Library License Agreement, a copy of which shall be provided to the Rights Holder upon request; and

        -

        (g) to insert the corresponding license notices into the Uploaded Works that reflect the then current Ungluing Date and other applicable license terms.

        -

        6. Service Fees. As full compensation for the services provided by the Distributor in connection with the Programs, the Rights Holder shall pay to the Distributor, and hereby authorizes the Distributor to withhold from revenues collected by the Distributor on behalf of the Rights Holder the fees set forth in the applicable Program Terms.

        -

        7. Payments to Rights Holder.

        -

        (a) In no event shall payment be made until the Rights Holder has delivered to the Distributor a digital file for the applicable Uploaded Work that complies with the delivery specifications set forth on the then-current Unglue.it website terms of use.

        -

        (b) The Distributor shall pay the Rights Holder the proceeds due and owing pursuant to the applicable Program Terms no less than quarterly (or more frequently at the discretion of the Distributor) in arrears, payable on the fifteenth day of the month following the close of each calendar quarter, such payment to cover the previous calendar quarter. For example, payments due in connection with transactions that occur January 1 through March 31 will be paid to the Rights Holder on April 15 of the same year. Each payment shall be accompanied by a statement detailing sales and licensing data, revenues received, return data, reserve and Distribution Fees withheld. Notwithstanding the above, quarterly payments may be deferred until the following pay period in the event that the amount payable to the Rights Holder for any given pay period is less than $100.

        -

        8. Rights Holder Warrantees and Representations. The Rights Holder warrants and represents as follows:

        -

        (a) The Rights Holder is the sole owner of the copyright in the each Uploaded Work, or has the full power and authority to enter into this Agreement on behalf of the copyright owners of each Uploaded Work.

        -

        (b) The signer of this Agreement has full authority to enter into this Agreement on behalf of this Rights Holder and to bind the Rights Holder by their signature.

        -

        (c) The Rights Holder has all rights necessary to grant the rights granted to the Distributor pursuant to this Agreement, including but not limited to the right to display, market, copy, distribute and transmit the Uploaded Works on the Unglue.it website, the right to license the Uploaded Works to third party individuals, libraries and institutions as contemplated under this Agreement, and to release digital copies of the Uploaded Works under a Creative Commons license upon the successful completion of a campaign.

        -

        (d) Neither the Rights Holder nor the copyright owner has entered any agreements with any third party that impact the ability of the Rights Holder to enter into this Agreement or to comply with its obligations hereunder, including but not limited to the obligation to release the Uploaded Work under a CC License on the Ungluing Date.

        -

        (e) The Rights Holder assumes sole responsibility for the payment of any royalties or other fees that may be due to third parties in connection with revenues collected by the Distributor in connection with the Uploaded Work.

        -

        (f) Each Uploaded Work is original to the copyright owner or the credited author and does not infringe on any statutory or common law copyright or any proprietary right of any third party.

        -

        (g) Each Uploaded Work does not invade the privacy of any third party, or contain matter libelous or otherwise in contravention of the rights of any third person.

        -

        (h) Each Uploaded Work contains no matter the publication or distribution of which would otherwise violate any federal or state statute or regulation, nor is the Uploaded Work in any manner unlawful, and nothing in the Uploaded Work shall be injurious to the health of a reader of the Uploaded Work.

        -

        (i) There is no threatened or pending litigation or third party claim that relates to any Uploaded Work.

        -

        (j) The Rights Holder shall comply with the terms set forth in the then current Terms of Use set forth on the Unglue.it website pertaining to the content that may be posted on the Unglue.it site in connection with any campaign.

        -

        (k) The Rights Holder shall timely pay any sales taxes, withholding or other taxes relating to revenues processed by the Distributor on behalf of the Rights Holder.

        -

        (l) The Rights Holder agrees that any data obtained from Unglue.it or the distributor must always be handled in accordance with the Unglue.it Terms of Service and Privacy Notice.

        -

        9. Reliance of the Distributor on the Rights Holder Representations and Warrantees. Each of the representations and warrantees of the Rights Holder set forth in this Agreement is true as of the date of this Agreement and shall remain true during the Term. The Distributor may rely on the truth of such representations and warrantees in dealing with any third party including but not limited to Ungluers and licensees. The Distributor is under no obligation to make an independent investigation to determine whether the above representations are true and accurate. Upon the Distributor’s request, the Rights Holder shall provide the Distributor with copies of any and all prior publishing agreements and rights agreements, assignments, releases and consents relating to any Uploaded Work submitted to the Distributor in connection with a Program. The Distributor may, in its sole discretion, decline to accept any Uploaded Work as part of any Program, for any reason or for no reason.

        -

        10. Indemnification. The Rights Holder shall indemnify and hold harmless the Distributor, its officers, directors, employees, agents, licensees and assigns (Indemnified Parties) from any losses, liabilities, damages, costs and expenses (including reasonable attorneys’ fees) that may arise out of any claim by the Distributor or any third party relating to the alleged breach of any of the Rights Holder’s warrantees and representation as set forth in this Agreement.

        -

        11. Limitation of Liability. Under no circumstances, including, without limitation, negligence, shall the Distributor or its directors, affiliates, officers, employees, or agents be responsible for any indirect, incidental, special, or consequential damages arising from or in connection with the use of or the inability to use the Program or the web interface, or any content contained on the Unglue.it website, including, without limitation, damages for loss of profits, use, data, or other intangibles.

        -

        12. No Joint Venture. This Agreement shall not be deemed to have created an agency relationship, partnership or joint venture between the parties.

        -

        13. Entire Understanding. This Agreement, together with the Terms of Service contained on the Distributor’s website as updated by the Distributor from time to time without notice to the Rights Holder, and any applicable CC licenses, constitute the entire agreement between the parties and supersedes any previous agreements and understandings had between the parties with respect to the Uploaded Works.

        -

        14. Governing Law; Venue. This Agreement is governed by and shall be interpreted and construed according to the laws of the United States with respect to copyright law and the laws of New York with regard to all other matters. At the Distributor’s option, any claim arising out of or related to this Agreement shall be settled by arbitration administered by a neutral arbitrator selected by the parties. If the Distributor elects to use the court system as its preferred mode of dispute resolution, then the dispute shall be subject to the exclusive jurisdiction of New York State. Prior to the commencement of any arbitration or litigation proceeding, the Distributor may elect to require that the parties’ participate in good faith effort to resolve the dispute through mediation. The venue for all dispute resolution proceedings shall be the city and state of New York.

        -

        15. Execution. This Agreement may be executed by exchange of emails. Electronic signatures, faxed or scanned signatures shall be as binding as an original signature.

        -

        AGREED AND ACCEPTED:

        -

        For FREE EBOOK FOUNDATION, INC. , Distributor

        -

        Eric Hellman, President

        -
        -{{ form.rh_name.errors }} -

        For [Rights Holder], Rights Holder

        -{{ form.signature.errors }} -

        Signature: {{ form.signature }}, [Title]

        -

        (Type your name to enter your electronic signature.)

        - - - -
        - -
        + {% with owner=request.user.username%} + {% include 'rights_holder_agreement.html' %} + {% endwith %} {% else %} Please log in or create an account to use the rights holder agreement. + {% with owner='[unglue.it username]'%} + {% include 'rights_holder_agreement.html' %} + {% endwith %} {% endif %} -{% endblock %} \ No newline at end of file +{% endwith %} +{% endblock %} diff --git a/frontend/templates/rh_campaigns.html b/frontend/templates/rh_campaigns.html new file mode 100644 index 00000000..c0a57ca8 --- /dev/null +++ b/frontend/templates/rh_campaigns.html @@ -0,0 +1,58 @@ +{% extends 'rh_tools.html' %} +{% block toolcontent %} + +{% if campaigns %} +

        Campaigns You Manage

        +
        + {% for campaign in campaigns %} +
        {{campaign.name }}
        +
        +
        +
        + {% ifequal campaign.type 1 %} + Pledge Campaign
        + Campaign status: {{ campaign.status }}
        + Created: {{ campaign.created }}
        + ${{ campaign.current_total }} pledged of ${{ campaign.target }}, {{ campaign.supporters_count }} supporters + {% endifequal %} + {% ifequal campaign.type 2 %} + Buy-to-Unglue Campaign
        + Campaign status: {{ campaign.status }}
        + Created: {{ campaign.created }}
        + ${{ campaign.current_total }} sold. ${{ campaign.target }} to go. Ungluing Date: {{ campaign.cc_date }}
        + {% with campaign.work.preferred_edition as edition %} + Edit the preferred edition
        + You can also Load a file for this edition.
        + {% endwith %} + {% endifequal %} + {% ifequal campaign.type 3 %} + Thanks-for-Ungluing Campaign
        + Campaign status: {{ campaign.status }}
        + Created: {{ campaign.created }}
        + ${{ campaign.current_total }} raised from {{ campaign.supporters_count }} ungluers, {{ campaign.anon_count }} others. + {% with campaign.work.preferred_edition as edition %} + Edit the preferred edition
        + You can also Load a file for this edition.
        + {% endwith %} + {% endifequal %} +
        + {% if campaign.status = 'ACTIVE' or campaign.status = 'INITIALIZED' %} + + {% endif %} + {% if campaign.clone_form %} +
        +
        + {% csrf_token %} + {{ campaign.clone_form }}{{ campaign.clone_form.errors }} + +
        +
        + {% endif %} +
        +
        + {% endfor %} +
        +{% endif %} +{% endblock %} diff --git a/frontend/templates/rh_intro.html b/frontend/templates/rh_intro.html new file mode 100644 index 00000000..d009141d --- /dev/null +++ b/frontend/templates/rh_intro.html @@ -0,0 +1,65 @@ +{% extends 'rh_tools.html' %} +{% block toolcontent %} +

        Getting Started

        +

        +If you're an author, publisher, or other rights holder, you can participate more fully in Unglue.it by registering as a rights holder. Participating rights holders can: +

          +
        • Add books to the unglue.it database.
        • +
        • Set metadata and descriptions for their books.
        • +
        • Create campaigns for their books.
        • +
        +

        + +

        Becoming an Unglue.it Rights Holder

        + +
          + {% if not request.user.is_authenticated %} +
        1. Set up an Unglue.it account. (Click here or use the Sign Up button at the top of the page).
        2. + {% else %} +
        3. You've already set up an Unglue.it account.
        4. + {% endif %} + {% if not request.user.rights_holder.count %}
        5. {% else %}
        6. {% endif %}Sign a Unglue.it Rights Holder Agreement. If you have any questions, ask us.
        7. + {% if claims %} +
        8. You have claimed {{ claims.count }} work(s). You can claim more. + {% else %} +
        9. Claim your work(s) or send us metadata for books you have rights to. + {% endif %} + {% include 'add_your_books.html' %} +
        10. + {% if campaigns %} +
        11. You've set up {{ campaigns.count }} campaign(s). Manage them here.
        12. + {% else %} +
        13. {% if claims %}Set up a campaign for for your book.{% else %} Set up a campaign. All the campaigns you can manage will be listed on this page, above.{% endif %}
        14. + {% endif %} +
        +

        About Campaigns

        +

        If you have already released your work under a Creative Commons license, you need to use a "Thanks for Ungluing" campaign. If you have an EPUB file ready to sell, you should use a "Buy to Unglue" campaign. Otherwise, you'll want to offer rewards in a "Pledge-to-Unglue" campaign.

        + + +

        Thanks-for-Ungluing Campaigns

        +

        Thanks-for-Ungluing is a program designed to help rights holders promote and monetize their Creative Commons licensed books. Rights holders participating in the Thanks-for-Ungluing program can request payment for their books on a pay-what-you-want basis. They can also set suggested prices as well as metadata and descriptions for books that they claim.

        + +

        Buy-to-Unglue Campaigns

        +

        Buy-to-Unglue is a program that sells ebook licenses to reach the campaign goal. To enable ebook sales, you'll need to upload an epub file for each book. +There are no “rewards” for a “Buy to Unglue” campaign, but you may offer time-limited, special price promotions for the ebook.

        + +

        +A Buy-to-Unglue Campaign provides long-term promotion and sales opportunities for your ebook before it becomes an Unglued Ebook. Until the revenue goal is reached, supporters and libraries know that every book that gets purchased through Unglue.it brings the ungluing date closer to the present. +

        +

        Pledge-to-Unglue Campaigns

        +

        For Pledge campaigns, you can run campaigns for books that haven't been converted to digital. +Any print book can be scanned to create a digital file that can then become an ePub-format unglued ebook to be released after the Pledge Campaign succeeds.

        +

        Rewards

        +

        Campaigns run for a short period (2-6 months) and can have rewards as a way to motivate and thank supporters for helping to reach your goal. You are strongly encouraged to add rewards - they are given special prominence on the campaign page.

        + +

        What should you add as rewards? Anything (legal) that you think you can reasonably deliver that will get supporters excited about the book. For example: other books, whether electronic or physical; artwork or multimedia relating to the book, its author, or its themes; in-person or online chats with the author; memorabilia.

        + +

        Acknowledgements for Pledge Campaigns

        +

        Here are the standard acknowledgements. These automatically combine with your rewards. For example, if you offer a $30 reward, ungluers who pledge $30 will receive the $25 acknowledgement as well.

        +
          +
        • Any amount — The unglued ebook
        • +
        • $25 and above — Their name in the acknowledgements section under "supporters"
        • +
        • $50 and above — Their name & profile link under "benefactors"
        • +
        • $100 and above — Their name, profile link, & a dedication under "bibliophiles"
        • +
        +{% endblock %} diff --git a/frontend/templates/rh_tools.html b/frontend/templates/rh_tools.html index 6e25dc60..8189602e 100644 --- a/frontend/templates/rh_tools.html +++ b/frontend/templates/rh_tools.html @@ -18,272 +18,26 @@

        Unglue.it for Rightsholders

        -Any questions not covered here? Please email us at rights@gluejar.com. +Any questions not covered here? Please email us at rights@ebookfoundation.org.

        Contents

        -

        Getting Started

        -

        -If you're an author, publisher, or other rights holder, you can participate more fully in Unglue.it by registering as a rights holder. Participating rights holders can: + +{% if request.user.rights_holder.count %} +

        Other tools

        -

        - -{% if campaigns %} -

        Campaigns You Manage

        -
        - {% for campaign in campaigns %} -
        {{campaign.name }}
        -
        -
        -
        - {% ifequal campaign.type 1 %} - Pledge Campaign
        - Campaign status: {{ campaign.status }}
        - Created: {{ campaign.created }}
        - ${{ campaign.current_total }} pledged of ${{ campaign.target }}, {{ campaign.supporters_count }} supporters - {% endifequal %} - {% ifequal campaign.type 2 %} - Buy-to-Unglue Campaign
        - Campaign status: {{ campaign.status }}
        - Created: {{ campaign.created }}
        - ${{ campaign.current_total }} sold. ${{ campaign.target }} to go. Ungluing Date: {{ campaign.cc_date }}
        - {% with campaign.work.preferred_edition as edition %} - Edit the preferred edition
        - You can also Load a file for this edition.
        - {% endwith %} - {% endifequal %} - {% ifequal campaign.type 3 %} - Thanks-for-Ungluing Campaign
        - Campaign status: {{ campaign.status }}
        - Created: {{ campaign.created }}
        - ${{ campaign.current_total }} raised from {{ campaign.supporters_count }} ungluers, {{ campaign.anon_count }} others. - {% with campaign.work.preferred_edition as edition %} - Edit the preferred edition
        - You can also Load a file for this edition.
        - {% endwith %} - {% endifequal %} -
        - {% if campaign.status = 'ACTIVE' or campaign.status = 'INITIALIZED' %} - - {% endif %} - {% if campaign.clone_form %} -
        -
        - {% csrf_token %} - {{ campaign.clone_form }}{{ campaign.clone_form.errors }} - -
        -
        - {% endif %} -
        -
        - {% endfor %} -
        {% endif %} -{% if request.user.rights_holder.count %} -

        Works You Have Claimed

        -
        - {% for claim in claims %} -
        Title: {{claim.work.title }}   (work #{{ claim.work_id }})
        -
        Author: {{claim.work.authors_short }} -
        On Behalf of: {{ claim.rights_holder.rights_holder_name }} -
        PSA #: {{ claim.rights_holder.id }} -
        Date of Claim : {{ claim.created }} -
        Status of Claim: {{ claim.get_status_display }} - {% if claim.campaign_form %} -

        Initialize a campaign for this work

        -
        -
        - {% csrf_token %} - {{ claim.campaign_form.name }}{{ claim.campaign_form.name.errors }} - {% ifequal claim.can_open_new 1 %} -

        Choose the Campaign Type: {{ claim.campaign_form.type }}{{ claim.campaign_form.type.errors }}

        -
          -
        1. Pledge-To-Unglue: These campaigns have a fixed end date. When your pledges reach the target you set, the campaign succeeds and the ebook is released in an open-access unglued edition.
        2. -
        3. Buy-To-Unglue: These campaigns start with a date on which the ebook will become open access. Each sale advances this "ungluing date" an increment based on you funding target.
        4. -
        5. Thanks-For-Ungluing: These campaigns are for books that already have a Creative Commons license.
        6. -
        - {% else %} - Your previous campaign succeeded, but you can open a new Thanks-For-Ungluing campaign. - {{ claim.campaign_form.type.errors }} - {% endifequal %} -

        Add another Campaign Manager(s) by their Unglue.it username:

        -
        {{ claim.campaign_form.managers }}{{ claim.campaign_form.managers.errors }} -
        - -
        -

        - {{ claim.campaign_form.work }}{{ claim.campaign_form.work.errors }} - {{ claim.campaign_form.userid }}{{ claim.campaign_form.userid.errors }} -

        -
        -
        - {% else %}{%if claim.campaign %} -

        Campaign for this work

        - - {% with claim.campaign as campaign %} -
        - {% if campaign.status = 'ACTIVE' or campaign.status = 'INITIALIZED' %} -
        - Your {{ campaign.get_type_display }}, "{{ campaign.name }}", is {{ campaign.status }}
        - Created: {{ campaign.created }}
        - Manager(s): {% for user in campaign.managers.all %} {{ user.username }} {% endfor %} -
        {% csrf_token %} -
        - Add/Remove Managers: - {{ campaign.edit_managers_form.managers }}{{ campaign.edit_managers_form.managers.errors }} - -
        -
        -
        - {% if request.user in campaign.managers.all %} - - {% endif %} - {% else %} -
        - Name: Your campaign, "{{ campaign.name }}", is {{ campaign.status }}
        - Created: {{ campaign.created }}
        - Manager(s): {% for user in campaign.managers.all %} {{ user.username }} {% endfor %} -
        - {% ifequal campaign.type 1 %} - ${{ campaign.current_total }} pledged of ${{ campaign.target }}, {{ campaign.supporters_count }} supporters - {% else %} - ${{ campaign.current_total }} sold. ${{ campaign.target }} to go, Ungluing Date: {{ campaign.cc_date }} - {% endifequal %} -
        Transaction Details -
        - {% endif %} -
        - {% endwith %} - {% endif %} - {% endif %} - {% if claim.work.first_ebook %} -

        Ebooks for this work

        -

        {{ claim.work.download_count }} total downloads

        -
        -
          - {% for ebook in claim.work.ebooks_all %} -
        • edition #{{ebook.edition_id}} {{ ebook.format }} {% if not ebook.active %}(inactive){% endif %} - {{ ebook.download_count }} downloads -
        • - {% endfor %} -
        -
        - {% endif %} -
        - {% endfor %} -
        -{% endif %} -{% if request.user.rights_holder.count %} -

        Rights Holders That You Administer

        - -
        - {% for rights_holder in request.user.rights_holder.all %} -
        Name: {{ rights_holder.rights_holder_name }}   (rights holder #{{ rights_holder.id }})
        -
        PSA #: {{ rights_holder.id }} -
        contact email: {{ rights_holder.email }}
        - {% endfor %} -
        -{% else %} -

        Your Books/Campaigns

        - -If you were a registered rights holder with Unglue.it, you'd be able to see and manage your books and campaigns here. -{% endif %} -

        Becoming an Unglue.it Rights Holder

        - -
          - {% if not request.user.is_authenticated %} -
        1. Set up an Unglue.it account. (Click here or use the Sign Up button at the top of the page).
        2. - {% else %} -
        3. You've already set up an Unglue.it account.
        4. - {% endif %} - {% if not request.user.rights_holder.count %}
        5. {% else %}
        6. {% endif %}Sign a Unglue.it Rights Holder Agreement. If you have any questions, ask us.
        7. - {% if claims %} -
        8. You have claimed {{ claims.count }} work(s). You can claim more. - {% else %} -
        9. Claim your work(s) or send us metadata for books you have rights to. - {% endif %} -

          Claiming a work

          -

          If your book is indexed in Google books, we can add it to our database automagically. Click on the result list to add your book to our database.

          -
          -
          - - -
          -
          -
            -
          • Use the Claim option on the More... tab of each book's page.
          • -
          • Agree to our Terms on the following page. This includes agreeing that you are making the claim in good faith and can substantiate that you have legal control over worldwide electronic rights to the work.
          • -
          • If you have any questions or you claim a work by mistake, email us.
          • -
          • We will review your claim. We may contact you at {{ request.user.email }} if we have any questions. If this is the wrong email address, please change the email address for your account.
          • -
          -

          Entering a work

          -

          If your book is not in Google books, you'll need to enter the metadata yourself.

          -
            -
          • Use this form to enter the metadata.
          • -
          • Your ebooks must have ISBNs or OCLC numbers assigned.
          • -
          • Your metadata should have title, authors, language, description.
          • -
          • If you have a lot of books to enter, contact us to load ONIX or CSV files for you.
          • -
        10. - {% if campaigns %} -
        11. You've set up {{ campaigns.count }} campaign(s). Manage them above.
        12. - {% else %} -
        13. {% if claims %}Set up a campaign for for your book.{% else %} Set up a campaign. All the campaigns you can manage will be listed on this page, above.{% endif %}
        14. - {% endif %} -
        -

        About Campaigns

        -

        If you have already released your work under a Creative Commons license, you need to use a "Thanks for Ungluing" campaign. If you have an EPUB file ready to sell, you should use a "Buy to Unglue" campaign. Otherwise, you'll want to offer rewards in a "Pledge-to-Unglue" campaign.

        - - -

        Thanks-for-Ungluing Campaigns

        -

        Thanks-for-Ungluing is a program designed to help rights holders promote and monetize their Creative Commons licensed books. Rights holders participating in the Thanks-for-Ungluing program can request payment for their books on a pay-what-you-want basis. They can also set suggested prices as well as metadata and descriptions for books that they claim.

        - -

        Buy-to-Unglue Campaigns

        -

        Buy-to-Unglue is a program that sells ebook licenses to reach the campaign goal. To enable ebook sales, you'll need to upload an epub file for each book. -There are no “rewards” for a “Buy to Unglue” campaign, but you may offer time-limited, special price promotions for the ebook.

        - -

        -A Buy-to-Unglue Campaign provides long-term promotion and sales opportunities for your ebook before it becomes an Unglued Ebook. Until the revenue goal is reached, supporters and libraries know that every book that gets purchased through Unglue.it brings the ungluing date closer to the present. -

        -

        Pledge-to-Unglue Campaigns

        -

        For Pledge campaigns, you can run campaigns for books that haven't been converted to digital. -Any print book can be scanned to create a digital file that can then become an ePub-format unglued ebook to be released after the Pledge Campaign succeeds.

        -

        Rewards

        -

        Campaigns run for a short period (2-6 months) and can have rewards as a way to motivate and thank supporters for helping to reach your goal. You are strongly encouraged to add rewards - they are given special prominence on the campaign page.

        - -

        What should you add as rewards? Anything (legal) that you think you can reasonably deliver that will get supporters excited about the book. For example: other books, whether electronic or physical; artwork or multimedia relating to the book, its author, or its themes; in-person or online chats with the author; memorabilia.

        - -

        Acknowledgements for Pledge Campaigns

        -

        Here are the standard acknowledgements. These automatically combine with your rewards. For example, if you offer a $30 reward, ungluers who pledge $30 will receive the $25 acknowledgement as well.

        -
          -
        • Any amount — The unglued ebook
        • -
        • $25 and above — Their name in the acknowledgements section under "supporters"
        • -
        • $50 and above — Their name & profile link under "benefactors"
        • -
        • $100 and above — Their name, profile link, & a dedication under "bibliophiles"
        • -
        - +{% block toolcontent %}{% endblock %}

        More Questions

        Check the FAQ to the left, or send us feedback. {% endblock %} \ No newline at end of file diff --git a/frontend/templates/rh_works.html b/frontend/templates/rh_works.html new file mode 100644 index 00000000..3376454a --- /dev/null +++ b/frontend/templates/rh_works.html @@ -0,0 +1,102 @@ +{% extends 'rh_tools.html' %} +{% block toolcontent %} + +{% if request.user.rights_holder.count %} +

        Works You Have Claimed

        +
        + {% for claim in claims %} +
        Title: {{claim.work.title }}   (work #{{ claim.work_id }})
        +
        Author: {{claim.work.authors_short }} +
        On Behalf of: {{ claim.rights_holder.rights_holder_name }} +
        Agreement #: {{ claim.rights_holder.id }} +
        Date of Claim : {{ claim.created }} +
        Status of Claim: {{ claim.get_status_display }} + {% if claim.campaign_form %} +

        Initialize a campaign for this work

        +
        +
        + {% csrf_token %} + {{ claim.campaign_form.name }}{{ claim.campaign_form.name.errors }} + {% ifequal claim.can_open_new 1 %} +

        Choose the Campaign Type: {{ claim.campaign_form.type }}{{ claim.campaign_form.type.errors }}

        +
          +
        1. Pledge-To-Unglue: These campaigns have a fixed end date. When your pledges reach the target you set, the campaign succeeds and the ebook is released in an open-access unglued edition.
        2. +
        3. Buy-To-Unglue: These campaigns start with a date on which the ebook will become open access. Each sale advances this "ungluing date" an increment based on you funding target.
        4. +
        5. Thanks-For-Ungluing: These campaigns are for books that already have a Creative Commons license.
        6. +
        + {% else %} + Your previous campaign succeeded, but you can open a new Thanks-For-Ungluing campaign. + {{ claim.campaign_form.type.errors }} + {% endifequal %} +

        Add another Campaign Manager(s) by their Unglue.it username:

        +
        {{ claim.campaign_form.managers }}{{ claim.campaign_form.managers.errors }} +
        + +
        +

        + {{ claim.campaign_form.work }}{{ claim.campaign_form.work.errors }} + {{ claim.campaign_form.userid }}{{ claim.campaign_form.userid.errors }} +

        +
        +
        + {% else %}{%if claim.campaign %} +

        Campaign for this work

        + + {% with claim.campaign as campaign %} +
        + {% if campaign.status = 'ACTIVE' or campaign.status = 'INITIALIZED' %} +
        + Your {{ campaign.get_type_display }}, "{{ campaign.name }}", is {{ campaign.status }}
        + Created: {{ campaign.created }}
        + Manager(s): {% for user in campaign.managers.all %} {{ user.username }} {% endfor %} +
        {% csrf_token %} +
        + Add/Remove Managers: + {{ campaign.edit_managers_form.managers }}{{ campaign.edit_managers_form.managers.errors }} + +
        +
        +
        + {% if request.user in campaign.managers.all %} + + {% endif %} + {% else %} +
        + Name: Your campaign, "{{ campaign.name }}", is {{ campaign.status }}
        + Created: {{ campaign.created }}
        + Manager(s): {% for user in campaign.managers.all %} {{ user.username }} {% endfor %} +
        + {% ifequal campaign.type 1 %} + ${{ campaign.current_total }} pledged of ${{ campaign.target }}, {{ campaign.supporters_count }} supporters + {% else %} + ${{ campaign.current_total }} sold. ${{ campaign.target }} to go, Ungluing Date: {{ campaign.cc_date }} + {% endifequal %} +
        Transaction Details +
        + {% endif %} +
        + {% endwith %} + {% endif %} + {% endif %} + {% if claim.work.first_ebook %} +

        Ebooks for this work

        +

        {{ claim.work.download_count }} total downloads

        +
        +
          + {% for ebook in claim.work.ebooks_all %} +
        • edition #{{ebook.edition_id}} {{ ebook.format }} {% if not ebook.active %}(inactive){% endif %} + {{ ebook.download_count }} downloads +
        • + {% endfor %} +
        +
        + {% endif %} +
        + {% empty %} +
        You have not claimed any works.
        + {% endfor %} +
        +{% endif %} +{% endblock %} diff --git a/frontend/templates/rh_yours.html b/frontend/templates/rh_yours.html new file mode 100644 index 00000000..86e30937 --- /dev/null +++ b/frontend/templates/rh_yours.html @@ -0,0 +1,22 @@ +{% extends 'rh_tools.html' %} +{% block toolcontent %} +{% if request.user.rights_holder.count %} +

        Rights Holders That You Administer

        + +
        + {% for rights_holder in request.user.rights_holder.all %} +
        Name: {{ rights_holder.rights_holder_name }}   (rights holder #{{ rights_holder.id }} + {% if not rights_holder.approved %}pending approval{% endif %})
        +
        Agreement #: {{ rights_holder.id }} +
        contact email: {{ rights_holder.email }} +
        + {% empty %} +
        You haven't signed a Unglue.it Rights Holder Agreement.
        + {% endfor %} +
        +{% else %} +

        Your Books/Campaigns

        + +You haven't signed a Unglue.it Rights Holder Agreement. If you were a registered rights holder with Unglue.it, you'd see your agreement status here. +{% endif %} +{% endblock %} diff --git a/frontend/templates/rights_holder_agreement.html b/frontend/templates/rights_holder_agreement.html new file mode 100644 index 00000000..b0aeac0b --- /dev/null +++ b/frontend/templates/rights_holder_agreement.html @@ -0,0 +1,107 @@ +
        {% csrf_token %} +

        UNGLUE.IT RIGHTS HOLDER AGREEMENT

        +{{ form.rights_holder_name.errors }} +

        Date: {{ created }}

        + +

        Rights Holder: {{ form.rights_holder_name }}

        + +

        Unglue.it Username for Rights Holder: {{ form.owner }}{{ request.user.username }}

        +{{ form.address.errors }} +

        Business Address:
        {{ form.address }}

        +{{ form.mailing.errors }} +

        Mailing Address: {% if form.use4both %} copy from Business Address {{ form.use4both }}{% endif %}
        {{ form.mailing }}

        +{{ form.telephone.errors }}{{ form.email.errors }} +

        Tel: {{ form.telephone }} Email: {{ form.email }}

        +{{ form.signer.errors }} +

        Signer Name: {{ form.signer }}

        +{{ form.signer_title.errors }} +

        Signer Title: {{ form.signer_title }}

        + +

        FREE EBOOK FOUNDATION, INC., a New Jersey Not-for-profit corporation (Distributor), and the above described Rights Holder, agree as follows:

        + +

        1. Parties. The Distributor is the owner and operator of Unglue.it, a platform for the digital distribution of written materials via the unglue.it website and any other URLs designated by the Distributor for such purpose. The Rights Holder is the copyright owner or authorized publisher or licensed distributor of certain published written materials which the Rights Holder wants to distribute on Unglue.it.

        + +

        2. Purpose. This Agreement sets forth the rights and obligations of the parties and applies to all written materials uploaded by the Rights Holder onto the Unglue.it platform using the Unglue.it web interface (individually, a Uploaded Work and collectively, Uploaded Works). The parties intend to collaborate in the release and distribution of the Uploaded Works under a Creative Commons License or such other "free" license as shall then pertain to release of creative works (CC License). For works not yet released under such a license, the date that the Rights Holder agrees, as determined by terms of the applicable Programs, to release a Uploaded Work under a CC License pursuant to this Agreement shall be referred to as the Ungluing Date.

        + +

        3. Term and Termination. The term of this Agreement shall begin on the Effective Date. Either party may terminate this Agreement at any time upon thirty (30) days’ notice to the other party. All licenses issued to third parties during the Term are irrevocable (except in the case of a breach by the third party licensee) and shall survive termination. In particular, the Rights Holder must release of the Uploaded Works pursuant to a CC License on or before the determined Ungluing Date, even if the Ungluing Date occurs after the termination of this Agreement.

        + +

        4. Programs. The Distributor has one or more models for the distribution and release of Uploaded Works on Unglue.it, as specified in the Program Terms at https://unglue.it{% url 'programs' %}. Under each Program, the Rights Holder agrees to release and distribute the Uploaded Work in a digital format under a CC License (Unglue the Uploaded Work) pursuant to the applicable Program Terms.

        + +

        5. Grant of Rights. The Rights Holder hereby authorizes the Distributor as follows:

        + +

        (a) to display and market Uploaded Works on the Platform, and to copy and transmit Uploaded Works as may be required in order to fulfill its obligations to Ungluers and other licensees pursuant to the terms of use set forth on the Unglue.it website or any applicable licensing agreement or CC License as applicable;

        + +

        (b) to use the Rights Holder’s name or trademark in association with Uploaded Works or for promotional or editorial purposes in connection with the Programs;

        + +

        (c) to collect revenues on behalf of the Rights Holder from supporters, purchasers and licensees of Uploaded Works (Ungluers) using a third party payment processor selected in the sole discretion of the Distributor;

        + +

        (d) to retain, reserve and distribute payments to the Rights Holder and to the Distributor or otherwise pursuant to the terms of this Agreement, or to any agreement that the Distributor may have with a third party payment processor (including, but not limited to, a reasonable reserve against chargebacks or returns for a period of up to six months);

        + +

        (e) to convey licenses for the Uploaded Works to individuals pursuant to the terms set forth in the Terms of Use set forth on the Unglue.it website (as amended from time to time in the sole discretion of the Distributor);

        + +

        (f) to convey licenses for the Uploaded Works to libraries and similar non-profit institutions based on the terms set forth in the then current version of the Unglue.it Library License Agreement, a copy of which shall be provided to the Rights Holder upon request; and

        + +

        (g) to insert the corresponding license notices into the Uploaded Works that reflect the then current Ungluing Date and other applicable license terms.

        + +

        6. Service Fees. As full compensation for the services provided by the Distributor in connection with the Programs, the Rights Holder shall pay to the Distributor, and hereby authorizes the Distributor to withhold from revenues collected by the Distributor on behalf of the Rights Holder the fees set forth in the applicable Program Terms.

        + +

        7. Payments to Rights Holder.

        + +

        (a) In no event shall payment be made until the Rights Holder has delivered to the Distributor a digital file for the applicable Uploaded Work that complies with the delivery specifications set forth on the then-current Unglue.it website terms of use.

        + +

        (b) The Distributor shall pay the Rights Holder the proceeds due and owing pursuant to the applicable Program Terms no less than quarterly (or more frequently at the discretion of the Distributor) in arrears, payable on the fifteenth day of the month following the close of each calendar quarter, such payment to cover the previous calendar quarter. For example, payments due in connection with transactions that occur January 1 through March 31 will be paid to the Rights Holder on April 15 of the same year. Each payment shall be accompanied by a statement detailing sales and licensing data, revenues received, return data, reserve and Distribution Fees withheld. Notwithstanding the above, quarterly payments may be deferred until the following pay period in the event that the amount payable to the Rights Holder for any given pay period is less than $100.

        + +

        8. Rights Holder Warrantees and Representations. The Rights Holder warrants and represents as follows:

        + +

        (a) The Rights Holder is the sole owner of the copyright in the each Uploaded Work, or has the full power and authority to enter into this Agreement on behalf of the copyright owners of each Uploaded Work.

        + +

        (b) The signer of this Agreement has full authority to enter into this Agreement on behalf of this Rights Holder and to bind the Rights Holder by their signature.

        + +

        (c) The Rights Holder has all rights necessary to grant the rights granted to the Distributor pursuant to this Agreement, including but not limited to the right to display, market, copy, distribute and transmit the Uploaded Works on the Unglue.it website, the right to license the Uploaded Works to third party individuals, libraries and institutions as contemplated under this Agreement, and to release digital copies of the Uploaded Works under a Creative Commons license upon the successful completion of a campaign.

        + +

        (d) Neither the Rights Holder nor the copyright owner has entered any agreements with any third party that impact the ability of the Rights Holder to enter into this Agreement or to comply with its obligations hereunder, including but not limited to the obligation to release the Uploaded Work under a CC License on the Ungluing Date.

        + +

        (e) The Rights Holder assumes sole responsibility for the payment of any royalties or other fees that may be due to third parties in connection with revenues collected by the Distributor in connection with the Uploaded Work.

        + +

        (f) Each Uploaded Work is original to the copyright owner or the credited author and does not infringe on any statutory or common law copyright or any proprietary right of any third party.

        + +

        (g) Each Uploaded Work does not invade the privacy of any third party, or contain matter libelous or otherwise in contravention of the rights of any third person.

        + +

        (h) Each Uploaded Work contains no matter the publication or distribution of which would otherwise violate any federal or state statute or regulation, nor is the Uploaded Work in any manner unlawful, and nothing in the Uploaded Work shall be injurious to the health of a reader of the Uploaded Work.

        + +

        (i) There is no threatened or pending litigation or third party claim that relates to any Uploaded Work.

        + +

        (j) The Rights Holder shall comply with the terms set forth in the then current Terms of Use set forth on the Unglue.it website pertaining to the content that may be posted on the Unglue.it site in connection with any campaign.

        + +

        (k) The Rights Holder shall timely pay any sales taxes, withholding or other taxes relating to revenues processed by the Distributor on behalf of the Rights Holder.

        + +

        (l) The Rights Holder agrees that any data obtained from Unglue.it or the distributor must always be handled in accordance with the Unglue.it Terms of Service and Privacy Notice.

        + +

        9. Reliance of the Distributor on the Rights Holder Representations and Warrantees. Each of the representations and warrantees of the Rights Holder set forth in this Agreement is true as of the date of this Agreement and shall remain true during the Term. The Distributor may rely on the truth of such representations and warrantees in dealing with any third party including but not limited to Ungluers and licensees. The Distributor is under no obligation to make an independent investigation to determine whether the above representations are true and accurate. Upon the Distributor’s request, the Rights Holder shall provide the Distributor with copies of any and all prior publishing agreements and rights agreements, assignments, releases and consents relating to any Uploaded Work submitted to the Distributor in connection with a Program. The Distributor may, in its sole discretion, decline to accept any Uploaded Work as part of any Program, for any reason or for no reason.

        + +

        10. Indemnification. The Rights Holder shall indemnify and hold harmless the Distributor, its officers, directors, employees, agents, licensees and assigns (Indemnified Parties) from any losses, liabilities, damages, costs and expenses (including reasonable attorneys’ fees) that may arise out of any claim by the Distributor or any third party relating to the alleged breach of any of the Rights Holder’s warrantees and representation as set forth in this Agreement.

        + +

        11. Limitation of Liability. Under no circumstances, including, without limitation, negligence, shall the Distributor or its directors, affiliates, officers, employees, or agents be responsible for any indirect, incidental, special, or consequential damages arising from or in connection with the use of or the inability to use the Program or the web interface, or any content contained on the Unglue.it website, including, without limitation, damages for loss of profits, use, data, or other intangibles.

        + +

        12. No Joint Venture. This Agreement shall not be deemed to have created an agency relationship, partnership or joint venture between the parties.

        + +

        13. Entire Understanding. This Agreement, together with the Terms of Service contained on the Distributor’s website as updated by the Distributor from time to time without notice to the Rights Holder, and any applicable CC licenses, constitute the entire agreement between the parties and supersedes any previous agreements and understandings had between the parties with respect to the Uploaded Works.

        + +

        14. Governing Law; Venue. This Agreement is governed by and shall be interpreted and construed according to the laws of the United States with respect to copyright law and the laws of New York with regard to all other matters. At the Distributor’s option, any claim arising out of or related to this Agreement shall be settled by arbitration administered by a neutral arbitrator selected by the parties. If the Distributor elects to use the court system as its preferred mode of dispute resolution, then the dispute shall be subject to the exclusive jurisdiction of New York State. Prior to the commencement of any arbitration or litigation proceeding, the Distributor may elect to require that the parties’ participate in good faith effort to resolve the dispute through mediation. The venue for all dispute resolution proceedings shall be the city and state of New York.

        + +

        15. Execution. This Agreement may be executed by exchange of emails. Electronic signatures, faxed or scanned signatures shall be as binding as an original signature.

        + +

        AGREED AND ACCEPTED:

        +

        For FREE EBOOK FOUNDATION, INC. , Distributor

        +

        Eric Hellman, President

        +

        Signature:{{ fef_sig }}

        +{{ form.rh_name.errors }} +

        For {{ rights_holder_name }}, Rights Holder

        +{{ form.signature.errors }} +

        Signature: {{ form.signature }}, {{ signer_title }}

        +

        {{ signer_note }}

        + + + +
        +
        \ No newline at end of file diff --git a/frontend/templates/rights_holders.html b/frontend/templates/rights_holders.html index e47c1452..7875e123 100644 --- a/frontend/templates/rights_holders.html +++ b/frontend/templates/rights_holders.html @@ -18,69 +18,60 @@
      10. Subjects (set keywords)
      11. {% if facet = 'top' %}
      12. Accepted Rights Holders
      13. -
      14. Active Claims
      15. {% else %}
      16. Unglue.it Admin
      17. {% endif %}
-{% if facet = 'top' %} -

Rights Holder Admin

- -

Create New Rights Holder

-
- {% csrf_token %} - {{ form.as_p }} - -
-{% endif %} {% if facet = 'accepted' %}

Accepted Rights Holders

{% for rights_holder in rights_holders %}
{{ rights_holder.rights_holder_name }}
-
PSA #: {{ rights_holder.id }} +
Agreement #: {{ rights_holder.id }}
email: {{ rights_holder.email }}
owner: {{ rights_holder.owner }}
{% empty %}

No rights holders have been accepted yet

{% endfor %}
-{% endif %} +{% else %} +

Rights Holder Admin

-{% if pending and facet = 'top' %} -

Pending Claims

+{% if pending %} +

Pending Rights Holders

{{ pending_formset.management_form }} {% csrf_token %}
-{% for claim, claim_form in pending %} -
Title: {{claim.work.title }}
-
Author: {{claim.work.authors_short }}
-
By: {{ claim.user.username }}
-
On Behalf of: {{ claim.rights_holder.rights_holder_name }}
-
PSA #: {{ claim.rights_holder.id }}
-
Date of Claim : {{ claim.created }}
-
Status of Claim: {{ claim.status }}
-
Change to:
{{ claim_form.as_p }} - +{% for rights_holder, rh_form in pending %} +
Rights Holder: {{ rights_holder.rights_holder_name }} edit
+
Unglue.it Username for Rights Holder: {{ rights_holder.owner.username }}
+ Business Address:
+
{{ rights_holder.address }}

+ Mailing Address:
+
{{ rights_holder.mailing }}

+ Tel: {{ rights_holder.telephone }}
+ Email: {{ rights_holder.email }}
+ Signer Name: {{ rights_holder.signer }}
+ Signer Title: {{ rights_holder.signer_title }}
+ Signature: {{ rights_holder.signature }}
+ {% if rights_holder.claim.all.count %} + Claims: + + {% endif %} + {{ rh_form.as_p }} +
{% endfor %}
+
+{% else %} +No rightsholders pending. {% endif %} - -{% if active_data.count and facet = 'claims' %} -

Active Claims: {{ active_data.count }}

-
-{% for claim in active_data %} -
Title: {{claim.work.title }}
-
Author: {{claim.work.authors_short }}
-
By: {{ claim.user.username }}
-
On Behalf of: {{ claim.rights_holder.rights_holder_name }}
-
PSA #: {{ claim.rights_holder.id }}
-
Date of Claim : {{ claim.created }}
-
Status of Claim: {{ claim.status }}
-{% endfor %} -
{% endif %} {% endblock %} \ No newline at end of file diff --git a/frontend/templates/work.html b/frontend/templates/work.html index e029e2e3..b745e0c7 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -425,7 +425,7 @@ {% if request.user.rights_holder.all.count %} Is this work yours? Claim it:

-
+ {% csrf_token %} {{ claimform.user }} {{ claimform.work }} diff --git a/frontend/urls.py b/frontend/urls.py index 2c4236b6..a55dfc3e 100644 --- a/frontend/urls.py +++ b/frontend/urls.py @@ -23,7 +23,11 @@ urlpatterns = [ url(r"^privacy/$", TemplateView.as_view(template_name="privacy.html"), name="privacy"), url(r"^terms/$", TemplateView.as_view(template_name="terms.html"), name="terms"), url(r"^rightsholders/$", views.rh_tools, name="rightsholders"), + url(r"^rightsholders/yours/$", views.rh_tools, {'template_name': 'rh_yours.html'}, name="rh_yours"), + url(r"^rightsholders/campaigns/$", views.rh_tools, {'template_name': 'rh_campaigns.html'}, name="rh_campaigns"), + url(r"^rightsholders/works/$", views.rh_tools, {'template_name': 'rh_works.html'},name="rh_works"), url(r"^rightsholders/agree/$", views.RHAgree.as_view(), name="agree"), + url(r"^rightsholders/programs/$", TemplateView.as_view(template_name='programs.html'), name="programs"), url(r"^rightsholders/agree/submitted$", TemplateView.as_view(template_name='agreed.html'), name="agreed"), url(r"^rightsholders/campaign/(?P\d+)/$", views.manage_campaign, name="manage_campaign"), url(r"^rightsholders/campaign/(?P\d+)/results/$", views.manage_campaign, {'action': 'results'}, name="campaign_results"), @@ -38,7 +42,6 @@ urlpatterns = [ url(r"^rightsholders/surveys/summary_(?P\d+)_(?P\d*).csv$", views.surveys_summary, name="survey_summary"), url(r"^rh_admin/$", views.rh_admin, name="rh_admin"), url(r"^rh_admin/accepted/$", views.rh_admin, {'facet': 'accepted'}, name="accepted"), - url(r"^rh_admin/claims/$", views.rh_admin, {'facet': 'claims'}, name="claims"), url(r"^campaign_admin/$", views.campaign_admin, name="campaign_admin"), url(r"^faq/$", views.FAQView.as_view(), {'location':'faq', 'sublocation':'all'}, name="faq"), url(r"^faq/(?P\w*)/$", views.FAQView.as_view(), {'sublocation':'all'}, name="faq_location"), diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 15ae03cb..566aa1d7 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -33,7 +33,7 @@ from django.core.urlresolvers import reverse, reverse_lazy from django.core.validators import validate_email from django.db.models import Q, Count, Sum from django.forms import Select -from django.forms.models import modelformset_factory, inlineformset_factory +from django.forms.models import inlineformset_factory from django.http import ( HttpResponseRedirect, Http404, @@ -47,7 +47,7 @@ from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _ from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST -from django.views.generic.edit import FormView, CreateView +from django.views.generic.edit import FormView from django.views.generic.list import ListView from django.views.generic.base import ( TemplateView, @@ -81,7 +81,6 @@ from regluit.frontend.forms import ( RightsHolderForm, UserClaimForm, LibraryThingForm, - OpenCampaignForm, getManageCampaignForm, CampaignAdminForm, EmailShareForm, @@ -137,6 +136,7 @@ from questionnaire.models import Landing, Questionnaire from questionnaire.views import export_summary as answer_summary, export_csv as export_answers from .bibedit import edit_edition, user_can_edit_work, safe_get_work, get_edition +from .rh_views import RHAgree, rh_admin, claim, rh_tools logger = logging.getLogger(__name__) @@ -1632,30 +1632,6 @@ class PledgeCancelView(FormView): logger.error("Exception from attempt to cancel pledge for campaign id {0} for username {1}: {2}".format(campaign_id, user.username, e)) return HttpResponse("Sorry, something went wrong in canceling your campaign pledge. We have logged this error.") -def claim(request): - if request.method == 'GET': - data = request.GET - else: - data = request.POST - form = UserClaimForm(request.user, data=data, prefix='claim') - if form.is_valid(): - # make sure we're not creating a duplicate claim - if not models.Claim.objects.filter(work=form.cleaned_data['work'], rights_holder=form.cleaned_data['rights_holder']).exclude(status='release').count(): - form.save() - return HttpResponseRedirect(reverse('rightsholders')) - else: - try: - work = models.Work.objects.get(id=data['claim-work']) - except models.Work.DoesNotExist: - try: - work = models.WasWork.objects.get(was = data['claim-work']).work - except models.WasWork.DoesNotExist: - raise Http404 - rights_holder = models.RightsHolder.objects.get(id=data['claim-rights_holder']) - active_claims = work.claim.exclude(status = 'release') - context = {'form': form, 'work': work, 'rights_holder':rights_holder , 'active_claims':active_claims} - return render(request, "claim.html", context) - def works_user_can_admin(user): return models.Work.objects.filter( Q(claim__user = user) | Q(claim__rights_holder__owner = user) @@ -1751,109 +1727,6 @@ def surveys(request): surveys = Questionnaire.objects.filter(landings__object_id__in=work_ids).distinct() return render(request, "surveys.html", {"works":works, "surveys":surveys}) -def rh_tools(request): - if not request.user.is_authenticated() : - return render(request, "rh_tools.html") - claims = request.user.claim.filter(user=request.user) - campaign_form = "xxx" - if not claims: - return render(request, "rh_tools.html") - for claim in claims: - if claim.can_open_new: - if request.method == 'POST' and request.POST.has_key('cl_%s-work' % claim.id) and int(request.POST['cl_%s-work' % claim.id]) == claim.work_id : - claim.campaign_form = OpenCampaignForm(data = request.POST, prefix = 'cl_'+str(claim.id),) - if claim.campaign_form.is_valid(): - new_campaign = claim.campaign_form.save(commit=False) - if new_campaign.type == BUY2UNGLUE: - new_campaign.target = D(settings.UNGLUEIT_MAXIMUM_TARGET) - new_campaign.set_cc_date_initial() - elif new_campaign.type == REWARDS: - new_campaign.deadline = date_today() + timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)) - new_campaign.target = D(settings.UNGLUEIT_MINIMUM_TARGET) - elif new_campaign.type == THANKS: - new_campaign.target = D(settings.UNGLUEIT_MINIMUM_TARGET) - new_campaign.save() - claim.campaign_form.save_m2m() - claim.campaign_form = None - else: - c_type = 2 - claim.campaign_form = OpenCampaignForm( - initial={'work': claim.work, 'name': claim.work.title, 'userid': request.user.id, 'managers': [request.user.id], 'type': c_type}, - prefix = 'cl_'+str(claim.id), - ) - if claim.campaign: - if claim.campaign.status in ['ACTIVE','INITIALIZED']: - if request.method == 'POST' and request.POST.has_key('edit_managers_%s'% claim.campaign.id) : - claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, data=request.POST, prefix=claim.campaign.id) - if claim.campaign.edit_managers_form.is_valid(): - claim.campaign.edit_managers_form.save() - claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, prefix=claim.campaign.id) - else: - claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, prefix=claim.campaign.id) - campaigns = request.user.campaigns.all() - new_campaign = None - for campaign in campaigns: - if campaign.clonable(): - if request.method == 'POST' and request.POST.has_key('c%s-campaign_id'% campaign.id): - clone_form = CloneCampaignForm(data=request.POST, prefix = 'c%s' % campaign.id) - if clone_form.is_valid(): - campaign.clone() - else: - campaign.clone_form = CloneCampaignForm(initial={'campaign_id':campaign.id}, prefix='c%s' % campaign.id) - return render(request, "rh_tools.html", {'claims': claims , 'campaigns': campaigns}) - -class RHAgree(CreateView): - template_name = "rh_agree.html" - form_class = RightsHolderForm - success_url = reverse_lazy('agreed') - - def get_initial(self): - return {'owner':self.request.user.id, 'signature':''} - - def form_valid(self, form): - form.instance.signer_ip = self.request.META['REMOTE_ADDR'] - return super(RHAgree, self).form_valid(form) - #self.form.instance.save() - #return response - -def rh_admin(request, facet='top'): - if not request.user.is_authenticated() : - return render(request, "admins_only.html") - if not request.user.is_staff : - return render(request, "admins_only.html") - PendingFormSet = modelformset_factory(models.Claim, fields=['status'], extra=0) - pending_data = models.Claim.objects.filter(status = 'pending') - active_data = models.Claim.objects.filter(status = 'active') - if request.method == 'POST': - if 'create_rights_holder' in request.POST.keys(): - form = RightsHolderApprovalForm(data=request.POST) - pending_formset = PendingFormSet (queryset=pending_data) - if form.is_valid(): - form.instance.approved = True - form.save() - form = RightsHolderForm() - if 'set_claim_status' in request.POST.keys(): - pending_formset = PendingFormSet (request.POST, request.FILES, queryset=pending_data) - form = RightsHolderForm() - if pending_formset.is_valid(): - pending_formset.save() - pending_formset = PendingFormSet(queryset=pending_data) - else: - form = RightsHolderForm() - pending_formset = PendingFormSet(queryset=pending_data) - rights_holders = models.RightsHolder.objects.all() - - context = { - 'request': request, - 'rights_holders': rights_holders, - 'form': form, - 'pending': zip(pending_data, pending_formset), - 'pending_formset': pending_formset, - 'active_data': active_data, - 'facet': facet, - } - return render(request, "rights_holders.html", context) - def campaign_admin(request): if not request.user.is_authenticated() : return render(request, "admins_only.html") diff --git a/frontend/views/bibedit.py b/frontend/views/bibedit.py index b2f504d4..3048e3e9 100644 --- a/frontend/views/bibedit.py +++ b/frontend/views/bibedit.py @@ -24,6 +24,8 @@ from regluit.core.parameters import WORK_IDENTIFIERS from regluit.core.loaders.utils import ids_from_urls from regluit.frontend.forms import EditionForm, IdentifierForm +from .rh_views import user_is_rh + def user_can_edit_work(user, work): ''' @@ -35,7 +37,7 @@ def user_can_edit_work(user, work): return True elif work and work.last_campaign(): return user in work.last_campaign().managers.all() - elif user.rights_holder.count() and (work == None or not work.last_campaign()): + elif user_is_rh(user) and (work == None or not work.last_campaign()): # allow rights holders to edit unless there is a campaign return True elif work and work.claim.all(): diff --git a/frontend/views/rh_views.py b/frontend/views/rh_views.py new file mode 100644 index 00000000..3abb022e --- /dev/null +++ b/frontend/views/rh_views.py @@ -0,0 +1,133 @@ +from django.core.urlresolvers import reverse,reverse_lazy +from django.forms.models import modelformset_factory +from django.http import HttpResponseRedirect, Http404 +from django.shortcuts import render +from django.views.generic.edit import CreateView + +from regluit.core import models +from regluit.frontend.forms import RightsHolderForm, UserClaimForm, OpenCampaignForm + +class RHAgree(CreateView): + template_name = "rh_agree.html" + form_class = RightsHolderForm + success_url = reverse_lazy('agreed') + + def get_initial(self): + return {'owner':self.request.user.id, 'signature':''} + + def form_valid(self, form): + form.instance.signer_ip = self.request.META['REMOTE_ADDR'] + return super(RHAgree, self).form_valid(form) + +def rh_admin(request, facet='top'): + if not request.user.is_authenticated() or not request.user.is_staff: + return render(request, "admins_only.html") + + PendingFormSet = modelformset_factory(models.RightsHolder, fields=['approved'], extra=0) + pending_data = models.RightsHolder.objects.filter(approved=False) + + if request.method == 'POST': + if 'approve_rights_holder' in request.POST.keys(): + pending_formset = PendingFormSet (request.POST, request.FILES, queryset=pending_data) + if pending_formset.is_valid(): + pending_formset.save() + pending_formset = PendingFormSet(queryset=pending_data) + else: + pending_formset = PendingFormSet(queryset=pending_data) + + rights_holders = models.RightsHolder.objects.filter(approved=True) + + context = { + 'rights_holders': rights_holders, + 'pending': zip(pending_data, pending_formset), + 'pending_formset': pending_formset, + 'facet': facet, + } + return render(request, "rights_holders.html", context) + +def user_is_rh(user): + if user.is_anonymous(): + return False + for rh in user.rights_holder.filter(approved=True): + return True + return False + +class ClaimView(CreateView): + template_name = "claim.html" + def get_form(self): + return UserClaimForm(self.request.user, data=self.request.POST, prefix='claim') + + def form_valid(self, form): + print form.cleaned_data + work = form.cleaned_data['work'] + rights_holder = form.cleaned_data['rights_holder'] + if not rights_holder.approved: + form.instance.status = 'pending' + # make sure we're not creating a duplicate claim + if not models.Claim.objects.filter( + work=work, + rights_holder=rights_holder, + ).exclude(status='release').count(): + form.save() + return HttpResponseRedirect(reverse('rightsholders')) + + def get_context_data(self, form): + work = form.cleaned_data['work'] + rights_holder = form.cleaned_data['rights_holder'] + active_claims = work.claim.exclude(status = 'release') + return {'form': form, 'work': work, 'rights_holder':rights_holder , 'active_claims':active_claims} + +def claim(request): + return ClaimView.as_view()(request) + +def rh_tools(request, template_name='rh_intro.html'): + if not request.user.is_authenticated() : + return render(request, "rh_tools.html") + claims = request.user.claim.filter(user=request.user) + campaign_form = "xxx" + if not claims: + return render(request, template_name) + for claim in claims: + if claim.can_open_new: + if request.method == 'POST' and request.POST.has_key('cl_%s-work' % claim.id) and int(request.POST['cl_%s-work' % claim.id]) == claim.work_id : + claim.campaign_form = OpenCampaignForm(data = request.POST, prefix = 'cl_'+str(claim.id),) + if claim.campaign_form.is_valid(): + new_campaign = claim.campaign_form.save(commit=False) + if new_campaign.type == BUY2UNGLUE: + new_campaign.target = D(settings.UNGLUEIT_MAXIMUM_TARGET) + new_campaign.set_cc_date_initial() + elif new_campaign.type == REWARDS: + new_campaign.deadline = date_today() + timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)) + new_campaign.target = D(settings.UNGLUEIT_MINIMUM_TARGET) + elif new_campaign.type == THANKS: + new_campaign.target = D(settings.UNGLUEIT_MINIMUM_TARGET) + new_campaign.save() + claim.campaign_form.save_m2m() + claim.campaign_form = None + else: + c_type = 2 + claim.campaign_form = OpenCampaignForm( + initial={'work': claim.work, 'name': claim.work.title, 'userid': request.user.id, 'managers': [request.user.id], 'type': c_type}, + prefix = 'cl_'+str(claim.id), + ) + if claim.campaign: + if claim.campaign.status in ['ACTIVE','INITIALIZED']: + if request.method == 'POST' and request.POST.has_key('edit_managers_%s'% claim.campaign.id) : + claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, data=request.POST, prefix=claim.campaign.id) + if claim.campaign.edit_managers_form.is_valid(): + claim.campaign.edit_managers_form.save() + claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, prefix=claim.campaign.id) + else: + claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, prefix=claim.campaign.id) + campaigns = request.user.campaigns.all() + new_campaign = None + for campaign in campaigns: + if campaign.clonable(): + if request.method == 'POST' and request.POST.has_key('c%s-campaign_id'% campaign.id): + clone_form = CloneCampaignForm(data=request.POST, prefix = 'c%s' % campaign.id) + if clone_form.is_valid(): + campaign.clone() + else: + campaign.clone_form = CloneCampaignForm(initial={'campaign_id':campaign.id}, prefix='c%s' % campaign.id) + return render(request, template_name, {'claims': claims , 'campaigns': campaigns}) + From bb29fc3d1ff545c41b09b94a97b5907c0f841e81 Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 18 Nov 2017 16:34:56 -0500 Subject: [PATCH 008/109] remove gluejar.com --- api/onix.py | 2 +- deploy/localvm.conf | 2 +- frontend/templates/about_smashwords.html | 2 +- frontend/templates/base.html | 5 +---- frontend/templates/claim.html | 8 ++++---- frontend/templates/faq.html | 15 ++++++--------- frontend/templates/feedback.html | 4 ++-- frontend/templates/libraries.html | 2 +- frontend/templates/ml_status.html | 2 +- .../notification/account_active/full.txt | 2 +- .../notification/account_expired/full.txt | 2 +- .../notification/account_expiring/full.txt | 2 +- .../notification/pledge_you_have_pledged/full.txt | 2 +- .../notification/purchase_notgot_gift/full.txt | 2 +- .../wishlist_unglued_book_released/full.txt | 4 ++-- frontend/templates/press_new.html | 6 +++--- .../registration/registration_complete.html | 2 +- frontend/views/__init__.py | 2 +- settings/common.py | 4 ++-- settings/dev.py | 2 +- settings/jenkins.py | 2 +- sysadmin/gen_csr.sh | 2 +- vagrant/templates/apache.conf.j2 | 4 ++-- 23 files changed, 37 insertions(+), 43 deletions(-) diff --git a/api/onix.py b/api/onix.py index 8b84c1fc..6506f936 100644 --- a/api/onix.py +++ b/api/onix.py @@ -42,7 +42,7 @@ def header(facet=None): header_node = etree.Element("Header") sender_node = etree.Element("Sender") sender_node.append(text_node("SenderName", "unglue.it")) - sender_node.append(text_node("EmailAddress", "support@gluejar.com")) + sender_node.append(text_node("EmailAddress", "unglueit@ebookfoundation.org")) header_node.append(sender_node) header_node.append(text_node("SentDateTime", pytz.utc.localize(datetime.datetime.utcnow()).strftime('%Y%m%dT%H%M%SZ'))) header_node.append(text_node("MessageNote", facet.title if facet else "Unglue.it Editions")) diff --git a/deploy/localvm.conf b/deploy/localvm.conf index fbe52dc1..e862ef81 100644 --- a/deploy/localvm.conf +++ b/deploy/localvm.conf @@ -4,7 +4,7 @@ WSGISocketPrefix /opt/regluit ServerName localvm -ServerAdmin info@gluejar.com +ServerAdmin info@ebookfoundation.org Redirect permanent / https://192.168.33.10.xip.io:443/ diff --git a/frontend/templates/about_smashwords.html b/frontend/templates/about_smashwords.html index b9b3f62d..bd249d33 100644 --- a/frontend/templates/about_smashwords.html +++ b/frontend/templates/about_smashwords.html @@ -8,7 +8,7 @@

Why Unglue Your Book?

diff --git a/frontend/templates/base.html b/frontend/templates/base.html index 032cb560..8be9b30e 100644 --- a/frontend/templates/base.html +++ b/frontend/templates/base.html @@ -161,10 +161,7 @@
Contact
diff --git a/frontend/templates/claim.html b/frontend/templates/claim.html index 1c387b2e..84781dde 100644 --- a/frontend/templates/claim.html +++ b/frontend/templates/claim.html @@ -29,6 +29,10 @@ {% endifequal %} {% endfor %} +

Interfering claims

+

+ When a rights holder claims a work in unglue.it, they warrant and represent that they have sufficient rights to administer the work. Mistakes and umisunderstandings can occur, especially for older works with unclear contracts and hard-to-find rights holders. For that reason, rights holders also agree to respond promptly to rights inquiries, and unglue.it reserves the right to suspend campaigns if disputes over rights arise. If you have a question about claims for this work, please contact rights@ebookfoundation.org +

{% else %} @@ -38,8 +42,4 @@ {% endif %} -

Interfering claims

-

-When a rights holder claims a work in unglue.it, they warrant and represent that they have sufficient rights to release a Creative Commons edition of that work. Unfortunately, mistakes can occur, especially for older works with unclear contracts and hard-to-find rights holders. For that reason, rights holders also agree to respond promptly to rights inquiries, and unglue.it reserves the right to suspend campaigns when disputes over rights arise. If you have a question about claims for this work, please contact rights@gluejar.com -

{% endblock %} \ No newline at end of file diff --git a/frontend/templates/faq.html b/frontend/templates/faq.html index 8a432e9b..36ee77a0 100644 --- a/frontend/templates/faq.html +++ b/frontend/templates/faq.html @@ -102,11 +102,11 @@ If you believe you are a rights holder and would like to your works to be unglue
I know a book that should be unglued.
-
Great! Find it in our database (using the search box above) and add it to your favorites, so we know it should be on our list, too. And encourage your friends to add it to their favorites. The more people that fave a book on Unglue.it, the more attractive it will be for authors and publishers to launch an ungluing campaign. You can also contact us at rights@gluejar.com.
+
Great! Find it in our database (using the search box above) and add it to your favorites, so we know it should be on our list, too. And encourage your friends to add it to their favorites. You can also contact us at rights@ebookfoundation.org.
I know a book that should be unglued, and I own the commercial rights.
-
Fabulous! Please refer to the FAQ for Rights Holders and then contact us at rights@gluejar.com. Let's talk.
+
Fabulous! Please refer to the FAQ for Rights Holders and then contact us at rights@ebookfoundation.org.
Is there a widget that can be put on my own site to share my favorite books or campaigns?
@@ -158,7 +158,7 @@ If you receive our newsletter, there's a link at the bottom of every message to
How can I contact Unglue.it?
-
For support requests, use our feedback form. For general inquiries, use our Ask Questions Frequently account, aqf@gluejar.com. For rights inquiries, rights@gluejar.com. Media requests, press@gluejar.com
+
For support requests, use our feedback form. You can also contact us on email, Twitter or Facebook.
Who is Unglue.it?
@@ -166,7 +166,7 @@ If you receive our newsletter, there's a link at the bottom of every message to
Are you a non-profit company?
-
Yes. Unglue.it is a program of the Free Ebook Foundation, which is a not-for-profit corporation. We work with both non-profit and commercial partners.
+
Yes. Unglue.it is a program of the Free Ebook Foundation, which is a charitable, not-for-profit corporation. We work with both non-profit and commercial partners.
Why does Unglue.it exist?
@@ -418,11 +418,8 @@ If you want to find an interesting campaign and don't have a specific book in mi
What do I need to create a campaign?
-
First, you need to be an authorized rights holder with a signed Platform Services Agreement on file. Please contact rights@gluejar.com to start this process. Once we have your PSA on file, you'll be able to claim your works and you'll have access to tools for launching and monitoring campaigns. We'll be happy to walk you through the process personally.
- -
Can I unglue only one of my books? Can I unglue all of them?
- -
Yes! It's entirely up to you. Each Campaign is for a individual title and a separate fundraising parameters.
+
First, you need to be an authorized rights holder with a signed Rights Holder Agreement on file. Please contact rights@ebookfoundation.org to start this process. Once we have your RHA on file, you'll be able to claim your works and you'll have access to tools for launching and monitoring campaigns. +
Can I raise any amount of money I want?
diff --git a/frontend/templates/feedback.html b/frontend/templates/feedback.html index ed7b8895..5151d273 100644 --- a/frontend/templates/feedback.html +++ b/frontend/templates/feedback.html @@ -6,7 +6,7 @@

Love something? Hate something? Found something broken or confusing? Thanks for telling us!

- To: support@gluejar.com

+ To: support@ebookfoundation.org

{% csrf_token %} {{ form.sender.errors }} @@ -29,5 +29,5 @@
-

If for some reason this form doesn't work, you can send email to unglue.it support at support@gluejar.com.

+

If for some reason this form doesn't work, you can send email to unglue.it support at unglueit@ebookfoundation.org.

{% endblock %} \ No newline at end of file diff --git a/frontend/templates/libraries.html b/frontend/templates/libraries.html index e4fa33c7..8bedf4b5 100644 --- a/frontend/templates/libraries.html +++ b/frontend/templates/libraries.html @@ -60,7 +60,7 @@ The library license gives download access to one library member at a time for 14
Support our active campaigns.
Ultimately ebooks can't be unglued unless authors and publishers are paid for their work. Many of our staunchest supporters are librarians. There are also several libraries which have supported campaigns, including Leddy Library (University of Windsor, Ontario); the University of Alberta library ; and the Z. Smith Reynolds library (Wake Forest University).
Give feedback and ask questions.
-
Want to know more? Need help? Have ideas for how we could improve the site or make it more library-friendly? Contact us at: libraries@gluejar.com.
+
Want to know more? Need help? Have ideas for how we could improve the site or make it more library-friendly? Contact us at: info@ebookfoundation.org.
{% endblock %} \ No newline at end of file diff --git a/frontend/templates/ml_status.html b/frontend/templates/ml_status.html index b208030a..54f77539 100644 --- a/frontend/templates/ml_status.html +++ b/frontend/templates/ml_status.html @@ -5,7 +5,7 @@ You are subscribed to the Unglue.it Newsletter. It comes roughly twice a month. {% else %} -You are NOT subscribed to the Unglue.it Newsletter. It comes roughly twice a month. If you have just become an ungluer, your list invitation should be on its way. Put "gluenews@gluejar.com" in your contact list to make sure you get it.
+You are NOT subscribed to the Unglue.it Newsletter. It comes roughly twice a month. If you have just become an ungluer, your list invitation should be on its way. Put "unglueit@ebookfoundation.org" in your contact list to make sure you get it.
{% csrf_token %} diff --git a/frontend/templates/notification/account_active/full.txt b/frontend/templates/notification/account_active/full.txt index ad02521d..a88b5eba 100644 --- a/frontend/templates/notification/account_active/full.txt +++ b/frontend/templates/notification/account_active/full.txt @@ -1,7 +1,7 @@ {% load humanize %} As you requested, we've updated your account with the payment method you provided. -If you have any questions, we are happy to help. Simply email us at support@gluejar.com. +If you have any questions, we are happy to help. Simply email us at unglueit@ebookfoundation.org. {% if user.profile.account %} The current card we have on file: diff --git a/frontend/templates/notification/account_expired/full.txt b/frontend/templates/notification/account_expired/full.txt index 81466b24..b25da308 100644 --- a/frontend/templates/notification/account_expired/full.txt +++ b/frontend/templates/notification/account_expired/full.txt @@ -3,7 +3,7 @@ We want to let you know that your {{ user.profile.account.card_type }} card endi When you receive your new card, simply go to https://{{ site.domain }}{% url 'manage_account' %} to enter your card information. Thank you! -If you have any questions, we are happy to help. Simply email us at support@gluejar.com. +If you have any questions, we are happy to help. Simply email us at unglueit@ebookfoundation.org. {% if user.profile.account %} The current card we have on file: diff --git a/frontend/templates/notification/account_expiring/full.txt b/frontend/templates/notification/account_expiring/full.txt index 8e5afd17..55801ac4 100644 --- a/frontend/templates/notification/account_expiring/full.txt +++ b/frontend/templates/notification/account_expiring/full.txt @@ -3,7 +3,7 @@ We want to give you advance notice that your {{ user.profile.account.card_type } When you receive your new card, simply go to https://{{ site.domain }}{% url 'manage_account' %} to enter your card information. Thank you! -If you have any questions, we are happy to help. Simply email us at support@gluejar.com. +If you have any questions, we are happy to help. Simply email us at unglueit@ebookfoundation.org. {% if user.profile.account %} The current card we have on file: diff --git a/frontend/templates/notification/pledge_you_have_pledged/full.txt b/frontend/templates/notification/pledge_you_have_pledged/full.txt index b5be79bc..1540f91a 100644 --- a/frontend/templates/notification/pledge_you_have_pledged/full.txt +++ b/frontend/templates/notification/pledge_you_have_pledged/full.txt @@ -17,7 +17,7 @@ Or the best idea: talk about it with those you love. We'll need lots of help fr If you want to change your pledge, just use the button at https://{{ current_site.domain }}{% url 'work' transaction.campaign.work_id %} -If you have any problems with your pledge, don't hesitate to contact us at support@gluejar.com +If you have any problems with your pledge, don't hesitate to contact us at unglueit@ebookfoundation.org Thanks for being part of Unglue.it. diff --git a/frontend/templates/notification/purchase_notgot_gift/full.txt b/frontend/templates/notification/purchase_notgot_gift/full.txt index 6813dd45..fdcbc1ae 100644 --- a/frontend/templates/notification/purchase_notgot_gift/full.txt +++ b/frontend/templates/notification/purchase_notgot_gift/full.txt @@ -14,7 +14,7 @@ You can send the link yourself to make sure that it gets to the right place. You can also "regift" the ebook to a different email address. To do so, FIRST log in to the {{ gift.giver }} account on Unglue.it, and then click on https://{{ current_site.domain }}{% url 'receive_gift' gift.acq.nonce %} -If you have any problems or questions, don't hesitate to contact Unglue.it support at support@gluejar.com +If you have any problems or questions, don't hesitate to contact Unglue.it support at unglueit@ebookfoundation.org the Unglue.it team diff --git a/frontend/templates/notification/wishlist_unglued_book_released/full.txt b/frontend/templates/notification/wishlist_unglued_book_released/full.txt index af503a51..50a7e925 100644 --- a/frontend/templates/notification/wishlist_unglued_book_released/full.txt +++ b/frontend/templates/notification/wishlist_unglued_book_released/full.txt @@ -24,9 +24,9 @@ The Creative Commons licensing terms for {{ work.title }} allow you to redistrib {% endif %} {% if work.last_campaign_status == 'SUCCESSFUL' %} -If you have any problems with this unglued ebook, please don't hesitate to let us know at support@gluejar.com. And if you love being able to give this ebook for free to all of your friends, please consider supporting other ebooks for ungluing. +If you have any problems with this unglued ebook, please don't hesitate to let us know at unglueit@ebookfoundation.org. And if you love being able to give this ebook for free to all of your friends, please consider supporting other ebooks for ungluing. {% else %} -If you have any problems with these ebook files, please don't hesitate to let us know at support@gluejar.com. For example, if the file isn't what it says it is, or if the licensing or copyright status is misrepresented, we want to know as soon as possble. +If you have any problems with these ebook files, please don't hesitate to let us know at unglueit@ebookfoundation.org. For example, if the file isn't what it says it is, or if the licensing or copyright status is misrepresented, we want to know as soon as possble. {% endif %} Thanks, diff --git a/frontend/templates/press_new.html b/frontend/templates/press_new.html index 5c064f9a..77072a99 100644 --- a/frontend/templates/press_new.html +++ b/frontend/templates/press_new.html @@ -21,7 +21,7 @@ Press Releases
- Additional press questions? Please email press@gluejar.com. + Additional press questions? Please email info@ebookfoundation.org.
{% if request.user.is_staff %} @@ -58,7 +58,7 @@ When books have a clear, established legal license which promotes use, they can
When?
Unglue.it launched its first crowdfunding campaign on May 17, 2012. Buy-to-Unglue launched in January of 2014, and Thanks-for-Ungluing launched in April of 2014.
Where?
-
The Free Ebook Foundation is a New Jersey non-for-profit corporation, but its employees and contractors live and work across North America. The best way to contact us is by email, freeebookfoundation@gmail.com.
+
The Free Ebook Foundation is a New Jersey non-for-profit corporation, but its employees and contractors live and work across North America. The best way to contact us is by email, info@ebookfoundation.org.
What's your technology?
Unglue.it is built using Python and the Django framework. We use data from the Google Books, Open Library, LibraryThing, and GoodReads APIs; we appreciate that they've made these APIs available, and we're returning the favor with our own API. You're welcome to use it. We use Less to organize our CSS. We process pledges with Stripe. We collaborate on our code at GitHub and deploy to the cloud with Amazon EC2.
What licenses are supported?
@@ -68,7 +68,7 @@ We support a additional Free Licenses in our Thanks-for-Ungluing program.
I have more questions...
-
Please consult our FAQ (sidebar at left); join the site and explore its features for yourself; or email us, press@gluejar.com.
+
Please consult our FAQ (sidebar at left); join the site and explore its features for yourself; or email us, info@ebookfoundation.org.

Media Highlights

diff --git a/frontend/templates/registration/registration_complete.html b/frontend/templates/registration/registration_complete.html index 54dff1b5..0aff05ae 100644 --- a/frontend/templates/registration/registration_complete.html +++ b/frontend/templates/registration/registration_complete.html @@ -6,7 +6,7 @@ {% if not user.is_authenticated %}

-An account activation email has been sent. Please check your email and click on the link to activate your account. We're also sending you an invitation to our email newsletter. It comes out about twice a month. Put "gluenews@gluejar.com" in your contact list to make sure you get it. +An account activation email has been sent. Please check your email and click on the link to activate your account. We're also sending you an invitation to our email newsletter. It comes out about twice a month. Put "unglueit@ebookfoundation.org" in your contact list to make sure you get it.

{% if request.COOKIES.next %} diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 566aa1d7..84706572 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -2571,7 +2571,7 @@ def ask_rh(request, campaign_id): redirect_url = reverse('work', args=[campaign.work_id]), extra_context={'campaign':campaign, 'subject':campaign }) -def feedback(request, recipient='support@gluejar.com', template='feedback.html', message_template='feedback.txt', extra_context=None, redirect_url=None): +def feedback(request, recipient='unglueit@ebookfoundation.org', template='feedback.html', message_template='feedback.txt', extra_context=None, redirect_url=None): context = extra_context or {} context['num1'] = randint(0, 10) context['num2'] = randint(0, 10) diff --git a/settings/common.py b/settings/common.py index b57348bc..1a77cbcb 100644 --- a/settings/common.py +++ b/settings/common.py @@ -233,8 +233,8 @@ LOGGING = { # django-registration EMAIL_HOST = 'smtp.gluejar.com' DEFAULT_FROM_EMAIL = 'notices@gluejar.com' -SERVER_EMAIL = 'notices@gluejar.com' -SUPPORT_EMAIL = 'support@gluejar.com' +SERVER_EMAIL = 'unglueit@ebookfoundation.org' +SUPPORT_EMAIL = 'unglueit@ebookfoundation.org' ACCOUNT_ACTIVATION_DAYS = 30 SESSION_COOKIE_AGE = 3628800 # 6 weeks diff --git a/settings/dev.py b/settings/dev.py index a59fd936..ef4608ca 100644 --- a/settings/dev.py +++ b/settings/dev.py @@ -47,7 +47,7 @@ EMAIL_HOST = 'smtp.gmail.com' # EMAIL_HOST_USER is in keys/host # EMAIL_HOST_PASSWORD is in keys/host EMAIL_PORT = 587 -DEFAULT_FROM_EMAIL = 'info@gluejar.com' +DEFAULT_FROM_EMAIL = 'info@ebookfoundation.org' # for use with test google account only GOOGLE_DISPLAY_NAME = 'Unglue.It' diff --git a/settings/jenkins.py b/settings/jenkins.py index a45ce2c2..e3c1b841 100644 --- a/settings/jenkins.py +++ b/settings/jenkins.py @@ -34,7 +34,7 @@ EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST_USER = 'me@gmail.com' EMAIL_HOST_PASSWORD = 'my-password' EMAIL_PORT = 587 -DEFAULT_FROM_EMAIL = 'info@gluejar.com' +DEFAULT_FROM_EMAIL = 'info@ebookfoundation.org' # formerly of settings/common.py to surface old vars diff --git a/sysadmin/gen_csr.sh b/sysadmin/gen_csr.sh index 07b14a38..6b1a08a8 100755 --- a/sysadmin/gen_csr.sh +++ b/sysadmin/gen_csr.sh @@ -17,7 +17,7 @@ LOCALITY="Montclair"; ORGNAME="Gluejar, Inc."; ORGUNIT=""; CNAME="*.unglue.it"; -EMAIL="support@gluejar.com"; +EMAIL="unglueit@ebookfoundation.org"; PASSWORD=""; OPTION_COMPANY_NAME=""; diff --git a/vagrant/templates/apache.conf.j2 b/vagrant/templates/apache.conf.j2 index 683d67d4..e0136c4a 100644 --- a/vagrant/templates/apache.conf.j2 +++ b/vagrant/templates/apache.conf.j2 @@ -7,7 +7,7 @@ WSGISocketPrefix /opt/regluit ServerName {% if class == 'prod' %}unglue.it{% else %}{{class}}.unglue.it{% endif %} -ServerAdmin info@gluejar.com +ServerAdmin info@ebookfoundation.org Redirect permanent / {% if class == 'prod' %}https://unglue.it{% else %}https://{{class}}.unglue.it{% endif %} @@ -18,7 +18,7 @@ Redirect permanent / {% if class == 'prod' %}https://unglue.it{% else %}https:// ServerName {% if class == 'prod' %}unglue.it:443{% else %}{{class}}.unglue.it:443{% endif %} -ServerAdmin info@gluejar.com +ServerAdmin info@ebookfoundation.org SSLEngine on SSLProtocol All -SSLv2 -SSLv3 From 12cbac63b35925f3a99a22406ffe348d446d7a36 Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 18 Nov 2017 16:35:19 -0500 Subject: [PATCH 009/109] revise documentation, faq --- frontend/templates/about.html | 51 ---- frontend/templates/base.html | 3 +- frontend/templates/claim_terms.html | 2 +- frontend/templates/ebookfiles.html | 1 - frontend/templates/faq.html | 248 +++++++----------- frontend/templates/faqmenu.html | 25 +- .../notification/rights_holder_claim/full.txt | 1 - .../rights_holder_claim/notice.html | 1 - frontend/templates/privacy.html | 4 +- frontend/templates/rh_intro.html | 15 +- frontend/templates/rh_tools.html | 3 +- frontend/templates/terms.html | 4 +- frontend/urls.py | 2 +- frontend/views/__init__.py | 2 +- 14 files changed, 127 insertions(+), 235 deletions(-) delete mode 100644 frontend/templates/about.html diff --git a/frontend/templates/about.html b/frontend/templates/about.html deleted file mode 100644 index 59b2f25a..00000000 --- a/frontend/templates/about.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends "basedocumentation.html" %} -{% block title %} Everything You Always Wanted to Know {% endblock %} -{% block doccontent %} -

About

-

Unglue.it is a service provided by The Free Ebook Foundation It's a place for individuals and institutions to join together to liberate specific ebooks and other types of digital content by paying authors and publishers to relicense their works under Creative Commons licenses.

- -

What does this mean?

-
    -
  • Book-lovers and libraries everywhere can join together to set books free.
  • -
  • Authors and publishers get the compensation they deserve.
  • -
  • Books that are out of print, not available as ebooks, or otherwise hard to enjoy will be available for everyone to read, share, learn from, and love -- freely and legally.
  • -
- -

You can learn more about us in our FAQs and our press page. -

Team

-
-
-
eric
-
Eric Hellman, President of the Free Ebook Foundation, is a technologist, entrepreneur, and writer. After 10 years at Bell Labs in physics research, Eric became interested in technologies surrounding e-journals and libraries. His first business, Openly Informatics, developed OpenURL linking software and knowledgebases, and was acquired by OCLC in 1996. At OCLC, he led the effort to productize and expand the xISBN service, and began the development of OCLC's Electronic Resource Management offerings. After leaving OCLC, Eric began blogging at Go To Hellman. He covers the intersection of technology, libraries and ebooks, and has written extensively on the Semantic Web and Linked Data. Eric has a B.S.E. from Princeton University, and a Ph. D. in Electrical Engineering from Stanford University
-
- -
-
amanda
-
Amanda Mecke is an expert in literary rights management. Before founding her own literary agency, Amanda was VP, Director of Subsidiary Rights for Bantam Dell, a division of Random House Inc. from 1989-2003, where she led a department that sold international and domestic book rights and pioneered early electronic licenses for subscription databases, CD-ROMs, audiobooks, and ebooks. She was also a co-leader of the Random House/SAP Contracts and Royalties software development team. Prior to joining Bantam Dell, Amanda ran the New York marketing office of the University of California Press. While there she served the board of the American Association of University Presses and was President of Women in Scholarly Publishing. Amanda has been a speaker at the Frankfurt Book Messe Rights Workshop, NYU Summer Publishing Program, American Independent Writers conference, and the International Women’s Writers Guild. She has a B.A. from Pitzer College, Claremont, California and a Ph.D. in English from UCLA. Amanda continues to represent original work by her literary agency clients.

- - Amanda will be spending much of her time reaching out to authors, publishers, and other rights holders and identifying works that will attract financial support from book lovers who want to see the ebooks available for free to anyone, anywhere.
-
- -
-
raymond
-
Raymond Yee is a data architect, author, consultant, and teacher. He is author of the leading book on web mashups, Pro Web 2.0 Mashups: Remixing Data and Web Services (published by Apress and licensed under a Creative Commons license), and has numerous blogs at his personal site. At the UC Berkeley School of Information, he taught Mixing and Remixing Information, a course on using APIs to create mashups. An open data and open government afficionado, he recently co-wrote three influential reports on how the US government can improve its efforts to make data and services available through APIs. Raymond served as the Integration Advisor for the Zotero Project (a widely used open source research tool) and managed the Zotero Commons, a collaboration between George Mason University and the Internet Archive. Raymond has been an invited speaker about web technology at the Library of Congress, Fashion Institute of Technology, the O'Reilly Emerging Technology Conference, American Library Association, the Open Education conference, Code4lib, Educause, and NISO. While earning a Ph.D. in biophysics, he taught computer science, philosophy, and personal development to middle and high school students in the Academic Talent Development Program on the Berkeley campus. Raymond is an erstwhile tubaist, admirer of J. S. Bach, and son of industrious Chinese-Canadian restaurateurs.

- - Recently, Raymond has been teaching a course at UC Berkeley's School of Information science on working with Open Data; with any luck, the textbook he's working on will be a subject of a future ungluing campaign!
-
- -

Past Team

-
-
Andromeda Yelton was one of Unglue.it's founding staff members; she's gone on to pursue another passion, teaching libraries to code. She blogs at Across Divided Networks. Check out her web site if you think she can help you!
- -
- -
-
Design Anthem helped us make the site pretty.
-
- -
-
Jason Kace wrote code. Ed Summers wrote some more code. Both of them helped us write even more code. -
-
-
-{% endblock %} \ No newline at end of file diff --git a/frontend/templates/base.html b/frontend/templates/base.html index 8be9b30e..a7513912 100644 --- a/frontend/templates/base.html +++ b/frontend/templates/base.html @@ -124,7 +124,6 @@ About Unglue.it
diff --git a/frontend/templates/claim_terms.html b/frontend/templates/claim_terms.html index 81e2542c..90062ffb 100644 --- a/frontend/templates/claim_terms.html +++ b/frontend/templates/claim_terms.html @@ -1,3 +1,3 @@

Terms and Conditions for Claiming Works

-

By claiming this work, you agree that your claim is governed by a Platform Services Agreement in effect between you (or an entity that you act as agent for) and the Free Ebook Foundation, Inc., the operator of the Unglue.it website, and by the unglue.it Website Terms .

\ No newline at end of file +

By claiming this work, you agree that your claim is governed by a Rights Holder Agreement in effect between you (or an entity that you act as agent for) and the Free Ebook Foundation, Inc., the operator of the Unglue.it website, and by the unglue.it Website Terms .

\ No newline at end of file diff --git a/frontend/templates/ebookfiles.html b/frontend/templates/ebookfiles.html index 99a909f9..513f8513 100644 --- a/frontend/templates/ebookfiles.html +++ b/frontend/templates/ebookfiles.html @@ -1,7 +1,6 @@
  • For Thanks-For-Ungluing Campaigns, the rightsholder is responsible for providing valid, high-quality EPUB, MOBI, and PDF files.
  • For Buy-To-Unglue Campaigns and Pledge Campaigns ebook files should use the EPUB standard format format according to best practice at time of submission. At minimum, the files should pass the epubcheck tool. Exceptions will be made for content requiring more page layout than available in prevailing EPUB implementations; in those cases, the files will usually be PDF.
  • -
  • Files shall be compliant where ever reasonable with the QED inspection checklist specified at http://qed.digitalbookworld.com/why-qed/criteria
  • The file should have no more than 0.2 typographical or scanning errors per page of English text.
  • The file shall contain front matter which includes the following:
      diff --git a/frontend/templates/faq.html b/frontend/templates/faq.html index 36ee77a0..0b13a6ba 100644 --- a/frontend/templates/faq.html +++ b/frontend/templates/faq.html @@ -16,48 +16,37 @@ {% endif %} {% if location == 'basics' or location == 'faq' %} -

      Basics

      +

      About the site

      {% if sublocation == 'howitworks' or sublocation == 'all' %} -

      How It Works

      +

      About Unglue.it

      What is Unglue.it?
      -
      Unglue.it is a place for individuals and institutions to join together to make ebooks free to the world. We work together to support authors, publishers, or other rights holders who want their ebooks to be free. We support Creative Commons licensing as an enabling tool to "unglue" the ebooks.
      +
      Unglue.it is a place for individuals and institutions to join together in support of free ebooks. We work together to support authors, publishers, or other rights holders who want their ebooks to be free. We work together to provide durable and effective distribution for ebooks that are free. We support Creative Commons licensing as an enabling tool to "unglue" the ebooks. We are part of the Free Ebook Foundation, a non-profit charitable organization.
      -
      What are Ungluing Campaigns?
      +
      Why are all these ebooks free?
      -
      We have three types of Ungluing Campaigns: Pledge Campaigns, Buy-to-Unglue Campaigns and Thanks-for-Ungluing campaigns. -
        -
      • In a Pledge Campaign, book lovers pledge their support for ungluing a book. If enough support is found to reach the goal (and only then), the supporter's credit cards are charged, and an unglued ebook is released.
      • -
      • In a Buy-to-Unglue Campaign, every ebook copy sold moves the book's ungluing date closer to the present. And you can donate ebooks to your local library- that's something you can't do in the Kindle or Apple Stores!
      • -
      • In a Thanks-for-Ungluing Campaign, the ebook is already released with a Creative Commons license. Supporters can express their thanks by paying what they wish for the license and the ebook.
      • -
      -We also support distribution and preservation of free ebooks through our growing catalog of free-licensed ebooks. +
      The ebooks available on Unglue.it have missions to accomplish. There are textbooks to help you learn. There is literature to open up your mind. There are books on technology to help you create. There are academic books that are spreading ideas. There are books that want to change your mind. And there are books that belong to all of us, that want to live into the future.

      + +Freedom can help a book accomplish its mission, and that why the ebook is free. We call these books "unglued" and we call the process of making them free, "ungluing".
      + + +
      So how do you make money?
      + +
      We don't - we're an non-profit. If you like what we do, you can donate!
      + +
      What about the authors and publishers, how do they make money?
      + + +
      That's the million dollar question. You don't make money by giving away ebooks. Many authors make money other ways - by teaching, by consulting, by getting tenure. Some authors do well be selling printed books alongside their free ebooks. We started Unglue.it because we hoped to give ebook creators additional ways to support their work: Ungluing Campaigns. +

      We hope you'll choose to support some of these Campaigns, but if you like an ebook you find on Unglue.it, don't hesitate to lend your support in other ways.
      - -
      What is Crowdfunding?
      - -
      Crowdfunding is collectively pooling contributions (or pledges) to support some cause. Using the internet for coordination means that complete strangers can work together, drawn by a common cause. This also means the number of supporters can be vast, so individual contributions can be as large or as small as people are comfortable with, and still add up to enough to do something amazing.

      -Want to see some examples? Kickstarter lets artists and inventors solicit funds to make their projects a reality. For instance, webcomic artist Rich Burlew sought $57,750 to reprint his comics in paper form -- and raised close to a million.

      -In other words, crowdfunding is working together to support something you love. By pooling resources, big and small, from all over the world, we can make huge things happen.
      - -
      What does it cost?
      - -
      Unglue.it is free to join. Many of the things you can do here -- discovering books, adding them to your ebook list, downloading unglued books, commenting, sharing -- are free too. -

      If you choose to support a Campaign, please do so!.

      If you choose to buy or download an unglue.it ebook, you can read it anywhere you like - there's no restrictive DRM. -

      -If you hold the electronic rights to a book, starting campaigns or listing your ebooks is free, too. You only pay Unglue.it a fraction of your revenue. For the basics on campaigns, see the FAQ on Campaigns; for more details, see the FAQ for Rights Holders.
      -
      Who can use Unglue.it?
      Anyone! We're located in the United States, but we welcome participants from all over the world.

      -To fund a campaign, or buy an ebook, you'll need a valid credit card. To start a campaign, you'll need to establish yourself with us as a rights holder, including demonstrating that you have the rights to the content you want to unglue. See the FAQs for Rights Holders for more.
      - -
      Why should I support a book at Unglue.it when I can just buy it somewhere else?
      - -
      When you buy a book, you get a copy for yourself. When you unglue it, you give a copy to yourself, reward its creators and contribute towards making it free to everyone.
      +To fund a campaign, or buy an ebook, you'll need a valid credit card. To use our fund raising tools for your books, you'll need to establish yourself with us as a rights holder.
      What do I get when I help unglue a book?
      You get a better ebook. Your unglued ebook has no restrictive DRM: you can put it on any device you want, in any format you want. You can read it on the network or off, with no one tracking your reading.

      @@ -65,46 +54,29 @@ You may get premiums as part of a Pledge Campaign, depending on the amount you p
      Does Unglue.it own the copyright of unglued books?
      -
      No. When you unglue a book, the copyright stays with its current owner. Unglue.it does not buy copyrights. A Creative Commons license is a licensing agreement. As with other licensing agreements, it grants certain rights to others but does not affect the status of the copyright.

      +
      No. Books available on unglue.it are licensed by the the copyright owner. Creative Commons licenses are licensing agreements. They grant certain rights but do not affect the status of the copyright. You can read more about these licenses at the Creative Commons FAQ.
      -Just like many traditional publishing transactions, ungluing is about licensing rights. We use Creative Commons licenses which allow creators to choose the ways in which their works can be copied, shared and re-used.

      +
      If I'm a rights holder and unglue my book, can I still offer it for sale?
      -If you are a copyright holder, you retain your copyright when you unglue a book. Creative Commons licenses are non-exclusive, so you also retain the right to enter into separate licensing agreements. You can read more about these licenses at the Creative Commons FAQ. - -
      If I'm a rights holder and my book is unglued, does that mean I can never make money from it again?
      - -
      No! You are free to enter into additional licensing agreements for other, non-unglued, editions of the work, including translation and film rights. You may continue to sell both print and ebook editions. You may use your unglued books as free samples to market your other works -- for instance, later works in the same series. You can use them to attract fans who may be interested in your speaking engagements, merchandise, or other materials. You absolutely may continue to profit from ungluing books -- and we hope you do! -
      - -
      Why do authors, publishers, and other rights holders want their books unglued?
      - -
      -Lots of reasons: -
        -
      • To publicize their other books, gain new fans, or otherwise increase the value of an author's brand.
      • -
      • To get income from books that are no longer in print.
      • -
      • To have a digital strategy that pays for itself, even if they don't have expertise in producing ebooks.
      • -
      • To advance a cause, add to the public conversation, or increase human knowledge.
      • -
      • To leave a legacy that enriches everyone, now and in the future.
      • -
      +
      Yes. You are free to enter into additional licensing agreements for the work and its derivatives, including translation and film adaptations. You may continue to sell both print and ebook editions. Unglued ebooks can be free samples to market you and your work -- for instance, later works in the same series.
      Does Unglue.it publish books? Can I self-publish here?
      -
      Unglue.it is not a publisher. If you self-publish, Unglue.it can help you distribute your ebooks, if they meet our technical quality standards.
      +
      Unglue.it is a distributor, not a publisher. If you self-publish and want your books to be free, Unglue.it can help you distribute your ebooks.
      What's a rights holder? How can I tell if I'm one?
      -
      A rights holder is the person (or entity) that holds the legal right to copy, distribute, or sell a book in some way. There may be one entity with all the rights to a work, or the rights may be split up among different entities: for example, one who publishes the print edition in the United States, another who publishes the print edition in the EU, another who holds electronic rights, et cetera. For ungluing purposes, the rights holder is the entity who has uncontested worldwide commercial rights to a work.

      +
      A rights holder is a person (or entity) that has a right to copy, distribute, or sell a book in some way. There may be one entity with all the rights to a work, or the rights may be split up among different entities: for example, one who publishes the print edition in the United States, another who publishes the print edition in the EU, another who holds electronic rights, et cetera. For ungluing purposes, the rights holder is the entity who has uncontested worldwide commercial rights to a work.

      If you have written a book and not signed any contracts about it, you hold all the rights. If you have signed a contract with a publisher to produce, distribute, publish, or sell your work in a particular format or a particular territory, whether or not you still hold rights depends on the language of that contract. We encourage you to check your contracts. It may be in your interest to explore launching an Unglue.it campaign jointly with your publisher.

      If you haven't written a book but you have had business or family relationships with someone who has, it's possible that you are a rights holder (for instance, you may have inherited rights from the author's estate, or your company may have acquired them during a merger). Again, this all depends on the specific language of your contracts. We encourage you to read them closely. Unglue.it cannot provide legal advice.

      -If you believe you are a rights holder and would like to your works to be unglued, please contact us at rights@gluejar.com.
      +If you believe you are a rights holder and would like us to help unglue your works, get started at the right holder tools page.
      I know a book that should be unglued.
      Great! Find it in our database (using the search box above) and add it to your favorites, so we know it should be on our list, too. And encourage your friends to add it to their favorites. You can also contact us at rights@ebookfoundation.org.
      -
      I know a book that should be unglued, and I own the commercial rights.
      +
      I know a book that should be unglued, and it's mine!
      Fabulous! Please refer to the FAQ for Rights Holders and then contact us at rights@ebookfoundation.org.
      @@ -150,33 +122,40 @@ If you receive our newsletter, there's a link at the bottom of every message to
      Is my personal information shared?
      -
      Short version: no, except as absolutely required to deliver services you have opted into. If you have pledged to a campaign and are owed a premium, we will share your email with campaign managers so that they can deliver premiums to you; you are not required to share any further information and they are required to comply with our privacy policy in handling your information. We do use third-party providers to support some of our business functions, but they are only allowed to use your information in order to enable your use of the service. For the long version, please read our privacy policy. +
      Short version: no, except as absolutely required to deliver services you have opted into. If you have pledged to a campaign and are owed a premium, we will share your email with campaign managers so that they can deliver premiums to you; you are not required to share any further information and they are required to comply with our privacy policy in handling your information. We do use third-party providers to support some of our business functions, but they are only allowed to use your information in order to enable your use of the service. For a long, opinionated version of this answer, please read our privacy policy.
      {% endif %} {% if sublocation == 'company' or sublocation == 'all' %} -

      The Company

      +

      The Organization

      How can I contact Unglue.it?
      For support requests, use our feedback form. You can also contact us on email, Twitter or Facebook. -
      Who is Unglue.it?
      - -
      We are a small group that believes strongly that ebooks can make the world richer in new and diverse ways, and that we all benefit from the hard work of their creators. We come from the worlds of entrepreneurship, linked data, physics, publishing, education, and library science, to name a few. You can learn more about us at our about page or our Unglue.it supporter profiles: Eric Hellman, Amanda Mecke and Raymond Yee. Our alumni include Luc Lewitanski and Andromeda Yelton.
      +
      Are you a non-profit company?
      Yes. Unglue.it is a program of the Free Ebook Foundation, which is a charitable, not-for-profit corporation. We work with both non-profit and commercial partners.
      -
      Why does Unglue.it exist?
      - -
      Because legal stickiness means you can't reliably lend or share your ebooks, borrow them from the library, or read them on the device of your choice. Because -- like public radio -- ebooks are expensive to create but cheap to distribute, so covering their fixed costs and reasonable profit up front can be an appealing system for authors, publishers, readers, and libraries. Because we all have books we love so much we want to give them to the world.
      {% endif %} {% endif %} {% if location == 'campaigns' or location == 'faq' %}

      Campaigns

      +
      +
      What are Ungluing Campaigns?
      + +
      Unglue.it has three programs that support ebook creators: Pledge Campaigns, Buy-to-Unglue Campaigns and Thanks-for-Ungluing Campaigns. +
        +
      • In a Pledge Campaign, book lovers pledge their support for ungluing a book. If enough support is found to reach the goal (and only then), the supporter's credit cards are charged, and an unglued ebook is released.
      • +
      • In a Buy-to-Unglue Campaign, every ebook copy sold moves the book's ungluing date closer to the present. And you can donate ebooks to your local library- that's something you can't do in the Kindle or Apple Stores!
      • +
      • In a Thanks-for-Ungluing Campaign, the ebook is already released with a Creative Commons license. Supporters can express their thanks by paying what they wish for the license and the ebook.
      • +
      +We also support distribution and preservation of free ebooks through our growing catalog of free-licensed ebooks. +
      +
      {% if sublocation == 'all' %} {% include "faq_t4u.html" %} @@ -191,6 +170,7 @@ If you receive our newsletter, there's a link at the bottom of every message to {% endif %} {% if sublocation == 'supporting' or sublocation == 'all' %} +

      Pledge Campaigns

      Support the books you've loved and make them free to everyone. @@ -206,23 +186,23 @@ Support the books you've loved and make them free to everyone.
      How do I pledge?
      -
      When the creators of a book have been persuaded to launch a campaign, there will be a "Support" button on the book's unglue.it page. You'll be asked to select your premium and specify your pledge amount; choose how you'd like to be acknowledged, if your pledge is $25 or more; and enter your credit card information.
      +
      When the creators of a book have been persuaded to launch a campaign, there will be a "Support" button on the book's unglue.it page. You'll be asked to select your premium and specify your pledge amount; choose how you'd like to be acknowledged, if your pledge is $25 or more; and enter your credit card information. If tax deductions are important to you, consider donating instead.
      + +
      How do I support a campaign with a donation?
      + +
      Campaigns that meet the Free Ebook Foundation's guidelines for charitable support are eligible for support via donations to the Foundation. Essentially, the Foundation will pledge to the campaign based on your direction.
      When will I be charged?
      -
      In most cases, your account will be charged by the end of the next business day after a Pledge Campaign succeeds. If a campaign doesn't succeed, you won't be charged.
      +
      For pledges, your account will be charged by the end of the next business day after a Pledge Campaign succeeds. If a campaign doesn't succeed, you won't be charged. For donations, your account will be charged immediately. If a campaign doesn't succeed, the Foundation will use your donation in support of other ebooks.
      What if I want to change or cancel a pledge?
      -
      You can modify your pledge by going to the book's page and clicking on the "Modify Pledge" button. (The "Support" button you clicked on to make a pledge is replaced by the "Modify Pledge" button after you pledge.)
      - -
      What happens to my pledge if a Pledge Campaign does not succeed?
      - -
      Your credit card will only be charged when campaigns succeed. If they do not, your pledge will expire and you will not be charged.
      +
      You can modify your pledge by going to the book's page and clicking on the "Modify Pledge" button. (The "Support" button you clicked on to make a pledge is replaced by the "Modify Pledge" button after you pledge.) You can't modify a donation, but you can make another.
      How will I be recognized for my support?
      -
      Pledgers are indicated on the book's page. In addition, when ungluing campaigns are successful, you'll be acknowledged in the unglued ebook as follows:
      +
      Pledgers and donors are indicated on the book's page. In addition, when ungluing campaigns are successful, you'll be acknowledged in the unglued ebook as follows:
      • $25+ // Your name under "supporters" in the acknowledgements section.
      • $50+ // Your name and link to your profile page under "benefactors"
      • @@ -233,13 +213,9 @@ Support the books you've loved and make them free to everyone.
        Yes. Anonymous donors are included in the total count of supporters, but their names and links are not included in the acknowledgements.
        -
        If I have pledged to a suspended or withdrawn Pledge Campaign, what happens to my pledge?
        - -
        Your pledge will time out according to its original time limit. If the campaign is resolved and reactivated before your pledge has timed out, your pledge will become active again. If the campaign is not reactivated before your pledge's time limit, your pledge will expire and you will not be charged. As always, you will only be charged if a campaign is successful, within its original time limit.
        -
        Is my contribution tax deductible?
        -
        If the campaign manager for the work you're supporting is a nonprofit, please contact them directly to inquire. Unglue.it cannot offer tax deductions.
        +
        Donations to the Free Ebook Foundation are tax-deductible. Pledges to campaigns might be tax-deductible if the recipient of funds is a charity, otherwise probably not. Consult your tax advisor.
        {% endif %} {% if sublocation == 'premiums' or sublocation == 'all' %} @@ -260,6 +236,10 @@ Support the books you've loved and make them free to everyone.
        Is there a minimum or maximum for how much a premium can cost?
        There's a $1 minimum and a $2000 maximum.
        + +
        Do I get a premium for a donation?
        + +
        No, just the good feeling you get for doing your part.
        {% endif %} {% endif %} @@ -271,30 +251,15 @@ Support the books you've loved and make them free to everyone.
        So what is an unglued ebook?
        -
        An unglued ebook is a book that's added a Creative Commons license, after payments to the author, publisher, or other rights holder.

        +
        +An unglued ebook is a free ebook, not an ebook that you don't pay for! +

        -What does this mean for you? If you're a book lover, you can read unglued ebooks for free, on the device of your choice, in the format of your choice, and share them with all your friends. If you're a library, you can lend them to your patrons with no checkout limits or simultaneous user restrictions, and preserve them however you think best. If you're a rights holder, you get a payments in lieu of further royalties, while retaining copyright and all interests in your work. +Unglued ebooks use a Creative Commons or other free license to counteract the stucked-ness of "all rights reserved" copyrights. Sometimes, payments are made to the author, publisher, or other rights holder to facilitate the ungluing.

        + +What does this mean for you? If you're a book lover, you can read unglued ebooks for free, on the device of your choice, in the format of your choice, and share them with all your friends. If you're a library, you can lend them to your patrons with no checkout limits or simultaneous user restrictions, and preserve them however you think best. If you're a rights holder, you retain copyright in your work.
        -
        Is the unglued ebook edition the same as one of the existing editions?
        - -
        Not necessarily. Sometimes the existing editions include content that we can't get the rights to include in the unglued ebook, especially cover art or illustrations. Sometimes the unglued ebook edition will have improvements, like copy-editing fixes or bonus features. These differences, if any, will be specified in the More... tab of the campaign page. In addition, unglued ebooks may include acknowledgements of supporters and information on their Creative Commons license.
        - -
        How much does a book need to earn?
        - -
        For Pledge and Buy-to-Unglue Campaigns, the author or publisher sets an earnings total for making the book free. Once you and your fellow ungluers raise enough money to meet that price through pledges or spend enough money on paid copies, the unglued ebook becomes available at no charge, for everyone, everywhere! Thanks-for-Ungluing books can be downloaded for free now, but the creators would love to have your support.
        - -
        Will Unglue.it have campaigns for all kinds of books?
        - -
        Yes. You choose what books to support.
        - -
        Does an unglued book have to be out-of-print?
        - -
        No. Unglued books can be anything in copyright, whether 75 years or 7 days old, whether they sell in paperback or hardcover and or can only be found in used bookstores -- or nowhere. But the copyright owners and any one else with a claim on the book need to agree.
        - -
        Will Unglue.it help raise funds for books not yet written?
        - -
        No. There are other crowdfunding sites devoted to the creative process, and we encourage you to investigate them. Once your book is ready to sell as an ebook, we'd love to talk to you.
        {% endif %} {% if sublocation == 'using' or sublocation == 'all' %} @@ -302,7 +267,7 @@ What does this mean for you? If you're a book lover, you can read unglued ebook
        What can I do, legally, with an unglued ebook? What can I not do?
        -
        All unglued ebooks are released under a Creative Commons license. The rights holder chooses which Creative Commons license to apply. Books that we distribute in a Buy-to-Unglue Campaign also have creative commons licenses, but the effective date of these licenses is set in the future.

        +
        All unglued ebooks are released under a Creative Commons or other free license. The rights holder chooses which license to apply. Books that we distribute in a Buy-to-Unglue Campaign have creative commons licenses, but the effective date of these licenses is set in the future.

        Creative Commons licenses mean that once the license is effective you can: make copies; keep them for as long as you like; shift them to other formats (like .mobi or PDF); share them with friends or on the internet; download them for free.

        @@ -312,49 +277,41 @@ Under ND (no derivatives) licenses, you cannot: make derivative works, s Under all CC licenses (except CC0), you cannot: remove the author's name from the book, or otherwise pass it off as someone else's work; or remove or change the CC license.
        -
        What does non-commercial mean under Creative Commons?
        - -
        Creative Commons doesn't define "commercial" thoroughly (though it's worth reading what they have to say on the topic). So as part of the Unglue.it process, ungluing rights holders agree that "For purposes of interpreting the CC License, Rights Holder agrees that 'non-commercial' use shall include, without limitation, distribution by a commercial entity without charge for access to the Work."

        - -Unglue.it can't provide legal advice about how to interpret Creative Commons licenses, and we encourage you to read about the licenses yourself and, if necessary, seek qualified legal advice.
        -
        Are the unglued ebooks compatible with my device? Do I need to own an ereader, like a Kindle or a Nook, to read them?
        -
        Unglued ebooks are distributed with NO RESTRICTIVE DRM, so they'll work on Kindle, iPad, Kobo, Nook, Android, Mac, Windows, Linux... you get the idea. Whether you have an ereader, a tablet, a desktop or laptop computer, or a smartphone, there are reading apps that work for you. Ebook editions issued through Unglue.it will be available in ePub format. If this format doesn't work for you, today or in the future, you are welcome to shift unglued books to one that does, and to copy and distribute it in that format.
        +
        Unglued ebooks are distributed with NO RESTRICTIVE DRM, so they'll work on Kindle, iPad, Kobo, Nook, Android, Mac, Windows, Linux... you get the idea. Whether you have an ereader, a tablet, a desktop or laptop computer, or a smartphone, there are reading apps that work for you.
        Do I need to have a library card to read an unglued ebook?
        No. (Though we hope you have a library card anyway!)

        If your library has bought an ebook as part of a Buy-to-Unglue Campaign, you may need your library card if you want to borrow them.
        -
        How long do I have to read my unglued book? When does it expire?
        +
        How long do I have to read my "buy-to-unglue" ebook? When does it expire?
        -
        If you're reading a book purchased from unglue.it by a library, your borrowing license expires after 2 weeks. But otherwise there's no expiration. And you delete the file on the honor system.

        -If you're reading a book you've purchased from unglue.it, you may keep it as long as you like. There's no need to return it, and it won't stop working after some deadline. You own it.

        +
        If you're reading a "buy-to-unglue" book purchased by a library, your borrowing license expires after 2 weeks. But otherwise there's no expiration. And you delete the file on the honor system.

        +If you're reading a "buy-to-unglue" book you've purchased , you may keep it as long as you like. There's no need to return it, and it won't stop working after some deadline. You own it.

        If you're reading a book that's been unglued, you can keep the file forever AND you can make copies for friends.
        Can I download ebooks directly from Unglue.it?
        If you've purchased an ebook from unglue.it, you'll by able to download it through the website. All formats are included (where available), and you can download the ebooks for your personal use as many times as you need to.

        -Unglue.it also provides links to download previously unglued books, creative commons licensed books, and public domain ebooks. You don't need our permission to host these free ebooks on your own site.
        +Unglue.it provides links to download thousands of previously unglued books, creative commons licensed books, and public domain ebooks. You don't need our permission to host these free ebooks on your own site, but you must abide by the book's license terms
      {% endif %} {% if sublocation == 'copyright' or sublocation == 'all' %}

      Ungluing and Copyright

      -
      Why does an unglued book have to be in copyright?
      +
      Are Unglued Ebooks in the Public Domain?
      -
      Because books out of copyright are already free for you to copy, remix, and share! If a book is in the public domain, it doesn't need to be unglued.
      +
      No. Books in the public domain, because their copyrights have expired, or because they were created by the US government, are already free for you to copy, remix, and share! If a book is in the public domain, it doesn't need to be unglued, it's already unglued. But lots of other books are free-licensed even though their copyrights are still in force; if you don't adhere to the license terms, you are infringing that copyright.
      How can I tell if a book is in copyright or not?
      Unfortunately, it can be complicated -- which is why Unglue.it wants to simplify things, by making unglued ebooks unambiguously legal to use in certain ways. The laws governing copyright and the public domain vary by country, so a book can be copyrighted in one place and not in another. In the United States, the Library Copyright Slider gives a quick estimate.

      -Unglue.it signs agreements assuring the copyright status of every work we unglue, so you can be confident when reading and sharing an unglued ebook.
      -
      Unglue.it lists a book that I know is already Creative Commons licensed or available in the public domain. How can I get the link included?
      -
      If you are logged in to Unglue.it, the "Rights" page for every work lists the edition we know about. There a link for every edition that you can use to tell us about Creative Commons or public domain downloads. We do require that these books be hosted at certain known, reputable repositories: Internet Archive, Wikisources, Hathi Trust, Project Gutenberg, or Google Books.
      +
      If you are logged in to Unglue.it, the "More..." tab for every work lists the edition we know about. There is a link for every edition that you can use to tell us about Creative Commons or public domain downloads. We require that these books be hosted at certain known, reputable repositories such as Internet Archive, Wikisources, Hathi Trust, Project Gutenberg, Github or Google Books.
      {% endif %} {% endif %} @@ -363,23 +320,15 @@ Unglue.it signs agreements assuring the copyright status of every work we unglue {% if sublocation == 'authorization' or sublocation == 'all' %}

      Becoming Authorized

      -
      Who is eligible to start a campaign or sell ebooks on Unglue.it?
      +
      What do I need to do to become a Rights Holder on Unglue.it?
      -
      To start a campaign, you need to be a verified rights holder who has signed a Platform Services Agreement with us.
      -
      What do I need to do to become an authorized Rights Holder on Unglue.it?
      +
      To start a campaign, you need to be a verified rights holder who has signed a Rights Holder Agreement with us.

      -
      Contact our Rights Holder Relations team, rights@gluejar.com, to discuss signing our Platform Services Agreement (PSA), setting a revenue goal, and running a campaign on Unglue.it to release your book under a Creative Commons license, or to raise money for a book you've already released under such a license.
      +Start by visiting the Rights Holders Tools page.You'll sign our Rights Holder Agreement (RHA) and learn about our various programs.
      I haven't signed an agreement, but my books are listed on Unglue.it. What's going on?
      -
      If your book is listed on Unglue.it, it's because an unglue.it user has indicated some interested in the book. Perhaps your book has been added to a user's favorites list. Users can also use the site to post links to Creative Commons licensed or public domain books. Unglue.it works with non-profit sites such as Internet Archive to improve their coverage and preservation of Creative Commons licensed books. +
      If your book is listed on Unglue.it, it's either because an unglue.it user has indicated some interested in the book, or it's because we've determined that your book is already available with a free license.
      -
      I didn't give you permission to offer my CC-licensed book for download. Why is it there?
      -
      When we don't have an agreement with a rights-holder, our download links lead to sites such as Internet Archive, Project Gutenberg, or Google Books that facilitate this linking and free use of the works by our users. We strive to keep our information accurate, so if the license we report is inaccurate, please let us know immediately. If for some reason you don't want us to provide download links, let us know using the "feedback" tab next to your book's page and we'll make a notation to that effect in our metadata. We may require evidence that you are authorized to act for the rights holders of the book. -
      - -
      Do I need to know the exact titles I might want to unglue before I sign the Platform Services Agreement?
      - -
      No. You only need to agree to the terms under which you will use Unglue.it to raise money. You can decide which specific titles you wish to make available for licensing later. However, before you start a campaign, you must claim a specific title (through the More... tab of its book page) and plan how you will attract ungluers to pledge toward your goal.
      Can I run more than one campaign?
      You can run campaigns for as many, or as few, titles at a time as you like.
      @@ -389,22 +338,17 @@ Unglue.it signs agreements assuring the copyright status of every work we unglue

      Claiming Works

      -
      How can I claim a work for which I am the rights holder?
      +
      How can I claim a work for which I am a rights holder?
      -
      On every book page there is a More... tab. If you have a signed Platform Services Agreement on file, one of the options on the More... tab will be "Claim This Work". If you represent more than one rights holder, choose the correct one for this work and click "Claim". +
      On every book page there is a More... tab. If you have a signed Rights Holder Agreement on file, one of the options on the More... tab will be "Claim This Work". If you represent more than one rights holder, choose the correct one for this work and click "Claim".

      If the book is not already in Unglue.it or in Google Books, you'll need to enter the metatadata for the book by hand or work with us to load the data from a spreadsheet or Onix file.
      • Use this form to enter the metadata.
      • -
      • Your ebooks must have ISBNs or OCLC numbers assigned.
      • -
      • Your metadata should have title, authors, language, description.
      • +
      • Your metadata should have title, identifiers, authors, language, description.
      • If you have a lot of books to enter, contact us to load ONIX or CSV files for you.
      -

      If you expect to see a "Claim" button and do not, either we do not have a PSA from you yet, or we have not yet verified and filed it. Please contact us at rights@gluejar.com.
      - -
      Why should I claim my works?
      - -
      You need to claim a work before you will be able to start a campaign for it. Additionally, we're adding features for verified rights holders which will help you show off your works and connect to your readers. Claiming your works will let you take advantage of these features in the future.
      +

      If you expect to see a "Claim" button and do not, either we do not have a RHA from you yet, or we have not yet verified and filed it. Please contact us at rights@ebookfoundation.org.
      Where can I find a campaign page?
      @@ -423,7 +367,7 @@ If you want to find an interesting campaign and don't have a specific book in mi
      Can I raise any amount of money I want?
      -
      You can set any goal that you want in a Campaign. But don't be ridiculous! Unglue.it cannot guarantee that a goal will be reached.
      +
      You can set any goal that you want in a Campaign. But don't be ridiculous! Unglue.it cannot guarantee that a goal will be reached. Also, Campaigns with excessive goals will not be eligible for support via donations.
      What should I include in my campaign page?
      @@ -531,15 +475,15 @@ Need more ideas? We're happy to work with rights holders personally to craft a
      I am a copyright holder. Do I need to already have a digital file for a book I want to unglue?
      -
      For a Buy-to-Unglue Campaign, yes, you'll need to upload an epub file for each book. For Pledge Campaigns, no, you may run campaigns for books that exist only in print copies or are out of print. Any print book can be scanned to create a digital file that can then become an ePub-format unglued ebook. For Thanks-for-Ungluing campaigns, you can use ePub, Mobi, pdf and html files.
      +
      For a Buy-to-Unglue Campaign, yes, you'll need to upload an EPUB file for each book. For Pledge Campaigns, no, you may run campaigns for books that exist only in print copies or are out of print. Any print book can be scanned to create a digital file that can then become an EPUB-format unglued ebook. For Thanks-for-Ungluing campaigns, you can use EPUB, MOBI, pdf and html files.
      -
      Will Unglue.it scan books and produce ePub files?
      +
      Will Unglue.it scan books and produce EPUB files?
      No. We can help you find third parties who will contract for conversion services.
      Will Unglue.it raise money to help pay for conversion costs?
      -
      A Pledge campaign target should include conversion costs. For a Buy-to-Unglue and Thanks-for-Ungluing campaigns, you'll need to have pre-existing epub files.
      +
      A Pledge campaign target should include conversion costs. For a Buy-to-Unglue and Thanks-for-Ungluing campaigns, you'll need to have pre-existing files.
      What are the requirements for my ebook files?
      @@ -566,12 +510,12 @@ Need more ideas? We're happy to work with rights holders personally to craft a
      Are contributions refundable?
      -
      Unglue.it contributions are non-refundable. Once a campaign succeeds, supporters' credit cards will be charged the full amount of their pledge. However, they will not be charged until, and unless, the campaign succeeds. Before that time they may modify or cancel their pledges without charge. Buy-to-Unglue license purchases are not returnable or refundable by Unglue.it, but rights holders need to keep customers happy with respect to the products they buy, as customers are free to post comments on the work page. +
      Unglue.it contributions are non-refundable. Once a campaign succeeds, supporters' credit cards will be charged the full amount of their pledge. However, they will not be charged until, and unless, the campaign succeeds. Before that time they may modify or cancel their pledges without charge. Buy-to-Unglue license purchases are not returnable or refundable by Unglue.it, but rights holders need to keep customers happy with respect to the products they buy, as customers are free to post comments on the work page. Donations are not refundable.
      What if an ungluer contests a charge?
      -
      Ungluers may contest charges, either with the payment processor or with their credit card issuer. Unglue.it is not liable for this and rights holders are liable for any chargebacks. We encourage rights holders to provide clear, timely communication to their supporters throughout the campaign to ensure they remember what they pledged to and why.
      +
      Ungluers may contest charges, either with the payment processor or with their credit card issuer. Unglue.it is not liable for this and rights holders are liable for any pledge chargebacks. We encourage rights holders to provide clear, timely communication to their supporters throughout the campaign to ensure they remember what they pledged to and why.
      What happens if a supporter's credit card is declined?
      @@ -579,19 +523,19 @@ Need more ideas? We're happy to work with rights holders personally to craft a
      What happens if a buyer wants a refund?
      -
      Our policy is for 100% buyer satisfaction. We hold back a 30% reserve for 90 days to cover possible customer refunds.
      +
      Our policy is for 100% supporter satisfaction. We may hold back a 30% reserve for 90 days to cover possible customer refunds.
      Can I offer tax deductions to people who pledge to my campaign?
      -
      If you are a 501(c)3 or similar, please consult your own attorneys and accountants about the tax deductibility of ungluers' contributions. Unglue.it cannot offer tax deductions or advice.
      +
      If you are a 501(c)3 or similar, please consult your own attorneys and accountants about the tax deductibility of ungluers' pledged. Donations to the Free Ebook Foundation are tax deductible in the USA; rights holders are not involved.
      How do I know when I have started fundraising?
      -
      Unglue.it will be in communication with you about when campaigns should go live. On your rights holder dashboard, you will be able to see all works you have claimed and the status of any associated campaigns.
      +
      Unglue.it will be in communication with you about when campaigns should go live. On your rights holder tools page, you will be able to see all works you have claimed and the status of any associated campaigns.
      When and how will I be paid?
      -
      • For Pledge Campaigns: After we reach the threshold price Unglue.it will issue you a closing memo, which will cover your gross and net proceeds. Unglue.it will hold the proceeds until you deliver an ePub file meeting Unglue.it's quality standards, at which point Unglue.it will send you a check. If Unglue.it does not receive a suitable ePub file within 90 days, we will deduct conversion costs from your funds and release the rest to you.
      • +
        • For Pledge Campaigns: After we reach the threshold price Unglue.it will issue you a closing memo, which will cover your gross and net proceeds. Unglue.it will hold the proceeds until you deliver an EPUB file meeting Unglue.it's quality standards, at which point Unglue.it will send you a check. If Unglue.it does not receive a suitable EPUB file within 90 days, we will deduct conversion costs from your funds and release the rest to you.
        • For Buy-to-Unglue Campaigns and Thanks-for-Ungluing Campaigns: We make payments quarterly to rights holders who have accrued more than $100 in earnings. If we are able to set you up with ACH transfers, we will send payments more frequently. 70% of earnings accrue immediately; the rest accrues after 90 days.
        @@ -612,17 +556,9 @@ If you're concerned a campaign may not reach its goal you have several options.
        Yes, the minimum funding goal is $500.
        -
        What fees does Unglue.it charge in a Pledge Campaign?
        +
        What fees does Unglue.it charge in a Fundraising Campaign?
        -
        When a campaign succeeds, Unglue.it will deduct a 6% commission (or $60, whichever is greater) on the funds raised. Our payment processor also charges a separate small fee on each transaction, plus (where relevant) currency conversion costs. If you do not have a suitable ePub version of your book available, you will also need to cover ebook conversion costs; please price this into your goal for a campaign. Details are spelled out in the Platform Services Agreement that rights holders must sign before launching an Unglue.it campaign.
        - -
        What fees does Unglue.it charge in a Buy-to-Unglue Campaign?
        - -
        For Buy-to-Unglue Campaigns, Unglue.it charges (1) a flat 25% of of revenue from ebook licenses it provides through its site or through partner sites and (2) a per-transaction charge of $0.25. These amounts include payment processor fees and any fees due to partner sites.
        - -
        What fees does Unglue.it charge in a Thanks-for-Ungluing Campaign?
        - -
        For Buy-to-Unglue Campaigns, Unglue.it charges (1) a flat 8% of of revenue from "thanks" payments it receives through its site and (2) a per-transaction charge of $0.25. These amounts include payment processor fees.
        +
        Fees and terms for each type of campaign are detailed on the program terms page.
        Does it cost money to start a campaign on Unglue.it?
        @@ -645,9 +581,9 @@ If you're concerned a campaign may not reach its goal you have several options.
        It is your responsibility to get advice on the current status of any contracts you may have ever had for the right to publish your work, whether or not a book is in print now. Creative Commons licenses are media neutral and worldwide (English). You may need waivers from other parties who have exclusive licenses for this book.
        -
        If I am a publisher, but I do not have an ebook royalty in my contract, can I sign your Platform Services Agreement?
        +
        If I am a publisher, but I do not have an ebook royalty in my contract, can I sign your Rights Holder Agreement?
        -
        We can't interpret your particular contract regarding subsidiary rights and your ability to use a Creative Commons license. Please seek qualified independent advice regarding the terms of your contract. In any event, you will also want the author to cooperate with you on a successful fundraising campaign, and you can work together to meet the warranties of the PSA.
        +
        We can't interpret your particular contract regarding subsidiary rights and your ability to use a Creative Commons license. Please seek qualified independent advice regarding the terms of your contract. In any event, you will also want the author to cooperate with you on a successful fundraising campaign, and you can work together to meet the warranties of the RHA.
        Are the copyright holder, and the rights holder who is eligible to start an Unglue.it campaign, the same person?
        diff --git a/frontend/templates/faqmenu.html b/frontend/templates/faqmenu.html index 48284b45..2efad932 100644 --- a/frontend/templates/faqmenu.html +++ b/frontend/templates/faqmenu.html @@ -7,15 +7,24 @@ All -
      • - Basics +
      • + About the site
      • +
      • + Unglued Ebooks + +
      • +
      • Campaigns
      • -
      • - Unglued Ebooks - -
      • For Rights Holders diff --git a/frontend/templates/notification/rights_holder_claim/full.txt b/frontend/templates/notification/rights_holder_claim/full.txt index dbaf4435..a8cb20a3 100644 --- a/frontend/templates/notification/rights_holder_claim/full.txt +++ b/frontend/templates/notification/rights_holder_claim/full.txt @@ -11,7 +11,6 @@ If you're running a Pledge Campaign, you need to decide on a funding target, and Finally, think about how you're going to publicize your campaign: social media, newsletters, media contacts, professional organizations, et cetera. Have a plan for how to reach out to these potential supporters before you launch your campaign. Your supporters' sense of connection with you and your book is key to your campaign's success. Again, email us if you'd like help. -We're thrilled to be working with you. {% endifequal %} {% ifequal claim.status 'pending' %} {{ claim.rights_holder }}'s claim to {{ claim.work.title }} (https://{{ current_site.domain }}{% url 'work' claim.work_id %}) on Unglue.it has been entered. diff --git a/frontend/templates/notification/rights_holder_claim/notice.html b/frontend/templates/notification/rights_holder_claim/notice.html index 611fd89b..c7bcf024 100644 --- a/frontend/templates/notification/rights_holder_claim/notice.html +++ b/frontend/templates/notification/rights_holder_claim/notice.html @@ -25,7 +25,6 @@ If you're running a Pledge Campaign, you need to decide on a funding target, and

        Finally, think about how you're going to publicize your campaign: social media, newsletters, media contacts, professional organizations, et cetera. Have a plan for how to reach out to these potential supporters before you launch your campaign. Your supporters' sense of connection with you and your book is key to your campaign's success. Again, email us if you'd like help. -We're thrilled to be working with you. {% endifequal %} {% ifequal claim.status 'pending' %} The claim for {{ claim.work.title }} will be examined, and we'll email you. Contact us if you need any help. diff --git a/frontend/templates/privacy.html b/frontend/templates/privacy.html index 6ecfa3ea..8c45a10a 100644 --- a/frontend/templates/privacy.html +++ b/frontend/templates/privacy.html @@ -90,7 +90,7 @@ We use avatar images from Twitter,
      • Internet Archive (Excellent privacy!)
      • @@ -115,7 +115,7 @@ We have used a small number of third party services that do not set cookies to t
        • -We've worked to pare this list down to one. Amazon S3. We disable logging for our S3 buckets, but we're not aware of any privacy commitment by Amazon Web Services regarding their logging practices for S3 (Simple Storage Service) separate from the Amazon privacy policies. But we can verify that S3 sets no tracking cookies. +Amazon S3. We disable logging for our S3 buckets, but we're not aware of any privacy commitment by Amazon Web Services regarding their logging practices for S3 (Simple Storage Service) separate from the Amazon privacy policies. But we can verify that S3 sets no tracking cookies.
        diff --git a/frontend/templates/rh_intro.html b/frontend/templates/rh_intro.html index d009141d..342dec85 100644 --- a/frontend/templates/rh_intro.html +++ b/frontend/templates/rh_intro.html @@ -10,6 +10,11 @@ If you're an author, publisher, or other rights holder, you can participate more

      +

      Distributing Free Books Through Unglue.it

      +

      Much of the "supply chain" for ebooks is fueled by a percentage of the ebook's purchase price. When the ebook is free, this supply chain stops running. When we started ungluing ebooks, we were were surprised that even library vendors had minimum prices for their ebooks. Working with partners such as the Internet Archive, the Digital Public Library of America, and New York Public Library, we set out to build a new supply chain that helps free ebooks have their potential impact. +

      +

      By adding a free-licensed ebook to the unglue.it database, you do a lot more than just add it to Unglue.it. We promote free ebooks on our website and on social networks. Our metadata syndication feeds help propagate that book around the world, into libraries, archives and communities. +

      Becoming an Unglue.it Rights Holder

        @@ -33,7 +38,11 @@ If you're an author, publisher, or other rights holder, you can participate more {% endif %}

      About Campaigns

      -

      If you have already released your work under a Creative Commons license, you need to use a "Thanks for Ungluing" campaign. If you have an EPUB file ready to sell, you should use a "Buy to Unglue" campaign. Otherwise, you'll want to offer rewards in a "Pledge-to-Unglue" campaign.

      +

      +Free licenses help ebooks accomplish their missions, but that doesn't mean their creators don't need financial support. Unglue.it has three programs to help creators find that support. +

      + +

      If you have already released your work under a Creative Commons license, you can use the "Thanks for Ungluing" program. If you have an EPUB file ready to sell, you can use the "Buy to Unglue" program. If you need to raise money to complete your ebook, you can offer rewards through the "Pledge-to-Unglue" program. To use one of these programs, you launch a "campaign".

      Thanks-for-Ungluing Campaigns

      @@ -47,8 +56,8 @@ There are no “rewards” for a “Buy to Unglue” campaign, but you may offer A Buy-to-Unglue Campaign provides long-term promotion and sales opportunities for your ebook before it becomes an Unglued Ebook. Until the revenue goal is reached, supporters and libraries know that every book that gets purchased through Unglue.it brings the ungluing date closer to the present.

      Pledge-to-Unglue Campaigns

      -

      For Pledge campaigns, you can run campaigns for books that haven't been converted to digital. -Any print book can be scanned to create a digital file that can then become an ePub-format unglued ebook to be released after the Pledge Campaign succeeds.

      +

      For Pledge campaigns, you can run campaigns for books that are incomplete or haven't been converted to digital. +Any print book can be scanned to create a digital file that can then become an unglued ebook to be released after the Pledge Campaign succeeds.

      Rewards

      Campaigns run for a short period (2-6 months) and can have rewards as a way to motivate and thank supporters for helping to reach your goal. You are strongly encouraged to add rewards - they are given special prominence on the campaign page.

      diff --git a/frontend/templates/rh_tools.html b/frontend/templates/rh_tools.html index 8189602e..d30b7a96 100644 --- a/frontend/templates/rh_tools.html +++ b/frontend/templates/rh_tools.html @@ -23,7 +23,8 @@ Any questions not covered here? Please email us at
    • Getting Started
    • -
    • Claiming Your Works
    • +
    • Distributing Free Books Through Unglue.it
    • +
    • Becoming an Unglue.it Rights Holder
    • About Campaigns
    diff --git a/frontend/templates/terms.html b/frontend/templates/terms.html index 27268e25..c9e80b11 100644 --- a/frontend/templates/terms.html +++ b/frontend/templates/terms.html @@ -52,7 +52,7 @@

    Use of the Service

    -

    Unless you are a Rights Holder who has entered into a Platform Services Agreement with the Company (the “PSA”), and in which case only as expressly authorized by the PSA, the Service is provided only for your personal, non-commercial use, and for use by libraries and similar non-profit entities.

    +

    Unless you are a Rights Holder who has entered into a Rights Holder Agreement with the Company (the “RHA”), and in which case only as expressly authorized by the RHA, the Service is provided only for your personal, non-commercial use, and for use by libraries and similar non-profit entities.

    You are solely responsible for all of your activity in connection with the Service and for any consequences (whether or not intended) of your posting or uploading of any material on the Website.

    @@ -256,7 +256,7 @@ The Free Ebook Foundation.
    41 Watchung Plaza, #132
    Montclair, NJ 07042
    USA
    -dmca@gluejar.com
    +info@ebookfoundation.org

    Electronic Delivery/Notice Policy and Your Consent

    diff --git a/frontend/urls.py b/frontend/urls.py index a55dfc3e..21bd36b1 100644 --- a/frontend/urls.py +++ b/frontend/urls.py @@ -121,7 +121,7 @@ urlpatterns = [ url(r"^feedback/campaign/(?P\d+)/?$", views.ask_rh, name="ask_rh"), url(r"^feedback/$", views.feedback, name="feedback"), url(r"^feedback/thanks/$", TemplateView.as_view(template_name="thanks.html")), - url(r"^about/$", TemplateView.as_view(template_name="about.html"), + url(r"^about/$", TemplateView.as_view(template_name="about_main.html"), name="about"), url(r"^comments/$", views.comment, name="comment"), url(r"^info/(?P[\w\.]*)$", views.InfoPageView.as_view()), diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 84706572..c4673867 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -2891,7 +2891,7 @@ def about(request, facet): try: return render(request, template) except TemplateDoesNotExist: - return render(request, "about.html") + return render(request, "about_main.html") def receive_gift(request, nonce): try: From a09f3907b32979612047b11b54223eef6414f8ad Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 20 Nov 2017 18:05:07 -0500 Subject: [PATCH 010/109] add pressbooks sites, improve pubdata scraper --- core/loaders/scrape.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index a55ca25a..d2f4f666 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -101,12 +101,19 @@ class BaseScraper(object): dd = dt.find_next_sibling('dd') if dt else None return dd.text if dd else None - def get_itemprop(self, name): + def get_itemprop(self, name, **attrs): value_list = [] + list_mode = attrs.pop('list_mode', 'list') attrs = {'itemprop': name} props = self.doc.find_all(attrs=attrs) for el in props: - value_list.append(el.text) + if list_mode == 'one_item': + return el.text if el.text else el.get('content') + else: + if el.text: + value_list.append(el.text) + elif el.has_key('content'): + value_list.append(el['content']) return value_list def setup(self): @@ -217,7 +224,9 @@ class BaseScraper(object): self.set('publisher', value) def get_pubdate(self): - value = self.check_metas(['citation_publication_date', 'DC.Date.issued', 'datePublished']) + value = self.get_itemprop('datePublished', list_mode='one_item') + if not value: + value = self.check_metas(['citation_publication_date', 'DC.Date.issued', 'datePublished']) if value: self.set('publication_date', value) @@ -311,8 +320,13 @@ class PressbooksScraper(BaseScraper): @classmethod def can_scrape(cls, url): + pb_sites = ['bookkernel.com','milnepublishing.geneseo.edu', 'pressbooks', + 'press.rebus.community','pb.unizin.org'] ''' return True if the class can scrape the URL ''' - return url.find('press.rebus.community') > 0 or url.find('pressbooks.com') > 0 + for site in pb_sites: + if url.find(site) > 0: + return True + return False class HathitrustScraper(BaseScraper): From 28fa60ffba3df23252a3039363782ac912c88863 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 21 Nov 2017 11:10:46 -0500 Subject: [PATCH 011/109] fix cover finding --- core/loaders/scrape.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index d2f4f666..09671bf0 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -257,7 +257,7 @@ class BaseScraper(object): block = block if block else self.doc img = block.find_all('img', src=CONTAINS_COVER) if img: - cover_uri = img[0].get('src', None) + image_url = img[0].get('src', None) if image_url: if not image_url.startswith('http'): image_url = urljoin(self.base, image_url) From af4cac5cf87ec4e099536dbe6770886d7063d715 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 21 Nov 2017 15:47:02 -0500 Subject: [PATCH 012/109] http should be a work id --- core/bookloader.py | 3 +-- .../commands/delete_dangling_editions.py | 22 +++++++++++++++++++ core/parameters.py | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 core/management/commands/delete_dangling_editions.py diff --git a/core/bookloader.py b/core/bookloader.py index c9dc7bd3..af494392 100755 --- a/core/bookloader.py +++ b/core/bookloader.py @@ -735,7 +735,7 @@ class LookupFailure(Exception): IDTABLE = [('librarything', 'ltwk'), ('goodreads', 'gdrd'), ('openlibrary', 'olwk'), ('gutenberg', 'gtbg'), ('isbn', 'isbn'), ('oclc', 'oclc'), - ('edition_id', 'edid'), ('googlebooks', 'goog'), ('doi', 'doi'), ('http','http'), + ('googlebooks', 'goog'), ('doi', 'doi'), ('http','http'), ('edition_id', 'edid'), ] def load_from_yaml(yaml_url, test_mode=False): @@ -836,7 +836,6 @@ class BasePandataLoader(object): # only need to create edid if there is no edition id for the edition new_ids.append((identifier, id_code, value)) - if not work: work = models.Work.objects.create(title=metadata.title, language=metadata.language) if not edition: diff --git a/core/management/commands/delete_dangling_editions.py b/core/management/commands/delete_dangling_editions.py new file mode 100644 index 00000000..2c69c341 --- /dev/null +++ b/core/management/commands/delete_dangling_editions.py @@ -0,0 +1,22 @@ +from __future__ import print_function + +from django.core.management.base import BaseCommand +from django.db import IntegrityError + +from regluit.core import models + +class Command(BaseCommand): + help = "clean work and edition titles, work descriptions, and author and publisher names" + + def handle(self, **options): + for ident in models.Identifier.objects.filter(type='http', edition__isnull=False): + ident.edition = None + ident.save() + for edition in models.Edition.objects.filter(work__isnull=True): + for ident in edition.identifiers.all(): + if ident.work: + edition.work = work + edition.save() + break + if not edition.work: + edition.delete() \ No newline at end of file diff --git a/core/parameters.py b/core/parameters.py index 29141e3a..4f796e53 100644 --- a/core/parameters.py +++ b/core/parameters.py @@ -42,7 +42,7 @@ OTHER_ID_CHOICES = ( ('edid', 'pragmatic edition ID'), ) -WORK_IDENTIFIERS = ('doi','olwk','glue','ltwk') +WORK_IDENTIFIERS = ('doi','olwk','glue','ltwk', 'http') ID_CHOICES_MAP = dict(ID_CHOICES) From 6e945e35c60859512beb56005cc887b89f09595e Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Wed, 22 Nov 2017 14:54:01 -0800 Subject: [PATCH 013/109] with this configuration, I was able to build please.unglue.it on FEF account -- yielding a setup with Python 2.7.6 --- vagrant/Vagrantfile | 27 +++++++++++++++++++++------ vagrant/dev.yml | 6 +++--- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index 4b15c261..5d21e28e 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -31,7 +31,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e class=please", "-e hostname=please.unglue.it", "-e setdns=true", - "-e branch=master", + "-e branch=xenial", # "--start-at-task=restart_here" ] end @@ -56,20 +56,36 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| #aws.instance_type="t1.micro" aws.instance_type="m1.small" - aws.region = "us-east-1" - aws.availability_zone = "us-east-1c" + # aws.region = "us-east-1" + # aws.availability_zone = "us-east-1c" # 2015.05.05 # aws.ami = "ami-d8132bb0" # 2016.03.01 # aws.ami = "ami-03dcdd69" # 2017.03.17 # Trusty 14.04 + # aws.ami = "ami-9fde7f89" + # put into just security group + # aws.security_groups = ["just"] + + # FEF + + aws.instance_type="m1.small" + aws.region = "us-east-1" + aws.availability_zone = "us-east-1a" + # 2017.03.17 + # Trusty 14.04 aws.ami = "ami-9fde7f89" # put into just security group - aws.security_groups = ["just"] + # regluit-pub-a + aws.subnet_id = "subnet-a97777e0" + # SSHAccesss, please_ec2 + aws.associate_public_ip = true + aws.security_groups = ["sg-93aed0ef", "sg-f6a1df8a"] + aws.tags = { - 'Name' => 'please_vagrant' + 'Name' => 'please_vagrant' } override.vm.box = "dummy" @@ -85,7 +101,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| node.vm.network "private_network", type: "dhcp" #node.vm.network "private_network", ip: "192.168.33.10" - node.ssh.forward_agent = true node.vm.provision 'ansible' do |ansible| diff --git a/vagrant/dev.yml b/vagrant/dev.yml index 008cfdf2..59d6acd1 100644 --- a/vagrant/dev.yml +++ b/vagrant/dev.yml @@ -55,9 +55,9 @@ tasks: # add repo to get latest version of python 2.7 - - name: add-apt-repository ppa:fkrull/deadsnakes-python2.7 - apt_repository: repo='ppa:fkrull/deadsnakes-python2.7' state=present update_cache=true - when: class in ['please', 'just', 'prod'] + # - name: add-apt-repository ppa:fkrull/deadsnakes-python2.7 + # apt_repository: repo='ppa:fkrull/deadsnakes-python2.7' state=present update_cache=true + # when: class in ['please', 'just', 'prod'] - name: do apt-get update --fix-missing command: apt-get update --fix-missing From 341a3133713860e98aa36afeb9e4acb7d5b549d2 Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Mon, 27 Nov 2017 11:53:52 -0800 Subject: [PATCH 014/109] This works basically for installing xenial on please --- vagrant/Vagrantfile | 13 +++++++++++-- vagrant/dev.yml | 9 +++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index 5d21e28e..d29f7150 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -68,6 +68,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # put into just security group # aws.security_groups = ["just"] + # FEF aws.instance_type="m1.small" @@ -75,7 +76,11 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| aws.availability_zone = "us-east-1a" # 2017.03.17 # Trusty 14.04 - aws.ami = "ami-9fde7f89" + # aws.ami = "ami-9fde7f89" + # 2017.11.22 + # Xenial 16.04 + # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 + aws.ami = "ami-aa2ea6d0" # put into just security group # regluit-pub-a aws.subnet_id = "subnet-a97777e0" @@ -141,7 +146,11 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # aws.ami = "ami-d8132bb0" # 2017.03.17 # Trusty 14.04 - aws.ami = "ami-9fde7f89" + # aws.ami = "ami-9fde7f89" + # 2017.11.22 + # Xenial 16.04 + # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 + aws.ami = "ami-aa2ea6d0" aws.security_groups = ["just"] diff --git a/vagrant/dev.yml b/vagrant/dev.yml index 59d6acd1..65b6ee7f 100644 --- a/vagrant/dev.yml +++ b/vagrant/dev.yml @@ -44,7 +44,14 @@ migrate: "{{do_migrate | default('true')}}" sudo: yes + gather_facts: False pre_tasks: + - name: Install python for Ansible + raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) + register: output + changed_when: output.stdout != "" + tags: always + - setup: # aka gather_facts - name: check apt last update stat: path=/var/cache/apt register: apt_cache_stat @@ -52,6 +59,7 @@ apt: update_cache=yes when: ansible_date_time.epoch|float - apt_cache_stat.stat.mtime > 60*60*12 + tasks: # add repo to get latest version of python 2.7 @@ -66,6 +74,7 @@ apt: pkg={{ item }} update_cache=yes state=present with_items: - python2.7 + - python-pip - git-core - apache2 - cronolog From d134ef06060b420213ae7a6b97f9bf10621ca8b8 Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Mon, 27 Nov 2017 12:40:03 -0800 Subject: [PATCH 015/109] core.WorkTests.test_valid_subject were technically not working correctly because the test strings should be unicode not str --- core/tests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/tests.py b/core/tests.py index 29e01483..d059b35c 100755 --- a/core/tests.py +++ b/core/tests.py @@ -890,10 +890,10 @@ class WorkTests(TestCase): self.assertEqual(e2, self.w2.preferred_edition) def test_valid_subject(self): - self.assertTrue(valid_subject('A, valid, suj\xc3t')) - self.assertFalse(valid_subject('A, valid, suj\xc3t, ')) - self.assertFalse(valid_subject('A valid suj\xc3t \x01')) - Subject.set_by_name('A, valid, suj\xc3t; A, valid, suj\xc3t, ', work=self.w1) + self.assertTrue(valid_subject(u'A, valid, suj\xc3t')) + self.assertFalse(valid_subject(u'A, valid, suj\xc3t, ')) + self.assertFalse(valid_subject(u'A valid suj\xc3t \x01')) + Subject.set_by_name(u'A, valid, suj\xc3t; A, valid, suj\xc3t, ', work=self.w1) self.assertEqual(1, self.w1.subjects.count()) sub = Subject.set_by_name('nyt:hardcover_advice=2011-06-18', work=self.w1) self.assertEqual(sub.name, 'NYT Bestseller - Hardcover advice') From a4917a6d7da67e386501407f8bdf34aeea2baf1e Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Mon, 27 Nov 2017 14:37:07 -0800 Subject: [PATCH 016/109] I have the right parameters for firing just2 on xenial on FEF -- but the db parameters are not right --- vagrant/Vagrantfile | 46 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index d29f7150..91e1239e 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -84,7 +84,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # put into just security group # regluit-pub-a aws.subnet_id = "subnet-a97777e0" - # SSHAccesss, please_ec2 + # SSHAccesss, just_ec2 aws.associate_public_ip = true aws.security_groups = ["sg-93aed0ef", "sg-f6a1df8a"] @@ -119,7 +119,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e class=just", "-e hostname=just.unglue.it", "-e setdns=false", - "-e branch=master", + "-e branch=xenial", "-e do_migrate=false" ] @@ -142,7 +142,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| aws.instance_type="m1.small" aws.region = "us-east-1" - aws.availability_zone = "us-east-1c" + aws.availability_zone = "us-east-1a" # aws.ami = "ami-d8132bb0" # 2017.03.17 # Trusty 14.04 @@ -152,7 +152,13 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 aws.ami = "ami-aa2ea6d0" - aws.security_groups = ["just"] + # aws.security_groups = ["just"] + + # regluit-pub-a + aws.subnet_id = "subnet-a97777e0" + # SSHAccesss, just_ec2 + aws.associate_public_ip = true + aws.security_groups = ["sg-93aed0ef", "sg-e0b1b59f"] aws.tags = { 'Name' => 'just_vagrant' @@ -185,7 +191,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e class=just", "-e hostname=just2.unglue.it", "-e setdns=false", - "-e branch=master", + "-e branch=xenial", "-e do_migrate=false" ] @@ -208,13 +214,23 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| aws.instance_type="m1.small" aws.region = "us-east-1" - aws.availability_zone = "us-east-1c" + aws.availability_zone = "us-east-1a" # aws.ami = "ami-d8132bb0" # 2017.03.17 # Trusty 14.04 - aws.ami = "ami-9fde7f89" + # aws.ami = "ami-9fde7f89" + # 2017.11.22 + # Xenial 16.04 + # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 + aws.ami = "ami-aa2ea6d0" - aws.security_groups = ["just"] + + # aws.security_groups = ["just"] + # regluit-pub-a + aws.subnet_id = "subnet-a97777e0" + # SSHAccesss, just_ec2 + aws.associate_public_ip = true + aws.security_groups = ["sg-93aed0ef", "sg-e0b1b59f"] aws.tags = { 'Name' => 'just2_vagrant' @@ -274,7 +290,12 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # aws.ami = "ami-d8132bb0" # 2017.03.17 # Trusty 14.04 - aws.ami = "ami-9fde7f89" + # aws.ami = "ami-9fde7f89" + # 2017.11.22 + # Xenial 16.04 + # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 + aws.ami = "ami-aa2ea6d0" + aws.security_groups = ["web-production"] @@ -336,7 +357,12 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # aws.ami = "ami-d8132bb0" # 2017.03.17 # Trusty 14.04 - aws.ami = "ami-9fde7f89" + # aws.ami = "ami-9fde7f89" + # 2017.11.22 + # Xenial 16.04 + # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 + aws.ami = "ami-aa2ea6d0" + aws.security_groups = ["web-production"] From fe48cb50794206ad09799f694545c78942cd877d Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Mon, 27 Nov 2017 14:45:28 -0800 Subject: [PATCH 017/109] update DATABASE_HOST for just --- vagrant/host_vars/just2/secrets.yml | 137 +++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) mode change 120000 => 100644 vagrant/host_vars/just2/secrets.yml diff --git a/vagrant/host_vars/just2/secrets.yml b/vagrant/host_vars/just2/secrets.yml deleted file mode 120000 index a71bea0b..00000000 --- a/vagrant/host_vars/just2/secrets.yml +++ /dev/null @@ -1 +0,0 @@ -../just/secrets.yml \ No newline at end of file diff --git a/vagrant/host_vars/just2/secrets.yml b/vagrant/host_vars/just2/secrets.yml new file mode 100644 index 00000000..32afb83e --- /dev/null +++ b/vagrant/host_vars/just2/secrets.yml @@ -0,0 +1,136 @@ +$ANSIBLE_VAULT;1.1;AES256 +31306466653334343035396565366636653463316531633364323630653138363961376538346336 +3232366433613236306135323563383861616266663362380a326330633764653362353166633264 +66386238343164666438333230643537643439313832343563333734656534636335663463303163 +3135383930633035630a373236666134643837366161643336613034613230313737343261396235 +37653564646163666338633865323663396136366337343065356366393765363862353665363965 +38613835386532386338323139636331333232643766316133396161323366306161323535616432 +34373137336435376334633661363437366661386263393537616231653830306437653837323461 +65363865636261313666386462336563326538343363326231626631343834653030373366643431 +34323736626261366566303761353631663234303537653036303332303131376562336466303535 +61633437316433373134323936323262363666356439376432336362333634633664313264363339 +37623233366435663438366432333939313339366664643738373434343964616230643363666161 +62343732666532356435306264623731613334326161383563396338633938653931636338316533 +32626538306335326334336336336539303432633761343334666166313135323237623666323237 +39383030303063646462316365303163623331653931613131633533383664336132373333326330 +34353364653437623232643532373766393736636332376266366636386438366334323863643764 +33646632343630636333306638393931303039613534343835613639346466393430373034383761 +39353335336561643062316132353933313131653532396365326232623239396636306434633830 +39336239653933643765326361383534336638646361313639623936626664323636613334303132 +39313432343165393034646264336538383663623061633338643866633134376166633238383562 +39616334373431613166643064663637333235353466326162613738643861663164306266306532 +39313162656164666233636637306264313465383731303330353933376164663039613261396436 +38356462303035316565613566323332646162386230366562313261333336363830623964363738 +36666564323539376538383332656263633762303962306335396538613631383435386666306437 +62663333303161313730643238356634336430323161613766653166623934646161306662623535 +63643361386639623662656630633735653665643034616632626531353066333731633132393166 +34366331383539363665343666323539313032356337613066633737383532363636396165383631 +35643032623130393762656466376362363232356133363637386462613138613131373533653532 +37393237393332663464353139393337336634396333356162326363626630626139383934396362 +32353435343365666363383637303562346237386634363433613562363639636561393161626537 +65353966623162363864626331363336396434656664626431646235386135613335663237653634 +31393436633165666232623638626361346236306264626433623463323433333434366638383566 +61643236303061666466346532613764316563303232633535363738316137313662633532646266 +62633565353039323337386635383338626633323564616263616230643239663866396532636239 +39666162663138383838396162666130343236326635336330616163663236376463323936363235 +35643931373234346561383337303461643036353332333466663331346232363139323330323337 +31653939633266643930333838653735343062313334366337353264393632313039646264396162 +62323264303162393861646134666138353663396439643462353762613366373161316530626639 +37373435343630643939663237653536376237316437663735333538313639366534373035323163 +63353964663864333737363638636436633065343930323439633766376136353932653536366538 +32366530666431663266326464613431663464653539633433333365323834343335383039346264 +38383234353635656434623662656463326435333562326239626433393637323866363135613230 +31396462366164623531363034383732613338323532316335656466623735623436653132303464 +34323335376565303866383137316638323637646430383364313030613234633566623263323636 +64363436623233366436306566303535333065663662346562313035633265363432343139303862 +30643865656538376533313138613038653461663835383834633030396535333130343563343662 +63343132396237626162663466613236306631623666633430313665303637666463643931393239 +32626461323330616466353961363435666635353732623537653230363832306461643163336533 +37316261656237653438333532343661306634643034633162383639323864646636626535633733 +31343035303262613831636566656264333035333939643565356332656131613834653364366661 +34623332396532303238373936373364393332363663393866353563636334386661616133663131 +62653666393738336338326233306539663766633461653537353033316137646266656438383062 +35316630343963393637646263353366666535653731353161613437383131613937386362616130 +38646332386638343436363762633164646336366530373630303538613764666434613338346531 +38393531393466383933353232386236376535376137316261356632643066316433323636376237 +33383139656364346431353131343531396635363961623265343361373838323739376164376335 +63393139623630356131383563393431613435373935396632383233313733386465633335366562 +30653933343536656464376365353635353063326263376137343136623566623534323931633461 +36656566336465623739356362653931346131643234626165633131346462396131396361613236 +38376563363137316338373262386362366261373335383932376334356165643565313130643533 +65313138373734633562353164636662623733303738366539326238343636306665336238313161 +38643331333637393739373961303131623735336634303562336438333631383066626633643635 +38353039323963666361333431363839643533396434366462656334353938363962376138666137 +66623938656265663865356130613233336635633531326236333464376233333231393363366266 +66316231333536613630376565626537356239356262633836613963656562356365313134316336 +61326264666439376264313166313962663036643035373935376137353264643835613566383365 +35333037626663343630373936643939646534653966366435383830393866616266663866363331 +31623261393063316134656130353236346131353334666230663232333038353039646535626564 +36633730333137386239383136646566613562656139373436303864363163363261323831633738 +62336535313139616664313236363436373538613132373363323061613031363039636461346630 +30643432643062303035346137656135373866303063623739316262383530623939353763393132 +33306439393435316138333736653530366633323339653961666636633765653064316464393261 +61386233626661363063346666643563613963316336663338633666613464336135656261363639 +61626661303536346635646137303461346638326162396638346139623634306565366431373039 +61613661303934656333333064323032303761353361613530663365633737613162326539663061 +39333436353261386537383131623239666439316539376564333936303464636635303264623263 +66623238653465646666633030373435323761613138326235636365333031653332373639313839 +63646461333961316663316639326439346130306566346363313839343361653362363430383530 +66303761303435393661326532643630303630386331663539633639353039376661366133646135 +39376632343738373436376132636562363237633466383430326538373566313635643831376131 +64363037316535366435353931346635623234313935313631343439636361333534363134336361 +31333261333763623532313338613434626139656633366234643139343739356137313438346639 +34333064386464333536303533323633613439366636663638613164353336396362613537363936 +65336330623764613135316234396262363661306433373465666532643638643434383861303366 +35366339306239356432363866323264363130346335623064626238363630326166613631613432 +32343363626331366530343563333434353365383464363834653965333234386436343763336233 +36346230663162643534363534336530336266653732623537383765643131343733373732636136 +39326636643832326430313839643865653938316336343036373331623432636565366266353134 +35383135316266303333353266393036653235343939613930363563326334326366653336663631 +64366531613562363634666362653366343064613439373664393466353136643730316466356362 +65346266626563306236636438626461623366643735333638316164386133636535336164396231 +63373064653139626263326562383931326364643831386430663961393238643866616164613737 +30393863343665386362616131633465313938316433346466633930396666366565316364636537 +37663137613136313765623130303632323934633435386363336333363665643935643865333031 +33666533376238316633666334303663373564643663393763653737316434666530323036393238 +35353030306165626331333833326663383263353963663831323065343966323064633138653964 +39646231663730623533373737643633343166653166386337646239313030353536633138353135 +39306563646131396263313834316661613364353734353366663838366561353430646638363063 +30623063353865653064616163346565353933323864303534373034346266656637333164323037 +34383832323331336538643363623236373935316562376230306664643966616263343934383636 +66646466393330323762643963663035343966353764646635623238626164613037353532633439 +37653430373836616535663164376164363236613636343135356239636137396435643063656664 +33356333646562383063396338643936366332663036363466323866376333376236366537323061 +64646666613737343839623861393562383762393933336637393462613835636630303263336562 +33613435323730356565373361646432653961636164343562356237623936373738656334643562 +33396232616632643265636264363839333261323735383436326166383330336533316463663265 +61663838643961363531643738313838333231616662303531326261326332343938313861656536 +63323462653334373566343431613231636335623462306239353565336261353432383761623531 +62386564366465333361636239383737353935323561623437383461366237626537616636326563 +39646566333338313638336232393338633434666439313935306363613238636530373139376535 +34343136393465623034653538303265376464326566663335303736666338373637356561653931 +35653235346661333539303332343066396634323331356462613439663135353938366461646339 +31646339373562653737653163636363396563363664376432346335613734393130616361343536 +65663534363631393261613431653730666139643735386337656239393261356135663433643964 +62386264613938393031373163653763376532303236323630646662663436626564333561343361 +34396262336230326635313339636437393865646239613937633839666662303065366134643362 +30616561353365336431363463306262363665633839306334376234373265316232383865343466 +31643736336336653534383966613264353635306231623361643764623035393164663034356661 +36346434313132346362363433613834643830656537373366366633376562323330363231623635 +37396638393739333039663037386538313231386462306662303430623761373237373364356239 +37383430626131616438643266643333333661363162626361323739343364616636623733616138 +33636331663332353730623061613030653936303239356564646162326639373565353064336634 +36616330323734666466633039646166333935663930636438346236343363633534383736303763 +63346430643837333039366363313561386334326263383665333339376461306264393439666135 +32633961353762373337616230643338306234363936336362333861643238353134623132356564 +36656338643366363334383266346266353035356230313264356637333866386634303738343332 +66336237653137356534373431383830613464323663326631616232653739636362376165623763 +39393135376561343463616665643466346564333639643632616361343938636461643561383362 +39633163376436346462373962343936623561363330653666393032366265343063653231303531 +63663662333836353831333965323236353961396232666234623363313265663464616430663235 +32613535336336363362613936366639356636643866663339376133333436633437636261336438 +30346330393864323533373763366638653331663137663436626362356363613333366134373762 +36386331313030316164336161363133373131623136653062653638666531643630343766623363 +39363236343938313937343635346564303463313639303334393966316238623765653639663761 +65373731653037633735373566313239316439613131336565343632346235396665306235303432 +333134643737646436663439666566323530 From 7a931966824e0be79aa8414aba60cbe0e02cb33a Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Mon, 27 Nov 2017 14:47:17 -0800 Subject: [PATCH 018/109] ooops I ended up severing tie between secrets.yml for just and just2 --- vagrant/host_vars/just2/secrets.yml | 137 +--------------------------- 1 file changed, 1 insertion(+), 136 deletions(-) mode change 100644 => 120000 vagrant/host_vars/just2/secrets.yml diff --git a/vagrant/host_vars/just2/secrets.yml b/vagrant/host_vars/just2/secrets.yml deleted file mode 100644 index 32afb83e..00000000 --- a/vagrant/host_vars/just2/secrets.yml +++ /dev/null @@ -1,136 +0,0 @@ -$ANSIBLE_VAULT;1.1;AES256 -31306466653334343035396565366636653463316531633364323630653138363961376538346336 -3232366433613236306135323563383861616266663362380a326330633764653362353166633264 -66386238343164666438333230643537643439313832343563333734656534636335663463303163 -3135383930633035630a373236666134643837366161643336613034613230313737343261396235 -37653564646163666338633865323663396136366337343065356366393765363862353665363965 -38613835386532386338323139636331333232643766316133396161323366306161323535616432 -34373137336435376334633661363437366661386263393537616231653830306437653837323461 -65363865636261313666386462336563326538343363326231626631343834653030373366643431 -34323736626261366566303761353631663234303537653036303332303131376562336466303535 -61633437316433373134323936323262363666356439376432336362333634633664313264363339 -37623233366435663438366432333939313339366664643738373434343964616230643363666161 -62343732666532356435306264623731613334326161383563396338633938653931636338316533 -32626538306335326334336336336539303432633761343334666166313135323237623666323237 -39383030303063646462316365303163623331653931613131633533383664336132373333326330 -34353364653437623232643532373766393736636332376266366636386438366334323863643764 -33646632343630636333306638393931303039613534343835613639346466393430373034383761 -39353335336561643062316132353933313131653532396365326232623239396636306434633830 -39336239653933643765326361383534336638646361313639623936626664323636613334303132 -39313432343165393034646264336538383663623061633338643866633134376166633238383562 -39616334373431613166643064663637333235353466326162613738643861663164306266306532 -39313162656164666233636637306264313465383731303330353933376164663039613261396436 -38356462303035316565613566323332646162386230366562313261333336363830623964363738 -36666564323539376538383332656263633762303962306335396538613631383435386666306437 -62663333303161313730643238356634336430323161613766653166623934646161306662623535 -63643361386639623662656630633735653665643034616632626531353066333731633132393166 -34366331383539363665343666323539313032356337613066633737383532363636396165383631 -35643032623130393762656466376362363232356133363637386462613138613131373533653532 -37393237393332663464353139393337336634396333356162326363626630626139383934396362 -32353435343365666363383637303562346237386634363433613562363639636561393161626537 -65353966623162363864626331363336396434656664626431646235386135613335663237653634 -31393436633165666232623638626361346236306264626433623463323433333434366638383566 -61643236303061666466346532613764316563303232633535363738316137313662633532646266 -62633565353039323337386635383338626633323564616263616230643239663866396532636239 -39666162663138383838396162666130343236326635336330616163663236376463323936363235 -35643931373234346561383337303461643036353332333466663331346232363139323330323337 -31653939633266643930333838653735343062313334366337353264393632313039646264396162 -62323264303162393861646134666138353663396439643462353762613366373161316530626639 -37373435343630643939663237653536376237316437663735333538313639366534373035323163 -63353964663864333737363638636436633065343930323439633766376136353932653536366538 -32366530666431663266326464613431663464653539633433333365323834343335383039346264 -38383234353635656434623662656463326435333562326239626433393637323866363135613230 -31396462366164623531363034383732613338323532316335656466623735623436653132303464 -34323335376565303866383137316638323637646430383364313030613234633566623263323636 -64363436623233366436306566303535333065663662346562313035633265363432343139303862 -30643865656538376533313138613038653461663835383834633030396535333130343563343662 -63343132396237626162663466613236306631623666633430313665303637666463643931393239 -32626461323330616466353961363435666635353732623537653230363832306461643163336533 -37316261656237653438333532343661306634643034633162383639323864646636626535633733 -31343035303262613831636566656264333035333939643565356332656131613834653364366661 -34623332396532303238373936373364393332363663393866353563636334386661616133663131 -62653666393738336338326233306539663766633461653537353033316137646266656438383062 -35316630343963393637646263353366666535653731353161613437383131613937386362616130 -38646332386638343436363762633164646336366530373630303538613764666434613338346531 -38393531393466383933353232386236376535376137316261356632643066316433323636376237 -33383139656364346431353131343531396635363961623265343361373838323739376164376335 -63393139623630356131383563393431613435373935396632383233313733386465633335366562 -30653933343536656464376365353635353063326263376137343136623566623534323931633461 -36656566336465623739356362653931346131643234626165633131346462396131396361613236 -38376563363137316338373262386362366261373335383932376334356165643565313130643533 -65313138373734633562353164636662623733303738366539326238343636306665336238313161 -38643331333637393739373961303131623735336634303562336438333631383066626633643635 -38353039323963666361333431363839643533396434366462656334353938363962376138666137 -66623938656265663865356130613233336635633531326236333464376233333231393363366266 -66316231333536613630376565626537356239356262633836613963656562356365313134316336 -61326264666439376264313166313962663036643035373935376137353264643835613566383365 -35333037626663343630373936643939646534653966366435383830393866616266663866363331 -31623261393063316134656130353236346131353334666230663232333038353039646535626564 -36633730333137386239383136646566613562656139373436303864363163363261323831633738 -62336535313139616664313236363436373538613132373363323061613031363039636461346630 -30643432643062303035346137656135373866303063623739316262383530623939353763393132 -33306439393435316138333736653530366633323339653961666636633765653064316464393261 -61386233626661363063346666643563613963316336663338633666613464336135656261363639 -61626661303536346635646137303461346638326162396638346139623634306565366431373039 -61613661303934656333333064323032303761353361613530663365633737613162326539663061 -39333436353261386537383131623239666439316539376564333936303464636635303264623263 -66623238653465646666633030373435323761613138326235636365333031653332373639313839 -63646461333961316663316639326439346130306566346363313839343361653362363430383530 -66303761303435393661326532643630303630386331663539633639353039376661366133646135 -39376632343738373436376132636562363237633466383430326538373566313635643831376131 -64363037316535366435353931346635623234313935313631343439636361333534363134336361 -31333261333763623532313338613434626139656633366234643139343739356137313438346639 -34333064386464333536303533323633613439366636663638613164353336396362613537363936 -65336330623764613135316234396262363661306433373465666532643638643434383861303366 -35366339306239356432363866323264363130346335623064626238363630326166613631613432 -32343363626331366530343563333434353365383464363834653965333234386436343763336233 -36346230663162643534363534336530336266653732623537383765643131343733373732636136 -39326636643832326430313839643865653938316336343036373331623432636565366266353134 -35383135316266303333353266393036653235343939613930363563326334326366653336663631 -64366531613562363634666362653366343064613439373664393466353136643730316466356362 -65346266626563306236636438626461623366643735333638316164386133636535336164396231 -63373064653139626263326562383931326364643831386430663961393238643866616164613737 -30393863343665386362616131633465313938316433346466633930396666366565316364636537 -37663137613136313765623130303632323934633435386363336333363665643935643865333031 -33666533376238316633666334303663373564643663393763653737316434666530323036393238 -35353030306165626331333833326663383263353963663831323065343966323064633138653964 -39646231663730623533373737643633343166653166386337646239313030353536633138353135 -39306563646131396263313834316661613364353734353366663838366561353430646638363063 -30623063353865653064616163346565353933323864303534373034346266656637333164323037 -34383832323331336538643363623236373935316562376230306664643966616263343934383636 -66646466393330323762643963663035343966353764646635623238626164613037353532633439 -37653430373836616535663164376164363236613636343135356239636137396435643063656664 -33356333646562383063396338643936366332663036363466323866376333376236366537323061 -64646666613737343839623861393562383762393933336637393462613835636630303263336562 -33613435323730356565373361646432653961636164343562356237623936373738656334643562 -33396232616632643265636264363839333261323735383436326166383330336533316463663265 -61663838643961363531643738313838333231616662303531326261326332343938313861656536 -63323462653334373566343431613231636335623462306239353565336261353432383761623531 -62386564366465333361636239383737353935323561623437383461366237626537616636326563 -39646566333338313638336232393338633434666439313935306363613238636530373139376535 -34343136393465623034653538303265376464326566663335303736666338373637356561653931 -35653235346661333539303332343066396634323331356462613439663135353938366461646339 -31646339373562653737653163636363396563363664376432346335613734393130616361343536 -65663534363631393261613431653730666139643735386337656239393261356135663433643964 -62386264613938393031373163653763376532303236323630646662663436626564333561343361 -34396262336230326635313339636437393865646239613937633839666662303065366134643362 -30616561353365336431363463306262363665633839306334376234373265316232383865343466 -31643736336336653534383966613264353635306231623361643764623035393164663034356661 -36346434313132346362363433613834643830656537373366366633376562323330363231623635 -37396638393739333039663037386538313231386462306662303430623761373237373364356239 -37383430626131616438643266643333333661363162626361323739343364616636623733616138 -33636331663332353730623061613030653936303239356564646162326639373565353064336634 -36616330323734666466633039646166333935663930636438346236343363633534383736303763 -63346430643837333039366363313561386334326263383665333339376461306264393439666135 -32633961353762373337616230643338306234363936336362333861643238353134623132356564 -36656338643366363334383266346266353035356230313264356637333866386634303738343332 -66336237653137356534373431383830613464323663326631616232653739636362376165623763 -39393135376561343463616665643466346564333639643632616361343938636461643561383362 -39633163376436346462373962343936623561363330653666393032366265343063653231303531 -63663662333836353831333965323236353961396232666234623363313265663464616430663235 -32613535336336363362613936366639356636643866663339376133333436633437636261336438 -30346330393864323533373763366638653331663137663436626362356363613333366134373762 -36386331313030316164336161363133373131623136653062653638666531643630343766623363 -39363236343938313937343635346564303463313639303334393966316238623765653639663761 -65373731653037633735373566313239316439613131336565343632346235396665306235303432 -333134643737646436663439666566323530 diff --git a/vagrant/host_vars/just2/secrets.yml b/vagrant/host_vars/just2/secrets.yml new file mode 120000 index 00000000..a71bea0b --- /dev/null +++ b/vagrant/host_vars/just2/secrets.yml @@ -0,0 +1 @@ +../just/secrets.yml \ No newline at end of file From 0e48cdfa2adec64095fbd467a706d935c4799112 Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Mon, 27 Nov 2017 14:51:47 -0800 Subject: [PATCH 019/109] update database parameters for just --- vagrant/host_vars/just/secrets.yml | 266 +++++++++++++++-------------- 1 file changed, 135 insertions(+), 131 deletions(-) diff --git a/vagrant/host_vars/just/secrets.yml b/vagrant/host_vars/just/secrets.yml index 3a0e81fb..fb20c325 100644 --- a/vagrant/host_vars/just/secrets.yml +++ b/vagrant/host_vars/just/secrets.yml @@ -1,132 +1,136 @@ $ANSIBLE_VAULT;1.1;AES256 -65633664633266336236373164373930656232376137326263363834343462363038633563356361 -3437323964313539323466316435643937326436623237370a353331616530653562303361353233 -39323837646538613263396461353361356332623362343630323632343036666661306639363936 -6461623063626266610a343061313861643961316538373866663236623139386638363936313333 -39633931623337353939376634383038656239626530363166663437653166356165313435383333 -62393938623161663638383064663062323834613062386363393665363333323833653030333237 -36316338346633633930643931313862376462303165616663666530333733646632343532313564 -38396439323964363637396230326337323761643264633531653563613434326539333236373138 -61663438353238623737343465313234313136656338373834306432363539363234636533316335 -62643634356133333037373265636130356638666437343031303864383533343330383565323866 -66376663393032306330653732376263653132636564363065613738616535656236663030333366 -34653566633331613861636466613138353536396566626538383037653730353461633735646165 -62373962313366653064363532303134623938393637623664323331313765383066326134653936 -31653738383830363163366138396137623934363463373664363536613466386565346466643832 -30333834353162373032393963316662323839376162333038363635613563343331363037313336 -66303535636264646635666435336335356663376133663265363036666639663066313633343064 -36653961333165626632313866393161396432366563313137343762373166643762316436656233 -64636465313135356365363264326561303838386561353863353766623866636465633431396265 -32333234353166613536383437653539316161373032326533396338646361336132643463393934 -38616239333639616131386362373735313161306466386636326161373061653061643133356535 -63396461376231323936643533616337656634333037366563306635373034633666373739323939 -35333237623935346631326436653233643330656233643733373530316466323365663363623363 -38383238613836633465316237356434323035393036386664383366623366353830633530613030 -36303363346635633338636463386436653837306433636165623037613266366330333038363465 -63346634343361396533663134323062396635623161633563613562383464623061393030636265 -38656439613461393462646337353933333635323336303137373165626636666530323363313738 -62356133366434623065653439633265393462363839383639303662613439346362633839356431 -34383862373065316331643736386433363362313934346237393639666666313163353937343063 -30353137643961303163613161313134343034383762363736623431613537336164653333323134 -33356362366366363134333933383931626638656534323138643465303139356237373930303966 -64373632646331356161643336333562613538633332353736636337613533373464663866346363 -38633665663465653632383466353134646432663830383165663763323935626635653630373362 -32656463306561363061626365373134393430326236646165643134323562626563633034363633 -32343533376534366563393931356132366531353439656534643765653138666139656637653837 -30656266343837383534643963646263373261326363316330656333633163346662306639343735 -37333533343862373364396339366633343935633632336339643561363430653137366565386637 -38326136353230636134313937636166383338366331636331633431313231613762383064616330 -65643166303637643636376132353034653661343165333665633334326137623331616531626261 -62333565653839353064343635636235316564353530313233303365636132656363653439643666 -62336266303637306639306234303032373931383831306266346665663333303363626462656562 -35613839386631663664646466666537313939383237616562313234613530363262303764353532 -62373531346236396336386136336137623731306665383233376665373861376238346662323363 -65633564663138623630323733396238653563313064326134383233373664326363323737326366 -64356532303934306132383065343063343837313465336366623433376533306337383433393231 -33343536303337313837666566386231396666383135396134363530323834623036323836613234 -64363239323431636533393963356534643930396634633934326161383732656336383238333139 -64666630396662633330373066323639396364616138633361323435643835646439393137353638 -63633263383638633064326433343733366332363436653931393064336264383435353630373834 -30313064636563636334633462393236636534666630326664346365663739336639306566343537 -38376631623538613330326165636239653930366666343266636261326163666332616637663730 -30663035333338316164333738613538366635323539356138333064656236646238303335663331 -39613938373466356432396431626130353438643463376463313839653462316461373334363938 -65613334306635346362623762336566626632323132383766383539666361383437386663623231 -63343764333933623430656533373865666637313562303063386130616466303033666562626235 -61323337363839393937663236353662363939643632373466643362386137333034383532633436 -62326537643839626565343730336464643539313664616663373966353763636361373037326539 -66303865323835343934663265343265343261306130306530613763313931313035363839346163 -38653031383932326336616564383639643436656338653466663161383439383136316430363038 -63393037343261396164636561653933346130323931383161663264356465376431386330646130 -31656230646561663364386339633334353866663130393762653263353233303366396265633761 -62366336643936373231626462343330383836653832303330343466313236336339383666623463 -33303164646334623162396335376637643833663961323934336631643838636530366338313364 -66616639636139353666663939663135353831663366383535663733323336323465306465616338 -61313535633266636466616362626538393430393162353761353136393761643738393062613264 -36346538633465636537613764643062353266326533343338363330336432323966646436386339 -64643439353032636632656263383231333731663235623763373066383662636539613531623638 -31343666386463623335346461653030616233633937313361663231623138316131666439326662 -33313137393730373862316334666231336232303465386637343661373331323431623335353233 -63376433666564383661303930353066653663326562326534383633336637306431323632626331 -39373861303134646137646532653734616462626138313938613463383137663935346132333064 -61613539326366346537313561343635303838643261303362363065313134613131633165313039 -39663431316562643865346333613430393930303236623561373031346630313030613563663438 -63376531393630373030313337616134386262393532383964396262666461613263333065613232 -36633634346363373637306633663638366434313033356563373436626534316133663862343430 -34303261376565316630623065343030616133613136333238303936343532306334306138373531 -64643431353932343839323232663133343631623835633264386562326631646461333931636565 -66633266626433343431623532656661616161386163313533396165333966613865316238626463 -34613136616462343862336262616364616265616466356563343133363534376161326532626336 -35666362343364336365643538643862646538396331623062313762663536363864613331376462 -66303832363965376163363966313433346532303131383035663637323031373933636565393333 -64643464656365643434613161313239623039333036623637353662626161376661336335636436 -39353131383361336535313539653963383836663730643565373962343764343562653932656566 -31613033353739323134303435396236616537623733363663363436393534616635323761333233 -64393936626136626437623165393530623566383365353530613166343263323535383238343962 -36323630313931336233653530623133336564326232663762313735303134633362363964393662 -31303365313865343163616635356661353062386237316639366339373931623865376363613333 -34653935643561336665663264643264303262633361396230633631346436643862313432666161 -30626364623539633030366466393334313761383935373237306330393737306532363063363131 -63663832316530666134613865663464303465356536383039313437626665653534353332393463 -37373034353935303930623138616262616261613362613338613436316534373637316263396265 -34653866646164333737383036326563646363653832626132616431346665623938313932366437 -61323237613863653635366265646461343035333838643064323834346164366531346362326534 -62383930646133656433663736383430333034333937373639353235616636656234633936613564 -66656631643139393063326233393637306139373962636631333862386562366339323966343233 -39343333653535386137373066363131363732333735313665313738306265353533636336333437 -34363734393430646563373864633330363831623739333566373063323866313939303834306263 -62383132386263343631613464623037343265366163393837353665306530636366626465636433 -32383961366232346330306334333734663834366163336531373366353361613861396430356135 -66383339376665336231616138343831626232623338656430653539336430636236333763666565 -63613630636462346238333938306333633832346232386231663466643437633361663831363636 -31623161363935323035316635383131636435626166376532343661666135383931626336646336 -33316164376233343637306231323365313262653831353838373739323234623836666438356461 -34386533346635613064363866636235616337623632653037653439656535626433626538626663 -36643138396438633964353439636637373562373839326132653039663533626565393361643064 -66613235313461613037393064313637656366626639313631643136363766366162333863323461 -36623363393563346135666238623161616336633864333534643662306238663861643464313461 -64393264396130373030323138653565356239333932356166366232383531356435623537353533 -61313030343563636230316164633361396639373334393631326134656164643538656135636432 -65353761393430316363343439353636383966316438356264303034616265626463323661343639 -38333761343130613566383931336530326536323537326330656231653634303737303361633737 -34303739633362616665373831643261643333313634663266306366653861653065313337643863 -64353961633537616666643135613436666561333930396533346431636331316336633233633764 -35643439613063343965636434353938333831356138653131373133343230393866313462633831 -66376261656363383430373438353265393132323831346565353036356139636466346436646231 -63623861633335313139333336663031666338626366333965333138363134623332373032383935 -63633235303330383737373661623537663138613036386564356334333466386133353639326334 -35646233333837346536343637633664626662333363643663633866363065663033376537346131 -32393161306566663333353034393135646533356365313563383631613939663837363231333930 -65633739633432616538613531646361333866616362373463303665646133313031383461373361 -31333061626138626130353238336134663266353030326232646632663135346337306232646461 -39653338613439343531656264323834376334366265653439303134353138666438316631346336 -63343730336433336338323732623062363963383061333335643337363931663663613363636532 -63313961386661336536313133316430656331343731623338393235313234376331393634336663 -64393231343230346130386166343864643061643538373636383939333333613165343431313662 -35386234633263356564613861653734356362643836653235373638623439316634653030333936 -33333761653463363632373539343835323739636661636435343761346630316362313061333562 -61636463353165653464626563363237393964386163326661653432313065373030653533306132 -32363934386131346561343462336630303237626132323833303864396265616562396631653439 -32376465393564616562346663306164313738353333663438653662333662393465613230396266 -33626535663731323039346262373735383562613134346632353432333662653533333338653135 -363439633236383364326138626433623730 +32636230316261363062326338363338386265623431633263313431373432616230646334313062 +3836363231306431333533326538386636383561343565660a663539313233313537383136613434 +35303864346335386338353633366338383134623139306338363065316232323463626264636335 +6134346134386531370a353234353061386364306232663231646362653838383539393931346466 +31353966373761653365363464636336326464623736343630343136353066353331393731646236 +38646663653862363435343338623731373532303261313661393538643761346638376238616530 +63363238613961316332363733653837343662376433636261336565316231393533383038653936 +31323664363839656561346431333166623263383737363964396564663164393439613634663636 +31346566626332363963656434333634353233356533323863623939383730333061613639383539 +39303530373033366635303531353662366339373937313663623138323836353064326637613737 +36313430363465656538666534333364366663316537323639363239353561306530316130303133 +32356636326130346630376134393264316461383464336261313734656333653036636534303961 +35663631643132646334393539663365326664343636326163653161653137646663663466363035 +63666530353438636231383332333235626431636531643036373935666132633433643838633132 +35386561343366336535396538343630613632623938323963366562613733626238356334383432 +32656536666539313462643738656531373438623631393230646661613731616466613439313038 +63333538643662343837666239376430333562373065316266336131343532646239346634663263 +33323235663965326439343534396461376236373962666530396466616265346266343935633566 +39396432343163303666343762643934323461313935343531626432353762623236326162643939 +64663831653962626633356430633232393737343237323134616333393436313337666165366634 +32623861626630303137656331643738643562323531336564383466666532303636383538313630 +30623763333430343762393164353131373733336230323432313266356536383361333537343937 +32636532613134303234313531646436666633613431616338663263316337303635376361306338 +39333764376136363664303165393938646366333832333261313337623337303138616661663362 +61343663376135613036313736653964343963616439636239663261393037323439323061366339 +30323130333431323534643635663531366266393062363362623930633139366164326236636232 +65363562393063666334613136306166616232313333633337373965383631386165613261363662 +65316466613465313332626139363365383262653731633162366639323239346239363930363761 +30663839663830363462663136336432346233383934383538343334623335313033386462393135 +64326633643965643366666331336362623137626166616237303464323135643634653662303335 +30386237313338333532666236393637663131313939393939666265303264666466363962653166 +62626231616463346134346337323132316331313862336665613261626532666130356433336265 +64633136666433653532333964393861316235646434623733653961343034356165663065666330 +39376239343462396361323731376632323936396332393461646238623531323332623937323862 +30373932656463333161306336323166393964376637366236393137323432383432313736323464 +61666634306564343865646438346664363563643531623064346234316533306431303735323866 +32623762643230366631396431393862623363343331626136336131386636336439376661376235 +31643761336332303933613936393365343035396332376663656632343739343264646565646466 +37353031366661333134313134333137343530623235616239386439643539346636656362616333 +31646535323362306139356332333536653839646234316231346535343538336432363261353534 +36373634346131346132306366336136623163623039623231363739653730346135613631346335 +36303036383335623635383363383733353135653665643239613939333931386539386161623762 +33613133303763303431666564633031323162336230653661383730336664353233353530323237 +33663466303163363165326234306561383634316130386637363866323732623233396363343065 +37303862383764616231356234666633366337363961326339613031346135636633616566393337 +65353339386439393965313866363533633633656463643364393134653339656135353436316139 +36313663386566666133626466396539366566643130363439333732663465316162633132646234 +62363139666331363962366430383233333731383031633437623166386337653436376639616435 +35363561373162396362613136353537623935613136373633303965393533336461626366646366 +61373036663837323839356163613538613032346437316433663534396333313966616231623964 +37633735306561303861666237616438663232653866623637616561323365373966326530623161 +31633139386533333661373734333232623961613464646130323735643232333666633832336334 +38373066306238353866346230376265633839323831383563346438393436633430316636333434 +37653937333365633332613735363032376536666230643462646435613533363166303930653566 +65643634633936653530313662363139303133383933333866366237646435323131613131663564 +32616532633965666234383766613534613830396465333933393963393238663535316366646630 +31316234333934353035623661636230376566313338653832353661646135663037666333303464 +33623732353136376136616131343430336665636331663665373134353634343233383738393066 +66313635666538663861633563323032356465343465393933666631643230663661626430383630 +62326436343831666462613031333266663139333838366630346135303633386632306235643165 +34353439646163613966656434313930366136366132653039346663343963333135363965663664 +64376462356163336430313565643538383732623134633135396636656161323465616238376163 +38313931333062666137376338613732353634393063396438363239316662623535663533376664 +63343262653232343039373266346330623466326462636632336565383536323862323661663936 +31663466353339313339343862653134323135333339646634303633346436323930396137343162 +36333336313331366432373165376633623137303535356462353866373865363533383065656238 +31383039643833313837373139366366663737656530633164393838313339323665386265306566 +63383632393337613434393338346463363835363164393630653964383832653466303164306263 +30633462316231323533633364623962343361663235626236373738356133623461316665366332 +65366166333066366638323732303362633735333439396661306162646534396564386639613533 +39303735316234356533383733383435613766326639336533663238333465653437323638623537 +35363962636433616130666537616664343462313863313735343237663034323564353961383662 +30386461386532323065373663363631613134663038303437373635333632643261666330613230 +65613335303335326163396432313837323866623639616632383437613939623132613864396432 +30656631313466656665623433643038366332656165383532343162386465313565303532396233 +36646430623935303264346466376661386130323063303630323662306565313730663537333436 +61356235343939386337643065636238346531653931373531376464373862316236656161396632 +66663331343365636266623661373637383262383264313931343162666231353732366231646634 +32333166353231346662373062663633383961376633316633396464386331663962313435666131 +39633835333035636330376239616130666434393735393561623263646638303966636139633732 +39363165613732393535623365316461303934343233663064306163316130326161663636373861 +35353638633833613730336565383862633232386436356462313466323835326530666430663630 +39666164376666663638643133343439336136613432323861653135613330333661366539316262 +31386664623664383334633033303439313663323832383862656333366337323564613532616336 +64313565333638633733613132393565316463393130336331383865643061313435656135613362 +66316664623938616266323738633565386561396366346461653532613039316635303133303737 +64303037653431626631366361373364343834306231393066343736386662633935393162646530 +38653236353937393139613330643066386638303536373333306530343933366335336263636666 +32653138616363666630613431386239313030306161653565633638373632313139323832393434 +65333137636663373532646130313932306436666363366335316330396431323363346437613561 +33343036333136616330343364643833313465326432346535313232373066633763656161306138 +38383038353037376330643934393665663966396461633462643735643233323165373830633439 +30383233616466613563333666393734326366373462336533356165636464376432326464643738 +35336664313161663232303130303334353431363134303936623335323863633038373861363931 +65363764316339333065656466313337373135626430326266353432633637346364393330306331 +37376464653333636135363761346430336238666261323866353739376231643934336238623266 +66303962313166363133643164316466396662623233363539363332633433373762313237613532 +65623264323961346661326639366665303939363261363436633266313165323361333135353530 +34376266656364323633396533326564613331333731326563343735343463303731303939613538 +62626361616265643563643232356139316633363537373863646166653166626536353630323734 +37313131656435313866333239393531313162333263366233373930333263643035643061666332 +63386639653737336262653234346466326137376234323539393466363363663231636131656262 +65323034613235326664356436343339633832383966336436323038383335323861356638306235 +36376163383364323834356130393664356566313464326566336461656566326135326163376533 +38343365323862346139336336326630376330393236636363653761626337313132393739323165 +62313462666232326562366264666165613234393036653231636639663061326266303839306236 +38313331386536656334323732396532303565383431313631666632373934623634313463306533 +65306638616466336266646464323539376637336232363738613462646264626430323266663830 +37303162656666383336633264393233306365316164366265626637303961646262663066306164 +36306534326461313866316532633561623862383863626162396564316265323034643661363066 +33663166393866303839393361623031613665636637613035366463643166313662373635333737 +32363230346234313965353833373339646463313166343736313563323434316134666132646566 +63663764663764393865636365653336323664356166343032373138356630326461346632386230 +63373864643565323430666462386464653239666362363134663332636233656631386232366638 +62316139343266353065613632393437393138623337366661643362323235316332666261313830 +63393961636336653639656236643464333765646261393834383865346233643361666461623437 +65316137633833613666626561313630393233376666626330353264333536313932646232633938 +37613163616531653830326334353236353062376563343961646163313766663033643234633135 +35666531353432666662386663613534396136666434363034666361383837316532393432616639 +36316232353565396539646636326638383164356531363136666365313335313038343237643964 +30336137616436323332383035323432333563373732613762643137656532323035646338343430 +35333539333433353539306236626131353330663466313564376231646632663361653335343439 +34353334653531663634656665346536623861656564353938313236383434346137396364316665 +36316434363830373337343530386135623234363435353964346534643637346430616336383561 +64353332353263613530323363366163616633323232333561663038656338643934303839633161 +61356630353463393138343038303732653461346535383462643066323733373863343763346337 +39333763333836356531373065376161396431396663663037636462616564323138366566333633 +39643437653637303333316634386462323533363862393463623133626530396239396533313133 +36663266303065373234636231383162373231623936363863363466636331653961336639373337 +34616635613337666235376133346233623462626331323533643230646665366161653334636565 +31313738663838366235633966373665383865393536396333353066333930646335376561383732 +66393466653664393933303066373765383730666235326539653032303935373734663934353531 +64356466613035363464643463386135316438353131383935303637333636383164633563666637 +63333266343234656437363436313762316364623831376135653737316431363864363437366665 +323963393638666636623065313162323939 From a957706c23fe2cad1455811f1296d9ba7bbbc63a Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 27 Nov 2017 20:12:42 -0500 Subject: [PATCH 020/109] clean up campaign creation --- frontend/forms/__init__.py | 41 +++------------ frontend/forms/rh_forms.py | 43 ++++++++++++++-- frontend/templates/rh_campaigns.html | 11 ++++ frontend/templates/rh_intro.html | 2 +- frontend/templates/rh_works.html | 6 ++- frontend/views/__init__.py | 5 +- frontend/views/rh_views.py | 76 ++++++++++++++++++++++------ 7 files changed, 125 insertions(+), 59 deletions(-) diff --git a/frontend/forms/__init__.py b/frontend/forms/__init__.py index d7de809d..bd0af310 100644 --- a/frontend/forms/__init__.py +++ b/frontend/forms/__init__.py @@ -19,8 +19,6 @@ from django.utils.translation import ugettext_lazy as _ from ckeditor.widgets import CKEditorWidget from selectable.forms import ( - AutoCompleteSelectMultipleWidget, - AutoCompleteSelectMultipleField, AutoCompleteSelectWidget, AutoCompleteSelectField ) @@ -64,8 +62,13 @@ from regluit.utils.fields import ISBNField from .bibforms import EditionForm, IdentifierForm -from .rh_forms import RightsHolderForm, UserClaimForm - +from .rh_forms import ( + CloneCampaignForm, + EditManagersForm, + OpenCampaignForm, + RightsHolderForm, + UserClaimForm +) from questionnaire.models import Questionnaire logger = logging.getLogger(__name__) @@ -209,23 +212,6 @@ class ProfileForm(forms.ModelForm): self.cleaned_data["avatar_source"] == UNGLUEITAR return self.cleaned_data -class CloneCampaignForm(forms.Form): - campaign_id = forms.IntegerField(required = True, widget = forms.HiddenInput) - -class OpenCampaignForm(forms.ModelForm): - managers = AutoCompleteSelectMultipleField( - OwnerLookup, - label='Campaign Managers', - widget=AutoCompleteSelectMultipleWidget(OwnerLookup), - required=True, - error_messages = {'required': "You must have at least one manager for a campaign."}, - ) - userid = forms.IntegerField( required = True, widget = forms.HiddenInput ) - class Meta: - model = Campaign - fields = 'name', 'work', 'managers', 'type' - widgets = { 'work': forms.HiddenInput, "name": forms.HiddenInput, } - def getTransferCreditForm(maximum, data=None, *args, **kwargs ): class TransferCreditForm(forms.Form): recipient = AutoCompleteSelectField( @@ -278,19 +264,6 @@ class OtherWorkForm(WorkForm): super(OtherWorkForm, self).__init__(*args, **kwargs) self.fields['other_work'].widget.update_query_parameters({'language':self.work.language}) -class EditManagersForm(forms.ModelForm): - managers = AutoCompleteSelectMultipleField( - OwnerLookup, - label='Campaign Managers', - widget=AutoCompleteSelectMultipleWidget(OwnerLookup), - required=True, - error_messages = {'required': "You must have at least one manager for a campaign."}, - ) - class Meta: - model = Campaign - fields = ('id', 'managers') - widgets = { 'id': forms.HiddenInput } - class CustomPremiumForm(forms.ModelForm): class Meta: diff --git a/frontend/forms/rh_forms.py b/frontend/forms/rh_forms.py index 698e7eb8..faa6a94c 100644 --- a/frontend/forms/rh_forms.py +++ b/frontend/forms/rh_forms.py @@ -1,6 +1,12 @@ +from selectable.forms import ( + AutoCompleteSelectMultipleWidget, + AutoCompleteSelectMultipleField, +) + from django import forms -from regluit.core.models import RightsHolder, Claim +from regluit.core.lookups import OwnerLookup +from regluit.core.models import Campaign, Claim, RightsHolder, WasWork class RightsHolderForm(forms.ModelForm): email = forms.EmailField( @@ -73,10 +79,10 @@ class UserClaimForm (forms.ModelForm): try: workids = self.data['claim-work'] if workids: - work = models.WasWork.objects.get(was = workids[0]).work + work = WasWork.objects.get(was = workids[0]).work else: raise forms.ValidationError('That work does not exist.') - except models.WasWork.DoesNotExist: + except WasWork.DoesNotExist: raise forms.ValidationError('That work does not exist.') return work @@ -88,3 +94,34 @@ class UserClaimForm (forms.ModelForm): 'work': forms.HiddenInput, } +class EditManagersForm(forms.ModelForm): + managers = AutoCompleteSelectMultipleField( + OwnerLookup, + label='Campaign Managers', + widget=AutoCompleteSelectMultipleWidget(OwnerLookup), + required=True, + error_messages = {'required': "You must have at least one manager for a campaign."}, + ) + class Meta: + model = Campaign + fields = ('id', 'managers') + widgets = { 'id': forms.HiddenInput } + +class OpenCampaignForm(forms.ModelForm): + managers = AutoCompleteSelectMultipleField( + OwnerLookup, + label='Campaign Managers', + widget=AutoCompleteSelectMultipleWidget(OwnerLookup), + required=True, + error_messages = {'required': "You must have at least one manager for a campaign."}, + ) + userid = forms.IntegerField( required = True, widget = forms.HiddenInput ) + class Meta: + model = Campaign + fields = 'name', 'work', 'managers', 'type' + widgets = { 'work': forms.HiddenInput, "name": forms.HiddenInput, } + +class CloneCampaignForm(forms.Form): + campaign_id = forms.IntegerField(required = True, widget = forms.HiddenInput) + + diff --git a/frontend/templates/rh_campaigns.html b/frontend/templates/rh_campaigns.html index c0a57ca8..7dbc2228 100644 --- a/frontend/templates/rh_campaigns.html +++ b/frontend/templates/rh_campaigns.html @@ -54,5 +54,16 @@ {% endfor %} +{% else %} +

    You don't manage any campaigns yet.

    +

    + {% if request.user.is_anonymous %} + You need to log in. + {% elif claims %} + Create a campaign for one of your works. + {% else %} + You need to claim a work before you start a campaign to support it. + {% endif %} +

    {% endif %} {% endblock %} diff --git a/frontend/templates/rh_intro.html b/frontend/templates/rh_intro.html index 342dec85..0a089ead 100644 --- a/frontend/templates/rh_intro.html +++ b/frontend/templates/rh_intro.html @@ -34,7 +34,7 @@ If you're an author, publisher, or other rights holder, you can participate more {% if campaigns %}
  • You've set up {{ campaigns.count }} campaign(s). Manage them here.
  • {% else %} -
  • {% if claims %}Set up a campaign for for your book.{% else %} Set up a campaign. All the campaigns you can manage will be listed on this page, above.{% endif %}
  • +
  • {% if claims %}Set up a campaign for for your book.{% else %} Set up a campaign. All the campaigns you can manage will be listed on this page.{% endif %}
  • {% endif %}

    About Campaigns

    diff --git a/frontend/templates/rh_works.html b/frontend/templates/rh_works.html index 3376454a..2e633e3f 100644 --- a/frontend/templates/rh_works.html +++ b/frontend/templates/rh_works.html @@ -39,7 +39,7 @@

- {% else %}{%if claim.campaign %} + {% elif claim.campaign %}

Campaign for this work

{% with claim.campaign as campaign %} @@ -78,8 +78,10 @@ {% endif %} {% endwith %} + {% else %} +

When your claim is approved, you will be able to create a campaign.

{% endif %} - {% endif %} + {% if claim.work.first_ebook %}

Ebooks for this work

{{ claim.work.download_count }} total downloads

diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index c4673867..dbd7a84b 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -89,7 +89,6 @@ from regluit.frontend.forms import ( EbookFileForm, CustomPremiumForm, OfferForm, - EditManagersForm, PledgeCancelForm, getTransferCreditForm, CCForm, @@ -583,7 +582,7 @@ def manage_campaign(request, id, ebf=None, action='manage'): alerts.append(_('Campaign has been launched')) else: alerts.append(_('Campaign has NOT been launched')) - new_premium_form = CustomPremiumForm(data={'campaign': campaign}) + new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) elif request.POST.has_key('inactivate') : activetab = '#2' if request.POST.has_key('premium_id'): @@ -2864,7 +2863,7 @@ def download_campaign(request, work_id, format): # Raise 404 unless there is a SUCCESSFUL BUY2UNGLUE campaign associated with work try: campaign = work.campaigns.get(status='SUCCESSFUL', type=BUY2UNGLUE) - except Campaign.DoesNotExist as e: + except models.Campaign.DoesNotExist as e: raise Http404 ebfs = models.EbookFile.objects.filter(edition__work=campaign.work, format=format).exclude(file='').order_by('-created') diff --git a/frontend/views/rh_views.py b/frontend/views/rh_views.py index 3abb022e..57737c2d 100644 --- a/frontend/views/rh_views.py +++ b/frontend/views/rh_views.py @@ -1,11 +1,23 @@ -from django.core.urlresolvers import reverse,reverse_lazy +from datetime import timedelta +from decimal import Decimal as D + +from django.conf import settings +from django.core.urlresolvers import reverse, reverse_lazy from django.forms.models import modelformset_factory from django.http import HttpResponseRedirect, Http404 from django.shortcuts import render from django.views.generic.edit import CreateView from regluit.core import models -from regluit.frontend.forms import RightsHolderForm, UserClaimForm, OpenCampaignForm +from regluit.core.parameters import * +from regluit.frontend.forms import ( + CloneCampaignForm, + EditManagersForm, + OpenCampaignForm, + RightsHolderForm, + UserClaimForm, +) +from regluit.utils.localdatetime import date_today class RHAgree(CreateView): template_name = "rh_agree.html" @@ -34,14 +46,14 @@ def rh_admin(request, facet='top'): pending_formset = PendingFormSet(queryset=pending_data) else: pending_formset = PendingFormSet(queryset=pending_data) - + rights_holders = models.RightsHolder.objects.filter(approved=True) context = { 'rights_holders': rights_holders, 'pending': zip(pending_data, pending_formset), 'pending_formset': pending_formset, - 'facet': facet, + 'facet': facet, } return render(request, "rights_holders.html", context) @@ -70,12 +82,17 @@ class ClaimView(CreateView): ).exclude(status='release').count(): form.save() return HttpResponseRedirect(reverse('rightsholders')) - + def get_context_data(self, form): work = form.cleaned_data['work'] rights_holder = form.cleaned_data['rights_holder'] active_claims = work.claim.exclude(status = 'release') - return {'form': form, 'work': work, 'rights_holder':rights_holder , 'active_claims':active_claims} + return { + 'form': form, + 'work': work, + 'rights_holder': rights_holder, + 'active_claims': active_claims, + } def claim(request): return ClaimView.as_view()(request) @@ -89,15 +106,22 @@ def rh_tools(request, template_name='rh_intro.html'): return render(request, template_name) for claim in claims: if claim.can_open_new: - if request.method == 'POST' and request.POST.has_key('cl_%s-work' % claim.id) and int(request.POST['cl_%s-work' % claim.id]) == claim.work_id : - claim.campaign_form = OpenCampaignForm(data = request.POST, prefix = 'cl_'+str(claim.id),) + if request.method == 'POST' and \ + request.POST.has_key('cl_%s-work' % claim.id) and \ + int(request.POST['cl_%s-work' % claim.id]) == claim.work_id : + claim.campaign_form = OpenCampaignForm( + data = request.POST, + prefix = 'cl_'+str(claim.id), + ) if claim.campaign_form.is_valid(): new_campaign = claim.campaign_form.save(commit=False) if new_campaign.type == BUY2UNGLUE: new_campaign.target = D(settings.UNGLUEIT_MAXIMUM_TARGET) new_campaign.set_cc_date_initial() elif new_campaign.type == REWARDS: - new_campaign.deadline = date_today() + timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)) + new_campaign.deadline = date_today() + timedelta( + days=int(settings.UNGLUEIT_LONGEST_DEADLINE) + ) new_campaign.target = D(settings.UNGLUEIT_MINIMUM_TARGET) elif new_campaign.type == THANKS: new_campaign.target = D(settings.UNGLUEIT_MINIMUM_TARGET) @@ -107,18 +131,35 @@ def rh_tools(request, template_name='rh_intro.html'): else: c_type = 2 claim.campaign_form = OpenCampaignForm( - initial={'work': claim.work, 'name': claim.work.title, 'userid': request.user.id, 'managers': [request.user.id], 'type': c_type}, - prefix = 'cl_'+str(claim.id), + initial={ + 'work': claim.work, + 'name': claim.work.title, + 'userid': request.user.id, + 'managers': [request.user.id], + 'type': c_type + }, + prefix='cl_'+str(claim.id), ) if claim.campaign: if claim.campaign.status in ['ACTIVE','INITIALIZED']: - if request.method == 'POST' and request.POST.has_key('edit_managers_%s'% claim.campaign.id) : - claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, data=request.POST, prefix=claim.campaign.id) + e_m_key = 'edit_managers_%s' % claim.campaign.id + if request.method == 'POST' and request.POST.has_key(e_m_key): + claim.campaign.edit_managers_form = EditManagersForm( + instance=claim.campaign, + data=request.POST, + prefix=claim.campaign.id, + ) if claim.campaign.edit_managers_form.is_valid(): claim.campaign.edit_managers_form.save() - claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, prefix=claim.campaign.id) + claim.campaign.edit_managers_form = EditManagersForm( + instance=claim.campaign, + prefix=claim.campaign.id, + ) else: - claim.campaign.edit_managers_form = EditManagersForm(instance=claim.campaign, prefix=claim.campaign.id) + claim.campaign.edit_managers_form = EditManagersForm( + instance=claim.campaign, + prefix=claim.campaign.id, + ) campaigns = request.user.campaigns.all() new_campaign = None for campaign in campaigns: @@ -128,6 +169,9 @@ def rh_tools(request, template_name='rh_intro.html'): if clone_form.is_valid(): campaign.clone() else: - campaign.clone_form = CloneCampaignForm(initial={'campaign_id':campaign.id}, prefix='c%s' % campaign.id) + campaign.clone_form = CloneCampaignForm( + initial={'campaign_id':campaign.id}, + prefix='c%s' % campaign.id, + ) return render(request, template_name, {'claims': claims , 'campaigns': campaigns}) From 132d87f8e471ad9d2372ec1a41f5ab26e7d58344 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 27 Nov 2017 21:45:45 -0500 Subject: [PATCH 021/109] clean up campaign-manage --- frontend/forms/__init__.py | 143 +----------------- frontend/forms/rh_forms.py | 190 +++++++++++++++++++++++- frontend/templates/manage_campaign.html | 178 +++++++++++----------- frontend/views/__init__.py | 112 +------------- frontend/views/rh_views.py | 124 +++++++++++++++- 5 files changed, 400 insertions(+), 347 deletions(-) diff --git a/frontend/forms/__init__.py b/frontend/forms/__init__.py index bd0af310..be645eb0 100644 --- a/frontend/forms/__init__.py +++ b/frontend/forms/__init__.py @@ -4,7 +4,7 @@ import logging import re import unicodedata -from datetime import timedelta, date +from datetime import date from decimal import Decimal as D #django imports @@ -16,8 +16,6 @@ from django.forms.widgets import RadioSelect from django.forms.extras.widgets import SelectDateWidget from django.utils.translation import ugettext_lazy as _ -from ckeditor.widgets import CKEditorWidget - from selectable.forms import ( AutoCompleteSelectWidget, AutoCompleteSelectField @@ -57,14 +55,17 @@ from regluit.core.lookups import ( SubjectLookup, ) from regluit.core.validation import test_file -from regluit.utils.localdatetime import now from regluit.utils.fields import ISBNField from .bibforms import EditionForm, IdentifierForm from .rh_forms import ( + CCDateForm, CloneCampaignForm, + date_selector, + DateCalculatorForm, EditManagersForm, + ManageCampaignForm, OpenCampaignForm, RightsHolderForm, UserClaimForm @@ -288,140 +289,6 @@ class OfferForm(forms.ModelForm): 'license': forms.HiddenInput, } -date_selector = range(date.today().year, settings.MAX_CC_DATE.year+1) - -class CCDateForm(object): - target = forms.DecimalField( - min_value= D(settings.UNGLUEIT_MINIMUM_TARGET), - error_messages={'required': 'Please specify a Revenue Target.'} - ) - minimum_target = settings.UNGLUEIT_MINIMUM_TARGET - maximum_target = settings.UNGLUEIT_MAXIMUM_TARGET - max_cc_date = settings.MAX_CC_DATE - - def clean_target(self): - new_target = self.cleaned_data['target'] - if new_target < D(settings.UNGLUEIT_MINIMUM_TARGET): - raise forms.ValidationError(_('A campaign may not be launched with a target less than $%s' % settings.UNGLUEIT_MINIMUM_TARGET)) - if new_target > D(settings.UNGLUEIT_MAXIMUM_TARGET): - raise forms.ValidationError(_('A campaign may not be launched with a target more than $%s' % settings.UNGLUEIT_MAXIMUM_TARGET)) - return new_target - - def clean_cc_date_initial(self): - new_cc_date_initial = self.cleaned_data['cc_date_initial'] - if new_cc_date_initial.date() > settings.MAX_CC_DATE: - raise forms.ValidationError('The initial Ungluing Date cannot be after %s'%settings.MAX_CC_DATE) - elif new_cc_date_initial - now() < timedelta(days=0): - raise forms.ValidationError('The initial Ungluing date must be in the future!') - return new_cc_date_initial - -class DateCalculatorForm(CCDateForm, forms.ModelForm): - revenue = forms.DecimalField() - cc_date_initial = forms.DateTimeField( - widget = SelectDateWidget(years=date_selector) - ) - class Meta: - model = Campaign - fields = 'target', 'cc_date_initial', 'revenue', - -def getManageCampaignForm ( instance, data=None, initial=None, *args, **kwargs ): - - def get_queryset(): - work = instance.work - return Edition.objects.filter(work = work) - - class ManageCampaignForm(CCDateForm, forms.ModelForm): - target = forms.DecimalField( required= (instance.type in {REWARDS, BUY2UNGLUE})) - deadline = forms.DateTimeField( - required = (instance.type==REWARDS), - widget = SelectDateWidget(years=date_selector) if instance.status=='INITIALIZED' else forms.HiddenInput - ) - cc_date_initial = forms.DateTimeField( - required = (instance.type==BUY2UNGLUE) and instance.status=='INITIALIZED', - widget = SelectDateWidget(years=date_selector) if instance.status=='INITIALIZED' else forms.HiddenInput - ) - paypal_receiver = forms.EmailField( - label=_("contact email address for this campaign"), - max_length=100, - error_messages={'required': 'You must enter the email we should contact you at for this campaign.'}, - ) - edition = forms.ModelChoiceField( - get_queryset(), - widget=RadioSelect(), - empty_label='no edition selected', - required=False, - ) - publisher = forms.ModelChoiceField( - instance.work.publishers(), - empty_label='no publisher selected', - required=False, - ) - work_description = forms.CharField( required=False , widget=CKEditorWidget()) - - class Meta: - model = Campaign - fields = ('description', 'details', 'license', 'target', 'deadline', 'paypal_receiver', - 'edition', 'email', 'publisher', 'cc_date_initial', "do_watermark", "use_add_ask", - ) - widgets = { 'deadline': SelectDateWidget } - - def clean_target(self): - if self.instance.type == THANKS: - return None - new_target = super(ManageCampaignForm, self).clean_target() - if self.instance: - if self.instance.status == 'ACTIVE' and self.instance.target < new_target: - raise forms.ValidationError(_('The fundraising target for an ACTIVE campaign cannot be increased.')) - return new_target - - def clean_cc_date_initial(self): - if self.instance.type in {REWARDS, THANKS} : - return None - if self.instance: - if self.instance.status != 'INITIALIZED': - # can't change this once launched - return self.instance.cc_date_initial - return super(ManageCampaignForm, self).clean_cc_date_initial() - - def clean_deadline(self): - if self.instance.type in {BUY2UNGLUE, THANKS} : - return None - new_deadline_date = self.cleaned_data['deadline'] - new_deadline = new_deadline_date + timedelta(hours=23, minutes=59) - if self.instance: - if self.instance.status == 'ACTIVE': - return self.instance.deadline - if new_deadline_date - now() > timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)): - raise forms.ValidationError(_('The chosen closing date is more than %s days from now' % settings.UNGLUEIT_LONGEST_DEADLINE)) - elif new_deadline - now() < timedelta(days=0): - raise forms.ValidationError(_('The chosen closing date is in the past')) - return new_deadline - - def clean_license(self): - new_license = self.cleaned_data['license'] - if self.instance: - if self.instance.status == 'ACTIVE' and self.instance.license != new_license: - # should only allow change to a less restrictive license - if self.instance.license == 'CC BY-ND' and new_license in ['CC BY-NC-ND', 'CC BY-NC-SA', 'CC BY-NC']: - raise forms.ValidationError(_('The proposed license for an ACTIVE campaign may not add restrictions.')) - elif self.instance.license == 'CC BY' and new_license != 'CC0': - raise forms.ValidationError(_('The proposed license for an ACTIVE campaign may not add restrictions.')) - elif self.instance.license == 'CC BY-NC' and new_license in ['CC BY-NC-ND', 'CC BY-NC-SA', 'CC BY-SA', 'CC BY-ND']: - raise forms.ValidationError(_('The proposed license for an ACTIVE campaign may not add restrictions.')) - elif self.instance.license == 'CC BY-ND' and new_license in ['CC BY-NC-ND', 'CC BY-NC-SA', 'CC BY-SA', 'CC BY-NC']: - raise forms.ValidationError(_('The proposed license for an ACTIVE campaign may not add restrictions.')) - elif self.instance.license == 'CC BY-SA' and new_license in ['CC BY-NC-ND', 'CC BY-NC-SA', 'CC BY-ND', 'CC BY-NC']: - raise forms.ValidationError(_('The proposed license for an ACTIVE campaign may not add restrictions.')) - elif self.instance.license == 'CC BY-NC-SA' and new_license in ['CC BY-NC-ND', 'CC BY-ND']: - raise forms.ValidationError(_('The proposed license for an ACTIVE campaign may not add restrictions.')) - elif self.instance.license == 'CC0' : - raise forms.ValidationError(_('The proposed license for an ACTIVE campaign may not add restrictions.')) - elif self.instance.license in ['GDFL', 'LAL']: - raise forms.ValidationError(_('Once you start a campaign with GDFL or LAL, you can\'t use any other license.')) - return new_license - if initial and not initial.get('edition', None) and not instance.edition: - initial['edition'] = instance.work.editions.all()[0] - return ManageCampaignForm(instance=instance, data=data, initial=initial) class CampaignPurchaseForm(forms.Form): anonymous = forms.BooleanField(required=False, label=_("Make this purchase anonymous, please")) diff --git a/frontend/forms/rh_forms.py b/frontend/forms/rh_forms.py index faa6a94c..3033835c 100644 --- a/frontend/forms/rh_forms.py +++ b/frontend/forms/rh_forms.py @@ -1,12 +1,23 @@ +from datetime import date, timedelta +from decimal import Decimal as D + +from ckeditor.widgets import CKEditorWidget + from selectable.forms import ( AutoCompleteSelectMultipleWidget, AutoCompleteSelectMultipleField, ) from django import forms +from django.conf import settings +from django.forms.extras.widgets import SelectDateWidget +from django.forms.widgets import RadioSelect +from django.utils.translation import ugettext_lazy as _ from regluit.core.lookups import OwnerLookup -from regluit.core.models import Campaign, Claim, RightsHolder, WasWork +from regluit.core.models import Campaign, Edition, Claim, RightsHolder, WasWork +from regluit.core.parameters import * +from regluit.utils.localdatetime import now class RightsHolderForm(forms.ModelForm): email = forms.EmailField( @@ -124,4 +135,181 @@ class OpenCampaignForm(forms.ModelForm): class CloneCampaignForm(forms.Form): campaign_id = forms.IntegerField(required = True, widget = forms.HiddenInput) +date_selector = range(date.today().year, settings.MAX_CC_DATE.year+1) + +class CCDateForm(object): + target = forms.DecimalField( + min_value= D(settings.UNGLUEIT_MINIMUM_TARGET), + error_messages={'required': 'Please specify a Revenue Target.'} + ) + minimum_target = settings.UNGLUEIT_MINIMUM_TARGET + maximum_target = settings.UNGLUEIT_MAXIMUM_TARGET + max_cc_date = settings.MAX_CC_DATE + + def clean_target(self): + new_target = self.cleaned_data['target'] + if new_target < D(settings.UNGLUEIT_MINIMUM_TARGET): + raise forms.ValidationError(_( + 'A campaign may not be launched with a target less than $%s' % settings.UNGLUEIT_MINIMUM_TARGET + )) + if new_target > D(settings.UNGLUEIT_MAXIMUM_TARGET): + raise forms.ValidationError(_( + 'A campaign may not be launched with a target more than $%s' % settings.UNGLUEIT_MAXIMUM_TARGET + )) + return new_target + + def clean_cc_date_initial(self): + new_cc_date_initial = self.cleaned_data['cc_date_initial'] + if new_cc_date_initial.date() > settings.MAX_CC_DATE: + raise forms.ValidationError('The initial Ungluing Date cannot be after %s'%settings.MAX_CC_DATE) + elif new_cc_date_initial - now() < timedelta(days=0): + raise forms.ValidationError('The initial Ungluing date must be in the future!') + return new_cc_date_initial + +class DateCalculatorForm(CCDateForm, forms.ModelForm): + revenue = forms.DecimalField() + cc_date_initial = forms.DateTimeField( + widget = SelectDateWidget(years=date_selector) + ) + class Meta: + model = Campaign + fields = 'target', 'cc_date_initial', 'revenue', + + +class ManageCampaignForm(CCDateForm, forms.ModelForm): + def __init__(self, instance=None , **kwargs): + super(ManageCampaignForm, self).__init__(instance=instance, **kwargs) + work = instance.work + edition_qs = Edition.objects.filter(work=work) + self.fields['edition'] = forms.ModelChoiceField( + edition_qs, + widget=RadioSelect(), + empty_label='no edition selected', + required=False, + ) + self.fields['target'] = forms.DecimalField( + required=(instance.type in {REWARDS, BUY2UNGLUE}) + ) + self.fields['deadline'] = forms.DateTimeField( + required = (instance.type==REWARDS), + widget = SelectDateWidget(years=date_selector) if instance.status=='INITIALIZED' \ + else forms.HiddenInput + ) + self.fields['cc_date_initial'] = forms.DateTimeField( + required = (instance.type==BUY2UNGLUE) and instance.status=='INITIALIZED', + widget = SelectDateWidget(years=date_selector) if instance.status=='INITIALIZED' \ + else forms.HiddenInput + ) + self.fields['publisher'] = forms.ModelChoiceField( + instance.work.publishers(), + empty_label='no publisher selected', + required=False, + ) + if self.initial and not self.initial.get('edition', None) and not instance.edition: + self.initial['edition'] = instance.work.editions.all()[0] + + paypal_receiver = forms.EmailField( + label=_("contact email address for this campaign"), + max_length=100, + error_messages={ + 'required': 'You must enter the email we should contact you at for this campaign.' + }, + ) + work_description = forms.CharField(required=False , widget=CKEditorWidget()) + + class Meta: + model = Campaign + fields = ('description', 'details', 'license', 'target', 'deadline', 'paypal_receiver', + 'edition', 'email', 'publisher', 'cc_date_initial', "do_watermark", "use_add_ask", + ) + widgets = { 'deadline': SelectDateWidget } + + def clean_target(self): + if self.instance.type == THANKS: + return None + new_target = super(ManageCampaignForm, self).clean_target() + if self.instance: + if self.instance.status == 'ACTIVE' and self.instance.target < new_target: + raise forms.ValidationError( + _('The fundraising target for an ACTIVE campaign cannot be increased.') + ) + return new_target + + def clean_cc_date_initial(self): + if self.instance.type in {REWARDS, THANKS} : + return None + if self.instance: + if self.instance.status != 'INITIALIZED': + # can't change this once launched + return self.instance.cc_date_initial + return super(ManageCampaignForm, self).clean_cc_date_initial() + + def clean_deadline(self): + if self.instance.type in {BUY2UNGLUE, THANKS} : + return None + new_deadline_date = self.cleaned_data['deadline'] + new_deadline = new_deadline_date + timedelta(hours=23, minutes=59) + if self.instance: + if self.instance.status == 'ACTIVE': + return self.instance.deadline + if new_deadline_date - now() > timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)): + raise forms.ValidationError(_( + 'The chosen closing date is more than {} days from now'.format( + settings.UNGLUEIT_LONGEST_DEADLINE + ) + )) + elif new_deadline - now() < timedelta(days=0): + raise forms.ValidationError(_('The chosen closing date is in the past')) + return new_deadline + + def clean_license(self): + NO_ADDED_RESTRICTIONS = _( + 'The proposed license for an ACTIVE campaign may not add restrictions.' + ) + new_license = self.cleaned_data['license'] + if self.instance: + if self.instance.status == 'ACTIVE' and self.instance.license != new_license: + # should only allow change to a less restrictive license + if self.instance.license == 'CC BY-ND' and new_license in [ + 'CC BY-NC-ND', + 'CC BY-NC-SA', + 'CC BY-NC' + ]: + raise forms.ValidationError(NO_ADDED_RESTRICTIONS) + elif self.instance.license == 'CC BY' and new_license != 'CC0': + raise forms.ValidationError(NO_ADDED_RESTRICTIONS) + elif self.instance.license == 'CC BY-NC' and new_license in [ + 'CC BY-NC-ND', + 'CC BY-NC-SA', + 'CC BY-SA', + 'CC BY-ND' + ]: + raise forms.ValidationError(NO_ADDED_RESTRICTIONS) + elif self.instance.license == 'CC BY-ND' and new_license in [ + 'CC BY-NC-ND', + 'CC BY-NC-SA', + 'CC BY-SA', + 'CC BY-NC' + ]: + raise forms.ValidationError(NO_ADDED_RESTRICTIONS) + elif self.instance.license == 'CC BY-SA' and new_license in [ + 'CC BY-NC-ND', + 'CC BY-NC-SA', + 'CC BY-ND', + 'CC BY-NC' + ]: + raise forms.ValidationError(NO_ADDED_RESTRICTIONS) + elif self.instance.license == 'CC BY-NC-SA' and new_license in [ + 'CC BY-NC-ND', + 'CC BY-ND' + ]: + raise forms.ValidationError(NO_ADDED_RESTRICTIONS) + elif self.instance.license == 'CC0' : + raise forms.ValidationError(NO_ADDED_RESTRICTIONS) + elif self.instance.license in ['GDFL', 'LAL']: + raise forms.ValidationError(_( + 'Once you start a campaign with GDFL or LAL, you can\'t use any other license.' + )) + return new_license + diff --git a/frontend/templates/manage_campaign.html b/frontend/templates/manage_campaign.html index 94f47dd0..d411da7a 100644 --- a/frontend/templates/manage_campaign.html +++ b/frontend/templates/manage_campaign.html @@ -83,21 +83,21 @@ Please fix the following before launching your campaign:
- {% ifequal work.last_campaign.type 1 %} + {% if work.last_campaign.type == 1 %} {{ work.last_campaign.supporters_count }} Ungluers have pledged ${{ work.last_campaign.current_total|intcomma }} {% else %} Total revenue: ${{ work.last_campaign.current_total|intcomma }} from {{ work.last_campaign.supporters_count }} Ungluers and {{ work.last_campaign.anon_count }} others - {% endifequal %} + {% endif %}
- {% ifequal campaign_status 'INITIALIZED' %} + {% if campaign_status == 'INITIALIZED' %} Preview Your Campaign {% else %} See Your Campaign - {% endifequal %} + {% endif %}
@@ -105,7 +105,7 @@ Please fix the following before launching your campaign: @@ -120,28 +120,27 @@ Please fix the following before launching your campaign: {% if campaign.work.ebookfiles.0 %}

You have uploaded ebook files for this work.

{% else %} - {% ifequal work.last_campaign.type 2 %} + {% if work.last_campaign.type == 2 %}

To sell ebooks as part of a buy to unglue campaign, you will need to upload an EPUB file for the ebook you want to sell.

- {% endifequal %} - {% ifequal work.last_campaign.type 3 %} + {% elif work.last_campaign.type == 3 %}

To distribute ebooks as part of a thanks for ungluing campaign, you will need to upload the ebook files to unglue.it.

- {% endifequal %} + {% endif %} {% endif %}

Please choose the edition that most closely matches the edition to be unglued. This is the edition whose cover image will display on your book's page. Your unglued edition should be identical to this edition if possible; you should note any differences under Rights Details below.

{{ form.edition.errors }} {% for edition in campaign.work.editions.all %}
-

Edition {{ edition.id }}: +

Edition {{ edition.id }}:

  • Edit this edition
  • - {% ifnotequal campaign.type 1 %} + {% if campaign.type != 1 %} {% if edition.ebook_files.all.0 %}
  • You have uploaded ebook files for this edition. You can manage its ebooks or upload another
  • {% else %}
  • You can Manage ebooks for this edition.
  • {% endif %} - {% endifnotequal %} + {% endif %}

{% with managing='True' %}{% include "edition_display.html" %}{% endwith %} @@ -155,7 +154,7 @@ Please fix the following before launching your campaign: {% endif %} {% if campaign.work.epubfiles.0 %} {% for ebf in campaign.work.epubfiles %} -

{% if ebf.active %}ACTIVE {% elif ebf.ebook.active %} MIRROR {% endif %}EPUB file: {{ebf.file}}
created {{ebf.created}} for edition {{ebf.edition_id}} {% if ebf.asking %}(This file has had the campaign 'ask' added.){% endif %}
{% if ebf.active %}{% ifequal action 'mademobi' %}A MOBI file is being generated. (Takes a minute or two.) {% else %}You can generate a MOBI file. {% endifequal %}{% endif %}

+

{% if ebf.active %}ACTIVE {% elif ebf.ebook.active %} MIRROR {% endif %}EPUB file: {{ebf.file}}
created {{ebf.created}} for edition {{ebf.edition_id}} {% if ebf.asking %}(This file has had the campaign 'ask' added.){% endif %}
{% if ebf.active %}{% if action == 'mademobi' %}A MOBI file is being generated. (Takes a minute or two.) {% else %}You can generate a MOBI file. {% endif %}{% endif %}

{% endfor %} {% if campaign.work.test_acqs.0 %}
    @@ -174,8 +173,8 @@ Please fix the following before launching your campaign:

    {% if ebf.active %}ACTIVE {% endif %}PDF file: {{ebf.file}}
    created {{ebf.created}} for edition {{ebf.edition_id}} {% if ebf.asking %}(This file has had the campaign 'ask' added.){% endif %}

    {% endfor %} {% endif %} -{% ifnotequal campaign_status 'ACTIVE' %} - {% ifnotequal campaign.type 3 %} +{% if campaign_status != 'ACTIVE' %} + {% if campaign.type != 3 %}

    License being offered

    This is the license you are offering to use once the campaign succeeds. For more information on the licenses you can use, see Creative Commons: About the Licenses. Once your campaign is active, you'll be able to switch to a less restrictive license, but not a more restrictive one. We encourage you to pick the least restrictive license you are comfortable with, as this will increase the ways people can use your unglued ebook and motivate more people to donate.

    {% else %} @@ -184,11 +183,11 @@ Please fix the following before launching your campaign: Once your campaign is active, you'll be able to switch to a less restrictive license, but not a more restrictive one. We encourage you to pick the least restrictive license you are comfortable with, as this will increase the ways people can use your unglued ebook and motivate more people to participate.

    - {% endifnotequal %} + {% endif %}
    {{ form.license.errors }}{{ form.license }}
    - {% ifequal campaign.type 1 %} + {% if campaign.type == 1 %}

    Target Price

    This is the target price for your campaign. The minimum target is ${{form.minimum_target|intcomma}}.

    @@ -205,8 +204,7 @@ Please fix the following before launching your campaign:

    The ending date can't be more than six months away- that's a practical limit for credit card authorizations. The latest ending you can choose right now is {{ campaign.latest_ending }}

    {{ form.deadline.errors }}{{ form.deadline }} - {% endifequal %} - {% ifequal campaign.type 2 %} + {% elif campaign.type == 2 %}

    Revenue Goal

    This is the initial revenue goal for your campaign. Once the campaign starts, the actual revenue goal will decrement every day. When your actual revenue meets your actual revenue goal, your book gets released immediately, for free, under the Creative Commons License that you've specified.

    @@ -226,43 +224,40 @@ Please fix the following before launching your campaign:

    Before launching a campaign, you'll need to select Your initial Ungluing Date. Together with your campaign revenue goal, this will define when your book becomes "unglued". Check out the the ungluing date calculator to see how this works. Your starting Ungluing Date must be before {{ form.max_cc_date }}

    {{ form.cc_date_initial.errors }}{{ form.cc_date_initial }} - {% endifequal %} - {% ifequal campaign.type 3 %} + {% elif campaign.type == 3 %} - {% endifequal %} + {% endif %} {% else %}

    License being offered

    - {% ifnotequal campaign.type 3 %} + {% if campaign.type != 3 %}

    If your campaign succeeds, you will be offering your ebook under a {{ campaign.license }} license.

    {% else %}

    You are offering your ebook under a {{ campaign.license }} license.

    - {% endifnotequal %} + {% endif %}

    Since your campaign is active, you may only change the license to remove restrictions. For more information on the licenses you can use, see Creative Commons: About the Licenses.

    {{ form.license.errors }}{{ form.license }}
    - {% ifequal campaign.type 1 %} + {% if campaign.type == 1 %}

    Target Revenue

    The current target revenue for your campaign is ${{ campaign.target|intcomma }}. Since your campaign is active, you may lower, but not raise, this target. You can get a feel for the interplay between revenue target and ungluing date with the the ungluing date calculator

    ${{ form.target.errors }}{{ form.target }}
    - {% endifequal %} - {% ifequal campaign.type 2 %} + {% elif campaign.type == 2 %}

    Initial Revenue Goal

    The initial revenue goal for your campaign was ${{ campaign.target|intcomma }}; the current amount remaining is ${{ campaign.left|intcomma }}. Since your campaign is active, you may lower, but not raise, this goal. Before you change this, try different parameters with the ungluing date calculator.

    ${{ form.target.errors }}{{ form.target }}
    - {% endifequal %} - {% ifequal campaign.type 1 %} + {% endif %} + {% if campaign.type == 1 %}

    Ending date

    The ending date of your campaign is {{ campaign.deadline }}. Your campaign will conclude on this date or when you meet your target price, whichever is earlier. You may not change the ending date of an active campaign.

    {{ form.deadline.errors }}{{ form.deadline }}
    - {% endifequal %} - {% ifequal campaign.type 2 %} + {% elif campaign.type == 2 %}

    Ungluing Date

    This campaign was launched with a Ungluing Date of {{ campaign.cc_date_initial }}.

    Based on a total revenue of {{ campaign.current_total }} the Ungluing Date has been advanced to {{ campaign.cc_date }}.

    @@ -272,20 +267,19 @@ Please fix the following before launching your campaign: - {% endifequal %} - {% ifequal campaign.type 3 %} + {% elif campaign.type == 3 %} - {% endifequal %} -{% endifnotequal %} -{% ifequal campaign.type 2 %} + {% endif %} +{% endif %} +{% if campaign.type == 2 %}

    Personalization

    If you do not want Unglue.it to use digital watermarking techniques to encode a transaction number into the ebook files, uncheck this box. Either way, ebook files will be personalized; the difference is whether personalization is easy or hard to remove.

    Use watermarking: {{ form.do_watermark }}
    -{% endifequal %}{{ form.do_watermark.errors }} +{% endif %}{{ form.do_watermark.errors }}

    Your Pitch

    - {% ifequal campaign.type 3 %} + {% if campaign.type == 3 %}

    In a "thanks for ungluing" campaign, you want to first "motivate" your book- that is, you want to get the user to download the book. Once the user has clicked a "Download" button or a "Read it Now" button, you have a chance for an "ask" - that's where a user can decide to also make a thank-you contribution. The "ask" will be displayed to a user who has clicked a "Download" button. It's your chance to ask for their support. @@ -295,40 +289,38 @@ Please fix the following before launching your campaign: {% else %}

    This will be displayed in the Campaign tab for your work. It's your main pitch to supporters/purchasers, and your chance to share your passion for this work, and to inspire readers..

    A strong ask:

    - {% endifequal %} + {% endif %}
      - {% ifequal campaign.type 3 %} + {% if campaign.type == 3 %}
    • Thanks the user for their interest in the book.
    • Makes a connection to the user while explaining how a contribution makes your work possible.
    • -
    • Speaks visually to the user (photos and/or videos). The FAQ has instruction on adding media.
    • +
    • Speaks visually to the user (photos and/or videos). The FAQ has instructions on adding media.
    • {% else %} -
    • Introduces the work. What's this book like?
    • -
    • Shows why it matters. How will someone or something -- the world, readers, some cause that matters -- be better off if this book becomes freely available? What kind of impact has the book had already? What will ungluers get out of supporting this campaign?
    • -
    • Has visual appeal (photos and/or videos). The FAQ has instruction on adding media.
    • -
    • Defines important but potentially unfamiliar things. What's an ungluing campaign, and why are you running one? Is there anything unusual about the book, its genre, et cetera? For those who aren't already familiar with you (or the author), who are you? {% ifequal campaign.type 1 %}Are you offering any particularly great premiums you want to call people's attention to?{% endifequal %}
    • -
    • Gives examples of the author's work. This could be links to your site or places people can find more information about you or the book. You can also add quotes, embed a free sample chapter or story, display images, et cetera. These work samples might be from the campaign book itself, or from your (or the author's) other creative works.
    • - {% endifequal %} -
    • Has personality. The writing should be thoroughly proofread but it should have a point of view. This is the place to be conversational, opinionated, funny, quirky -- whatever reflects your style. Be you.
    • +
    • Introduces the work. What's this book about?
    • +
    • Introduces you, the person or organization who will receive support. Who (or what) are you?
    • +
    • Says why it matters. How will someone or something -- the world, readers, some cause that matters -- be better off if this book becomes freely available? What will ungluers get out of supporting this campaign?
    • + {% if campaign.type == 1 %}
    • Motivates support. Are you offering any premiums you want to call people's attention to?
    • {% endif %} +
    • Gives a taste of the work. This could be links to more information about you or the book. You can also add quotes, embed a free sample chapter or story, display images, et cetera. These work samples might be from the campaign book itself, or from your (or the author's) other creative works.
    • +
    • Has visual appeal (photos and/or videos). The FAQ has instruction on adding media.
    • +
    • Explains how the funds to be raised will be used.
    • + {% endif %} - {% ifequal campaign.type 1 %} -
    • Optionally, provides extra incentives (like new or improved premiums) that will kick in if the campaign is unusually successful. Will you do something special when you reach 10% or 50% or 75% of your goal? Or if you reach that milestone before a particular deadline (e.g. in the first week of your campaign)?
    • - {% endifequal %}

    - {% ifequal campaign.type 3 %} + {% if campaign.type == 3 %}
    First, the Motivation. Note that users who immediately click on a "Read it Now" button won't see this.:
    {{ form.work_description.errors }}{{ form.work_description }}
    Next, the Ask. A "thank you" form will float right in this area, so don't use wide graphic elements.
    - {% endifequal %} + {% endif %} {{ form.description.errors }}{{ form.description }} - {% ifequal campaign.type 3 %} + {% if campaign.type == 3 %}

    Enable "Thanks" in your ebook files

    Unglue.it can add your "Ask" along with a link to your book's "thank the creators" page into your ebook files. That way, people who download the book without making a contribution will be reminded that they can do it later.

    Add your ask to files: {{ form.use_add_ask.errors }}{{ form.use_add_ask }}
    - {% endifequal %} + {% endif %}

    Edition and Rights Details

    -

    This will be displayed on the More... tab for your work. It's the fine print for your campaign. {% ifequal campaign.type 1 %}Make sure to disclose any ways the unglued edition will differ from the existing edition; for example: +

    This will be displayed on the More... tab for your work. It's the fine print for your campaign. {% if campaign.type == 1 %}Make sure to disclose any ways the unglued edition will differ from the existing edition; for example:

    • Any material that may have to be excluded due to permissions issues: illustrations, forewords, etc.
    • Any additional materials that will be included, if not already covered in your pitch -- but we encourage you to cover them there to show supporters the value of ungluing!
    • @@ -338,7 +330,7 @@ Please fix the following before launching your campaign:
      • If the text is to be CC BY, but illustrations are only licensed as part of the ebook.
      - {% endifequal %} + {% endif %}

      In short, is there a fact about this campaign that you think would matter to your agent or another publishing wonk, but that no one else is likely to care about? Put it here. If your campaign doesn't have any fine print, you can leave this blank.

      {{ form.details.errors }}{{ form.details }} @@ -355,12 +347,12 @@ Please fix the following before launching your campaign:

      If you are set up as an unglue.it publisher (send us a url, logo, description and list of ways your name might appear) you can link your campaign by selecting the publisher here:

      {{ form.publisher.errors }}{{ form.publisher }}

      {% endif %} - {% ifequal campaign_status 'ACTIVE' %} + {% if campaign_status == 'ACTIVE' %}
      When you click this button, your changes will be visible to supporters immediately. Make sure to proofread!

      {% else %}

      - {% endifequal %} + {% endif %} {% if not is_preview or request.user.is_staff %} {% if campaign_status == 'INITIALIZED' %} @@ -371,20 +363,20 @@ Please fix the following before launching your campaign:
-{% ifequal campaign.type 1 %} +{% if campaign.type == 1 %}

Premiums

{% csrf_token %} @@ -427,8 +419,7 @@ Please fix the following before launching your campaign:
  • $100 and above — Their name, profile link, & a dedication under "bibliophiles"
  • Your premium values may be any amounts -- you do not need to offer premiums at $25/$50/$100. For example, if you offer a $30 premium, anyone pledging to it will be eligible for the $25 reward. This will be communicated to them during the pledging process; you do not need to explain it in your pitch.

    -{% endifequal %} -{% ifequal campaign.type 2 %} +{% elif campaign.type == 2 %}

    Offers to sell

    {% if not campaign.work.ebookfiles.0 %}

    An EPUB file for this work needs to be loaded!

    @@ -451,8 +442,7 @@ Please fix the following before launching your campaign:

    {% endfor %}

    -{% endifequal %} -{% ifequal campaign.type 3 %} +{% elif campaign.type == 3 %}

    Suggested Contributions

    {% if not campaign.work.ebooks.0 %}

    ebook files for this work need to be loaded!

    @@ -472,10 +462,10 @@ Please fix the following before launching your campaign: {% endfor %}

    When a contribution>$1 is made by a library, the library's verified users on unglue.it are not asked to make another contribution.

    -{% endifequal %} +{% endif %} -{% ifequal campaign_status 'INITIALIZED' %} +{% if campaign_status == 'INITIALIZED' %}
    {% if campaign.launchable %}

    Before you hit launch:

    @@ -490,47 +480,45 @@ Please fix the following before launching your campaign: {% else %} - {% ifequal campaign.type 1 %} + {% if campaign.type == 1 %}

    Please make sure you've selected your campaign's edition and entered its description, funding goal, deadline, premiums, and previewed your campaign, before launching.

    - {% endifequal %} - {% ifequal campaign.type 2 %} + {% elif campaign.type == 2 %}

    Please make sure you've selected your campaign's edition and entered its description, funding goal, initial ungluing date, prices, and previewed your campaign, before launching.

    Buy To Unglue campaigns can't be launched until ebook files have been loaded and pricing has been set and made active

    - {% endifequal %} - {% ifequal campaign.type 3 %} + {% elif campaign.type == 3 %}

    Please make sure you've selected your campaign's edition and entered its description and previewed your campaign, before launching.

    Thanks for Ungluing campaigns can't be launched until ebook files have been loaded and a suggested contribution has been set

    - {% endifequal %} + {% endif %} {% endif %}
    -{% endifequal %} +{% endif %}
    {% if campaign_status == 'ACTIVE' or campaign_status == 'SUCCESSFUL' %} {% if campaign_status == 'ACTIVE' %} -

    Your campaign is now active! Hooray!

    +

    Your campaign is now active! Hooray!

    -

    What to do next

    -
      -
    • Tell your friends, relatives, media contacts, professional organizations, social media networks -- everyone!
    • -{% ifequal campaign.type 1 %} -
    • Check in with your campaign frequently. Use comments, description updates, and maybe new premiums to spark additional interest, keep supporters engaged, and keep the momentum going.
    • -{% else %} -
    • Check in on your sales frequently. Remember, you control the per-copy pricing, so think about the promotional value of a temporary price reduction.
    • -{% endifequal %} -
    • Watch media and social networks for mentions of your campaign, and engage in those conversations.
    • -
    • Need help doing any of this? Talk to us.
    • -
    +

    What to do next

    +
      +
    • Tell your friends, relatives, media contacts, professional organizations, social media networks -- everyone!
    • + {% if campaign.type == 1 %} +
    • Check in with your campaign frequently. Use comments, description updates, and maybe new premiums to spark additional interest, keep supporters engaged, and keep the momentum going.
    • + {% else %} +
    • Check in on your sales frequently. Remember, you control the per-copy pricing, so think about the promotional value of a temporary price reduction.
    • + {% endif %} +
    • Watch media and social networks for mentions of your campaign, and engage in those conversations.
    • +
    • Need help doing any of this? Talk to us.
    • +
    {% endif %} -{% ifequal campaign.type 1 %} -

    Acknowledgements

    -

    When you're logged in, the "Ungluers" tab on the campaign page will tell you a bit about each ungluer- when they last pledged, for example, and you can send individual messages to each ungluer. Use this tool with care! You can see who your biggest supporters are by looking at the sample acknowledgement page. -After your campaign succeeds, you can used this page to generate epub code for the acknowledgements section of your unglued ebook. -

    +{% if campaign.type == 1 %} +

    Acknowledgements

    +

    When you're logged in, the "Ungluers" tab on the campaign page will tell you a bit about each ungluer- when they last pledged, for example, and you can send individual messages to each ungluer. Use this tool with care! You can see who your biggest supporters are by looking at the sample acknowledgement page. + After your campaign succeeds, you can used this page to generate epub code for the acknowledgements section of your unglued ebook. +

    {% else %} -{% comment %}This might be a good place to put a sales report. {% endcomment %} -{% endifequal %} + {% comment %}This might be a good place to put a sales report. {% endcomment %} +{% endif %} {% endif %}
    diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index dbd7a84b..1c7aad3d 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -81,14 +81,11 @@ from regluit.frontend.forms import ( RightsHolderForm, UserClaimForm, LibraryThingForm, - getManageCampaignForm, CampaignAdminForm, EmailShareForm, FeedbackForm, EbookForm, EbookFileForm, - CustomPremiumForm, - OfferForm, PledgeCancelForm, getTransferCreditForm, CCForm, @@ -135,7 +132,7 @@ from questionnaire.models import Landing, Questionnaire from questionnaire.views import export_summary as answer_summary, export_csv as export_answers from .bibedit import edit_edition, user_can_edit_work, safe_get_work, get_edition -from .rh_views import RHAgree, rh_admin, claim, rh_tools +from .rh_views import campaign_results, claim, manage_campaign, rh_admin, RHAgree, rh_tools logger = logging.getLogger(__name__) @@ -523,115 +520,8 @@ def manage_ebooks(request, edition_id, by=None): 'ebook_form': ebook_form, 'show_ebook_form':show_ebook_form, }) -def campaign_results(request, campaign): - return render(request, 'campaign_results.html', { - 'campaign': campaign, - }) -def manage_campaign(request, id, ebf=None, action='manage'): - campaign = get_object_or_404(models.Campaign, id=id) - campaign.not_manager = False - campaign.problems = [] - if (not request.user.is_authenticated()) or (not request.user in campaign.managers.all() and not request.user.is_staff): - campaign.not_manager = True - return render(request, 'manage_campaign.html', {'campaign': campaign}) - if action == 'results': - return campaign_results(request, campaign) - alerts = [] - activetab = '#1' - offers = campaign.work.offers.all() - for offer in offers: - offer.offer_form = OfferForm(instance=offer, prefix='offer_%d'%offer.id) - - if request.method == 'POST' : - if request.POST.has_key('add_premium') : - new_premium_form = CustomPremiumForm(data=request.POST) - if new_premium_form.is_valid(): - new_premium_form.save() - alerts.append(_('New premium has been added')) - new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) - else: - alerts.append(_('New premium has not been added')) - form = getManageCampaignForm(instance=campaign) - activetab = '#2' - elif request.POST.has_key('save') or request.POST.has_key('launch') : - form = getManageCampaignForm(instance=campaign, data=request.POST) - if form.is_valid(): - form.save() - campaign.dollar_per_day = None - campaign.set_dollar_per_day() - campaign.work.selected_edition = campaign.edition - if campaign.type in {BUY2UNGLUE, THANKS} : - offers = campaign.work.create_offers() - for offer in offers: - offer.offer_form = OfferForm(instance=offer, prefix='offer_%d'%offer.id) - campaign.update_left() - if campaign.type is THANKS : - campaign.work.description = form.cleaned_data['work_description'] - tasks.process_ebfs.delay(campaign) - campaign.work.save() - alerts.append(_('Campaign data has been saved')) - activetab = '#2' - else: - alerts.append(_('Campaign data has NOT been saved')) - if 'launch' in request.POST.keys(): - activetab = '#3' - if (campaign.launchable and form.is_valid()) and (not settings.IS_PREVIEW or request.user.is_staff): - campaign.activate() - alerts.append(_('Campaign has been launched')) - else: - alerts.append(_('Campaign has NOT been launched')) - new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) - elif request.POST.has_key('inactivate') : - activetab = '#2' - if request.POST.has_key('premium_id'): - premiums_to_stop = request.POST.getlist('premium_id') - for premium_to_stop in premiums_to_stop: - selected_premium = models.Premium.objects.get(id=premium_to_stop) - if selected_premium.type == 'CU': - selected_premium.type = 'XX' - selected_premium.save() - alerts.append(_('Premium %s has been inactivated'% premium_to_stop)) - form = getManageCampaignForm(instance=campaign) - new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) - elif request.POST.has_key('change_offer'): - for offer in offers : - if request.POST.has_key('offer_%d-work' % offer.id) : - offer.offer_form = OfferForm(instance=offer, data = request.POST, prefix='offer_%d'%offer.id) - if offer.offer_form.is_valid(): - offer.offer_form.save() - offer.active = True - offer.save() - alerts.append(_('Offer has been changed')) - else: - alerts.append(_('Offer has not been changed')) - form = getManageCampaignForm(instance=campaign) - new_premium_form = CustomPremiumForm(data={'campaign': campaign}) - activetab = '#2' - else: - if action == 'makemobi': - ebookfile = get_object_or_404(models.EbookFile, id=ebf) - tasks.make_mobi.delay(ebookfile) - return HttpResponseRedirect(reverse('mademobi', args=[campaign.id])) - elif action == 'mademobi': - alerts.append('A MOBI file is being generated') - form = getManageCampaignForm(instance=campaign, initial={'work_description':campaign.work.description}) - new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) - - return render(request, 'manage_campaign.html', { - 'campaign': campaign, - 'form':form, - 'problems': campaign.problems, - 'alerts': alerts, - 'premiums' : campaign.custom_premiums(), - 'premium_form' : new_premium_form, - 'work': campaign.work, - 'activetab': activetab, - 'offers':offers, - 'action':action, - }) - def googlebooks(request, googlebooks_id): try: edition = models.Identifier.objects.get(type='goog', value=googlebooks_id).edition diff --git a/frontend/views/rh_views.py b/frontend/views/rh_views.py index 57737c2d..e5f75090 100644 --- a/frontend/views/rh_views.py +++ b/frontend/views/rh_views.py @@ -5,15 +5,19 @@ from django.conf import settings from django.core.urlresolvers import reverse, reverse_lazy from django.forms.models import modelformset_factory from django.http import HttpResponseRedirect, Http404 -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404 from django.views.generic.edit import CreateView +from django.utils.translation import ugettext_lazy as _ -from regluit.core import models +from regluit.core import models, tasks from regluit.core.parameters import * from regluit.frontend.forms import ( CloneCampaignForm, + CustomPremiumForm, EditManagersForm, + ManageCampaignForm, OpenCampaignForm, + OfferForm, RightsHolderForm, UserClaimForm, ) @@ -175,3 +179,119 @@ def rh_tools(request, template_name='rh_intro.html'): ) return render(request, template_name, {'claims': claims , 'campaigns': campaigns}) +def campaign_results(request, campaign): + return render(request, 'campaign_results.html', { + 'campaign': campaign, + }) + +def manage_campaign(request, id, ebf=None, action='manage'): + campaign = get_object_or_404(models.Campaign, id=id) + campaign.not_manager = False + campaign.problems = [] + if (not request.user.is_authenticated()) or \ + (not request.user in campaign.managers.all() and not request.user.is_staff): + campaign.not_manager = True + return render(request, 'manage_campaign.html', {'campaign': campaign}) + if action == 'results': + return campaign_results(request, campaign) + alerts = [] + activetab = '#1' + offers = campaign.work.offers.all() + for offer in offers: + offer.offer_form = OfferForm(instance=offer, prefix='offer_%d'%offer.id) + + if request.method == 'POST' : + if request.POST.has_key('add_premium') : + new_premium_form = CustomPremiumForm(data=request.POST) + if new_premium_form.is_valid(): + new_premium_form.save() + alerts.append(_('New premium has been added')) + new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) + else: + alerts.append(_('New premium has not been added')) + form = ManageCampaignForm(instance=campaign) + activetab = '#2' + elif request.POST.has_key('save') or request.POST.has_key('launch') : + form = ManageCampaignForm(instance=campaign, data=request.POST) + if form.is_valid(): + form.save() + campaign.dollar_per_day = None + campaign.set_dollar_per_day() + campaign.work.selected_edition = campaign.edition + if campaign.type in {BUY2UNGLUE, THANKS} : + offers = campaign.work.create_offers() + for offer in offers: + offer.offer_form = OfferForm(instance=offer, prefix='offer_%d'%offer.id) + campaign.update_left() + if campaign.type is THANKS : + campaign.work.description = form.cleaned_data['work_description'] + tasks.process_ebfs.delay(campaign) + campaign.work.save() + alerts.append(_('Campaign data has been saved')) + activetab = '#2' + else: + alerts.append(_('Campaign data has NOT been saved')) + if 'launch' in request.POST.keys(): + activetab = '#3' + if (campaign.launchable and form.is_valid()) and \ + (not settings.IS_PREVIEW or request.user.is_staff): + campaign.activate() + alerts.append(_('Campaign has been launched')) + else: + alerts.append(_('Campaign has NOT been launched')) + new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) + elif request.POST.has_key('inactivate') : + activetab = '#2' + if request.POST.has_key('premium_id'): + premiums_to_stop = request.POST.getlist('premium_id') + for premium_to_stop in premiums_to_stop: + selected_premium = models.Premium.objects.get(id=premium_to_stop) + if selected_premium.type == 'CU': + selected_premium.type = 'XX' + selected_premium.save() + alerts.append(_('Premium %s has been inactivated'% premium_to_stop)) + form = ManageCampaignForm(instance=campaign) + new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) + elif request.POST.has_key('change_offer'): + for offer in offers : + if request.POST.has_key('offer_%d-work' % offer.id) : + offer.offer_form = OfferForm( + instance=offer, + data = request.POST, + prefix='offer_%d'%offer.id + ) + if offer.offer_form.is_valid(): + offer.offer_form.save() + offer.active = True + offer.save() + alerts.append(_('Offer has been changed')) + else: + alerts.append(_('Offer has not been changed')) + form = ManageCampaignForm(instance=campaign) + new_premium_form = CustomPremiumForm(data={'campaign': campaign}) + activetab = '#2' + else: + if action == 'makemobi': + ebookfile = get_object_or_404(models.EbookFile, id=ebf) + tasks.make_mobi.delay(ebookfile) + return HttpResponseRedirect(reverse('mademobi', args=[campaign.id])) + elif action == 'mademobi': + alerts.append('A MOBI file is being generated') + form = ManageCampaignForm( + instance=campaign, + initial={'work_description':campaign.work.description} + ) + new_premium_form = CustomPremiumForm(initial={'campaign': campaign}) + + return render(request, 'manage_campaign.html', { + 'campaign': campaign, + 'form':form, + 'problems': campaign.problems, + 'alerts': alerts, + 'premiums' : campaign.custom_premiums(), + 'premium_form' : new_premium_form, + 'work': campaign.work, + 'activetab': activetab, + 'offers':offers, + 'action':action, + }) From 20902c7676bb84ddd1912fc3763ef3cae61e6b24 Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 2 Dec 2017 18:02:47 -0500 Subject: [PATCH 022/109] fix identifier validation --- frontend/forms/bibforms.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/frontend/forms/bibforms.py b/frontend/forms/bibforms.py index a5b43ee0..17c19bdf 100644 --- a/frontend/forms/bibforms.py +++ b/frontend/forms/bibforms.py @@ -133,12 +133,6 @@ class EditionForm(forms.ModelForm): ) self.relators.append({'relator':relator, 'select':select}) - def clean_doi(self): - doi = self.cleaned_data["doi"] - if doi and doi.startswith("http"): - return doi.split('/', 3)[3] - return doi - def clean_title(self): return sanitize_line(self.cleaned_data["title"]) @@ -157,7 +151,7 @@ class EditionForm(forms.ModelForm): err_msg = "{} is a duplicate for work #{}.".format(identifier[0], identifier[0].work_id) self.add_error('id_value', forms.ValidationError(err_msg)) try: - self.cleaned_data['value'] = identifier_cleaner(id_type)(id_value) + self.cleaned_data['id_value'] = identifier_cleaner(id_type)(id_value) except forms.ValidationError, ve: self.add_error('id_value', forms.ValidationError('{}: {}'.format(ve.message, id_value))) return self.cleaned_data From 3889259fd877df1f380e529ed55a398a8ca284f4 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 6 Dec 2017 13:59:05 -0500 Subject: [PATCH 023/109] wrong template --- frontend/views/rh_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/views/rh_views.py b/frontend/views/rh_views.py index e5f75090..bf6fc586 100644 --- a/frontend/views/rh_views.py +++ b/frontend/views/rh_views.py @@ -103,7 +103,7 @@ def claim(request): def rh_tools(request, template_name='rh_intro.html'): if not request.user.is_authenticated() : - return render(request, "rh_tools.html") + return render(request, 'rh_intro.html') claims = request.user.claim.filter(user=request.user) campaign_form = "xxx" if not claims: From 5f39729d7413706d09a0a09e8fd389624e0fc86f Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 6 Dec 2017 18:12:46 -0500 Subject: [PATCH 024/109] fix doi validation --- core/validation.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/validation.py b/core/validation.py index 26ab5446..e07e37bc 100644 --- a/core/validation.py +++ b/core/validation.py @@ -61,13 +61,16 @@ doi_match = re.compile( r'10\.\d+/\S+') def doi_cleaner(value): if not value == 'delete' and not value.startswith('10.'): - return doi_match.match(value).group(0) + try: + return doi_match.search(value).group(0) + except AttributeError: + return '' return value ID_MORE_VALIDATION = { 'isbn': isbn_cleaner, 'olwk': olwk_cleaner, - 'olwk': doi_cleaner, + 'doi': doi_cleaner, } def identifier_cleaner(id_type, quiet=False): From 82784778c4e0cc12968f086d8d636a273669178e Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 6 Dec 2017 18:13:46 -0500 Subject: [PATCH 025/109] add springer scraper --- core/bookloader.py | 37 ++---- core/loaders/__init__.py | 41 ++++++ core/loaders/scrape.py | 28 ++--- core/loaders/springer.py | 118 ++++++++++++++++++ .../commands/load_books_springer.py | 12 ++ frontend/views/bibedit.py | 2 +- 6 files changed, 191 insertions(+), 47 deletions(-) create mode 100644 core/loaders/springer.py create mode 100644 core/management/commands/load_books_springer.py diff --git a/core/bookloader.py b/core/bookloader.py index af494392..5e9ac08e 100755 --- a/core/bookloader.py +++ b/core/bookloader.py @@ -38,7 +38,6 @@ from . import cc from . import models from .parameters import WORK_IDENTIFIERS from .validation import identifier_cleaner, unreverse_name -from .loaders.scrape import get_scraper, scrape_sitemap logger = logging.getLogger(__name__) request_log = logging.getLogger("requests") @@ -755,7 +754,7 @@ def edition_for_ident(id_type, id_value): #print 'returning edition for {}: {}'.format(id_type, id_value) for ident in models.Identifier.objects.filter(type=id_type, value=id_value): return ident.edition if ident.edition else ident.work.editions[0] - + def edition_for_etype(etype, metadata, default=None): ''' assumes the metadata contains the isbn_etype attributes, and that the editions have been created. @@ -774,7 +773,7 @@ def edition_for_etype(etype, metadata, default=None): return edition_for_ident(key, metadata.identifiers[key]) for key in metadata.edition_identifiers.keys(): return edition_for_ident(key, metadata.identifiers[key]) - + MATCH_LICENSE = re.compile(r'creativecommons.org/licenses/([^/]+)/') def load_ebookfile(url, etype): @@ -793,14 +792,14 @@ def load_ebookfile(url, etype): logger.error(u'could not open {}'.format(url)) except ValidationError, e: logger.error(u'downloaded {} was not a valid {}'.format(url, etype)) - + class BasePandataLoader(object): def __init__(self, url): self.base_url = url def load_from_pandata(self, metadata, work=None): ''' metadata is a Pandata object''' - + #find an work to associate edition = None has_ed_id = False @@ -862,7 +861,7 @@ class BasePandataLoader(object): if metadata.description and len(metadata.description) > len(work.description): #be careful about overwriting the work description work.description = metadata.description - if metadata.creator and not edition.authors.count(): + if metadata.creator and not edition.authors.count(): edition.authors.clear() for key in metadata.creator.keys(): creators = metadata.creator[key] @@ -901,7 +900,7 @@ class BasePandataLoader(object): contentfile = load_ebookfile(url, key) if contentfile: contentfile_name = '/loaded/ebook_{}.{}'.format(edition.id, key) - path = default_storage.save(contentfile_name, contentfile) + path = default_storage.save(contentfile_name, contentfile) lic = MATCH_LICENSE.search(metadata.rights_url) license = 'CC {}'.format(lic.group(1).upper()) if lic else '' ebf = models.EbookFile.objects.create( @@ -923,8 +922,8 @@ class BasePandataLoader(object): ) ebf.ebook = ebook ebf.save() - - + + class GithubLoader(BasePandataLoader): def load_ebooks(self, metadata, edition, test_mode=False): # create Ebook for any ebook in the corresponding GitHub release @@ -1013,21 +1012,10 @@ def ebooks_in_github_release(repo_owner, repo_name, tag, token=None): for asset in release.iter_assets() if EBOOK_FORMATS.get(asset.content_type) is not None] -def add_by_webpage(url, work=None, user=None): - edition = None - scraper = get_scraper(url) - loader = BasePandataLoader(url) - pandata = Pandata() - pandata.metadata = scraper.metadata - for metadata in pandata.get_edition_list(): - edition = loader.load_from_pandata(metadata, work) - work = edition.work - loader.load_ebooks(pandata, edition, user=user) - return edition if edition else None - -def add_by_sitemap(url, maxnum=None): +def add_from_bookdatas(bookdatas): + ''' bookdatas are iterators of scrapers ''' editions = [] - for bookdata in scrape_sitemap(url, maxnum=maxnum): + for bookdata in bookdatas: edition = work = None loader = BasePandataLoader(bookdata.base) pandata = Pandata() @@ -1039,6 +1027,3 @@ def add_by_sitemap(url, maxnum=None): if edition: editions.append(edition) return editions - - - diff --git a/core/loaders/__init__.py b/core/loaders/__init__.py index e69de29b..f2f3c5bf 100755 --- a/core/loaders/__init__.py +++ b/core/loaders/__init__.py @@ -0,0 +1,41 @@ +import requests +from bs4 import BeautifulSoup + +from gitenberg.metadata.pandata import Pandata + +from regluit.core.bookloader import add_from_bookdatas, BasePandataLoader +from .scrape import PressbooksScraper, HathitrustScraper, BaseScraper +from .springer import SpringerScraper + +def get_scraper(url): + scrapers = [PressbooksScraper, HathitrustScraper, BaseScraper] + for scraper in scrapers: + if scraper.can_scrape(url): + return scraper(url) + +def scrape_sitemap(url, maxnum=None): + try: + response = requests.get(url, headers={"User-Agent": settings.USER_AGENT}) + doc = BeautifulSoup(response.content, 'lxml') + for page in doc.find_all('loc')[0:maxnum]: + scraper = get_scraper(page.text) + if scraper.metadata.get('genre', None) == 'book': + yield scraper + except requests.exceptions.RequestException as e: + logger.error(e) + +def add_by_webpage(url, work=None, user=None): + edition = None + scraper = get_scraper(url) + loader = BasePandataLoader(url) + pandata = Pandata() + pandata.metadata = scraper.metadata + for metadata in pandata.get_edition_list(): + edition = loader.load_from_pandata(metadata, work) + work = edition.work + loader.load_ebooks(pandata, edition, user=user) + return edition if edition else None + + +def add_by_sitemap(url, maxnum=None): + return add_from_bookdatas(scrape_sitemap(url, maxnum=maxnum)) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index 09671bf0..f1ab495d 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -230,7 +230,7 @@ class BaseScraper(object): if value: self.set('publication_date', value) - def get_authors(self): + def get_author_list(self): value_list = self.check_metas([ 'DC.Creator.PersonalName', 'citation_author', @@ -239,9 +239,15 @@ class BaseScraper(object): if not value_list: value_list = self.get_itemprop('author') if not value_list: - return + return [] + return value_list + + def get_authors(self): + value_list = self.get_author_list() creator_list = [] value_list = authlist_cleaner(value_list) + if len(value_list) == 0: + return if len(value_list) == 1: self.set('creator', {'author': {'agent_name': value_list[0]}}) return @@ -383,21 +389,3 @@ class HathitrustScraper(BaseScraper): def can_scrape(cls, url): ''' return True if the class can scrape the URL ''' return url.find('hathitrust.org') > 0 or url.find('hdl.handle.net/2027/') > 0 - - -def get_scraper(url): - scrapers = [PressbooksScraper, HathitrustScraper, BaseScraper] - for scraper in scrapers: - if scraper.can_scrape(url): - return scraper(url) - -def scrape_sitemap(url, maxnum=None): - try: - response = requests.get(url, headers={"User-Agent": settings.USER_AGENT}) - doc = BeautifulSoup(response.content, 'lxml') - for page in doc.find_all('loc')[0:maxnum]: - scraper = get_scraper(page.text) - if scraper.metadata.get('genre', None) == 'book': - yield scraper - except requests.exceptions.RequestException as e: - logger.error(e) diff --git a/core/loaders/springer.py b/core/loaders/springer.py new file mode 100644 index 00000000..f90df59d --- /dev/null +++ b/core/loaders/springer.py @@ -0,0 +1,118 @@ +import re +import requests + +from bs4 import BeautifulSoup +from urlparse import urljoin +from django.conf import settings + +from regluit.core.validation import identifier_cleaner +from regluit.core.bookloader import add_from_bookdatas + +from .scrape import BaseScraper, CONTAINS_CC + +MENTIONS_CC = re.compile(r'CC BY(-NC)?(-ND|-SA)?', flags=re.I) +HAS_YEAR = re.compile(r'(19|20)\d\d') + +class SpringerScraper(BaseScraper): + def get_downloads(self): + for dl_type in ['epub', 'mobi', 'pdf']: + download_el = self.doc.find('a', title=re.compile(dl_type.upper())) + if download_el: + value = download_el.get('href') + if value: + value = urljoin(self.base, value) + self.set('download_url_{}'.format(dl_type), value) + + def get_description(self): + desc = self.doc.select_one('#book-description') + if desc: + value = '' + for div in desc.contents: + text = div.string.replace(u'\xa0', u' ') if div.string else None + if text: + value = u'{}

    {}

    '.format(value, text) + self.set('description', value) + + def get_keywords(self): + value = [] + for kw in self.doc.select('.Keyword'): + value.append(kw.text.strip()) + if value: + if 'Open Access' in value: + value.remove('Open Access') + self.set('subjects', value) + + def get_identifiers(self): + super(SpringerScraper, self).get_identifiers() + el = self.doc.select_one('#doi-url') + if el: + value = identifier_cleaner('doi', quiet=True)(el.text) + if value: + self.identifiers['doi'] = value + + def get_isbns(self): + isbns = {} + el = self.doc.select_one('#print-isbn') + if el: + value = identifier_cleaner('isbn', quiet=True)(el.text) + if value: + isbns['paper'] = value + el = self.doc.select_one('#electronic-isbn') + if el: + value = identifier_cleaner('isbn', quiet=True)(el.text) + if value: + isbns['electronic'] = value + return isbns + + def get_title(self): + el = self.doc.select_one('#book-title') + if el: + value = el.text.strip() + if value: + value = value.replace('\n', ': ', 1) + self.set('title', value) + if not value: + (SpringerScraper, self).get_title() + + def get_author_list(self): + for el in self.doc.select('.authors__name'): + yield el.text.strip().replace(u'\xa0', u' ') + + def get_license(self): + '''only looks for cc licenses''' + links = self.doc.find_all(href=CONTAINS_CC) + for link in links: + self.set('rights_url', link['href']) + return + mention = self.doc.find(string=MENTIONS_CC) + if mention: + lic = MENTIONS_CC.search(mention).group(0) + lic_url = 'https://creativecommons.org/licences/{}/'.format(lic[3:].lower()) + self.set('rights_url', lic_url) + + def get_pubdate(self): + pubinfo = self.doc.select_one('#copyright-info') + if pubinfo: + yearmatch = HAS_YEAR.search(pubinfo.string) + if yearmatch: + self.set('publication_date', yearmatch.group(0)) + + @classmethod + def can_scrape(cls, url): + ''' return True if the class can scrape the URL ''' + return url.find('10.1007') or url.find('10.1057') + + +search_url = 'https://link.springer.com/search/page/{}?facet-content-type=%22Book%22&package=openaccess' +def load_springer(num_pages): + def springer_open_books(num_pages): + for page in range(1, num_pages+1): + url = search_url.format(page) + response = requests.get(url, headers={"User-Agent": settings.USER_AGENT}) + if response.status_code == 200: + base = response.url + doc = BeautifulSoup(response.content, 'lxml') + for link in doc.select('a.title'): + book_url = urljoin(base, link['href']) + yield SpringerScraper(book_url) + return add_from_bookdatas(springer_open_books(num_pages)) diff --git a/core/management/commands/load_books_springer.py b/core/management/commands/load_books_springer.py new file mode 100644 index 00000000..4c978be7 --- /dev/null +++ b/core/management/commands/load_books_springer.py @@ -0,0 +1,12 @@ +from django.core.management.base import BaseCommand + +from regluit.core.loaders.springer import load_springer + +class Command(BaseCommand): + help = "load books from springer open" + args = "" + + + def handle(self, pages, **options): + books = load_springer(int(pages)) + print "loaded {} books".format(len(books)) diff --git a/frontend/views/bibedit.py b/frontend/views/bibedit.py index ef412f9e..8575cc38 100644 --- a/frontend/views/bibedit.py +++ b/frontend/views/bibedit.py @@ -17,10 +17,10 @@ from regluit.core.bookloader import ( add_by_googlebooks_id, add_by_isbn, add_by_oclc, - add_by_webpage, ) from regluit.core.parameters import WORK_IDENTIFIERS +from regluit.core.loaders import add_by_webpage from regluit.core.loaders.utils import ids_from_urls from regluit.frontend.forms import EditionForm, IdentifierForm From 5c3137a85d53ee522a633ad2c402c874856e625a Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 12:50:08 -0500 Subject: [PATCH 026/109] delint --- core/bookloader.py | 218 ++++++++++++++++++++++++++++----------------- 1 file changed, 136 insertions(+), 82 deletions(-) diff --git a/core/bookloader.py b/core/bookloader.py index 5e9ac08e..cb3669cd 100755 --- a/core/bookloader.py +++ b/core/bookloader.py @@ -4,24 +4,22 @@ external library imports import json import logging import re -import requests -from django.core.files.base import ContentFile -from django.core.files.storage import default_storage -from regluit.core.validation import test_file - from datetime import timedelta from xml.etree import ElementTree from urlparse import (urljoin, urlparse) +import requests + # django imports from django.conf import settings from django.core.files.base import ContentFile -from django_comments.models import Comment +from django.core.files.storage import default_storage from django.db import IntegrityError from django.forms import ValidationError +from django_comments.models import Comment from github3 import (login, GitHub) from github3.repos.release import Release @@ -31,6 +29,7 @@ from gitenberg.metadata.pandata import Pandata import regluit import regluit.core.isbn +from regluit.core.validation import test_file from regluit.marc.models import inverse_marc_rels from regluit.utils.localdatetime import now @@ -50,7 +49,7 @@ def add_by_oclc(isbn, work=None): def add_by_oclc_from_google(oclc): if oclc: - logger.info("adding book by oclc %s" , oclc) + logger.info("adding book by oclc %s", oclc) else: return None try: @@ -62,8 +61,8 @@ def add_by_oclc_from_google(oclc): except LookupFailure, e: logger.exception("lookup failure for %s", oclc) return None - if not results.has_key('items') or len(results['items']) == 0: - logger.warn("no google hits for %s" , oclc) + if not results.has_key('items') or not results['items']: + logger.warn("no google hits for %s", oclc) return None try: @@ -132,11 +131,10 @@ def get_google_isbn_results(isbn): except LookupFailure: logger.exception("lookup failure for %s", isbn) return None - if not results.has_key('items') or len(results['items']) == 0: - logger.warn("no google hits for %s" , isbn) + if not results.has_key('items') or not results['items']: + logger.warn("no google hits for %s", isbn) return None - else: - return results + return results def add_ebooks(item, edition): access_info = item.get('accessInfo') @@ -174,7 +172,8 @@ def update_edition(edition): except (models.Identifier.DoesNotExist, IndexError): return edition - # do a Google Books lookup on the isbn associated with the edition (there should be either 0 or 1 isbns associated + # do a Google Books lookup on the isbn associated with the edition + # (there should be either 0 or 1 isbns associated # with an edition because of integrity constraint in Identifier) # if we get some data about this isbn back from Google, update the edition data accordingly @@ -188,8 +187,9 @@ def update_edition(edition): title = d['title'] else: title = '' - if len(title) == 0: - # need a title to make an edition record; some crap records in GB. use title from parent if available + if not title: + # need a title to make an edition record; some crap records in GB. + # use title from parent if available title = edition.work.title # check for language change @@ -198,9 +198,11 @@ def update_edition(edition): if len(language) > 5: language = language[0:5] - # if the language of the edition no longer matches that of the parent work, attach edition to the + # if the language of the edition no longer matches that of the parent work, + # attach edition to the if edition.work.language != language: - logger.info("reconnecting %s since it is %s instead of %s" %(googlebooks_id, language, edition.work.language)) + logger.info("reconnecting %s since it is %s instead of %s", + googlebooks_id, language, edition.work.language) old_work = edition.work new_work = models.Work(title=title, language=language) @@ -208,10 +210,10 @@ def update_edition(edition): edition.work = new_work edition.save() for identifier in edition.identifiers.all(): - logger.info("moving identifier %s" % identifier.value) + logger.info("moving identifier %s", identifier.value) identifier.work = new_work identifier.save() - if old_work and old_work.editions.count()==0: + if old_work and old_work.editions.count() == 0: #a dangling work; make sure nothing else is attached! merge_works(new_work, old_work) @@ -222,7 +224,12 @@ def update_edition(edition): edition.save() # create identifier if needed - models.Identifier.get_or_add(type='goog', value=googlebooks_id, edition=edition, work=edition.work) + models.Identifier.get_or_add( + type='goog', + value=googlebooks_id, + edition=edition, + work=edition.work + ) for a in d.get('authors', []): edition.add_author(a) @@ -239,7 +246,7 @@ def add_by_isbn_from_google(isbn, work=None): """ if not isbn: return None - if len(isbn)==10: + if len(isbn) == 10: isbn = regluit.core.isbn.convert_10_to_13(isbn) @@ -253,14 +260,18 @@ def add_by_isbn_from_google(isbn, work=None): results = get_google_isbn_results(isbn) if results: try: - return add_by_googlebooks_id(results['items'][0]['id'], work=work, results=results['items'][0], isbn=isbn) + return add_by_googlebooks_id( + results['items'][0]['id'], + work=work, + results=results['items'][0], + isbn=isbn + ) except LookupFailure, e: logger.exception("failed to add edition for %s", isbn) except IntegrityError, e: logger.exception("google books data for %s didn't fit our db", isbn) return None - else: - return None + return None def get_work_by_id(type, value): if value: @@ -295,7 +306,12 @@ def add_by_googlebooks_id(googlebooks_id, work=None, results=None, isbn=None): models.Identifier.objects.get(type='isbn', value=isbn).edition # not going to worry about isbn_edition != edition except models.Identifier.DoesNotExist: - models.Identifier.objects.create(type='isbn', value=isbn, edition=edition, work=edition.work) + models.Identifier.objects.create( + type='isbn', + value=isbn, + edition=edition, + work=edition.work + ) return edition except models.Identifier.DoesNotExist: pass @@ -313,8 +329,9 @@ def add_by_googlebooks_id(googlebooks_id, work=None, results=None, isbn=None): title = d['title'] else: title = '' - if len(title)==0: - # need a title to make an edition record; some crap records in GB. use title from parent if available + if not title: + # need a title to make an edition record; some crap records in GB. + # use title from parent if available if work: title = work.title else: @@ -326,8 +343,8 @@ def add_by_googlebooks_id(googlebooks_id, work=None, results=None, isbn=None): if len(language) > 5: language = language[0:5] if work and work.language != language: - logger.info("not connecting %s since it is %s instead of %s" % - (googlebooks_id, language, work.language)) + logger.info("not connecting %s since it is %s instead of %s", + googlebooks_id, language, work.language) work = None # isbn = None if not isbn: @@ -354,7 +371,7 @@ def add_by_googlebooks_id(googlebooks_id, work=None, results=None, isbn=None): try: e = models.Identifier.objects.get(type='goog', value=googlebooks_id).edition e.new = False - logger.warning( " whoa nellie, somebody else created an edition while we were working.") + logger.warning(" whoa nellie, somebody else created an edition while we were working.") if work.new: work.delete() return e @@ -384,8 +401,8 @@ def add_by_googlebooks_id(googlebooks_id, work=None, results=None, isbn=None): def relate_isbn(isbn, cluster_size=1): - """add a book by isbn and then see if there's an existing work to add it to so as to make a cluster - bigger than cluster_size. + """add a book by isbn and then see if there's an existing work to add it to so as to make a + cluster bigger than cluster_size. """ logger.info("finding a related work for %s", isbn) @@ -395,12 +412,12 @@ def relate_isbn(isbn, cluster_size=1): if edition.work is None: logger.info("didn't add related to null work") return None - if edition.work.editions.count()>cluster_size: + if edition.work.editions.count() > cluster_size: return edition.work for other_isbn in thingisbn(isbn): # 979's come back as 13 logger.debug("other_isbn: %s", other_isbn) - if len(other_isbn)==10: + if len(other_isbn) == 10: other_isbn = regluit.core.isbn.convert_10_to_13(other_isbn) related_edition = add_by_isbn(other_isbn, work=edition.work) if related_edition: @@ -410,9 +427,9 @@ def relate_isbn(isbn, cluster_size=1): related_edition.work = edition.work related_edition.save() elif related_edition.work_id != edition.work_id: - logger.debug("merge_works path 1 %s %s", edition.work_id, related_edition.work_id ) + logger.debug("merge_works path 1 %s %s", edition.work_id, related_edition.work_id) merge_works(related_edition.work, edition.work) - if related_edition.work.editions.count()>cluster_size: + if related_edition.work.editions.count() > cluster_size: return related_edition.work return edition.work @@ -437,7 +454,7 @@ def add_related(isbn): for other_isbn in thingisbn(isbn): # 979's come back as 13 logger.debug("other_isbn: %s", other_isbn) - if len(other_isbn)==10: + if len(other_isbn) == 10: other_isbn = regluit.core.isbn.convert_10_to_13(other_isbn) related_edition = add_by_isbn(other_isbn, work=work) @@ -449,7 +466,7 @@ def add_related(isbn): related_edition.work = work related_edition.save() elif related_edition.work_id != work.id: - logger.debug("merge_works path 1 %s %s", work.id, related_edition.work_id ) + logger.debug("merge_works path 1 %s %s", work.id, related_edition.work_id) work = merge_works(work, related_edition.work) else: if other_editions.has_key(related_language): @@ -460,13 +477,13 @@ def add_related(isbn): # group the other language editions together for lang_group in other_editions.itervalues(): logger.debug("lang_group (ed, work): %s", [(ed.id, ed.work_id) for ed in lang_group]) - if len(lang_group)>1: + if len(lang_group) > 1: lang_edition = lang_group[0] logger.debug("lang_edition.id: %s", lang_edition.id) # compute the distinct set of works to merge into lang_edition.work works_to_merge = set([ed.work for ed in lang_group[1:]]) - set([lang_edition.work]) for w in works_to_merge: - logger.debug("merge_works path 2 %s %s", lang_edition.work_id, w.id ) + logger.debug("merge_works path 2 %s %s", lang_edition.work_id, w.id) merged_work = merge_works(lang_edition.work, w) models.WorkRelation.objects.get_or_create( to_work=lang_group[0].work, @@ -478,9 +495,10 @@ def add_related(isbn): def thingisbn(isbn): """given an ISBN return a list of related edition ISBNs, according to - Library Thing. (takes isbn_10 or isbn_13, returns isbn_10, except for 979 isbns, which come back as isbn_13') + Library Thing. (takes isbn_10 or isbn_13, returns isbn_10, except for 979 isbns, + which come back as isbn_13') """ - logger.info("looking up %s at ThingISBN" , isbn) + logger.info("looking up %s at ThingISBN", isbn) url = "https://www.librarything.com/api/thingISBN/%s" % isbn xml = requests.get(url, headers={"User-Agent": settings.USER_AGENT}).content doc = ElementTree.fromstring(xml) @@ -491,16 +509,17 @@ def merge_works(w1, w2, user=None): """will merge the second work (w2) into the first (w1) """ logger.info("merging work %s into %s", w2.id, w1.id) - # don't merge if the works are the same or at least one of the works has no id (for example, when w2 has already been deleted) + # don't merge if the works are the same or at least one of the works has no id + #(for example, when w2 has already been deleted) if w1 is None or w2 is None or w1.id == w2.id or w1.id is None or w2.id is None: return w1 - if w2.selected_edition != None and w1.selected_edition == None: + if w2.selected_edition is not None and w1.selected_edition is None: #the merge should be reversed temp = w1 w1 = w2 w2 = temp models.WasWork(was=w2.pk, work=w1, user=user).save() - for ww in models.WasWork.objects.filter(work = w2): + for ww in models.WasWork.objects.filter(work=w2): ww.work = w1 ww.save() if w2.description and not w1.description: @@ -560,10 +579,12 @@ def merge_works(w1, w2, user=None): return w1 def detach_edition(e): - """will detach edition from its work, creating a new stub work. if remerge=true, will see if there's another work to attach to + """ + will detach edition from its work, creating a new stub work. if remerge=true, will see if + there's another work to attach to """ logger.info("splitting edition %s from %s", e, e.work) - w = models.Work(title=e.title, language = e.work.language) + w = models.Work(title=e.title, language=e.work.language) w.save() for identifier in e.identifiers.all(): @@ -573,10 +594,13 @@ def detach_edition(e): e.work = w e.save() +SPAM_STRINGS = ["GeneralBooksClub.com", "AkashaPublishing.Com"] def despam_description(description): - """ a lot of descriptions from openlibrary have free-book promotion text; this removes some of it.""" - if description.find("GeneralBooksClub.com")>-1 or description.find("AkashaPublishing.Com")>-1: - return "" + """ a lot of descriptions from openlibrary have free-book promotion text; + this removes some of it.""" + for spam in SPAM_STRINGS: + if description.find(spam) > -1: + return "" pieces = description.split("1stWorldLibrary.ORG -") if len(pieces) > 1: return pieces[1] @@ -585,7 +609,7 @@ def despam_description(description): return pieces[1] return description -def add_openlibrary(work, hard_refresh = False): +def add_openlibrary(work, hard_refresh=False): if (not hard_refresh) and work.openlibrary_lookup is not None: # don't hit OL if we've visited in the past month or so if now()- work.openlibrary_lookup < timedelta(days=30): @@ -615,17 +639,38 @@ def add_openlibrary(work, hard_refresh = False): if e[isbn_key].has_key('details'): if e[isbn_key]['details'].has_key('oclc_numbers'): for oclcnum in e[isbn_key]['details']['oclc_numbers']: - models.Identifier.get_or_add(type='oclc', value=oclcnum, work=work, edition=edition) + models.Identifier.get_or_add( + type='oclc', + value=oclcnum, + work=work, + edition=edition + ) if e[isbn_key]['details'].has_key('identifiers'): ids = e[isbn_key]['details']['identifiers'] if ids.has_key('goodreads'): - models.Identifier.get_or_add(type='gdrd', value=ids['goodreads'][0], work=work, edition=edition) + models.Identifier.get_or_add( + type='gdrd', + value=ids['goodreads'][0], + work=work, edition=edition + ) if ids.has_key('librarything'): - models.Identifier.get_or_add(type='ltwk', value=ids['librarything'][0], work=work) + models.Identifier.get_or_add( + type='ltwk', + value=ids['librarything'][0], + work=work + ) if ids.has_key('google'): - models.Identifier.get_or_add(type='goog', value=ids['google'][0], work=work) + models.Identifier.get_or_add( + type='goog', + value=ids['google'][0], + work=work + ) if ids.has_key('project_gutenberg'): - models.Identifier.get_or_add(type='gute', value=ids['project_gutenberg'][0], work=work) + models.Identifier.get_or_add( + type='gute', + value=ids['project_gutenberg'][0], + work=work + ) if e[isbn_key]['details'].has_key('works'): work_key = e[isbn_key]['details']['works'].pop(0)['key'] logger.info("got openlibrary work %s for isbn %s", work_key, isbn_key) @@ -638,7 +683,9 @@ def add_openlibrary(work, hard_refresh = False): if description.has_key('value'): description = description['value'] description = despam_description(description) - if not work.description or work.description.startswith('{') or len(description) > len(work.description): + if not work.description or \ + work.description.startswith('{') or \ + len(description) > len(work.description): work.description = description work.save() if w.has_key('subjects') and len(w['subjects']) > len(subjects): @@ -669,19 +716,20 @@ def _get_json(url, params={}, type='gb'): if response.status_code == 200: return json.loads(response.content) else: - logger.error("unexpected HTTP response: %s" % response) + logger.error("unexpected HTTP response: %s", response) if response.content: - logger.error("response content: %s" % response.content) + logger.error("response content: %s", response.content) raise LookupFailure("GET failed: url=%s and params=%s" % (url, params)) -def load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, seed_isbn, url, format, license, lang, publication_date): - - # let's start with instantiating the relevant Work and Edition if they don't already exist +def load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, seed_isbn, url, + format, license, lang, publication_date): + ''' let's start with instantiating the relevant Work and Edition if they don't already exist''' try: work = models.Identifier.objects.get(type='olwk', value=ol_work_id).work - except models.Identifier.DoesNotExist: # try to find an Edition with the seed_isbn and use that work to hang off of + except models.Identifier.DoesNotExist: + # try to find an Edition with the seed_isbn and use that work to hang off of sister_edition = add_by_isbn(seed_isbn) if sister_edition.new: # add related editions asynchronously @@ -693,14 +741,18 @@ def load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, seed_isbn, url # Now pull out any existing Gutenberg editions tied to the work with the proper Gutenberg ID try: - edition = models.Identifier.objects.get(type='gtbg', value=gutenberg_etext_id ).edition + edition = models.Identifier.objects.get(type='gtbg', value=gutenberg_etext_id).edition except models.Identifier.DoesNotExist: edition = models.Edition() edition.title = title edition.work = work edition.save() - models.Identifier.get_or_add(type='gtbg', value=gutenberg_etext_id, edition=edition, work=work) + models.Identifier.get_or_add( + type='gtbg', + value=gutenberg_etext_id, + edition=edition, work=work + ) # check to see whether the Edition hasn't already been loaded first # search by url @@ -708,9 +760,9 @@ def load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, seed_isbn, url # format: what's the controlled vocab? -- from Google -- alternative would be mimetype - if len(ebooks): + if ebooks: ebook = ebooks[0] - elif len(ebooks) == 0: # need to create new ebook + else: # need to create new ebook ebook = models.Ebook() if len(ebooks) > 1: @@ -719,7 +771,7 @@ def load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, seed_isbn, url ebook.format = format ebook.provider = 'Project Gutenberg' - ebook.url = url + ebook.url = url ebook.rights = license # is an Ebook instantiable without a corresponding Edition? (No, I think) @@ -733,9 +785,9 @@ class LookupFailure(Exception): pass IDTABLE = [('librarything', 'ltwk'), ('goodreads', 'gdrd'), ('openlibrary', 'olwk'), - ('gutenberg', 'gtbg'), ('isbn', 'isbn'), ('oclc', 'oclc'), - ('googlebooks', 'goog'), ('doi', 'doi'), ('http','http'), ('edition_id', 'edid'), -] + ('gutenberg', 'gtbg'), ('isbn', 'isbn'), ('oclc', 'oclc'), + ('googlebooks', 'goog'), ('doi', 'doi'), ('http', 'http'), ('edition_id', 'edid'), + ] def load_from_yaml(yaml_url, test_mode=False): """ @@ -816,7 +868,7 @@ class BasePandataLoader(object): if value: if id_code not in WORK_IDENTIFIERS: has_ed_id = True - value = value[0] if isinstance(value, list) else value + value = value[0] if isinstance(value, list) else value try: id = models.Identifier.objects.get(type=id_code, value=value) if work and id.work and id.work_id is not work.id: @@ -842,7 +894,7 @@ class BasePandataLoader(object): (note, created) = models.EditionNote.objects.get_or_create(note=metadata.edition_note) else: note = None - edition = models.Edition.objects.create( + edition = models.Edition.objects.create( title=metadata.title, work=work, note=note, @@ -871,9 +923,9 @@ class BasePandataLoader(object): edition.add_author(unreverse_name(creator.get('agent_name', '')), relation=rel_code) for yaml_subject in metadata.subjects: #always add yaml subjects (don't clear) if isinstance(yaml_subject, tuple): - (authority, heading) = yaml_subject + (authority, heading) = yaml_subject elif isinstance(yaml_subject, str): - (authority, heading) = ( '', yaml_subject) + (authority, heading) = ('', yaml_subject) else: continue subject = models.Subject.set_by_name(heading, work=work, authority=authority) @@ -920,7 +972,7 @@ class BasePandataLoader(object): active=False, user=user, ) - ebf.ebook = ebook + ebf.ebook = ebook ebf.save() @@ -945,16 +997,16 @@ class GithubLoader(BasePandataLoader): # not using ebook_name in this code ebooks_in_release = [('epub', 'book.epub')] else: - ebooks_in_release = ebooks_in_github_release(repo_owner, repo_name, repo_tag, token=token) + ebooks_in_release = ebooks_in_github_release(repo_owner, repo_name, repo_tag, token=token) for (ebook_format, ebook_name) in ebooks_in_release: - (book_name_prefix, _ ) = re.search(r'(.*)\.([^\.]*)$', ebook_name).groups() + (book_name_prefix, _) = re.search(r'(.*)\.([^\.]*)$', ebook_name).groups() (ebook, created) = models.Ebook.objects.get_or_create( url=git_download_from_yaml_url( self.base_url, metadata._version, edition_name=book_name_prefix, - format_= ebook_format + format_=ebook_format ), provider='Github', rights=cc.match_license(metadata.rights), @@ -965,8 +1017,10 @@ class GithubLoader(BasePandataLoader): def git_download_from_yaml_url(yaml_url, version, edition_name='book', format_='epub'): - # go from https://github.com/GITenberg/Adventures-of-Huckleberry-Finn_76/raw/master/metadata.yaml - # to https://github.com/GITenberg/Adventures-of-Huckleberry-Finn_76/releases/download/v0.0.3/Adventures-of-Huckleberry-Finn.epub + ''' + go from https://github.com/GITenberg/Adventures-of-Huckleberry-Finn_76/raw/master/metadata.yaml + to https://github.com/GITenberg/Adventures-of-Huckleberry-Finn_76/releases/download/v0.0.3/Adventures-of-Huckleberry-Finn.epub + ''' if yaml_url.endswith('raw/master/metadata.yaml'): repo_url = yaml_url[0:-24] #print (repo_url,version,edition_name) From 6bba688f03d84fa82046e373f12e7b020b3883a0 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 16:33:53 -0500 Subject: [PATCH 027/109] fix kw loading --- core/bookloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/bookloader.py b/core/bookloader.py index cb3669cd..ad59bb83 100755 --- a/core/bookloader.py +++ b/core/bookloader.py @@ -924,7 +924,7 @@ class BasePandataLoader(object): for yaml_subject in metadata.subjects: #always add yaml subjects (don't clear) if isinstance(yaml_subject, tuple): (authority, heading) = yaml_subject - elif isinstance(yaml_subject, str): + elif isinstance(yaml_subject, str) or isinstance(yaml_subject, unicode) : (authority, heading) = ('', yaml_subject) else: continue From 81c3268f70c529545b5a34f45973082d7c012e1a Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 16:34:25 -0500 Subject: [PATCH 028/109] fix license url --- core/loaders/springer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/loaders/springer.py b/core/loaders/springer.py index f90df59d..01e0b84e 100644 --- a/core/loaders/springer.py +++ b/core/loaders/springer.py @@ -87,7 +87,7 @@ class SpringerScraper(BaseScraper): mention = self.doc.find(string=MENTIONS_CC) if mention: lic = MENTIONS_CC.search(mention).group(0) - lic_url = 'https://creativecommons.org/licences/{}/'.format(lic[3:].lower()) + lic_url = 'https://creativecommons.org/licenses/{}/'.format(lic[3:].lower()) self.set('rights_url', lic_url) def get_pubdate(self): From c6885ff84b2e8a3c672e2673bb5329f10ec180a8 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 16:35:11 -0500 Subject: [PATCH 029/109] fix springer descriptions --- core/loaders/springer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/loaders/springer.py b/core/loaders/springer.py index 01e0b84e..e987c41a 100644 --- a/core/loaders/springer.py +++ b/core/loaders/springer.py @@ -28,8 +28,9 @@ class SpringerScraper(BaseScraper): if desc: value = '' for div in desc.contents: - text = div.string.replace(u'\xa0', u' ') if div.string else None + text = div.get_text() if hasattr(div, 'get_text') else div.string if text: + text = text.replace(u'\xa0', u' ') value = u'{}

    {}

    '.format(value, text) self.set('description', value) From a3f1509cc2e2f39f2f8eef4a2760e5afb84837d8 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 17:33:29 -0500 Subject: [PATCH 030/109] fix multiple editor setting --- core/bookloader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/bookloader.py b/core/bookloader.py index ad59bb83..838abdd6 100755 --- a/core/bookloader.py +++ b/core/bookloader.py @@ -917,7 +917,9 @@ class BasePandataLoader(object): edition.authors.clear() for key in metadata.creator.keys(): creators = metadata.creator[key] - rel_code = inverse_marc_rels.get(key, 'aut') + rel_code = inverse_marc_rels.get(key, None) + if not rel_code: + rel_code = inverse_marc_rels.get(key.rstrip('s'), 'auth') creators = creators if isinstance(creators, list) else [creators] for creator in creators: edition.add_author(unreverse_name(creator.get('agent_name', '')), relation=rel_code) From 5ccd7a0a47f3224968f92c2ac4d1a500ed4733ff Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 17:35:52 -0500 Subject: [PATCH 031/109] add get_role to scraper --- core/loaders/scrape.py | 12 ++++++++---- core/loaders/springer.py | 5 +++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index f1ab495d..103067e3 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -242,20 +242,24 @@ class BaseScraper(object): return [] return value_list + def get_role(self): + return 'author' + def get_authors(self): + role = self.get_role() value_list = self.get_author_list() creator_list = [] value_list = authlist_cleaner(value_list) if len(value_list) == 0: return if len(value_list) == 1: - self.set('creator', {'author': {'agent_name': value_list[0]}}) + self.set('creator', {role: {'agent_name': value_list[0]}}) return - for auth in value_list: + for auth in value_list: creator_list.append({'agent_name': auth}) - self.set('creator', {'authors': creator_list }) - + self.set('creator', {'{}s'.format(role): creator_list }) + def get_cover(self): image_url = self.check_metas(['og.image', 'image', 'twitter:image']) if not image_url: diff --git a/core/loaders/springer.py b/core/loaders/springer.py index e987c41a..5f270dbe 100644 --- a/core/loaders/springer.py +++ b/core/loaders/springer.py @@ -75,6 +75,11 @@ class SpringerScraper(BaseScraper): if not value: (SpringerScraper, self).get_title() + def get_role(self): + if self.doc.select_one('#editors'): + return 'editor' + return 'author' + def get_author_list(self): for el in self.doc.select('.authors__name'): yield el.text.strip().replace(u'\xa0', u' ') From d53b3bcc8def4e8e60130067c928ed4ee9f3231a Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 17:36:08 -0500 Subject: [PATCH 032/109] delint --- core/loaders/scrape.py | 60 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index 103067e3..85f66eca 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -16,7 +16,7 @@ CONTAINS_COVER = re.compile('cover') CONTAINS_CC = re.compile('creativecommons.org') CONTAINS_OCLCNUM = re.compile('worldcat.org/oclc/(\d+)') -class BaseScraper(object): +class BaseScraper(object): ''' designed to make at least a decent gues for webpages that embed metadata ''' @@ -57,23 +57,23 @@ class BaseScraper(object): # # utilities # - + def set(self, name, value): self.metadata[name] = value - + def fetch_one_el_content(self, el_name): data_el = self.doc.find(el_name) value = '' if data_el: value = data_el.text - return value - + return value + def check_metas(self, meta_list, **attrs): value = '' list_mode = attrs.pop('list_mode', 'longest') for meta_name in meta_list: attrs['name'] = meta_name - + metas = self.doc.find_all('meta', attrs=attrs) if len(metas) == 0: # some sites put schema.org metadata in metas @@ -88,19 +88,19 @@ class BaseScraper(object): value = el_value elif list_mode == 'list': if value == '': - value = [el_value] + value = [el_value] else: value.append(el_value) if value: return value - return value - + return value + def get_dt_dd(self, name): ''' get the content of
    after a
    containing name''' dt = self.doc.find('dt', string=re.compile(name)) dd = dt.find_next_sibling('dd') if dt else None return dd.text if dd else None - + def get_itemprop(self, name, **attrs): value_list = [] list_mode = attrs.pop('list_mode', 'list') @@ -126,14 +126,14 @@ class BaseScraper(object): def get_genre(self): value = self.check_metas(['DC.Type', 'dc.type', 'og:type']) if value and value in ('Text.Book', 'book'): - self.set('genre', 'book') + self.set('genre', 'book') def get_title(self): value = self.check_metas(['DC.Title', 'dc.title', 'citation_title', 'og:title', 'title']) if not value: value = self.fetch_one_el_content('title') self.set('title', value) - + def get_language(self): value = self.check_metas(['DC.Language', 'dc.language', 'language', 'inLanguage']) self.set('language', value) @@ -151,7 +151,7 @@ class BaseScraper(object): '''return a dict of edition keys and ISBNs''' isbns = {} isbn_cleaner = identifier_cleaner('isbn', quiet=True) - label_map = {'epub': 'EPUB', 'mobi': 'Mobi', + label_map = {'epub': 'EPUB', 'mobi': 'Mobi', 'paper': 'Paperback', 'pdf':'PDF', 'hard':'Hardback'} for key in label_map.keys(): isbn_key = 'isbn_{}'.format(key) @@ -180,7 +180,7 @@ class BaseScraper(object): if value: self.identifiers['doi'] = value - #look for oclc numbers + #look for oclc numbers links = self.doc.find_all(href=CONTAINS_OCLCNUM) for link in links: oclcmatch = CONTAINS_OCLCNUM.search(link['href']) @@ -212,12 +212,12 @@ class BaseScraper(object): }) if len(ed_list): self.set('edition_list', ed_list) - + def get_keywords(self): value = self.check_metas(['keywords']).strip(',;') if value: self.set('subjects', re.split(' *[;,] *', value)) - + def get_publisher(self): value = self.check_metas(['citation_publisher', 'DC.Source']) if value: @@ -272,14 +272,14 @@ class BaseScraper(object): if not image_url.startswith('http'): image_url = urljoin(self.base, image_url) self.set('covers', [{'image_url': image_url}]) - + def get_downloads(self): for dl_type in ['epub', 'mobi', 'pdf']: dl_meta = 'citation_{}_url'.format(dl_type) value = self.check_metas([dl_meta]) if value: self.set('download_url_{}'.format(dl_type), value) - + def get_license(self): '''only looks for cc licenses''' links = self.doc.find_all(href=CONTAINS_CC) @@ -290,13 +290,13 @@ class BaseScraper(object): def can_scrape(cls, url): ''' return True if the class can scrape the URL ''' return True - + class PressbooksScraper(BaseScraper): def get_downloads(self): for dl_type in ['epub', 'mobi', 'pdf']: download_el = self.doc.select_one('.{}'.format(dl_type)) if download_el and download_el.find_parent(): - value = download_el.find_parent().get('href') + value = download_el.find_parent().get('href') if value: self.set('download_url_{}'.format(dl_type), value) @@ -309,7 +309,7 @@ class PressbooksScraper(BaseScraper): self.set('publisher', value) else: super(PressbooksScraper, self).get_publisher() - + def get_title(self): value = self.doc.select_one('.entry-title a[title]') value = value['title'] if value else None @@ -327,10 +327,10 @@ class PressbooksScraper(BaseScraper): self.identifiers['isbn_{}'.format(key)] = isbn isbns[key] = isbn return isbns - + @classmethod def can_scrape(cls, url): - pb_sites = ['bookkernel.com','milnepublishing.geneseo.edu', 'pressbooks', + pb_sites = ['bookkernel.com','milnepublishing.geneseo.edu', 'pressbooks', 'press.rebus.community','pb.unizin.org'] ''' return True if the class can scrape the URL ''' for site in pb_sites: @@ -340,7 +340,7 @@ class PressbooksScraper(BaseScraper): class HathitrustScraper(BaseScraper): - + CATALOG = re.compile(r'catalog.hathitrust.org/Record/(\d+)') def setup(self): @@ -354,28 +354,28 @@ class HathitrustScraper(BaseScraper): self.record = record return self.record = {} - + def get_downloads(self): dl_a = self.doc.select_one('#fullPdfLink') value = dl_a['href'] if dl_a else None if value: self.set( - 'download_url_{}'.format('pdf'), + 'download_url_{}'.format('pdf'), 'https://babel.hathitrust.org{}'.format(value) ) - + def get_isbns(self): isbn = self.record.get('issn', []) value = identifier_cleaner('isbn', quiet=True)(isbn) return {'print': value} if value else {} - + def get_title(self): self.set('title', self.record.get('title', '')) def get_keywords(self): self.set('subjects', self.record.get('keywords', [])) - + def get_publisher(self): self.set('publisher', self.record.get('publisher', '')) @@ -385,7 +385,7 @@ class HathitrustScraper(BaseScraper): def get_description(self): notes = self.record.get('notes', []) self.set('description', '\r'.join(notes)) - + def get_genre(self): self.set('genre', self.record.get('type_of_reference', '').lower()) From 3c7c9ade0006bbaec4f7e08f29aab3590ba9c2ce Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 7 Dec 2017 17:36:35 -0500 Subject: [PATCH 033/109] add Springer to get_scraper --- core/loaders/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/loaders/__init__.py b/core/loaders/__init__.py index f2f3c5bf..00d3152c 100755 --- a/core/loaders/__init__.py +++ b/core/loaders/__init__.py @@ -8,7 +8,7 @@ from .scrape import PressbooksScraper, HathitrustScraper, BaseScraper from .springer import SpringerScraper def get_scraper(url): - scrapers = [PressbooksScraper, HathitrustScraper, BaseScraper] + scrapers = [PressbooksScraper, HathitrustScraper, SpringerScraper, BaseScraper] for scraper in scrapers: if scraper.can_scrape(url): return scraper(url) From 816b0a10991c607d12a826072d0bb6e9dfd37421 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 8 Dec 2017 11:04:00 -0500 Subject: [PATCH 034/109] how did that ever work? --- frontend/forms/rh_forms.py | 2 +- frontend/views/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/forms/rh_forms.py b/frontend/forms/rh_forms.py index 3033835c..ec899956 100644 --- a/frontend/forms/rh_forms.py +++ b/frontend/forms/rh_forms.py @@ -80,7 +80,7 @@ class UserClaimForm (forms.ModelForm): def __init__(self, user_instance, *args, **kwargs): super(UserClaimForm, self).__init__(*args, **kwargs) self.fields['rights_holder'] = forms.ModelChoiceField( - queryset=user_instance.rights_holder.filter(approved=False), + queryset=user_instance.rights_holder.all(), empty_label=None, ) diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 1c7aad3d..89b4018f 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -360,7 +360,7 @@ def work(request, work_id, action='display'): work.last_campaign_status = 'ACTIVE' if not request.user.is_anonymous(): - claimform = UserClaimForm(request.user, data={'claim-work':work.pk, 'claim-user': request.user.id}, prefix = 'claim') + claimform = UserClaimForm(request.user, initial={'work':work.pk, 'user': request.user.id}, prefix = 'claim') else: claimform = None From 22870a4350680f2ce0b5ad9713c0a75d304cc4c1 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 8 Dec 2017 20:58:37 -0500 Subject: [PATCH 035/109] harden object retrieval against unexpected input --- api/views.py | 2 +- frontend/views/__init__.py | 36 +++++++++++++++++++++++++++++------- frontend/views/rh_views.py | 12 ++++++++++-- libraryauth/views.py | 5 ++++- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/api/views.py b/api/views.py index f6345794..5a3c2f3d 100755 --- a/api/views.py +++ b/api/views.py @@ -7,7 +7,7 @@ from django.contrib import auth from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.core.urlresolvers import reverse -from django.shortcuts import render, render_to_response, get_object_or_404 +from django.shortcuts import render, render_to_response from django.template import RequestContext from django.views.decorators.csrf import csrf_exempt from django.views.generic.base import View, TemplateView diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 89b4018f..f22ae3f8 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -709,7 +709,10 @@ class ByPubView(WorkListView): publisher = None def get_publisher_name(self): - self.publisher_name = get_object_or_404(models.PublisherName, id=self.kwargs['pubname']) + try: + self.publisher_name = get_object_or_404(models.PublisherName, id=self.kwargs['pubname']) + except ValueError: + raise Http404 self.set_publisher() def set_publisher(self): @@ -1146,7 +1149,11 @@ class FundView(FormView): t_id=self.kwargs["t_id"] if self.transaction is None: - self.transaction = get_object_or_404(Transaction, id=t_id) + try: + self.transaction = get_object_or_404(Transaction, id=t_id) + except ValueError: + raise Http404 + if not self.transaction.campaign: self.action = 'donation' @@ -1298,7 +1305,7 @@ class PledgeRechargeView(TemplateView): campaign = work.last_campaign() if campaign is None: - return Http404 + raise Http404 transaction = campaign.transaction_to_recharge(user) @@ -1445,8 +1452,12 @@ class PledgeCancelView(FormView): else: context["error"] = "You are not logged in." return context + + try: + campaign = get_object_or_404(models.Campaign, id=self.kwargs["campaign_id"]) + except ValueError: + raise Http404 - campaign = get_object_or_404(models.Campaign, id=self.kwargs["campaign_id"]) if campaign.status != 'ACTIVE': context["error"] = "{0} is not an active campaign".format(campaign) return context @@ -1493,7 +1504,11 @@ class PledgeCancelView(FormView): try: # look up the specified campaign and attempt to pull up the appropriate transaction # i.e., the transaction actually belongs to user, that the transaction is active - campaign = get_object_or_404(models.Campaign, id=self.kwargs["campaign_id"], status='ACTIVE') + try: + campaign = get_object_or_404(models.Campaign, id=self.kwargs["campaign_id"], status='ACTIVE') + except ValueError: + raise Http404 + transaction = campaign.transaction_set.get(user=user, status=TRANSACTION_STATUS_ACTIVE, type=PAYMENT_TYPE_AUTHORIZATION) # attempt to cancel the transaction and redirect to the Work page if cancel is successful @@ -2454,7 +2469,11 @@ def emailshare(request, action): return render(request, "emailshare.html", {'form':form}) def ask_rh(request, campaign_id): - campaign = get_object_or_404(models.Campaign, id=campaign_id) + try: + campaign = get_object_or_404(models.Campaign, id=campaign_id) + except ValueError: + raise Http404 + return feedback(request, recipient=campaign.email, template="ask_rh.html", message_template="ask_rh.txt", redirect_url = reverse('work', args=[campaign.work_id]), @@ -2737,7 +2756,10 @@ def reserve(request, work_id): return PurchaseView.as_view()(request, work_id=work_id) def download_ebook(request, ebook_id): - ebook = get_object_or_404(models.Ebook, id=ebook_id) + try: + ebook = get_object_or_404(models.Ebook, id=ebook_id) + except ValueError: + raise Http404 ebook.increment() logger.info("ebook: {0}, user_ip: {1}".format(ebook_id, request.META['REMOTE_ADDR'])) return HttpResponseRedirect(ebook.url) diff --git a/frontend/views/rh_views.py b/frontend/views/rh_views.py index bf6fc586..5b6efed9 100644 --- a/frontend/views/rh_views.py +++ b/frontend/views/rh_views.py @@ -185,7 +185,11 @@ def campaign_results(request, campaign): }) def manage_campaign(request, id, ebf=None, action='manage'): - campaign = get_object_or_404(models.Campaign, id=id) + try: + campaign = get_object_or_404(models.Campaign, id=id) + except ValueError: + raise Http404 + campaign.not_manager = False campaign.problems = [] if (not request.user.is_authenticated()) or \ @@ -272,7 +276,11 @@ def manage_campaign(request, id, ebf=None, action='manage'): activetab = '#2' else: if action == 'makemobi': - ebookfile = get_object_or_404(models.EbookFile, id=ebf) + try: + ebookfile = get_object_or_404(models.EbookFile, id=ebf) + except ValueError: + raise Http404 + tasks.make_mobi.delay(ebookfile) return HttpResponseRedirect(reverse('mademobi', args=[campaign.id])) elif action == 'mademobi': diff --git a/libraryauth/views.py b/libraryauth/views.py index d7d3b498..b17f00c1 100644 --- a/libraryauth/views.py +++ b/libraryauth/views.py @@ -21,7 +21,10 @@ logger = logging.getLogger(__name__) def get_library_or_404(library=None, library_id=None): if library_id: - return get_object_or_404(Library, id=library_id) + try: + return get_object_or_404(Library, id=library_id) + except ValueError: + raise Http404 else: return get_object_or_404(Library, user__username=library) From 5e5a7c699aadedca9b8a447a03c1a844819b6e66 Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 9 Dec 2017 13:55:41 -0500 Subject: [PATCH 036/109] determines error logging email --- settings/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/common.py b/settings/common.py index 1a77cbcb..34256000 100644 --- a/settings/common.py +++ b/settings/common.py @@ -233,7 +233,7 @@ LOGGING = { # django-registration EMAIL_HOST = 'smtp.gluejar.com' DEFAULT_FROM_EMAIL = 'notices@gluejar.com' -SERVER_EMAIL = 'unglueit@ebookfoundation.org' +SERVER_EMAIL = 'notices@gluejar.com' SUPPORT_EMAIL = 'unglueit@ebookfoundation.org' ACCOUNT_ACTIVATION_DAYS = 30 SESSION_COOKIE_AGE = 3628800 # 6 weeks From cc1c5b6ee88dc76d41b82f37c4d34b1e1a046ab5 Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 10 Dec 2017 16:33:07 -0500 Subject: [PATCH 037/109] add management command --- .../management/commands/make_missing_mobis.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 core/management/commands/make_missing_mobis.py diff --git a/core/management/commands/make_missing_mobis.py b/core/management/commands/make_missing_mobis.py new file mode 100644 index 00000000..700f2d22 --- /dev/null +++ b/core/management/commands/make_missing_mobis.py @@ -0,0 +1,33 @@ +from django.core.management.base import BaseCommand +from regluit.core.models import Work + + +class Command(BaseCommand): + help = "generate mobi ebooks where needed and possible." + args = "" + + def handle(self, max=None, **options): + if max: + try: + max = int(max) + except ValueError: + max = 1 + else: + max = 1 + epubs = Work.objects.filter(editions__ebooks__format='epub').distinct().order_by('-id') + + i = 0 + for work in epubs: + if not work.ebooks().filter(format="mobi"): + for ebook in work.ebooks().filter(format="epub"): + ebf = ebook.get_archive_ebf() + if ebf: + try: + if ebf.make_mobi(): + print 'made mobi for {}'.format(ebf.edition.work.title) + i = i + 1 + break + except: + pass + if i >= max: + break From 678474b98581590ef1739e907ad902c3f8e4734a Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 10 Dec 2017 16:33:59 -0500 Subject: [PATCH 038/109] do conversion before making ebf --- core/models/bibmodels.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/models/bibmodels.py b/core/models/bibmodels.py index 08cfb3b8..adc92c98 100644 --- a/core/models/bibmodels.py +++ b/core/models/bibmodels.py @@ -1070,8 +1070,18 @@ class EbookFile(models.Model): def make_mobi(self): if not self.format == 'epub' or not settings.MOBIGEN_URL: return False - new_mobi_ebf = EbookFile.objects.create(edition=self.edition, format='mobi', asking=self.asking) - new_mobi_ebf.file.save(path_for_file('ebf', None), ContentFile(mobi.convert_to_mobi(self.file.url))) + try: + mobi_cf = ContentFile(mobi.convert_to_mobi(self.file.url)) + except: + return False + new_mobi_ebf = EbookFile.objects.create( + edition=self.edition, + format='mobi', + asking=self.asking, + source=self.file.url + ) + + new_mobi_ebf.file.save(path_for_file('ebf', None), mobi_cf) new_mobi_ebf.save() if self.ebook: new_ebook = Ebook.objects.create( From ebf68befeb7eab1e3816fa3730b0943da64a51d5 Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 10 Dec 2017 16:38:30 -0500 Subject: [PATCH 039/109] add Springer publisher --- core/loaders/springer.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/loaders/springer.py b/core/loaders/springer.py index 5f270dbe..8de8ea36 100644 --- a/core/loaders/springer.py +++ b/core/loaders/springer.py @@ -103,6 +103,9 @@ class SpringerScraper(BaseScraper): if yearmatch: self.set('publication_date', yearmatch.group(0)) + def get_publisher(self): + self.set('publisher', 'Springer') + @classmethod def can_scrape(cls, url): ''' return True if the class can scrape the URL ''' From 886068a6eeb64dcd896a9443581316fee17d696c Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 10 Dec 2017 17:05:58 -0500 Subject: [PATCH 040/109] clean up after change to work id doi and http_id were changed to work only --- core/models/bibmodels.py | 18 ++++++++++-------- frontend/templates/edition_display.html | 6 ------ frontend/templates/work.html | 11 +++++++++++ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/core/models/bibmodels.py b/core/models/bibmodels.py index adc92c98..da07c444 100644 --- a/core/models/bibmodels.py +++ b/core/models/bibmodels.py @@ -149,6 +149,14 @@ class Work(models.Model): def doab(self): return id_for(self, 'doab') + @property + def doi(self): + return self.id_for('doi') + + @property + def http_id(self): + return self.id_for('http') + @property def googlebooks_id(self): try: @@ -887,6 +895,8 @@ class Edition(models.Model): return regluit.core.isbn.convert_13_to_10(self.isbn_13) def id_for(self, type): + if type in WORK_IDENTIFIERS: + return self.work.id_for(type) return id_for(self, type) @property @@ -905,18 +915,10 @@ class Edition(models.Model): def oclc(self): return self.id_for('oclc') - @property - def doi(self): - return self.id_for('doi') - @property def goodreads_id(self): return self.id_for('gdrd') - @property - def http_id(self): - return self.id_for('http') - @staticmethod def get_by_isbn(isbn): if len(isbn) == 10: diff --git a/frontend/templates/edition_display.html b/frontend/templates/edition_display.html index 4a9d5030..90531d82 100644 --- a/frontend/templates/edition_display.html +++ b/frontend/templates/edition_display.html @@ -32,12 +32,6 @@ {% if edition.oclc %} OCLC: {{ edition.oclc }}
    {% endif %} - {% if edition.doi %} - DOI: {{ edition.doi }}
    - {% endif %} - {% if edition.http_id %} - web: {{ edition.http_id }}
    - {% endif %} {% if not managing %} {% if user_can_edit_work %} Edit this edition
    diff --git a/frontend/templates/work.html b/frontend/templates/work.html index b745e0c7..d00aa57d 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -482,6 +482,17 @@ {% endif %} {% endif %} + {% with doi=work.doi http_id=work.http_id %} + {% if doi or http_id %} +

    Links

    + {% if doi %} + DOI: {{ doi }}
    + {% endif %} + {% if http_id %} + web: {{ http_id }}
    + {% endif %} + {% endif %} + {% endwith %}

    Editions

    {% if alert %}

    {{ alert }}
    From 4499b556c6e28bdfb72d6e2a3b76bd90549881b4 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 11 Dec 2017 13:45:47 -0500 Subject: [PATCH 041/109] protect long descriptions scraper was over-writing edited descriptions --- core/bookloader.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/bookloader.py b/core/bookloader.py index 838abdd6..3193b9c8 100755 --- a/core/bookloader.py +++ b/core/bookloader.py @@ -908,11 +908,16 @@ class BasePandataLoader(object): ) if metadata.publisher: #always believe yaml edition.set_publisher(metadata.publisher) + if metadata.publication_date: #always believe yaml edition.publication_date = metadata.publication_date + + #be careful about overwriting the work description if metadata.description and len(metadata.description) > len(work.description): - #be careful about overwriting the work description - work.description = metadata.description + # don't over-write reasonably long descriptions + if len(work.description) < 500: + work.description = metadata.description + if metadata.creator and not edition.authors.count(): edition.authors.clear() for key in metadata.creator.keys(): From 76e71ea2dbe91a15aa0893246a1fe95e341aca9d Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Tue, 12 Dec 2017 08:42:54 -0800 Subject: [PATCH 042/109] the Vagrantfile I used to build production instance with xenial. I then switched over to productionn branch by hand.... --- vagrant/Vagrantfile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index 91e1239e..2e0b7ded 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -264,7 +264,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e hostname=unglue.it", "-e setdns=false", "-e do_migrate=false", - "-e branch=production" + "-e branch=xenial" ] end @@ -296,7 +296,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 aws.ami = "ami-aa2ea6d0" - aws.security_groups = ["web-production"] aws.tags = { @@ -331,7 +330,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e hostname=unglue.it", "-e setdns=false", "-e do_migrate=false", - "-e branch=production" + "-e branch=xenial" ] end @@ -363,7 +362,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # hvm:ebs-ssd 20171121.1 ami-aa2ea6d0 aws.ami = "ami-aa2ea6d0" - aws.security_groups = ["web-production"] aws.tags = { From cebdb6b2857b584ff675f008c77454b376285ab7 Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Tue, 12 Dec 2017 08:44:53 -0800 Subject: [PATCH 043/109] fix branches to be used on just and production --- vagrant/Vagrantfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index 2e0b7ded..179b62a3 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -31,7 +31,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e class=please", "-e hostname=please.unglue.it", "-e setdns=true", - "-e branch=xenial", + "-e branch=master", # "--start-at-task=restart_here" ] end @@ -119,7 +119,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e class=just", "-e hostname=just.unglue.it", "-e setdns=false", - "-e branch=xenial", + "-e branch=master", "-e do_migrate=false" ] @@ -191,7 +191,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e class=just", "-e hostname=just2.unglue.it", "-e setdns=false", - "-e branch=xenial", + "-e branch=master", "-e do_migrate=false" ] @@ -264,7 +264,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e hostname=unglue.it", "-e setdns=false", "-e do_migrate=false", - "-e branch=xenial" + "-e branch=production" ] end @@ -330,7 +330,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| "-e hostname=unglue.it", "-e setdns=false", "-e do_migrate=false", - "-e branch=xenial" + "-e branch=production" ] end From 877affd8bf591d7b3084f7d5fd90c45bdbc1b44f Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 12 Dec 2017 13:26:01 -0500 Subject: [PATCH 044/109] implement sass for only pledge.css --- frontend/templates/base.html | 3 - frontend/templates/basepledge.html | 3 +- frontend/templates/manage_account.html | 3 +- frontend/templates/pledge_complete.html | 4 +- frontend/templates/work.html | 2 - requirements_versioned.pip | 6 +- settings/common.py | 4 +- static/scss/bookview.scss | 3 - static/scss/global.scss | 3 - static/scss/pledge.scss | 326 ++++++++++++++++++++++++ static/scss/variables.scss | 234 +++++++++++++++++ 11 files changed, 571 insertions(+), 20 deletions(-) delete mode 100644 static/scss/bookview.scss delete mode 100644 static/scss/global.scss create mode 100644 static/scss/pledge.scss create mode 100644 static/scss/variables.scss diff --git a/frontend/templates/base.html b/frontend/templates/base.html index 784908d8..a7513912 100644 --- a/frontend/templates/base.html +++ b/frontend/templates/base.html @@ -1,6 +1,5 @@ {% load truncatechars %} -{% load sass_tags %} @@ -10,8 +9,6 @@ {% block extra_css %}{% endblock %} - - diff --git a/frontend/templates/basepledge.html b/frontend/templates/basepledge.html index 231e9333..852c742a 100644 --- a/frontend/templates/basepledge.html +++ b/frontend/templates/basepledge.html @@ -1,8 +1,9 @@ {% extends "registration/registration_base.html" %} +{% load sass_tags %} {% block extra_css %} - + {% endblock %} {% block extra_js %} diff --git a/frontend/templates/manage_account.html b/frontend/templates/manage_account.html index 2e5af3f3..39efbf38 100644 --- a/frontend/templates/manage_account.html +++ b/frontend/templates/manage_account.html @@ -1,9 +1,10 @@ {% extends 'basedocumentation.html' %} +{% load sass_tags %} {% block title %}Your Unglue.it Account{% endblock %} {% block extra_extra_head %} {{ block.super }} - + {% include "stripe_stuff.html" %} diff --git a/frontend/templates/work.html b/frontend/templates/work.html index 74e45c02..d00aa57d 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -4,7 +4,6 @@ {% load humanize %} {% load purchased %} {% load lib_acqs %} -{% load sass_tags %} {% block title %}— {% if work.is_free %} {{ work.title }} is a Free eBook. {% for fmt in work.formats %}[{{ fmt }}]{% endfor %} @@ -19,7 +18,6 @@ {{ kwform.media.css }} {% endif %} - {% endblock %} {% block extra_js %} diff --git a/requirements_versioned.pip b/requirements_versioned.pip index 05a650a6..b8531d8a 100644 --- a/requirements_versioned.pip +++ b/requirements_versioned.pip @@ -104,6 +104,6 @@ setuptools==25.0.0 urllib3==1.16 beautifulsoup4==4.6.0 RISparser==0.4.2 -libsass -django-compressor -django-sass-processor +libsass==0.13.4 +django-compressor==2.2 +django-sass-processor==0.5.6 diff --git a/settings/common.py b/settings/common.py index 0af70d47..5cac1480 100644 --- a/settings/common.py +++ b/settings/common.py @@ -188,11 +188,9 @@ INSTALLED_APPS = ( ) SASS_PROCESSOR_INCLUDE_DIRS = [ - os.path.join(PROJECT_DIR), os.path.join(PROJECT_DIR, 'static', 'scss'), - os.path.join('static', 'scss'), ] - +SASS_PROCESSOR_AUTO_INCLUDE = False # A sample logging configuration. The only tangible logging # performed by this configuration is to send an email to diff --git a/static/scss/bookview.scss b/static/scss/bookview.scss deleted file mode 100644 index a5116734..00000000 --- a/static/scss/bookview.scss +++ /dev/null @@ -1,3 +0,0 @@ -* { - color: pink !important; -} \ No newline at end of file diff --git a/static/scss/global.scss b/static/scss/global.scss deleted file mode 100644 index 453aeb84..00000000 --- a/static/scss/global.scss +++ /dev/null @@ -1,3 +0,0 @@ -* { - color: red ; -} \ No newline at end of file diff --git a/static/scss/pledge.scss b/static/scss/pledge.scss new file mode 100644 index 00000000..d837d326 --- /dev/null +++ b/static/scss/pledge.scss @@ -0,0 +1,326 @@ +@import "variables.scss"; + +#content-block .jsmod-content, .book-detail { + float: left; + width: auto; +} + +input[type="submit"], a.fakeinput { + float: right; + font-size: $font-size-header; + margin: 10px 0 10px; + cursor: pointer; +} + +.pledge_amount { + padding: 10px; + font-size: $font-size-header; + background: $pale-blue; + + &.premium_level { + margin-top: 3px; + } +} + +form.pledgeform { + width: 470px; +} + +#id_preapproval_amount { + width: 50%; + line-height: 30px; + font-size: $font-size-larger; +} + +ul.support li, ul.support li:hover { + background-image: none; +} + +p { + margin: 7px auto; +} + +.jsmodule.pledge { + margin: auto; + + .jsmod-content { + float: right !important; + } +} + +.modify_notification { + width: 452px; + margin-bottom: 7px; + border: solid 2px $blue-grey; + @include one-border-radius(5px); + padding: 7px; + + h4 { + margin: 0 0 5px 0; + } +} + +.cancel_notice { + width: 470px; + padding: 5px; + margin-top: 10px; +} + +#fakepledgesubmit { + background-color: $alert; + cursor: default; + font-weight: bold; + font-size: $font-size-header; + display: none; +} + +span.menu-item-price { + float: none !important; +} + +ul#offers_list li { + + div.on { + display: block; + background: $pale-blue; + margin-top: 1em; + .give_label { + padding: 4px; + color: black; + } + } + div.off { + display: none; + } + input[type=text], textarea { + width: 95%; + font-size: $font-size-larger; + color: $text-blue; + margin: 0 10px 5px 5px; + } + input[type=text]{ + @include height($font-size-larger*1.3); + } + +} +#mandatory_premiums { + font-size: $font-size-larger; + + div { + float: left; + + &.ack_level { + width: 16%; + margin-right: 3%; + height: 100%; + padding: 1%; + } + + &.ack_header { + width: 73%; + padding: 1%; + } + + &.ack_active, &.ack_inactive { + width: 100%; + font-size: $font-size-default; + } + + &.ack_active { + .ack_header, .ack_level { + border: solid $text-blue; + border-width: 1%; + background: white; + } + } + + &.ack_inactive { + .ack_header, .ack_level { + border: solid $blue-grey; + border-width: 1%; + background: $blue-grey; + } + + input, textarea { + background: $blue-grey; + border: dashed 1px $text-blue; + } + } + } + + > div { + margin: 7px 0; + } + + input[type=text], textarea { + width: 95%; + font-size: $font-size-larger; + color: $text-blue; + margin: 5px 0; + } + + input[type=text] { + @include height($font-size-larger*1.3); + } +} + +#id_ack_link { + border: none; + cursor: default; +} + +.fund_options { + a.fakeinput { + font-size: $font-size-header; + margin: 10px auto; + float: left; + line-height: normal; + } + + input[type="submit"] { + float: left; + } + + div { + width: 50%; + float: left; + + ul { + background: $pale-blue; + } + + &.highlight { + ul { + border-color: $medium-blue-grey; + background: white; + } + + color: $dark-green; + } + } + + ul { + padding: 5px 10px 5px 15px; + border: solid 1px $blue-grey; + margin-right: 15px; + list-style-type: none; + + li { + margin: 5px 0; + } + + a { + color: $medium-blue; + } + } +} + +#authorize { + &.off { + display: none; + } + + border: 3px solid $blue-grey; + @include one-border-radius(5px); + margin-top: 10px; + padding: 10px; + + div.innards { + input[type="text"],input[type="password"] { + font-size: $font-size-larger; + line-height: $font-size-larger*1.5; + border-width: 2px; + padding: 1% 1%; + margin: 1% 0; + color: $text-blue; + + &:disabled { + border-color: white; + } + + &.address, &#card_Number, &#id_email { + width: 61%; + } + } + + label { + width: 31%; + float: left; + line-height: $font-size-larger*1.5; + font-size: $font-size-larger; + border: solid white; + border-width: 2px 0; + padding: 1% 2% 1% 0; + margin: 1% 0; + text-align: right; + } + + .form-row span { + float: left; + line-height: $font-size-larger*1.5; + font-size: $font-size-larger; + margin: 1%; + padding: 1% 0; + } + } + + .cvc { + position: relative; + z-index: 0; + } + + #cvc_help { + font-style: italic; + float: none; + font-size: $font-size-default; + color: $link-color; + cursor: pointer; + } + + #cvc_answer { + display: none; + z-index: 100; + border: 2px solid $blue-grey; + @include one-border-radius(5px); + margin: 1% 0; + padding: 1%; + width: 46%; + position: absolute; + top: 90%; + right: 0; + opacity: 1; + background-color: white; + + img { + float: right; + margin-left: 5px; + } + } +} + +.payment-errors { + display: none; + @include errors; + @include one-border-radius(16px); + width: auto; + margin: auto; +} + +span.level2.menu.answer { + border-left: solid 7px $pale-blue; + a { + font-size: $font-size-larger; + } +} + +#anonbox { + margin-top: 10px; + background: $pale-blue; + float: left; + width: 48%; + padding: 1%; + &.off { + display: none; + } + +} diff --git a/static/scss/variables.scss b/static/scss/variables.scss new file mode 100644 index 00000000..a0fb54d6 --- /dev/null +++ b/static/scss/variables.scss @@ -0,0 +1,234 @@ +/* variables and mixins used in multiple less files go here */ +$text-blue: #3d4e53; +$medium-blue: #6994a3; +$medium-blue-grey: #a7c1ca; +$pale-blue: #edf3f4; +$green: #8dc63f; +$call-to-action: #8dc63f; +$dark-green: #73a334; +$dark-blue: #37414d; +$blue-grey: #d6dde0; +$bright-blue: #8ac3d7; +$alert: #e35351; +$orange: #e18551; +$yellow: #efd45e; +$image-base: "/static/images/"; +$background-header: "${image-base}bg.png"; +$background-body: "${image-base}bg-body.png"; +$background-booklist: "${image-base}booklist/bg.png"; +$font-size-default: 13px; +$font-size-larger: 15px; +$font-size-header: 19px; +$font-size-shout: 22px; +$link-color: #6994a3; + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-base: #000; +$gray-darker: lighten($gray-base, 13.5%); // #222 +$gray-dark: lighten($gray-base, 20%); // #333 +$gray: lighten($gray-base, 33.5%); // #555 +$gray-light: lighten($gray-base, 46.7%); // #777 +$gray-lighter: lighten($gray-base, 93.5%); // #eee + +$brand-primary: darken(#428bca, 6.5%); // #337ab7 +$brand-success: #5cb85c; +$brand-info: #5bc0de; +$brand-warning: #f0ad4e; +$brand-danger: #d9534f; + +//** Link hover color set via `darken()` function. +$link-hover-color: darken($link-color, 15%); +//** Link hover decoration. +$link-hover-decoration: underline; + +$font-size-base: 14px; +$font-size-large: ceil(($font-size-base * 1.25)); // ~18px +$font-size-small: ceil(($font-size-base * 0.85)); // ~12px + +//** Unit-less `line-height` for use in components like buttons. +$line-height-base: 1.428571429; // 20/14 +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc. +$line-height-computed: floor(($font-size-base * $line-height-base)); // ~20px + +//== Components +// +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). + +$padding-base-vertical: 6px; +$padding-base-horizontal: 12px; + +$padding-large-vertical: 10px; +$padding-large-horizontal: 16px; + +$padding-small-vertical: 5px; +$padding-small-horizontal: 10px; + +$padding-xs-vertical: 1px; +$padding-xs-horizontal: 5px; + +$line-height-large: 1.3333333; // extra decimals for Win 8.1 Chrome +$line-height-small: 1.5; + +$border-radius-base: 4px; +$border-radius-large: 6px; +$border-radius-small: 3px; + +//== Buttons +// +//## For each of Bootstrap's buttons, define text, background and border color. + +$btn-font-weight: normal; + +$btn-default-color: #333; +$btn-default-bg: #fff; +$btn-default-border: #ccc; + +$btn-primary-color: #fff; +$btn-primary-bg: $brand-primary; +$btn-primary-border: darken($btn-primary-bg, 5%); + +$btn-success-color: #fff; +$btn-success-bg: $brand-success; +$btn-success-border: darken($btn-success-bg, 5%); + +$btn-info-color: #fff; +$btn-info-bg: $brand-info; +$btn-info-border: darken($btn-info-bg, 5%); + +$btn-warning-color: #fff; +$btn-warning-bg: $brand-warning; +$btn-warning-border: darken($btn-warning-bg, 5%); + +$btn-danger-color: #fff; +$btn-danger-bg: $brand-danger; +$btn-danger-border: darken($btn-danger-bg, 5%); + +$btn-link-disabled-color: $gray-light; + + +//** Disabled cursor for form controls and buttons. +$cursor-disabled: not-allowed; + +.header-text { + display:block; + text-decoration:none; + font-weight:bold; + letter-spacing: -.05em; +} + +@mixin border-radius($topleft, $topright, $bottomright, $bottomleft) +{ + -moz-border-radius: $arguments; + -webkit-border-radius: $arguments; + border-radius: $arguments; +} + +@mixin one-border-radius($radius) +{ + -moz-border-radius: $radius; + -webkit-border-radius: $radius; + border-radius: $radius; +} + +.panelborders { + border-width: 1px 0px; + border-style: solid none; + border-color: #FFFFFF; +} + +@mixin navigation-arrows($x, $y) +{ + background:url($background-booklist) $x $y no-repeat; + width:10px; + height:15px; + display:block; + text-indent:-10000px; +} + +@mixin supporter-color-span($hex, $color) +{ + $url: %("%sheader-button-%s.png", $image-base, $color); + background:$hex url($url) left bottom repeat-x; +} + +.roundedspan { + border:1px solid #d4d4d4; + @include one-border-radius(7px); + padding:1px; + color:#fff; + margin:0 8px 0 0; + display:inline-block; + + > span { + padding:7px 7px; + min-width:15px; + @include one-border-radius(5px); + text-align:center; + display:inline-block; + + .hovertext { + display: none; + } + + &:hover .hovertext { + display: inline; + } + } +} + +@mixin height($x) +{ + height:$x; + line-height:$x; +} + +.mediaborder { + padding: 5px; + border: solid 5px #EDF3F4; +} + +.actionbuttons { + width: auto; + @include height(36px); + background: $call-to-action; + border: 1px solid transparent; + color: white; + cursor: pointer; + font-size: 13px; + font-weight: $btn-font-weight; + padding: 0 15px; + margin: 5px 0; +} + +@mixin errors() +{ + @include one-border-radius(16px); + border: solid $alert 3px; + clear: both; + width: 90%; + height: auto; + line-height: 16px; + padding: 7px 0; + font-weight: bold; + font-size: 13px; + text-align: center; + + li { + list-style: none; + border: none; + } +} + +@mixin clickyarrows() +{ + text-indent:-10000px; + font-size:0; + width:15px; + height:22px; + display:block; + position:absolute; + top:45%; +} From e864f7d9b19a8e8e4a9cf89fa5e14284b59fcdd5 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 12 Dec 2017 13:26:57 -0500 Subject: [PATCH 045/109] updates to allow compilescss to run quietly --- payment/templates/amazon_fps.html | 14 -------------- requirements_versioned.pip | 4 ++-- 2 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 payment/templates/amazon_fps.html diff --git a/payment/templates/amazon_fps.html b/payment/templates/amazon_fps.html deleted file mode 100644 index f60d3d67..00000000 --- a/payment/templates/amazon_fps.html +++ /dev/null @@ -1,14 +0,0 @@ -{% load amazon_fps_tags %} - -{% block content %} -
    -

    You are going to be charged $100 in the - Amazon FPS Sandbox.

    -

    {% amazon_fps fps_obj %}

    -
    -
    -

    (Recurring payments) You are going to be charged $100 every hour in the - Amazon FPS Sandbox.

    -

    {% amazon_fps fps_recur_obj %}

    -
    -{% endblock %} \ No newline at end of file diff --git a/requirements_versioned.pip b/requirements_versioned.pip index b8531d8a..f8841ab1 100644 --- a/requirements_versioned.pip +++ b/requirements_versioned.pip @@ -24,7 +24,7 @@ certifi==2016.2.28 django-celery==3.1.17 django-ckeditor==4.5.1 #django-email-change==0.2.3 -git+git://github.com/eshellman/django-email-change.git@e5076a9a2c9a9b61b58cea7e461c8368af07b2ad +git+git://github.com/eshellman/django-email-change.git@1e71dd320504d56b1fc7d447ce4cffb550cedce7 django-compat==1.0.10 django-contrib-comments==1.7.1 django-endless-pagination==2.0 @@ -43,7 +43,7 @@ django-storages==1.4.1 django-tastypie==0.13.3 django-transmeta==0.7.3 feedparser==5.1.2 -fef-questionnaire==4.0.0 +fef-questionnaire==4.0.1 freebase==1.0.8 #gitenberg.metadata==0.1.6 git+https://github.com/gitenberg-dev/gitberg-build From 15d281c9889a4a42d83e6bbe7b3a7de388febd37 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 14 Dec 2017 14:19:20 -0500 Subject: [PATCH 046/109] make mobi wasn't setting provider --- core/management/commands/make_missing_mobis.py | 7 +++++-- core/models/bibmodels.py | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/management/commands/make_missing_mobis.py b/core/management/commands/make_missing_mobis.py index 700f2d22..53254ff1 100644 --- a/core/management/commands/make_missing_mobis.py +++ b/core/management/commands/make_missing_mobis.py @@ -23,11 +23,14 @@ class Command(BaseCommand): ebf = ebook.get_archive_ebf() if ebf: try: + print 'making mobi for {}'.format(work.title) if ebf.make_mobi(): - print 'made mobi for {}'.format(ebf.edition.work.title) + print 'made mobi' i = i + 1 break + else: + print 'failed to make mobi' except: - pass + print 'failed to make mobi' if i >= max: break diff --git a/core/models/bibmodels.py b/core/models/bibmodels.py index da07c444..ee0991b5 100644 --- a/core/models/bibmodels.py +++ b/core/models/bibmodels.py @@ -1089,6 +1089,7 @@ class EbookFile(models.Model): new_ebook = Ebook.objects.create( edition=self.edition, format='mobi', + provider='Unglue.it', url=new_mobi_ebf.file.url, rights=self.ebook.rights, version_label=self.ebook.version_label, From 4aeae6e67c45f6a129abefd162c01a05348ee1e7 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 14 Dec 2017 16:24:26 -0500 Subject: [PATCH 047/109] implement donation options --- core/admin.py | 7 ++-- core/fixtures/basic_campaign_test.json | 2 +- core/fixtures/initial_data.json | 2 +- core/migrations/0012_campaign_charitable.py | 19 +++++++++++ core/models/__init__.py | 1 + core/tasks.py | 4 ++- frontend/forms/__init__.py | 5 +-- frontend/templates/book_panel.html | 14 ++++---- frontend/templates/book_panel_addbutton.html | 4 +-- frontend/templates/faq.html | 14 ++++++++ frontend/templates/faq_pledge.html | 29 ++++++++++++++--- frontend/templates/manage_campaign.html | 12 ++++++- .../notification/donation/notice.html | 4 +-- .../notification/pledge_charged/full.txt | 19 +++++++++-- .../notification/pledge_charged/notice.html | 30 ++++++++++++++++- .../notification/pledge_charged/short.txt | 2 +- .../notification/wishlist_successful/full.txt | 2 +- .../wishlist_unsuccessful/full.txt | 4 +-- .../wishlist_unsuccessful/notice.html | 8 ++--- frontend/templates/pledge.html | 19 +++++++---- frontend/templates/pledge_complete.html | 15 +++++---- frontend/templates/trans_summary.html | 19 ++++++----- frontend/templates/work_action.html | 6 ++-- frontend/templatetags/bookpanel.py | 12 +++---- frontend/views/__init__.py | 10 ++++-- payment/manager.py | 32 +++++++++++-------- .../migrations/0002_transaction_donation.py | 19 +++++++++++ payment/models.py | 31 ++++++++++-------- static/js/reconcile_pledge.js | 26 +++++++++++++++ static/scss/pledge.scss | 19 +++++++++++ 30 files changed, 291 insertions(+), 99 deletions(-) create mode 100644 core/migrations/0012_campaign_charitable.py create mode 100644 payment/migrations/0002_transaction_donation.py diff --git a/core/admin.py b/core/admin.py index f95d1612..77c24de1 100644 --- a/core/admin.py +++ b/core/admin.py @@ -68,6 +68,7 @@ class AcqAdmin(ModelAdmin): class PremiumAdmin(ModelAdmin): list_display = ('campaign', 'amount', 'description') date_hierarchy = 'created' + fields = ('type', 'amount', 'description', 'limit') class CampaignAdminForm(forms.ModelForm): managers = AutoCompleteSelectMultipleField( @@ -77,8 +78,10 @@ class CampaignAdminForm(forms.ModelForm): ) class Meta(object): model = models.Campaign - fields = ('managers', 'name', 'description', 'details', 'license', 'activated', 'paypal_receiver', - 'status', 'type', 'email', 'do_watermark', 'use_add_ask', ) + fields = ( + 'managers', 'name', 'description', 'details', 'license', 'paypal_receiver', + 'status', 'type', 'email', 'do_watermark', 'use_add_ask', 'charitable', + ) class CampaignAdmin(ModelAdmin): list_display = ('work', 'created', 'status') diff --git a/core/fixtures/basic_campaign_test.json b/core/fixtures/basic_campaign_test.json index 2ae09b46..cdc498a2 100644 --- a/core/fixtures/basic_campaign_test.json +++ b/core/fixtures/basic_campaign_test.json @@ -465,7 +465,7 @@ "pk": 150, "model": "core.premium", "fields": { - "description": "No premium, thanks! I just want to help unglue.", + "description": "Nothing extra, thanks! I just want to support this campaign.", "campaign": null, "created": "2011-11-17T22:03:37", "amount": "0", diff --git a/core/fixtures/initial_data.json b/core/fixtures/initial_data.json index 84efa3c8..e1a67274 100644 --- a/core/fixtures/initial_data.json +++ b/core/fixtures/initial_data.json @@ -98,7 +98,7 @@ "campaign": null, "amount": 0, "type": "00", - "description": "No premium, thanks! I just want to help unglue.", + "description": "Nothing extra, thanks! I just want to support this campaign", "created": "2011-11-17 22:03:37" } }, diff --git a/core/migrations/0012_campaign_charitable.py b/core/migrations/0012_campaign_charitable.py new file mode 100644 index 00000000..640c123c --- /dev/null +++ b/core/migrations/0012_campaign_charitable.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0011_auto_20171110_1253'), + ] + + operations = [ + migrations.AddField( + model_name='campaign', + name='charitable', + field=models.BooleanField(default=False), + ), + ] diff --git a/core/models/__init__.py b/core/models/__init__.py index 67bf0b67..37917b8b 100755 --- a/core/models/__init__.py +++ b/core/models/__init__.py @@ -400,6 +400,7 @@ class Campaign(models.Model): publisher = models.ForeignKey("Publisher", related_name="campaigns", null=True) do_watermark = models.BooleanField(default=True) use_add_ask = models.BooleanField(default=True) + charitable = models.BooleanField(default=False) def __init__(self, *args, **kwargs): self.problems = [] diff --git a/core/tasks.py b/core/tasks.py index 8d56f232..5240d98b 100644 --- a/core/tasks.py +++ b/core/tasks.py @@ -200,9 +200,11 @@ def notify_unclaimed_gifts(): unclaimed = Gift.objects.filter(used=None) for gift in unclaimed: """ - send notice every 7 days + send notice every 7 days, but stop at 10x """ unclaimed_duration = (now() - gift.acq.created ).days + if unclaimed_duration > 70: + return if unclaimed_duration > 0 and unclaimed_duration % 7 == 0 : # first notice in 7 days notification.send_now([gift.acq.user], "purchase_gift_waiting", {'gift':gift}, True) notification.send_now([gift.giver], "purchase_notgot_gift", {'gift':gift}, True) diff --git a/frontend/forms/__init__.py b/frontend/forms/__init__.py index be645eb0..88bfb719 100644 --- a/frontend/forms/__init__.py +++ b/frontend/forms/__init__.py @@ -385,12 +385,12 @@ class CampaignPledgeForm(forms.Form): min_value=D('1.00'), max_value=D('2000.00'), decimal_places=2, - label="Pledge Amount", + label="Support Amount", ) def amount(self): return self.cleaned_data["preapproval_amount"] if self.cleaned_data else None - anonymous = forms.BooleanField(required=False, label=_("Make this pledge anonymous, please")) + anonymous = forms.BooleanField(required=False, label=_("Make this support anonymous, please")) ack_name = forms.CharField( required=False, max_length=64, @@ -399,6 +399,7 @@ class CampaignPledgeForm(forms.Form): ack_dedication = forms.CharField(required=False, max_length=140, label=_("Your dedication:")) premium_id = forms.IntegerField(required=False) + donation = forms.BooleanField(required=False, label=_("Make this a donation, not a pledge.")) premium = None @property diff --git a/frontend/templates/book_panel.html b/frontend/templates/book_panel.html index 4058d33c..24dad3c4 100644 --- a/frontend/templates/book_panel.html +++ b/frontend/templates/book_panel.html @@ -3,7 +3,7 @@ {% load purchased %} {% load lib_acqs %} {% load bookpanel %} -{% with first_ebook=work.first_ebook supporters=work.last_campaign.supporters thumbnail=work.cover_image_thumbnail author=work.authors_short title=work.title last_campaign=work.last_campaign status=work.last_campaign.status deadline=work.last_campaign.deadline workid=work.id wishlist=request.user.wishlist.works.all %} +{% with first_ebook=work.first_ebook thumbnail=work.cover_image_thumbnail author=work.authors_short title=work.title last_campaign=work.last_campaign status=work.last_campaign.status deadline=work.last_campaign.deadline workid=work.id wishlist=request.user.wishlist.works.all %} {% purchased %}{% lib_acqs %}{% bookpanel %}
    @@ -109,7 +109,7 @@ {% endif %}
    - {% if request.user.id in supporters %} + {% if not supported %}
    {% include "book_panel_addbutton.html" %}
    @@ -119,7 +119,7 @@
    {% if work.last_campaign.type == 1 %} - Pledge + Support {% elif work.last_campaign.type == 2 %} {% if in_library %} Reserve It @@ -217,9 +217,9 @@ Set {{setkw}}
    {% endif %} - {% elif show_pledge %} + {% elif not supported %} {% elif show_purchase %}
    @@ -241,8 +241,8 @@ {% if purchased.gifts.all.count %}A gift to you!{% else %}Purchased!{% endif %} {% elif borrowed %} Borrowed! ...until - {% elif request.user.id in supporters %} - Pledged! + {% elif supported %} + Supported! {% else %} Faved! {% endif %} diff --git a/frontend/templates/book_panel_addbutton.html b/frontend/templates/book_panel_addbutton.html index 02363cc5..e5196224 100644 --- a/frontend/templates/book_panel_addbutton.html +++ b/frontend/templates/book_panel_addbutton.html @@ -12,9 +12,9 @@ - {% elif request.user.id in supporters %} + {% elif supported %} {% elif supporter == request.user %} {% if wishlist %} diff --git a/frontend/templates/faq.html b/frontend/templates/faq.html index 0b13a6ba..8d244bce 100644 --- a/frontend/templates/faq.html +++ b/frontend/templates/faq.html @@ -385,6 +385,20 @@ If you want to find an interesting campaign and don't have a specific book in mi
    You can offer anything you are capable of delivering, so long as it is not illegal or otherwise restricted in the United States. For instance, your premiums may not include alcohol, drugs, or firearms. For full details, consult our Terms of Use.
    +
    Is my campaign eligible for charitable donation support?
    + +
    +The Free Ebook Foundation may provide support for some campaigns using donations. These campaigns are subject to the following guidelines: +
      +
    1. Proceeds of a campaign must not benefit a candidate for political office and books to be unglued shall not be primarily aimed at influencing legislation.
    2. +
    3. Proceeds of a campaign must not benefit organizations or individuals subject to regulation by the US Treasury’s Office of Foreign Assets Control.
    4. +
    5. Books to be unglued with Foundation support should clearly benefit the public at large - by advancing scholarship and learning, spreading scientific knowledge, achieving artistic, literary or cultural goals, educating students, promoting literacy and reading, documenting history, meeting the needs of underserved communities, raising awareness and understanding of the world around us.
    6. +
    7. The amount of support requested should be limited to the reasonable costs of producing the book and procuring associated rights. When a campaign is offered using a license with a “non-commercial” restriction, it is expected that the rights holders will bear part of these expenses themselves. When the campaign beneficiary is not a US-based non-profit, documentation of expenses may be requested.
    8. +
    + + +
    +
    Who is responsible for making sure a rights holder delivers premiums?
    The rights holder.
    diff --git a/frontend/templates/faq_pledge.html b/frontend/templates/faq_pledge.html index 5a9f5ab9..e08246fc 100644 --- a/frontend/templates/faq_pledge.html +++ b/frontend/templates/faq_pledge.html @@ -1,12 +1,26 @@
    -

    Pledging FAQs

    +

    Campaign Support FAQs

    + {% if campaign.charitable %} +
    + This campaign is eligible for charitable donation support. +
    + {% elif campaign.type == 1 %} +
    + If you believe your campaign meets the criteria for charitable donation support, use the feedback form to request a review by Free Ebook Foundation staff. +
    + {% endif %}
    @@ -405,13 +414,14 @@ Please fix the following before launching your campaign:

    A few things to keep in mind:

      +
    • For tax status reasons, premiums are not currently available to supporters who use donations instead of pledges.
    • Are your premiums cumulative? That is, if you have a $10 and a $25 premium, does the $25 pledger get everything that the $10 pledger gets also? Either cumulative or not-cumulative is fine, but make sure you've communicated clearly
    • Adding new premiums during your campaign is a great way to build momentum. If you do, make sure to leave a comment in the Comments tab of your campaign page to tell supporters (it will be automatically emailed to them). Some of them may want to change (hopefully increase) their pledge to take advantage of it.
    • Also make sure to think about how your new premiums interact with old ones. If you add a new premium at $10, will people who have already pledged $25 be automatically eligible for it or not? Again, you can choose whatever you want; just be sure to communicate clearly.

    Acknowledgements

    -

    Your ungluers will also automatically receive the following acknowledgements:

    +

    Your ungluers (including thos who use donations, will also automatically receive the following acknowledgements:

    • Any amount — The unglued ebook
    • $25 and above — Their name in the acknowledgements section under "supporters"
    • diff --git a/frontend/templates/notification/donation/notice.html b/frontend/templates/notification/donation/notice.html index 24d83cb2..298e5071 100644 --- a/frontend/templates/notification/donation/notice.html +++ b/frontend/templates/notification/donation/notice.html @@ -7,7 +7,7 @@ {% endblock %} {% block comments_graphical %} -{% ifequal transaction.host 'credit' %} +{% if transaction.host == 'credit' %} Your Unglue.it transaction has completed and ${{transaction.max_amount|floatformat:2|intcomma}} has been deducted from your Unglue.it credit balance. You have ${{transaction.user.credit.available|default:"0"}} of credit left. {% else %} @@ -19,7 +19,7 @@ {% else %} Your Unglue.it credit card transaction has completed and your credit card has been charged ${{ transaction.amount|floatformat:2|intcomma }}. {% endif %} -{% endifequal %} +{% endif %} {% endblock %} {% block comments_textual %} diff --git a/frontend/templates/notification/pledge_charged/full.txt b/frontend/templates/notification/pledge_charged/full.txt index 5d4ce7fd..7c4fa5f7 100644 --- a/frontend/templates/notification/pledge_charged/full.txt +++ b/frontend/templates/notification/pledge_charged/full.txt @@ -1,4 +1,19 @@ -{% load humanize %}An Ungluing! +{% load humanize %}{% if transaction.donation %}{% ifequal transaction.host 'credit' %}Your Unglue.it transaction has completed and ${{transaction.max_amount|default:"0"}} has been deducted from your Unglue.it credit balance. You have ${{transaction.user.credit.available|default:"0"}} of credit left. {% else %}{% if transaction.max_amount > transaction.amount %}Your transaction for ${{transaction.max_amount|default:"0"}} has completed. Your credit card has been charged ${{transaction.amount}} and the rest has been deducted from your unglue.it credit balance. You have ${{transaction.user.credit.available|default:"0"}} of credit left. {% else %}Your Unglue.it credit card transaction has completed and your credit card has been charged ${{ transaction.amount|default:"0" }}. {% endif %}{% endifequal %} + +Your donation of ${{transaction.max_amount|default:"0"}} to the Free Ebook Foundation will support our effort to release {{ transaction.campaign.work.title }} to the world in an unglued ebook edition. We'll email you if the campaign succeeds, and when the ebook is available for download. If you'd like to visit the campaign page, click here: +https://{{ current_site.domain }}{% url 'work' transaction.campaign.work_id %} + +In case the campaign for {{ transaction.campaign.work.title }} does not succeed, we'll use your donation in support of other qualifying ungluing campaigns which qualify for charitable support. + +The Free Ebook Foundation is a US 501(c)3 non-profit organization. Our tax ID number is 61-1767266. Your gift is tax deductible to the full extent provided by the law. + +For more information about the Free Ebook Foundation, visit https://ebookfoundation.org/ + +Thank you again for your generous support. + +{{ transaction.campaign.rightsholder }} and the Unglue.it team + +{% else %}An Ungluing! Thanks to you and other ungluers, {{ transaction.campaign.work.title }} will be released to the world in an unglued ebook edition. Your credit card has been charged ${{ transaction.amount|floatformat:2|intcomma }}. @@ -13,4 +28,4 @@ https://{{ current_site.domain }}{% url 'work' transaction.campaign.work_id %} Thank you again for your support. {{ transaction.campaign.rightsholder }} and the Unglue.it team - +{% endif %} diff --git a/frontend/templates/notification/pledge_charged/notice.html b/frontend/templates/notification/pledge_charged/notice.html index 7f623b8e..b7cb480e 100644 --- a/frontend/templates/notification/pledge_charged/notice.html +++ b/frontend/templates/notification/pledge_charged/notice.html @@ -7,10 +7,37 @@ {% endblock %} {% block comments_graphical %} - Hooray! The campaign for {{ transaction.campaign.work.title }} has succeeded. Your credit card has been charged ${{ transaction.amount|floatformat:2|intcomma }}. Thank you again for your help. +{% if transaction.donation %} +{% if transaction.host == 'credit' %} + Your Unglue.it transaction has completed and ${{transaction.max_amount|floatformat:2|intcomma}} has been deducted from your Unglue.it credit balance. + You have ${{transaction.user.credit.available|default:"0"}} of credit left. +{% elif transaction.max_amount > transaction.amount %} + Your transaction for ${{transaction.max_amount|floatformat:2|intcomma}} has completed. + Your credit card has been charged ${{transaction.amount}} and the + rest has been deducted from your unglue.it credit balance. + You have ${{transaction.user.credit.available|intcomma}} of credit left. +{% else %} + Your Unglue.it credit card transaction has completed and your credit card has been charged ${{ transaction.amount|floatformat:2|intcomma }}. +{% endif %} +{% else %} Hooray! The campaign for {{ transaction.campaign.work.title }} has succeeded. Your credit card has been charged ${{ transaction.amount|floatformat:2|intcomma }}. Thank you again for your help. +{% endif %} {% endblock %} {% block comments_textual %} +{% if transaction.donation %} +

      Your donation of ${{transaction.max_amount|default:"0"}} to the Free Ebook Foundation will support our effort to release {{ transaction.campaign.work.title }} to the world in an unglued ebook edition. We'll email you if the campaign succeeds, and when the ebook is available for download. If you'd like to visit the campaign page, click here.

      + +

      In case the campaign for {{ transaction.campaign.work.title }} does not succeed, we'll use your donation in support of other qualifying ungluing campaigns which qualify for charitable support.

      + +

      The Free Ebook Foundation is a US 501(c)3 non-profit organization. Our tax ID number is 61-1767266. Your gift is tax deductible to the full extent provided by the law.

      + +

      For more information about the Free Ebook Foundation, visit https://ebookfoundation.org/

      + +

      Thank you again for your generous support.

      + +

      {{ transaction.campaign.rightsholder }} and the Unglue.it team

      + +{% else %}

      Congratulations!

      Thanks to you and other ungluers, {{ transaction.campaign.work.title }} will be released to the world in an unglued ebook edition. {{ transaction.host|capfirst }} has been charged to your credit card.

      @@ -28,4 +55,5 @@

      {{ transaction.campaign.rightsholder }} and the Unglue.it team

      +{% endif %} {% endblock %} \ No newline at end of file diff --git a/frontend/templates/notification/pledge_charged/short.txt b/frontend/templates/notification/pledge_charged/short.txt index f4cf9fe6..72436257 100644 --- a/frontend/templates/notification/pledge_charged/short.txt +++ b/frontend/templates/notification/pledge_charged/short.txt @@ -1 +1 @@ -Your pledge to the campaign to unglue {{transaction.campaign.work.title}} has been charged. \ No newline at end of file +Your {% if transaction.donation %}donation{% else %}pledge{% endif %} for the campaign to unglue {{transaction.campaign.work.title}} has been charged. \ No newline at end of file diff --git a/frontend/templates/notification/wishlist_successful/full.txt b/frontend/templates/notification/wishlist_successful/full.txt index 7d466908..19676618 100644 --- a/frontend/templates/notification/wishlist_successful/full.txt +++ b/frontend/templates/notification/wishlist_successful/full.txt @@ -1,4 +1,4 @@ -{% if pledged %}You pledged toward it{% else %}You put it on your list{% endif %}, and now the campaign for {{ campaign.work.title}} (https://{{current_site.domain}}{% url 'work' campaign.work_id %}) has succeeded. +{% if pledged %}You supported it{% else %}You put it on your list{% endif %}, and now the campaign for {{ campaign.work.title}} (https://{{current_site.domain}}{% url 'work' campaign.work_id %}) has succeeded. {% ifequal campaign.type 1 %} You will notified when an Unglued ebook edition is available, within 90 days. {% if pledged %} diff --git a/frontend/templates/notification/wishlist_unsuccessful/full.txt b/frontend/templates/notification/wishlist_unsuccessful/full.txt index cc0c7733..ef7872c6 100644 --- a/frontend/templates/notification/wishlist_unsuccessful/full.txt +++ b/frontend/templates/notification/wishlist_unsuccessful/full.txt @@ -2,9 +2,7 @@ Alas. The campaign to unglue {{ campaign.work.title }} (https://{{current_site. If you pledged toward this work, your pledge will expire shortly and your credit card will not be charged, nor will you receive any premiums. -Still want to give {{ campaign.work.title }} to the world? Don't despair. Keep it on your wishlist and tell everyone why you love this book. The rights holder, {{ campaign.rightsholder }}, may run a campaign with different terms in the future. With your help, we may yet be able to unglue {{ campaign.work.title }}. - -There are also other books with active campaigns that need your help: https://unglue.it/campaigns/ending . +If you donated in support of this work, your donation will be used to support other campaigns that qualify for charitable support. Thank you for your support. diff --git a/frontend/templates/notification/wishlist_unsuccessful/notice.html b/frontend/templates/notification/wishlist_unsuccessful/notice.html index 2498cdce..3616b220 100644 --- a/frontend/templates/notification/wishlist_unsuccessful/notice.html +++ b/frontend/templates/notification/wishlist_unsuccessful/notice.html @@ -10,11 +10,7 @@ {% endblock %} {% block comments_textual %} - If you pledged toward this work, your pledge will expire shortly and your credit card will not be charged, nor will you receive any premiums. - - Still want to give {{ campaign.work.title }} to the world? Don't despair. Keep it on your faves and tell everyone why you love this book. The rights holder, {{ campaign.rightsholder }}, may run a campaign with different terms in the future. With your help, we may yet be able to unglue {{ campaign.work.title }}. - - There are also other books with active campaigns that need your help. - + If you pledged toward this work, your pledge will expire shortly and your credit card will not be charged, nor will you receive any premiums. If you donated in support of this work, your donation will be used to support other campaigns that qualify for charitable support. + Thank you for your support. {% endblock %} \ No newline at end of file diff --git a/frontend/templates/pledge.html b/frontend/templates/pledge.html index 23582e95..b7dae6a8 100644 --- a/frontend/templates/pledge.html +++ b/frontend/templates/pledge.html @@ -83,10 +83,16 @@
      {% csrf_token %} {{ form.non_field_errors }} -
      {{ form.preapproval_amount.label_tag }}: {{ form.preapproval_amount.errors }}${{ form.preapproval_amount }}
      - +
      {{ form.preapproval_amount.label_tag }} {{ form.preapproval_amount.errors }}${{ form.preapproval_amount }} + {% if work.last_campaign.charitable %} +
      {{ form.donation }} {{ form.donation.label_tag }}
      + {% else %} + + {% endif %} +
      +
      {% if premiums|length > 1 %} -
      Choose your premium:
      +
      Choose your premium:
      @@ -119,16 +125,17 @@ If the RH hasn't added any premiums, there's no point in displaying the "no premium" option, but we do need to check it off so the form will validate. {% endcomment %} {% endif %} - +
      +
      -
      Depending on your pledge amount, you'll also get these acknowledgements.
      +
      Depending on your support amount, you'll also get these acknowledgements.
      Any amount
      The unglued ebook will be delivered to your inbox.
      $25+
      You'll be listed on the acknowledgements page of the unglued ebook. {{ form.ack_name.label_tag }} {{ form.ack_name.errors }}{{ form.ack_name }}
      $100+
      Your acknowledgement can include a dedication (140 characters max). {{ form.ack_dedication.label_tag }} {{ form.ack_dedication.errors }}{{ form.ack_dedication }}
      {{ form.anonymous.label_tag }} {{ form.anonymous.errors }}{{ form.anonymous }}
      - + {% comment %} When the pledge amount and premium are in an inconsistent state, the real button is disabled and (via css) hidden; instead we display this fake button with a helpful message. It's a button so we can reuse all the existing CSS for buttons, so that it looks like the real button has just changed in appearance. It's hidden and the other one un-disabled and un-hidden when the pledge & premium return to a correct state. People without javascript enabled will miss out on the front-end corrections but form validation will catch it. diff --git a/frontend/templates/pledge_complete.html b/frontend/templates/pledge_complete.html index 6ef0f2e3..be127110 100644 --- a/frontend/templates/pledge_complete.html +++ b/frontend/templates/pledge_complete.html @@ -32,11 +32,13 @@

      Thank you!

      {% if not campaign %}

      You've just donated ${{ transaction.amount|floatformat:2|intcomma }} to the Free Ebook Foundation

      - {% endif %} - {% ifequal campaign.type 1 %} + {% elif campaign.type == 1 %} + {% if campaign.donation %} +

      You've just donated ${{ transaction.amount|floatformat:2|intcomma }} in support of {{ work.title }}. If it reaches its goal of ${{ campaign.target|intcomma }} by {{ campaign.deadline|date:"M d Y"}}, it will be unglued for all to enjoy. Otherwise, your donation will be used to support qualifying ungluing campaigns. Your donation to the Free Ebook Foundation is tax-deductible in the US.

      + {% else %}

      You've just {% if modified %}modified your pledge for{% else %}pledged{% endif %} ${{ transaction.amount|floatformat:2|intcomma }} to {{ work.title }}. If it reaches its goal of ${{ campaign.target|intcomma }} by {{ campaign.deadline|date:"M d Y"}}, it will be unglued for all to enjoy.

      - {% endifequal %} - {% ifequal campaign.type 2 %} + {% endif %} + {% elif campaign.type == 2 %} {% if transaction.extra.give_to %}

      You've just paid ${{ transaction.amount|floatformat:2|intcomma }} to give a copy of {{ work.title }} to {{ transaction.extra.give_to }}. Its ungluing date is now {{ campaign.cc_date }}. Thanks for helping to make that day come sooner!

      @@ -53,13 +55,12 @@ {% endif %}
      - {% endifequal %} - {% ifequal campaign.type 3 %} + {% elif campaign.type == 3 %}

      You've just contributed ${{ transaction.amount|floatformat:2|intcomma }} to the creators of {{ work.title }} to thank them for making it free to the world.

      - {% endifequal %} + {% endif %}
      {% include "trans_summary.html" %}
      diff --git a/frontend/templates/trans_summary.html b/frontend/templates/trans_summary.html index 7479d666..354ae839 100644 --- a/frontend/templates/trans_summary.html +++ b/frontend/templates/trans_summary.html @@ -1,10 +1,10 @@ {% load humanize %} {% load libraryauthtags %}
      -{% ifequal transaction.campaign.type 1 %} - Your pledge: ${{transaction.amount|floatformat:2|intcomma}}.
      - Your premium: {% if transaction.premium %}{{ transaction.premium.description }}{% else %}You did not request a premium for this campaign.{% endif %}
      - {% if transaction.anonymous %}You asked to pledge anonymously, so you will be counted but not named on the list of supporters.
      {% endif %}
      +{% if transaction.campaign.type == 1 %} + Your {% if transaction.donation %}donation{% else %}pledge{% endif %}: ${{transaction.amount|floatformat:2|intcomma}}.
      + {% if transaction.premium %}Your premium: {{ transaction.premium.description }}{% endif %}
      + {% if transaction.anonymous %}You asked to support anonymously, so you will be counted but not named on the list of supporters.
      {% endif %}
      Acknowledgements:
      • The unglued ebook will be delivered to your inbox.
      • {% if not transaction.anonymous %} @@ -22,9 +22,8 @@
      • The following dedication will be included: {{ transaction.extra.ack_dedication }}
      • {% endif %}
      -{% endifequal %} -{% if transaction.campaign.type == 2 or not transaction.campaign %} - {% ifequal transaction.host 'credit' %} +{% elif transaction.campaign.type == 2 or not transaction.campaign %} + {% if transaction.host == 'credit' %} Amount: ${{transaction.max_amount|floatformat:2|intcomma}}.
      This amount has been deducted from your Unglue.it credit balance.
      You have ${{request.user.credit.available|default:"0"}} of credit left.
      @@ -37,13 +36,13 @@ {% else %} This amount has been charged to your credit card.
      {% endif %} - {% endifequal %} + {% endif %} {% if transaction.campaign %} License type: {{ transaction.offer.get_license_display }}
      - {% ifequal transaction.offer.license 2 %} + {% if transaction.offer.license == 2 %} Receiving library: {{ transaction.extra.library_id|libname }}
      Number of copies: {{ transaction.extra.copies }} - {% endifequal %} + {% endif %} {% endif %} {% endif %} diff --git a/frontend/templates/work_action.html b/frontend/templates/work_action.html index 252b2476..be063600 100644 --- a/frontend/templates/work_action.html +++ b/frontend/templates/work_action.html @@ -3,9 +3,11 @@ {% if status == 'ACTIVE' %} {% if work.last_campaign.type == 1 %} {% if pledged %} -
      +
      + {% elif supported %} +
      {% else %} -
      +
      {% endif %} {% elif work.last_campaign.type == 3 %}
      diff --git a/frontend/templatetags/bookpanel.py b/frontend/templatetags/bookpanel.py index f56beae4..473c043f 100644 --- a/frontend/templatetags/bookpanel.py +++ b/frontend/templatetags/bookpanel.py @@ -15,12 +15,12 @@ def bookpanel(context): # campaign is ACTIVE, type 1 - REWARDS # user has not pledged or user is anonymous - show_pledge = False - if campaign and campaign.type==REWARDS: + supported = False + if campaign and campaign.type == REWARDS: if campaign.status == 'ACTIVE': - if user.is_anonymous() or not user.id in context.get('supporters', []): - show_pledge = True - context['show_pledge'] = show_pledge + if not user.is_anonymous() and user.transaction_set.filter(campaign__work=work): + supported = True + context['supported'] = supported # compute a boolean that's true if bookpanel should show a "purchase" button... # campaign is ACTIVE, type 2 - BUY2UNGLUE @@ -30,7 +30,7 @@ def bookpanel(context): # not on the library page show_purchase = False - if campaign and campaign.type==BUY2UNGLUE: + if campaign and campaign.type == BUY2UNGLUE: if user.is_anonymous() or not context.get('license_is_active', False): if campaign.status == 'ACTIVE': if not context.get('borrowable', False): diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index f22ae3f8..26f49cfb 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -347,8 +347,10 @@ def work(request, work_id, action='display'): campaign = work.last_campaign() editions = work.editions.all().order_by('-publication_date')[:10] try: - pledged = campaign.transactions().filter(user=request.user, status="ACTIVE") + supported = campaign.transactions().filter(user=request.user) + pledged = supported.filter(status="ACTIVE") except: + supported = None pledged = None cover_width_number = 0 @@ -400,6 +402,7 @@ def work(request, work_id, action='display'): 'base_url': base_url, 'editions': editions, 'pledged': pledged, + 'supported': supported, 'activetab': activetab, 'alert': alert, 'claimstatus': claimstatus, @@ -1020,7 +1023,8 @@ class PledgeView(FormView): campaign=self.campaign, user=self.request.user, paymentReason="Unglue.it Pledge for {0}".format(self.campaign.name), - pledge_extra=form.trans_extra + pledge_extra=form.trans_extra, + donation = form.cleaned_data['donation'] ) if url: logger.info("PledgeView url: " + url) @@ -1158,7 +1162,7 @@ class FundView(FormView): if not self.transaction.campaign: self.action = 'donation' elif self.transaction.campaign.type == REWARDS: - self.action = 'pledge' + self.action = 'donation' if self.transaction.donation else 'pledge' elif self.transaction.campaign.type == THANKS: self.action = 'contribution' else: diff --git a/payment/manager.py b/payment/manager.py index 1cb39e5a..fee4a4f1 100644 --- a/payment/manager.py +++ b/payment/manager.py @@ -672,13 +672,14 @@ class PaymentManager( object ): - def process_transaction(self, currency, amount, host=PAYMENT_HOST_NONE, campaign=None, user=None, - return_url=None, paymentReason="unglue.it Pledge", pledge_extra=None, - modification=False): + def process_transaction(self, currency, amount, host=PAYMENT_HOST_NONE, campaign=None, + user=None, return_url=None, paymentReason="unglue.it Pledge", pledge_extra=None, + donation=False, modification=False): ''' process - saves and processes a proposed transaction; decides if the transaction should be processed immediately. + saves and processes a proposed transaction; decides if the transaction should be processed + immediately. currency: a 3-letter currency code, i.e. USD amount: the amount to authorize @@ -690,8 +691,9 @@ class PaymentManager( object ): modification: whether this authorize call is part of a modification of an existing pledge pledge_extra: extra pledge stuff - return value: a tuple of the new transaction object and a re-direct url. If the process fails, - the redirect url will be None + return value: a tuple of the new transaction object and a re-direct url. + If the process fails, the redirect url will be None + donation: transaction is a donation ''' # set the expiry date based on the campaign deadline if campaign and campaign.deadline: @@ -699,14 +701,16 @@ class PaymentManager( object ): else: expiry = now() + timedelta(days=settings.PREAPPROVAL_PERIOD_AFTER_CAMPAIGN) - t = Transaction.create(amount=0, - host = host, - max_amount=amount, - currency=currency, - campaign=campaign, - user=user, - pledge_extra=pledge_extra - ) + t = Transaction.create( + amount=0, + host = host, + max_amount=amount, + currency=currency, + campaign=campaign, + user=user, + pledge_extra=pledge_extra, + donation=donation, + ) t.save() # does user have enough credit to transact now? if user.is_authenticated() and user.credit.available >= amount : diff --git a/payment/migrations/0002_transaction_donation.py b/payment/migrations/0002_transaction_donation.py new file mode 100644 index 00000000..dc91e544 --- /dev/null +++ b/payment/migrations/0002_transaction_donation.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('payment', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='transaction', + name='donation', + field=models.BooleanField(default=False), + ), + ] diff --git a/payment/models.py b/payment/models.py index 5b10865d..3002802b 100644 --- a/payment/models.py +++ b/payment/models.py @@ -110,6 +110,9 @@ class Transaction(models.Model): # whether the user wants to be not listed publicly anonymous = models.BooleanField(default=False) + # whether the transaction represents a donation + donation = models.BooleanField(default=False) + @property def tier(self): if self.amount < 25: @@ -210,24 +213,24 @@ class Transaction(models.Model): return pe @classmethod - def create(cls,amount=0.00, host=PAYMENT_HOST_NONE, max_amount=0.00, currency='USD', - status=TRANSACTION_STATUS_NONE,campaign=None, user=None, pledge_extra=None): + def create(cls, amount=0.00, host=PAYMENT_HOST_NONE, max_amount=0.00, currency='USD', + status=TRANSACTION_STATUS_NONE, campaign=None, user=None, pledge_extra=None, + donation=False): if user and user.is_anonymous(): user = None + t = cls.objects.create( + amount=amount, + host=host, + max_amount=max_amount, + currency=currency, + status=status, + campaign=campaign, + user=user, + donation=donation, + ) if pledge_extra: - t = cls.objects.create(amount=amount, - host=host, - max_amount=max_amount, - currency=currency, - status=status, - campaign=campaign, - user=user, - ) t.set_pledge_extra(pledge_extra) - return t - else: - return cls.objects.create(amount=amount, host=host, max_amount=max_amount, currency=currency,status=status, - campaign=campaign, user=user) + return t class PaymentResponse(models.Model): # The API used diff --git a/static/js/reconcile_pledge.js b/static/js/reconcile_pledge.js index 77ad25b5..c6521859 100644 --- a/static/js/reconcile_pledge.js +++ b/static/js/reconcile_pledge.js @@ -10,7 +10,9 @@ $j().ready(function() { var submitbutton = $j('#pledgesubmit'); var fakesubmitbutton = $j('#fakepledgesubmit'); var anonbox = $j('#anonbox input'); + var donationbox = $j('#id_donation'); var ackSection = $j('#ack_section'); + var premium_section = $j('#select_premiums'); var supporterName = $j('#pass_supporter_name').html(); var ackName = $j('#id_ack_name').val(); var ackDedication = $j('#id_ack_dedication').val(); @@ -72,6 +74,21 @@ $j().ready(function() { $j('#'+mySpan+' input[type=text]').val('').attr('disabled', 'disabled'); } + // make premium selection inactive: greyed-out and not modifiable + var deactivate_premiums = function() { + premium_section.addClass('premiums_inactive'); + $j('#premiums_list li label input').attr('disabled', 'disabled'); + $j('#premiums_list li:first-child label input').removeAttr('disabled').attr('checked', 'checked'); + $j('#premium_note').text(' (not available with donation)'); + } + + // make premium selection inactive: greyed-out and not modifiable + var activate_premiums = function() { + premium_section.removeClass('premiums_inactive'); + $j('#premiums_list li label input').removeAttr('disabled'); + $j('#premium_note').text(''); + } + // fill mandatory premium link input with supporter page var activateLink = function() { $j('#ack_link').removeClass('ack_inactive').addClass('ack_active'); @@ -86,6 +103,15 @@ $j().ready(function() { deactivate('ack_name'); $j('#id_ack_name').val('Anonymous'); } + + // when supporter clicks the donation box, activate/deactivate premium selection + donationbox.change(function() { + if(this.checked) { + deactivate_premiums(); + } else { + activate_premiums(); + } + }); // selectively highlight/grey out acknowledgements supporter is eligible for var rectifyAcknowledgements = function(current) { diff --git a/static/scss/pledge.scss b/static/scss/pledge.scss index d837d326..f7033869 100644 --- a/static/scss/pledge.scss +++ b/static/scss/pledge.scss @@ -24,6 +24,10 @@ input[type="submit"], a.fakeinput { form.pledgeform { width: 470px; + + .pledgeform_label { + font-size: 80% + } } #id_preapproval_amount { @@ -103,6 +107,21 @@ ul#offers_list li { } } + +.premiums_inactive#select_premiums { + background: $blue-grey; + + div, div.pledge_amount, ul li, ul li:hover { + background: $blue-grey; + color: $text-blue + } +} + +#premium_note { + font-size: 70%; + font-style: italic; +} + #mandatory_premiums { font-size: $font-size-larger; From c896fdeba418afe9807dfab69d269a9d3e18294f Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 14 Dec 2017 21:38:14 -0500 Subject: [PATCH 048/109] add handing for pledge->donation --- frontend/templates/pledge.html | 8 +-- frontend/templates/work_action.html | 2 +- frontend/views/__init__.py | 80 ++++++++++++++++++----------- payment/manager.py | 2 +- static/js/reconcile_pledge.js | 2 + 5 files changed, 58 insertions(+), 36 deletions(-) diff --git a/frontend/templates/pledge.html b/frontend/templates/pledge.html index b7dae6a8..23916a3a 100644 --- a/frontend/templates/pledge.html +++ b/frontend/templates/pledge.html @@ -67,17 +67,17 @@ Amount: ${{transaction.amount|floatformat:2|intcomma}}.
      Your premium: {% if transaction.premium %}{{ transaction.premium.description }}{% else %}You did not request a premium for this campaign.{% endif %}
      -
      You can modify your pledge below. +
      You can modify your pledge below. If you change your pledge to a donation, the pledge will be cancelled and your credit card charged immediately.
      {% endif %} - {% ifnotequal work.last_campaign.status 'ACTIVE' %} + {% if work.last_campaign.status != 'ACTIVE' %}

      Campaign NOT ACTIVE

      This pledge form is not functional because the campaign is NOT ACTIVE.


      - {% endifnotequal %} + {% endif %} {% comment %} - Even there is a CampaignPledgeForm in frontend/forms.py , the "widget" for premium_id is implemented in HTML here for now. + Even though there is a CampaignPledgeForm in frontend/forms.py , the "widget" for premium selection is implemented in HTML here for now. {% endcomment %}
      diff --git a/frontend/templates/work_action.html b/frontend/templates/work_action.html index be063600..2523b0a2 100644 --- a/frontend/templates/work_action.html +++ b/frontend/templates/work_action.html @@ -3,7 +3,7 @@ {% if status == 'ACTIVE' %} {% if work.last_campaign.type == 1 %} {% if pledged %} -
      +
      {% elif supported %}
      {% else %} diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 26f49cfb..f4bdf482 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -944,10 +944,15 @@ class PledgeView(FormView): # Campaign must be ACTIVE assert self.campaign.status == 'ACTIVE' except Exception, e: - # this used to raise an exception, but that seemed pointless. This now has the effect of preventing any pledges. + # this used to raise an exception, but that seemed pointless. + # This now has the effect of preventing any pledges. return {} - transactions = self.campaign.transactions().filter(user=self.request.user, status=TRANSACTION_STATUS_ACTIVE, type=PAYMENT_TYPE_AUTHORIZATION) + transactions = self.campaign.transactions().filter( + user=self.request.user, + status=TRANSACTION_STATUS_ACTIVE, + type=PAYMENT_TYPE_AUTHORIZATION + ) premium_id = self.request.GET.get('premium_id', self.request.POST.get('premium_id', 150)) if transactions.count() == 0: ack_name = self.request.user.profile.ack_name @@ -998,40 +1003,55 @@ class PledgeView(FormView): return context def form_valid(self, form): - # right now, if there is a non-zero pledge amount, go with that. otherwise, do the pre_approval - + # right now, if there is a non-zero pledge amount, go with that. + # otherwise, do the pre_approval + donation = form.cleaned_data['donation'] p = PaymentManager() if self.transaction: - # modifying the transaction... - assert self.transaction.type == PAYMENT_TYPE_AUTHORIZATION and self.transaction.status == TRANSACTION_STATUS_ACTIVE - status, url = p.modify_transaction(self.transaction, form.cleaned_data["preapproval_amount"], - paymentReason="Unglue.it %s for %s"% (self.action, self.campaign.name) , - pledge_extra = form.trans_extra - ) - logger.info("status: {0}, url:{1}".format(status, url)) + assert self.transaction.type == PAYMENT_TYPE_AUTHORIZATION and \ + self.transaction.status == TRANSACTION_STATUS_ACTIVE - if status and url is not None: - logger.info("PledgeView (Modify): " + url) - return HttpResponseRedirect(url) - elif status and url is None: - return HttpResponseRedirect("{0}?tid={1}".format(reverse('pledge_modified'), self.transaction.id)) + if donation: + # cancel transaction, then proceed to make a donation + p.cancel_transaction(self.transaction) else: - return HttpResponse("No modification made") - else: - t, url = p.process_transaction('USD', form.amount(), - host = PAYMENT_HOST_NONE, - campaign=self.campaign, - user=self.request.user, - paymentReason="Unglue.it Pledge for {0}".format(self.campaign.name), + # modify the pledge... + status, url = p.modify_transaction( + self.transaction, + form.cleaned_data["preapproval_amount"], + paymentReason="Unglue.it %s for %s"% (self.action, self.campaign.name), pledge_extra=form.trans_extra, - donation = form.cleaned_data['donation'] + ) + logger.info("status: {0}, url:{1}".format(status, url)) + + if status and url is not None: + logger.info("PledgeView (Modify): " + url) + return HttpResponseRedirect(url) + elif status and url is None: + return HttpResponseRedirect( + "{0}?tid={1}".format(reverse('pledge_modified'), self.transaction.id) ) - if url: - logger.info("PledgeView url: " + url) - return HttpResponseRedirect(url) - else: - logger.error("Attempt to produce transaction id {0} failed".format(t.id)) - return HttpResponse("Our attempt to enable your transaction failed. We have logged this error.") + else: + return HttpResponse("No modification made") + + t, url = p.process_transaction( + 'USD', + form.amount(), + host = PAYMENT_HOST_NONE, + campaign=self.campaign, + user=self.request.user, + paymentReason="Unglue.it Pledge for {0}".format(self.campaign.name), + pledge_extra=form.trans_extra, + donation = donation + ) + if url: + logger.info("PledgeView url: " + url) + return HttpResponseRedirect(url) + else: + logger.error("Attempt to produce transaction id {0} failed".format(t.id)) + return HttpResponse( + "Our attempt to enable your transaction failed. We have logged this error." + ) class PurchaseView(PledgeView): template_name = "purchase.html" diff --git a/payment/manager.py b/payment/manager.py index fee4a4f1..1158c59d 100644 --- a/payment/manager.py +++ b/payment/manager.py @@ -791,7 +791,7 @@ class PaymentManager( object ): modify Modifies a transaction. - 2 main situations: if the new amount is less than max_amount, no need to go out to PayPal again + 2 main situations: if the new amount is less than max_amount, no need to go out to Stripe again if new amount is greater than max_amount...need to go out and get new approval. to start with, we can use the standard pledge_complete, pledge_cancel machinery might have to modify the pledge_complete, pledge_cancel because the messages are going to be diff --git a/static/js/reconcile_pledge.js b/static/js/reconcile_pledge.js index c6521859..93f2f3ce 100644 --- a/static/js/reconcile_pledge.js +++ b/static/js/reconcile_pledge.js @@ -108,8 +108,10 @@ $j().ready(function() { donationbox.change(function() { if(this.checked) { deactivate_premiums(); + $j('#change_pledge_notice').addClass('yikes'); } else { activate_premiums(); + $j('#change_pledge_notice').removeClass('yikes') } }); From 184aab1b43218677548f05f15d54804cb2eba62a Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 15 Dec 2017 14:03:54 -0500 Subject: [PATCH 049/109] add static test --- frontend/tests.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frontend/tests.py b/frontend/tests.py index 799589d4..916ba64d 100755 --- a/frontend/tests.py +++ b/frontend/tests.py @@ -164,6 +164,15 @@ class PageTests(TestCase): r = anon_client.get("/free/epub/gfdl/") self.assertEqual(r.status_code, 200) + def test_static(self): + # not logged in + anon_client = Client() + r = anon_client.get("/static/js/sitewide1.js") + self.assertEqual(r.status_code, 200) + r = anon_client.get("/static/scss/pledge.css") + self.assertEqual(r.status_code, 200) + + class GoogleBooksTest(TestCase): fixtures = ['initial_data.json', 'neuromancer.json'] def test_googlebooks_id(self): From 4d398fb419ea5271d7bd73f2dc05bfb75f6f698b Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 15 Dec 2017 14:04:11 -0500 Subject: [PATCH 050/109] typo --- frontend/templates/notification/pledge_charged/full.txt | 2 +- frontend/templates/notification/pledge_charged/notice.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/templates/notification/pledge_charged/full.txt b/frontend/templates/notification/pledge_charged/full.txt index 7c4fa5f7..e260064c 100644 --- a/frontend/templates/notification/pledge_charged/full.txt +++ b/frontend/templates/notification/pledge_charged/full.txt @@ -3,7 +3,7 @@ Your donation of ${{transaction.max_amount|default:"0"}} to the Free Ebook Foundation will support our effort to release {{ transaction.campaign.work.title }} to the world in an unglued ebook edition. We'll email you if the campaign succeeds, and when the ebook is available for download. If you'd like to visit the campaign page, click here: https://{{ current_site.domain }}{% url 'work' transaction.campaign.work_id %} -In case the campaign for {{ transaction.campaign.work.title }} does not succeed, we'll use your donation in support of other qualifying ungluing campaigns which qualify for charitable support. +In case the campaign for {{ transaction.campaign.work.title }} does not succeed, we'll use your donation in support of other ungluing campaigns which qualify for charitable support. The Free Ebook Foundation is a US 501(c)3 non-profit organization. Our tax ID number is 61-1767266. Your gift is tax deductible to the full extent provided by the law. diff --git a/frontend/templates/notification/pledge_charged/notice.html b/frontend/templates/notification/pledge_charged/notice.html index b7cb480e..e225eb47 100644 --- a/frontend/templates/notification/pledge_charged/notice.html +++ b/frontend/templates/notification/pledge_charged/notice.html @@ -27,7 +27,7 @@ {% if transaction.donation %}

      Your donation of ${{transaction.max_amount|default:"0"}} to the Free Ebook Foundation will support our effort to release {{ transaction.campaign.work.title }} to the world in an unglued ebook edition. We'll email you if the campaign succeeds, and when the ebook is available for download. If you'd like to visit the campaign page, click here.

      -

      In case the campaign for {{ transaction.campaign.work.title }} does not succeed, we'll use your donation in support of other qualifying ungluing campaigns which qualify for charitable support.

      +

      In case the campaign for {{ transaction.campaign.work.title }} does not succeed, we'll use your donation in support of other ungluing campaigns which qualify for charitable support.

      The Free Ebook Foundation is a US 501(c)3 non-profit organization. Our tax ID number is 61-1767266. Your gift is tax deductible to the full extent provided by the law.

      From af2034da7749c80ccb9e8eb12fca68ca3a432e92 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 15 Dec 2017 14:04:32 -0500 Subject: [PATCH 051/109] add form validation of donation restriction --- frontend/forms/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/forms/__init__.py b/frontend/forms/__init__.py index 88bfb719..76479790 100644 --- a/frontend/forms/__init__.py +++ b/frontend/forms/__init__.py @@ -436,6 +436,10 @@ class CampaignPledgeForm(forms.Form): elif preapproval_amount < self.premium.amount: logger.info("raising form validating error") raise forms.ValidationError(_("Sorry, you must pledge at least $%s to select that premium." % (self.premium.amount))) + donation = self.cleaned_data.get('donation', False) + if donation and self.premium.amount > 0: + raise forms.ValidationError(_("Sorry, donations are not eligible for premiums.")) + return self.cleaned_data class TokenCCMixin(forms.Form): From ef49e65e3062b72da5f955a7dfee82bd4102b2e1 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 15 Dec 2017 14:16:09 -0500 Subject: [PATCH 052/109] switch to css in git --- .gitignore | 1 - requirements_versioned.pip | 5 +++-- settings/dev.py | 4 ++++ static/scss/pledge.css | 3 +++ 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 static/scss/pledge.css diff --git a/.gitignore b/.gitignore index b9fcb214..4a693c5d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,4 @@ logs/* celerybeat.pid celerybeat-schedule .gitignore~ -static/scss/*.css static/scss/*.css.map diff --git a/requirements_versioned.pip b/requirements_versioned.pip index f8841ab1..e064166d 100644 --- a/requirements_versioned.pip +++ b/requirements_versioned.pip @@ -104,6 +104,7 @@ setuptools==25.0.0 urllib3==1.16 beautifulsoup4==4.6.0 RISparser==0.4.2 -libsass==0.13.4 -django-compressor==2.2 +# include these 2 for development +#libsass==0.13.4 +#django-compressor==2.2 django-sass-processor==0.5.6 diff --git a/settings/dev.py b/settings/dev.py index ef4608ca..059cccbe 100644 --- a/settings/dev.py +++ b/settings/dev.py @@ -85,3 +85,7 @@ UNGLUEIT_TEST_PASSWORD = None # local settings for maintenance mode MAINTENANCE_MODE = False + +# assume that CSS will get generated on dev +SASS_OUTPUT_STYLE = 'compressed' + diff --git a/static/scss/pledge.css b/static/scss/pledge.css new file mode 100644 index 00000000..16a186ad --- /dev/null +++ b/static/scss/pledge.css @@ -0,0 +1,3 @@ +.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-.05em}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #EDF3F4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}#content-block .jsmod-content,.book-detail{float:left;width:auto}input[type="submit"],a.fakeinput{float:right;font-size:19px;margin:10px 0 10px;cursor:pointer}.pledge_amount{padding:10px;font-size:19px;background:#edf3f4}.pledge_amount.premium_level{margin-top:3px}form.pledgeform{width:470px}form.pledgeform .pledgeform_label{font-size:80%}#id_preapproval_amount{width:50%;line-height:30px;font-size:15px}ul.support li,ul.support li:hover{background-image:none}p{margin:7px auto}.jsmodule.pledge{margin:auto}.jsmodule.pledge .jsmod-content{float:right !important}.modify_notification{width:452px;margin-bottom:7px;border:solid 2px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;padding:7px}.modify_notification h4{margin:0 0 5px 0}.cancel_notice{width:470px;padding:5px;margin-top:10px}#fakepledgesubmit{background-color:#e35351;cursor:default;font-weight:bold;font-size:19px;display:none}span.menu-item-price{float:none !important}ul#offers_list li div.on{display:block;background:#edf3f4;margin-top:1em}ul#offers_list li div.on .give_label{padding:4px;color:black}ul#offers_list li div.off{display:none}ul#offers_list li input[type=text],ul#offers_list li textarea{width:95%;font-size:15px;color:#3d4e53;margin:0 10px 5px 5px}ul#offers_list li input[type=text]{height:19.5px;line-height:19.5px}.premiums_inactive#select_premiums{background:#d6dde0}.premiums_inactive#select_premiums div,.premiums_inactive#select_premiums div.pledge_amount,.premiums_inactive#select_premiums ul li,.premiums_inactive#select_premiums ul li:hover{background:#d6dde0;color:#3d4e53}#premium_note{font-size:70%;font-style:italic}#mandatory_premiums{font-size:15px}#mandatory_premiums div{float:left}#mandatory_premiums div.ack_level{width:16%;margin-right:3%;height:100%;padding:1%}#mandatory_premiums div.ack_header{width:73%;padding:1%}#mandatory_premiums div.ack_active,#mandatory_premiums div.ack_inactive{width:100%;font-size:13px}#mandatory_premiums div.ack_active .ack_header,#mandatory_premiums div.ack_active .ack_level{border:solid #3d4e53;border-width:1%;background:white}#mandatory_premiums div.ack_inactive .ack_header,#mandatory_premiums div.ack_inactive .ack_level{border:solid #d6dde0;border-width:1%;background:#d6dde0}#mandatory_premiums div.ack_inactive input,#mandatory_premiums div.ack_inactive textarea{background:#d6dde0;border:dashed 1px #3d4e53}#mandatory_premiums>div{margin:7px 0}#mandatory_premiums input[type=text],#mandatory_premiums textarea{width:95%;font-size:15px;color:#3d4e53;margin:5px 0}#mandatory_premiums input[type=text]{height:19.5px;line-height:19.5px}#id_ack_link{border:none;cursor:default}.fund_options a.fakeinput{font-size:19px;margin:10px auto;float:left;line-height:normal}.fund_options input[type="submit"]{float:left}.fund_options div{width:50%;float:left}.fund_options div ul{background:#edf3f4}.fund_options div.highlight{color:#73a334}.fund_options div.highlight ul{border-color:#a7c1ca;background:white}.fund_options ul{padding:5px 10px 5px 15px;border:solid 1px #d6dde0;margin-right:15px;list-style-type:none}.fund_options ul li{margin:5px 0}.fund_options ul a{color:#6994a3}#authorize{border:3px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-top:10px;padding:10px}#authorize.off{display:none}#authorize div.innards input[type="text"],#authorize div.innards input[type="password"]{font-size:15px;line-height:22.5px;border-width:2px;padding:1% 1%;margin:1% 0;color:#3d4e53}#authorize div.innards input[type="text"]:disabled,#authorize div.innards input[type="password"]:disabled{border-color:white}#authorize div.innards input[type="text"].address,#authorize div.innards input[type="text"]#card_Number,#authorize div.innards input[type="text"]#id_email,#authorize div.innards input[type="password"].address,#authorize div.innards input[type="password"]#card_Number,#authorize div.innards input[type="password"]#id_email{width:61%}#authorize div.innards label{width:31%;float:left;line-height:22.5px;font-size:15px;border:solid white;border-width:2px 0;padding:1% 2% 1% 0;margin:1% 0;text-align:right}#authorize div.innards .form-row span{float:left;line-height:22.5px;font-size:15px;margin:1%;padding:1% 0}#authorize .cvc{position:relative;z-index:0}#authorize #cvc_help{font-style:italic;float:none;font-size:13px;color:#6994a3;cursor:pointer}#authorize #cvc_answer{display:none;z-index:100;border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin:1% 0;padding:1%;width:46%;position:absolute;top:90%;right:0;opacity:1;background-color:white}#authorize #cvc_answer img{float:right;margin-left:5px}.payment-errors{display:none;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;width:auto;margin:auto}.payment-errors li{list-style:none;border:none}span.level2.menu.answer{border-left:solid 7px #edf3f4}span.level2.menu.answer a{font-size:15px}#anonbox{margin-top:10px;background:#edf3f4;float:left;width:48%;padding:1%}#anonbox.off{display:none} + +/*# sourceMappingURL=../../../../../static/scss/pledge.css.map */ \ No newline at end of file From 1611ebe82a2e5bc6347f45599ee6ef8d90f74174 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 15 Dec 2017 18:24:19 -0500 Subject: [PATCH 053/109] poorly conceived test --- frontend/tests.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/frontend/tests.py b/frontend/tests.py index 916ba64d..799589d4 100755 --- a/frontend/tests.py +++ b/frontend/tests.py @@ -164,15 +164,6 @@ class PageTests(TestCase): r = anon_client.get("/free/epub/gfdl/") self.assertEqual(r.status_code, 200) - def test_static(self): - # not logged in - anon_client = Client() - r = anon_client.get("/static/js/sitewide1.js") - self.assertEqual(r.status_code, 200) - r = anon_client.get("/static/scss/pledge.css") - self.assertEqual(r.status_code, 200) - - class GoogleBooksTest(TestCase): fixtures = ['initial_data.json', 'neuromancer.json'] def test_googlebooks_id(self): From d1cf6e6fb31c651895428aeb12c6e4de99b4ea0c Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 15 Dec 2017 19:26:50 -0500 Subject: [PATCH 054/109] fix some scraping bugs --- core/loaders/__init__.py | 2 ++ core/loaders/springer.py | 5 +++-- core/management/commands/load_books_from_sitemap.py | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/loaders/__init__.py b/core/loaders/__init__.py index 00d3152c..233f5600 100755 --- a/core/loaders/__init__.py +++ b/core/loaders/__init__.py @@ -1,6 +1,8 @@ import requests from bs4 import BeautifulSoup +from django.conf import settings + from gitenberg.metadata.pandata import Pandata from regluit.core.bookloader import add_from_bookdatas, BasePandataLoader diff --git a/core/loaders/springer.py b/core/loaders/springer.py index 8de8ea36..9aedce1d 100644 --- a/core/loaders/springer.py +++ b/core/loaders/springer.py @@ -67,13 +67,14 @@ class SpringerScraper(BaseScraper): def get_title(self): el = self.doc.select_one('#book-title') + value = '' if el: value = el.text.strip() if value: value = value.replace('\n', ': ', 1) self.set('title', value) if not value: - (SpringerScraper, self).get_title() + super(SpringerScraper, self).get_title() def get_role(self): if self.doc.select_one('#editors'): @@ -109,7 +110,7 @@ class SpringerScraper(BaseScraper): @classmethod def can_scrape(cls, url): ''' return True if the class can scrape the URL ''' - return url.find('10.1007') or url.find('10.1057') + return url.find('10.1007') >= 0 or url.find('10.1057') >= 0 search_url = 'https://link.springer.com/search/page/{}?facet-content-type=%22Book%22&package=openaccess' diff --git a/core/management/commands/load_books_from_sitemap.py b/core/management/commands/load_books_from_sitemap.py index 31b9b130..80b48f81 100644 --- a/core/management/commands/load_books_from_sitemap.py +++ b/core/management/commands/load_books_from_sitemap.py @@ -1,6 +1,6 @@ from django.core.management.base import BaseCommand -from regluit.core.bookloader import add_by_sitemap +from regluit.core.loaders import add_by_sitemap class Command(BaseCommand): help = "load books based on a website sitemap" From 4b8a5cbc8004902f23248cf3f43ee264ad3f34cf Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 18 Dec 2017 11:28:06 -0500 Subject: [PATCH 055/109] updates --- frontend/templates/faq.html | 2 +- frontend/templates/learn_more.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/templates/faq.html b/frontend/templates/faq.html index 8d244bce..31189396 100644 --- a/frontend/templates/faq.html +++ b/frontend/templates/faq.html @@ -362,7 +362,7 @@ If you want to find an interesting campaign and don't have a specific book in mi
      What do I need to create a campaign?
      -
      First, you need to be an authorized rights holder with a signed Rights Holder Agreement on file. Please contact rights@ebookfoundation.org to start this process. Once we have your RHA on file, you'll be able to claim your works and you'll have access to tools for launching and monitoring campaigns. +
      First, you need to be an authorized rights holder. To get authorized, sign a Rights Holder Agreement. Please contact rights@ebookfoundation.org if you have any questions. Once we have approved your Agreement, you'll be able to claim works and you'll have access to tools for launching and monitoring campaigns.
      Can I raise any amount of money I want?
      diff --git a/frontend/templates/learn_more.html b/frontend/templates/learn_more.html index fcf56325..2dee652b 100644 --- a/frontend/templates/learn_more.html +++ b/frontend/templates/learn_more.html @@ -17,7 +17,7 @@
    -

    3 ways we can make ebooks free

    +

    Find over 10,000 free ebooks here.
    Help us make more ebooks free!

    From 19a005bfa60f0b7c9ede6bbcabb21a6975e4ad30 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 19 Dec 2017 10:48:26 -0500 Subject: [PATCH 056/109] tweak campaign setup --- frontend/templates/rh_intro.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/templates/rh_intro.html b/frontend/templates/rh_intro.html index 0a089ead..4d3816ac 100644 --- a/frontend/templates/rh_intro.html +++ b/frontend/templates/rh_intro.html @@ -32,9 +32,9 @@ If you're an author, publisher, or other rights holder, you can participate more {% include 'add_your_books.html' %} {% if campaigns %} -
  • You've set up {{ campaigns.count }} campaign(s). Manage them here.
  • +
  • You've set up {{ campaigns.count }} campaign(s). Manage them here. Or, set up a new campaign.
  • {% else %} -
  • {% if claims %}Set up a campaign for for your book.{% else %} Set up a campaign. All the campaigns you can manage will be listed on this page.{% endif %}
  • +
  • {% if claims %}Set up a campaign for your book.{% else %} Set up a campaign. All the campaigns you can manage will be listed on this page.{% endif %}
  • {% endif %}

    About Campaigns

    From 44c2289c62b5bca9dc0a301ddd3e0937d6103c73 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 22 Dec 2017 11:43:17 -0500 Subject: [PATCH 057/109] update readme with redis info --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a7c4be1..5eaf79d2 100644 --- a/README.md +++ b/README.md @@ -41,11 +41,13 @@ to install python-setuptools in step 1: 1. `django-admin.py celeryd --loglevel=INFO` start the celery daemon to perform asynchronous tasks like adding related editions, and display logging information in the foreground. 1. `django-admin.py celerybeat -l INFO` to start the celerybeat daemon to handle scheduled tasks. 1. `django-admin.py runserver 0.0.0.0:8000` (you can change the port number from the default value of 8000) +1. make sure a [redis server](https://redis.io/topics/quickstart) is running 1. Point your browser to http://localhost:8000/ CSS development -1. We are using Less version 2.8 for CSS. http://incident57.com/less/. We use minified CSS. +1. We used Less version 2.8 for CSS. http://incident57.com/less/. We use minified CSS. +1. New CSS development is using SCSS. Install libsass and django-compressor. Production Deployment --------------------- From 2f649ef9a2c9c37b5114696044476e2a1c78a984 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 22 Dec 2017 12:42:29 -0500 Subject: [PATCH 058/109] admin can now fix ebook/ebookfile problems --- core/admin.py | 45 ++++++++++++++++++++++++++++++++++++++------- core/lookups.py | 19 +++++++++++++++++-- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/core/admin.py b/core/admin.py index 77c24de1..ff163fcc 100644 --- a/core/admin.py +++ b/core/admin.py @@ -21,7 +21,8 @@ from regluit.core.lookups import ( PublisherNameLookup, WorkLookup, OwnerLookup, - EditionLookup + EditionLookup, + EbookLookup, ) @@ -165,21 +166,51 @@ class PublisherNameAdmin(ModelAdmin): class RelationAdmin(ModelAdmin): list_display = ('code', 'name') search_fields = ['name'] - + +class EbookAdminForm(forms.ModelForm): + edition = AutoCompleteSelectField( + lookup_class=EditionLookup, + label='Edition', + widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), + required=True, + ) + class Meta(object): + model = models.Ebook + exclude = ('user', 'filesize', 'download_count') + class EbookAdmin(ModelAdmin): + form = EbookAdminForm search_fields = ('edition__title','^url') # search by provider using leading url - list_display = ('__unicode__','created', 'user','edition') + list_display = ('__unicode__','created', 'user', 'edition') date_hierarchy = 'created' ordering = ('edition__title',) - exclude = ('edition','user', 'filesize') + readonly_fields = ('user', 'filesize', 'download_count') +class EbookFileAdminForm(forms.ModelForm): + edition = AutoCompleteSelectField( + lookup_class=EditionLookup, + label='Edition', + widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), + required=True, + ) + ebook = AutoCompleteSelectField( + lookup_class=EbookLookup, + label='Ebook', + widget=AutoCompleteSelectWidget(lookup_class=EbookLookup, attrs={'size':60}), + required=False, + ) + class Meta(object): + model = models.EbookFile + fields = ('file', 'format', 'edition', 'ebook', 'source') + class EbookFileAdmin(ModelAdmin): + form = EbookFileAdminForm search_fields = ('ebook__edition__title', 'source') # search by provider using leading url list_display = ('created', 'format', 'ebook_link', 'asking') date_hierarchy = 'created' ordering = ('edition__work',) - fields = ('file', 'format', 'edition_link', 'ebook_link', 'source') - readonly_fields = ('file', 'edition_link', 'ebook_link', 'ebook') + fields = ('file', 'format', 'edition', 'edition_link', 'ebook', 'ebook_link', 'source') + readonly_fields = ('file', 'edition_link', 'ebook_link', ) def edition_link(self, obj): if obj.edition: link = reverse("admin:core_edition_change", args=[obj.edition_id]) @@ -251,7 +282,7 @@ class IdentifierAdminForm(forms.ModelForm): lookup_class=EditionLookup, label='Edition', widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), - required=True, + required=False, ) class Meta(object): model = models.Identifier diff --git a/core/lookups.py b/core/lookups.py index b46073c0..3c8aeccc 100644 --- a/core/lookups.py +++ b/core/lookups.py @@ -3,7 +3,7 @@ from selectable.registry import registry from django.contrib.auth.models import User from django.db.models import Count -from regluit.core.models import Work, PublisherName, Edition, Subject, EditionNote +from regluit.core.models import Work, PublisherName, Edition, Subject, EditionNote, Ebook from regluit.utils.text import sanitize_line class OwnerLookup(ModelLookup): @@ -32,6 +32,20 @@ class PublisherNameLookup(ModelLookup): publisher_name.save() return publisher_name +class EbookLookup(ModelLookup): + model = Ebook + search_fields = ('edition__title__icontains',) + filters = {'edition__isnull': False, } + + def get_item(self, value): + item = None + if value: + try: + item = Ebook.objects.get(pk=value) + except (ValueError, Ebook.DoesNotExist): + item = None + return item + class EditionLookup(ModelLookup): model = Edition search_fields = ('title__icontains',) @@ -69,4 +83,5 @@ registry.register(WorkLookup) registry.register(PublisherNameLookup) registry.register(EditionLookup) registry.register(SubjectLookup) -registry.register(EditionNoteLookup) \ No newline at end of file +registry.register(EditionNoteLookup) +registry.register(EbookLookup) \ No newline at end of file From 2e70da0a4a8bcbdf0dd643a3089db4a9c7c6e84b Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 22 Dec 2017 13:19:26 -0500 Subject: [PATCH 059/109] delint --- core/admin.py | 270 ++++++++++++++++++++++++------------------------ core/lookups.py | 22 ++-- 2 files changed, 145 insertions(+), 147 deletions(-) diff --git a/core/admin.py b/core/admin.py index ff163fcc..73706deb 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,71 +1,72 @@ -""" -django imports -""" +# +#django imports +# from django import forms -from django.contrib.admin import ModelAdmin -from django.contrib.admin import site as admin_site -from django.contrib.auth.models import User +from django.contrib.admin import ModelAdmin, register from django.core.urlresolvers import reverse -from selectable.forms import ( + +from selectable.forms import ( AutoCompleteSelectWidget, AutoCompleteSelectField, AutoCompleteSelectMultipleWidget, AutoCompleteSelectMultipleField, ) -""" -regluit imports -""" -from . import models -from regluit.core.lookups import ( +# +# regluit imports +#""" +from .lookups import ( PublisherNameLookup, WorkLookup, OwnerLookup, EditionLookup, EbookLookup, ) - - +from . import models class ClaimAdminForm(forms.ModelForm): work = AutoCompleteSelectField( - lookup_class=WorkLookup, - widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), - required=True, - ) + lookup_class=WorkLookup, + widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), + required=True, + ) user = AutoCompleteSelectField( - lookup_class=OwnerLookup, - widget=AutoCompleteSelectWidget(lookup_class=OwnerLookup), - required=True, - ) + lookup_class=OwnerLookup, + widget=AutoCompleteSelectWidget(lookup_class=OwnerLookup), + required=True, + ) class Meta(object): model = models.Claim exclude = () +@register(models.Claim) class ClaimAdmin(ModelAdmin): list_display = ('work', 'rights_holder', 'status') date_hierarchy = 'created' form = ClaimAdminForm - + class RightsHolderAdminForm(forms.ModelForm): owner = AutoCompleteSelectField( - lookup_class=OwnerLookup, - widget=AutoCompleteSelectWidget(lookup_class=OwnerLookup), - required=True, - ) + lookup_class=OwnerLookup, + widget=AutoCompleteSelectWidget(lookup_class=OwnerLookup), + required=True, + ) class Meta(object): model = models.RightsHolder exclude = () +@register(models.RightsHolder) class RightsHolderAdmin(ModelAdmin): date_hierarchy = 'created' form = RightsHolderAdminForm +@register(models.Acq) class AcqAdmin(ModelAdmin): readonly_fields = ('work', 'user', 'lib_acq', 'watermarked') search_fields = ['user__username'] date_hierarchy = 'created' +@register(models.Premium) class PremiumAdmin(ModelAdmin): list_display = ('campaign', 'amount', 'description') date_hierarchy = 'created' @@ -73,68 +74,78 @@ class PremiumAdmin(ModelAdmin): class CampaignAdminForm(forms.ModelForm): managers = AutoCompleteSelectMultipleField( - lookup_class=OwnerLookup, - widget= AutoCompleteSelectMultipleWidget(lookup_class=OwnerLookup), - required=True, - ) + lookup_class=OwnerLookup, + widget=AutoCompleteSelectMultipleWidget(lookup_class=OwnerLookup), + required=True, + ) class Meta(object): model = models.Campaign fields = ( - 'managers', 'name', 'description', 'details', 'license', 'paypal_receiver', + 'managers', 'name', 'description', 'details', 'license', 'paypal_receiver', 'status', 'type', 'email', 'do_watermark', 'use_add_ask', 'charitable', ) +@register(models.Campaign) class CampaignAdmin(ModelAdmin): list_display = ('work', 'created', 'status') date_hierarchy = 'created' search_fields = ['work'] form = CampaignAdminForm - + +@register(models.Work) class WorkAdmin(ModelAdmin): search_fields = ['title'] ordering = ('title',) list_display = ('title', 'created') date_hierarchy = 'created' fields = ('title', 'description', 'language', 'featured', 'publication_range', - 'age_level', 'openlibrary_lookup') + 'age_level', 'openlibrary_lookup') +@register(models.Author) class AuthorAdmin(ModelAdmin): search_fields = ('name',) date_hierarchy = 'created' ordering = ('name',) exclude = ('editions',) -subject_authorities = (('','keywords'),('lcsh', 'LC subjects'), ('lcc', 'LC classifications'), ('bisacsh', 'BISAC heading'), ) +subject_authorities = ( + ('', 'keywords'), + ('lcsh', 'LC subjects'), + ('lcc', 'LC classifications'), + ('bisacsh', 'BISAC heading'), +) + class SubjectAdminForm(forms.ModelForm): - authority = forms.ChoiceField(choices=subject_authorities, required=False ) + authority = forms.ChoiceField(choices=subject_authorities, required=False) class Meta(object): model = models.Subject fields = 'name', 'authority', 'is_visible' - - + +@register(models.Subject) class SubjectAdmin(ModelAdmin): search_fields = ('name',) date_hierarchy = 'created' ordering = ('name',) form = SubjectAdminForm - + class EditionAdminForm(forms.ModelForm): work = AutoCompleteSelectField( - lookup_class=WorkLookup, - label='Work', - widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), - required=True, - ) + lookup_class=WorkLookup, + label='Work', + widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), + required=True, + ) publisher_name = AutoCompleteSelectField( - lookup_class=PublisherNameLookup, - label='Publisher Name', - widget=AutoCompleteSelectWidget(lookup_class=PublisherNameLookup), - required=False, - ) + lookup_class=PublisherNameLookup, + label='Publisher Name', + widget=AutoCompleteSelectWidget(lookup_class=PublisherNameLookup), + required=False, + ) class Meta(object): model = models.Edition exclude = () - + +@register(models.Edition) class EditionAdmin(ModelAdmin): list_display = ('title', 'publisher_name', 'created') date_hierarchy = 'created' @@ -143,66 +154,71 @@ class EditionAdmin(ModelAdmin): class PublisherAdminForm(forms.ModelForm): name = AutoCompleteSelectField( - lookup_class=PublisherNameLookup, - label='Name', - widget=AutoCompleteSelectWidget(lookup_class=PublisherNameLookup), - required=True, - ) + lookup_class=PublisherNameLookup, + label='Name', + widget=AutoCompleteSelectWidget(lookup_class=PublisherNameLookup), + required=True, + ) class Meta(object): model = models.Publisher exclude = () - + +@register(models.Publisher) class PublisherAdmin(ModelAdmin): list_display = ('name', 'url', 'logo_url', 'description') ordering = ('name',) form = PublisherAdminForm +@register(models.PublisherName) class PublisherNameAdmin(ModelAdmin): list_display = ('name', 'publisher') ordering = ('name',) search_fields = ['name'] +@register(models.Relation) class RelationAdmin(ModelAdmin): list_display = ('code', 'name') search_fields = ['name'] class EbookAdminForm(forms.ModelForm): edition = AutoCompleteSelectField( - lookup_class=EditionLookup, - label='Edition', - widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), - required=True, - ) + lookup_class=EditionLookup, + label='Edition', + widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), + required=True, + ) class Meta(object): model = models.Ebook exclude = ('user', 'filesize', 'download_count') - + +@register(models.Ebook) class EbookAdmin(ModelAdmin): form = EbookAdminForm - search_fields = ('edition__title','^url') # search by provider using leading url - list_display = ('__unicode__','created', 'user', 'edition') + search_fields = ('edition__title', '^url') # search by provider using leading url + list_display = ('__unicode__', 'created', 'user', 'edition') date_hierarchy = 'created' ordering = ('edition__title',) readonly_fields = ('user', 'filesize', 'download_count') class EbookFileAdminForm(forms.ModelForm): edition = AutoCompleteSelectField( - lookup_class=EditionLookup, - label='Edition', - widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), - required=True, - ) + lookup_class=EditionLookup, + label='Edition', + widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), + required=True, + ) ebook = AutoCompleteSelectField( - lookup_class=EbookLookup, - label='Ebook', - widget=AutoCompleteSelectWidget(lookup_class=EbookLookup, attrs={'size':60}), - required=False, - ) + lookup_class=EbookLookup, + label='Ebook', + widget=AutoCompleteSelectWidget(lookup_class=EbookLookup, attrs={'size':60}), + required=False, + ) class Meta(object): model = models.EbookFile fields = ('file', 'format', 'edition', 'ebook', 'source') - + +@register(models.EbookFile) class EbookFileAdmin(ModelAdmin): form = EbookFileAdminForm search_fields = ('ebook__edition__title', 'source') # search by provider using leading url @@ -210,116 +226,96 @@ class EbookFileAdmin(ModelAdmin): date_hierarchy = 'created' ordering = ('edition__work',) fields = ('file', 'format', 'edition', 'edition_link', 'ebook', 'ebook_link', 'source') - readonly_fields = ('file', 'edition_link', 'ebook_link', ) + readonly_fields = ('file', 'edition_link', 'ebook_link',) def edition_link(self, obj): if obj.edition: - link = reverse("admin:core_edition_change", args=[obj.edition_id]) - return u'%s' % (link,obj.edition) - else: - return u'' + link = reverse("admin:core_edition_change", args=[obj.edition_id]) + return u'%s' % (link, obj.edition) + return u'' def ebook_link(self, obj): if obj.ebook: - link = reverse("admin:core_ebook_change", args=[obj.ebook_id]) - return u'%s' % (link,obj.ebook) - else: - return u'' - edition_link.allow_tags=True - ebook_link.allow_tags=True + link = reverse("admin:core_ebook_change", args=[obj.ebook_id]) + return u'%s' % (link, obj.ebook) + return u'' + edition_link.allow_tags = True + ebook_link.allow_tags = True +@register(models.Wishlist) class WishlistAdmin(ModelAdmin): date_hierarchy = 'created' +@register(models.UserProfile) class UserProfileAdmin(ModelAdmin): search_fields = ('user__username',) date_hierarchy = 'created' exclude = ('user',) +@register(models.Gift) class GiftAdmin(ModelAdmin): - list_display = ('to', 'acq_admin_link', 'giver', ) + list_display = ('to', 'acq_admin_link', 'giver',) search_fields = ('giver__username', 'to') - readonly_fields = ('giver', 'acq',) + readonly_fields = ('giver', 'acq',) def acq_admin_link(self, gift): return "%s" % (gift.acq_id, gift.acq) acq_admin_link.allow_tags = True +@register(models.CeleryTask) class CeleryTaskAdmin(ModelAdmin): - pass - + pass + +@register(models.Press) class PressAdmin(ModelAdmin): list_display = ('title', 'source', 'date') ordering = ('-date',) class WorkRelationAdminForm(forms.ModelForm): to_work = AutoCompleteSelectField( - lookup_class=WorkLookup, - label='To Work', - widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), - required=True, - ) + lookup_class=WorkLookup, + label='To Work', + widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), + required=True, + ) from_work = AutoCompleteSelectField( - lookup_class=WorkLookup, - label='From Work', - widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), - required=True, - ) + lookup_class=WorkLookup, + label='From Work', + widget=AutoCompleteSelectWidget(lookup_class=WorkLookup), + required=True, + ) class Meta(object): model = models.WorkRelation exclude = () +@register(models.WorkRelation) class WorkRelationAdmin(ModelAdmin): form = WorkRelationAdminForm list_display = ('to_work', 'relation', 'from_work') - + class IdentifierAdminForm(forms.ModelForm): work = AutoCompleteSelectField( - lookup_class=WorkLookup, - label='Work', - widget=AutoCompleteSelectWidget(lookup_class=WorkLookup, attrs={'size':60}), - required=False, - ) + lookup_class=WorkLookup, + label='Work', + widget=AutoCompleteSelectWidget(lookup_class=WorkLookup, attrs={'size':60}), + required=False, + ) edition = AutoCompleteSelectField( - lookup_class=EditionLookup, - label='Edition', - widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), - required=False, - ) + lookup_class=EditionLookup, + label='Edition', + widget=AutoCompleteSelectWidget(lookup_class=EditionLookup, attrs={'size':60}), + required=False, + ) class Meta(object): model = models.Identifier exclude = () +@register(models.Identifier) class IdentifierAdmin(ModelAdmin): form = IdentifierAdminForm list_display = ('type', 'value') search_fields = ('type', 'value') +@register(models.Offer) class OfferAdmin(ModelAdmin): list_display = ('work', 'license', 'price', 'active') search_fields = ('work__title',) readonly_fields = ('work',) - - -admin_site.register(models.Acq, AcqAdmin) -admin_site.register(models.Author, AuthorAdmin) -admin_site.register(models.Badge, ModelAdmin) -admin_site.register(models.Campaign, CampaignAdmin) -admin_site.register(models.CeleryTask, CeleryTaskAdmin) -admin_site.register(models.Claim, ClaimAdmin) -admin_site.register(models.Ebook, EbookAdmin) -admin_site.register(models.EbookFile, EbookFileAdmin) -admin_site.register(models.Edition, EditionAdmin) -admin_site.register(models.Gift, GiftAdmin) -admin_site.register(models.Identifier, IdentifierAdmin) -admin_site.register(models.Offer, OfferAdmin) -admin_site.register(models.Premium, PremiumAdmin) -admin_site.register(models.Press, PressAdmin) -admin_site.register(models.Publisher, PublisherAdmin) -admin_site.register(models.PublisherName, PublisherNameAdmin) -admin_site.register(models.Relation, RelationAdmin) -admin_site.register(models.RightsHolder, RightsHolderAdmin) -admin_site.register(models.Subject, SubjectAdmin) -admin_site.register(models.UserProfile, UserProfileAdmin) -admin_site.register(models.Wishlist, WishlistAdmin) -admin_site.register(models.Work, WorkAdmin) -admin_site.register(models.WorkRelation, WorkRelationAdmin) - diff --git a/core/lookups.py b/core/lookups.py index 3c8aeccc..06c50936 100644 --- a/core/lookups.py +++ b/core/lookups.py @@ -13,12 +13,12 @@ class OwnerLookup(ModelLookup): class WorkLookup(ModelLookup): model = Work search_fields = ('title__istartswith',) - def get_item_label(self,item): - return "%s (%s, %s)"%(item.title,item.id,item.language) - - def get_item_value(self,item): - return "%s (%s, %s)"%(item.title,item.id,item.language) - + def get_item_label(self, item): + return "%s (%s, %s)"%(item.title, item.id, item.language) + + def get_item_value(self, item): + return "%s (%s, %s)"%(item.title, item.id, item.language) + def get_query(self, request, term): results = super(WorkLookup, self).get_query(request, term) return results @@ -31,7 +31,7 @@ class PublisherNameLookup(ModelLookup): publisher_name, created = PublisherName.objects.get_or_create(name=value) publisher_name.save() return publisher_name - + class EbookLookup(ModelLookup): model = Ebook search_fields = ('edition__title__icontains',) @@ -66,9 +66,11 @@ class EditionLookup(ModelLookup): class SubjectLookup(ModelLookup): model = Subject search_fields = ('name__icontains',) - + def get_query(self, request, term): - return super(SubjectLookup, self).get_query( request, term).annotate(Count('works')).order_by('-works__count') + return super(SubjectLookup, self).get_query( + request, term + ).annotate(Count('works')).order_by('-works__count') class EditionNoteLookup(ModelLookup): model = EditionNote @@ -84,4 +86,4 @@ registry.register(PublisherNameLookup) registry.register(EditionLookup) registry.register(SubjectLookup) registry.register(EditionNoteLookup) -registry.register(EbookLookup) \ No newline at end of file +registry.register(EbookLookup) From f701f1ba369aed680715cdb23c5922852729f67b Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 23 Dec 2017 18:12:07 -0500 Subject: [PATCH 060/109] refactor can_scrape --- core/loaders/scrape.py | 46 +++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index 85f66eca..e633b3e4 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -1,5 +1,6 @@ import re import logging +from urlparse import urlparse import requests from bs4 import BeautifulSoup #from gitenberg.metadata.pandata import Pandata @@ -18,8 +19,27 @@ CONTAINS_OCLCNUM = re.compile('worldcat.org/oclc/(\d+)') class BaseScraper(object): ''' - designed to make at least a decent gues for webpages that embed metadata + designed to make at least a decent guess for webpages that embed metadata ''' + can_scrape_hosts = False + can_scrape_strings = [''] #should always return true + @classmethod + def can_scrape(cls, url): + ''' return True if the class can scrape the URL ''' + if not (cls.can_scrape_hosts or cls.can_scrape_strings): + return True + if cls.can_scrape_hosts: + urlhost = urlparse(url).hostname + if urlhost: + for host in cls.can_scrape_hosts: + if urlhost.endswith(host): + return True + if cls.can_scrape_strings: + for pass_str in cls.can_scrape_strings: + if url.find(pass_str) >= 0: + return True + return False + def __init__(self, url): self.metadata = {} self.identifiers = {'http': url} @@ -286,12 +306,12 @@ class BaseScraper(object): for link in links: self.set('rights_url', link['href']) - @classmethod - def can_scrape(cls, url): - ''' return True if the class can scrape the URL ''' - return True class PressbooksScraper(BaseScraper): + can_scrape_hosts = ['bookkernel.com', 'milnepublishing.geneseo.edu', + 'press.rebus.community', 'pb.unizin.org'] + can_scrape_strings = ['pressbooks'] + def get_downloads(self): for dl_type in ['epub', 'mobi', 'pdf']: download_el = self.doc.select_one('.{}'.format(dl_type)) @@ -328,19 +348,12 @@ class PressbooksScraper(BaseScraper): isbns[key] = isbn return isbns - @classmethod - def can_scrape(cls, url): - pb_sites = ['bookkernel.com','milnepublishing.geneseo.edu', 'pressbooks', - 'press.rebus.community','pb.unizin.org'] - ''' return True if the class can scrape the URL ''' - for site in pb_sites: - if url.find(site) > 0: - return True - return False class HathitrustScraper(BaseScraper): + can_scrape_hosts = ['hathitrust.org'] + can_scrape_strings = ['hdl.handle.net/2027/'] CATALOG = re.compile(r'catalog.hathitrust.org/Record/(\d+)') def setup(self): @@ -388,8 +401,3 @@ class HathitrustScraper(BaseScraper): def get_genre(self): self.set('genre', self.record.get('type_of_reference', '').lower()) - - @classmethod - def can_scrape(cls, url): - ''' return True if the class can scrape the URL ''' - return url.find('hathitrust.org') > 0 or url.find('hdl.handle.net/2027/') > 0 From e6dbae05db6738befa42166cbe27dfb3a9e66eca Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 23 Dec 2017 18:15:59 -0500 Subject: [PATCH 061/109] update springer --- core/loaders/springer.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/core/loaders/springer.py b/core/loaders/springer.py index 9aedce1d..40e3bed6 100644 --- a/core/loaders/springer.py +++ b/core/loaders/springer.py @@ -1,8 +1,9 @@ import re -import requests - -from bs4 import BeautifulSoup from urlparse import urljoin + +import requests +from bs4 import BeautifulSoup + from django.conf import settings from regluit.core.validation import identifier_cleaner @@ -14,11 +15,12 @@ MENTIONS_CC = re.compile(r'CC BY(-NC)?(-ND|-SA)?', flags=re.I) HAS_YEAR = re.compile(r'(19|20)\d\d') class SpringerScraper(BaseScraper): + can_scrape_strings =['10.1007', '10.1057'] def get_downloads(self): for dl_type in ['epub', 'mobi', 'pdf']: download_el = self.doc.find('a', title=re.compile(dl_type.upper())) if download_el: - value = download_el.get('href') + value = download_el.get('href') if value: value = urljoin(self.base, value) self.set('download_url_{}'.format(dl_type), value) @@ -31,7 +33,7 @@ class SpringerScraper(BaseScraper): text = div.get_text() if hasattr(div, 'get_text') else div.string if text: text = text.replace(u'\xa0', u' ') - value = u'{}

    {}

    '.format(value, text) + value = u'{}

    {}

    '.format(value, text) self.set('description', value) def get_keywords(self): @@ -42,7 +44,7 @@ class SpringerScraper(BaseScraper): if 'Open Access' in value: value.remove('Open Access') self.set('subjects', value) - + def get_identifiers(self): super(SpringerScraper, self).get_identifiers() el = self.doc.select_one('#doi-url') @@ -64,7 +66,7 @@ class SpringerScraper(BaseScraper): if value: isbns['electronic'] = value return isbns - + def get_title(self): el = self.doc.select_one('#book-title') value = '' @@ -75,7 +77,7 @@ class SpringerScraper(BaseScraper): self.set('title', value) if not value: super(SpringerScraper, self).get_title() - + def get_role(self): if self.doc.select_one('#editors'): return 'editor' @@ -84,19 +86,19 @@ class SpringerScraper(BaseScraper): def get_author_list(self): for el in self.doc.select('.authors__name'): yield el.text.strip().replace(u'\xa0', u' ') - + def get_license(self): '''only looks for cc licenses''' links = self.doc.find_all(href=CONTAINS_CC) for link in links: self.set('rights_url', link['href']) return - mention = self.doc.find(string=MENTIONS_CC) + mention = self.doc.find(string=MENTIONS_CC) if mention: lic = MENTIONS_CC.search(mention).group(0) lic_url = 'https://creativecommons.org/licenses/{}/'.format(lic[3:].lower()) self.set('rights_url', lic_url) - + def get_pubdate(self): pubinfo = self.doc.select_one('#copyright-info') if pubinfo: @@ -107,12 +109,6 @@ class SpringerScraper(BaseScraper): def get_publisher(self): self.set('publisher', 'Springer') - @classmethod - def can_scrape(cls, url): - ''' return True if the class can scrape the URL ''' - return url.find('10.1007') >= 0 or url.find('10.1057') >= 0 - - search_url = 'https://link.springer.com/search/page/{}?facet-content-type=%22Book%22&package=openaccess' def load_springer(num_pages): def springer_open_books(num_pages): From cf093c945d5ff8ed8d0e6f5e19c05b47b6a05acc Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 23 Dec 2017 18:29:16 -0500 Subject: [PATCH 062/109] add some custom code for ubiquity press sites --- core/loaders/__init__.py | 3 ++- core/loaders/ubiquity.py | 31 +++++++++++++++++++++++++++++++ utils/lang.py | 6 ++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 core/loaders/ubiquity.py create mode 100644 utils/lang.py diff --git a/core/loaders/__init__.py b/core/loaders/__init__.py index 233f5600..57eddf25 100755 --- a/core/loaders/__init__.py +++ b/core/loaders/__init__.py @@ -8,9 +8,10 @@ from gitenberg.metadata.pandata import Pandata from regluit.core.bookloader import add_from_bookdatas, BasePandataLoader from .scrape import PressbooksScraper, HathitrustScraper, BaseScraper from .springer import SpringerScraper +from .ubiquity import UbiquityScraper def get_scraper(url): - scrapers = [PressbooksScraper, HathitrustScraper, SpringerScraper, BaseScraper] + scrapers = [PressbooksScraper, HathitrustScraper, SpringerScraper, UbiquityScraper, BaseScraper] for scraper in scrapers: if scraper.can_scrape(url): return scraper(url) diff --git a/core/loaders/ubiquity.py b/core/loaders/ubiquity.py new file mode 100644 index 00000000..27f7f0a1 --- /dev/null +++ b/core/loaders/ubiquity.py @@ -0,0 +1,31 @@ +import re +from urlparse import urlparse + +from regluit.utils.lang import get_language_code +from . import BaseScraper + + +HAS_EDS = re.compile(r'\(eds?\.\)') +UBIQUITY_HOSTS = ["ubiquitypress.com", "kriterium.se", "oa.finlit.fi", "humanities-map.net", + "oa.psupress.org", "larcommons.net", "uwestminsterpress.co.uk", "stockholmuniversitypress.se", + "luminosoa.org", +] + +class UbiquityScraper(BaseScraper): + can_scrape_hosts = UBIQUITY_HOSTS + def get_role(self): + descs = self.doc.select('section.book-description') + for desc in descs: + if desc.find(string=HAS_EDS): + return 'editor' + return super(self, UbiquityScraper).get_role() + + def get_language(self): + langlabel = self.doc.find(string='Language') + lang = langlabel.parent.parent.find_next_sibling() + lang = lang.get_text() if lang else '' + lang = get_language_code(lang) if lang else '' + if lang: + self.set('language', lang) + else: + super(self, UbiquityScraper).get_language() diff --git a/utils/lang.py b/utils/lang.py new file mode 100644 index 00000000..1b679533 --- /dev/null +++ b/utils/lang.py @@ -0,0 +1,6 @@ +from django.conf.global_settings import LANGUAGES + +lang2code = dict([ (lang[1].lower(), lang[0]) for lang in LANGUAGES ]) + +def get_language_code(language): + return lang2code.get(language.lower().strip(), '') From 72ae3c73a560661596330e3b671b8ed2bddda9ae Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 27 Dec 2017 12:20:56 -0500 Subject: [PATCH 063/109] trouble with mobis when title is unicode? --- core/management/commands/make_missing_mobis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/management/commands/make_missing_mobis.py b/core/management/commands/make_missing_mobis.py index 53254ff1..ee06fe3a 100644 --- a/core/management/commands/make_missing_mobis.py +++ b/core/management/commands/make_missing_mobis.py @@ -23,7 +23,7 @@ class Command(BaseCommand): ebf = ebook.get_archive_ebf() if ebf: try: - print 'making mobi for {}'.format(work.title) + print u'making mobi for {}'.format(work.title) if ebf.make_mobi(): print 'made mobi' i = i + 1 From f1213d590cd77a24fd7c7844b891003fd3ea1bc5 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 1 Jan 2018 19:25:00 -0500 Subject: [PATCH 064/109] fix can_scrape --- core/loaders/scrape.py | 2 +- core/loaders/ubiquity.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index e633b3e4..d0ba8a0e 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -22,7 +22,7 @@ class BaseScraper(object): designed to make at least a decent guess for webpages that embed metadata ''' can_scrape_hosts = False - can_scrape_strings = [''] #should always return true + can_scrape_strings = False @classmethod def can_scrape(cls, url): ''' return True if the class can scrape the URL ''' diff --git a/core/loaders/ubiquity.py b/core/loaders/ubiquity.py index 27f7f0a1..dec8f175 100644 --- a/core/loaders/ubiquity.py +++ b/core/loaders/ubiquity.py @@ -22,7 +22,7 @@ class UbiquityScraper(BaseScraper): def get_language(self): langlabel = self.doc.find(string='Language') - lang = langlabel.parent.parent.find_next_sibling() + lang = langlabel.parent.parent.find_next_sibling() if langlabel else '' lang = lang.get_text() if lang else '' lang = get_language_code(lang) if lang else '' if lang: From 3f3428a68b024b13a61faf7ab11c071ca217bb51 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 2 Jan 2018 18:20:34 -0500 Subject: [PATCH 065/109] add some opengraph support --- core/loaders/scrape.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index d0ba8a0e..06bd1eca 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -101,6 +101,11 @@ class BaseScraper(object): attrs['itemprop'] = meta_name metas = self.doc.find_all('meta', attrs=attrs) del(attrs['itemprop']) + if len(metas) == 0: + # og metadata in often in 'property' not name + attrs['property'] = meta_name + metas = self.doc.find_all('meta', attrs=attrs) + del(attrs['property']) for meta in metas: el_value = meta.get('content', '').strip() if list_mode == 'longest': @@ -126,6 +131,8 @@ class BaseScraper(object): list_mode = attrs.pop('list_mode', 'list') attrs = {'itemprop': name} props = self.doc.find_all(attrs=attrs) + attrs = {'property': name} + props = props if props else self.doc.find_all(attrs=attrs) for el in props: if list_mode == 'one_item': return el.text if el.text else el.get('content') @@ -181,7 +188,8 @@ class BaseScraper(object): isbns[isbn_key] = value self.identifiers[isbn_key] = value if not isbns: - values = self.get_itemprop('isbn') + values = self.check_metas(['book:isbn', 'books:isbn'], list_mode='list') + values = values if values else self.get_itemprop('isbn') if values: value = isbn_cleaner(values[0]) isbns = {'':value} if value else {} @@ -246,7 +254,10 @@ class BaseScraper(object): def get_pubdate(self): value = self.get_itemprop('datePublished', list_mode='one_item') if not value: - value = self.check_metas(['citation_publication_date', 'DC.Date.issued', 'datePublished']) + value = self.check_metas([ + 'citation_publication_date', 'DC.Date.issued', 'datePublished', + 'books:release_date', 'book:release_date' + ]) if value: self.set('publication_date', value) @@ -281,7 +292,7 @@ class BaseScraper(object): self.set('creator', {'{}s'.format(role): creator_list }) def get_cover(self): - image_url = self.check_metas(['og.image', 'image', 'twitter:image']) + image_url = self.check_metas(['og:image', 'image', 'twitter:image']) if not image_url: block = self.doc.find(class_=CONTAINS_COVER) block = block if block else self.doc From 2db2c499b8a1af3229f317c7b5bec32ed5c40a74 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 2 Jan 2018 20:08:11 -0500 Subject: [PATCH 066/109] fix bookpanel --- frontend/templates/book_panel.html | 2 +- frontend/templatetags/bookpanel.py | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/frontend/templates/book_panel.html b/frontend/templates/book_panel.html index 24dad3c4..ce1d5e0e 100644 --- a/frontend/templates/book_panel.html +++ b/frontend/templates/book_panel.html @@ -217,7 +217,7 @@ Set {{setkw}}
    {% endif %} - {% elif not supported %} + {% elif show_pledge %} diff --git a/frontend/templatetags/bookpanel.py b/frontend/templatetags/bookpanel.py index 473c043f..97703d56 100644 --- a/frontend/templatetags/bookpanel.py +++ b/frontend/templatetags/bookpanel.py @@ -10,25 +10,32 @@ def bookpanel(context): library = context.get('library',None) user = context['request'].user campaign = context.get('last_campaign', None) - + # compute a boolean that's true if bookpanel should show a "pledge" button... # campaign is ACTIVE, type 1 - REWARDS # user has not pledged or user is anonymous - + supported = False if campaign and campaign.type == REWARDS: if campaign.status == 'ACTIVE': if not user.is_anonymous() and user.transaction_set.filter(campaign__work=work): supported = True - context['supported'] = supported - + context['supported'] = supported + + show_pledge = False + if campaign and campaign.type == REWARDS: + if campaign.status == 'ACTIVE': + if user.is_anonymous() or not supported: + show_pledge = True + context['show_pledge'] = show_pledge + # compute a boolean that's true if bookpanel should show a "purchase" button... # campaign is ACTIVE, type 2 - BUY2UNGLUE # user has not purchased or user is anonymous # user has not borrowed or user is anonymous # work not available in users library # not on the library page - + show_purchase = False if campaign and campaign.type == BUY2UNGLUE: if user.is_anonymous() or not context.get('license_is_active', False): From c8837c3c745c87a30a2de2b42c2e207795f0628d Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 3 Jan 2018 11:54:48 -0500 Subject: [PATCH 067/109] make check_metas case insensitive for name --- core/loaders/scrape.py | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index 06bd1eca..ddbe8eed 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -92,8 +92,7 @@ class BaseScraper(object): value = '' list_mode = attrs.pop('list_mode', 'longest') for meta_name in meta_list: - attrs['name'] = meta_name - + attrs['name'] = re.compile(meta_name, flags=re.I) metas = self.doc.find_all('meta', attrs=attrs) if len(metas) == 0: # some sites put schema.org metadata in metas @@ -151,24 +150,23 @@ class BaseScraper(object): # def get_genre(self): - value = self.check_metas(['DC.Type', 'dc.type', 'og:type']) + value = self.check_metas([r'dc\.type', 'og:type']) if value and value in ('Text.Book', 'book'): self.set('genre', 'book') def get_title(self): - value = self.check_metas(['DC.Title', 'dc.title', 'citation_title', 'og:title', 'title']) + value = self.check_metas([r'dc\.title', 'citation_title', 'og:title', 'title']) if not value: value = self.fetch_one_el_content('title') self.set('title', value) def get_language(self): - value = self.check_metas(['DC.Language', 'dc.language', 'language', 'inLanguage']) + value = self.check_metas([r'dc\.language', 'language', 'inLanguage']) self.set('language', value) def get_description(self): value = self.check_metas([ - 'DC.Description', - 'dc.description', + r'dc\.description', 'og:description', 'description' ]) @@ -196,14 +194,14 @@ class BaseScraper(object): return isbns def get_identifiers(self): - value = self.check_metas(['DC.Identifier.URI']) + value = self.check_metas([r'DC\.Identifier\.URI']) if not value: value = self.doc.select_one('link[rel=canonical]') value = value['href'] if value else None value = identifier_cleaner('http', quiet=True)(value) if value: self.identifiers['http'] = value - value = self.check_metas(['DC.Identifier.DOI', 'citation_doi']) + value = self.check_metas([r'DC\.Identifier\.DOI', 'citation_doi']) value = identifier_cleaner('doi', quiet=True)(value) if value: self.identifiers['doi'] = value @@ -247,7 +245,7 @@ class BaseScraper(object): self.set('subjects', re.split(' *[;,] *', value)) def get_publisher(self): - value = self.check_metas(['citation_publisher', 'DC.Source']) + value = self.check_metas(['citation_publisher', r'DC\.Source']) if value: self.set('publisher', value) @@ -255,20 +253,20 @@ class BaseScraper(object): value = self.get_itemprop('datePublished', list_mode='one_item') if not value: value = self.check_metas([ - 'citation_publication_date', 'DC.Date.issued', 'datePublished', + 'citation_publication_date', r'DC\.Date\.issued', 'datePublished', 'books:release_date', 'book:release_date' ]) if value: self.set('publication_date', value) def get_author_list(self): - value_list = self.check_metas([ - 'DC.Creator.PersonalName', - 'citation_author', - 'author', - ], list_mode='list') + value_list = self.get_itemprop('author') if not value_list: - value_list = self.get_itemprop('author') + value_list = self.check_metas([ + r'DC\.Creator\.PersonalName', + 'citation_author', + 'author', + ], list_mode='list') if not value_list: return [] return value_list From e837dd6ff200881f6356e981f132a811dd7f6475 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 3 Jan 2018 13:30:36 -0500 Subject: [PATCH 068/109] added date validation --- core/loaders/scrape.py | 8 +++++--- core/validation.py | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index ddbe8eed..bde8f959 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -9,7 +9,7 @@ from urlparse import urljoin from RISparser import read as readris from regluit.core import models -from regluit.core.validation import identifier_cleaner, authlist_cleaner +from regluit.core.validation import authlist_cleaner, identifier_cleaner, validate_date logger = logging.getLogger(__name__) @@ -22,7 +22,7 @@ class BaseScraper(object): designed to make at least a decent guess for webpages that embed metadata ''' can_scrape_hosts = False - can_scrape_strings = False + can_scrape_strings = False @classmethod def can_scrape(cls, url): ''' return True if the class can scrape the URL ''' @@ -257,7 +257,9 @@ class BaseScraper(object): 'books:release_date', 'book:release_date' ]) if value: - self.set('publication_date', value) + value = validate_date(value) + if value: + self.set('publication_date', value) def get_author_list(self): value_list = self.get_itemprop('author') diff --git a/core/validation.py b/core/validation.py index e07e37bc..16e4640b 100644 --- a/core/validation.py +++ b/core/validation.py @@ -3,6 +3,8 @@ methods to validate and clean identifiers ''' import re +import datetime +from dateutil.parser import parse from PyPDF2 import PdfFileReader @@ -182,3 +184,21 @@ def auth_cleaner(auth): for auth in authlist: cleaned.append(spaces.sub(' ', auth.strip())) return cleaned + +MATCHYEAR = re.compile(r'(1|2)\d\d\d') +MATCHYMD = re.compile(r'(1|2)\d\d\d-\d\d-\d\d') + +def validate_date(date_string): + ymd = MATCHYMD.search(date_string) + if ymd: + return ymd.group(0) + try: + date = parse(date_string.strip(), default=datetime.date(999,1,1)) + if date.year != 999: + return date.strftime('%Y') + except ValueError: + year = MATCHYEAR.search(date_string) + if year: + return year.group(0) + else: + return '' From 6dfa1bccb4da7439b666a6053c11e924611705ac Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 3 Jan 2018 13:43:02 -0500 Subject: [PATCH 069/109] lint --- core/validation.py | 73 +++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/core/validation.py b/core/validation.py index 16e4640b..908d4c6b 100644 --- a/core/validation.py +++ b/core/validation.py @@ -4,41 +4,43 @@ methods to validate and clean identifiers ''' import re import datetime -from dateutil.parser import parse +from dateutil.parser import parse from PyPDF2 import PdfFileReader from django.forms import ValidationError +from django.utils.translation import ugettext_lazy as _ + from regluit.pyepub import EPUB from regluit.mobi import Mobi from .isbn import ISBN ID_VALIDATION = { 'http': (re.compile(r"(https?|ftp)://(-\.)?([^\s/?\.#]+\.?)+(/[^\s]*)?$", - flags=re.IGNORECASE|re.S ), - "The Web Address must be a valid http(s) URL."), - 'isbn': (r'^([\dxX\-–— ]+|delete)$', - "The ISBN must be a valid ISBN-13."), - 'doab': (r'^(\d{1,6}|delete)$', - "The value must be 1-6 digits."), + flags=re.IGNORECASE|re.S), + "The Web Address must be a valid http(s) URL."), + 'isbn': (r'^([\dxX\-–— ]+|delete)$', + "The ISBN must be a valid ISBN-13."), + 'doab': (r'^(\d{1,6}|delete)$', + "The value must be 1-6 digits."), 'gtbg': (r'^(\d{1,6}|delete)$', - "The Gutenberg number must be 1-6 digits."), - 'doi': (r'^(https?://dx\.doi\.org/|https?://doi\.org/)?(10\.\d+/\S+|delete)$', - "The DOI value must be a valid DOI."), - 'oclc': (r'^(\d{8,12}|delete)$', - "The OCLCnum must be 8 or more digits."), - 'goog': (r'^([a-zA-Z0-9\-_]{12}|delete)$', - "The Google id must be 12 alphanumeric characters, dash or underscore."), - 'gdrd': (r'^(\d{1,8}|delete)$', - "The Goodreads ID must be 1-8 digits."), - 'thng': (r'(^\d{1,8}|delete)$', - "The LibraryThing ID must be 1-8 digits."), - 'olwk': (r'^(/works/\)?OLd{1,8}W|delete)$', - "The Open Library Work ID looks like 'OL####W'."), - 'glue': (r'^(\d{1,6}|delete)$', - "The Unglue.it ID must be 1-6 digits."), - 'ltwk': (r'^(\d{1,8}|delete)$', - "The LibraryThing work ID must be 1-8 digits."), + "The Gutenberg number must be 1-6 digits."), + 'doi': (r'^(https?://dx\.doi\.org/|https?://doi\.org/)?(10\.\d+/\S+|delete)$', + "The DOI value must be a valid DOI."), + 'oclc': (r'^(\d{8,12}|delete)$', + "The OCLCnum must be 8 or more digits."), + 'goog': (r'^([a-zA-Z0-9\-_]{12}|delete)$', + "The Google id must be 12 alphanumeric characters, dash or underscore."), + 'gdrd': (r'^(\d{1,8}|delete)$', + "The Goodreads ID must be 1-8 digits."), + 'thng': (r'(^\d{1,8}|delete)$', + "The LibraryThing ID must be 1-8 digits."), + 'olwk': (r'^(/works/\)?OLd{1,8}W|delete)$', + "The Open Library Work ID looks like 'OL####W'."), + 'glue': (r'^(\d{1,6}|delete)$', + "The Unglue.it ID must be 1-6 digits."), + 'ltwk': (r'^(\d{1,8}|delete)$', + "The LibraryThing work ID must be 1-8 digits."), } def isbn_cleaner(value): @@ -48,7 +50,7 @@ def isbn_cleaner(value): raise ValidationError('no identifier value found') elif value == 'delete': return value - isbn=ISBN(value) + isbn = ISBN(value) if isbn.error: raise ValidationError(isbn.error) isbn.validate() @@ -59,7 +61,7 @@ def olwk_cleaner(value): value = '/works/{}'.format(value) return value -doi_match = re.compile( r'10\.\d+/\S+') +doi_match = re.compile(r'10\.\d+/\S+') def doi_cleaner(value): if not value == 'delete' and not value.startswith('10.'): @@ -68,7 +70,7 @@ def doi_cleaner(value): except AttributeError: return '' return value - + ID_MORE_VALIDATION = { 'isbn': isbn_cleaner, 'olwk': olwk_cleaner, @@ -105,18 +107,18 @@ def test_file(the_file, fformat): try: book = EPUB(the_file.file) except Exception as e: - raise ValidationError(_('Are you sure this is an EPUB file?: %s' % e) ) + raise ValidationError(_('Are you sure this is an EPUB file?: %s' % e)) elif fformat == 'mobi': try: book = Mobi(the_file.file) book.parse() except Exception as e: - raise ValidationError(_('Are you sure this is a MOBI file?: %s' % e) ) + raise ValidationError(_('Are you sure this is a MOBI file?: %s' % e)) elif fformat == 'pdf': try: - doc = PdfFileReader(the_file.file) + PdfFileReader(the_file.file) except Exception, e: - raise ValidationError(_('%s is not a valid PDF file' % the_file.name) ) + raise ValidationError(_('%s is not a valid PDF file' % the_file.name)) return True def valid_xml_char_ordinal(c): @@ -129,7 +131,7 @@ def valid_xml_char_ordinal(c): 0x10000 <= codepoint <= 0x10FFFF ) -def valid_subject( subject_name ): +def valid_subject(subject_name): num_commas = 0 for c in subject_name: if not valid_xml_char_ordinal(c): @@ -176,7 +178,7 @@ def auth_cleaner(auth): is not a list of author names''' cleaned = [] if ';' in auth or reversed_name.match(auth): - authlist = semicolon_list_delim.split(auth) + authlist = semicolon_list_delim.split(auth) authlist = [unreverse_name(name) for name in authlist] else: auth = _and_.sub(',', auth) @@ -193,12 +195,11 @@ def validate_date(date_string): if ymd: return ymd.group(0) try: - date = parse(date_string.strip(), default=datetime.date(999,1,1)) + date = parse(date_string.strip(), default=datetime.date(999, 1, 1)) if date.year != 999: return date.strftime('%Y') except ValueError: year = MATCHYEAR.search(date_string) if year: return year.group(0) - else: - return '' + return '' From 59388933a9388f04a50eb531eee0ffce0ac9d2f1 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 3 Jan 2018 13:58:45 -0500 Subject: [PATCH 070/109] one scraper per file --- core/loaders/__init__.py | 4 +- core/loaders/hathitrust.py | 63 ++++++++++++++++++++++++++ core/loaders/pressbooks.py | 43 ++++++++++++++++++ core/loaders/scrape.py | 92 -------------------------------------- 4 files changed, 109 insertions(+), 93 deletions(-) create mode 100644 core/loaders/hathitrust.py create mode 100644 core/loaders/pressbooks.py diff --git a/core/loaders/__init__.py b/core/loaders/__init__.py index 57eddf25..1759f600 100755 --- a/core/loaders/__init__.py +++ b/core/loaders/__init__.py @@ -6,7 +6,9 @@ from django.conf import settings from gitenberg.metadata.pandata import Pandata from regluit.core.bookloader import add_from_bookdatas, BasePandataLoader -from .scrape import PressbooksScraper, HathitrustScraper, BaseScraper +from .scrape import BaseScraper +from .hathitrust import HathitrustScraper +from .pressbooks import PressbooksScraper from .springer import SpringerScraper from .ubiquity import UbiquityScraper diff --git a/core/loaders/hathitrust.py b/core/loaders/hathitrust.py new file mode 100644 index 00000000..6b76f851 --- /dev/null +++ b/core/loaders/hathitrust.py @@ -0,0 +1,63 @@ +import re + +import requests +from RISparser import read as readris + +from django.conf import settings + +from regluit.core.validation import identifier_cleaner + +from .scrape import BaseScraper + + +class HathitrustScraper(BaseScraper): + + can_scrape_hosts = ['hathitrust.org'] + can_scrape_strings = ['hdl.handle.net/2027/'] + CATALOG = re.compile(r'catalog.hathitrust.org/Record/(\d+)') + + def setup(self): + catalog_a = self.doc.find('a', href=self.CATALOG) + if catalog_a: + catalog_num = self.CATALOG.search(catalog_a['href']).group(1) + ris_url = 'https://catalog.hathitrust.org/Search/SearchExport?handpicked={}&method=ris'.format(catalog_num) + response = requests.get(ris_url, headers={"User-Agent": settings.USER_AGENT}) + records = readris(response.text.splitlines()) if response.status_code == 200 else [] + for record in records: + self.record = record + return + self.record = {} + + + def get_downloads(self): + dl_a = self.doc.select_one('#fullPdfLink') + value = dl_a['href'] if dl_a else None + if value: + self.set( + 'download_url_{}'.format('pdf'), + 'https://babel.hathitrust.org{}'.format(value) + ) + + def get_isbns(self): + isbn = self.record.get('issn', []) + value = identifier_cleaner('isbn', quiet=True)(isbn) + return {'print': value} if value else {} + + def get_title(self): + self.set('title', self.record.get('title', '')) + + def get_keywords(self): + self.set('subjects', self.record.get('keywords', [])) + + def get_publisher(self): + self.set('publisher', self.record.get('publisher', '')) + + def get_pubdate(self): + self.set('publication_date', self.record.get('year', '')) + + def get_description(self): + notes = self.record.get('notes', []) + self.set('description', '\r'.join(notes)) + + def get_genre(self): + self.set('genre', self.record.get('type_of_reference', '').lower()) diff --git a/core/loaders/pressbooks.py b/core/loaders/pressbooks.py new file mode 100644 index 00000000..47291e89 --- /dev/null +++ b/core/loaders/pressbooks.py @@ -0,0 +1,43 @@ +from regluit.core.validation import identifier_cleaner +from . import BaseScraper + +class PressbooksScraper(BaseScraper): + can_scrape_hosts = ['bookkernel.com', 'milnepublishing.geneseo.edu', + 'press.rebus.community', 'pb.unizin.org'] + can_scrape_strings = ['pressbooks'] + + def get_downloads(self): + for dl_type in ['epub', 'mobi', 'pdf']: + download_el = self.doc.select_one('.{}'.format(dl_type)) + if download_el and download_el.find_parent(): + value = download_el.find_parent().get('href') + if value: + self.set('download_url_{}'.format(dl_type), value) + + def get_publisher(self): + value = self.get_dt_dd('Publisher') + if not value: + value = self.doc.select_one('.cie-name') + value = value.text if value else None + if value: + self.set('publisher', value) + else: + super(PressbooksScraper, self).get_publisher() + + def get_title(self): + value = self.doc.select_one('.entry-title a[title]') + value = value['title'] if value else None + if value: + self.set('title', value) + else: + super(PressbooksScraper, self).get_title() + + def get_isbns(self): + '''add isbn identifiers and return a dict of edition keys and ISBNs''' + isbns = {} + for (key, label) in [('electronic', 'Ebook ISBN'), ('paper', 'Print ISBN')]: + isbn = identifier_cleaner('isbn', quiet=True)(self.get_dt_dd(label)) + if isbn: + self.identifiers['isbn_{}'.format(key)] = isbn + isbns[key] = isbn + return isbns diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index bde8f959..5dafa685 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -6,7 +6,6 @@ from bs4 import BeautifulSoup #from gitenberg.metadata.pandata import Pandata from django.conf import settings from urlparse import urljoin -from RISparser import read as readris from regluit.core import models from regluit.core.validation import authlist_cleaner, identifier_cleaner, validate_date @@ -318,97 +317,6 @@ class BaseScraper(object): self.set('rights_url', link['href']) -class PressbooksScraper(BaseScraper): - can_scrape_hosts = ['bookkernel.com', 'milnepublishing.geneseo.edu', - 'press.rebus.community', 'pb.unizin.org'] - can_scrape_strings = ['pressbooks'] - - def get_downloads(self): - for dl_type in ['epub', 'mobi', 'pdf']: - download_el = self.doc.select_one('.{}'.format(dl_type)) - if download_el and download_el.find_parent(): - value = download_el.find_parent().get('href') - if value: - self.set('download_url_{}'.format(dl_type), value) - - def get_publisher(self): - value = self.get_dt_dd('Publisher') - if not value: - value = self.doc.select_one('.cie-name') - value = value.text if value else None - if value: - self.set('publisher', value) - else: - super(PressbooksScraper, self).get_publisher() - - def get_title(self): - value = self.doc.select_one('.entry-title a[title]') - value = value['title'] if value else None - if value: - self.set('title', value) - else: - super(PressbooksScraper, self).get_title() - - def get_isbns(self): - '''add isbn identifiers and return a dict of edition keys and ISBNs''' - isbns = {} - for (key, label) in [('electronic', 'Ebook ISBN'), ('paper', 'Print ISBN')]: - isbn = identifier_cleaner('isbn', quiet=True)(self.get_dt_dd(label)) - if isbn: - self.identifiers['isbn_{}'.format(key)] = isbn - isbns[key] = isbn - return isbns -class HathitrustScraper(BaseScraper): - - can_scrape_hosts = ['hathitrust.org'] - can_scrape_strings = ['hdl.handle.net/2027/'] - CATALOG = re.compile(r'catalog.hathitrust.org/Record/(\d+)') - - def setup(self): - catalog_a = self.doc.find('a', href=self.CATALOG) - if catalog_a: - catalog_num = self.CATALOG.search(catalog_a['href']).group(1) - ris_url = 'https://catalog.hathitrust.org/Search/SearchExport?handpicked={}&method=ris'.format(catalog_num) - response = requests.get(ris_url, headers={"User-Agent": settings.USER_AGENT}) - records = readris(response.text.splitlines()) if response.status_code == 200 else [] - for record in records: - self.record = record - return - self.record = {} - - - def get_downloads(self): - dl_a = self.doc.select_one('#fullPdfLink') - value = dl_a['href'] if dl_a else None - if value: - self.set( - 'download_url_{}'.format('pdf'), - 'https://babel.hathitrust.org{}'.format(value) - ) - - def get_isbns(self): - isbn = self.record.get('issn', []) - value = identifier_cleaner('isbn', quiet=True)(isbn) - return {'print': value} if value else {} - - def get_title(self): - self.set('title', self.record.get('title', '')) - - def get_keywords(self): - self.set('subjects', self.record.get('keywords', [])) - - def get_publisher(self): - self.set('publisher', self.record.get('publisher', '')) - - def get_pubdate(self): - self.set('publication_date', self.record.get('year', '')) - - def get_description(self): - notes = self.record.get('notes', []) - self.set('description', '\r'.join(notes)) - - def get_genre(self): - self.set('genre', self.record.get('type_of_reference', '').lower()) From ba381add02ac65c9142fd94ac5a9ee41a9c3c748 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 3 Jan 2018 15:53:02 -0500 Subject: [PATCH 071/109] add smashwords --- core/loaders/__init__.py | 10 +++++++++- core/loaders/smashwords.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 core/loaders/smashwords.py diff --git a/core/loaders/__init__.py b/core/loaders/__init__.py index 1759f600..ecfabb6d 100755 --- a/core/loaders/__init__.py +++ b/core/loaders/__init__.py @@ -11,9 +11,17 @@ from .hathitrust import HathitrustScraper from .pressbooks import PressbooksScraper from .springer import SpringerScraper from .ubiquity import UbiquityScraper +from .smashwords import SmashwordsScraper def get_scraper(url): - scrapers = [PressbooksScraper, HathitrustScraper, SpringerScraper, UbiquityScraper, BaseScraper] + scrapers = [ + PressbooksScraper, + HathitrustScraper, + SpringerScraper, + UbiquityScraper, + SmashwordsScraper, + BaseScraper, + ] for scraper in scrapers: if scraper.can_scrape(url): return scraper(url) diff --git a/core/loaders/smashwords.py b/core/loaders/smashwords.py new file mode 100644 index 00000000..3c4413dd --- /dev/null +++ b/core/loaders/smashwords.py @@ -0,0 +1,32 @@ +import re +from urlparse import urljoin +from regluit.core.loaders.scrape import BaseScraper + +SWCAT = re.compile(r'^https://www\.smashwords\.com/books/category.*') +class SmashwordsScraper(BaseScraper): + can_scrape_strings =['smashwords.com'] + + def get_keywords(self): + kws = self.doc.find_all('a', href=SWCAT) + value = list(set(kw.string.strip() for kw in kws)) + if value: + self.set('subjects', value) + + def get_description(self): + desc = self.doc.select_one('#longDescription') + if desc: + value = desc.get_text() if hasattr(desc, 'get_text') else desc.string + if value.strip(): + self.set('description', value.strip()) + + def get_downloads(self): + dldiv = self.doc.select_one('#download') + if dldiv: + for dl_type in ['epub', 'mobi', 'pdf']: + dl_link = dldiv.find('a', href=re.compile(r'.*\.{}'.format(dl_type))) + if dl_link: + url = urljoin(self.base,dl_link['href']) + self.set('download_url_{}'.format(dl_type), url) + def get_publisher(self): + self.set('publisher', 'Smashwords') + From 95e19e5971b248cb08c9791f62837cbc77bc0e68 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 3 Jan 2018 17:50:21 -0500 Subject: [PATCH 072/109] enable easy ebook rights setting --- frontend/forms/bibforms.py | 3 +++ frontend/templates/ebook_list.html | 8 +++++--- frontend/views/bibedit.py | 6 ++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/frontend/forms/bibforms.py b/frontend/forms/bibforms.py index 17c19bdf..61f7d6c0 100644 --- a/frontend/forms/bibforms.py +++ b/frontend/forms/bibforms.py @@ -21,6 +21,7 @@ from regluit.core.lookups import ( EditionNoteLookup, ) from regluit.bisac.models import BisacHeading +from regluit.core.cc import CHOICES as RIGHTS_CHOICES from regluit.core.models import Edition, Identifier from regluit.core.parameters import ( AGE_LEVEL_CHOICES, @@ -122,6 +123,8 @@ class EditionForm(forms.ModelForm): required=False, allow_new=True, ) + set_rights = forms.CharField(widget=forms.Select(choices=RIGHTS_CHOICES), required=False) + def __init__(self, *args, **kwargs): super(EditionForm, self).__init__(*args, **kwargs) self.relators = [] diff --git a/frontend/templates/ebook_list.html b/frontend/templates/ebook_list.html index aea67882..505e04ce 100644 --- a/frontend/templates/ebook_list.html +++ b/frontend/templates/ebook_list.html @@ -3,16 +3,18 @@
    -
    +
    +
    +{{ form.set_rights}} {% endif %} \ No newline at end of file diff --git a/frontend/views/bibedit.py b/frontend/views/bibedit.py index 8575cc38..4951c341 100644 --- a/frontend/views/bibedit.py +++ b/frontend/views/bibedit.py @@ -244,6 +244,12 @@ def edit_edition(request, work_id, edition_id, by=None): activate_all = request.POST.has_key('activate_all_ebooks') deactivate_all = request.POST.has_key('deactivate_all_ebooks') ebookchange = False + if request.POST.has_key('set_ebook_rights') and request.POST.has_key('set_rights'): + rights = request.POST['set_rights'] + for ebook in work.ebooks_all(): + ebook.rights = rights + ebook.save() + ebookchange = True for ebook in work.ebooks_all(): if request.POST.has_key('activate_ebook_%s' % ebook.id) or activate_all: ebook.activate() From 33f4b75417ae4ed79db7c2788414c618a6ba1d3c Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 4 Jan 2018 16:53:29 -0500 Subject: [PATCH 073/109] stricter RE --- core/loaders/scrape.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/loaders/scrape.py b/core/loaders/scrape.py index 5dafa685..04a40e70 100644 --- a/core/loaders/scrape.py +++ b/core/loaders/scrape.py @@ -91,7 +91,7 @@ class BaseScraper(object): value = '' list_mode = attrs.pop('list_mode', 'longest') for meta_name in meta_list: - attrs['name'] = re.compile(meta_name, flags=re.I) + attrs['name'] = re.compile('^{}$'.format(meta_name), flags=re.I) metas = self.doc.find_all('meta', attrs=attrs) if len(metas) == 0: # some sites put schema.org metadata in metas From f92f469e48071edeb93d5d6b84ea65e98a05dc50 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 5 Jan 2018 16:23:56 -0500 Subject: [PATCH 074/109] add extra metadata --- frontend/templates/base.html | 3 +++ frontend/templates/work.html | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/frontend/templates/base.html b/frontend/templates/base.html index a7513912..c3a37d78 100644 --- a/frontend/templates/base.html +++ b/frontend/templates/base.html @@ -6,6 +6,9 @@ unglue.it {% block title %}{% endblock %} + + + {% block extra_meta %}{% endblock %} {% block extra_css %}{% endblock %} diff --git a/frontend/templates/work.html b/frontend/templates/work.html index d00aa57d..c6c8271f 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -11,7 +11,15 @@ Help us make {{ work.title }} a Free eBook! {% endif %}{% if action == 'editions' %} – All Editions{% endif %} {% endblock %} - +{% block extra_meta %} + + + + + +{% for author in work.relators %}{% endfor %} +{% if work.first_isbn_13 %}{% endif %} +{% endblock %} {% block extra_css %} {% if user.is_staff or user in work.last_campaign.managers.all %} From 11445f8a30b0b1aa0a011f021b3ca1d09a8544a0 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 5 Jan 2018 16:24:12 -0500 Subject: [PATCH 075/109] delint --- frontend/templates/work.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/templates/work.html b/frontend/templates/work.html index c6c8271f..94128a05 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -100,9 +100,9 @@

    - {% if work.authors.count == 2 %} - and - {% endif %}{% if work.relators.count > 2 %}{% for author in work.relators %}{% if not forloop.first %}, {% endif %}{% endfor %} + {% if work.authors.count == 2 %} + and + {% endif %}{% if work.relators.count > 2 %}{% for author in work.relators %}{% if not forloop.first %}, {% endif %}{% endfor %} {% endif %}

    @@ -303,7 +303,7 @@ {% endfor %} {% if work.doab %}

    - This book is included in DOAB. + This book is included in DOAB.

    {% endif %} {% if work.gtbg %} @@ -340,7 +340,7 @@
    - + email
    {{ supporter }}
    From 48de8408a6956abe931a8e9d5217e3679b481e30 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 5 Jan 2018 16:37:52 -0500 Subject: [PATCH 076/109] add metas on landing page --- frontend/templates/home.html | 20 ++++++++++++++------ frontend/templates/learn_more.html | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/frontend/templates/home.html b/frontend/templates/home.html index 0e8839fd..010755ec 100755 --- a/frontend/templates/home.html +++ b/frontend/templates/home.html @@ -3,6 +3,14 @@ {% load truncatechars %} {% block title %}— Support Free eBooks{% endblock %} +{% block extra_meta %} + + + + +{% endblock %} + + {% block extra_css %} @@ -286,12 +294,12 @@ function put_un_in_cookie2(){
      -
    • -
    • -
    • -
    • -
    • -
    • +
    • boingboing
    • +
    • die zeit
    • +
    • huffington post
    • +
    • techcrunch
    • +
    • library journal
    • +
    • networkworld
    For readers it’s a gold mine of great books they can have a say in bringing to market.
    diff --git a/frontend/templates/learn_more.html b/frontend/templates/learn_more.html index 2dee652b..048abec0 100644 --- a/frontend/templates/learn_more.html +++ b/frontend/templates/learn_more.html @@ -17,7 +17,7 @@

    -

    Find over 10,000 free ebooks here.
    Help us make more ebooks free!

    +

    Find over 10,000 free ebooks here.
    Help us make more ebooks free!

    From cd35552026c2e1f4afd0b51c863fece3d0595405 Mon Sep 17 00:00:00 2001 From: eric Date: Sun, 7 Jan 2018 20:21:48 -0500 Subject: [PATCH 077/109] add IPN events (we ignored the old ones; now we ignore the new ones, too. --- payment/stripelib.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/payment/stripelib.py b/payment/stripelib.py index bf22f1db..9cea6917 100644 --- a/payment/stripelib.py +++ b/payment/stripelib.py @@ -46,6 +46,8 @@ STRIPE_EVENT_TYPES = ['account.updated', 'account.application.deauthorized', 'ba 'charge.dispute.created', 'charge.dispute.updated', 'charge.dispute.closed', 'customer.created', 'customer.updated', 'customer.deleted', 'customer.card.created', 'customer.card.updated', 'customer.card.deleted', + 'customer.source.created', 'customer.source.deleted', 'customer.source.expiring', + 'customer.source.updated', 'customer.subscription.created', 'customer.subscription.updated', 'customer.subscription.deleted', 'customer.subscription.trial_will_end', 'customer.discount.created', 'customer.discount.updated', From 4802eea09d0a439be856af9f335c0fcac0a7509b Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 12 Jan 2018 11:53:10 -0500 Subject: [PATCH 078/109] Disallow: /search/ --- frontend/templates/robots.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/templates/robots.txt b/frontend/templates/robots.txt index 8db11b98..966f006b 100644 --- a/frontend/templates/robots.txt +++ b/frontend/templates/robots.txt @@ -4,6 +4,7 @@ User-agent: * Disallow: /accounts/ Disallow: /feedback/ Disallow: /socialauth/ +Disallow: /search/ Disallow: /googlebooks/ {% else %} User-agent: * From a3aab48ea7d07908d78803fa0af715eae1b425a9 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 12 Jan 2018 12:05:13 -0500 Subject: [PATCH 079/109] simplified response for work HEAD --- frontend/templates/worksummary.html | 45 +++++++++++++++++++++++++++++ frontend/tests.py | 1 + frontend/views/__init__.py | 3 +- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 frontend/templates/worksummary.html diff --git a/frontend/templates/worksummary.html b/frontend/templates/worksummary.html new file mode 100644 index 00000000..ecfdf11e --- /dev/null +++ b/frontend/templates/worksummary.html @@ -0,0 +1,45 @@ +{% extends 'base.html' %} + +{% load humanize %} +{% block title %}— + {% if work.is_free %} + {{ work.title }} is a Free eBook. {% for fmt in work.formats %}[{{ fmt }}]{% endfor %} + {% else %} + Help us make {{ work.title }} a Free eBook! + {% endif %}{% if action == 'editions' %} – All Editions{% endif %} +{% endblock %} +{% block extra_meta %} + + + + + +{% for author in work.relators %}{% endfor %} +{% if work.first_isbn_13 %}{% endif %} +{% endblock %} + + +{% block topsection %} +
    +
    +

    {{ work.title }}

    +
    +
    +

    + {% if work.authors.count == 2 %} + and + {% endif %}{% if work.relators.count > 2 %}{% for author in work.relators %}{% if not forloop.first %}, {% endif %}{% endfor %} + {% endif %} +

    +

    + {% if work.last_campaign.publisher %} + {{ work.last_campaign.publisher }} + {% endif %} + + + +

    +
    +
    +
    +{% endblock %} diff --git a/frontend/tests.py b/frontend/tests.py index 799589d4..fdfdf43d 100755 --- a/frontend/tests.py +++ b/frontend/tests.py @@ -63,6 +63,7 @@ class RhPageTests(TestCase): def test_anonymous(self): anon_client = Client() r = anon_client.get("/work/{}/".format(self.work.id)) + r = anon_client.head("/work/{}/".format(self.work.id)) self.assertEqual(r.status_code, 200) csrfmatch = re.search("name='csrfmiddlewaretoken' value='([^']*)'", r.content) self.assertFalse(csrfmatch) diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index f4bdf482..ac75d663 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -300,7 +300,8 @@ def acks(request, work): def work(request, work_id, action='display'): work = safe_get_work(work_id) alert = '' - + if request.method == "HEAD": + return render(request, 'worksummary.html', {'work': work,}) formset = None if action == "acks": return acks(request, work) From ec5aa5f59903d9c75de53efa1a33efebc71f1ee8 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 12 Jan 2018 12:05:57 -0500 Subject: [PATCH 080/109] don't do google books search for bad robots --- frontend/views/__init__.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index ac75d663..36cbbc9c 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -525,11 +525,20 @@ def manage_ebooks(request, edition_id, by=None): }) +BAD_ROBOTS = [u'memoryBot'] +def is_bad_robot(request): + user_agent = request.META.get('HTTP_USER_AGENT', '') + for robot in BAD_ROBOTS: + if robot in user_agent: + return True + return False def googlebooks(request, googlebooks_id): try: edition = models.Identifier.objects.get(type='goog', value=googlebooks_id).edition except models.Identifier.DoesNotExist: + if is_bad_robot(request): + return HttpResponseNotFound("failed looking up googlebooks id %s" % googlebooks_id) try: edition = bookloader.add_by_googlebooks_id(googlebooks_id) if edition.new: @@ -1917,12 +1926,18 @@ def search(request): results = models.Work.objects.none() break else: - results = gluejar_search(q, user_ip=request.META['REMOTE_ADDR'], page=1) - gbo = 'y' + if is_bad_robot(request): + results = models.Work.objects.none() + else: + results = gluejar_search(q, user_ip=request.META['REMOTE_ADDR'], page=1) + gbo = 'y' else: if gbo == 'n': page = page-1 # because page=1 is the unglue.it results - results = gluejar_search(q, user_ip=request.META['REMOTE_ADDR'], page=page) + if is_bad_robot(request): + results = models.Work.objects.none() + else: + results = gluejar_search(q, user_ip=request.META['REMOTE_ADDR'], page=page) campaign_works = None # flag search result as on wishlist as appropriate From 906e5ece9dd49c00bbadb6ac2669006c9bd1124c Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 19 Jan 2018 19:18:50 -0500 Subject: [PATCH 081/109] don't try to notify null users this was causing errors --- payment/models.py | 14 +++++++++----- payment/tasks.py | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/payment/models.py b/payment/models.py index 3002802b..9a598186 100644 --- a/payment/models.py +++ b/payment/models.py @@ -437,11 +437,14 @@ class Account(models.Model): def update_status( self, value=None, send_notice_on_change_only=True): - """set Account.status = value unless value is None, in which case, we set Account.status=self.calculated_status() + """set Account.status = value unless value is None, in which case, + we set Account.status=self.calculated_status() fire off associated notifications - By default, send notices only if the status is *changing*. Set send_notice_on_change_only = False to - send notice based on new_status regardless of old status. (Useful for initialization) + By default, send notices only if the status is *changing*. + Set send_notice_on_change_only = False to + send notice based on new_status regardless of old status. + (Useful for initialization) """ old_status = self.status @@ -453,7 +456,8 @@ class Account(models.Model): self.status = new_status self.save() - if not send_notice_on_change_only or (old_status != new_status): + # don't notify null users (non-users can buy-to-unglue or thank-for-ungluing) + if self.user and (not send_notice_on_change_only or (old_status != new_status)): logger.info( "Account status change: %d %s %s", self.pk, old_status, new_status) @@ -479,7 +483,7 @@ class Account(models.Model): }, True) elif new_status == 'ERROR': - # TO DO: we need to figure out notice needs to be sent out if we get an ERROR status. + # TO DO: what to do? pass elif new_status == 'DEACTIVATED': diff --git a/payment/tasks.py b/payment/tasks.py index 2febd582..8c8faca4 100644 --- a/payment/tasks.py +++ b/payment/tasks.py @@ -52,7 +52,7 @@ def update_account_status(all_accounts=True, send_notice_on_change_only=True): # task run roughly 8 days ahead of card expirations @task def notify_expiring_accounts(): - expiring_accounts = Account.objects.filter(status='EXPIRING') + expiring_accounts = Account.objects.filter(status='EXPIRING', user__isnull=False) for account in expiring_accounts: notification.send_now([account.user], "account_expiring", { 'user': account.user, From 78d24330a6734c9f2bfcf4d29bcda95524cda858 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 19 Jan 2018 20:08:41 -0500 Subject: [PATCH 082/109] expired cards should not be active regluit uses date_deactivated to determine whether a card can be used --- payment/management/commands/deactivate_expired.py | 12 ++++++++++++ payment/models.py | 9 ++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 payment/management/commands/deactivate_expired.py diff --git a/payment/management/commands/deactivate_expired.py b/payment/management/commands/deactivate_expired.py new file mode 100644 index 00000000..cc844599 --- /dev/null +++ b/payment/management/commands/deactivate_expired.py @@ -0,0 +1,12 @@ +from django.core.management.base import BaseCommand + +from regluit.payment.models import Account + +class Command(BaseCommand): + help = "deactivate accounts that have expired" + + def handle(self, *args, **kwargs): + expired = Account.objects.filter(status='EXPIRED', date_deactivated__isnull=True) + for account in expired: + account.deactivate() + \ No newline at end of file diff --git a/payment/models.py b/payment/models.py index 9a598186..c19ce1a6 100644 --- a/payment/models.py +++ b/payment/models.py @@ -452,9 +452,12 @@ class Account(models.Model): new_status = self.calculated_status() else: new_status = value - - self.status = new_status - self.save() + + if new_status == 'EXPIRED': + self.deactivate() + elif old_status != new_status: + self.status = new_status + self.save() # don't notify null users (non-users can buy-to-unglue or thank-for-ungluing) if self.user and (not send_notice_on_change_only or (old_status != new_status)): From e1ad2913ac09a60dc172c10991b8bd2476760370 Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Tue, 23 Jan 2018 13:40:03 -0800 Subject: [PATCH 083/109] changed to using availability zone 1b for production because I couldn't launch medium c1 in 1c a while back --- vagrant/Vagrantfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vagrant/Vagrantfile b/vagrant/Vagrantfile index 179b62a3..eebb9792 100644 --- a/vagrant/Vagrantfile +++ b/vagrant/Vagrantfile @@ -286,7 +286,9 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| aws.instance_type="c1.medium" aws.region = "us-east-1" - aws.availability_zone = "us-east-1c" + #aws.availability_zone = "us-east-1c" + # 2017.12.15 -- for some reason 1c doesn't hava the capacity + aws.availability_zone = "us-east-1b" # aws.ami = "ami-d8132bb0" # 2017.03.17 # Trusty 14.04 From 5dd3404a6c0b3243c5b4c42b50c7d7a78b041a9b Mon Sep 17 00:00:00 2001 From: Raymond Yee Date: Tue, 23 Jan 2018 14:09:50 -0800 Subject: [PATCH 084/109] SSL cert expires Feb 2, 2019 --- .../files/ssl_cert/STAR_unglue_it.ca-bundle | 418 +++++++++--------- vagrant/files/ssl_cert/STAR_unglue_it.crt | 198 ++++----- vagrant/files/ssl_cert/server.key | 176 ++++---- vagrant/files/ssl_cert/unglue.it.wildcard.csr | 114 ++--- 4 files changed, 453 insertions(+), 453 deletions(-) diff --git a/vagrant/files/ssl_cert/STAR_unglue_it.ca-bundle b/vagrant/files/ssl_cert/STAR_unglue_it.ca-bundle index b8e3173e..9258132a 100644 --- a/vagrant/files/ssl_cert/STAR_unglue_it.ca-bundle +++ b/vagrant/files/ssl_cert/STAR_unglue_it.ca-bundle @@ -1,210 +1,210 @@ $ANSIBLE_VAULT;1.1;AES256 -65646465363731363935373066373033393738396261396631363339303366366537633537313235 -6537366334643964323338363637313364343939393238650a303963653837333361383166343734 -64353963323165623438393763376166313963353633666531646535666432323639643939373339 -3661663966396631370a393965316430636339616435663766313831356538326234643366313865 -37636139396134666631626135626130323531346637616664383766656166623033353938306261 -36373736653935646237643338306361373139333639643866316332646365356665393431616631 -35643036393432623636316237316533376165633832313731346363656532666639316531333461 -64613239316133656462313265346631306131303933373362346534323461653965396236636436 -64346665333935616636313566613830313934326666653838376465393336623361653739353065 -30643464636261353934313830356631613862656332326434666330353931333463363833303361 -38656433653866353538363534333366626565646465623334626130623033623730373933623438 -33373032643962616539346566373964646631626335343463386162646666646134646339393038 -35383061353166633936643935363834653966653966633036326431616538346637623561363332 -32363535386635306637346365353462323963646233386439306331383365393134626662346433 -65313533653365326465616263623939333939323639313033383533393164326534666434393361 -33353531303634386336323032346634353334326166376133383738303632626134353331396533 -63663130333038343335393233643434333133336133393737646131666531613166643432383033 -30343963373334366565343038313432656365633639386137626631353562346164303930636330 -36663061313266386338393832636337393635663838616664616362616631623436313635656461 -34303236316337393336373032623034616232616563363438366437663432336238396237323862 -65306237343034356136656332316338333435643638646534316136316666633864373439623836 -37633164623239663030363736646539346637333736353664396538303737643264363938636164 -34316266626232313063623931393662366139323162366338316630363539333362616262363463 -36386265653539323662633264636561653766613436396165336462626261613035646531313838 -39306330343565623535616136646435646238333563633836633031336334323565393064366136 -33323938636336616332636230356339396665333135353833393837646635393433626164356337 -63323261396333393733396563323135393363303565613736313163663034623263623963393331 -63633236353838303438316161656230363366306630376366306133383861666664363231316632 -36306230613561306261626361303566303462623137383232376536393434626638623736393034 -66386239303939326464393766613436643133366132653236336635633662346239323736333337 -63636461643634343330323330636237316533326364613039353464613635626431636535303763 -34393237643739303737363032376530663939326437353961303639343864656364623630393439 -34346661346231373736306230363062666539323634363164633833613833656134346530383836 -63306666656333366262363936336263306636323238623261323964303234613463336134373063 -35353166356436363238313838636464656234393736326566646139333534616637616636343364 -63633162373033316139326563656365336338393462393233346332396265396336333834633836 -65393037626163643861393861393363393230363264316635396432363637343033316339373931 -36666364666439626530333437386361306130353965306339393737306162336537613230653465 -33313936616630376664636439626166616266376631313863393137306333626435393730313633 -30363733623035346630613762313965643933303834623631343031386239613466373031633431 -35656364616165623462656531333164663239663037326135633865306235346365393336633935 -32666338633063623634363966336133646337316561666464643564663434323563633064333338 -62653933353933633535333832356233383564626635626630646239623336626539623732336331 -38313232633961363564303338626131613939653636656433363838663433376639346133303232 -61623962653636306335656561393862653466356566336139626464383264396132363937363965 -33323730616262343966373436373134396330343130623062633861663465333537343330353436 -36333830336235613134646262306362613939366538393031653232333337306431623265383361 -35383630373764666638323034613933316362636638656234316430336231376466353532623864 -32316331353566396239623933636536313130653536623536646532653733316435633663353262 -35656534306264653763323437363366646637343365636137636337383664313437313736636664 -64643437316661383365393865393836356361303730303636343539313332646465653834653031 -34376633653536663237653266613365386338376637636139636332616662313561373865633739 -32393933353739313765323461643261316235656164663434373762306431383733663466366133 -39393534313266363362316533363535356632333365306233653135313165303135303235346133 -64353563393663353165323834313639663363376530333733343636633136336633393232346437 -31643735373039636139383938616634346366346633636537613636386130306662616131343764 -30303931653834316439633665346138343363333033656433316538383732323334306666643232 -61393235393562303838303231393166366630303532333763393663623134343934646562663564 -35336564353036636630386131613932306366613739386132393838626635373033623365393639 -32303030353161633763646136333266333534333030343738356437626166336233653664633739 -31653964343232653733653430653131363333643536323265636263383032306439366262653661 -62306364613130333036643133373032626139656561386234646565656139303862646134333335 -61303062353039303132396638366134386361343936613532653232333832353337653038653538 -36393364616366373061383763666463393963313061336232346530663334336661663730303339 -39643039643166363961663732373730623066653739303461336236306231366631343730643932 -31383830346261356565373266643234316566303365303038633139333737316162376230323762 -63373338643061313436636261396139636339383136643336613665616537623732623530646430 -38393661373031623266666462326336643437626233623236363339373939633233366437353138 -32653465613036613731366138353461616234396234336266393435646539643232633837396538 -30333935313037386338323161343531313431323836313664373362343733626664303761636632 -37323133343938363039313739626165613833356464653664373732366661323335313136386233 -30356162656366656434376435373030663763303166343135396538656238366531373335393764 -62353939356163373139316134363636643666663431366664363163313534346539396639383033 -37333063623732303334386639393339363533306635633234666564353731393833346232643261 -63633433373263356261653461613932623635333238653062666239393132333035623037333039 -66623533663735323633663431383132303339323565343466343939356230316237303565613735 -33663235363538613836333566653566636130353766633265323938366263366261323032626330 -38653530386161346634356165613866333232646330666630613239653537383737633437326438 -63343732336162636161663832353466643739346463313739633932386166333762343137656434 -31653538343861643837366465323139653833626232376330326464396666623761373933303939 -62373930643430356539323061366166663733383034303730626539636136343465643164366439 -37303332666538303931613835316164366265656263643766376435343962646362363163353762 -39626134663762643731323038356130393963313336326664653639666562303032336663626434 -31326237383361303563633965303239363938663066643533636166363264663533376432393339 -64613234306164316235336661643462633532336362366262376136616664623238333333646137 -37633564623835336463363964323339326263313465333261396262386530666535363664616436 -31363833373932373762623261366339626465613237653836323032613631653835323236343536 -36656532616534333166393165386266636130376433616439613336306635303836626637343832 -39396539393566613434643538373030346636303163356233666164313032353832363234323761 -66363132663132396237373330393064373032306537636663653831333730333332383563363266 -32356139306230326135313035613662323762363030643436333365343766316563326363636530 -61373764363538656535633839313236643238333565356637366430383838626334346431636639 -30323934333662396136333937666662633031623531393734643036616537333563363434363766 -61623233353136393161393730353737623435333331346232383131336337633832313364313636 -62623734383462656437363164613934636432626437383032663164613162376239306264323066 -35623933353733613935316131376239323631613965633731313032616439333138613234366239 -61616462353436666434383834663330393732386236303164656161633862666264356434636633 -62303937363563613839313936663161636234333835393737336531383432336363373965343834 -34653864306234323832626432646433303736313539616133343433616336396334373033313933 -33336135353734383639623035323762613064663537643864353234336330316334636131346631 -39666338346335353765333362386231343435353331653331613939636561316661353237316135 -66633535343066383830656366323435353462653839356139663433336131323231633033613132 -32656530623164376635306239356666383665663533363061323564303564376465313132633733 -33656366393163613739356539306465363665633131623835323532346238373161313730333166 -61383632383965316637633462366436313432323530646539613365383635633636353035316463 -35336538646233626233636565366438663866666261393165386562366234613837616361613562 -65323666326232633664333962323336333736643837666534623530353233343963663732396431 -39316134396435316130333234303161656633663938343532626132656537666335343764326239 -66396261636266323765653161373738656162613531626363346131316137616535323064323538 -34616563613235333230656164303834393938623466633863393561376134656439303438666437 -65306266336432356136653364373236626165373666333766343931656566326137336532383832 -61613334373761653331373139303665383164643965383461323431376434626661386663653239 -32366234646464346463616462623364306335316532373435393566343432343632356334323536 -61613133373562336339613265363135636335373335373363376536353736656439383730653936 -64393363613862366366663838303731373061383062373365313535306438383764353362306237 -37623732313633656362333631306136646430356662336333666461383835366231656562366233 -37323466643736666562623637393666656632333666363663383364656631356636653266353735 -37353332393133313933396130613731356635623634393234656465353136333438363063643030 -30353833666562613966663765383337653739313465386139663534663561623437636466666563 -65623833383335346166303634363533663761353739343831303661356137323265383838326431 -30363134303763653966656436393337356561316337656537383030366532333664663363613137 -64373264373964656265343232623330633130313865663864323465616366633961306134393639 -31363431643333346433623365656365306632666535643733396634343830373366646336383366 -64613733383436643336383566656336663765613666663639643737303739626434313562336233 -38643463306632366535633664326630343763633432383961303233626333346565636337653532 -37646638613233303630346462353363333031643161626564636539313663373238396139623664 -35303361636139613335343463323166366637366535623638663035366666616466646437666461 -39393730356138383339323233383234613239333834333139373761623533356664356363383835 -63346162616432663661623266363637626661373236623831356365303235363637363535656161 -37613239383832313635383265356561343333386631363133626639613836303539643533356331 -36643634376261393533313738313062326335656565393464323031386339366362356239383762 -66366366303039653463643564313631326435333932643062346265636565626661666661386138 -34306134643765396230393166376535343364643030633738383239643733353963306265356339 -32353866323634393637336236633366313566346463636361666664356335623431306266633338 -36356462343739636337616265323137643035343834393764343538306232666231653634323132 -64333739386465626165376530316635353733613861626431656532363361343665626531613939 -64393263666232626561626138363634323066373164646532626639333863363165643631636233 -33383838656335646262633931383065646536373065653262306538653263646138373461633266 -31353064386338303938383663643838376539643565333962666630303033373034666564343162 -34363637333931616133303032343235303130616538626530663163366239646635333134613430 -34633032313162613765613233326336323931626633613638313135383638363433383066353963 -32393262373034303935303936626266323435323663393066313265363333373236386465366333 -36656338666237636132396234363234636661393864343036333666393934313261396632656139 -35323866636663626164383661313434356533303364313235356637643966323464373838306335 -35396636306239656135353738623431306565636236323739626430336564333730333765633564 -38376165626335653639363264336632663964363234646662636137386539353862386335343561 -34653533383439633564343733323033626565626331623861636234316366336132383834646531 -64376235643833623362656235363665353866636262626432323462306361356262393631383466 -30643133353936636562396132396339306538383661353036656462313865313131343934393765 -65666535346464653432393337386237323138323931333565623562333161343333393564353162 -38313862623133613839396464333434303864613930653365363430346631646466653331356533 -61373561626462666363396232623535633832376661373930356361653462386638613337303238 -32613635323664643066386138363331633435386237343934323664393031373839323963663932 -32306436336163303433316138313362353866376166633133343963613437663162386631613364 -37653964353366353062316636653865363534363730366534346162333362616537313664663939 -63393431306462326637356630323730373234336232663865353133363832623335343162356135 -62616461376135303038386462623962316532303364333636376662353531313530633637393039 -31663332323630316531313735333438353434646562303033643664316635353030356233643635 -37303833313430383236373339323137666638393862316162653337353535656531663334333039 -62333532376561653262633861393037336531333331306464626337333137383031373038363564 -31333061363231336130663134346666326263363064663131306661613963353731313363623861 -34303138383466646331623361323530326537303465643239326139663565303931353464643964 -31313363353232373965376435383434303061383362353238353339656534613137626431376437 -31663937656538383439386462663433336164636539316434373366346537613438366330666166 -31386566323735663734353033633732663936343262393462333836393765663361633833333438 -62616332643430356232393035303266313733653861613566666436326533356433623530646234 -36646234666237353030396466393332343161346631646237313432636239633438613630356536 -35613831306661363362613463333366306563376635333863343761393635346666326638336562 -64386230653931323530383739613637323834666336613735333735376266396537653331386133 -34663430653030653763373762366435613439623764393031326263653932303538333961336366 -35623130363363353531613437636530316630633761633936333063666335646335326135303265 -32353366646430313763333636663737663463323364346637383764343038663864373561333865 -36393631643262396438343538353065313130346131633535363538346431383431633833376363 -66306137643332663162396236653664316433333765393663333534303362373738346266626535 -65386237356634303731626665313465393962373833363464653038643662623430636235363133 -37633861643964643436363362623938646535373139343665373832653065343039386337303063 -37646463383030333437336637333830386436303239633665316364366566616638333432643430 -64366530616431373434326539396366613936333439306162343864616230646164653739333764 -38656261373636623939643938636234613837356337303461633265393835663236333565626136 -39313163343761323962616233323962393364313464626531313038643333373730613231343131 -61373134356639353530666339626139613334386539663736363562363932363363383666643038 -31353364663362336430623232363164303438323330636261333364353964623463306336316133 -34393930313938383232323330656164643264316665616333393833663835636431616364643536 -66663138353338613330356433613830336565336336633332353334306465303061363831653166 -61616132666434643435656632383631326333376266383561303838343634613434363465336630 -61313465373236646466646362613963396235356165626233313539383566306430623963633863 -39373434663836663063396563653563616561643937356665633437363335323736343166306636 -30636362333837643632626438393364353930383936613738306235363863383563643565336232 -32343732303066313439616562303362626263623563393233653732323033643037623837386638 -33643563643631343130626463393337316630366239633034616465333464623039663362663537 -62393561653936326263623237343234363638303961666638383338393666303733306533343862 -32633039623534383163363937653137313934663661336362613633373833623331373534643333 -39313066633062333738663765613130343264643536666262646631333531326333663363633666 -31366337306633373261346338623035353331356435633037623362393536616230623561623539 -62353031373465643539326464356536393536333738626231663763396534363265323637633964 -37653438656564623632306465323339323235333661316666383832633835303937643636353964 -36363562343636323133303162323538383037363530343863386163323763353733343764343233 -30623132323963616137396330663862663030343863303630626434636630373366316166643166 -31643733663235653863653766356562346266383536613830663363343463613836623161663032 -33376664376436353265623764373866613065353735633731313231633531343234636438326434 -33393466373461333233316165386535656138656361613766613537643838353735663230346137 -31383632326233626666393764346131663438366364306261663662376362643162663732383833 -36326537306239643465333036326632663334326565353364353363373533366165393564373734 -65343937653434353633383736306130353935343961383165336163373633356437363133386431 -38613739633032656430366334653835626133316663356664653533383731643334323761653438 -35313130623633616161386362396536336362333632323539666139373230363532343235663530 -33353335363363663236386136373331383739643465656139613135656434343864346466353631 -62336263666233343032313131646632336164373931643533316236643236313666326234616135 -33643136383732363638333631613030303661646636363434353761346131613035 +30636262636630653738383536613136363733643931316362326266656433376333386239373962 +6635343138326335313430623566656130663136393531310a343562653666623235336539316561 +31386163663632383436343735376266356134386335363637383536613531323231626535313236 +6163326630306530360a663636393463303062316331623630353235383137333831333239393134 +64353830366463376130633831633835313034643930636166396436373063623039316465613964 +61333538656264353735613034356533353331313735393965363164616331306538383231303932 +31373838363862343931643034643863313738636238376634363430613365356136323237613530 +34323339323337383539363462303863663163373465373262636161346662333738663532316363 +65313464333363643461353539306662353364643663373032346531633362373230653061646436 +34393462326137336163316361363937323738663632386662643338626433626433633235323838 +65653036643961626131383264393138316263366534656663386264376638393639636164323661 +61646166376637396131356339313162343762636234643236316363643063326638366536656534 +31616164313164373336666634356639653831623966333739356462656137363161663635353136 +30653665353334646165663333643863643539373331613263386561353030363862666264353933 +64643439336236386631393934623839626163373463653134656539376262316233626130363663 +65636534303431616631633534643030346534633635393563366266356138383938636264383632 +33616365333863393733646565643236613064616462633661303630613963666236663265636361 +61376336346262346632313833633735356364636239366439393265613866316439643732326330 +38396332363666656636646164646262303162656331636661393738626263383563646261323036 +63363634616362323965616639373961333966303366363937333233356631393938383339613262 +39393461316563383131666539333938313437336462376233353464303739356463323265366665 +64316161333431353264336236373466613230363237316633386661303538666536366462323666 +32373164626330313665653133356563383436663765666437636138343163663533646331346631 +31643638373537653533353036653766663935663636663561343239383666333661343830353133 +34363363333466393761643863393436386231626134663236326335336438633338313963646363 +30623262386437313733353038353231353163326133643139633963303864633739383935363664 +61336265656666643037316139306534323135333763383230633261336139636362396539643539 +34303937656634653862383665356530643064383832363163343331383538623236366535393061 +38373738393064376539343837356335326132363135323935333964383635383965656462383636 +63663661626632396663383838353633663839303936646537363266346661373033663064326435 +62646130376163623363346232346530376638613934623831303636366365313331613436626337 +61346262333933363366653166326330663638643230373364653161333263323035366263623330 +66636532616234636263323366626432363337326564663531323663356166303930653661313030 +32363133313162313331623138356432653630663263623935303739663363323130646133613735 +66333933393266663265333036616465353338656664313230643761303439363035663566393930 +31303633396665316330623962643439313132633531656362333630653537393061316663356566 +39376230643830333035316439346336313464623238373739623636313236316162356337313339 +62376533663138613962306331313066383439373039636631633431316232643266326361666134 +64383437636561323964346134663032663466333831663836393039353562663065643337303330 +62356666353662386439353563643735633730613463666263666539323333613130633765393834 +32343439306636306131386537373164363636386330623534373535323631396464626661323361 +38353935623566373834643661616631373333303735393835643737626234643337653130396365 +65666332323665356330396238633866653761346531303439666236653264323661626135353238 +36643562623266636333623831303439336366646133653332313130336436386537653234666435 +31343863376233623335366333363232653966316230363836613231613130613166643864373565 +35356264383335623539643630323534623265313631383130643739306533663330396434653236 +64376166373639363731663437663331346338373539363637353933386239373738373565353030 +64353261366232643061356165323961383537626239623732393936623461393961353837633733 +34356166393938346232396532353166373534623530646335633338633636336636646630356561 +32363061356632313661386535306339636135623834333231303433343037353633613365326333 +37666235323239383661323536353830383833326565346564663631336465313664346533323337 +38613961313233623033386166336235383362393463393832646538373139333533313266303937 +62346532356632316136633533373665373839623336383435353163386531366466646664326565 +30303639393933373361623333326432366332396137396238336464376131323631343637306531 +37343933373139333333623233386334636436356432303764653235353133366566383031633136 +34616133336663623664616432336265323534373163316338386561623864623861343835633062 +34343738616134366164356337663566326462303933386139643734376332313066613230326363 +66623837323238356366333836386662366435626236333835346662623631373636663033623733 +38316639343638313937353636616638396261333561313032383130393538663366636630376539 +63353566613835343964356635303939343764396631393738646432313765666564316363626431 +65346637656137363266346266616666316361383231343666643063353131386163356638346636 +30383932633264373031373935616230323933373863663564363233313232363066326662303165 +63346532313837396365353365636663313334626433303732326164363330303438636333636163 +35656537623165323666633435386465303063633534656630306664343637336164626433373361 +65376530333361303337623634353434373164626133626263613561613436303161626432626239 +37343536313531626233343530633634613166633735613233393962323165623166366161356336 +35386635366631326266343432386161663033323962313763343163663137643631393166333031 +39346564656665343835616464663231333562616661643234326663633563303964386131656363 +63666363356562383830646633396238623537336439326162376135633665653165326536353037 +37313362666531333837633439643165356534383265643637363933366463343839333961376235 +63333063643634623735363233646334633235373132646139313365303336646264633061643131 +32616465633131356130396465643235353530326564373136313133613064313562306333313965 +38396237653430353533353462373130303262663564653361313465353934353864656235653135 +34613639613633633234386639633230653537393965323363623338656465326531346432333637 +64343436373436356535333865643865373539393036626137626538626635653637666362356162 +30313632396539623962346562646563316264613232343730643565386135346664646363333330 +66656661636235633730393063343634636138383264336535326533356231626530613565336161 +35626232343436616535373230653039303065343432343738616363626635383364373266323333 +33376364666638313564366237356635653731623566626661373961663736666638343061646134 +35313438356531383433636565326365313063383834613837666330396331353738323237363333 +63363963666465313137386537356462663636323737306362326362363266343062626130616230 +64363433343738343632636633373330386464396364383031343531663432363563653032336332 +65366364333133386139636165303964366165326336316534323636633462356335633066643165 +34613030323234383965396233373333393336653237613062323530353762633931343333323865 +30663862373132633834353039653032373737313564333638333762303335636265646162313931 +66393662653933363832623061633634626661356437663331373937396631356131333462656666 +32303166396533643261646130306161326561326533626531663038643565376439633339333432 +64333437366566666366303230616539663564333463666631646163356235636333363633663639 +37666332346161376239656137306430623463653466626663636539666532373565373731613165 +62663532383165656432313762376235333331343738646532373265353066363262333261626137 +31396332383963353066336666366133336138653363613863653833653964663164313831333065 +35333738383232656634356564643634346633313137333863363766643433363631333630643731 +65363161303235323830376638303135613630663362653566363965313436323033643366306630 +39303935636639333961666135633962653362666536663333623430356164376262346662643635 +33323663333832316633373035386334623134326536366236636561373635353366386237323933 +62393435363235396262653065656562383063663236323134313833363833396131643533666235 +37386366343933376338336533316239383430343566626434303537653431626261363438336334 +35363961656332336230386535386531363761303766313563333832633033646461393635376339 +39633630336366373663666239623030326331346361323132363565366366616236346230636632 +38376534363933383965386338313835356135663035326536343532643930383466633538316538 +31353038656533336335376265626139333364633537633662653362393666346163386431326261 +35393261353230373034633666663638306134643066643533323761666264326162343630376661 +65613733343866306364333665353639646263323863663562333965636335613966323564373535 +39363939383031393265613035376635663962386530663639356331393830383130626439346666 +31393532316431393666616535363430636637366134366636643730636431343034336539616135 +38633063333063383766386265336363386362383136653536616663376463333935356162343930 +36383831666537313936393033363738666335653739646431363039373939626538343037633631 +39383439373336336561663431626265666434646565356438336530643863656464323034353565 +36366563323836336162373465313938646239373637613066333238323533346338353834636631 +30333262376638336537623466643736653562336336663436333963366464666131303862313335 +61353862656435653939343362393934303633303333366231646431656234656638613033383133 +31353262353231663633633063663537353536383138366132646364353661363135336333323133 +64613231626662666364313232333633386265353935363065333933666165633862393965326637 +63623962616164626237303466623565623032666431383633323233633861326132346263386631 +64386364653633363965356664636434393031383663393137343733343732363239633436663636 +64346237653966363538303632363461663030396237623661356438653562396232313935626164 +64326162363264323831663965383639393937613931663239316663323164306537326363376339 +33333063373464363065336132613230643831303937373163386263646562313361306133306639 +36636264373638326663613236353439383532323032393431373333626330313235623362643137 +30636462643536363638613936383931363663343964363038373834343164633062343265666137 +30373734396232343936326330623362316636616535643136313765356439323934386364643631 +34316630366332366432373739363637623437363132646330326361363366313633343634383132 +34626633343163613136343665373931363065306232313336356461373366623934306563383935 +35373930633334343864306165653034386133393636386662303737303136613432333531313461 +62323065343037386231656335326364363761396532346661343664636637633334383131613833 +34306465643133383239306534383035303363353766613631643464383264656536323866326464 +38666665613166653638633039666261326135363833393832373564333765353134636138343266 +64373536313666353332613535633061363835363839323430333430643863343461643236333937 +62346262396331613536343539653766323561343639643766653535353335383736333464613331 +61336337613737356236636333393236653263663065353431633537666161373638663861363863 +36393364616566343561393364313531356134626431646261346363343939616332313631636331 +31393435373265313836653533323237613336333061306330636665626233613537383932316235 +35646633653664313834376466306335653465613866393939323265316436333062646662656462 +36313861306533326163306266353538396436386365393464613335646432366461326331623664 +35616665666337663163663631393539663731376333393339373065643363326535643563383532 +63656466623939376632636433316661613730386363363930613830386638653837323938373030 +34653565386564333866336337316164663931396630333634336130383465643061633239656638 +66666166303835326365353433636130653038643938653365333431646561306536623037666231 +30333830376637653932613961353931363537336462643030376537386539623636303038363862 +34373036393931303465626563623664663532666166336334653234346561303538313036343565 +61363734333737393131643661326331383036333363653333373536373134306436646139636561 +61386462323832653061313034616532643265343636313366346537356164346461313436373637 +34316663356135636231613330323431316566323361363636633436653864633564366366383339 +61633266343336643430623138326436383361636161326264346365643536343838333138646563 +65383230373361663461383236313832366334303632313935313263646266393030313238613334 +66626631323033383334636561313666653165356135366435613438323662353135633234346662 +33333336646166643862396361383636306431353439333562633533303265303266613662306162 +34383062333166393739656365303738373361373436343064323636336634353232383232356334 +35633561383735316663383333303334633631346339323562353634396533343636653963653462 +61393039303366626563393737306336376437666138393562373933333335633435396632333232 +39666435383832663462626563646162666565393530393164373963386161666436343263316639 +30343064663133616135613164653937366636353062303139366261313165373362643365316663 +33653630633732623466343236646136663730663938333234613163663835393036363161386332 +62383833396164313132633535323530633937626437383462663866346163623234663564306533 +65326362636433333930623663653031313438363930373462663639366434633665656138303866 +35626333336532346663366530303061343835376239643466326361613030613730326130633165 +39333465393466336231333335616662386238346537633164666636333133306266613064343165 +39653963346133333234353266323065656237303233623264376233616334623665323433623632 +63316262306337386535653233336635616438356565343433393662653036663736663663666435 +33333433343566623331333961613662306236386439386135653138333638366566313534383934 +62626261303530306237653637363933393634663330336462393932353230313730336362376134 +35343530363431323366613361643636663961366238636537616237633965666639633265376437 +63363930353064346664323435313136316132373237356332383537623032633831353563326230 +65626166336166363164613130393165356139353439353436666537346362326635386136313464 +34383633336636376137643733313637373535643966376435353339363535653139313739313362 +65343434343364666639306663663665356533323635316534316561313263663662623764326138 +38386434316535653262616530643164663335323436386365313361656430616535346463643765 +64613231623333363835386337643334333039363835343731316165346438363234666134343263 +63663036663566373734656661613432623761393964313166393532396664326230363230303161 +36373364663137373234383134363966633935666365303430343539663461623561383236626137 +66623964333766323534316439643666323666336539393566316331363862666561656634326166 +64383236633638663163666236633531346330643066353566336337646265623361326261373862 +32626538316631303465396436643236376161613232666339373537383438633630316365363065 +31653433326333613431303936333137323632383163323561313636396331376664656365326536 +39323632623861333466333530643864616166623261346237356431326335343431373164633366 +34363932656234613431306135323434353164323461346262656337336137616430386533313933 +65306566373634363933616233316562643930666161643234323864336631343032326462623365 +65363036633061643463343637313933396436636333663861393333353732383736633534303864 +62376339343938383639626237373961623931616264353264353337333133396564623831643338 +39653962623766643239393061643938643066386564613932656565306564303066316165336230 +62363330653137616666343333323636663462643264656364396138626265623964663730636561 +31356339323934366637623165623039323439333434653336623962643734653436376462386232 +64393863353164373734313262383638393961623466653034626666353361393230623933373336 +35323661333330393835363064396564613766626665623866346334643463663865323264386661 +33663561616131616134333564343334343765373061393131376231653536353163643435613564 +32376466363230363930393734663433313133646238396366356361663636343362313237303766 +63613538383836646333366664313637333537303333373537646130393631656636623461383533 +31333661376236323736666136393062643566313131383165663965656637303634366330666539 +61336265356662336236626432643738343038396263393665396337633837303761613332623436 +33313235323938333333666437613731376562376233353664313362356433383938376436373863 +32633131386462333838323536333439323733393266376632386530366363633337323963353437 +37653334626434616433643930363765366439613236373731343339613237633962356531303433 +38333261613062323963366131633738613463363364653531663639626234383263633963336635 +65343330636330353363356134363138333031393838623635343335393462343036316638623861 +30323638373032653331616361383338333761386264623435656561623337303863323536633932 +61613964363538313435363231613834323333336364353962346265646233613935313632343738 +65303732376561643763336162333962353136663136613466666631323063646432323130616266 +65663431626562646537366661393638346538336538666466343261396431383232356238353062 +37653031653766333931393763346366356563393261363438363535303163303962306630306665 +62346633356463653465363965396164323437346132396138316562316237303033396233636336 +30623039326132393534633937623363656666663366643130633161646566386135303939383762 +33356334636565643761323638346162373636323433306436303331336432333830623739643237 +64646432366466326139306663356438613433366534616462383938646239643262373836363032 +61623735666238626435316530363833366135633563663530643631623539333832343561323138 +32383138303464393265373665333736303861646464373861613730653861353463323837383737 +30356437653833376631303636393739636663663936656663393130616637303332393636363431 +38663837393231326536643033376663316138363234306637613135396365616636656236646335 +33633962626135343564633337663936393031316133646334303635653130626131646531396134 +38343631613562393435326139366330373064393839636138323466646533303538 diff --git a/vagrant/files/ssl_cert/STAR_unglue_it.crt b/vagrant/files/ssl_cert/STAR_unglue_it.crt index e1d88017..3dd020d3 100644 --- a/vagrant/files/ssl_cert/STAR_unglue_it.crt +++ b/vagrant/files/ssl_cert/STAR_unglue_it.crt @@ -1,100 +1,100 @@ $ANSIBLE_VAULT;1.1;AES256 -36653339396630626234306535613333336237363134303461343633356238376137336666316134 -3736303661373032383738623738363939616432616163330a366666653434303433656437383162 -65623264386664666132666437343566663062363932636663653530336164646435383136323338 -6136316133653265650a323438323832326337303062343461363033343335643730613665383736 -35636330633864323633363031323362313835646432313664316366393832616530626632333364 -38653738396463646166666661346566306638333137383538373562623931653239653539363734 -32616564303039653334363232366136343638336235663666626162316563323939393165353062 -35346563306464656635623462313035306631386333303932646564383065316666616234346633 -62666132316533326265333231336630626337666334376464346634353161333464623036353366 -30323431343363373538353237386131656166653664383639666362313032376638626332663366 -66613435386634613732356234383965316638613966653234626362613034323333323430383764 -36623635633834383832616662323235666330663638343534393239313536323563386334326136 -36393063373136306264663364353833323339396466363136323566386163636665363163653539 -61623634383531376339633566643635393932353662343363366365343631323838303962646434 -61653062333564643334323432653961653965353866363836363639643066343332393664393536 -65373361636362623931373266663864353034616262653162363561653362653435636530666133 -36393238396533303565626634663438383336316532363966343136613439383965383838323033 -35333761376338316433386339383464623362376635343933376634646165646634373630323663 -65326631366436646461306535353930323036613664343236363865626430613463653161636365 -66643532303633326364313833616534623836333837363838303135633162643161643364363431 -64393635346463643136356662633039633634646461336565323763656335373330313764613837 -33336539356164396236393064323335663337366130373361363763613630303733366264613531 -36636536313839376635373532323536336563383030326133366565636330353838343934363332 -66393166343261333264346536333338343235386432353839303734666264646139343831323037 -30383764653136646336653662666534356665316361323933366130623439313561616638326339 -62323036323266326432316262303935653238363564633433386465346339623637643662336130 -33366235356635366465623635303236323665356364343530376261393935356631663337303165 -66303935333431363436333764616532343862396161326433366636363565303231653963383638 -38306364666165646338356230333661646565616161386539663930363835643030303439346533 -37303837646130623162316230353637306231643639373334393266363534306330363731303962 -33373336376665323534643535326365363461386235366135343730306332333331303937613264 -39383131303031306437333334396265343339383264626535646533666164353638333832363330 -35326464366265366431646662386430663738613838336664663264356635316134653631323332 -32616461323537373736313136383733653464383966363636353539363465336530336161346161 -30303534346232653030383766633864363532343563376639373839626463333330656633323461 -38316335643335353561306262643461303666366331636366663038326466393562363261396437 -33373336653534626433653634363563373833633838613661336235313837306635366566383638 -61396135663264343231653839623464303132333634616530336462636634343132386534653661 -66636666663439343631373736653333333763333530343265303839366536346365316636396563 -31313964346162643330353466386139363236373438373561663161336631363536343339636164 -66343337306535343937663630373130303838333730336132323237396531636333366464316631 -33343132666363356538643931653131393833643738393937373332306561373462333061303733 -65373465656132326538313465303238396163613131623836663539353739346164323462653564 -32343434393931653962666336366533303330643665326462323439376233356638363932363761 -39396635313632636133613434386637303163616533333861316430366666653365633732663531 -31333834316635346132386430393436663539343161336430653163303466363562353633643265 -39383361373136323162636235366462353062636230613434376466656139356533383237396161 -36643465383165656134313065316130303830633161306236353934643165386562383734653332 -63313563386462653765336462656439373837373661323861643335303331373130616539393763 -63313236666435666239323234626163383330656239656561343931393964326365343232393062 -32303963623264306533356336633634666365373030373761356361656533663937323634633165 -39636334373738363962303562333231376230646634336264613465663139333332613138356337 -66306239386132643530343963323062333835336338326435356162663730633235396334663666 -37363736303332636265373565623635393533366561643538396666393061363261333639643963 -36643034666137653161343261653766383265343839396538653737323036656332653131376335 -34386264366539633035653737316535633236636130363365663662326564616564643134306434 -65323533613030303332663461656139376232613538373632313838613965386162343038313764 -31623364383863393665643733306466666131383666363238643635343736366539303537366539 -39386362313233623638303332633131373931333431356534366332346438663665316265313530 -61326632626465373234663038376166303563343330356464623531346536373339633465373333 -64646533396532323033323037373538383639383464396462613434323533346666326361353264 -30363130303230636430393837663831303736643463643433383339343037643935636431366530 -61386231356533393437653033356566323161613062623637336566323766663238306165623830 -63386638623234303037313364616131616636353438646234616535313339663465316531633863 -30666664303533303865396435303839343464663638323961373065313063346236636364323439 -34393239663035326231326639653231386234303933333931333036343937373434613463396464 -35616636373534323231663363326438386263663532343630343539626262393662363862396665 -31316630373564663530653865323738636261643731306238613337373566366639633139353564 -33346662663664383639366538363038393535643736373532393230343134383939326235323939 -39353264383430643132626561343362396338303735623734656131363132303131356335653930 -38373939346333396162663434333638316163343764316564656538303665323631393738316530 -32656162383230353064343231306139303066383035623662663332626164613035663835613366 -63636332313238376134353165393634386137623632623463343435616431393732313737326330 -61313038386362663561653430633733363638646162643263653237376333623137363839376437 -62396138326639336536333939343034613765653561356533393965626432323838656235333336 -64613733303834353361653533333634366137376633323234623361326330643133626362396630 -32343661393930376539643962353534613666636166386662626538376261343937353536363731 -37356632616261613238656439666163626666373038643933666337373761663039313136326530 -39356231613262306339633739336434363830323966636464356664623639633335373834316562 -30353533616163386231616234303436356532656136326564643839666330363262356663396163 -30376362633264333238363163323165356139386333353463306536613831363535323938353462 -32626238633131643139613830646439353362326539643332363838643131383732313237643135 -34326532666366353664633866656363636339656630643764383966306531346335313765383061 -61316362366336336666666639353136636238613563386636616230616665313262326562323461 -30626538383636636631393539643130343830393035353361326561376230663664366534663935 -37306165356165633566373438303134663862643132303531643032323434643031663538316334 -34386163643137383566346437633135643363366263353465636332353837373237373161626332 -35626466396633616134663838663736323530636636346634333231366163303965663264366137 -30396661353432383733376563393966376461636535326461323963316162653066396137633336 -30363665646636636131636239643838666636656263333265666134306563363036363064323635 -32663264303437353861316535306238656336646239356333356139333137616538333432643461 -32613136306361666434306534303532366165343030633763383034633433656638643932393563 -34303234646633666530366561356138333931353261356162643832386230643532663439383762 -33393564656563656135323337663035383731636336373432643862336364653663376238613364 -35373464626134373663333132626634333535393534656237643439366230336535623062623265 -35663734633230383365656135646335306463646336336235386236336239653963373934613031 -32653463666362303365376161333736306265653962306237643339323865376165373835346265 -32333536323132636134333931643266316331353965386661613861653565373930326135616535 -626236666133323162396533366362326536 +66366138323934613133623237633539616236326462373461303832393739313466373236323765 +3461353265343631356335643139363335356262346238360a383136303237393662303762393766 +61346362386338663037396631633932373834303265383662356539323766393466656564633465 +3835623862356266390a646463633764653431353537643265363764653934656430646363373335 +32343135303266623365656532633061373564623664616564343638636138623433363964303366 +63323939396365363539366562626135626662336236313963613233633637313731313465363636 +39386237393034383263346164623036646535623463306330663034383632373836333661666435 +61656662353762653266363036373430343333653835646365613835303935396230363032636164 +64613730663339316261313664633636613763313631653839313465336562633663306563633561 +38613661333766366633333463376162306365323330356339613266326331353866316638363237 +33646165313865313431666163613234366133616263396630303362333336323638373131396334 +39656534616331643530646530316335633730323166373830353262366465306631636339316266 +32303162313438373531616439356563303030383136613531353561316234353632646232396433 +38643463333836326435303733373239626562363264653532323334356262346133633361373963 +64396564313630393164323231313937643435613234376436386563623435633666616331643530 +39366536616165303562663638313739353763656134316132616162303161623130616263306366 +65613264623935333134383733353637653336636532383165646338303633353330623231383239 +39343834643038656539623162353561646364393162323839643533333363616437393239313034 +61356134643031356536653262663833336361653632626364336565616163376238326334663661 +35623338393730636237616161383032353762383965633962343330353235643363346633313462 +36653365346263323062653239373132323734626363623337393635373738663931656363383136 +62613836356562363866623436393131323130306636356235343035333534326331343337383431 +38613565383365666632326238363165313631373262336234666434313065363363346636653339 +36363432306639303266366665643934346562663934666665343030396233666534633438396332 +31323662363130616338333233373961316639633436313737353530646135373533613433353034 +62346432623261346334623738663835666639616564373961643439336432316365666665393135 +38623936616361313634333339353133633165663936616332323938396533393235636435376439 +62633537633136386366313934373263383730633334343636373035316638343334356530613530 +63396438343139383439666539383531386437313865303864316437363563663065643266353138 +66323133646463653066323466653662653736306162636565326663386362366332303761653564 +31383133396131663563343339623563363239363763643530383833353263646264363565656535 +64343737663261653530623836356430666462633964353832663964396462363430623336646336 +65356566653938376132663230333033376261376538306266643565613561373636383532616139 +30396564613564333964303262656162313839663435666539393734376639653562643735393037 +34613864353764303661653561383466663730333932663139616164333239633961326632346230 +30316138626562346434643033303333333234396533626633333437316636323062643035623664 +38626434366261326663393839343765363133623339373738313563653736373565336164356435 +37623837343437623833623137373662653934363133633366636436663831653737376631376431 +34363461323535323337343632653430333961343165633864346132343938313361373864363565 +32663734626631323930613638323133396135313562643536343038366233373136653330626239 +65313933636136303365353466646533353236343934356330356161343433643139383764393134 +32356331653831633832376262356238336634353362373837646563653835613634356463653466 +30383361356631616538333565646435656361313839346165376231643633643634313863663137 +61333236313436383464663439366637643663356535613861343831663737623364303339643733 +36373461323130333639613235373961313736303436666361613134323265386165616237393164 +34366530363034376437393866333861646636396434636631343033633565396164663833623331 +32666161636163333266393361383838653333326437303235326565306663356366613430303237 +65343937653439353334343834303234643136656565366461393838653739336233613234616437 +62643065356462306565363964663332663564313734336239633833306135613662633535666662 +36616639323332353864383733393561666464313466393535373961613831313463306461663266 +37653230663732393061616365656638623830346536373932636461663532343532366566343436 +63376365643061623839393139333661643439376363396564363237346461393264663131616162 +32396464363231613231363561373334646362636536343732396364653132663664366434313538 +39396262333232383934396335653461346338316564303563626363646136633266393937343434 +34396234363362336232653136666639613466663833303062356264633461643932613162303031 +33663539366332643538353632336433393564366565323034393531626236353432623531383033 +64613435623761623562363563323364396166353265363039663932626431666339376632353539 +63656330626438653366396635353236663762666439613237623638663731306331313564333239 +37363663366134303037376433323735366266613831356635663932626162343639306366386439 +61643831336139303133336366366165303934646362303665643135386462353565303932383930 +33393334353235306534366339613066633434393038636331366265336163306334323638393264 +64313538316632373430656532623532313063613337626165353365303832373566316131666336 +62353062343565633836306235343134323433303633346130363362633263343564616535396263 +65666666646231336636616364646565303538343361653932356135393161316335343333653439 +61373266633033653931623631643430613137393633393063353833306463663630333434616462 +33653230613639616531666335336131373636323065616239313733323664623138313964303930 +35366665626362303161396562306639613435396331366363616138613735383030366362396337 +66356666643131393433343237346533383335376462383566643035616438396366633737393133 +66323630656539363237646663363764363536373266383036636166333834366663613863663533 +62393235666666653433613665376431306439616138633533656362323436613231303264303764 +30336665336661393866343935313465626264303139353632356137663439373232326339393136 +64306365353639626565653965666133346364613538333135653831663032613135653263353965 +63373532323062653630646363323063383065646562313539373637623463313333313535323866 +32363631613035653637663935313535626333333433623735663439383239373231613037303736 +39633436383361356633373037333362363861346263313038373131653938663930666538306432 +34386163316163623064376132653062333535396631393363393265303964356431663439636234 +64636138333031656364656565346163663533353333353666373466373734633263626439316230 +65313031396564613163333364376637303539343563613133613133376239623066303139393866 +32623135396134396439653061386561666433613536336566613530656530333433343537623866 +31333364636631336264636531343365633264633433643661353164653831343836323763343033 +37386131306563626437343034333330623932303639646631613239303331646364323465616562 +62353030633765393237653161636165363465336136333264373832616537356531313066643263 +38346331383061373133353132646562313630643335376565396662653830656538356165356137 +31396232326666613236313961636334383962373533613566333930313866373334613064376561 +65313565303630326531613131316463386636623830346131656532363632613032303466623334 +33353633663730306638623566326533363065663363373537353130393938313936383763663966 +34336535663565633162313732376237336463343833303939353965653665356563326534643033 +34343638666463363462363235343731346461336235306264643866366235663961363461373930 +63326334323363656263616531373861633936636339623835323936373661373364336233316631 +66366462643663316162383438376162663065633333353138363836353331343162396636623130 +62383461626534386664633166323764303631373731366133633930643232303934666535393237 +35373462313561353561643866623761313839316662373134363431373562373062313430613462 +37333635313037656433656363313864653037313732656232323639383838326263323564643263 +38373337353635353836366136326334343661393064316139373431313330653966323763306337 +62333066323961623535336232303234636138306630313732373364613363663434633734346231 +64663930633162313937343130343961356437353366306338663636366631326366663938363531 +63353863306137653237656330656237356563346337343262363664313339323863616438373537 +63643235306137363264383238316434313331336337356364366261313835656562643566666130 +633536646634326262663866316566376638 diff --git a/vagrant/files/ssl_cert/server.key b/vagrant/files/ssl_cert/server.key index c37f29e5..2e3e98f8 100644 --- a/vagrant/files/ssl_cert/server.key +++ b/vagrant/files/ssl_cert/server.key @@ -1,89 +1,89 @@ $ANSIBLE_VAULT;1.1;AES256 -61366632383930616532333838633734643866386335363664336535323033613435306164656465 -3965343534343733383664643838643036313839613134390a336339303266646638663636333436 -32626533653037653037366235306365623832613036353333666139663466336434306130336163 -3266613432363166370a613061323663343530373561313733613438376263323466653562343466 -62663330343934363439613531333635363561323866333066386538663964333830653038303933 -39333632393163323166396161616166383431333331666365386234616264376563336230393331 -62373738303134333936353430383064663034323765383231353737393963633165333462393838 -33386634653934323534366566373239643939373062386637393736633166326566303032303766 -31666239623738633065663836326465646438616135626239653263386537336163313461633866 -66633730333630376636376536333635613462616532333131323961336537336430303439656632 -32643831643135343138663464653330343239636463643761616563303062363831363131323039 -66653163616263326634643833333730616565663464313830353530323839333335343365626366 -30333636373361393662663263303835343062616636633063666534343934623838386638363063 -61346665336361396338323133356565336431643234343638343761366261346230313966313463 -31626332323662623434313039386134373536393262333737376331356264353636666139376232 -62343766646331323163393564313231333362656232613561366337646465303866383836653339 -66656164326437646166613334643333383762663666366139666533313561326439343464353634 -37653166353634623430323031316562313630336633376163323030336563623330336234366332 -38613739616331316264343532623930643163333861333235623033306238313434396534313232 -30366563306432386264383235326665326435336337633431613932646334303530303233396361 -38373431306563326436653338623364366166643565383432643161323239333062343362313832 -34376534663330393865623363303263366235366465303563336365303136663838383161383036 -37333661383866313961663034616430303666653030343433376663316230616639626639646138 -35396363346235366337383635366636636164336232373062343561356165623662653738363033 -34386364333538613865636666353561343966363363366534316362613461616239316138393433 -34643132333361353537336539363135643230376537343638376463336537376164316333363562 -39666565356264373962646133336530646337636633336161396264376265303861666637663532 -39313335323730356166656566326334343936376631336364303532373366346130653363343636 -34303738383166383465303366653833343461346531663034643862363138653034346663316561 -61666336313762323532323264306131643333376137393562363365636530313733323732353361 -64383165396631616339326232626231356466353737643665396338396131323764326539663137 -38366264383637313739313761363765643439396237383130323037346439373164393130333430 -33376361643939313532343164323331306331646532636338373833613833396464663734643162 -32386332303336623933633632333532616632333934653333336133313865306262623537393566 -64396331323835313633326531366331346666643762356464306464393534656638653835373730 -30636330313636653164663965346464316136376266653162333561633033393761393266333937 -34373237336336613036336362346166653264393766313530333535616635363438623530636231 -62396563376130373439346230383336666536633465336134633566353366663233313533613038 -38656462373638393730316461393130386464613764656362663030326564366166643664306439 -38386438613062616332653936306638343137373063376230646638393363313638333530313930 -30346161616266633632313231333837356166663763393031636337353962636538636534613035 -37306336316231313862306436356265333832336535363739626636626534393530323762636631 -64313261313532383834323463373730623736353964313930666231323034303164613236346538 -32643433663866383465646331353066373239633338346632623333633336303835666335623538 -39373665383861613732366238396665643462393032323334633135646437663538333131323534 -38386436376633323561616563666231636335336436373432356333353063663764646238393063 -35363832663834333164353931326638306364653039666265666661323933313639333663643061 -31626662303436613164356631343433626333623835666530643363633733643333346264323536 -31393833323931653332376564383139373039353561376237356635333530333862303765396132 -65333361643133303432383338306263333637336264353861343335393564313636346662616465 -65346435346432363732666638316263303237396332353837613032616436356135656435623633 -32646165373665623030656532366166373235303233353631363036636336623263316265353964 -65306637363234383239316463616131383839333630343664393061323134313831643462383333 -32356335373032356663353238626538333235323538363831386464313330333132636139373835 -64336631323431366463356531616435663230373639323433313161313264656166363636303266 -63666563366530343531643832666162633463396230393934356262353164323435666135656265 -32326162666564353137636465663737353234333335383534623866326664656132336164323762 -30663133323439363132623730663934383361346438373635373764373531346166373566616238 -39376533396363363939663735393135373137303937663730393665663762613861353230353336 -61613131363037653930386661643665373066363363666464376339613461363261323064363864 -38353536633866666431626539393865386433646662623637373032356466353630323962633035 -65623063353732613532316333386263316336343263353164383431363236656233316661653234 -31623531396635656162396334653466643736633634363039356530333136643232306364633439 -63386266376137643133306237663233666434346333666436386536366334623131613562346261 -36663636626264633139333737636236323636356266656265663063303532303937333335373335 -39383664363566616362643834306438306165303734383364343538643163346633343934363537 -39656266373836623666363237396337666435346337316561336330656436653432323561643563 -32303163326461653762643734646463626634383730383031633533653961396130303761656164 -65316136346637333431643538633531363338646635653236376462393830353331613165663234 -35613033363064653438393132383738626138353230373633613231383736373539656561376237 -66383234383734623836353063386436306162356461646532623862656331373765323335373761 -66633361356331343639393733303636303831636464303065643532326166616665613339663739 -32303237363134343364316332633262653162393764323536623337613533313563346162343535 -66373838353665393263363237303231376432313132316132303136366465353965663838623237 -61366461646130346263626232393039636336386134623134373531396664373062363532636136 -37656364613833326663396432313036373239626365346534646462646636353330303133663933 -66613338306333666361326534333134383933333739653566646132636536646530666530616230 -62376563633138623830363033633735666564366235656664656134333333633632303165623530 -38653635303561366663333761363761383133336466343233636161616636613331306264373962 -34623165643832373765373931396538633163623933663765323037353930626338363532656131 -37356264363139343633653634343531663065343137616536363961656264633332656562373136 -38663466323331336636393764303064366432366232663162663762633261656335386438373536 -33643835376466336666303830656633303163396265393431636565393962633935343964396136 -38373633626636353037636464326562313730316535333935643766343164616339316338333436 -61666237346633376235663631363138383563323564666139306430353164616563623766656534 -30303833643333663230353966316663376563373232626164633064356137346130663733303835 -38316330623961353339373966333436646338643539653037363963613133333638623161643661 -38646631623832326565 +32373237336239343336393066383464393861636235623430343533636365306430323738643234 +3538336532623734333038333832393735343363363566340a643638636634653735656635336338 +39396461646661353061373636313032333065373562373036336232346133313334333862353034 +6337653431323235650a663536386561366531623363303963353539326339393034313961393362 +30306235623461326365646365373835333235303965336635363361366336303236333237383539 +61383438316464336338633163366532323435616563343463623266346632393930353332626137 +34396538653134373433333461373337333639393530383738373764353731363264373835626364 +35393163333462343562303136313264653764333038343838656562653133353934336666643534 +63366264393462643065323865303033636133663164366334313564333262633736626263363338 +39376164343330666332333534313634633137653432343232656464363066356336623166303030 +34653432366563663432343164636665373139346435396135303736653030653930393963663538 +36333636623832633630386235623365363065343936363031613165383534353837353231373164 +37373038363361633330653633396562323738663739316634666137306161313233633561383064 +30323236643635663766393862343363653866303431346535626565356162353433623132363031 +62656332383835386136656534636135346234326561623037396239303034353961396134396334 +35303463366439363336363666623064623564323032646337366332666536373064353962373461 +63306166616535356231396566316433633062376164303434323639376339643731393461393536 +65633363616235343532386435323736313138666661666434643935623266323133336463326532 +33326364346364626165666262396133343736656335353732666362613234343163343465326361 +33383136636364383466363666316131383366623665323561636130343337613539383134646535 +31383131623237636433313133336162633537653533383435336461616439343035336164333363 +31623638333465306538313637636436626132656534313064383663393230653132333938343537 +65343339333037613332316534336133373864666130303166393038373531396266303832383632 +65343531616661303363303966303230353630356437336164383038366563363166363763396464 +37386330653563613063323438363737313565363130353264613236346565323837326631363935 +31346365653938653566646437623333326533646235343966383031656132396539616661393461 +65333235306432666539623964393132616436653430383236353033333366336363323539333636 +64616563376464646534343838616437306232393262313065353936356235373231613561323866 +61383536636361363039656138306131383732326464613931363837376234326433376533643861 +32616434383536373532383238663263643862373738333338343332303735663863346331663037 +35643637356531323639623533313865656132353139323436363661643263323633363161653235 +37636635623865303536353264313263373938366165623364643337313831653161623231343764 +33386162623531396234623937633465653930636637623837653138373365346132323731346130 +64613338386662653833653034313066636566333839306539666161333333616261653537313363 +64656632333462633232396236373666366464623464653434383832333365376532626531313735 +30313335353664643566313437393834393262333665666366326463663761626135326434363931 +36306439376138313838613532343663383938366333316432303930326239646232623633373564 +62316632383131626432333461323330366165366331303735333330363335366265316330663563 +64393231393136626162386335626433336337373765623933346237643532366662616434366163 +37373832303664303836373434343032313731323362353031346438643335323131366538653334 +33643432646339383865386238666134383861616437663238366365663737623663323137613865 +63633965323933366332363131313834653564636336303966656663366361353731316336633233 +32623339343838373639343534326365346135393137303736346634303863333664376332636634 +30303938353536636365353338393932353435383635326435666133353430323464333531356563 +31353733323331656538373932643332316332386437373938373635633832383662316537346132 +35316339343538343462363237666332376461363262623438623738623732383337373738346235 +64333335396336333337643235616436373736623339366236313938653433343661366332646265 +34636530666636363764366533643739653561626134393936616632616264663230616164376132 +30656336633230323535653766636361626562306262326265626166343036643034303730306164 +63356131333739333338353835363430363864333063363238303861323033643534366264623433 +30653639633862376232393065626636396137343635343030316630313863323365363764616630 +38346336663932626430613437656437313462633039393934653532386535323836366465383761 +39323732666339386565653836323461623238316564323333363461396161643338633137646335 +66373461633233333337663332323064373662636535376433613232653137353834373630663366 +61343066303366666362353837343337386631653461646230656533663965626135383131346635 +31623131653264353861353630646662303835643738323565383233336334356264353939373933 +31303964346563636437633532383762383234303130366331313864386330653130653437356466 +38373135333066336139336332643666373932666565303062636465326236623963323337633634 +66646633366532646232326435663065393035386438343030323038663033356639356264663532 +61396130643135666266366664323234353065303031343531366532633532363534646536646235 +62383531393832643137633332353364333230383361663264623564366539323132623639623939 +61323263373866343933653734323661383634636139383833323837303236326364666466386336 +34316465346261366131316535303563623238346530643264326539653432633237656133613532 +30663738313139333461346163626130343535306538623763343134623832346132656666393761 +35316164646635613032326565353163656134616366386364306436303134386339346462653262 +61383961656334653564623262366265316364366538353362313233343239396265383235303534 +33666366323466303534333165653334343437316435613566326338666336326664616133313062 +66333339346335626663323335373939303163623331303133643937653362666430323930623462 +30393239633763666463643066393161353235386461633066306235376261346139363330663235 +31643539616335396331656364383265346333323661333066353732653336616330303931376164 +37643931313337646337333236323939613333303834356662373836633631393736616462363338 +31623064303936306330343361313763336239316362633732326564653566313265616566336135 +61616538653365313666613366313064623232653563383465386535636530643831633735323433 +30353239333166343366643738363834613230316463636339666434633961386335623238353030 +34356536376164613338376534353438383039383930316439653732643339653531316530393534 +35326165666439396537396464656339333366333535366530353064396436663966333465616630 +33666233313537363165333738393362656631386564376365616266393137633931643833343232 +62393663663836303563386235383363623966316635366133353165346635373063383666373833 +35633264666139616463333339653733376431363761653433653138356364383865633937363433 +33313361653536633066656164616331343033373339336334666635353630636532323632323261 +39303937626633613434653835376538356164396631326163346465663337386230656139396237 +36613762346462626135323233393537616539646234663866353433396530383966613333376137 +37373461333561313966303239633834663837656230613830303433353639643431323930633238 +63383161313938663737396539663163303161633732393130363737303732313166623534303339 +65323162386430393639303435653436656239303032663761626462633565626161656632626162 +62386631316434383239303631343536363034626663626430633635353933313533316337613532 +33383335326637626535336664626663376332316236633735663339373131373630643665356133 +31393664663737326638 diff --git a/vagrant/files/ssl_cert/unglue.it.wildcard.csr b/vagrant/files/ssl_cert/unglue.it.wildcard.csr index 6f220fdc..7328e869 100644 --- a/vagrant/files/ssl_cert/unglue.it.wildcard.csr +++ b/vagrant/files/ssl_cert/unglue.it.wildcard.csr @@ -1,58 +1,58 @@ $ANSIBLE_VAULT;1.1;AES256 -38396166656531373366663239356363653639613931343164646666386232613237363362333735 -3735663235653631376535363133363132396235616130640a383265656333346664656162376537 -31613866396635346235316562656434333731626532376631353666623666663430623163353861 -3762653433656236660a353766346130333033333433333132393431633961326361633535633863 -35326662343734366437386638363631333331373432353933353866363261393165356432663731 -32626662653735313064663032356333613435616434656231373235376561326666323561613937 -62363431383131373437356266303938613966623838336164393536646537336465613034313331 -33306466613565613430613532623261353264386564666364326235353764383834353939643637 -66373738616638616638613865303935366336346665356665383434643836636238386431313163 -39396530356431346135396130666132646662323261616163373238663931643134383663653461 -63386233663966353735313936363638366432333335356236393337306339346263353664653761 -65333764376566656337356633376663333434633962366332613865333636616437396562656531 -65323365376434363435353963613437623062373533323262666230326335366239386661323366 -30306530333564346564386538643431363333306239333766663139393066313664663865323663 -33336635396531626463626265613262343464633236393161363361306462316231633361393739 -36323461393835653562313237626230303566633261326630373166636534373262643034303635 -66346537626431356264343530646466653930326335626437613764373761626361383631353034 -31393135336439303366373535633764326237353533636563613462353831346235326339336266 -34633534613664653534653161313231353036326539326666626436363834376636373330613433 -62323663646434353331316338383736663238653633636230363763326635343739623034356466 -38373933333632663162653761663833323537376331356564316633653935316664353935336439 -39313930373033373638373134613532666264626536363837633933303363616133366463303832 -39616663396436313630376365343961333635656231633235323133663237333739356237333661 -64663730653662386266333365373634316463643932663534356238323666333537303463313264 -34383034326137303030363331613365393838356166396136353366306334636435613138656234 -62306461386133626463393864363261373431383136363362613663643136653534376531653161 -31386565346233666233646138613838383465383763313531353633396432396236326636353135 -34383833363930363334363766633435663230663231313530356132313336663834623631356630 -31326130386434653865316366326364396438353733386431333030373134393966643064636339 -38636566636333626238373233633266623561636464366363336138653633363861346336396432 -64616662326132653934356531393461663439326233396662363339313366383564653031363839 -62323434383639643061366264613032613036303461653464306330353630646430373138346634 -66333733623037353932303130323636316237623734306163393963306466303637393537373531 -30653365656534376334303263656634343161326535316339663661363961333735356235323131 -63643336386231393536636165373038663732333030666366353762636631356237303063623434 -38353166636363376562313237663934636136343432613736653766343863663862333961666666 -33623466313163663230303236323033626263396537303536353934336662333161643936393462 -33353239383435643631333364653766303766306566343737626231336465373338376431653438 -62333039643732623631616461636537336333636335633161656165653033616337643330306132 -39633437613038353961643635303037613733303030323762336432656539636538366363383631 -32653763393236666161373563363530353662356433366235663335316234356337333033613938 -31313561313437386530623764323538373761663232623563373131333333373561343733323564 -31643039313964393339363635396563663634373739373534346533356464396463386232623835 -62373739643132393335303766343466623539353634343166366235336361393934356637623961 -62373662653537333262376130613637303538393861623536646131363166613361303539343339 -32623462633361643535626539303235663539643865323733303432316365303239613930623438 -65386561326639396366633038346166363935366164333463636637316465623262353530313061 -65373239663439313935633031336561303335323731383265376136303639373333663765313933 -31626639353135373064663137646337636431646365373633643432383264633966356662373932 -65346634336436303565373539313164666237663664653233313135353362363630373637313333 -37386130323763306663333565386139306530653866643263383462313765353261376335343964 -37656337363066326634333437326239616461333836613730313330663538346135343734376635 -31633332363861303938653761653830356236376631333334373164366464623563616433313230 -64393835343834386533323139323663633739393230303065376533623634366136326264626666 -62643063366539333063663233386263313361653235613538356461323538646133386261353634 -63353631336235623763636466653665363038666266653263323766366264383662393738636165 -30633039633661373830633132653836613334383832643032663162333761663930 +65656166313438643163366632316530386139623538636439633638636566383566646239306131 +3938333565313734613639376539323233353932373635640a313831613637383734636539666463 +64306331656564626233383831633862623861346364366632313733623263306464636264363965 +3933326435396164390a646439366537323232633232373339343538616431343137373338326166 +65373365613465616631623463313364396332366539386462333737623737343330393662646533 +62353663306531663935623765353838333138346630313333373066303835323461383630306662 +34316363316661613865616163393133626139663162393336356665373465353766656661633731 +37373563396437366661373134623664393430616532353530303861336238666539306562343662 +32613431393331306234643362323961343261376238353635366132623638663463343730343730 +37323733313739636238376538323264333238643532306439366463626233613237313933383333 +31373064343036616239616562373264653163396265613935656638613662663364633866393638 +62303563363763356433376634626234663234323636366232616431646534383730346233333963 +31616263353462653932343537343863326337643037326265666433623965646264303066316139 +31653864383331626231313736623563316330393563376562303933313237383939396438623231 +65383666336565393236326433646561346635356661356136306165323432383531646264323064 +31353738663861306135636131333261333964663338636637306665333663313164393537396663 +36666663616634323137333835626133383737666632316336313661656434376239616437346636 +62643035376637373031636330646638356562643962313336653964616337643064346562366531 +33613935656630633736386632616162663535366466663637313339323939646136636165656166 +38346562346331323738393934396362316361643538653163333935656139356535363432313532 +38633336646332386661643464666263646432373134306639306561663134373164326632613531 +64313162303263333534666436333634663262623632366631633865336433303564363138353566 +36303862656531343765643965666531613231343035636537373030613932303039623131363830 +37346263666637373639643930303438316430663462333430613335613131396566303533343864 +62373439663236636232353230343433336137613930623133303936323562313061336637306566 +34383336646336663263373334323131316262613136353239616630303264633238383266323464 +37623864646331363735306132393936306162393463313736366166656439343039626434353739 +37613532393830323431393964333437306366313335393434323463346133343237303732343962 +33373164363135363335323435636666386231363463373864663933373430656239366539643164 +30323038323739373965616630336166356362653833303132336230323661373737666232346630 +38393933303736306537383364356162656339613461333262656137636662303532663737636237 +36333661663734643363636661353337616162396666356663393432633361313534333537393161 +66666165363635346162623965333061386563663166643736653134303638613332313637333064 +65333438333661343664303361316631643763323164386330636139353932646635393963656336 +36343362323332336130633533663234343236393639323062663962633336626435653137306539 +63633866616438623764616631663533363233346362336132303861653039386133323965643863 +30633932646132633862666266323761656438343935636332326263653437333366306338636137 +65303538613661373538313437646466393536313665623666396235353962306634386261396337 +61376439636531383631383234313230303731653435393964393835393236653739316634623363 +61363730333632323039326438366633336462656135366164663434383561356337393636353661 +64616435386238316265386565633938623935663332633062316163356337303765366262313534 +61396361326333616136366435666662346637663864326561653634313030303033303132366132 +64353635383932633733303333636137323237393764396136313661353463306137316563303232 +32363063626630343230333065376638626236653532383766363161313862616336396334303764 +38393262613531343134653130313237343036383464393739353631636235343930653537373935 +63306431643132643362656433313061303838306164643236316166303331313636376431326239 +66386635333631653232383664343864383739663364363131373062623835363635393930326639 +33303733353761336638363935316232336533366339396166383539363963373536346232663865 +39613463386138363364316365373161313130316638616635313235363235396166323935353664 +39646163306161323536366532333231373530636234643764366134306164333431336636333533 +32333966393634393135333031356533666531613262313432346366373262373565323962323939 +36343764303866653638336134653263616561396332643030356434383531343166356466646633 +37336564613131633534313064303933633134393131656536383439393633366164376636353634 +34663236663163633338303838303733643262363834633064313532626631646239306564313361 +62616331306330636366306633366430353964376466313032356434346532366362356136376536 +33613962316539376138323033623736366531643261386535653733303465333331383131666530 +38336561353633303639616635656566323130616561656235393135616631356334 From 9a6cabedf562da1e140e63b1748be46a823cc80f Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 24 Jan 2018 14:39:13 -0500 Subject: [PATCH 085/109] add new news --- frontend/templates/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/templates/home.html b/frontend/templates/home.html index 010755ec..25e462bf 100755 --- a/frontend/templates/home.html +++ b/frontend/templates/home.html @@ -219,7 +219,7 @@ function put_un_in_cookie2(){

    News

    - Unglue.it is now Open Source + Unglue.it has resumed crowdfunding Open Source
    From e317deeaa191923edd9b01230a106c4f8ad32173 Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 24 Jan 2018 14:39:43 -0500 Subject: [PATCH 086/109] don't show comments unless logged in --- frontend/templates/explore.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/templates/explore.html b/frontend/templates/explore.html index 6ef394e5..01d48400 100644 --- a/frontend/templates/explore.html +++ b/frontend/templates/explore.html @@ -33,7 +33,9 @@ {% endif %}
  • Active Campaigns
  • -
  • Latest Comments
  • + {% if not request.user.is_anonymous %} +
  • Latest Comments
  • + {% endif %}
  • Site Favorites
  • Latest Favorites
  • From 7a8a621a59340cc9ae22354488f9562597c81dad Mon Sep 17 00:00:00 2001 From: eric Date: Wed, 24 Jan 2018 14:41:14 -0500 Subject: [PATCH 087/109] stop showing random ungluers on work page --- frontend/views/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/views/__init__.py b/frontend/views/__init__.py index 36cbbc9c..baab302b 100755 --- a/frontend/views/__init__.py +++ b/frontend/views/__init__.py @@ -397,7 +397,6 @@ def work(request, work_id, action='display'): 'work': work, 'user_can_edit_work': user_can_edit_work(request.user, work), 'premiums': premiums, - 'ungluers': userlists.supporting_users(work, 5), 'claimform': claimform, 'wishers': wishers, 'base_url': base_url, From 560a2306dca8b9dd56374f872d168d98f60dfe44 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 26 Jan 2018 10:45:09 -0500 Subject: [PATCH 088/109] accept epub3 from google docs they don't set toc attribute on spine --- pyepub/__init__.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pyepub/__init__.py b/pyepub/__init__.py index 305b4e87..375ce442 100644 --- a/pyepub/__init__.py +++ b/pyepub/__init__.py @@ -141,8 +141,11 @@ class EPUB(zipfile.ZipFile): raise InvalidEpub("Cannot process an EPUB without unique-identifier attribute of the package element") # Get and parse the TOC toc_id = self.opf[2].get("toc") - expr = ".//{0}item[@id='{1:s}']".format(NAMESPACE["opf"], toc_id) - toc_name = self.opf.find(expr).get("href") + if toc_id: + expr = ".//{0}item[@id='{1:s}']".format(NAMESPACE["opf"], toc_id) + else: + expr = ".//{0}item[@properties='nav']".format(NAMESPACE["opf"]) + toc_name = self.opf.find(expr).get("href") self.ncx_path = os.path.join(self.root_folder, toc_name) self.ncx = ET.fromstring(self.read(self.ncx_path)) self.contents = [{"name": i[0][0].text or "None", # Build a list of toc elements From c00d2f6181f7456ca6cf803158f8cd9f2286de3e Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 26 Jan 2018 12:48:47 -0500 Subject: [PATCH 089/109] remove admin restriction on upload --- urls.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/urls.py b/urls.py index 013cb50e..bb802b52 100755 --- a/urls.py +++ b/urls.py @@ -1,5 +1,9 @@ from django.conf.urls import patterns, url, include +from django.contrib.auth.decorators import login_required from django.contrib.sitemaps.views import index, sitemap +from django.views.decorators.cache import never_cache + +from ckeditor import views as ckedit_views from regluit.admin import site from regluit.core.sitemaps import WorkSitemap, PublisherSitemap @@ -20,7 +24,8 @@ urlpatterns = [ url(r'^admin/', include(site.urls)), url(r'^comments/', include('django_comments.urls')), url(r"^notification/", include('notification.urls')), - url(r'^ckeditor/', include('ckeditor.urls')), + url(r'^ckeditor/upload/', login_required(ckedit_views.upload), name='ckeditor_upload'), + url(r'^ckeditor/browse/', never_cache(login_required(ckedit_views.browse)), name='ckeditor_browse'), # questionnaire urls url(r'^survey/', include('questionnaire.urls')), # sitemaps From a1c96ebd1a862e318cc07b6c33ec168364e4b69b Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 26 Jan 2018 12:54:25 -0500 Subject: [PATCH 090/109] only allow image uploads --- settings/common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/settings/common.py b/settings/common.py index 5cac1480..82daf4ab 100644 --- a/settings/common.py +++ b/settings/common.py @@ -425,6 +425,7 @@ SHOW_GOOGLE_ANALYTICS = False # to enable uploading to S3 and integration of django-storages + django-ckeditor # some variables to be overriddden in more specific settings files -- e.g., prod.py, +CKEDITOR_ALLOW_NONIMAGE_FILES = False AWS_ACCESS_KEY_ID = '' AWS_SECRET_ACCESS_KEY = '' From 57cc44b6cc73457d627ba355dbd253f36a6fe608 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 26 Jan 2018 17:01:16 -0500 Subject: [PATCH 091/109] it was too late at night, I guess --- frontend/templates/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/templates/home.html b/frontend/templates/home.html index 25e462bf..f082bb15 100755 --- a/frontend/templates/home.html +++ b/frontend/templates/home.html @@ -219,7 +219,7 @@ function put_un_in_cookie2(){

    News

    - Unglue.it has resumed crowdfunding Open Source + Unglue.it has resumed crowdfunding
    From 7cd10386cd28108ed18a253986de126b3566b3e5 Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 29 Jan 2018 22:56:18 -0500 Subject: [PATCH 092/109] convert sitewide to scss --- api/templates/widget.html | 4 +- frontend/templates/base.html | 4 +- static/scss/bootstrap-social.scss | 121 +++ static/scss/buttons.scss | 166 ++++ static/scss/download.scss | 133 +++ static/scss/font-awesome.min.css | 4 + static/scss/mixins.scss | 39 + static/scss/mixins/buttons.scss | 65 ++ static/scss/mixins/opacity.scss | 8 + static/scss/mixins/tab-focus.scss | 9 + static/scss/mixins/vendor-prefixes.scss | 222 +++++ static/scss/sitewide4.css | 3 + static/scss/sitewide4.scss | 1029 +++++++++++++++++++++++ static/scss/social_share.scss | 48 ++ static/scss/variables.scss | 17 +- 15 files changed, 1860 insertions(+), 12 deletions(-) create mode 100644 static/scss/bootstrap-social.scss create mode 100644 static/scss/buttons.scss create mode 100644 static/scss/download.scss create mode 100644 static/scss/font-awesome.min.css create mode 100644 static/scss/mixins.scss create mode 100644 static/scss/mixins/buttons.scss create mode 100644 static/scss/mixins/opacity.scss create mode 100644 static/scss/mixins/tab-focus.scss create mode 100644 static/scss/mixins/vendor-prefixes.scss create mode 100644 static/scss/sitewide4.css create mode 100644 static/scss/sitewide4.scss create mode 100644 static/scss/social_share.scss diff --git a/api/templates/widget.html b/api/templates/widget.html index 47499823..a79c6014 100644 --- a/api/templates/widget.html +++ b/api/templates/widget.html @@ -1,8 +1,8 @@ - +{% load sass_tags %} unglue.it: {{work.title}} - + - + diff --git a/frontend/templates/pledge_cancel.html b/frontend/templates/pledge_cancel.html index c4e2c1b0..dbc92ba7 100644 --- a/frontend/templates/pledge_cancel.html +++ b/frontend/templates/pledge_cancel.html @@ -1,11 +1,12 @@ {% extends 'basepledge.html' %} {% load humanize %} +{% load sass_tags %} {% block title %}Pledge Cancelled{% endblock %} {% block extra_css %} - + {% endblock %} {% block doccontent %} diff --git a/frontend/templates/pledge_nevermind.html b/frontend/templates/pledge_nevermind.html index 8ea0d6fe..869976f4 100644 --- a/frontend/templates/pledge_nevermind.html +++ b/frontend/templates/pledge_nevermind.html @@ -1,11 +1,12 @@ {% extends 'basepledge.html' %} {% load humanize %} +{% load sass_tags %} {% block title %}Pledge Cancelled{% endblock %} {% block extra_css %} - + {% endblock %} {% block doccontent %} diff --git a/frontend/templates/pledge_recharge.html b/frontend/templates/pledge_recharge.html index 49ae84ae..4e22dc48 100644 --- a/frontend/templates/pledge_recharge.html +++ b/frontend/templates/pledge_recharge.html @@ -1,11 +1,12 @@ {% extends 'basepledge.html' %} {% load humanize %} +{% load sass_tags %} {% block title %}Pledge Recharge{% endblock %} {% block extra_css %} - + {% endblock %} {% block doccontent %} diff --git a/frontend/templates/work.html b/frontend/templates/work.html index 94128a05..aec64fd3 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -2,8 +2,10 @@ {% load comments %} {% load humanize %} -{% load purchased %} {% load lib_acqs %} +{% load purchased %} +{% load sass_tags %} + {% block title %}— {% if work.is_free %} {{ work.title }} is a Free eBook. {% for fmt in work.formats %}[{{ fmt }}]{% endfor %} @@ -21,7 +23,7 @@ {% if work.first_isbn_13 %}{% endif %} {% endblock %} {% block extra_css %} - + {% if user.is_staff or user in work.last_campaign.managers.all %} {{ kwform.media.css }} diff --git a/static/scss/book_detail.scss b/static/scss/book_detail.scss new file mode 100644 index 00000000..45ba25ef --- /dev/null +++ b/static/scss/book_detail.scss @@ -0,0 +1,198 @@ +@import "variables.scss"; + +/* needed for campaign, pledge, and manage_campaign */ + +.book-detail { + float:left; + width:100%; + clear:both; + display:block; +} + +.book-cover { + float: left; + margin-right:10px; + width:151px; + + img { + @include mediaborder-base; + } +} + +.mediaborder { + @include mediaborder-base; +} + +.book-detail-info { + float:left; + /* if we want to nix the explore bar, width should be 544ish */ + width:309px; + + h2.book-name, h3.book-author, h3.book-year { + padding:0; + margin:0; + line-height:normal + } + + h2.book-name { + font-size: $font-size-header; + font-weight:bold; + color:$text-blue; + } + + h3.book-author, h3.book-year { + font-size: $font-size-default; + font-weight:normal; + color:$text-blue; + } + + h3.book-author span a, h3.book-year span a{ + font-size: $font-size-default; + font-weight:normal; + color:$link-color; + } + + > div { + width:100%; + clear:both; + display:block; + overflow:hidden; + border-top:1px solid $pale-blue; + padding:10px 0; + } + + > div.layout { + border: none; + padding: 0; + + div.pubinfo { + float: left; + width: auto; + padding-bottom: 7px; + } + } + + .btn_wishlist span { + text-align: right; + } + + .find-book label { + float:left; + line-height:31px; + } + + .find-link { + float:right; + + img { + padding: 2px; + @include one-border-radius(5px); + } + } + + .pledged-info { + padding:10px 0; + position: relative; + + &.noborder { + border-top: none; + padding-top: 0; + } + + .campaign-status-info { + float: left; + width: 50%; + margin-top: $font-size-default; + + span { + font-size: $font-size-larger; + color: $medium-blue; + font-weight: bold; + } + } + } + + .thermometer { + @include one-border-radius(10px); + border: solid 2px $blue-grey; + width: 291px; + padding: 7px; + position: relative; + overflow: visible; + + /* looks better if we start the gradient a little closer to the success color */ + $greener-than-alert: #CF6944; + + background: -webkit-gradient(linear, left top, right top, from($call-to-action), to($greener-than-alert)); + background: -webkit-linear-gradient(left, $greener-than-alert, $call-to-action); + background: -moz-linear-gradient(left, $greener-than-alert, $call-to-action); + background: -ms-linear-gradient(left, $greener-than-alert, $call-to-action); + background: -o-linear-gradient(left, $greener-than-alert, $call-to-action); + background: linear-gradient(left, $greener-than-alert, $call-to-action); + + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='$alert', endColorstr='$call-to-action'); /* IE6 & IE7 */ + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='$alert', endColorstr='$call-to-action')"; /* IE8+ */ + + &.successful { + border-color: $bright-blue; + background: $pale-blue; + } + + .cover { + position: absolute; + right: 0; + @include border-radius(0, 10px, 10px, 0); + width: 50px; + height: 14px; + margin-top: -7px; + background: lighten($blue-grey, 10%); + } + + span { + display: none; + } + + &:hover span { + display: block; + position: absolute; + z-index: 200; + right: 0; + top:-7px; + font-size: $font-size-header; + color: $medium-blue; + background: white; + border: 2px solid $blue-grey; + @include one-border-radius(10px); + padding: 5px; + } + } + .explainer{ + span.explanation{ + display: none; + } + + &:hover span.explanation { + display: block; + position: absolute; + z-index: 200; + right: 0; + top:12px; + font-size: $font-size-default; + font-weight: normal; + color: $text-blue; + background: white; + border: 2px solid $blue-grey; + @include one-border-radius(10px); + padding: 5px; + } + + } + .status { + position: absolute; + top:50%; + right:0%; + height: 25px; + margin-top: -12px; + } + +} \ No newline at end of file diff --git a/static/scss/book_panel2.css b/static/scss/book_panel2.css index 15d6ee1c..81e2a2d9 100644 --- a/static/scss/book_panel2.css +++ b/static/scss/book_panel2.css @@ -1,3 +1,3 @@ -.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.mediaborder{padding:5px;border:solid 5px #EDF3F4}.buyit{font-size:13pt;color:#8dc63f}#main-wrapper{height:100%;width:725px;margin:0px;padding:0px 0px}.panelview.tabs{padding:5px 0px;margin:0px;width:142px;float:left}.panelview.tabs span.active{padding:15px;margin:15px 0px;font-weight:bold}.panelview.book-list{font-size:12px;width:120px;line-height:16px;margin:auto;padding:0px 5px 5px 5px;height:300px;background-color:#ffffff;color:#3d4e53;border:5px solid #edf3f4;position:relative}.panelview.book-list:hover{color:#3d4e53}.panelview.book-list img{padding:5px 0px;margin:0px}.panelview.book-list .pledge.side1{display:none}.panelview.remove-wishlist,.panelview.on-wishlist,.panelview.create-account,.panelview.add-wishlist{display:none}.panelview.book-name div{font-size:12px;line-height:16px;max-height:32px;color:#3d4e53;overflow:hidden}.panelview.book-name div a{color:#6994a3}.panelview.booklist-status{display:none}.panelview.icons{position:absolute;bottom:-3px;width:140px}.panelview.icons .booklist-status-img{float:left}.panelview.icons .booklist-status-label{position:absolute;color:#8dc63f;padding-left:5px;left:40px;bottom:5px;font-size:17px;margin-bottom:3px}.panelview.icons .panelnope{display:none}.panelview.icons .rounded{margin-bottom:7px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url(% "%sheader-button-%s.png","/static/images/","grey") left bottom repeat-x}.panelview.boolist-ebook a{display:none}div.panelview.side1{display:visible}div.panelview.side2{display:none}.panelback{position:relative}.greenpanel2{font-size:12px;width:120px;line-height:16px;margin:0;padding:10px;height:295px;background-color:#8dc63f;color:#fff;position:absolute;top:-5px;left:-10px}.greenpanel_top{height:135px}.greenpanel2 .button_text{height:30px;line-height:30px}.greenpanel2 .bottom_button{position:absolute;bottom:0px;height:26px}.greenpanel2 .add_button{position:absolute;bottom:60px;height:26px}.unglued_white{font-size:12px;margin:0px auto 10px auto;padding:5px 0 10px 0;height:58px}.unglued_white p{margin:0}.read_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38;display:block}.read_itbutton span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 30px;color:#73a334;background:url("/static/images/book-panel/book_icon.png") no-repeat 10% center}.read_itbutton span:hover{text-decoration:none}.read_itbutton span:hover{text-decoration:none;color:#3d4e53}.read_itbutton.pledge{background-image:url("/static/images/icons/pledgearrow-green.png");background-repeat:no-repeat;background-position:90% center}.read_itbutton.pledge span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334;background:none}.read_itbutton.pledge span:hover{text-decoration:none}.read_itbutton.pledge span:hover{text-decoration:none;color:#3d4e53}.read_itbutton_fail{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.read_itbutton_fail span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 15px;color:#73a334;background:none}.read_itbutton_fail span:hover{text-decoration:none}.panelview.panelfront.icons .read_itbutton{margin-bottom:7px;height:30px;line-height:30px}.Unglue_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.Unglue_itbutton a{background-image:url("/static/images/book-panel/unglue_icon.png");height:40px;line-height:40px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334}.Unglue_itbutton a:hover{text-decoration:none}.moreinfo.add-wishlist,.moreinfo.create-account{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/add_wish_icon.png") no-repeat left center;padding-right:0}.moreinfo.add-wishlist a,.moreinfo.add-wishlist span,.moreinfo.create-account a,.moreinfo.create-account span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.add-wishlist a:hover,.moreinfo.add-wishlist span:hover,.moreinfo.create-account a:hover,.moreinfo.create-account span:hover{text-decoration:none;color:#3d4e53}.moreinfo.remove-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/booklist/remove-wishlist-white.png") no-repeat left center}.moreinfo.remove-wishlist a,.moreinfo.remove-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.remove-wishlist a:hover,.moreinfo.remove-wishlist span:hover{text-decoration:none;color:#3d4e53}.moreinfo.on-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/checkmark_small-white.png") no-repeat left center}.moreinfo.on-wishlist a,.moreinfo.on-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.on-wishlist a:hover,.moreinfo.on-wishlist span:hover{text-decoration:none;color:#3d4e53}.white_text{width:120px;height:60px;padding:15px 0px;margin:0px}.white_text a{color:#FFF;text-decoration:none}.white_text a:hover{text-decoration:none;color:#3d4e53}.white_text p{line-height:16px;max-height:32px;overflow:hidden;margin:0 0 5px 0}.moreinfo{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/more_icon.png") no-repeat left center;cursor:pointer}.moreinfo a,.moreinfo span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 21px;color:#FFF}.moreinfo a:hover,.moreinfo span:hover{text-decoration:none;color:#3d4e53}.moreinfo>div{height:30px;line-height:30px;padding-bottom:8px}.read{margin:15px auto 5px auto;padding:0px;width:140px;color:#8dc63f;height:40px;line-height:25px;float:left;position:absolute;bottom:-15px}.read p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read img{padding:5px 0px;margin:0px;float:left}.read2{margin:15px auto;padding:0px;width:130px;color:#8dc63f;height:40px;line-height:25px}.read2 p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read2 img{padding:0px;margin:0px;float:left}.right_add{padding:10px;margin:0px;float:right}.panelview.book-thumb{position:relative;margin:0px;padding:0px;left:0px}.panelview.book-thumb img{z-index:100;width:120px;height:182px}.panelview.book-thumb span{position:absolute;bottom:0;left:-10px;top:-5px;z-index:1000;height:auto} +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.buyit{font-size:13pt;color:#8dc63f}#main-wrapper{height:100%;width:725px;margin:0px;padding:0px 0px}.panelview.tabs{padding:5px 0px;margin:0px;width:142px;float:left}.panelview.tabs span.active{padding:15px;margin:15px 0px;font-weight:bold}.panelview.book-list{font-size:12px;width:120px;line-height:16px;margin:auto;padding:0px 5px 5px 5px;height:300px;background-color:#ffffff;color:#3d4e53;border:5px solid #edf3f4;position:relative}.panelview.book-list:hover{color:#3d4e53}.panelview.book-list img{padding:5px 0px;margin:0px}.panelview.book-list .pledge.side1{display:none}.panelview.remove-wishlist,.panelview.on-wishlist,.panelview.create-account,.panelview.add-wishlist{display:none}.panelview.book-name div{font-size:12px;line-height:16px;max-height:32px;color:#3d4e53;overflow:hidden}.panelview.book-name div a{color:#6994a3}.panelview.booklist-status{display:none}.panelview.icons{position:absolute;bottom:-3px;width:140px}.panelview.icons .booklist-status-img{float:left}.panelview.icons .booklist-status-label{position:absolute;color:#8dc63f;padding-left:5px;left:40px;bottom:5px;font-size:17px;margin-bottom:3px}.panelview.icons .panelnope{display:none}.panelview.icons .rounded{margin-bottom:7px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url(% "%sheader-button-%s.png","/static/images/","grey") left bottom repeat-x}.panelview.boolist-ebook a{display:none}div.panelview.side1{display:visible}div.panelview.side2{display:none}.panelback{position:relative}.greenpanel2{font-size:12px;width:120px;line-height:16px;margin:0;padding:10px;height:295px;background-color:#8dc63f;color:#fff;position:absolute;top:-5px;left:-10px}.greenpanel_top{height:135px}.greenpanel2 .button_text{height:30px;line-height:30px}.greenpanel2 .bottom_button{position:absolute;bottom:0px;height:26px}.greenpanel2 .add_button{position:absolute;bottom:60px;height:26px}.unglued_white{font-size:12px;margin:0px auto 10px auto;padding:5px 0 10px 0;height:58px}.unglued_white p{margin:0}.read_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38;display:block}.read_itbutton span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 30px;color:#73a334;background:url("/static/images/book-panel/book_icon.png") no-repeat 10% center}.read_itbutton span:hover{text-decoration:none}.read_itbutton span:hover{text-decoration:none;color:#3d4e53}.read_itbutton.pledge{background-image:url("/static/images/icons/pledgearrow-green.png");background-repeat:no-repeat;background-position:90% center}.read_itbutton.pledge span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334;background:none}.read_itbutton.pledge span:hover{text-decoration:none}.read_itbutton.pledge span:hover{text-decoration:none;color:#3d4e53}.read_itbutton_fail{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.read_itbutton_fail span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 15px;color:#73a334;background:none}.read_itbutton_fail span:hover{text-decoration:none}.panelview.panelfront.icons .read_itbutton{margin-bottom:7px;height:30px;line-height:30px}.Unglue_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.Unglue_itbutton a{background-image:url("/static/images/book-panel/unglue_icon.png");height:40px;line-height:40px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334}.Unglue_itbutton a:hover{text-decoration:none}.moreinfo.add-wishlist,.moreinfo.create-account{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/add_wish_icon.png") no-repeat left center;padding-right:0}.moreinfo.add-wishlist a,.moreinfo.add-wishlist span,.moreinfo.create-account a,.moreinfo.create-account span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.add-wishlist a:hover,.moreinfo.add-wishlist span:hover,.moreinfo.create-account a:hover,.moreinfo.create-account span:hover{text-decoration:none;color:#3d4e53}.moreinfo.remove-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/booklist/remove-wishlist-white.png") no-repeat left center}.moreinfo.remove-wishlist a,.moreinfo.remove-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.remove-wishlist a:hover,.moreinfo.remove-wishlist span:hover{text-decoration:none;color:#3d4e53}.moreinfo.on-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/checkmark_small-white.png") no-repeat left center}.moreinfo.on-wishlist a,.moreinfo.on-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.on-wishlist a:hover,.moreinfo.on-wishlist span:hover{text-decoration:none;color:#3d4e53}.white_text{width:120px;height:60px;padding:15px 0px;margin:0px}.white_text a{color:#FFF;text-decoration:none}.white_text a:hover{text-decoration:none;color:#3d4e53}.white_text p{line-height:16px;max-height:32px;overflow:hidden;margin:0 0 5px 0}.moreinfo{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/more_icon.png") no-repeat left center;cursor:pointer}.moreinfo a,.moreinfo span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 21px;color:#FFF}.moreinfo a:hover,.moreinfo span:hover{text-decoration:none;color:#3d4e53}.moreinfo>div{height:30px;line-height:30px;padding-bottom:8px}.read{margin:15px auto 5px auto;padding:0px;width:140px;color:#8dc63f;height:40px;line-height:25px;float:left;position:absolute;bottom:-15px}.read p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read img{padding:5px 0px;margin:0px;float:left}.read2{margin:15px auto;padding:0px;width:130px;color:#8dc63f;height:40px;line-height:25px}.read2 p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read2 img{padding:0px;margin:0px;float:left}.right_add{padding:10px;margin:0px;float:right}.panelview.book-thumb{position:relative;margin:0px;padding:0px;left:0px}.panelview.book-thumb img{z-index:100;width:120px;height:182px}.panelview.book-thumb span{position:absolute;bottom:0;left:-10px;top:-5px;z-index:1000;height:auto} /*# sourceMappingURL=../../../../../static/scss/book_panel2.css.map */ \ No newline at end of file diff --git a/static/scss/campaign2.css b/static/scss/campaign2.css new file mode 100644 index 00000000..2ec0be11 --- /dev/null +++ b/static/scss/campaign2.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}#tabs{border-bottom:4px solid #6994a3;clear:both;float:left;margin-top:10px;width:100%}#tabs ul.book-list-view{margin-bottom:4px !important}#tabs-1,#tabs-2,#tabs-3,#tabs-4{display:none}#tabs-1.active,#tabs-2.active,#tabs-3.active,#tabs-4.active{display:inherit}#tabs-2 textarea{width:95%}ul.tabs{float:left;padding:0;margin:0;list-style:none;width:100%}ul.tabs li{float:left;height:46px;line-height:20px;padding-right:2px;width:116px;background:none;margin:0;padding:0 2px 0 0}ul.tabs li.tabs4{padding-right:0px}ul.tabs li a{height:41px;line-height:18px;display:block;text-align:center;padding:0 10px;min-width:80px;-moz-border-radius:7px 7px 0 0;-webkit-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;background:#d6dde0;color:#3d4e53;padding-top:5px}ul.tabs li a:hover{text-decoration:none}ul.tabs li a div{padding-top:8px}ul.tabs li a:hover,ul.tabs li.active a{background:#6994a3;color:#fff}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.book-detail{float:left;width:100%;clear:both;display:block}.book-cover{float:left;margin-right:10px;width:151px}.book-cover img{padding:5px;border:solid 5px #edf3f4}.mediaborder{padding:5px;border:solid 5px #edf3f4}.book-detail-info{float:left;width:309px}.book-detail-info h2.book-name,.book-detail-info h3.book-author,.book-detail-info h3.book-year{padding:0;margin:0;line-height:normal}.book-detail-info h2.book-name{font-size:19px;font-weight:bold;color:#3d4e53}.book-detail-info h3.book-author,.book-detail-info h3.book-year{font-size:13px;font-weight:normal;color:#3d4e53}.book-detail-info h3.book-author span a,.book-detail-info h3.book-year span a{font-size:13px;font-weight:normal;color:#6994a3}.book-detail-info>div{width:100%;clear:both;display:block;overflow:hidden;border-top:1px solid #edf3f4;padding:10px 0}.book-detail-info>div.layout{border:none;padding:0}.book-detail-info>div.layout div.pubinfo{float:left;width:auto;padding-bottom:7px}.book-detail-info .btn_wishlist span{text-align:right}.book-detail-info .find-book label{float:left;line-height:31px}.book-detail-info .find-link{float:right}.book-detail-info .find-link img{padding:2px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.book-detail-info .pledged-info{padding:10px 0;position:relative}.book-detail-info .pledged-info.noborder{border-top:none;padding-top:0}.book-detail-info .pledged-info .campaign-status-info{float:left;width:50%;margin-top:13px}.book-detail-info .pledged-info .campaign-status-info span{font-size:15px;color:#6994a3;font-weight:bold}.book-detail-info .thermometer{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;border:solid 2px #d6dde0;width:291px;padding:7px;position:relative;overflow:visible;background:-webkit-gradient(linear, left top, right top, from(#8dc63f), to(#CF6944));background:-webkit-linear-gradient(left, #CF6944, #8dc63f);background:-moz-linear-gradient(left, #CF6944, #8dc63f);background:-ms-linear-gradient(left, #CF6944, #8dc63f);background:-o-linear-gradient(left, #CF6944, #8dc63f);background:linear-gradient(left, #CF6944, #8dc63f);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='$alert', endColorstr='$call-to-action');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='$alert', endColorstr='$call-to-action')"}.book-detail-info .thermometer.successful{border-color:#8ac3d7;background:#edf3f4}.book-detail-info .thermometer .cover{position:absolute;right:0;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;width:50px;height:14px;margin-top:-7px;background:#f3f5f6}.book-detail-info .thermometer span{display:none}.book-detail-info .thermometer:hover span{display:block;position:absolute;z-index:200;right:0;top:-7px;font-size:19px;color:#6994a3;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .explainer span.explanation{display:none}.book-detail-info .explainer:hover span.explanation{display:block;position:absolute;z-index:200;right:0;top:12px;font-size:13px;font-weight:normal;color:#3d4e53;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .status{position:absolute;top:50%;right:0%;height:25px;margin-top:-12px}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px !important;height:28px;line-height:28px !important;margin:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}#js-page-wrap{overflow:hidden}#main-container{margin-top:20px}#js-leftcol .jsmodule,.pledge.jsmodule{margin-bottom:10px}#js-leftcol .jsmodule.rounded .jsmod-content,.pledge.jsmodule.rounded .jsmod-content{-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background:#edf3f4;color:#3d4e53;padding:10px 20px;font-weight:bold;border:none;margin:0;line-height:16px}#js-leftcol .jsmodule.rounded .jsmod-content.ACTIVE,.pledge.jsmodule.rounded .jsmod-content.ACTIVE{background:#8dc63f;color:white;font-size:19px;font-weight:normal;line-height:20px}#js-leftcol .jsmodule.rounded .jsmod-content.No.campaign.yet,.pledge.jsmodule.rounded .jsmod-content.No.campaign.yet{background:#e18551;color:white}#js-leftcol .jsmodule.rounded .jsmod-content span,.pledge.jsmodule.rounded .jsmod-content span{display:inline-block;vertical-align:middle}#js-leftcol .jsmodule.rounded .jsmod-content span.spacer,.pledge.jsmodule.rounded .jsmod-content span.spacer{visibility:none}#js-leftcol .jsmodule.rounded .jsmod-content span.findtheungluers,.pledge.jsmodule.rounded .jsmod-content span.findtheungluers{cursor:pointer}.jsmodule.pledge{float:left;margin-left:10px}#js-slide .jsmodule{width:660px !important}#js-search{margin:0 15px 0 15px !important}.alert>.errorlist{list-style-type:none;font-size:15px;border:none;text-align:left;font-weight:normal;font-size:13px}.alert>.errorlist>li{margin-bottom:14px}.alert>.errorlist .errorlist{margin-top:7px}.alert>.errorlist .errorlist li{width:auto;height:auto;padding-left:32px;padding-right:32px;font-size:13px}#js-maincol{float:left;width:470px;margin:0 10px}#js-maincol div#content-block{background:none;padding:0}.status{font-size:19px;color:#8dc63f}.add-wishlist,.add-wishlist-workpage,.remove-wishlist-workpage,.remove-wishlist,.on-wishlist,.create-account{float:right;cursor:pointer}.add-wishlist span,.add-wishlist-workpage span,.remove-wishlist-workpage span,.remove-wishlist span,.on-wishlist span,.create-account span{font-weight:normal;color:#3d4e53;text-transform:none;padding-left:20px}.add-wishlist span.on-wishlist,.add-wishlist-workpage span.on-wishlist,.remove-wishlist-workpage span.on-wishlist,.remove-wishlist span.on-wishlist,.on-wishlist span.on-wishlist,.create-account span.on-wishlist{background:url("/static/images/checkmark_small.png") left center no-repeat;cursor:default}.btn_wishlist .add-wishlist span,.add-wishlist-workpage span,.create-account span{background:url("/static/images/booklist/add-wishlist.png") left center no-repeat}.remove-wishlist-workpage span,.remove-wishlist span{background:url("/static/images/booklist/remove-wishlist-blue.png") left center no-repeat}div#content-block-content{padding-left:5px}div#content-block-content a{color:#6994a3}div#content-block-content #tabs-1 img{padding:5px;border:solid 5px #edf3f4}div#content-block-content #tabs-3{margin-left:-5px}.tabs-content{padding-right:5px}.tabs-content iframe{padding:5px;border:solid 5px #edf3f4}.tabs-content form{margin-left:-5px}.tabs-content .clearfix{margin-bottom:10px;border-bottom:2px solid #d6dde0}.work_supporter{height:auto;min-height:50px;margin-top:5px;vertical-align:middle}.work_supporter_avatar{float:left;margin-right:5px}.work_supporter_avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.work_supporter_name{height:50px;line-height:50px;float:left}.work_supporter_nocomment{height:50px;margin-top:5px;vertical-align:middle;min-width:235px;float:left}.show_supporter_contact_form{display:block;margin-left:5px;float:right}.supporter_contact_form{display:none;margin-left:5px}.contact_form_result{display:block;margin-left:5px}.work_supporter_wide{display:block;height:65px;margin-top:5px;float:none;margin-left:5px}.info_for_managers{display:block}.show_supporter_contact_form{cursor:pointer;opacity:0.5}.show_supporter_contact_form:hover{cursor:pointer;opacity:1}.official{border:3px #8ac3d7 solid;padding:3px;margin-left:-5px}.editions div{float:left;padding-bottom:5px;margin-bottom:5px}.editions .image{width:60px;overflow:hidden}.editions .metadata{display:block;overflow:hidden;margin-left:5px}.editions a:hover{text-decoration:underline}.show_more_edition,.show_more_ebooks{cursor:pointer}.show_more_edition{text-align:right}.show_more_edition:hover{text-decoration:underline}.more_edition{display:none;clear:both;padding-bottom:10px;padding-left:60px}.more_ebooks{display:none}.show_more_ebooks:hover{text-decoration:underline}#js-rightcol .add-wishlist,#js-rightcol .on-wishlist,#js-rightcol .create-account{float:none}#js-rightcol .on-wishlist{margin-left:20px}#js-rightcol,#pledge-rightcol{float:right;width:235px;margin-bottom:20px}#js-rightcol h3.jsmod-title,#pledge-rightcol h3.jsmod-title{background:#a7c1ca;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px;height:auto;font-style:normal;font-size:15px;margin:0 0 10px 0;color:white}#js-rightcol h3.jsmod-title span,#pledge-rightcol h3.jsmod-title span{padding:0;color:#fff;font-style:normal;height:22px;line-height:22px}#js-rightcol .jsmodule,#pledge-rightcol .jsmodule{margin-bottom:10px}#js-rightcol .jsmodule a:hover,#pledge-rightcol .jsmodule a:hover{text-decoration:none}#pledge-rightcol{margin-top:7px}.js-rightcol-pad{border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}ul.support li{border-bottom:1px solid #d6dde0;padding:10px 5px 10px 10px;background:url("/static/images/icons/pledgearrow.png") 98% center no-repeat}ul.support li.no_link{background:none}ul.support li.last{border-bottom:none}ul.support li span{display:block;padding-right:10px}ul.support li span.menu-item-price{font-size:19px;float:left;display:inline;margin-bottom:3px}ul.support li span.menu-item-desc{float:none;clear:both;font-size:15px;font-weight:normal;line-height:19.5px}ul.support li:hover{color:#fff;background:#8dc63f url("/static/images/icons/pledgearrow-hover.png") 98% center no-repeat}ul.support li:hover a{color:#fff;text-decoration:none}ul.support li:hover.no_link{background:#fff;color:#8dc63f}.you_pledged{float:left;line-height:21px;font-weight:normal;color:#3d4e53;padding-left:20px;background:url("/static/images/checkmark_small.png") left center no-repeat}.thank-you{font-size:19px;font-weight:bold;margin:20px auto}div#libtools{border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px;margin-left:0px;margin-top:1em;padding:10px}div#libtools p{margin-top:0px;margin-bottom:0px}div#libtools span{margin-top:0px;margin-left:0.5em;display:inline-block}div#libtools input[type="submit"]{margin-left:4em} + +/*# sourceMappingURL=../../../../../static/scss/campaign2.css.map */ \ No newline at end of file diff --git a/static/scss/campaign2.scss b/static/scss/campaign2.scss new file mode 100644 index 00000000..c28a0eb1 --- /dev/null +++ b/static/scss/campaign2.scss @@ -0,0 +1,439 @@ +@import "variables.scss"; +@import "campaign_tabs.scss"; +@import "book_detail.scss"; +@import "social_share.scss"; + +/* Page layout */ +#js-page-wrap { + overflow:hidden; +} + +#main-container { + margin-top:20px; +} + +#js-leftcol .jsmodule, .pledge.jsmodule { + margin-bottom:10px; + + &.rounded .jsmod-content { + @include one-border-radius(20px); + background:$pale-blue; + color: $text-blue; + padding:10px 20px; + font-weight:bold; + border:none; + margin:0; + line-height: 16px; + + /* Bubble in upper left looks different depending on campaign status */ + &.ACTIVE { + background: $green; + color: white; + font-size: $font-size-header; + font-weight: normal; + line-height: 20px; + } + + &.No.campaign.yet { + background: $orange; + color: white; + } + + span { + display: inline-block; + vertical-align: middle; + + &.spacer { + visibility: none; + } + + &.findtheungluers { + cursor: pointer; + } + } + } +} + +.jsmodule.pledge { + float: left; + margin-left: 10px; +} + +#js-slide .jsmodule { + width: 660px !important; +} + +#js-search { + margin: 0 15px 0 15px !important; +} + +.alert > .errorlist { + list-style-type: none; + font-size: $font-size-larger; + border: none; + text-align: left; + font-weight: normal; + font-size: $font-size-default; + + > li { + margin-bottom: 14px; + } + + .errorlist { + margin-top: 7px; + + li { + width: auto; + height: auto; + padding-left: 32px; + padding-right: 32px; + font-size: $font-size-default; + } + } +} + +/* Center elements */ +#js-maincol { + float:left; + width:470px; + margin:0 10px; + + div#content-block { + background: none; + padding:0; + } +} + +.status { + font-size: $font-size-header; + color: $green; +} + +/* Center - add/remove actions in book detail area */ +.add-wishlist, .add-wishlist-workpage, .remove-wishlist-workpage, .remove-wishlist, .on-wishlist, .create-account { + float: right; + cursor: pointer; + + span { + font-weight:normal; + color:$text-blue; + text-transform: none; + padding-left:20px; + + &.on-wishlist { + background:url("#{$image-base}checkmark_small.png") left center no-repeat; + cursor: default; + } + } +} + +.btn_wishlist .add-wishlist span, .add-wishlist-workpage span, .create-account span { + background:url("#{$image-base}booklist/add-wishlist.png") left center no-repeat; +} + +.remove-wishlist-workpage span, .remove-wishlist span { + background:url("#{$image-base}booklist/remove-wishlist-blue.png") left center no-repeat; +} + +/* Center - tabs and content below them */ +div#content-block-content { + padding-left: 5px; + + a { + color: $medium-blue; + } + + #tabs-1 img { + @include mediaborder-base; + } + + #tabs-3 { + margin-left: -5px; + } +} + +.tabs-content { + padding-right: 5px; + + iframe { + @include mediaborder-base; + } + + form { + margin-left: -5px; + } + + .clearfix { + margin-bottom: 10px; + border-bottom: 2px solid $blue-grey; + } +} + +.work_supporter { + height: auto; + min-height: 50px; + margin-top: 5px; + vertical-align: middle; +} + +.work_supporter_avatar { + float: left; + margin-right: 5px; + + img { + @include one-border-radius(5px); + } +} + +.work_supporter_name { + @include height(50px); + float: left; +} + +.work_supporter_nocomment { + height: 50px; + margin-top: 5px; + vertical-align: middle; + min-width: 235px; + float: left; +} +.show_supporter_contact_form +{ + display:block; + margin-left: 5px; + float: right; +} +.supporter_contact_form +{ + display:none; + margin-left: 5px; +} +.contact_form_result +{ + display:block; + margin-left: 5px; +} + +.work_supporter_wide +{ + display: block; + height: 65px; + margin-top: 5px; + float: none; + margin-left: 5px; +} +.info_for_managers +{ + display: block; +} +.show_supporter_contact_form +{ + cursor:pointer; + opacity:0.5 + +} +.show_supporter_contact_form:hover +{ + cursor:pointer; + opacity:1 +} +.official { + border: 3px $bright-blue solid; + padding: 3px; + margin-left: -5px; +} + +.editions { + div { + float:left; + padding-bottom: 5px; + margin-bottom: 5px; + } + + .image { + width: 60px; + overflow: hidden; + } + + .metadata { + display:block; + overflow: hidden; + margin-left: 5px; + } + + a:hover { + text-decoration: underline; + } +} + +.show_more_edition, +.show_more_ebooks { + cursor: pointer; +} + +.show_more_edition { + text-align: right; + + &:hover { + text-decoration: underline; + } +} + +.more_edition { + display:none; + clear: both; + padding-bottom: 10px; + padding-left: 60px; +} + +.more_ebooks { + display:none; +} +.show_more_ebooks:hover { + text-decoration: underline; +} + +/* Right column */ + +/* Right - add/remove actions below big green button */ +#js-rightcol { + .add-wishlist, .on-wishlist, .create-account { + float: none; + } + + .on-wishlist { + margin-left: 20px; + } +} + +#js-rightcol, #pledge-rightcol { + float:right; + width:235px; + margin-bottom: 20px; + + h3.jsmod-title { + background:$medium-blue-grey; + @include one-border-radius(10px); + padding:10px; + height:auto; + font-style:normal; + font-size: $font-size-larger; + margin:0 0 10px 0; + color: white; + + span { + padding:0; + color:#fff; + font-style:normal; + @include height(22px); + } + } + + .jsmodule { + margin-bottom:10px; + + a:hover { + text-decoration: none; + } + } +} + +#pledge-rightcol { + margin-top: 7px; +} + +.js-rightcol-pad { + border:1px solid $blue-grey; + @include one-border-radius(10px); + padding:10px; +} + +#widgetcode { + display: none; + border:1px solid $blue-grey; + @include one-border-radius(10px); + padding:10px; +} + +/* Right column - support tiers */ +ul.support li { + border-bottom:1px solid $blue-grey; + padding:10px 5px 10px 10px; + background:url("#{$image-base}icons/pledgearrow.png") 98% center no-repeat; + &.no_link{ + background:none; + } + &.last { + border-bottom: none; + } + + span { + display:block; + padding-right:10px; + + &.menu-item-price { + font-size: $font-size-header; + float: left; + display: inline; + margin-bottom: 3px; + } + + &.menu-item-desc { + float: none; + clear: both; + font-size: $font-size-larger; + font-weight: normal; + line-height: $font-size-larger*1.3; + } + } + + &:hover { + color: #fff; + background:$call-to-action url("#{$image-base}icons/pledgearrow-hover.png") 98% center no-repeat; + a { + color: #fff; + text-decoration: none; + } + &.no_link{ + background:#fff; + color:$call-to-action + } + + } +} + +.you_pledged { + float: left; + line-height: 21px; + font-weight:normal; + color:$text-blue; + padding-left:20px; + background:url("#{$image-base}checkmark_small.png") left center no-repeat; +} + +.thank-you { + font-size: $font-size-header; + font-weight: bold; + margin: 20px auto; +} + +div#libtools { + border:1px solid $blue-grey; + @include one-border-radius(10px); + padding:10px; + margin-left: 0px; + margin-top: 1em; + padding: 10px; + p { + margin-top: 0px; + margin-bottom: 0px; + } + span { + margin-top: 0px; + margin-left: 0.5em ; + display: inline-block; + } + input[type="submit"]{ + margin-left: 4em; + } +} \ No newline at end of file diff --git a/static/scss/campaign_tabs.scss b/static/scss/campaign_tabs.scss new file mode 100644 index 00000000..2d94a73a --- /dev/null +++ b/static/scss/campaign_tabs.scss @@ -0,0 +1,75 @@ +/* Campaign and manage_campaign use same tab styling, so it's factored out here */ + +#tabs{ + border-bottom: 4px solid $medium-blue; + clear: both; + float: left; + margin-top: 10px; + width: 100%; + + ul.book-list-view { + margin-bottom:4px !important; + } +} + +#tabs-1, #tabs-2, #tabs-3, #tabs-4 { + display:none; +} + +#tabs-1.active, #tabs-2.active, #tabs-3.active, #tabs-4.active { + display: inherit; +} + +#tabs-2 textarea { + width: 95%; +} + +ul.tabs { + float:left; + padding:0; + margin:0; + list-style:none; + width: 100%; + + li { + float: left; + height: 46px; + line-height: 20px; + padding-right:2px; + width: 116px; + background: none; + margin: 0; + padding: 0 2px 0 0; + + &.tabs4 { + padding-right:0px; + } + + a { + height: 41px; + line-height: 18px; + display:block; + text-align:center; + padding:0 10px; + min-width:80px; + @include border-radius(7px, 7px, 0, 0); + background:$blue-grey; + color:$text-blue; + padding-top: 5px; + + &:hover { + text-decoration: none; + } + + div { + padding-top: 8px; + } + } + + a:hover, &.active a { + background:$medium-blue; + color:#fff; + } + } + +} \ No newline at end of file diff --git a/static/scss/landingpage4.scss b/static/scss/landingpage4.scss index e9a98685..4b6ec1a9 100644 --- a/static/scss/landingpage4.scss +++ b/static/scss/landingpage4.scss @@ -7,7 +7,7 @@ #main-container.main-container-fl .js-main { width:968px; - background:#fff url("${image-base}landingpage/container-top.png") top center no-repeat; + background:#fff url("#{$image-base}landingpage/container-top.png") top center no-repeat; } #js-maincol-fl { padding:30px 30px 0 30px; @@ -178,7 +178,7 @@ div.signup_btn { overflow:hidden; a { - background: url("${image-base}bg.png") no-repeat scroll right top transparent; + background: url("#{$image-base}bg.png") no-repeat scroll right top transparent; color: #fff; display: block; font-size: $font-size-default; @@ -190,7 +190,7 @@ div.signup_btn { float:left; span { - background: url("${image-base}bg.png") no-repeat scroll -770px -36px transparent; + background: url("#{$image-base}bg.png") no-repeat scroll -770px -36px transparent; display: block; margin-right: 29px; padding: 0 5px 0 15px; diff --git a/static/scss/searchandbrowse2.scss b/static/scss/searchandbrowse2.scss index 6dc7bb9a..cfe1ca2a 100644 --- a/static/scss/searchandbrowse2.scss +++ b/static/scss/searchandbrowse2.scss @@ -26,7 +26,7 @@ form { float:left; width:210px; - background:url("${image-base}landingpage/search-box-two.png") 0 0 no-repeat; + background:url("#{$image-base}landingpage/search-box-two.png") 0 0 no-repeat; height:36px; display:block; overflow:hidden; @@ -41,13 +41,13 @@ a.prev { @include clickyarrows(); - background:url("${image-base}landingpage/arrow-left.png") 0 0 no-repeat; + background:url("#{$image-base}landingpage/arrow-left.png") 0 0 no-repeat; left: 0; } a.next { @include clickyarrows(); - background:url("${image-base}landingpage/arrow-right.png") 0 0 no-repeat; + background:url("#{$image-base}landingpage/arrow-right.png") 0 0 no-repeat; right: 0; } } @@ -72,7 +72,7 @@ } &.greenbutton { - background:url("${image-base}landingpage/search-button-two.png") 0 0 no-repeat; + background:url("#{$image-base}landingpage/search-button-two.png") 0 0 no-repeat; width:40px; height:40px; padding:0; @@ -86,7 +86,7 @@ } #js-slide .jsmodule > h3 { - background:url("${image-base}landingpage/bg-slide.png") bottom center no-repeat; + background:url("#{$image-base}landingpage/bg-slide.png") bottom center no-repeat; padding-bottom:7px; padding-left:35px; diff --git a/static/scss/sitewide4.css b/static/scss/sitewide4.css index 953d5b16..b7fce319 100644 --- a/static/scss/sitewide4.css +++ b/static/scss/sitewide4.css @@ -1,3 +1,3 @@ -@import url(font-awesome.min.css);.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.mediaborder{padding:5px;border:solid 5px #EDF3F4}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.mediaborder{padding:5px;border:solid 5px #EDF3F4}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.mediaborder{padding:5px;border:solid 5px #EDF3F4}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px !important;height:28px;line-height:28px !important;margin:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}.download_container{width:75%;margin:auto}#lightbox_content a{color:#6994a3}#lightbox_content .signuptoday a{color:white}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-top:15px}#lightbox_content h2 a{font-size:18.75px}#lightbox_content .ebook_download a{margin:auto 5px auto 0;font-size:15px}#lightbox_content .ebook_download img{vertical-align:middle}#lightbox_content .logo{font-size:15px}#lightbox_content .logo img{-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;height:50px;width:50px;margin-right:5px}#lightbox_content .one_click,#lightbox_content .ebook_download_container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-left:-.25%;padding:0.5%;padding-bottom:15px;margin-bottom:5px;width:74%}#lightbox_content .one_click h3,#lightbox_content .ebook_download_container h3{margin-top:5px}#lightbox_content .one_click{border:solid 2px #8dc63f}#lightbox_content .ebook_download_container{border:solid 2px #d6dde0}#lightbox_content a.add-wishlist .on-wishlist,#lightbox_content a.success,a.success:hover{text-decoration:none;color:#3d4e53}#lightbox_content a.success,a.success:hover{cursor:default}#lightbox_content ul{padding-left:50px}#lightbox_content ul li{margin-bottom:4px}.border{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 2px #d6dde0;margin:5px auto;padding-right:5px;padding-left:5px}.sharing{float:right;padding:0.5% !important;width:23% !important;min-width:105px}.sharing ul{padding:0.5% !important}.sharing .jsmod-title{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;height:auto}.sharing .jsmod-title span{padding:5% !important;color:white !important;font-style:normal}#widgetcode2{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode2 textarea{max-width:90%}.btn_support.kindle{height:40px}.btn_support.kindle a{width:auto;font-size:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],.btn fieldset[disabled]{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn a.disabled,.btn a fieldset[disabled]{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default:active:focus,.btn-default:active.focus,.btn-default.active:hover,.btn-default.active:focus,.btn-default.active.focus,.open>.btn-default.dropdown-toggle:hover,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#6994a3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],.btn-link fieldset[disabled]{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#496b77;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,.btn-link fieldset[disabled]:hover,.btn-link fieldset[disabled]:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon :first-child{border:none;text-align:center;width:100% !important}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{background-color:#d87a68;color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.btn-adn.dropdown-toggle{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active:hover,.btn-adn:active:focus,.btn-adn:active.focus,.btn-adn.active:hover,.btn-adn.active:focus,.btn-adn.active.focus,.open>.btn-adn.dropdown-toggle:hover,.open>.btn-adn.dropdown-toggle:focus,.open>.btn-adn.dropdown-toggle.focus{color:#fff;background-color:#b94630;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.btn-adn.dropdown-toggle{background-image:none}.btn-adn.disabled:hover,.btn-adn.disabled:focus,.btn-adn.disabled.focus,.btn-adn[disabled]:hover,.btn-adn[disabled]:focus,.btn-adn[disabled].focus,fieldset[disabled] .btn-adn:hover,fieldset[disabled] .btn-adn:focus,fieldset[disabled] .btn-adn.focus{background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{background-color:#205081;color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.btn-bitbucket.dropdown-toggle{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active:hover,.btn-bitbucket:active:focus,.btn-bitbucket:active.focus,.btn-bitbucket.active:hover,.btn-bitbucket.active:focus,.btn-bitbucket.active.focus,.open>.btn-bitbucket.dropdown-toggle:hover,.open>.btn-bitbucket.dropdown-toggle:focus,.open>.btn-bitbucket.dropdown-toggle.focus{color:#fff;background-color:#0f253c;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.btn-bitbucket.dropdown-toggle{background-image:none}.btn-bitbucket.disabled:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket.disabled.focus,.btn-bitbucket[disabled]:hover,.btn-bitbucket[disabled]:focus,.btn-bitbucket[disabled].focus,fieldset[disabled] .btn-bitbucket:hover,fieldset[disabled] .btn-bitbucket:focus,fieldset[disabled] .btn-bitbucket.focus{background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{background-color:#1087dd;color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.btn-dropbox.dropdown-toggle{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active:hover,.btn-dropbox:active:focus,.btn-dropbox:active.focus,.btn-dropbox.active:hover,.btn-dropbox.active:focus,.btn-dropbox.active.focus,.open>.btn-dropbox.dropdown-toggle:hover,.open>.btn-dropbox.dropdown-toggle:focus,.open>.btn-dropbox.dropdown-toggle.focus{color:#fff;background-color:#0a568c;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.btn-dropbox.dropdown-toggle{background-image:none}.btn-dropbox.disabled:hover,.btn-dropbox.disabled:focus,.btn-dropbox.disabled.focus,.btn-dropbox[disabled]:hover,.btn-dropbox[disabled]:focus,.btn-dropbox[disabled].focus,fieldset[disabled] .btn-dropbox:hover,fieldset[disabled] .btn-dropbox:focus,fieldset[disabled] .btn-dropbox.focus{background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{background-color:#3b5998;color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.btn-facebook.dropdown-toggle{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active:hover,.btn-facebook:active:focus,.btn-facebook:active.focus,.btn-facebook.active:hover,.btn-facebook.active:focus,.btn-facebook.active.focus,.open>.btn-facebook.dropdown-toggle:hover,.open>.btn-facebook.dropdown-toggle:focus,.open>.btn-facebook.dropdown-toggle.focus{color:#fff;background-color:#23345a;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.btn-facebook.dropdown-toggle{background-image:none}.btn-facebook.disabled:hover,.btn-facebook.disabled:focus,.btn-facebook.disabled.focus,.btn-facebook[disabled]:hover,.btn-facebook[disabled]:focus,.btn-facebook[disabled].focus,fieldset[disabled] .btn-facebook:hover,fieldset[disabled] .btn-facebook:focus,fieldset[disabled] .btn-facebook.focus{background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{background-color:#ff0084;color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.btn-flickr.dropdown-toggle{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active:hover,.btn-flickr:active:focus,.btn-flickr:active.focus,.btn-flickr.active:hover,.btn-flickr.active:focus,.btn-flickr.active.focus,.open>.btn-flickr.dropdown-toggle:hover,.open>.btn-flickr.dropdown-toggle:focus,.open>.btn-flickr.dropdown-toggle.focus{color:#fff;background-color:#a80057;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.btn-flickr.dropdown-toggle{background-image:none}.btn-flickr.disabled:hover,.btn-flickr.disabled:focus,.btn-flickr.disabled.focus,.btn-flickr[disabled]:hover,.btn-flickr[disabled]:focus,.btn-flickr[disabled].focus,fieldset[disabled] .btn-flickr:hover,fieldset[disabled] .btn-flickr:focus,fieldset[disabled] .btn-flickr.focus{background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{background-color:#f94877;color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.btn-foursquare.dropdown-toggle{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active:hover,.btn-foursquare:active:focus,.btn-foursquare:active.focus,.btn-foursquare.active:hover,.btn-foursquare.active:focus,.btn-foursquare.active.focus,.open>.btn-foursquare.dropdown-toggle:hover,.open>.btn-foursquare.dropdown-toggle:focus,.open>.btn-foursquare.dropdown-toggle.focus{color:#fff;background-color:#e30742;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.btn-foursquare.dropdown-toggle{background-image:none}.btn-foursquare.disabled:hover,.btn-foursquare.disabled:focus,.btn-foursquare.disabled.focus,.btn-foursquare[disabled]:hover,.btn-foursquare[disabled]:focus,.btn-foursquare[disabled].focus,fieldset[disabled] .btn-foursquare:hover,fieldset[disabled] .btn-foursquare:focus,fieldset[disabled] .btn-foursquare.focus{background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{background-color:#444;color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.btn-github.dropdown-toggle{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active:hover,.btn-github:active:focus,.btn-github:active.focus,.btn-github.active:hover,.btn-github.active:focus,.btn-github.active.focus,.open>.btn-github.dropdown-toggle:hover,.open>.btn-github.dropdown-toggle:focus,.open>.btn-github.dropdown-toggle.focus{color:#fff;background-color:#191919;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.btn-github.dropdown-toggle{background-image:none}.btn-github.disabled:hover,.btn-github.disabled:focus,.btn-github.disabled.focus,.btn-github[disabled]:hover,.btn-github[disabled]:focus,.btn-github[disabled].focus,fieldset[disabled] .btn-github:hover,fieldset[disabled] .btn-github:focus,fieldset[disabled] .btn-github.focus{background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github .badge{color:#444;background-color:#fff}.btn-google-plus{background-color:#dd4b39;color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus:focus,.btn-google-plus.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.btn-google-plus.dropdown-toggle{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active:hover,.btn-google-plus:active:focus,.btn-google-plus:active.focus,.btn-google-plus.active:hover,.btn-google-plus.active:focus,.btn-google-plus.active.focus,.open>.btn-google-plus.dropdown-toggle:hover,.open>.btn-google-plus.dropdown-toggle:focus,.open>.btn-google-plus.dropdown-toggle.focus{color:#fff;background-color:#a32b1c;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.btn-google-plus.dropdown-toggle{background-image:none}.btn-google-plus.disabled:hover,.btn-google-plus.disabled:focus,.btn-google-plus.disabled.focus,.btn-google-plus[disabled]:hover,.btn-google-plus[disabled]:focus,.btn-google-plus[disabled].focus,fieldset[disabled] .btn-google-plus:hover,fieldset[disabled] .btn-google-plus:focus,fieldset[disabled] .btn-google-plus.focus{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus .badge{color:#dd4b39;background-color:#fff}.btn-instagram{background-color:#3f729b;color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.btn-instagram.dropdown-toggle{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active:hover,.btn-instagram:active:focus,.btn-instagram:active.focus,.btn-instagram.active:hover,.btn-instagram.active:focus,.btn-instagram.active.focus,.open>.btn-instagram.dropdown-toggle:hover,.open>.btn-instagram.dropdown-toggle:focus,.open>.btn-instagram.dropdown-toggle.focus{color:#fff;background-color:#26455d;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.btn-instagram.dropdown-toggle{background-image:none}.btn-instagram.disabled:hover,.btn-instagram.disabled:focus,.btn-instagram.disabled.focus,.btn-instagram[disabled]:hover,.btn-instagram[disabled]:focus,.btn-instagram[disabled].focus,fieldset[disabled] .btn-instagram:hover,fieldset[disabled] .btn-instagram:focus,fieldset[disabled] .btn-instagram.focus{background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{background-color:#007bb6;color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.btn-linkedin.dropdown-toggle{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active:hover,.btn-linkedin:active:focus,.btn-linkedin:active.focus,.btn-linkedin.active:hover,.btn-linkedin.active:focus,.btn-linkedin.active.focus,.open>.btn-linkedin.dropdown-toggle:hover,.open>.btn-linkedin.dropdown-toggle:focus,.open>.btn-linkedin.dropdown-toggle.focus{color:#fff;background-color:#00405f;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.btn-linkedin.dropdown-toggle{background-image:none}.btn-linkedin.disabled:hover,.btn-linkedin.disabled:focus,.btn-linkedin.disabled.focus,.btn-linkedin[disabled]:hover,.btn-linkedin[disabled]:focus,.btn-linkedin[disabled].focus,fieldset[disabled] .btn-linkedin:hover,fieldset[disabled] .btn-linkedin:focus,fieldset[disabled] .btn-linkedin.focus{background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{background-color:#2672ec;color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.btn-microsoft.dropdown-toggle{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active:hover,.btn-microsoft:active:focus,.btn-microsoft:active.focus,.btn-microsoft.active:hover,.btn-microsoft.active:focus,.btn-microsoft.active.focus,.open>.btn-microsoft.dropdown-toggle:hover,.open>.btn-microsoft.dropdown-toggle:focus,.open>.btn-microsoft.dropdown-toggle.focus{color:#fff;background-color:#0f4bac;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.btn-microsoft.dropdown-toggle{background-image:none}.btn-microsoft.disabled:hover,.btn-microsoft.disabled:focus,.btn-microsoft.disabled.focus,.btn-microsoft[disabled]:hover,.btn-microsoft[disabled]:focus,.btn-microsoft[disabled].focus,fieldset[disabled] .btn-microsoft:hover,fieldset[disabled] .btn-microsoft:focus,fieldset[disabled] .btn-microsoft.focus{background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{background-color:#f7931e;color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.btn-openid.dropdown-toggle{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active:hover,.btn-openid:active:focus,.btn-openid:active.focus,.btn-openid.active:hover,.btn-openid.active:focus,.btn-openid.active.focus,.open>.btn-openid.dropdown-toggle:hover,.open>.btn-openid.dropdown-toggle:focus,.open>.btn-openid.dropdown-toggle.focus{color:#fff;background-color:#b86607;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.btn-openid.dropdown-toggle{background-image:none}.btn-openid.disabled:hover,.btn-openid.disabled:focus,.btn-openid.disabled.focus,.btn-openid[disabled]:hover,.btn-openid[disabled]:focus,.btn-openid[disabled].focus,fieldset[disabled] .btn-openid:hover,fieldset[disabled] .btn-openid:focus,fieldset[disabled] .btn-openid.focus{background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{background-color:#cb2027;color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.btn-pinterest.dropdown-toggle{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active:hover,.btn-pinterest:active:focus,.btn-pinterest:active.focus,.btn-pinterest.active:hover,.btn-pinterest.active:focus,.btn-pinterest.active.focus,.open>.btn-pinterest.dropdown-toggle:hover,.open>.btn-pinterest.dropdown-toggle:focus,.open>.btn-pinterest.dropdown-toggle.focus{color:#fff;background-color:#801419;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.btn-pinterest.dropdown-toggle{background-image:none}.btn-pinterest.disabled:hover,.btn-pinterest.disabled:focus,.btn-pinterest.disabled.focus,.btn-pinterest[disabled]:hover,.btn-pinterest[disabled]:focus,.btn-pinterest[disabled].focus,fieldset[disabled] .btn-pinterest:hover,fieldset[disabled] .btn-pinterest:focus,fieldset[disabled] .btn-pinterest.focus{background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{background-color:#eff7ff;color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcdeff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcdeff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.btn-reddit.dropdown-toggle{color:#000;background-color:#bcdeff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active:hover,.btn-reddit:active:focus,.btn-reddit:active.focus,.btn-reddit.active:hover,.btn-reddit.active:focus,.btn-reddit.active.focus,.open>.btn-reddit.dropdown-toggle:hover,.open>.btn-reddit.dropdown-toggle:focus,.open>.btn-reddit.dropdown-toggle.focus{color:#000;background-color:#98ccff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.btn-reddit.dropdown-toggle{background-image:none}.btn-reddit.disabled:hover,.btn-reddit.disabled:focus,.btn-reddit.disabled.focus,.btn-reddit[disabled]:hover,.btn-reddit[disabled]:focus,.btn-reddit[disabled].focus,fieldset[disabled] .btn-reddit:hover,fieldset[disabled] .btn-reddit:focus,fieldset[disabled] .btn-reddit.focus{background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{background-color:#f50;color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.btn-soundcloud.dropdown-toggle{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active:hover,.btn-soundcloud:active:focus,.btn-soundcloud:active.focus,.btn-soundcloud.active:hover,.btn-soundcloud.active:focus,.btn-soundcloud.active.focus,.open>.btn-soundcloud.dropdown-toggle:hover,.open>.btn-soundcloud.dropdown-toggle:focus,.open>.btn-soundcloud.dropdown-toggle.focus{color:#fff;background-color:#a83800;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.btn-soundcloud.dropdown-toggle{background-image:none}.btn-soundcloud.disabled:hover,.btn-soundcloud.disabled:focus,.btn-soundcloud.disabled.focus,.btn-soundcloud[disabled]:hover,.btn-soundcloud[disabled]:focus,.btn-soundcloud[disabled].focus,fieldset[disabled] .btn-soundcloud:hover,fieldset[disabled] .btn-soundcloud:focus,fieldset[disabled] .btn-soundcloud.focus{background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{background-color:#2c4762;color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2e3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2e3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.btn-tumblr.dropdown-toggle{color:#fff;background-color:#1c2e3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active:hover,.btn-tumblr:active:focus,.btn-tumblr:active.focus,.btn-tumblr.active:hover,.btn-tumblr.active:focus,.btn-tumblr.active.focus,.open>.btn-tumblr.dropdown-toggle:hover,.open>.btn-tumblr.dropdown-toggle:focus,.open>.btn-tumblr.dropdown-toggle.focus{color:#fff;background-color:#111c26;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.btn-tumblr.dropdown-toggle{background-image:none}.btn-tumblr.disabled:hover,.btn-tumblr.disabled:focus,.btn-tumblr.disabled.focus,.btn-tumblr[disabled]:hover,.btn-tumblr[disabled]:focus,.btn-tumblr[disabled].focus,fieldset[disabled] .btn-tumblr:hover,fieldset[disabled] .btn-tumblr:focus,fieldset[disabled] .btn-tumblr.focus{background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{background-color:#55acee;color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.btn-twitter.dropdown-toggle{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active:hover,.btn-twitter:active:focus,.btn-twitter:active.focus,.btn-twitter.active:hover,.btn-twitter.active:focus,.btn-twitter.active.focus,.open>.btn-twitter.dropdown-toggle:hover,.open>.btn-twitter.dropdown-toggle:focus,.open>.btn-twitter.dropdown-toggle.focus{color:#fff;background-color:#1583d7;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.btn-twitter.dropdown-toggle{background-image:none}.btn-twitter.disabled:hover,.btn-twitter.disabled:focus,.btn-twitter.disabled.focus,.btn-twitter[disabled]:hover,.btn-twitter[disabled]:focus,.btn-twitter[disabled].focus,fieldset[disabled] .btn-twitter:hover,fieldset[disabled] .btn-twitter:focus,fieldset[disabled] .btn-twitter.focus{background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{background-color:#1ab7ea;color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.btn-vimeo.dropdown-toggle{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active:hover,.btn-vimeo:active:focus,.btn-vimeo:active.focus,.btn-vimeo.active:hover,.btn-vimeo.active:focus,.btn-vimeo.active.focus,.open>.btn-vimeo.dropdown-toggle:hover,.open>.btn-vimeo.dropdown-toggle:focus,.open>.btn-vimeo.dropdown-toggle.focus{color:#fff;background-color:#0f7b9f;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.btn-vimeo.dropdown-toggle{background-image:none}.btn-vimeo.disabled:hover,.btn-vimeo.disabled:focus,.btn-vimeo.disabled.focus,.btn-vimeo[disabled]:hover,.btn-vimeo[disabled]:focus,.btn-vimeo[disabled].focus,fieldset[disabled] .btn-vimeo:hover,fieldset[disabled] .btn-vimeo:focus,fieldset[disabled] .btn-vimeo.focus{background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{background-color:#587ea3;color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.btn-vk.dropdown-toggle{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active:hover,.btn-vk:active:focus,.btn-vk:active.focus,.btn-vk.active:hover,.btn-vk.active:focus,.btn-vk.active.focus,.open>.btn-vk.dropdown-toggle:hover,.open>.btn-vk.dropdown-toggle:focus,.open>.btn-vk.dropdown-toggle.focus{color:#fff;background-color:#3a526b;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.btn-vk.dropdown-toggle{background-image:none}.btn-vk.disabled:hover,.btn-vk.disabled:focus,.btn-vk.disabled.focus,.btn-vk[disabled]:hover,.btn-vk[disabled]:focus,.btn-vk[disabled].focus,fieldset[disabled] .btn-vk:hover,fieldset[disabled] .btn-vk:focus,fieldset[disabled] .btn-vk.focus{background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{background-color:#720e9e;color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.btn-yahoo.dropdown-toggle{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active:hover,.btn-yahoo:active:focus,.btn-yahoo:active.focus,.btn-yahoo.active:hover,.btn-yahoo.active:focus,.btn-yahoo.active.focus,.open>.btn-yahoo.dropdown-toggle:hover,.open>.btn-yahoo.dropdown-toggle:focus,.open>.btn-yahoo.dropdown-toggle.focus{color:#fff;background-color:#39074e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.btn-yahoo.dropdown-toggle{background-image:none}.btn-yahoo.disabled:hover,.btn-yahoo.disabled:focus,.btn-yahoo.disabled.focus,.btn-yahoo[disabled]:hover,.btn-yahoo[disabled]:focus,.btn-yahoo[disabled].focus,fieldset[disabled] .btn-yahoo:hover,fieldset[disabled] .btn-yahoo:focus,fieldset[disabled] .btn-yahoo.focus{background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.launch_top{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;border-color:#8dc63f;margin:10px auto 0 auto;font-size:15px;line-height:22.5px}.launch_top a{color:#8dc63f}.launch_top.pale{border-color:#d6dde0;font-size:13px}.launch_top.alert{border-color:#e35351;font-size:13px}.preview_content{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;width:80%;margin:10px auto}.preview_content a{color:#8dc63f}html,body{height:100%}body{background:url("/static/images/bg-body.png") 0 0 repeat-x;padding:0 0 20px 0;margin:0;font-size:13px;line-height:16.9px;font-family:"Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Arial, Helvetica, sans-serif;color:#3d4e53}#feedback{position:fixed;bottom:10%;right:0;z-index:500}#feedback p{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);white-space:nowrap;display:block;bottom:0;width:160px;height:32px;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;background:#8dc63f;margin-bottom:0;text-align:center;margin-right:-67px;line-height:normal}#feedback p a{color:white;font-size:24px;font-weight:normal}#feedback p a:hover{color:#3d4e53}a{font-weight:bold;font-size:inherit;text-decoration:none;cursor:pointer;color:#6994a3}a:hover{text-decoration:underline}h1{font-size:22.5px}h2{font-size:18.75px}h3{font-size:17.55px}h4{font-size:15px}img{border:none}img.user-avatar{float:left;margin-right:10px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px}input,textarea,a.fakeinput{border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}input:focus,textarea:focus,a.fakeinput:focus{border:2px solid #8dc63f;outline:none}a.fakeinput:hover{text-decoration:none}.js-search input{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}h2.content-heading{padding:15px;margin:0;font-size:19px;font-weight:normal;color:#3d4e53;float:left;width:50%}h2.content-heading span{font-style:italic}h3.jsmod-title{-moz-border-radius:8px 8px 0 0;-webkit-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0;background:#edf3f4;padding:0;margin:0;height:2.3em}h3.jsmod-title span{font-size:19px;font-style:italic;color:#3d4e53;padding:0.7em 2em 0.5em 2em;display:block}input[type="submit"],a.fakeinput{background:#8dc63f;color:white;font-weight:bold;padding:0.5em 1em;cursor:pointer}.loader-gif[disabled="disabled"],.loader-gif.show-loading{background:url("/static/images/loading.gif") center no-repeat !important}.js-page-wrap{position:relative;min-height:100%}.js-main{width:960px;margin:0 auto;clear:both;padding:0}.bigger{font-size:15px}ul.menu{list-style:none;padding:0;margin:0}.errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errorlist li{list-style:none;border:none}.errorlist+input{border:2px solid #e35351 !important}.errorlist+input:focus{border:1px solid #8dc63f !important}.errorlist+textarea{border:2px solid #e35351 !important}.errorlist+textarea:focus{border:2px solid #8dc63f !important}.p_form .errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:none;color:#e35351;clear:none;width:100%;height:auto;line-height:16px;padding:0;font-weight:normal;text-align:left;display:inline}.p_form .errorlist li{display:inline}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}#js-header{height:90px}.js-logo{float:left;padding-top:10px}.js-logo a img{border:none}.js-topmenu{float:right;margin-top:25px;font-size:15px}.js-topmenu#authenticated{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:36px}.js-topmenu#authenticated:hover,.js-topmenu#authenticated.highlight{background:#d6dde0;cursor:pointer;position:relative}.js-topmenu ul#user_menu{white-space:nowrap;display:none;z-index:100;position:absolute;top:36px;left:0;padding:0;overflow:visible;margin:0}.js-topmenu ul#user_menu li{border-top:1px solid white;list-style-type:none;float:none;background:#d6dde0;padding:7px 10px}.js-topmenu ul#user_menu li:hover{background:#8dc63f}.js-topmenu ul#user_menu li:hover a{color:white}.js-topmenu ul#user_menu li:hover #i_haz_notifications{border-color:white;background-color:white;color:#3d4e53}.js-topmenu ul#user_menu li a{height:auto;line-height:26.25px}.js-topmenu ul#user_menu li span{margin-right:10px}.js-topmenu ul li{float:left;position:relative;z-index:50}.js-topmenu ul li .notbutton{color:#3d4e53;line-height:36px}.js-topmenu ul li a{display:block;text-decoration:none;font-weight:bold;letter-spacing:-.05em}.js-topmenu ul li span#welcome{display:block;text-decoration:none;font-weight:bold;letter-spacing:-.05em;padding:0 10px}.js-topmenu ul li img{padding:0;margin:0}.js-topmenu ul li.last{padding-left:20px}.js-topmenu ul li.last a span{-moz-border-radius:32px 0 0 32px;-webkit-border-radius:32px 0 0 32px;border-radius:32px 0 0 32px;background-color:#8dc63f;margin-right:29px;display:block;padding:0 5px 0 15px;color:white}.js-topmenu ul .unseen_count{border:solid 2px;-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;padding:3px;line-height:16px;width:16px;cursor:pointer;text-align:center}.js-topmenu ul .unseen_count#i_haz_notifications{background-color:#8dc63f;color:white;border-color:white}.js-topmenu ul .unseen_count#no_notifications_for_you{border-color:#edf3f4;background-color:#edf3f4;color:#3d4e53}.btn-signup{color:#fff;background-color:#8dc63f;border-color:#ccc}.btn-signup:focus,.btn-signup.focus{color:#fff;background-color:#72a230;border-color:#8c8c8c}.btn-signup:hover{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active,.btn-signup.active,.open>.btn-signup.dropdown-toggle{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active:hover,.btn-signup:active:focus,.btn-signup:active.focus,.btn-signup.active:hover,.btn-signup.active:focus,.btn-signup.active.focus,.open>.btn-signup.dropdown-toggle:hover,.open>.btn-signup.dropdown-toggle:focus,.open>.btn-signup.dropdown-toggle.focus{color:#fff;background-color:#5f8628;border-color:#8c8c8c}.btn-signup:active,.btn-signup.active,.open>.btn-signup.dropdown-toggle{background-image:none}.btn-signup.disabled:hover,.btn-signup.disabled:focus,.btn-signup.disabled.focus,.btn-signup[disabled]:hover,.btn-signup[disabled]:focus,.btn-signup[disabled].focus,fieldset[disabled] .btn-signup:hover,fieldset[disabled] .btn-signup:focus,fieldset[disabled] .btn-signup.focus{background-color:#8dc63f;border-color:#ccc}.btn-signup .badge{color:#8dc63f;background-color:#fff}.btn-readon{color:#fff;background-color:#8ac3d7;border-color:#ccc}.btn-readon:focus,.btn-readon.focus{color:#fff;background-color:#64b0ca;border-color:#8c8c8c}.btn-readon:hover{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active,.btn-readon.active,.open>.btn-readon.dropdown-toggle{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active:hover,.btn-readon:active:focus,.btn-readon:active.focus,.btn-readon.active:hover,.btn-readon.active:focus,.btn-readon.active.focus,.open>.btn-readon.dropdown-toggle:hover,.open>.btn-readon.dropdown-toggle:focus,.open>.btn-readon.dropdown-toggle.focus{color:#fff;background-color:#49a2c1;border-color:#8c8c8c}.btn-readon:active,.btn-readon.active,.open>.btn-readon.dropdown-toggle{background-image:none}.btn-readon.disabled:hover,.btn-readon.disabled:focus,.btn-readon.disabled.focus,.btn-readon[disabled]:hover,.btn-readon[disabled]:focus,.btn-readon[disabled].focus,fieldset[disabled] .btn-readon:hover,fieldset[disabled] .btn-readon:focus,fieldset[disabled] .btn-readon.focus{background-color:#8ac3d7;border-color:#ccc}.btn-readon .badge{color:#8ac3d7;background-color:#fff}#i_haz_notifications_badge{-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;font-size:13px;border:solid 2px white;margin-left:-7px;margin-top:-10px;padding:3px;background:#8dc63f;color:white;position:absolute;line-height:normal}form.login label,#login form label{display:block;line-height:20px;font-size:15px}form.login input,#login form input{width:90%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0;height:18px;line-height:18px;margin-bottom:6px}form.login input[type=submit],#login form input[type=submit]{text-decoration:capitalize;width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}form.login input:focus,#login form input:focus{border:solid 1px #8dc63f}form.login input[type="text"],form.login input[type="password"],#login form input[type="text"],#login form input[type="password"]{height:22.75px;line-height:22.75px;margin-bottom:13px;border-width:2px}form.login input[type="submit"],#login form input[type="submit"]{font-size:15px}form.login span.helptext,#login form span.helptext{display:block;margin-top:-11px;font-style:italic;font-size:13px}#lightbox_content a.btn{color:#FFF}.js-search{float:left;padding-top:25px;margin-left:81px}.js-search input{float:left}.js-search .inputbox{padding:0 0 0 15px;margin:0;border-top:solid 4px #8ac3d7;border-left:solid 4px #8ac3d7;border-bottom:solid 4px #8ac3d7;border-right:none;-moz-border-radius:50px 0 0 50px;-webkit-border-radius:50px 0 0 50px;border-radius:50px 0 0 50px;outline:none;height:28px;line-height:28px;width:156px;float:left;color:#6994a3}.js-search .button{background:url("/static/images/blue-search-button.png") no-repeat;padding:0;margin:0;width:40px;height:36px;display:block;border:none;text-indent:-10000px;cursor:pointer}.js-search-inner{float:right}#locationhash{display:none}#block-intro-text{padding-right:10px}#block-intro-text span.def{font-style:italic}a#readon{color:#fff;text-transform:capitalize;display:block;float:right;font-size:13px;font-weight:bold}.spread_the_word{height:24px;width:24px;position:top;margin-left:5px}#js-leftcol{float:left;width:235px;margin-bottom:20px}#js-leftcol a{font-weight:normal}#js-leftcol a:hover{text-decoration:underline}#js-leftcol .jsmod-content{border:solid 1px #edf3f4;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px}#js-leftcol ul.level1>li>a,#js-leftcol ul.level1>li>span{border-bottom:1px solid #edf3f4;border-top:1px solid #edf3f4;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:10px}#js-leftcol ul.level2 li{padding:5px 20px}#js-leftcol ul.level2 li a{color:#6994a3;font-size:15px}#js-leftcol ul.level2 li img{vertical-align:middle;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}#js-leftcol ul.level2 li .ungluer-name{height:30px;line-height:30px}#js-leftcol ul.level2 li.first{font-size:15px;color:#3d4e53;padding-left:10px}#js-leftcol ul.level3 li{padding:0px 20px}#js-leftcol ul.level3 li a{color:#6994a3;font-size:15px}#js-topsection{padding:15px 0 0 0;overflow:hidden}.js-topnews{float:left;width:100%}.js-topnews1{background:url("/static/images/header/header-m.png") 0 0 repeat-y}.js-topnews2{background:url("/static/images/header/header-t.png") 0 0 no-repeat}.js-topnews3{background:url("/static/images/header/header-b.png") 0 100% no-repeat;display:block;overflow:hidden;padding:10px}#main-container{margin:15px 0 0 0}#js-maincol-fr{float:right;width:725px}div#content-block{overflow:hidden;background:url("/static/images/bg.png") 100% -223px no-repeat;padding:0 0 0 7px;margin-bottom:20px}div#content-block.jsmodule{background:none}.content-block-heading a.block-link{float:right;padding:15px;font-size:13px;color:#3d4e53;text-decoration:underline;font-weight:normal}div#content-block-content,div#content-block-content-1{width:100%;overflow:hidden;padding-left:10px}div#content-block-content .cols3 .column,div#content-block-content-1 .cols3 .column{width:33.33%;float:left}#footer{background-color:#edf3f4;clear:both;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:15px 0px 45px 0px;margin-top:15px;overflow:hidden}#footer .column{float:left;width:25%;padding-top:5px}#footer .column ul{padding-top:5px;margin-left:0;padding-left:0}#footer .column li{padding:5px 0;text-transform:none;list-style:none;margin-left:0}#footer .column li a{color:#6994a3;font-size:15px}.pagination{width:100%;text-align:center;margin-top:20px;clear:both;border-top:solid #3d4e53 thin;padding-top:7px}.pagination .endless_page_link{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px}.pagination .endless_page_current{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px;background-color:#edf3f4}a.nounderline{text-decoration:none}.slides_control{height:325px !important}#about_expandable{display:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;background:white;z-index:500;top:25%;padding:9px;max-width:90%}#about_expandable .collapser_x{margin-top:-27px;margin-right:-27px}#lightbox_content p,#lightbox_content li{padding:9px 0;font-size:15px;line-height:20px}#lightbox_content p a,#lightbox_content li a{font-size:15px;line-height:20px}#lightbox_content p b,#lightbox_content li b{color:#8dc63f}#lightbox_content p.last,#lightbox_content li.last{border-bottom:solid 2px #d6dde0;margin-bottom:5px}#lightbox_content .right_border{border-right:solid 1px #d6dde0;float:left;padding:9px}#lightbox_content .signuptoday{float:right;margin-top:0;clear:none}#lightbox_content h2+form,#lightbox_content h3+form,#lightbox_content h4+form{margin-top:15px}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-bottom:10px}.nonlightbox .about_page{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;width:75%;margin:10px auto auto auto;padding:9px}.collapser_x{float:right;height:24px;line-height:24px;width:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px;-moz-box-shadow:-1px 1px #3d4e53;-webkit-box-shadow:-1px 1px #3d4e53;box-shadow:-1px 1px #3d4e53;border:solid 3px white;text-align:center;color:white;background:#3d4e53;font-size:17px;z-index:5000;margin-top:-12px;margin-right:-22px}.signuptoday{padding:0 15px;height:36px;line-height:36px;float:left;clear:both;margin:10px auto;cursor:pointer;font-style:normal}.signuptoday a{padding-right:17px;color:white}.signuptoday a:hover{text-decoration:none}.central{width:480px;margin:0 auto}li.checked{list-style-type:none;background:transparent url(/static/images/checkmark_small.png) no-repeat 0 0;margin-left:-20px;padding-left:20px}.btn_support{margin:10px;width:215px}.btn_support a,.btn_support form input,.btn_support>span{font-size:22px;border:4px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;display:block;text-align:center;padding-top:14.25px;padding-bottom:14.25px;background-color:#8dc63f;color:white !important}.btn_support a span,.btn_support form input span,.btn_support>span span{color:white !important;font-weight:bold;padding-left:0;margin-left:0 !important;background:none}.btn_support.create-account span{padding:0;margin:0;background:none}.btn_support a:hover,.btn_support form input:hover{background-color:#7aae34;text-decoration:none}.btn_support a{width:207px}.btn_support form input{width:215px}.btn_support.modify a,.btn_support.modify form input{background-color:#a7c1ca}.btn_support.modify a:hover,.btn_support.modify form input:hover{background-color:#91b1bd}.instructions h4{border-top:solid #d6dde0 1px;border-bottom:solid #d6dde0 1px;padding:0.5em 0}.instructions>div{padding-left:1%;padding-right:1%;font-size:15px;line-height:22.5px;width:98%}.instructions>div.active{float:left}.one_click{float:left}.one_click>div{float:left}.one_click>div #kindle a,.one_click>div .kindle a,.one_click>div #marvin a,.one_click>div .marvin a,.one_click>div #mac_ibooks a,.one_click>div .mac_ibooks a{font-size:15px;padding:9px 0}.one_click>div div{margin:0 10px 0 0}.ebook_download_container{clear:left}.other_instructions_paragraph{display:none}#iOS_app_div,#ios_div{display:none}.yes_js{display:none}.std_form,.std_form input,.std_form select{line-height:30px;font-size:15px}.contrib_amount{padding:10px;font-size:19px;text-align:center}#id_preapproval_amount{width:50%;line-height:30px;font-size:15px}#askblock{float:right;min-width:260px;background:#edf3f4;padding:10px;width:30%}.rh_ask{font-size:15px;width:65%}#contribsubmit{text-align:center;font-size:19px;margin:0 0 10px;cursor:pointer}#anoncontribbox{padding-bottom:10px}.faq_tldr{font-style:italic;font-size:19px;text-align:center;line-height:24.7px;color:#6994a3;margin-left:2em}.deletebutton,input[type='submit'].deletebutton{height:20px;padding:.2em .6em;background-color:lightgray;margin-left:1em;color:white;font-weight:bold;cursor:pointer} +@import url(font-awesome.min.css);.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px !important;height:28px;line-height:28px !important;margin:0 !important;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}.download_container{width:75%;margin:auto}#lightbox_content a{color:#6994a3}#lightbox_content .signuptoday a{color:white}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-top:15px}#lightbox_content h2 a{font-size:18.75px}#lightbox_content .ebook_download a{margin:auto 5px auto 0;font-size:15px}#lightbox_content .ebook_download img{vertical-align:middle}#lightbox_content .logo{font-size:15px}#lightbox_content .logo img{-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;height:50px;width:50px;margin-right:5px}#lightbox_content .one_click,#lightbox_content .ebook_download_container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-left:-.25%;padding:0.5%;padding-bottom:15px;margin-bottom:5px;width:74%}#lightbox_content .one_click h3,#lightbox_content .ebook_download_container h3{margin-top:5px}#lightbox_content .one_click{border:solid 2px #8dc63f}#lightbox_content .ebook_download_container{border:solid 2px #d6dde0}#lightbox_content a.add-wishlist .on-wishlist,#lightbox_content a.success,a.success:hover{text-decoration:none;color:#3d4e53}#lightbox_content a.success,a.success:hover{cursor:default}#lightbox_content ul{padding-left:50px}#lightbox_content ul li{margin-bottom:4px}.border{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 2px #d6dde0;margin:5px auto;padding-right:5px;padding-left:5px}.sharing{float:right;padding:0.5% !important;width:23% !important;min-width:105px}.sharing ul{padding:0.5% !important}.sharing .jsmod-title{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;height:auto}.sharing .jsmod-title span{padding:5% !important;color:white !important;font-style:normal}#widgetcode2{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode2 textarea{max-width:90%}.btn_support.kindle{height:40px}.btn_support.kindle a{width:auto;font-size:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],.btn fieldset[disabled]{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn a.disabled,.btn a fieldset[disabled]{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default:active:focus,.btn-default:active.focus,.btn-default.active:hover,.btn-default.active:focus,.btn-default.active.focus,.open>.btn-default.dropdown-toggle:hover,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary:active:focus,.btn-primary:active.focus,.btn-primary.active:hover,.btn-primary.active:focus,.btn-primary.active.focus,.open>.btn-primary.dropdown-toggle:hover,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success:active:focus,.btn-success:active.focus,.btn-success.active:hover,.btn-success.active:focus,.btn-success.active.focus,.open>.btn-success.dropdown-toggle:hover,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info:active:focus,.btn-info:active.focus,.btn-info.active:hover,.btn-info.active:focus,.btn-info.active.focus,.open>.btn-info.dropdown-toggle:hover,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning:active:focus,.btn-warning:active.focus,.btn-warning.active:hover,.btn-warning.active:focus,.btn-warning.active.focus,.open>.btn-warning.dropdown-toggle:hover,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger:active:focus,.btn-danger:active.focus,.btn-danger.active:hover,.btn-danger.active:focus,.btn-danger.active.focus,.open>.btn-danger.dropdown-toggle:hover,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#6994a3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],.btn-link fieldset[disabled]{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#496b77;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,.btn-link fieldset[disabled]:hover,.btn-link fieldset[disabled]:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon :first-child{border:none;text-align:center;width:100% !important}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{background-color:#d87a68;color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.btn-adn.dropdown-toggle{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active:hover,.btn-adn:active:focus,.btn-adn:active.focus,.btn-adn.active:hover,.btn-adn.active:focus,.btn-adn.active.focus,.open>.btn-adn.dropdown-toggle:hover,.open>.btn-adn.dropdown-toggle:focus,.open>.btn-adn.dropdown-toggle.focus{color:#fff;background-color:#b94630;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.btn-adn.dropdown-toggle{background-image:none}.btn-adn.disabled:hover,.btn-adn.disabled:focus,.btn-adn.disabled.focus,.btn-adn[disabled]:hover,.btn-adn[disabled]:focus,.btn-adn[disabled].focus,fieldset[disabled] .btn-adn:hover,fieldset[disabled] .btn-adn:focus,fieldset[disabled] .btn-adn.focus{background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{background-color:#205081;color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.btn-bitbucket.dropdown-toggle{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active:hover,.btn-bitbucket:active:focus,.btn-bitbucket:active.focus,.btn-bitbucket.active:hover,.btn-bitbucket.active:focus,.btn-bitbucket.active.focus,.open>.btn-bitbucket.dropdown-toggle:hover,.open>.btn-bitbucket.dropdown-toggle:focus,.open>.btn-bitbucket.dropdown-toggle.focus{color:#fff;background-color:#0f253c;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.btn-bitbucket.dropdown-toggle{background-image:none}.btn-bitbucket.disabled:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket.disabled.focus,.btn-bitbucket[disabled]:hover,.btn-bitbucket[disabled]:focus,.btn-bitbucket[disabled].focus,fieldset[disabled] .btn-bitbucket:hover,fieldset[disabled] .btn-bitbucket:focus,fieldset[disabled] .btn-bitbucket.focus{background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{background-color:#1087dd;color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.btn-dropbox.dropdown-toggle{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active:hover,.btn-dropbox:active:focus,.btn-dropbox:active.focus,.btn-dropbox.active:hover,.btn-dropbox.active:focus,.btn-dropbox.active.focus,.open>.btn-dropbox.dropdown-toggle:hover,.open>.btn-dropbox.dropdown-toggle:focus,.open>.btn-dropbox.dropdown-toggle.focus{color:#fff;background-color:#0a568c;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.btn-dropbox.dropdown-toggle{background-image:none}.btn-dropbox.disabled:hover,.btn-dropbox.disabled:focus,.btn-dropbox.disabled.focus,.btn-dropbox[disabled]:hover,.btn-dropbox[disabled]:focus,.btn-dropbox[disabled].focus,fieldset[disabled] .btn-dropbox:hover,fieldset[disabled] .btn-dropbox:focus,fieldset[disabled] .btn-dropbox.focus{background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{background-color:#3b5998;color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.btn-facebook.dropdown-toggle{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active:hover,.btn-facebook:active:focus,.btn-facebook:active.focus,.btn-facebook.active:hover,.btn-facebook.active:focus,.btn-facebook.active.focus,.open>.btn-facebook.dropdown-toggle:hover,.open>.btn-facebook.dropdown-toggle:focus,.open>.btn-facebook.dropdown-toggle.focus{color:#fff;background-color:#23345a;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.btn-facebook.dropdown-toggle{background-image:none}.btn-facebook.disabled:hover,.btn-facebook.disabled:focus,.btn-facebook.disabled.focus,.btn-facebook[disabled]:hover,.btn-facebook[disabled]:focus,.btn-facebook[disabled].focus,fieldset[disabled] .btn-facebook:hover,fieldset[disabled] .btn-facebook:focus,fieldset[disabled] .btn-facebook.focus{background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{background-color:#ff0084;color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.btn-flickr.dropdown-toggle{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active:hover,.btn-flickr:active:focus,.btn-flickr:active.focus,.btn-flickr.active:hover,.btn-flickr.active:focus,.btn-flickr.active.focus,.open>.btn-flickr.dropdown-toggle:hover,.open>.btn-flickr.dropdown-toggle:focus,.open>.btn-flickr.dropdown-toggle.focus{color:#fff;background-color:#a80057;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.btn-flickr.dropdown-toggle{background-image:none}.btn-flickr.disabled:hover,.btn-flickr.disabled:focus,.btn-flickr.disabled.focus,.btn-flickr[disabled]:hover,.btn-flickr[disabled]:focus,.btn-flickr[disabled].focus,fieldset[disabled] .btn-flickr:hover,fieldset[disabled] .btn-flickr:focus,fieldset[disabled] .btn-flickr.focus{background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{background-color:#f94877;color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.btn-foursquare.dropdown-toggle{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active:hover,.btn-foursquare:active:focus,.btn-foursquare:active.focus,.btn-foursquare.active:hover,.btn-foursquare.active:focus,.btn-foursquare.active.focus,.open>.btn-foursquare.dropdown-toggle:hover,.open>.btn-foursquare.dropdown-toggle:focus,.open>.btn-foursquare.dropdown-toggle.focus{color:#fff;background-color:#e30742;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.btn-foursquare.dropdown-toggle{background-image:none}.btn-foursquare.disabled:hover,.btn-foursquare.disabled:focus,.btn-foursquare.disabled.focus,.btn-foursquare[disabled]:hover,.btn-foursquare[disabled]:focus,.btn-foursquare[disabled].focus,fieldset[disabled] .btn-foursquare:hover,fieldset[disabled] .btn-foursquare:focus,fieldset[disabled] .btn-foursquare.focus{background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{background-color:#444;color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.btn-github.dropdown-toggle{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active:hover,.btn-github:active:focus,.btn-github:active.focus,.btn-github.active:hover,.btn-github.active:focus,.btn-github.active.focus,.open>.btn-github.dropdown-toggle:hover,.open>.btn-github.dropdown-toggle:focus,.open>.btn-github.dropdown-toggle.focus{color:#fff;background-color:#191919;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.btn-github.dropdown-toggle{background-image:none}.btn-github.disabled:hover,.btn-github.disabled:focus,.btn-github.disabled.focus,.btn-github[disabled]:hover,.btn-github[disabled]:focus,.btn-github[disabled].focus,fieldset[disabled] .btn-github:hover,fieldset[disabled] .btn-github:focus,fieldset[disabled] .btn-github.focus{background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github .badge{color:#444;background-color:#fff}.btn-google-plus{background-color:#dd4b39;color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus:focus,.btn-google-plus.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.btn-google-plus.dropdown-toggle{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active:hover,.btn-google-plus:active:focus,.btn-google-plus:active.focus,.btn-google-plus.active:hover,.btn-google-plus.active:focus,.btn-google-plus.active.focus,.open>.btn-google-plus.dropdown-toggle:hover,.open>.btn-google-plus.dropdown-toggle:focus,.open>.btn-google-plus.dropdown-toggle.focus{color:#fff;background-color:#a32b1c;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.btn-google-plus.dropdown-toggle{background-image:none}.btn-google-plus.disabled:hover,.btn-google-plus.disabled:focus,.btn-google-plus.disabled.focus,.btn-google-plus[disabled]:hover,.btn-google-plus[disabled]:focus,.btn-google-plus[disabled].focus,fieldset[disabled] .btn-google-plus:hover,fieldset[disabled] .btn-google-plus:focus,fieldset[disabled] .btn-google-plus.focus{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus .badge{color:#dd4b39;background-color:#fff}.btn-instagram{background-color:#3f729b;color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.btn-instagram.dropdown-toggle{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active:hover,.btn-instagram:active:focus,.btn-instagram:active.focus,.btn-instagram.active:hover,.btn-instagram.active:focus,.btn-instagram.active.focus,.open>.btn-instagram.dropdown-toggle:hover,.open>.btn-instagram.dropdown-toggle:focus,.open>.btn-instagram.dropdown-toggle.focus{color:#fff;background-color:#26455d;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.btn-instagram.dropdown-toggle{background-image:none}.btn-instagram.disabled:hover,.btn-instagram.disabled:focus,.btn-instagram.disabled.focus,.btn-instagram[disabled]:hover,.btn-instagram[disabled]:focus,.btn-instagram[disabled].focus,fieldset[disabled] .btn-instagram:hover,fieldset[disabled] .btn-instagram:focus,fieldset[disabled] .btn-instagram.focus{background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{background-color:#007bb6;color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.btn-linkedin.dropdown-toggle{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active:hover,.btn-linkedin:active:focus,.btn-linkedin:active.focus,.btn-linkedin.active:hover,.btn-linkedin.active:focus,.btn-linkedin.active.focus,.open>.btn-linkedin.dropdown-toggle:hover,.open>.btn-linkedin.dropdown-toggle:focus,.open>.btn-linkedin.dropdown-toggle.focus{color:#fff;background-color:#00405f;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.btn-linkedin.dropdown-toggle{background-image:none}.btn-linkedin.disabled:hover,.btn-linkedin.disabled:focus,.btn-linkedin.disabled.focus,.btn-linkedin[disabled]:hover,.btn-linkedin[disabled]:focus,.btn-linkedin[disabled].focus,fieldset[disabled] .btn-linkedin:hover,fieldset[disabled] .btn-linkedin:focus,fieldset[disabled] .btn-linkedin.focus{background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{background-color:#2672ec;color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.btn-microsoft.dropdown-toggle{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active:hover,.btn-microsoft:active:focus,.btn-microsoft:active.focus,.btn-microsoft.active:hover,.btn-microsoft.active:focus,.btn-microsoft.active.focus,.open>.btn-microsoft.dropdown-toggle:hover,.open>.btn-microsoft.dropdown-toggle:focus,.open>.btn-microsoft.dropdown-toggle.focus{color:#fff;background-color:#0f4bac;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.btn-microsoft.dropdown-toggle{background-image:none}.btn-microsoft.disabled:hover,.btn-microsoft.disabled:focus,.btn-microsoft.disabled.focus,.btn-microsoft[disabled]:hover,.btn-microsoft[disabled]:focus,.btn-microsoft[disabled].focus,fieldset[disabled] .btn-microsoft:hover,fieldset[disabled] .btn-microsoft:focus,fieldset[disabled] .btn-microsoft.focus{background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{background-color:#f7931e;color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.btn-openid.dropdown-toggle{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active:hover,.btn-openid:active:focus,.btn-openid:active.focus,.btn-openid.active:hover,.btn-openid.active:focus,.btn-openid.active.focus,.open>.btn-openid.dropdown-toggle:hover,.open>.btn-openid.dropdown-toggle:focus,.open>.btn-openid.dropdown-toggle.focus{color:#fff;background-color:#b86607;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.btn-openid.dropdown-toggle{background-image:none}.btn-openid.disabled:hover,.btn-openid.disabled:focus,.btn-openid.disabled.focus,.btn-openid[disabled]:hover,.btn-openid[disabled]:focus,.btn-openid[disabled].focus,fieldset[disabled] .btn-openid:hover,fieldset[disabled] .btn-openid:focus,fieldset[disabled] .btn-openid.focus{background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{background-color:#cb2027;color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.btn-pinterest.dropdown-toggle{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active:hover,.btn-pinterest:active:focus,.btn-pinterest:active.focus,.btn-pinterest.active:hover,.btn-pinterest.active:focus,.btn-pinterest.active.focus,.open>.btn-pinterest.dropdown-toggle:hover,.open>.btn-pinterest.dropdown-toggle:focus,.open>.btn-pinterest.dropdown-toggle.focus{color:#fff;background-color:#801419;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.btn-pinterest.dropdown-toggle{background-image:none}.btn-pinterest.disabled:hover,.btn-pinterest.disabled:focus,.btn-pinterest.disabled.focus,.btn-pinterest[disabled]:hover,.btn-pinterest[disabled]:focus,.btn-pinterest[disabled].focus,fieldset[disabled] .btn-pinterest:hover,fieldset[disabled] .btn-pinterest:focus,fieldset[disabled] .btn-pinterest.focus{background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{background-color:#eff7ff;color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcdeff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcdeff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.btn-reddit.dropdown-toggle{color:#000;background-color:#bcdeff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active:hover,.btn-reddit:active:focus,.btn-reddit:active.focus,.btn-reddit.active:hover,.btn-reddit.active:focus,.btn-reddit.active.focus,.open>.btn-reddit.dropdown-toggle:hover,.open>.btn-reddit.dropdown-toggle:focus,.open>.btn-reddit.dropdown-toggle.focus{color:#000;background-color:#98ccff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.btn-reddit.dropdown-toggle{background-image:none}.btn-reddit.disabled:hover,.btn-reddit.disabled:focus,.btn-reddit.disabled.focus,.btn-reddit[disabled]:hover,.btn-reddit[disabled]:focus,.btn-reddit[disabled].focus,fieldset[disabled] .btn-reddit:hover,fieldset[disabled] .btn-reddit:focus,fieldset[disabled] .btn-reddit.focus{background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{background-color:#f50;color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.btn-soundcloud.dropdown-toggle{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active:hover,.btn-soundcloud:active:focus,.btn-soundcloud:active.focus,.btn-soundcloud.active:hover,.btn-soundcloud.active:focus,.btn-soundcloud.active.focus,.open>.btn-soundcloud.dropdown-toggle:hover,.open>.btn-soundcloud.dropdown-toggle:focus,.open>.btn-soundcloud.dropdown-toggle.focus{color:#fff;background-color:#a83800;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.btn-soundcloud.dropdown-toggle{background-image:none}.btn-soundcloud.disabled:hover,.btn-soundcloud.disabled:focus,.btn-soundcloud.disabled.focus,.btn-soundcloud[disabled]:hover,.btn-soundcloud[disabled]:focus,.btn-soundcloud[disabled].focus,fieldset[disabled] .btn-soundcloud:hover,fieldset[disabled] .btn-soundcloud:focus,fieldset[disabled] .btn-soundcloud.focus{background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{background-color:#2c4762;color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2e3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2e3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.btn-tumblr.dropdown-toggle{color:#fff;background-color:#1c2e3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active:hover,.btn-tumblr:active:focus,.btn-tumblr:active.focus,.btn-tumblr.active:hover,.btn-tumblr.active:focus,.btn-tumblr.active.focus,.open>.btn-tumblr.dropdown-toggle:hover,.open>.btn-tumblr.dropdown-toggle:focus,.open>.btn-tumblr.dropdown-toggle.focus{color:#fff;background-color:#111c26;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.btn-tumblr.dropdown-toggle{background-image:none}.btn-tumblr.disabled:hover,.btn-tumblr.disabled:focus,.btn-tumblr.disabled.focus,.btn-tumblr[disabled]:hover,.btn-tumblr[disabled]:focus,.btn-tumblr[disabled].focus,fieldset[disabled] .btn-tumblr:hover,fieldset[disabled] .btn-tumblr:focus,fieldset[disabled] .btn-tumblr.focus{background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{background-color:#55acee;color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.btn-twitter.dropdown-toggle{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active:hover,.btn-twitter:active:focus,.btn-twitter:active.focus,.btn-twitter.active:hover,.btn-twitter.active:focus,.btn-twitter.active.focus,.open>.btn-twitter.dropdown-toggle:hover,.open>.btn-twitter.dropdown-toggle:focus,.open>.btn-twitter.dropdown-toggle.focus{color:#fff;background-color:#1583d7;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.btn-twitter.dropdown-toggle{background-image:none}.btn-twitter.disabled:hover,.btn-twitter.disabled:focus,.btn-twitter.disabled.focus,.btn-twitter[disabled]:hover,.btn-twitter[disabled]:focus,.btn-twitter[disabled].focus,fieldset[disabled] .btn-twitter:hover,fieldset[disabled] .btn-twitter:focus,fieldset[disabled] .btn-twitter.focus{background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{background-color:#1ab7ea;color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.btn-vimeo.dropdown-toggle{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active:hover,.btn-vimeo:active:focus,.btn-vimeo:active.focus,.btn-vimeo.active:hover,.btn-vimeo.active:focus,.btn-vimeo.active.focus,.open>.btn-vimeo.dropdown-toggle:hover,.open>.btn-vimeo.dropdown-toggle:focus,.open>.btn-vimeo.dropdown-toggle.focus{color:#fff;background-color:#0f7b9f;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.btn-vimeo.dropdown-toggle{background-image:none}.btn-vimeo.disabled:hover,.btn-vimeo.disabled:focus,.btn-vimeo.disabled.focus,.btn-vimeo[disabled]:hover,.btn-vimeo[disabled]:focus,.btn-vimeo[disabled].focus,fieldset[disabled] .btn-vimeo:hover,fieldset[disabled] .btn-vimeo:focus,fieldset[disabled] .btn-vimeo.focus{background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{background-color:#587ea3;color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.btn-vk.dropdown-toggle{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active:hover,.btn-vk:active:focus,.btn-vk:active.focus,.btn-vk.active:hover,.btn-vk.active:focus,.btn-vk.active.focus,.open>.btn-vk.dropdown-toggle:hover,.open>.btn-vk.dropdown-toggle:focus,.open>.btn-vk.dropdown-toggle.focus{color:#fff;background-color:#3a526b;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.btn-vk.dropdown-toggle{background-image:none}.btn-vk.disabled:hover,.btn-vk.disabled:focus,.btn-vk.disabled.focus,.btn-vk[disabled]:hover,.btn-vk[disabled]:focus,.btn-vk[disabled].focus,fieldset[disabled] .btn-vk:hover,fieldset[disabled] .btn-vk:focus,fieldset[disabled] .btn-vk.focus{background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{background-color:#720e9e;color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.btn-yahoo.dropdown-toggle{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active:hover,.btn-yahoo:active:focus,.btn-yahoo:active.focus,.btn-yahoo.active:hover,.btn-yahoo.active:focus,.btn-yahoo.active.focus,.open>.btn-yahoo.dropdown-toggle:hover,.open>.btn-yahoo.dropdown-toggle:focus,.open>.btn-yahoo.dropdown-toggle.focus{color:#fff;background-color:#39074e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.btn-yahoo.dropdown-toggle{background-image:none}.btn-yahoo.disabled:hover,.btn-yahoo.disabled:focus,.btn-yahoo.disabled.focus,.btn-yahoo[disabled]:hover,.btn-yahoo[disabled]:focus,.btn-yahoo[disabled].focus,fieldset[disabled] .btn-yahoo:hover,fieldset[disabled] .btn-yahoo:focus,fieldset[disabled] .btn-yahoo.focus{background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.launch_top{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;border-color:#8dc63f;margin:10px auto 0 auto;font-size:15px;line-height:22.5px}.launch_top a{color:#8dc63f}.launch_top.pale{border-color:#d6dde0;font-size:13px}.launch_top.alert{border-color:#e35351;font-size:13px}.preview_content{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;width:80%;margin:10px auto}.preview_content a{color:#8dc63f}html,body{height:100%}body{background:url("/static/images/bg-body.png") 0 0 repeat-x;padding:0 0 20px 0;margin:0;font-size:13px;line-height:16.9px;font-family:"Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Arial, Helvetica, sans-serif;color:#3d4e53}#feedback{position:fixed;bottom:10%;right:0;z-index:500}#feedback p{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);white-space:nowrap;display:block;bottom:0;width:160px;height:32px;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;background:#8dc63f;margin-bottom:0;text-align:center;margin-right:-67px;line-height:normal}#feedback p a{color:white;font-size:24px;font-weight:normal}#feedback p a:hover{color:#3d4e53}a{font-weight:bold;font-size:inherit;text-decoration:none;cursor:pointer;color:#6994a3}a:hover{text-decoration:underline}h1{font-size:22.5px}h2{font-size:18.75px}h3{font-size:17.55px}h4{font-size:15px}img{border:none}img.user-avatar{float:left;margin-right:10px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px}input,textarea,a.fakeinput{border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}input:focus,textarea:focus,a.fakeinput:focus{border:2px solid #8dc63f;outline:none}a.fakeinput:hover{text-decoration:none}.js-search input{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}h2.content-heading{padding:15px;margin:0;font-size:19px;font-weight:normal;color:#3d4e53;float:left;width:50%}h2.content-heading span{font-style:italic}h3.jsmod-title{-moz-border-radius:8px 8px 0 0;-webkit-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0;background:#edf3f4;padding:0;margin:0;height:2.3em}h3.jsmod-title span{font-size:19px;font-style:italic;color:#3d4e53;padding:0.7em 2em 0.5em 2em;display:block}input[type="submit"],a.fakeinput{background:#8dc63f;color:white;font-weight:bold;padding:0.5em 1em;cursor:pointer}.loader-gif[disabled="disabled"],.loader-gif.show-loading{background:url("/static/images/loading.gif") center no-repeat !important}.js-page-wrap{position:relative;min-height:100%}.js-main{width:960px;margin:0 auto;clear:both;padding:0}.bigger{font-size:15px}ul.menu{list-style:none;padding:0;margin:0}.errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errorlist li{list-style:none;border:none}.errorlist+input{border:2px solid #e35351 !important}.errorlist+input:focus{border:1px solid #8dc63f !important}.errorlist+textarea{border:2px solid #e35351 !important}.errorlist+textarea:focus{border:2px solid #8dc63f !important}.p_form .errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:none;color:#e35351;clear:none;width:100%;height:auto;line-height:16px;padding:0;font-weight:normal;text-align:left;display:inline}.p_form .errorlist li{display:inline}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}#js-header{height:90px}.js-logo{float:left;padding-top:10px}.js-logo a img{border:none}.js-topmenu{float:right;margin-top:25px;font-size:15px}.js-topmenu#authenticated{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:36px}.js-topmenu#authenticated:hover,.js-topmenu#authenticated.highlight{background:#d6dde0;cursor:pointer;position:relative}.js-topmenu ul#user_menu{white-space:nowrap;display:none;z-index:100;position:absolute;top:36px;left:0;padding:0;overflow:visible;margin:0}.js-topmenu ul#user_menu li{border-top:1px solid white;list-style-type:none;float:none;background:#d6dde0;padding:7px 10px}.js-topmenu ul#user_menu li:hover{background:#8dc63f}.js-topmenu ul#user_menu li:hover a{color:white}.js-topmenu ul#user_menu li:hover #i_haz_notifications{border-color:white;background-color:white;color:#3d4e53}.js-topmenu ul#user_menu li a{height:auto;line-height:26.25px}.js-topmenu ul#user_menu li span{margin-right:10px}.js-topmenu ul li{float:left;position:relative;z-index:50}.js-topmenu ul li .notbutton{color:#3d4e53;line-height:36px}.js-topmenu ul li a{display:block;text-decoration:none;font-weight:bold;letter-spacing:-.05em}.js-topmenu ul li span#welcome{display:block;text-decoration:none;font-weight:bold;letter-spacing:-.05em;padding:0 10px}.js-topmenu ul li img{padding:0;margin:0}.js-topmenu ul li.last{padding-left:20px}.js-topmenu ul li.last a span{-moz-border-radius:32px 0 0 32px;-webkit-border-radius:32px 0 0 32px;border-radius:32px 0 0 32px;background-color:#8dc63f;margin-right:29px;display:block;padding:0 5px 0 15px;color:white}.js-topmenu ul .unseen_count{border:solid 2px;-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;padding:3px;line-height:16px;width:16px;cursor:pointer;text-align:center}.js-topmenu ul .unseen_count#i_haz_notifications{background-color:#8dc63f;color:white;border-color:white}.js-topmenu ul .unseen_count#no_notifications_for_you{border-color:#edf3f4;background-color:#edf3f4;color:#3d4e53}.btn-signup{color:#fff;background-color:#8dc63f;border-color:#ccc}.btn-signup:focus,.btn-signup.focus{color:#fff;background-color:#72a230;border-color:#8c8c8c}.btn-signup:hover{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active,.btn-signup.active,.open>.btn-signup.dropdown-toggle{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active:hover,.btn-signup:active:focus,.btn-signup:active.focus,.btn-signup.active:hover,.btn-signup.active:focus,.btn-signup.active.focus,.open>.btn-signup.dropdown-toggle:hover,.open>.btn-signup.dropdown-toggle:focus,.open>.btn-signup.dropdown-toggle.focus{color:#fff;background-color:#5f8628;border-color:#8c8c8c}.btn-signup:active,.btn-signup.active,.open>.btn-signup.dropdown-toggle{background-image:none}.btn-signup.disabled:hover,.btn-signup.disabled:focus,.btn-signup.disabled.focus,.btn-signup[disabled]:hover,.btn-signup[disabled]:focus,.btn-signup[disabled].focus,fieldset[disabled] .btn-signup:hover,fieldset[disabled] .btn-signup:focus,fieldset[disabled] .btn-signup.focus{background-color:#8dc63f;border-color:#ccc}.btn-signup .badge{color:#8dc63f;background-color:#fff}.btn-readon{color:#fff;background-color:#8ac3d7;border-color:#ccc}.btn-readon:focus,.btn-readon.focus{color:#fff;background-color:#64b0ca;border-color:#8c8c8c}.btn-readon:hover{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active,.btn-readon.active,.open>.btn-readon.dropdown-toggle{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active:hover,.btn-readon:active:focus,.btn-readon:active.focus,.btn-readon.active:hover,.btn-readon.active:focus,.btn-readon.active.focus,.open>.btn-readon.dropdown-toggle:hover,.open>.btn-readon.dropdown-toggle:focus,.open>.btn-readon.dropdown-toggle.focus{color:#fff;background-color:#49a2c1;border-color:#8c8c8c}.btn-readon:active,.btn-readon.active,.open>.btn-readon.dropdown-toggle{background-image:none}.btn-readon.disabled:hover,.btn-readon.disabled:focus,.btn-readon.disabled.focus,.btn-readon[disabled]:hover,.btn-readon[disabled]:focus,.btn-readon[disabled].focus,fieldset[disabled] .btn-readon:hover,fieldset[disabled] .btn-readon:focus,fieldset[disabled] .btn-readon.focus{background-color:#8ac3d7;border-color:#ccc}.btn-readon .badge{color:#8ac3d7;background-color:#fff}#i_haz_notifications_badge{-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;font-size:13px;border:solid 2px white;margin-left:-7px;margin-top:-10px;padding:3px;background:#8dc63f;color:white;position:absolute;line-height:normal}form.login label,#login form label{display:block;line-height:20px;font-size:15px}form.login input,#login form input{width:90%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0;height:18px;line-height:18px;margin-bottom:6px}form.login input[type=submit],#login form input[type=submit]{text-decoration:capitalize;width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}form.login input:focus,#login form input:focus{border:solid 1px #8dc63f}form.login input[type="text"],form.login input[type="password"],#login form input[type="text"],#login form input[type="password"]{height:22.75px;line-height:22.75px;margin-bottom:13px;border-width:2px}form.login input[type="submit"],#login form input[type="submit"]{font-size:15px}form.login span.helptext,#login form span.helptext{display:block;margin-top:-11px;font-style:italic;font-size:13px}#lightbox_content a.btn{color:#FFF}.js-search{float:left;padding-top:25px;margin-left:81px}.js-search input{float:left}.js-search .inputbox{padding:0 0 0 15px;margin:0;border-top:solid 4px #8ac3d7;border-left:solid 4px #8ac3d7;border-bottom:solid 4px #8ac3d7;border-right:none;-moz-border-radius:50px 0 0 50px;-webkit-border-radius:50px 0 0 50px;border-radius:50px 0 0 50px;outline:none;height:28px;line-height:28px;width:156px;float:left;color:#6994a3}.js-search .button{background:url("/static/images/blue-search-button.png") no-repeat;padding:0;margin:0;width:40px;height:36px;display:block;border:none;text-indent:-10000px;cursor:pointer}.js-search-inner{float:right}#locationhash{display:none}#block-intro-text{padding-right:10px}#block-intro-text span.def{font-style:italic}a#readon{color:#fff;text-transform:capitalize;display:block;float:right;font-size:13px;font-weight:bold}.spread_the_word{height:24px;width:24px;position:top;margin-left:5px}#js-leftcol{float:left;width:235px;margin-bottom:20px}#js-leftcol a{font-weight:normal}#js-leftcol a:hover{text-decoration:underline}#js-leftcol .jsmod-content{border:solid 1px #edf3f4;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px}#js-leftcol ul.level1>li>a,#js-leftcol ul.level1>li>span{border-bottom:1px solid #edf3f4;border-top:1px solid #edf3f4;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:10px}#js-leftcol ul.level2 li{padding:5px 20px}#js-leftcol ul.level2 li a{color:#6994a3;font-size:15px}#js-leftcol ul.level2 li img{vertical-align:middle;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}#js-leftcol ul.level2 li .ungluer-name{height:30px;line-height:30px}#js-leftcol ul.level2 li.first{font-size:15px;color:#3d4e53;padding-left:10px}#js-leftcol ul.level3 li{padding:0px 20px}#js-leftcol ul.level3 li a{color:#6994a3;font-size:15px}#js-topsection{padding:15px 0 0 0;overflow:hidden}.js-topnews{float:left;width:100%}.js-topnews1{background:url("/static/images/header/header-m.png") 0 0 repeat-y}.js-topnews2{background:url("/static/images/header/header-t.png") 0 0 no-repeat}.js-topnews3{background:url("/static/images/header/header-b.png") 0 100% no-repeat;display:block;overflow:hidden;padding:10px}#main-container{margin:15px 0 0 0}#js-maincol-fr{float:right;width:725px}div#content-block{overflow:hidden;background:url("/static/images/bg.png") 100% -223px no-repeat;padding:0 0 0 7px;margin-bottom:20px}div#content-block.jsmodule{background:none}.content-block-heading a.block-link{float:right;padding:15px;font-size:13px;color:#3d4e53;text-decoration:underline;font-weight:normal}div#content-block-content,div#content-block-content-1{width:100%;overflow:hidden;padding-left:10px}div#content-block-content .cols3 .column,div#content-block-content-1 .cols3 .column{width:33.33%;float:left}#footer{background-color:#edf3f4;clear:both;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:15px 0px 45px 0px;margin-top:15px;overflow:hidden}#footer .column{float:left;width:25%;padding-top:5px}#footer .column ul{padding-top:5px;margin-left:0;padding-left:0}#footer .column li{padding:5px 0;text-transform:none;list-style:none;margin-left:0}#footer .column li a{color:#6994a3;font-size:15px}.pagination{width:100%;text-align:center;margin-top:20px;clear:both;border-top:solid #3d4e53 thin;padding-top:7px}.pagination .endless_page_link{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px}.pagination .endless_page_current{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px;background-color:#edf3f4}a.nounderline{text-decoration:none}.slides_control{height:325px !important}#about_expandable{display:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;background:white;z-index:500;top:25%;padding:9px;max-width:90%}#about_expandable .collapser_x{margin-top:-27px;margin-right:-27px}#lightbox_content p,#lightbox_content li{padding:9px 0;font-size:15px;line-height:20px}#lightbox_content p a,#lightbox_content li a{font-size:15px;line-height:20px}#lightbox_content p b,#lightbox_content li b{color:#8dc63f}#lightbox_content p.last,#lightbox_content li.last{border-bottom:solid 2px #d6dde0;margin-bottom:5px}#lightbox_content .right_border{border-right:solid 1px #d6dde0;float:left;padding:9px}#lightbox_content .signuptoday{float:right;margin-top:0;clear:none}#lightbox_content h2+form,#lightbox_content h3+form,#lightbox_content h4+form{margin-top:15px}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-bottom:10px}.nonlightbox .about_page{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;width:75%;margin:10px auto auto auto;padding:9px}.collapser_x{float:right;height:24px;line-height:24px;width:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px;-moz-box-shadow:-1px 1px #3d4e53;-webkit-box-shadow:-1px 1px #3d4e53;box-shadow:-1px 1px #3d4e53;border:solid 3px white;text-align:center;color:white;background:#3d4e53;font-size:17px;z-index:5000;margin-top:-12px;margin-right:-22px}.signuptoday{padding:0 15px;height:36px;line-height:36px;float:left;clear:both;margin:10px auto;cursor:pointer;font-style:normal}.signuptoday a{padding-right:17px;color:white}.signuptoday a:hover{text-decoration:none}.central{width:480px;margin:0 auto}li.checked{list-style-type:none;background:transparent url(/static/images/checkmark_small.png) no-repeat 0 0;margin-left:-20px;padding-left:20px}.btn_support{margin:10px;width:215px}.btn_support a,.btn_support form input,.btn_support>span{font-size:22px;border:4px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;display:block;text-align:center;padding-top:14.25px;padding-bottom:14.25px;background-color:#8dc63f;color:white !important}.btn_support a span,.btn_support form input span,.btn_support>span span{color:white !important;font-weight:bold;padding-left:0;margin-left:0 !important;background:none}.btn_support.create-account span{padding:0;margin:0;background:none}.btn_support a:hover,.btn_support form input:hover{background-color:#7aae34;text-decoration:none}.btn_support a{width:207px}.btn_support form input{width:215px}.btn_support.modify a,.btn_support.modify form input{background-color:#a7c1ca}.btn_support.modify a:hover,.btn_support.modify form input:hover{background-color:#91b1bd}.instructions h4{border-top:solid #d6dde0 1px;border-bottom:solid #d6dde0 1px;padding:0.5em 0}.instructions>div{padding-left:1%;padding-right:1%;font-size:15px;line-height:22.5px;width:98%}.instructions>div.active{float:left}.one_click{float:left}.one_click>div{float:left}.one_click>div #kindle a,.one_click>div .kindle a,.one_click>div #marvin a,.one_click>div .marvin a,.one_click>div #mac_ibooks a,.one_click>div .mac_ibooks a{font-size:15px;padding:9px 0}.one_click>div div{margin:0 10px 0 0}.ebook_download_container{clear:left}.other_instructions_paragraph{display:none}#iOS_app_div,#ios_div{display:none}.yes_js{display:none}.std_form,.std_form input,.std_form select{line-height:30px;font-size:15px}.contrib_amount{padding:10px;font-size:19px;text-align:center}#id_preapproval_amount{width:50%;line-height:30px;font-size:15px}#askblock{float:right;min-width:260px;background:#edf3f4;padding:10px;width:30%}.rh_ask{font-size:15px;width:65%}#contribsubmit{text-align:center;font-size:19px;margin:0 0 10px;cursor:pointer}#anoncontribbox{padding-bottom:10px}.faq_tldr{font-style:italic;font-size:19px;text-align:center;line-height:24.7px;color:#6994a3;margin-left:2em}.deletebutton,input[type='submit'].deletebutton{height:20px;padding:.2em .6em;background-color:lightgray;margin-left:1em;color:white;font-weight:bold;cursor:pointer} /*# sourceMappingURL=../../../../../static/scss/sitewide4.css.map */ \ No newline at end of file diff --git a/static/scss/variables.scss b/static/scss/variables.scss index c84fe550..c47d3f51 100644 --- a/static/scss/variables.scss +++ b/static/scss/variables.scss @@ -186,9 +186,10 @@ $cursor-disabled: not-allowed; line-height:$x; } -.mediaborder { +@mixin mediaborder-base() +{ padding: 5px; - border: solid 5px #EDF3F4; + border: solid 5px $pale-blue; } @mixin actionbuttons() From c0c6958426520b7d254b18bdf8ae051516f5ded2 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 30 Jan 2018 15:31:20 -0500 Subject: [PATCH 098/109] all the rest --- frontend/templates/basepledge.html | 2 +- frontend/templates/campaign_list.html | 6 +- frontend/templates/cc_list.html | 6 +- frontend/templates/comments.html | 6 +- frontend/templates/download.html | 3 + frontend/templates/faceted_list.html | 6 +- frontend/templates/libraries.html | 2 +- frontend/templates/libraryauth/library.html | 6 +- frontend/templates/libraryauth/list.html | 5 +- frontend/templates/libraryauth/users.html | 5 +- frontend/templates/manage_campaign.html | 2 +- .../notification/notice_settings.html | 5 +- .../registration/registration_base.html | 7 +- frontend/templates/search.html | 6 +- frontend/templates/supporter.html | 4 +- frontend/templates/unglued_list.html | 6 +- frontend/templates/work_list.html | 6 +- static/js/download_page.js | 4 +- static/scss/book_list.css | 3 + static/scss/book_list.scss | 372 +++++++++++++ static/scss/book_panel2.css | 2 +- static/scss/comments.css | 3 + static/scss/comments.scss | 70 +++ static/scss/documentation2.css | 3 + static/scss/documentation2.scss | 290 ++++++++++ static/scss/enhanced_download.css | 3 + static/scss/enhanced_download.scss | 15 + static/scss/enhanced_download_ie.css | 3 + static/scss/enhanced_download_ie.scss | 16 + static/scss/landingpage4.css | 2 +- static/scss/liblist.css | 3 + static/scss/liblist.scss | 71 +++ static/scss/libraries.css | 3 + static/scss/libraries.scss | 32 ++ static/scss/lists.css | 3 + static/scss/lists.scss | 26 + static/scss/manage_campaign.css | 3 + static/scss/manage_campaign.scss | 48 ++ static/scss/notices.scss | 97 ++++ static/scss/registration2.css | 3 + static/scss/registration2.scss | 124 +++++ static/scss/search.css | 3 + static/scss/search.scss | 15 + static/scss/searchandbrowse2.css | 2 +- static/scss/supporter_layout.css | 3 + static/scss/supporter_layout.scss | 494 ++++++++++++++++++ static/scss/variables.scss | 2 +- 47 files changed, 1760 insertions(+), 41 deletions(-) create mode 100644 static/scss/book_list.css create mode 100644 static/scss/book_list.scss create mode 100644 static/scss/comments.css create mode 100644 static/scss/comments.scss create mode 100644 static/scss/documentation2.css create mode 100644 static/scss/documentation2.scss create mode 100644 static/scss/enhanced_download.css create mode 100644 static/scss/enhanced_download.scss create mode 100644 static/scss/enhanced_download_ie.css create mode 100644 static/scss/enhanced_download_ie.scss create mode 100644 static/scss/liblist.css create mode 100644 static/scss/liblist.scss create mode 100644 static/scss/libraries.css create mode 100644 static/scss/libraries.scss create mode 100644 static/scss/lists.css create mode 100644 static/scss/lists.scss create mode 100644 static/scss/manage_campaign.css create mode 100644 static/scss/manage_campaign.scss create mode 100644 static/scss/notices.scss create mode 100644 static/scss/registration2.css create mode 100644 static/scss/registration2.scss create mode 100644 static/scss/search.css create mode 100644 static/scss/search.scss create mode 100644 static/scss/supporter_layout.css create mode 100644 static/scss/supporter_layout.scss diff --git a/frontend/templates/basepledge.html b/frontend/templates/basepledge.html index 852c742a..4e927cdc 100644 --- a/frontend/templates/basepledge.html +++ b/frontend/templates/basepledge.html @@ -2,7 +2,7 @@ {% load sass_tags %} {% block extra_css %} - + {% endblock %} diff --git a/frontend/templates/campaign_list.html b/frontend/templates/campaign_list.html index a7382b09..c1ad07b3 100644 --- a/frontend/templates/campaign_list.html +++ b/frontend/templates/campaign_list.html @@ -6,10 +6,10 @@ {% block title %} {{ facet_label }} Campaigns {% endblock %} {% block extra_css %} - - + + - + {% endblock %} {% block extra_head %} diff --git a/frontend/templates/comments.html b/frontend/templates/comments.html index c06875ce..f1c54b17 100644 --- a/frontend/templates/comments.html +++ b/frontend/templates/comments.html @@ -1,9 +1,11 @@ {% extends 'base.html' %} +{% load sass_tags %} + {% block title %} Comments {% endblock %} {% block extra_css %} - - + + {% endblock %} {% block extra_head %} diff --git a/frontend/templates/download.html b/frontend/templates/download.html index f8f3d963..e42e4c25 100644 --- a/frontend/templates/download.html +++ b/frontend/templates/download.html @@ -1,6 +1,8 @@ {% extends 'base.html' %} {% load humanize %} +{% load sass_tags %} + {% with work.title as title %} {% block title %} — Downloads for {{ work.title }} @@ -8,6 +10,7 @@ {% block extra_js %} + diff --git a/frontend/templates/libraries.html b/frontend/templates/libraries.html index cd1edd24..3cc14a8a 100644 --- a/frontend/templates/libraries.html +++ b/frontend/templates/libraries.html @@ -5,7 +5,7 @@ {% block title %} ♥ Libraries{% endblock %} {% block extra_css %} - + {% endblock %} {% block extra_js %} diff --git a/frontend/templates/libraryauth/library.html b/frontend/templates/libraryauth/library.html index 7fe9d91d..a66826cc 100644 --- a/frontend/templates/libraryauth/library.html +++ b/frontend/templates/libraryauth/library.html @@ -1,14 +1,14 @@ {% extends 'base.html' %} -{% load sass_tags %} {% load endless %} +{% load sass_tags %} {% load truncatechars %} {% block title %} — {{ library }}{% endblock %} {% block extra_css %} - + - + {% endblock %} {% block extra_js %} diff --git a/frontend/templates/libraryauth/list.html b/frontend/templates/libraryauth/list.html index 89a25620..5d82c528 100644 --- a/frontend/templates/libraryauth/list.html +++ b/frontend/templates/libraryauth/list.html @@ -1,10 +1,11 @@ {% extends 'base.html' %} +{% load sass_tags %} {% load libraryauthtags %} {% block title %} Libraries {% endblock %} {% block extra_css %} - - + + {% endblock %} {% block extra_head %} diff --git a/frontend/templates/libraryauth/users.html b/frontend/templates/libraryauth/users.html index 216486f1..763d2144 100644 --- a/frontend/templates/libraryauth/users.html +++ b/frontend/templates/libraryauth/users.html @@ -1,9 +1,10 @@ {% extends 'base.html' %} +{% load sass_tags %} {% block title %} Users of {{ library }} {% endblock %} {% block extra_css %} - - + + {% endblock %} {% block extra_head %} diff --git a/frontend/templates/manage_campaign.html b/frontend/templates/manage_campaign.html index 95b8cf77..7c905269 100644 --- a/frontend/templates/manage_campaign.html +++ b/frontend/templates/manage_campaign.html @@ -12,7 +12,7 @@ textarea { width: 90%; } - + diff --git a/frontend/templates/notification/notice_settings.html b/frontend/templates/notification/notice_settings.html index 10350d86..2b4c79e3 100644 --- a/frontend/templates/notification/notice_settings.html +++ b/frontend/templates/notification/notice_settings.html @@ -1,12 +1,13 @@ {% extends 'notification/base.html' %} - {% load i18n %} +{% load sass_tags %} {% load truncatechars %} + {% block title %}{% trans "Notification Settings" %}{% endblock %} {% block extra_css %} - + {% endblock %} {% block extra_js %} diff --git a/frontend/templates/registration/registration_base.html b/frontend/templates/registration/registration_base.html index 473cf010..c130b6db 100644 --- a/frontend/templates/registration/registration_base.html +++ b/frontend/templates/registration/registration_base.html @@ -1,4 +1,7 @@ {% extends "base.html" %} + +{% load sass_tags %} + {% block extra_js %} diff --git a/frontend/templates/work_list.html b/frontend/templates/work_list.html index cc0a06d7..0a728688 100644 --- a/frontend/templates/work_list.html +++ b/frontend/templates/work_list.html @@ -6,10 +6,10 @@ {% block title %} Works {% endblock %} {% block extra_css %} - - + + - + {% endblock %} {% block extra_head %} diff --git a/static/js/download_page.js b/static/js/download_page.js index e62c90e0..adb4dee6 100644 --- a/static/js/download_page.js +++ b/static/js/download_page.js @@ -4,10 +4,10 @@ var $j = jQuery.noConflict(); // on an element not present on pageload, so binding it via on is useless if (document.createStyleSheet) { // make it work in IE <= 8 - document.createStyleSheet('/static/css/enhanced_download_ie.css'); + document.createStyleSheet('/static/scss/enhanced_download_ie.css'); } else { - $j('').appendTo('head'); + $j('').appendTo('head'); } // browser has a better sense of DOM changes than jQuery, so user can trigger click element diff --git a/static/scss/book_list.css b/static/scss/book_list.css new file mode 100644 index 00000000..5009731e --- /dev/null +++ b/static/scss/book_list.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.row1 .book-list.listview{background:#f6f9f9}.row1 .book-list.listview .book-name:hover{background:#f6f9f9}.row2 .book-list.listview{background:#fff}.row2 .book-list.listview .book-name:hover{background:#fff}div.book-list.listview{clear:both;display:block;vertical-align:middle;height:43px;line-height:43px;margin:0 5px 0 0;padding:7px 0;position:relative}div.book-list.listview div.unglue-this{float:left}div.book-list.listview div.book-thumb{margin-right:5px;float:left}div.book-list.listview div.book-name{width:235px;margin-right:10px;background:url("/static/images/booklist/booklist-vline.png") right center no-repeat;float:left}div.book-list.listview div.book-name .title{display:block;line-height:normal;overflow:hidden;height:19px;line-height:19px;margin-bottom:5px;font-weight:bold}div.book-list.listview div.book-name .listview.author{overflow:hidden;display:block;line-height:normal;height:19px;line-height:19px}div.book-list.listview div.book-name.listview:hover{overflow:visible;width:auto;min-width:219px;margin-top:-1px;padding-right:15px;border:1px solid #d6dde0;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;border-left:none}div.book-list.listview div.book-name.listview{z-index:100;position:absolute;left:42px}div.book-list.listview div.add-wishlist,div.book-list.listview div.remove-wishlist,div.book-list.listview div.on-wishlist,div.book-list.listview div.create-account,div.book-list.listview div.pledge{margin-right:10px;padding-right:10px;width:136px;background:url("/static/images/booklist/booklist-vline.png") right center no-repeat;margin-left:255px;float:left}div.book-list.listview div.add-wishlist span,div.book-list.listview div.remove-wishlist span,div.book-list.listview div.on-wishlist span,div.book-list.listview div.create-account span,div.book-list.listview div.pledge span{font-weight:normal;color:#3d4e53;text-transform:none;padding-left:20px}div.book-list.listview div.add-wishlist span.booklist_pledge,div.book-list.listview div.remove-wishlist span.booklist_pledge,div.book-list.listview div.on-wishlist span.booklist_pledge,div.book-list.listview div.create-account span.booklist_pledge,div.book-list.listview div.pledge span.booklist_pledge{padding-left:18px}div.book-list.listview div.pledge span.booklist_pledge{padding-left:0}div.book-list.listview div.add-wishlist span,div.book-list.listview div.create-account span{background:url("/static/images/booklist/add-wishlist.png") left center no-repeat}div.book-list.listview div.add-wishlist span.booklist_pledge{background:none}div.book-list.listview div.remove-wishlist span{background:url("/static/images/booklist/remove-wishlist-blue.png") left center no-repeat}div.book-list.listview div.on-wishlist>span,div.book-list.listview div>span.on-wishlist{background:url("/static/images/checkmark_small.png") left center no-repeat}div.book-list.listview div.booklist-status{margin-right:85px;float:left}div.add-wishlist,div.remove-wishlist{cursor:pointer}.booklist-status.listview span.booklist-status-label{display:none}.booklist-status.listview span.booklist-status-text{float:left;display:block;padding-right:5px;max-width:180px;overflow:hidden}.booklist-status.listview .read_itbutton{margin-top:4px}div.unglue-this a{text-transform:uppercase;color:#3d4e53;font-size:11px;font-weight:bold}div.unglue-this.complete .unglue-this-inner1{background:url("/static/images/booklist/bg.png") 0 -84px no-repeat;height:42px}div.unglue-this.complete .unglue-this-inner2{background:url("/static/images/booklist/bg.png") 100% -126px no-repeat;margin-left:29px;height:42px;padding-right:10px}div.unglue-this.complete a{color:#fff;display:block}div.unglue-this.processing .unglue-this-inner1{background:url("/static/images/booklist/bg.png") 0 0 no-repeat;height:42px}div.unglue-this.processing .unglue-this-inner2{background:url("/static/images/booklist/bg.png") 100% -42px no-repeat;margin-left:25px;height:42px;padding-right:10px}ul.book-list-view{padding:0;margin:15px;float:right;list-style:none}ul.book-list-view li{float:left;margin-right:10px;display:block;vertical-align:middle;line-height:22px}ul.book-list-view li:hover{color:#6994a3}ul.book-list-view li.view-list a{filter:alpha(opacity=30);-moz-opacity:.3;-khtml-opacity:.3;opacity:.3}ul.book-list-view li.view-list a:hover{filter:alpha(opacity=100);-moz-opacity:1;-khtml-opacity:1;opacity:1}ul.book-list-view li.view-list a.chosen{filter:alpha(opacity=100);-moz-opacity:1;-khtml-opacity:1;opacity:1}ul.book-list-view li.view-list a.chosen:hover{text-decoration:none}div.navigation{float:left;clear:both;width:100%;color:#37414d}ul.navigation{float:right;padding:0;margin:0;list-style:none}ul.navigation li{float:left;line-height:normal;margin-right:5px}ul.navigation li a{color:#37414d;font-weight:normal}ul.navigation li.arrow-l a{background:url("/static/images/booklist/bg.png") 0 -168px no-repeat;width:10px;height:15px;display:block;text-indent:-10000px}ul.navigation li.arrow-r a{background:url("/static/images/booklist/bg.png") -1px -185px no-repeat;width:10px;height:15px;display:block;text-indent:-10000px}ul.navigation li a:hover,ul.navigation li.active a{color:#8ac3d7;text-decoration:underline}.unglue-button{display:block;border:0}.book-thumb.listview a{display:block;height:50px;width:32px;overflow:hidden;position:relative;z-index:1}.book-thumb.listview a:hover{overflow:visible;z-index:1000;border:none}.book-thumb.listview a img{position:absolute}.listview.icons{position:absolute;right:31px}.listview.icons .booklist-status-img{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#fff;margin-top:4px;height:37px}.listview.icons .booklist-status-img img{padding:5px}.listview.icons .booklist-status-label{display:none}.listview.icons .boolist-ebook img{margin-top:6px}div#content-block-content{padding-bottom:10px}.listview.panelback,.listview.panelback div{display:none}.nobold{font-weight:normal}div#libtools{margin-left:15px;margin-bottom:1em;border:1px solid #d6dde0;border-radius:10px;padding:10px}div#libtools p{margin-top:0px}div#libtools div{margin-top:0px;margin-left:2em}#facet_block div{background:url("/static/images/bg.png") 100% -223px no-repeat;padding:7px 7px 15px 7px}#facet_block div p{padding:0 10px 0 10px;font-size:smaller}#facet_block div p:first-child{font-size:larger;margin-top:5px}#facet_block div p:first-child img{float:left;padding-right:0.5em} + +/*# sourceMappingURL=../../../../../static/scss/book_list.css.map */ \ No newline at end of file diff --git a/static/scss/book_list.scss b/static/scss/book_list.scss new file mode 100644 index 00000000..15ebcec3 --- /dev/null +++ b/static/scss/book_list.scss @@ -0,0 +1,372 @@ +@import "variables.scss"; + +/* Cross-browser language */ +@mixin opacity($op) +{ + filter:alpha(opacity=$op); + -moz-opacity:$op/100; + -khtml-opacity:$op/100; + opacity:$op/100; +} + +/* rows in listview should alternate colors */ +.row1 .book-list.listview { + background: #f6f9f9; + + .book-name:hover { + background: #f6f9f9; + } +} + +.row2 .book-list.listview { + background: #fff; + + .book-name:hover { + background: #fff; + } +} + +div.book-list.listview{ + clear:both; + display:block; + vertical-align: middle; + @include height(43px); + margin:0 5px 0 0; + padding:7px 0; + position: relative; + + /* row is a container for divs with individual content elements */ + /* these elements are styled differently to create list and panel views */ + div { + &.unglue-this { + float: left; + } + &.book-thumb { + margin-right: 5px; + float: left; + } + &.book-name { + width:235px; + margin-right:10px; + background:url("#{$image-base}booklist/booklist-vline.png") right center no-repeat; + float: left; + + .title { + display:block; + line-height:normal; + overflow: hidden; + @include height(19px); + margin-bottom: 5px; + font-weight:bold; + } + + .listview.author { + overflow: hidden; + display:block; + line-height:normal; + @include height(19px); + } + + &.listview:hover { + // allow titles and authors to expand onhover + overflow: visible; + + width: auto; + min-width: 219px; + + margin-top: -1px; + padding-right: 15px; + border: 1px solid $blue-grey; + @include border-radius(0, 10px, 10px, 0); + border-left: none; + } + + &.listview { + z-index:100; + // z-index only works on positioned elements, so if you + // do not include this the absolutely positioned add-wishlist + // div stacks above it! crazytown. + position: absolute; + left: 42px; + } + } + &.add-wishlist, &.remove-wishlist, &.on-wishlist, &.create-account, &.pledge { + margin-right: 10px; + padding-right: 10px; + width: 136px; + background:url("#{$image-base}booklist/booklist-vline.png") right center no-repeat; + + //position: absolute; + margin-left:255px; + float:left; + + span { + font-weight:normal; + color:$text-blue; + text-transform: none; + padding-left:20px; + } + + span.booklist_pledge { + padding-left: 18px; + } + + } + + &.pledge span.booklist_pledge { + padding-left: 0; + } + + &.add-wishlist span, &.create-account span { + background:url("#{$image-base}booklist/add-wishlist.png") left center no-repeat; + } + + &.add-wishlist span.booklist_pledge { + background: none; + } + + &.remove-wishlist span { + background:url("#{$image-base}booklist/remove-wishlist-blue.png") left center no-repeat; + } + + &.on-wishlist > span, > span.on-wishlist { + background:url("#{$image-base}checkmark_small.png") left center no-repeat; + } + + &.booklist-status { + //width: 110px; + margin-right:85px; + float: left; + } + } +} + +div.add-wishlist, div.remove-wishlist { + cursor: pointer; +} + +.booklist-status.listview { + span.booklist-status-label { + display: none; + } + + span.booklist-status-text { + float:left; + display:block; + padding-right:5px; + max-width: 180px; + overflow: hidden; + } + + .read_itbutton { + margin-top: 4px; + } +} + +div.unglue-this { + a { + text-transform:uppercase; + color:$text-blue; + font-size:11px; + font-weight:bold; + } + + &.complete { + .unglue-this-inner1 { + background:url($background-booklist) 0 -84px no-repeat; + height:42px; + } + .unglue-this-inner2 { + background:url($background-booklist) 100% -126px no-repeat; + margin-left:29px; + height:42px; + padding-right:10px; + } + a { + color:#fff; + display: block; + } + } + + &.processing { + .unglue-this-inner1 { + background:url($background-booklist) 0 0 no-repeat; + height:42px; + } + + .unglue-this-inner2 { + background:url($background-booklist) 100% -42px no-repeat; + margin-left:25px; + height:42px; + padding-right:10px; + } + } +} + +ul.book-list-view { + padding:0; + margin:15px; + float:right; + list-style:none; + + li { + float:left; + margin-right:10px; + display:block; + vertical-align:middle; + line-height:22px; + &:hover { + color: $medium-blue; + } + &.view-list a { + @include opacity(30); + &:hover{ + @include opacity(100); + } + } + &.view-list a.chosen{ + @include opacity(100); + &:hover{ + text-decoration: none; + } + } + } +} + +div.navigation { + float: left; + clear:both; + width:100%; + color:$dark-blue; +} + +ul.navigation { + float:right; + padding:0; + margin:0; + list-style:none; + + li { + float: left; + line-height:normal; + margin-right:5px; + + a { + color:$dark-blue; + font-weight:normal; + } + + &.arrow-l a { + @include navigation-arrows(0, -168px); + } + + &.arrow-r a { + @include navigation-arrows(-1px, -185px); + } + } +} + +ul.navigation li a:hover, ul.navigation li.active a { + color: $bright-blue; + text-decoration:underline; +} + +.unglue-button { + display: block; + border: 0; +} + +.book-thumb.listview a { + display:block; + height: 50px; + width: 32px; + overflow:hidden; + position:relative; + z-index:1; + + &:hover { + overflow:visible; + z-index:1000; + border:none; + } + + img { + position:absolute; + /* the excerpt you get looks cooler if you select from the middle, but + the popup version doesn't extend past the containing div's boundaries, + so the positioned part is cut off. + top:-20px; + left:-50px; + */ + } +} + +.listview.icons { + position: absolute; + right: 31px; + + .booklist-status-img { + @include one-border-radius(4px); + background-color: #fff; + margin-top: 4px; + height: 37px; + + img { + padding: 5px; + } + } + .booklist-status-label, { + display: none; + } + + .boolist-ebook img { + margin-top: 6px; + } +} + +div#content-block-content { + padding-bottom: 10px; +} + +.listview.panelback, .listview.panelback div { + display: none; +} + + +.nobold { + font-weight: normal; +} + +div#libtools { + margin-left: 15px; + margin-bottom: 1em; + border:1px solid $blue-grey; + border-radius: 10px; + padding: 10px; + + p { + margin-top: 0px; + } + div { + margin-top: 0px; + margin-left: 2em ; + } +} + +#facet_block div { + background:url($background-header) 100% -223px no-repeat; + padding: 7px 7px 15px 7px; + p { + padding: 0 10px 0 10px; + font-size: smaller; + } + + p:first-child { + font-size: larger; + margin-top: 5px; + img { + float:left; + padding-right:0.5em; + } + } +} diff --git a/static/scss/book_panel2.css b/static/scss/book_panel2.css index 81e2a2d9..dcf1c0e3 100644 --- a/static/scss/book_panel2.css +++ b/static/scss/book_panel2.css @@ -1,3 +1,3 @@ -.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.buyit{font-size:13pt;color:#8dc63f}#main-wrapper{height:100%;width:725px;margin:0px;padding:0px 0px}.panelview.tabs{padding:5px 0px;margin:0px;width:142px;float:left}.panelview.tabs span.active{padding:15px;margin:15px 0px;font-weight:bold}.panelview.book-list{font-size:12px;width:120px;line-height:16px;margin:auto;padding:0px 5px 5px 5px;height:300px;background-color:#ffffff;color:#3d4e53;border:5px solid #edf3f4;position:relative}.panelview.book-list:hover{color:#3d4e53}.panelview.book-list img{padding:5px 0px;margin:0px}.panelview.book-list .pledge.side1{display:none}.panelview.remove-wishlist,.panelview.on-wishlist,.panelview.create-account,.panelview.add-wishlist{display:none}.panelview.book-name div{font-size:12px;line-height:16px;max-height:32px;color:#3d4e53;overflow:hidden}.panelview.book-name div a{color:#6994a3}.panelview.booklist-status{display:none}.panelview.icons{position:absolute;bottom:-3px;width:140px}.panelview.icons .booklist-status-img{float:left}.panelview.icons .booklist-status-label{position:absolute;color:#8dc63f;padding-left:5px;left:40px;bottom:5px;font-size:17px;margin-bottom:3px}.panelview.icons .panelnope{display:none}.panelview.icons .rounded{margin-bottom:7px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url(% "%sheader-button-%s.png","/static/images/","grey") left bottom repeat-x}.panelview.boolist-ebook a{display:none}div.panelview.side1{display:visible}div.panelview.side2{display:none}.panelback{position:relative}.greenpanel2{font-size:12px;width:120px;line-height:16px;margin:0;padding:10px;height:295px;background-color:#8dc63f;color:#fff;position:absolute;top:-5px;left:-10px}.greenpanel_top{height:135px}.greenpanel2 .button_text{height:30px;line-height:30px}.greenpanel2 .bottom_button{position:absolute;bottom:0px;height:26px}.greenpanel2 .add_button{position:absolute;bottom:60px;height:26px}.unglued_white{font-size:12px;margin:0px auto 10px auto;padding:5px 0 10px 0;height:58px}.unglued_white p{margin:0}.read_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38;display:block}.read_itbutton span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 30px;color:#73a334;background:url("/static/images/book-panel/book_icon.png") no-repeat 10% center}.read_itbutton span:hover{text-decoration:none}.read_itbutton span:hover{text-decoration:none;color:#3d4e53}.read_itbutton.pledge{background-image:url("/static/images/icons/pledgearrow-green.png");background-repeat:no-repeat;background-position:90% center}.read_itbutton.pledge span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334;background:none}.read_itbutton.pledge span:hover{text-decoration:none}.read_itbutton.pledge span:hover{text-decoration:none;color:#3d4e53}.read_itbutton_fail{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.read_itbutton_fail span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 15px;color:#73a334;background:none}.read_itbutton_fail span:hover{text-decoration:none}.panelview.panelfront.icons .read_itbutton{margin-bottom:7px;height:30px;line-height:30px}.Unglue_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.Unglue_itbutton a{background-image:url("/static/images/book-panel/unglue_icon.png");height:40px;line-height:40px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334}.Unglue_itbutton a:hover{text-decoration:none}.moreinfo.add-wishlist,.moreinfo.create-account{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/add_wish_icon.png") no-repeat left center;padding-right:0}.moreinfo.add-wishlist a,.moreinfo.add-wishlist span,.moreinfo.create-account a,.moreinfo.create-account span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.add-wishlist a:hover,.moreinfo.add-wishlist span:hover,.moreinfo.create-account a:hover,.moreinfo.create-account span:hover{text-decoration:none;color:#3d4e53}.moreinfo.remove-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/booklist/remove-wishlist-white.png") no-repeat left center}.moreinfo.remove-wishlist a,.moreinfo.remove-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.remove-wishlist a:hover,.moreinfo.remove-wishlist span:hover{text-decoration:none;color:#3d4e53}.moreinfo.on-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/checkmark_small-white.png") no-repeat left center}.moreinfo.on-wishlist a,.moreinfo.on-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.on-wishlist a:hover,.moreinfo.on-wishlist span:hover{text-decoration:none;color:#3d4e53}.white_text{width:120px;height:60px;padding:15px 0px;margin:0px}.white_text a{color:#FFF;text-decoration:none}.white_text a:hover{text-decoration:none;color:#3d4e53}.white_text p{line-height:16px;max-height:32px;overflow:hidden;margin:0 0 5px 0}.moreinfo{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/more_icon.png") no-repeat left center;cursor:pointer}.moreinfo a,.moreinfo span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 21px;color:#FFF}.moreinfo a:hover,.moreinfo span:hover{text-decoration:none;color:#3d4e53}.moreinfo>div{height:30px;line-height:30px;padding-bottom:8px}.read{margin:15px auto 5px auto;padding:0px;width:140px;color:#8dc63f;height:40px;line-height:25px;float:left;position:absolute;bottom:-15px}.read p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read img{padding:5px 0px;margin:0px;float:left}.read2{margin:15px auto;padding:0px;width:130px;color:#8dc63f;height:40px;line-height:25px}.read2 p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read2 img{padding:0px;margin:0px;float:left}.right_add{padding:10px;margin:0px;float:right}.panelview.book-thumb{position:relative;margin:0px;padding:0px;left:0px}.panelview.book-thumb img{z-index:100;width:120px;height:182px}.panelview.book-thumb span{position:absolute;bottom:0;left:-10px;top:-5px;z-index:1000;height:auto} +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.buyit{font-size:13pt;color:#8dc63f}#main-wrapper{height:100%;width:725px;margin:0px;padding:0px 0px}.panelview.tabs{padding:5px 0px;margin:0px;width:142px;float:left}.panelview.tabs span.active{padding:15px;margin:15px 0px;font-weight:bold}.panelview.book-list{font-size:12px;width:120px;line-height:16px;margin:auto;padding:0px 5px 5px 5px;height:300px;background-color:#ffffff;color:#3d4e53;border:5px solid #edf3f4;position:relative}.panelview.book-list:hover{color:#3d4e53}.panelview.book-list img{padding:5px 0px;margin:0px}.panelview.book-list .pledge.side1{display:none}.panelview.remove-wishlist,.panelview.on-wishlist,.panelview.create-account,.panelview.add-wishlist{display:none}.panelview.book-name div{font-size:12px;line-height:16px;max-height:32px;color:#3d4e53;overflow:hidden}.panelview.book-name div a{color:#6994a3}.panelview.booklist-status{display:none}.panelview.icons{position:absolute;bottom:-3px;width:140px}.panelview.icons .booklist-status-img{float:left}.panelview.icons .booklist-status-label{position:absolute;color:#8dc63f;padding-left:5px;left:40px;bottom:5px;font-size:17px;margin-bottom:3px}.panelview.icons .panelnope{display:none}.panelview.icons .rounded{margin-bottom:7px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url("/static/images/header-button-grey.png") left bottom repeat-x}.panelview.boolist-ebook a{display:none}div.panelview.side1{display:visible}div.panelview.side2{display:none}.panelback{position:relative}.greenpanel2{font-size:12px;width:120px;line-height:16px;margin:0;padding:10px;height:295px;background-color:#8dc63f;color:#fff;position:absolute;top:-5px;left:-10px}.greenpanel_top{height:135px}.greenpanel2 .button_text{height:30px;line-height:30px}.greenpanel2 .bottom_button{position:absolute;bottom:0px;height:26px}.greenpanel2 .add_button{position:absolute;bottom:60px;height:26px}.unglued_white{font-size:12px;margin:0px auto 10px auto;padding:5px 0 10px 0;height:58px}.unglued_white p{margin:0}.read_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38;display:block}.read_itbutton span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 30px;color:#73a334;background:url("/static/images/book-panel/book_icon.png") no-repeat 10% center}.read_itbutton span:hover{text-decoration:none}.read_itbutton span:hover{text-decoration:none;color:#3d4e53}.read_itbutton.pledge{background-image:url("/static/images/icons/pledgearrow-green.png");background-repeat:no-repeat;background-position:90% center}.read_itbutton.pledge span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334;background:none}.read_itbutton.pledge span:hover{text-decoration:none}.read_itbutton.pledge span:hover{text-decoration:none;color:#3d4e53}.read_itbutton_fail{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.read_itbutton_fail span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 15px;color:#73a334;background:none}.read_itbutton_fail span:hover{text-decoration:none}.panelview.panelfront.icons .read_itbutton{margin-bottom:7px;height:30px;line-height:30px}.Unglue_itbutton{width:118px;height:35px;line-height:35px;padding:0px 0px;background:#FFF;margin:0px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.Unglue_itbutton a{background-image:url("/static/images/book-panel/unglue_icon.png");height:40px;line-height:40px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0px 0px 0px 25px;color:#73a334}.Unglue_itbutton a:hover{text-decoration:none}.moreinfo.add-wishlist,.moreinfo.create-account{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/add_wish_icon.png") no-repeat left center;padding-right:0}.moreinfo.add-wishlist a,.moreinfo.add-wishlist span,.moreinfo.create-account a,.moreinfo.create-account span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.add-wishlist a:hover,.moreinfo.add-wishlist span:hover,.moreinfo.create-account a:hover,.moreinfo.create-account span:hover{text-decoration:none;color:#3d4e53}.moreinfo.remove-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/booklist/remove-wishlist-white.png") no-repeat left center}.moreinfo.remove-wishlist a,.moreinfo.remove-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.remove-wishlist a:hover,.moreinfo.remove-wishlist span:hover{text-decoration:none;color:#3d4e53}.moreinfo.on-wishlist{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/checkmark_small-white.png") no-repeat left center}.moreinfo.on-wishlist a,.moreinfo.on-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.on-wishlist a:hover,.moreinfo.on-wishlist span:hover{text-decoration:none;color:#3d4e53}.white_text{width:120px;height:60px;padding:15px 0px;margin:0px}.white_text a{color:#FFF;text-decoration:none}.white_text a:hover{text-decoration:none;color:#3d4e53}.white_text p{line-height:16px;max-height:32px;overflow:hidden;margin:0 0 5px 0}.moreinfo{width:120px;height:30px;padding:0px;margin:0 0 0 0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/more_icon.png") no-repeat left center;cursor:pointer}.moreinfo a,.moreinfo span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 21px;color:#FFF}.moreinfo a:hover,.moreinfo span:hover{text-decoration:none;color:#3d4e53}.moreinfo>div{height:30px;line-height:30px;padding-bottom:8px}.read{margin:15px auto 5px auto;padding:0px;width:140px;color:#8dc63f;height:40px;line-height:25px;float:left;position:absolute;bottom:-15px}.read p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read img{padding:5px 0px;margin:0px;float:left}.read2{margin:15px auto;padding:0px;width:130px;color:#8dc63f;height:40px;line-height:25px}.read2 p{margin:0px;padding:10px 3px;width:50px;font-size:10pt;float:left}.read2 img{padding:0px;margin:0px;float:left}.right_add{padding:10px;margin:0px;float:right}.panelview.book-thumb{position:relative;margin:0px;padding:0px;left:0px}.panelview.book-thumb img{z-index:100;width:120px;height:182px}.panelview.book-thumb span{position:absolute;bottom:0;left:-10px;top:-5px;z-index:1000;height:auto} /*# sourceMappingURL=../../../../../static/scss/book_panel2.css.map */ \ No newline at end of file diff --git a/static/scss/comments.css b/static/scss/comments.css new file mode 100644 index 00000000..2d8dab7c --- /dev/null +++ b/static/scss/comments.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.comments{clear:both;padding:5px;margin:0 5px 8px 0;width:95%}.comments.row1{background:#f6f9f9}.comments.row2{background:#fff}.comments div{float:left}.comments div img{margin:0 5px}.comments .image img{height:100px}.comments:after{content:".";display:block;height:0;clear:both;visibility:hidden}.comments .nonavatar{width:620px}.comments .nonavatar span{padding-right:5px}.comments .nonavatar span.text:before{content:"\201C";font-size:15px;font-weight:bold}.comments .nonavatar span.text:after{content:"\201D";font-size:15px;font-weight:bold}.comments .avatar{float:right;margin:0 auto;padding-top:5px}.official{border:3px #B8DDE0 solid;margin-top:3px;margin-bottom:5px;padding-left:2px} + +/*# sourceMappingURL=../../../../../static/scss/comments.css.map */ \ No newline at end of file diff --git a/static/scss/comments.scss b/static/scss/comments.scss new file mode 100644 index 00000000..0feb970b --- /dev/null +++ b/static/scss/comments.scss @@ -0,0 +1,70 @@ +@import "variables.scss"; + +.comments { + clear: both; + padding: 5px; + margin: 0 5px 8px 0; + //min-height: 105px; + width: 95%; + + &.row1 { + background: #f6f9f9; + } + + &.row2 { + background: #fff; + } + + div { + float: left; + + img { + margin: 0 5px; + } + } + + .image img { + height: 100px; + } + + // so div will stretch to height of content + &:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + + .nonavatar { + width: 620px; + + span { + padding-right: 5px; + + &.text:before { + content: "\201C"; + font-size: $font-size-larger; + font-weight: bold; + } + + &.text:after { + content: "\201D"; + font-size: $font-size-larger; + font-weight: bold; + } + } + } + + .avatar { + float: right; + margin: 0 auto; + padding-top: 5px; + } +} +.official { + border: 3px #B8DDE0 solid; + margin-top: 3px; + margin-bottom: 5px; + padding-left: 2px; +} \ No newline at end of file diff --git a/static/scss/documentation2.css b/static/scss/documentation2.css new file mode 100644 index 00000000..d025d7d9 --- /dev/null +++ b/static/scss/documentation2.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.user-block{width:100%;clear:both}#user-block1{width:100%}#user-block1 a#readon{float:left}.user-block-hide .quicktour.last{background:none}.learnmore_block{float:left;width:100%;clear:both;border-top:solid 1px #8ac3d7;margin-top:20px}.learnmore_block .learnmore_row{border-bottom:dashed 2px #8ac3d7;clear:left;width:68%}.learnmore_block .arrow{font-size:24pt;color:#8ac3d7;line-height:48pt;float:left;padding-right:8px;padding-left:8px;padding-top:20px;font-size:24pt}.learnmore_block .quicktour{width:20%;float:left;font-style:italic;line-height:20px;font-size:13px;margin-top:0;text-align:center;min-height:64px}.learnmore_block .quicktour .highlight{font-weight:bold}.learnmore_block .quicktour .programlink{margin-top:20px}.learnmore_block .quicktour .panelback{margin-top:21px}.learnmore_block .quicktour .panelfront{font-size:48pt;line-height:48pt;font-style:normal}.learnmore_block .quicktour .panelfront .makeaskgive{position:relative;z-index:1;font-size:40pt;top:10px;right:10pt;text-shadow:4px 2px 4px white}.learnmore_block .quicktour .panelfront .qtbutton{position:relative;z-index:0;opacity:0.8}.learnmore_block .quicktour .panelfront .make{line-height:10pt;color:red;font-size:12pt;top:0;left:50px}.learnmore_block .quicktour .panelfront .qtreadit{line-height:0;position:relative;height:34px}.learnmore_block .quicktour .panelfront .qtreadittext{top:-15px;left:50px;line-height:10pt}.learnmore_block .quicktour .panelfront input{line-height:10pt;display:inherit;font-size:10pt;padding:.7em 1em;top:-15px}.learnmore_block .quicktour.last{padding-left:10px;font-size:20px;width:28%;padding-top:20px}.learnmore_block .quicktour.last .signup{color:#8dc63f;font-weight:bold;margin-top:10px}.learnmore_block .quicktour.last .signup img{margin-left:5px;vertical-align:middle;margin-bottom:3px}.learnmore_block .quicktour.right{float:right}input[type="submit"].qtbutton{float:none;margin:0}#block-intro-text div{display:none;line-height:25px;padding-bottom:10px}#block-intro-text div#active{display:inherit}body{line-height:19.5px}.have-right #js-main-container{float:left}.js-main-container-inner{padding-left:15px}.have-right #js-rightcol{margin-top:50px;background:#edf3f4;border:1px solid #d6dde0;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.have-right #js-rightcol .jsmodule{border-bottom:1px solid #3c4e52;width:235px}.have-right #js-rightcol .jsmodule.last{border-bottom:none;padding-bottom:10px}.js-rightcol-padd{padding:10px}.doc h2{margin:20px 0;color:#3d4e53;font-size:15px;font-weight:bold}.doc h3{color:#3d4e53;font-weight:bold}.doc ul{list-style-type:none;padding:0;margin:0}.doc ul.errorlist li{background:none;margin-bottom:0}.doc ul li{margin-left:7px}.doc ul.terms{list-style:inherit;list-style-position:inside;padding-left:1em;text-indent:-1em}.doc ul.terms li{-moz-border-radius:auto;-webkit-border-radius:auto;border-radius:auto;background:inherit}.doc ul.bullets{list-style-type:disc;margin-left:9px}.doc div.inset{background:#edf3f4;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;padding:10px;font-style:italic}dt{font-style:italic;font-size:15px;margin-bottom:7px;border-top:solid #edf3f4 2px;border-bottom:solid #edf3f4 2px;padding:7px 0}dd{margin:0 0 0 7px;padding-bottom:7px}dd.margin{margin-left:7px}.doc ol li{margin-bottom:7px}.collapse ul{display:none}.faq,.answer{text-transform:none !important}.faq a,.answer a{color:#6994a3}.faq{cursor:pointer}.faq:hover{text-decoration:underline}.press_spacer{clear:both;height:0px}.presstoc{overflow:auto;clear:both;padding-bottom:10px}.presstoc div{float:left;padding-right:15px;margin-bottom:7px}.presstoc div.pressemail{border:solid 2px #3d4e53;padding:5px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;max-width:678px;margin-top:7px}.pressarticles div{margin-bottom:10px}.pressvideos>div{margin-bottom:15px;padding-bottom:7px;border-bottom:solid 1px #3d4e53;float:left}.pressvideos iframe,.pressvideos div.mediaborder{padding:5px;border:solid 5px #edf3f4}.pressimages{clear:both}.pressimages .outer{clear:both}.pressimages .outer div{float:left;width:25%;padding-bottom:10px}.pressimages .outer div.text{width:75%}.pressimages .outer div p{margin:0 auto;padding-left:10px;padding-right:10px}.pressimages .screenshot{width:150px;padding:5px;border:solid 5px #edf3f4}a.manage{background:#8dc63f;color:white;font-weight:bold;padding:0.5em 1em;cursor:pointer;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0}a.manage:hover{text-decoration:none}.rh_help{cursor:pointer;color:#8ac3d7}.rh_help:hover{text-decoration:underline}.rh_answer{display:none;padding-left:10px;margin-bottom:7px;border:solid 2px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-indent:0 !important}.work_campaigns{border:1px solid #d6dde0;margin:10px auto}.work_campaigns div{float:left}.work_campaigns div.campaign_info{width:60%;margin:5px}h2.thank-you{font-size:34px;color:#8dc63f;line-height:40px}.pledge_complete,.pledge_complete a{font-size:15px;line-height:18px;margin-bottom:15px}#js-slide .jsmodule.pledge{width:960px !important}ul.social.pledge{margin-bottom:100px}ul.social.pledge li{float:left;padding-right:30px !important}#widgetcode{float:right}div.pledge-container{width:100%}.yikes{color:#e35351;font-weight:bold}.call-to-action{color:#8dc63f} + +/*# sourceMappingURL=../../../../../static/scss/documentation2.css.map */ \ No newline at end of file diff --git a/static/scss/documentation2.scss b/static/scss/documentation2.scss new file mode 100644 index 00000000..32011a9b --- /dev/null +++ b/static/scss/documentation2.scss @@ -0,0 +1,290 @@ +// Styles basedocumentation.html and its descendants. +@import "variables.scss"; +@import "learnmore2.scss"; + +body { + line-height: $font-size-default*1.5; +} + +/* Containers */ +.have-right #js-main-container { + float: left; +} + +.js-main-container-inner { + padding-left:15px; +} + +.have-right #js-rightcol { + margin-top:50px; + background:$pale-blue; + border:1px solid $blue-grey; + @include one-border-radius(12px); + + .jsmodule { + border-bottom:1px solid #3c4e52; + width:235px; + + &.last { + border-bottom:none; + padding-bottom:10px; + } + } +} + +.js-rightcol-padd { + padding:10px; +} + + +/* Elements */ +.doc h2 { + margin:20px 0; + color:$text-blue; + font-size: $font-size-larger; + font-weight: bold; +} + +.doc h3 { + color:$text-blue; + font-weight:bold; +} + +.doc ul { + list-style-type: none; + padding:0; + margin:0; + + &.errorlist li { + background: none; + margin-bottom: 0; + } + + li { + margin-left: 7px; + } + + &.terms { + list-style: inherit; + list-style-position: inside; + padding-left: 1em; + text-indent: -1em; + + li { + @include one-border-radius(auto); + background: inherit; + } + } + + &.bullets { + list-style-type: disc; + margin-left: 9px; + } +} + +.doc div.inset { + background:$pale-blue; + @include one-border-radius(12px); + padding:10px; + font-style:italic; +} + +dt { + font-style: italic; + font-size: $font-size-larger; + margin-bottom: 7px; + border-top: solid $pale-blue 2px; + border-bottom: solid $pale-blue 2px; + padding: 7px 0; +} + +dd { + margin: 0 0 0 7px; + padding-bottom: 7px; + + &.margin { + margin-left: 7px; + } +} + +.doc ol li { + margin-bottom: 7px; +} + +.collapse ul { + display: none; +} + +.faq, .answer { + text-transform: none !important; + a { + color: $medium-blue; + } +} + +.faq { + cursor: pointer; + + &:hover { + text-decoration: underline; + } +} + +/* items on press page */ +.press_spacer { + clear:both; + height:0px; +} + +.presstoc { + div { + float: left; + padding-right: 15px; + margin-bottom: 7px; + + &.pressemail { + border: solid 2px $text-blue; + padding: 5px; + @include one-border-radius(7px); + max-width: 678px; + margin-top: 7px; + } + } + overflow: auto; + clear: both; + padding-bottom: 10px; +} + +.pressarticles div { + margin-bottom: 10px; +} + +.pressvideos { + > div { + margin-bottom: 15px; + padding-bottom: 7px; + border-bottom: solid 1px $text-blue; + float: left; + } + + iframe, div.mediaborder { + @include mediaborder-base; + } +} + +.pressimages { + .outer { + clear: both; + + div { + float: left; + width: 25%; + padding-bottom: 10px; + + &.text { + width: 75%; + } + + p { + margin: 0 auto; + padding-left: 10px; + padding-right: 10px; + } + } + } + clear: both; + + .screenshot { + width: 150px; + @include mediaborder-base; + } +} + +/* Miscellaneous */ +a.manage { + background: $call-to-action; + color: white; + font-weight: bold; + padding: 0.5em 1em; + cursor: pointer; + @include one-border-radius(5px); + border: 1px solid $blue-grey; + + &:hover { + text-decoration: none; + } +} + +.rh_help { + cursor: pointer; + color: $bright-blue; + + &:hover { + text-decoration: underline; + } +} + +.rh_answer { + display: none; + padding-left: 10px; + margin-bottom: 7px; + border: solid 2px $blue-grey; + @include one-border-radius(5px); + text-indent: 0 !important; +} + +.work_campaigns { + border: 1px solid $blue-grey; + margin: 10px auto; + + div { + float: left; + + &.campaign_info { + width: 60%; + margin: 5px; + } + } +} + +h2.thank-you { + font-size: 34px; + color: $call-to-action; + line-height: 40px; +} + +.pledge_complete, .pledge_complete a { + font-size: $font-size-larger; + line-height: 18px; + margin-bottom: 15px; +} + +#js-slide .jsmodule.pledge { + width: 960px !important; +} + +ul.social.pledge { + li { + float: left; + padding-right: 30px !important; + } + + margin-bottom: 100px; +} + +#widgetcode { + float: right; +} + +div.pledge-container { + width: 100%; +} + +.yikes { + color: $alert; + font-weight: bold; +} + +.call-to-action { + color: $call-to-action; +} \ No newline at end of file diff --git a/static/scss/enhanced_download.css b/static/scss/enhanced_download.css new file mode 100644 index 00000000..eddde638 --- /dev/null +++ b/static/scss/enhanced_download.css @@ -0,0 +1,3 @@ +.buttons,.yes_js,.other_instructions_paragraph{display:inherit}.instructions>div:not(.active){display:none}.no_js{display:none !important}.active{display:inherit !important} + +/*# sourceMappingURL=../../../../../static/scss/enhanced_download.css.map */ \ No newline at end of file diff --git a/static/scss/enhanced_download.scss b/static/scss/enhanced_download.scss new file mode 100644 index 00000000..8e1032f0 --- /dev/null +++ b/static/scss/enhanced_download.scss @@ -0,0 +1,15 @@ +.buttons, .yes_js, .other_instructions_paragraph { + display: inherit; +} + +.instructions > div:not(.active) { + display: none; +} + +.no_js { + display: none !important; +} + +.active { + display: inherit !important; +} \ No newline at end of file diff --git a/static/scss/enhanced_download_ie.css b/static/scss/enhanced_download_ie.css new file mode 100644 index 00000000..9967137e --- /dev/null +++ b/static/scss/enhanced_download_ie.css @@ -0,0 +1,3 @@ +.yes_js,.other_instructions_paragraph{display:inherit}.instructions>div{display:none}.no_js{display:none !important}.active{display:inherit !important} + +/*# sourceMappingURL=../../../../../static/scss/enhanced_download_ie.css.map */ \ No newline at end of file diff --git a/static/scss/enhanced_download_ie.scss b/static/scss/enhanced_download_ie.scss new file mode 100644 index 00000000..60e2a799 --- /dev/null +++ b/static/scss/enhanced_download_ie.scss @@ -0,0 +1,16 @@ +.yes_js, .other_instructions_paragraph { + display: inherit; +} + +.instructions > div { + display: none; +} + +.no_js { + display: none !important; +} + +/* the not selector doesn't work in IE <= 8 */ +.active { + display: inherit !important; +} \ No newline at end of file diff --git a/static/scss/landingpage4.css b/static/scss/landingpage4.css index 622b1356..98425ddb 100644 --- a/static/scss/landingpage4.css +++ b/static/scss/landingpage4.css @@ -1,3 +1,3 @@ -.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.mediaborder{padding:5px;border:solid 5px #EDF3F4}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.mediaborder{padding:5px;border:solid 5px #EDF3F4}.user-block{width:100%;clear:both}#user-block1{width:100%}#user-block1 a#readon{float:left}.user-block-hide .quicktour.last{background:none}.learnmore_block{float:left;width:100%;clear:both;border-top:solid 1px #8ac3d7;margin-top:20px}.learnmore_block .learnmore_row{border-bottom:dashed 2px #8ac3d7;clear:left;width:68%}.learnmore_block .arrow{font-size:24pt;color:#8ac3d7;line-height:48pt;float:left;padding-right:8px;padding-left:8px;padding-top:20px;font-size:24pt}.learnmore_block .quicktour{width:20%;float:left;font-style:italic;line-height:20px;font-size:13px;margin-top:0;text-align:center;min-height:64px}.learnmore_block .quicktour .highlight{font-weight:bold}.learnmore_block .quicktour .programlink{margin-top:20px}.learnmore_block .quicktour .panelback{margin-top:21px}.learnmore_block .quicktour .panelfront{font-size:48pt;line-height:48pt;font-style:normal}.learnmore_block .quicktour .panelfront .makeaskgive{position:relative;z-index:1;font-size:40pt;top:10px;right:10pt;text-shadow:4px 2px 4px white}.learnmore_block .quicktour .panelfront .qtbutton{position:relative;z-index:0;opacity:0.8}.learnmore_block .quicktour .panelfront .make{line-height:10pt;color:red;font-size:12pt;top:0;left:50px}.learnmore_block .quicktour .panelfront .qtreadit{line-height:0;position:relative;height:34px}.learnmore_block .quicktour .panelfront .qtreadittext{top:-15px;left:50px;line-height:10pt}.learnmore_block .quicktour .panelfront input{line-height:10pt;display:inherit;font-size:10pt;padding:.7em 1em;top:-15px}.learnmore_block .quicktour.last{padding-left:10px;font-size:20px;width:28%;padding-top:20px}.learnmore_block .quicktour.last .signup{color:#8dc63f;font-weight:bold;margin-top:10px}.learnmore_block .quicktour.last .signup img{margin-left:5px;vertical-align:middle;margin-bottom:3px}.learnmore_block .quicktour.right{float:right}input[type="submit"].qtbutton{float:none;margin:0}#block-intro-text div{display:none;line-height:25px;padding-bottom:10px}#block-intro-text div#active{display:inherit}#expandable{display:none}#main-container.main-container-fl .js-main{width:968px;background:#fff url("${image-base}landingpage/container-top.png") top center no-repeat}#js-maincol-fl{padding:30px 30px 0 30px;overflow:hidden}#js-maincol-fl #content-block{background:none;padding:0}#js-maincol-fl #js-main-container{float:left;width:672px}#js-maincol-fl .js-main-container-inner{padding-right:40px}#js-maincol-fl h2.page-heading{margin:0 0 20px 0;color:#3d4e53;font-size:19px;font-weight:bold}#user-block1,.user-block2{float:left}#user-block1 #block-intro-text{float:left;width:702px;font-size:19px}#user-block1 a#readon{font-size:15px}#js-rightcol,#js-rightcol2{float:right;width:230px}#js-rightcol .jsmodule,#js-rightcol2 .jsmodule{float:left;width:208px;background:#edf3f4;border:1px solid #d6dde0;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;margin-bottom:10px;padding:0 10px 10px 10px}#js-rightcol .jsmodule input,#js-rightcol2 .jsmodule input{border:none;height:36px;line-height:36px;width:90%;outline:none;padding-left:16px;font-size:15px}#js-rightcol .jsmodule input.signup,#js-rightcol2 .jsmodule input.signup{border:medium none;cursor:pointer;display:inline-block;overflow:hidden;padding:0 31px 0 11px;width:111px;margin-bottom:10px}#js-rightcol .jsmodule input.donate,#js-rightcol2 .jsmodule input.donate{cursor:pointer;display:inline-block;overflow:hidden;padding:0 31px 0 11px;width:50%}#js-rightcol .jsmodule .donate_amount,#js-rightcol2 .jsmodule .donate_amount{text-align:center}#js-rightcol .jsmodule div,#js-rightcol2 .jsmodule div{padding:0px;margin:0px}#js-rightcol div.button,#js-rightcol2 div.button{padding-top:10px;text-align:center;color:#FFF}#js-rightcol #donatesubmit,#js-rightcol2 #donatesubmit{font-size:15px}#js-rightcol label,#js-rightcol2 label{width:100%;display:block;clear:both;padding:10px 0 5px 0}.js-rightcol-padd{margin:0px}h3.heading{color:#3d4e53;font-weight:bold}ul.ungluingwhat{list-style:none;padding:0;margin:0 -10px}ul.ungluingwhat li{margin-bottom:3px;background:#fff;padding:10px;display:block;overflow:hidden}ul.ungluingwhat li>span{float:left}ul.ungluingwhat .user-avatar{width:43px}ul.ungluingwhat .user-avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}ul.ungluingwhat .user-book-info{margin-left:5px;width:160px;word-wrap:break-word;font-size:13px;line-height:16.9px}ul.ungluingwhat .user-book-info a{font-weight:normal}div.typo2{background:#edf3f4;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;padding:10px;font-style:italic}div.signup_btn{display:block;overflow:hidden}div.signup_btn a{background:url("${image-base}bg.png") no-repeat scroll right top transparent;color:#fff;display:block;font-size:13px;font-weight:bold;height:36px;line-height:36px;letter-spacing:1px;text-decoration:none;text-transform:capitalize;float:left}div.signup_btn a span{background:url("${image-base}bg.png") no-repeat scroll -770px -36px transparent;display:block;margin-right:29px;padding:0 5px 0 15px}.have-content-right-module .item-content{float:left;width:364px;font-size:15px;height:132px;border-bottom:7px solid #8ac3d7}.have-content-right-module .item-content p{margin-bottom:20px;line-height:135%}.have-content-right-module .item-content h2.page-heading{padding-right:97px;line-height:43px;padding-bottom:4px;padding-top:5px}.have-content-right-module .content-right-module{width:268px;float:right}.have-content-right-module .content-right-module h3{color:#8ac3d7;text-transform:uppercase;font-size:24px;font-weight:normal;padding:0;margin:0 0 16px 0}h2.page-heading{color:#3c4e52;font-size:28px !important;font-style:italic;font-weight:normal !important}#js-maincontainer-faq{clear:both;overflow:hidden;margin:15px 0;width:100%}.js-maincontainer-faq-inner{float:right;color:#3d4e53;font-size:15px;padding-right:60px}.js-maincontainer-faq-inner a{font-weight:normal;color:#3d4e53;text-decoration:underline}h3.module-title{padding:10px 0;font-size:19px;font-weight:normal;margin:0}.landingheader{border-bottom:solid 5px #6994a3;float:left;height:134px}h3.featured_books{clear:both;font-weight:normal;background:#edf3f4;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;padding:10px;-webkit-margin-before:0}a.more_featured_books{float:right;width:57px;height:305px;margin:5px 0;border:5px solid white;line-height:305px;text-align:center}a.more_featured_books:hover{cursor:pointer;border-color:#edf3f4;color:#8dc63f}a.more_featured_books.short{height:85px;line-height:85px}.spacer{height:15px;width:100%;clear:both}ul#as_seen_on{margin:15px 0;position:relative;height:80px;padding:0px}ul#as_seen_on li{float:left;list-style-type:none;padding:10px;line-height:80px}ul#as_seen_on li:hover{background:#8ac3d7}ul#as_seen_on li img{vertical-align:middle;max-width:131px}.speech_bubble{position:relative;margin:1em 0;border:5px solid #6994a3;color:#3d4e53;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;background:#fff;font-size:19px;padding:1.5em}.speech_bubble:before{content:"";position:absolute;top:-20px;bottom:auto;left:auto;right:60px;border-width:0 20px 20px;border-style:solid;border-color:#6994a3 transparent;display:block;width:0}.speech_bubble:after{content:"";position:absolute;top:-13px;bottom:auto;left:auto;right:67px;border-width:0 13px 13px;border-style:solid;border-color:#fff transparent;display:block;width:0}.speech_bubble span{padding-left:1em}.speech_bubble span:before{position:absolute;top:.75em;left:.75em;font-size:38px;content:"\201C"}.speech_bubble span:after{position:absolute;top:.75em;font-size:38px;content:"\201D"}#footer{clear:both;margin-top:30px} +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.user-block{width:100%;clear:both}#user-block1{width:100%}#user-block1 a#readon{float:left}.user-block-hide .quicktour.last{background:none}.learnmore_block{float:left;width:100%;clear:both;border-top:solid 1px #8ac3d7;margin-top:20px}.learnmore_block .learnmore_row{border-bottom:dashed 2px #8ac3d7;clear:left;width:68%}.learnmore_block .arrow{font-size:24pt;color:#8ac3d7;line-height:48pt;float:left;padding-right:8px;padding-left:8px;padding-top:20px;font-size:24pt}.learnmore_block .quicktour{width:20%;float:left;font-style:italic;line-height:20px;font-size:13px;margin-top:0;text-align:center;min-height:64px}.learnmore_block .quicktour .highlight{font-weight:bold}.learnmore_block .quicktour .programlink{margin-top:20px}.learnmore_block .quicktour .panelback{margin-top:21px}.learnmore_block .quicktour .panelfront{font-size:48pt;line-height:48pt;font-style:normal}.learnmore_block .quicktour .panelfront .makeaskgive{position:relative;z-index:1;font-size:40pt;top:10px;right:10pt;text-shadow:4px 2px 4px white}.learnmore_block .quicktour .panelfront .qtbutton{position:relative;z-index:0;opacity:0.8}.learnmore_block .quicktour .panelfront .make{line-height:10pt;color:red;font-size:12pt;top:0;left:50px}.learnmore_block .quicktour .panelfront .qtreadit{line-height:0;position:relative;height:34px}.learnmore_block .quicktour .panelfront .qtreadittext{top:-15px;left:50px;line-height:10pt}.learnmore_block .quicktour .panelfront input{line-height:10pt;display:inherit;font-size:10pt;padding:.7em 1em;top:-15px}.learnmore_block .quicktour.last{padding-left:10px;font-size:20px;width:28%;padding-top:20px}.learnmore_block .quicktour.last .signup{color:#8dc63f;font-weight:bold;margin-top:10px}.learnmore_block .quicktour.last .signup img{margin-left:5px;vertical-align:middle;margin-bottom:3px}.learnmore_block .quicktour.right{float:right}input[type="submit"].qtbutton{float:none;margin:0}#block-intro-text div{display:none;line-height:25px;padding-bottom:10px}#block-intro-text div#active{display:inherit}#expandable{display:none}#main-container.main-container-fl .js-main{width:968px;background:#fff url("/static/images/landingpage/container-top.png") top center no-repeat}#js-maincol-fl{padding:30px 30px 0 30px;overflow:hidden}#js-maincol-fl #content-block{background:none;padding:0}#js-maincol-fl #js-main-container{float:left;width:672px}#js-maincol-fl .js-main-container-inner{padding-right:40px}#js-maincol-fl h2.page-heading{margin:0 0 20px 0;color:#3d4e53;font-size:19px;font-weight:bold}#user-block1,.user-block2{float:left}#user-block1 #block-intro-text{float:left;width:702px;font-size:19px}#user-block1 a#readon{font-size:15px}#js-rightcol,#js-rightcol2{float:right;width:230px}#js-rightcol .jsmodule,#js-rightcol2 .jsmodule{float:left;width:208px;background:#edf3f4;border:1px solid #d6dde0;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;margin-bottom:10px;padding:0 10px 10px 10px}#js-rightcol .jsmodule input,#js-rightcol2 .jsmodule input{border:none;height:36px;line-height:36px;width:90%;outline:none;padding-left:16px;font-size:15px}#js-rightcol .jsmodule input.signup,#js-rightcol2 .jsmodule input.signup{border:medium none;cursor:pointer;display:inline-block;overflow:hidden;padding:0 31px 0 11px;width:111px;margin-bottom:10px}#js-rightcol .jsmodule input.donate,#js-rightcol2 .jsmodule input.donate{cursor:pointer;display:inline-block;overflow:hidden;padding:0 31px 0 11px;width:50%}#js-rightcol .jsmodule .donate_amount,#js-rightcol2 .jsmodule .donate_amount{text-align:center}#js-rightcol .jsmodule div,#js-rightcol2 .jsmodule div{padding:0px;margin:0px}#js-rightcol div.button,#js-rightcol2 div.button{padding-top:10px;text-align:center;color:#FFF}#js-rightcol #donatesubmit,#js-rightcol2 #donatesubmit{font-size:15px}#js-rightcol label,#js-rightcol2 label{width:100%;display:block;clear:both;padding:10px 0 5px 0}.js-rightcol-padd{margin:0px}h3.heading{color:#3d4e53;font-weight:bold}ul.ungluingwhat{list-style:none;padding:0;margin:0 -10px}ul.ungluingwhat li{margin-bottom:3px;background:#fff;padding:10px;display:block;overflow:hidden}ul.ungluingwhat li>span{float:left}ul.ungluingwhat .user-avatar{width:43px}ul.ungluingwhat .user-avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}ul.ungluingwhat .user-book-info{margin-left:5px;width:160px;word-wrap:break-word;font-size:13px;line-height:16.9px}ul.ungluingwhat .user-book-info a{font-weight:normal}div.typo2{background:#edf3f4;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;padding:10px;font-style:italic}div.signup_btn{display:block;overflow:hidden}div.signup_btn a{background:url("/static/images/bg.png") no-repeat scroll right top transparent;color:#fff;display:block;font-size:13px;font-weight:bold;height:36px;line-height:36px;letter-spacing:1px;text-decoration:none;text-transform:capitalize;float:left}div.signup_btn a span{background:url("/static/images/bg.png") no-repeat scroll -770px -36px transparent;display:block;margin-right:29px;padding:0 5px 0 15px}.have-content-right-module .item-content{float:left;width:364px;font-size:15px;height:132px;border-bottom:7px solid #8ac3d7}.have-content-right-module .item-content p{margin-bottom:20px;line-height:135%}.have-content-right-module .item-content h2.page-heading{padding-right:97px;line-height:43px;padding-bottom:4px;padding-top:5px}.have-content-right-module .content-right-module{width:268px;float:right}.have-content-right-module .content-right-module h3{color:#8ac3d7;text-transform:uppercase;font-size:24px;font-weight:normal;padding:0;margin:0 0 16px 0}h2.page-heading{color:#3c4e52;font-size:28px !important;font-style:italic;font-weight:normal !important}#js-maincontainer-faq{clear:both;overflow:hidden;margin:15px 0;width:100%}.js-maincontainer-faq-inner{float:right;color:#3d4e53;font-size:15px;padding-right:60px}.js-maincontainer-faq-inner a{font-weight:normal;color:#3d4e53;text-decoration:underline}h3.module-title{padding:10px 0;font-size:19px;font-weight:normal;margin:0}.landingheader{border-bottom:solid 5px #6994a3;float:left;height:134px}h3.featured_books{clear:both;font-weight:normal;background:#edf3f4;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;padding:10px;-webkit-margin-before:0}a.more_featured_books{float:right;width:57px;height:305px;margin:5px 0;border:5px solid white;line-height:305px;text-align:center}a.more_featured_books:hover{cursor:pointer;border-color:#edf3f4;color:#8dc63f}a.more_featured_books.short{height:85px;line-height:85px}.spacer{height:15px;width:100%;clear:both}ul#as_seen_on{margin:15px 0;position:relative;height:80px;padding:0px}ul#as_seen_on li{float:left;list-style-type:none;padding:10px;line-height:80px}ul#as_seen_on li:hover{background:#8ac3d7}ul#as_seen_on li img{vertical-align:middle;max-width:131px}.speech_bubble{position:relative;margin:1em 0;border:5px solid #6994a3;color:#3d4e53;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;background:#fff;font-size:19px;padding:1.5em}.speech_bubble:before{content:"";position:absolute;top:-20px;bottom:auto;left:auto;right:60px;border-width:0 20px 20px;border-style:solid;border-color:#6994a3 transparent;display:block;width:0}.speech_bubble:after{content:"";position:absolute;top:-13px;bottom:auto;left:auto;right:67px;border-width:0 13px 13px;border-style:solid;border-color:#fff transparent;display:block;width:0}.speech_bubble span{padding-left:1em}.speech_bubble span:before{position:absolute;top:.75em;left:.75em;font-size:38px;content:"\201C"}.speech_bubble span:after{position:absolute;top:.75em;font-size:38px;content:"\201D"}#footer{clear:both;margin-top:30px} /*# sourceMappingURL=../../../../../static/scss/landingpage4.css.map */ \ No newline at end of file diff --git a/static/scss/liblist.css b/static/scss/liblist.css new file mode 100644 index 00000000..4a583727 --- /dev/null +++ b/static/scss/liblist.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.items{clear:both;padding:5px;margin:0 5px 8px 0;width:95%}.items.row1{background:#f6f9f9}.items.row2{background:#fff}.items div{float:left}.items div img{margin:0 5px}.items .image img{height:100px}.items:after{content:".";display:block;height:0;clear:both;visibility:hidden}.items .nonavatar{width:620px;padding-top:5px}.items .nonavatar span{padding-right:5px}.items .nonavatar div.libname{width:100%}.items .nonavatar div.libname a{font-size:15px}.items .nonavatar div.libstat{width:25%;display:block}.items .avatar{float:left;margin:0 auto;padding-top:5px}.joined{border:3px #B8DDE0 solid;margin-top:3px;margin-bottom:5px;padding-left:2px}.joined em{font-color:#B8DDE0;font-style:italic} + +/*# sourceMappingURL=../../../../../static/scss/liblist.css.map */ \ No newline at end of file diff --git a/static/scss/liblist.scss b/static/scss/liblist.scss new file mode 100644 index 00000000..cd4f4b84 --- /dev/null +++ b/static/scss/liblist.scss @@ -0,0 +1,71 @@ +@import "variables.scss"; + +.items { + clear: both; + padding: 5px; + margin: 0 5px 8px 0; + //min-height: 105px; + width: 95%; + + &.row1 { + background: #f6f9f9; + } + + &.row2 { + background: #fff; + } + + div { + float: left; + + img { + margin: 0 5px; + } + } + + .image img { + height: 100px; + } + + // so div will stretch to height of content + &:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + .nonavatar { + width: 620px; + padding-top: 5px; + span { + padding-right: 5px; + } + div.libname{ + width: 100%; + a{ + font-size: $font-size-larger; + } + } + div.libstat { + width:25%; + display: block; + } + } + + .avatar { + float: left; + margin: 0 auto; + padding-top: 5px; + } +} +.joined { + border: 3px #B8DDE0 solid; + margin-top: 3px; + margin-bottom: 5px; + padding-left: 2px; + em { + font-color:#B8DDE0; + font-style:italic; + } +} \ No newline at end of file diff --git a/static/scss/libraries.css b/static/scss/libraries.css new file mode 100644 index 00000000..7d16cdba --- /dev/null +++ b/static/scss/libraries.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.doc h2.unglueit_loves_libraries{font-size:110px;text-align:center}.doc h3{text-align:center;font-style:italic;margin-bottom:37.5px}#widgetcode{display:none}ul.social.pledge{margin:0 !important}ul.social.pledge li{margin-top:7px !important}.clearfix{margin-bottom:14px}a,dt a{color:#6994a3} + +/*# sourceMappingURL=../../../../../static/scss/libraries.css.map */ \ No newline at end of file diff --git a/static/scss/libraries.scss b/static/scss/libraries.scss new file mode 100644 index 00000000..f4688150 --- /dev/null +++ b/static/scss/libraries.scss @@ -0,0 +1,32 @@ +@import "variables.scss"; + +.doc h2.unglueit_loves_libraries { + font-size: 110px; + text-align: center; +} + +.doc h3 { + text-align: center; + font-style: italic; + margin-bottom: $font-size-larger*2.5; +} + +#widgetcode { + display: none; +} + +ul.social.pledge { + margin: 0 !important; +} + +ul.social.pledge li { + margin-top: 7px !important; +} + +.clearfix { + margin-bottom: 14px; +} + +a, dt a { + color: $medium-blue; +} diff --git a/static/scss/lists.css b/static/scss/lists.css new file mode 100644 index 00000000..95481189 --- /dev/null +++ b/static/scss/lists.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.user-block2{width:48%;font-size:18px;padding-right:2%}#js-leftcol li.active_lang a{font-weight:bold}.show_langs:hover{text-decoration:underline}#lang_list{display:none}#tabs-1,#tabs-2,#tabs-3{margin-left:0}ul.tabs li a{height:41px;line-height:18px;padding-top:5px} + +/*# sourceMappingURL=../../../../../static/scss/lists.css.map */ \ No newline at end of file diff --git a/static/scss/lists.scss b/static/scss/lists.scss new file mode 100644 index 00000000..c9c588f2 --- /dev/null +++ b/static/scss/lists.scss @@ -0,0 +1,26 @@ +@import "variables.scss"; + +.user-block2 { + width: 48%; + font-size: 18px; + padding-right: 2%; +} +#js-leftcol li.active_lang a { + font-weight: bold; +} +.show_langs:hover{ + text-decoration: underline; +} +#lang_list { + display: none; +} + +#tabs-1, #tabs-2, #tabs-3 { + margin-left: 0; +} + +ul.tabs li a { + height: 41px; + line-height: 18px; + padding-top: 5px; +} \ No newline at end of file diff --git a/static/scss/manage_campaign.css b/static/scss/manage_campaign.css new file mode 100644 index 00000000..c05a8fa3 --- /dev/null +++ b/static/scss/manage_campaign.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}#tabs{border-bottom:4px solid #6994a3;clear:both;float:left;margin-top:10px;width:100%}#tabs ul.book-list-view{margin-bottom:4px !important}#tabs-1,#tabs-2,#tabs-3,#tabs-4{display:none}#tabs-1.active,#tabs-2.active,#tabs-3.active,#tabs-4.active{display:inherit}#tabs-2 textarea{width:95%}ul.tabs{float:left;padding:0;margin:0;list-style:none;width:100%}ul.tabs li{float:left;height:46px;line-height:20px;padding-right:2px;width:116px;background:none;margin:0;padding:0 2px 0 0}ul.tabs li.tabs4{padding-right:0px}ul.tabs li a{height:41px;line-height:18px;display:block;text-align:center;padding:0 10px;min-width:80px;-moz-border-radius:7px 7px 0 0;-webkit-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;background:#d6dde0;color:#3d4e53;padding-top:5px}ul.tabs li a:hover{text-decoration:none}ul.tabs li a div{padding-top:8px}ul.tabs li a:hover,ul.tabs li.active a{background:#6994a3;color:#fff}.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.book-detail{float:left;width:100%;clear:both;display:block}.book-cover{float:left;margin-right:10px;width:151px}.book-cover img{padding:5px;border:solid 5px #edf3f4}.mediaborder{padding:5px;border:solid 5px #edf3f4}.book-detail-info{float:left;width:309px}.book-detail-info h2.book-name,.book-detail-info h3.book-author,.book-detail-info h3.book-year{padding:0;margin:0;line-height:normal}.book-detail-info h2.book-name{font-size:19px;font-weight:bold;color:#3d4e53}.book-detail-info h3.book-author,.book-detail-info h3.book-year{font-size:13px;font-weight:normal;color:#3d4e53}.book-detail-info h3.book-author span a,.book-detail-info h3.book-year span a{font-size:13px;font-weight:normal;color:#6994a3}.book-detail-info>div{width:100%;clear:both;display:block;overflow:hidden;border-top:1px solid #edf3f4;padding:10px 0}.book-detail-info>div.layout{border:none;padding:0}.book-detail-info>div.layout div.pubinfo{float:left;width:auto;padding-bottom:7px}.book-detail-info .btn_wishlist span{text-align:right}.book-detail-info .find-book label{float:left;line-height:31px}.book-detail-info .find-link{float:right}.book-detail-info .find-link img{padding:2px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.book-detail-info .pledged-info{padding:10px 0;position:relative}.book-detail-info .pledged-info.noborder{border-top:none;padding-top:0}.book-detail-info .pledged-info .campaign-status-info{float:left;width:50%;margin-top:13px}.book-detail-info .pledged-info .campaign-status-info span{font-size:15px;color:#6994a3;font-weight:bold}.book-detail-info .thermometer{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;border:solid 2px #d6dde0;width:291px;padding:7px;position:relative;overflow:visible;background:-webkit-gradient(linear, left top, right top, from(#8dc63f), to(#CF6944));background:-webkit-linear-gradient(left, #CF6944, #8dc63f);background:-moz-linear-gradient(left, #CF6944, #8dc63f);background:-ms-linear-gradient(left, #CF6944, #8dc63f);background:-o-linear-gradient(left, #CF6944, #8dc63f);background:linear-gradient(left, #CF6944, #8dc63f);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='$alert', endColorstr='$call-to-action');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='$alert', endColorstr='$call-to-action')"}.book-detail-info .thermometer.successful{border-color:#8ac3d7;background:#edf3f4}.book-detail-info .thermometer .cover{position:absolute;right:0;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;width:50px;height:14px;margin-top:-7px;background:#f3f5f6}.book-detail-info .thermometer span{display:none}.book-detail-info .thermometer:hover span{display:block;position:absolute;z-index:200;right:0;top:-7px;font-size:19px;color:#6994a3;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .explainer span.explanation{display:none}.book-detail-info .explainer:hover span.explanation{display:block;position:absolute;z-index:200;right:0;top:12px;font-size:13px;font-weight:normal;color:#3d4e53;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .status{position:absolute;top:50%;right:0%;height:25px;margin-top:-12px}.preview_campaign{float:right;margin-right:40px}input[name="launch"]{display:none}#launchme{margin:15px auto}#premium_add span,#premium_add input[type="text"],#premium_add textarea{float:left}#premium_add input[type="submit"]{float:right}#premium_add input[type="text"]{width:33%}#premium_add textarea{width:60%}#premium_add .premium_add_label{width:30%;margin-right:2%}#premium_add .premium_field_label{width:1%;margin-left:-1%}div.edition_form{margin-bottom:2em} + +/*# sourceMappingURL=../../../../../static/scss/manage_campaign.css.map */ \ No newline at end of file diff --git a/static/scss/manage_campaign.scss b/static/scss/manage_campaign.scss new file mode 100644 index 00000000..aebbf3ae --- /dev/null +++ b/static/scss/manage_campaign.scss @@ -0,0 +1,48 @@ +@import "variables.scss"; +@import "campaign_tabs.scss"; +@import "book_detail.scss"; + +.preview_campaign { + float: right; + margin-right: 40px; +} + +input[name="launch"] { + display: none; +} + +#launchme { + margin: 15px auto; +} + +#premium_add { + span, input[type="text"], textarea { + float: left; + } + + input[type="submit"] { + float: right; + } + + input[type="text"] { + width: 33%; + } + + textarea { + width: 60%; + } + + .premium_add_label { + width: 30%; + margin-right: 2%; + } + + .premium_field_label { + width: 1%; + margin-left: -1%; + } +} + +div.edition_form { + margin-bottom: 2em; +} \ No newline at end of file diff --git a/static/scss/notices.scss b/static/scss/notices.scss new file mode 100644 index 00000000..03fcc87b --- /dev/null +++ b/static/scss/notices.scss @@ -0,0 +1,97 @@ +@import "variables.scss"; + +.notices_menu { + float: right; + @include one-border-radius(20px); + background: $pale-blue; + padding: 10px 20px; + margin: -15px auto 7px 7px; + + a { + font-size: $font-size-default; + font-weight: bold; + } +} + +#js-main-container { + float: none !important; + padding-right: 15px; +} + +/* notice_settings */ +th { + text-align: left; +} + +tr { + line-height:24px; + + &.row1{ + background: $pale-blue; + } +} + +td { + padding-left: 7px; + padding-right: 7px; + + &#last { + padding: 0; + } +} + +table input[type="submit"] { + float: right; + margin-right: 0; +} + +/* comment containers */ + +.comments { + border: solid 3px $blue-grey; + margin: 3px auto; + + hr { + margin: 10px auto 5px; + color: $blue-grey; + background-color: $blue-grey; + height:2px; + border: 0; + } + + .comments_book { + .mediaborder; + margin-right: 10px; + margin-bottom: 10px; + max-width: 80px; + + img { + max-width: 80px; + } + } + + .comments_textual { + padding: 10px 5px 5px; + + div { + margin-bottom: 5px; + } + } + + .comments_info { + border-bottom: solid 1px $blue-grey; + padding: 5px; + + div { + float: left; + } + + .comments_graphical { + padding: 5px auto; + } + + span { + text-indent: 0; + } + } +} \ No newline at end of file diff --git a/static/scss/registration2.css b/static/scss/registration2.css new file mode 100644 index 00000000..da79cdd7 --- /dev/null +++ b/static/scss/registration2.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}#login_centerer{padding:10px;width:960px}#registration{width:960px;padding:10px;margin:0 auto;padding:10px 0;font-size:13px;line-height:19.5px}#registration .helptext{font-style:italic}#registration .helptext:before{white-space:pre;content:"\A"}.login_box{border:solid 3px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin:10px auto;padding:9px;width:45%}.login_box .google_signup{padding:21px}.login_box input[type="text"],.login_box input[type="password"]{width:90%}#login{border:solid 3px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin:10px auto;float:none;padding:10px;width:50%}#login input[type="text"],#login input[type="password"]{width:90%}.actionbutton{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0;float:left}#welcomesearch label{display:block;margin:0 auto;font-size:19px;padding-bottom:10px}#welcomesearch p{margin-bottom:5px}#welcomesearch form{margin:0 auto;width:210px;background:url("/static/images/landingpage/search-box-two.png") 0 0 no-repeat;height:36px;display:block;overflow:hidden}#welcomesearch input.inputbox{border:none;color:#66942e;height:26px;line-height:26px;font-size:13px;float:left;padding:0;margin:5px 0 5px 20px;width:149px;outline:none}#welcomesearch input.inputbox:focus{border:none}#welcomesearch input.greenbutton[type="submit"]{background:url("/static/images/landingpage/search-button-two.png") 0 0 no-repeat;width:40px;height:40px;padding:0;margin:0;border:none;display:block;float:right;text-indent:-10000px;font-size:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.welcomealternatives{border-top:1px solid #d6dde0;margin-top:10px;padding-top:5px}label:before{content:"\A";white-space:pre} + +/*# sourceMappingURL=../../../../../static/scss/registration2.css.map */ \ No newline at end of file diff --git a/static/scss/registration2.scss b/static/scss/registration2.scss new file mode 100644 index 00000000..c096c5a0 --- /dev/null +++ b/static/scss/registration2.scss @@ -0,0 +1,124 @@ +@import "variables.scss"; + +#login_centerer { + padding:10px; + width: 960px; +} + +#registration { + width: 960px; + padding: 10px; + margin: 0 auto; + padding: 10px 0; + font-size: $font-size-default; + line-height: $font-size-default*1.5; + + .helptext { + font-style: italic; + + &:before { + white-space: pre; + content: "\A"; + } + } +} + +.login_box { + border: solid 3px $blue-grey; + @include one-border-radius(5px); + margin: 10px auto; + padding: 9px; + width: 45%; + + .google_signup { + padding: 21px; + } + + input[type="text"], input[type="password"] { + width: 90%; + } +} + +#login { + border: solid 3px $blue-grey; + @include one-border-radius(5px); + margin: 10px auto; + float: none; + padding: 10px; + width: 50%; + + + input[type="text"], input[type="password"] { + width: 90%; + } +} + +.actionbutton { + @include actionbuttons; + float: left; +} + +#welcomesearch { + label { + display: block; + margin: 0 auto; + font-size: $font-size-header; + padding-bottom: 10px; + } + + p { + margin-bottom: 5px; + } + + form { + margin: 0 auto; + width:210px; + background:url("#{$image-base}landingpage/search-box-two.png") 0 0 no-repeat; + height:36px; + display:block; + overflow:hidden; + } + + input { + &.inputbox { + border:none; + color:#66942e; + @include height(26px); + font-size: $font-size-default; + float:left; + padding:0; + margin:5px 0 5px 20px; + width: 149px; + outline: none; + + &:focus { + border: none; + } + } + + &.greenbutton[type="submit"] { + background:url("#{$image-base}landingpage/search-button-two.png") 0 0 no-repeat; + width:40px; + height:40px; + padding:0; + margin:0; + border:none; + display:block; + float: right; + text-indent:-10000px; + font-size:0; + @include one-border-radius(0); + } + } +} + +.welcomealternatives { + border-top: 1px solid $blue-grey; + margin-top: 10px; + padding-top: 5px; +} + +label:before { + content: "\A"; + white-space: pre; +} \ No newline at end of file diff --git a/static/scss/search.css b/static/scss/search.css new file mode 100644 index 00000000..cf07a8a7 --- /dev/null +++ b/static/scss/search.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url("/static/images/header-button-grey.png") left bottom repeat-x}.listview .rounded{line-height:normal;margin-right:0} + +/*# sourceMappingURL=../../../../../static/scss/search.css.map */ \ No newline at end of file diff --git a/static/scss/search.scss b/static/scss/search.scss new file mode 100644 index 00000000..26ed4f04 --- /dev/null +++ b/static/scss/search.scss @@ -0,0 +1,15 @@ +@import "variables.scss"; + +span.rounded { + @include roundedspan; +} + +span.grey { + @include supporter-color-span(#bacfd6, grey); +} + +.listview .rounded { + // cancelling out styles that would otherwise apply + line-height: normal; + margin-right: 0; +} diff --git a/static/scss/searchandbrowse2.css b/static/scss/searchandbrowse2.css index cb4c96a9..d95e8289 100644 --- a/static/scss/searchandbrowse2.css +++ b/static/scss/searchandbrowse2.css @@ -1,3 +1,3 @@ -.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.mediaborder{padding:5px;border:solid 5px #EDF3F4}#js-maincontainer-bot-block{clear:both;overflow:visible;margin-top:55px}#js-maincontainer-bot-block #js-search{-moz-border-radius:64px;-webkit-border-radius:64px;border-radius:64px;background-color:#8dc63f;width:652px;height:80px;overflow:hidden;clear:both;color:#fff}#js-maincontainer-bot-block #js-search label{line-height:80px;font-size:19px;float:left;padding:0;width:auto;padding:0 15px 0 30px}#js-maincontainer-bot-block #js-search form{float:left;width:210px;background:url("${image-base}landingpage/search-box-two.png") 0 0 no-repeat;height:36px;display:block;overflow:hidden;margin-top:22px}#js-slideshow{padding:0 30px;position:relative}#js-slideshow a.prev{text-indent:-10000px;font-size:0;width:15px;height:22px;display:block;position:absolute;top:45%;background:url("${image-base}landingpage/arrow-left.png") 0 0 no-repeat;left:0}#js-slideshow a.next{text-indent:-10000px;font-size:0;width:15px;height:22px;display:block;position:absolute;top:45%;background:url("${image-base}landingpage/arrow-right.png") 0 0 no-repeat;right:0}.spacer{float:left;margin:0 4px}#js-search input.inputbox{border:none;color:#66942e;height:26px;line-height:26px;font-size:13px;float:left;padding:0;margin:5px 0 5px 20px;width:149px;outline:none}#js-search input.greenbutton{background:url("${image-base}landingpage/search-button-two.png") 0 0 no-repeat;width:40px;height:40px;padding:0;margin:0;border:none;display:block;float:right;text-indent:-10000px;font-size:0}#js-slide .jsmodule>h3{background:url("${image-base}landingpage/bg-slide.png") bottom center no-repeat;padding-bottom:7px;padding-left:35px}#js-slide .jsmodule>h3 span{background:#8ac3d7;color:#fff;padding:10px 20px;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;font-size:19px;overflow:hidden;display:inline-block;font-weight:normal} +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}#js-maincontainer-bot-block{clear:both;overflow:visible;margin-top:55px}#js-maincontainer-bot-block #js-search{-moz-border-radius:64px;-webkit-border-radius:64px;border-radius:64px;background-color:#8dc63f;width:652px;height:80px;overflow:hidden;clear:both;color:#fff}#js-maincontainer-bot-block #js-search label{line-height:80px;font-size:19px;float:left;padding:0;width:auto;padding:0 15px 0 30px}#js-maincontainer-bot-block #js-search form{float:left;width:210px;background:url("/static/images/landingpage/search-box-two.png") 0 0 no-repeat;height:36px;display:block;overflow:hidden;margin-top:22px}#js-slideshow{padding:0 30px;position:relative}#js-slideshow a.prev{text-indent:-10000px;font-size:0;width:15px;height:22px;display:block;position:absolute;top:45%;background:url("/static/images/landingpage/arrow-left.png") 0 0 no-repeat;left:0}#js-slideshow a.next{text-indent:-10000px;font-size:0;width:15px;height:22px;display:block;position:absolute;top:45%;background:url("/static/images/landingpage/arrow-right.png") 0 0 no-repeat;right:0}.spacer{float:left;margin:0 4px}#js-search input.inputbox{border:none;color:#66942e;height:26px;line-height:26px;font-size:13px;float:left;padding:0;margin:5px 0 5px 20px;width:149px;outline:none}#js-search input.greenbutton{background:url("/static/images/landingpage/search-button-two.png") 0 0 no-repeat;width:40px;height:40px;padding:0;margin:0;border:none;display:block;float:right;text-indent:-10000px;font-size:0}#js-slide .jsmodule>h3{background:url("/static/images/landingpage/bg-slide.png") bottom center no-repeat;padding-bottom:7px;padding-left:35px}#js-slide .jsmodule>h3 span{background:#8ac3d7;color:#fff;padding:10px 20px;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;font-size:19px;overflow:hidden;display:inline-block;font-weight:normal} /*# sourceMappingURL=../../../../../static/scss/searchandbrowse2.css.map */ \ No newline at end of file diff --git a/static/scss/supporter_layout.css b/static/scss/supporter_layout.css new file mode 100644 index 00000000..62b48579 --- /dev/null +++ b/static/scss/supporter_layout.css @@ -0,0 +1,3 @@ +.panelborders{border-width:1px 0px;border-style:solid none;border-color:#FFFFFF}.block-inner{padding-right:10px}.user-block{width:100%;clear:both}.user-block-hide{float:left;width:100%;clear:both;padding-top:10px}.user-block-hide .block{float:left}.user-block-hide .block1,.user-block-hide .block3{width:25%}.user-block-hide .block2{width:50%}.user-block-hide .block2 div{float:left;max-width:340px}.user-block-hide .block2 input{margin-left:5px}.user-block-hide input{float:left;margin:3px 10px 0 0;width:45%}.user-block-hide input[type=checkbox]{float:none;width:auto}.user-block-hide input#librarything_input,.user-block-hide input#goodreads_input{width:auto;cursor:pointer;background:#edf3f4;color:#3d4e53;cursor:pointer}.user-block-hide input.profile-save{width:116px;cursor:pointer}.user-block-hide label{float:left;width:90%}.user-block-hide textarea{width:95%}.user-block-hide select{margin-bottom:5px}#user-block1{float:left;width:25%;position:relative}.user-block2{color:#6994a3;font-size:13px;line-height:normal;float:left;width:25%}.user-block23{color:#6994a3;font-size:15px;line-height:normal;float:left;width:50%}.user-block24{color:#6994a3;font-size:15px;line-height:normal;float:left;width:75%}.user-block3,.user-block4{float:left;width:25%}.user-block3.recommended,.user-block4.recommended{margin-top:auto}.user-block3.recommended img,.user-block4.recommended img{margin-right:7px}.user-block3{margin-top:8px}.user-block3 .ungluingtext{height:29px;line-height:29px;float:left;color:#3d4e53;padding-right:5px}.user-block4{margin-top:7px}.user-badges{position:absolute;bottom:0;left:60px}.user-badges img{vertical-align:text-bottom;border:1px solid #d4d4d4;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.social{width:100%}#edit_profile{float:right;margin-top:-12px;margin-right:-5px;border:2px solid white;padding:3px 2px 2px 3px}#edit_profile:hover{border:2px solid #8dc63f;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}span.special-user-name{display:block;font-size:19px;color:#3d4e53;margin-left:10px;font-weight:bold;height:50px;line-height:24px}span.user-name,span.user-short-info{display:block}.user-block2 .user-short-info{padding-right:10px}span.user-name,span.user-name a{font-size:13px;color:#3d4e53}span.user-status-title{float:left;margin-right:8px;padding-top:5px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.blue{background:#a7d26a url("/static/images/header-button-blue.png") left bottom repeat-x}span.orange{background:#eabc7c url("/static/images/header-button-orange.png") left bottom repeat-x}span.grey{background:#bacfd6 url("/static/images/header-button-grey.png") left bottom repeat-x}div.check-list{float:left;padding-bottom:7px;clear:both}a.profile-edit{display:block}div.profile-save{padding-top:15px;border:none}input.profile-save{background:url("/static/images/header/save-setting.png") 0 0 no-repeat;width:116px;height:42px;display:block;text-indent:-100000px;border:none;cursor:pointer}#loadgr{background:url("/static/images/supporter_icons/goodreads_square.png") left center no-repeat;min-height:33px;margin:12px auto}#loadgr span{display:inline-block;vertical-align:middle}#loadgr div,#loadgr input{margin:auto 10px auto 36px}#loadgr #goodreads_shelves{margin:auto 10px auto 36px;display:block}#loadlt{background:url("/static/images/supporter_icons/librarything_square.png") left center no-repeat;min-height:32px;padding-top:4px}#loadlt div,#loadlt input{margin:auto 10px auto 36px}.weareonthat{background:url("/static/images/checkmark_small.png") left center no-repeat}span.my-setting{height:40px;line-height:40px;display:block;padding:0 0 10px 10px;font-size:19px;font-weight:bold;cursor:pointer}span.my-setting.active{background:#d6dde0 url("/static/images/header/collspane.png") 90% center no-repeat}#tabs{clear:both;float:left;margin-left:10px;margin-top:10px;width:100%;border-bottom:4px solid #d6dde0}#tabs ul.tabs li a:hover{text-decoration:none}#tabs.wantto ul.tabs li.tabs3.active a{background:#d6dde0;color:#3d4e53}#tabs.ungluing ul.tabs li.tabs2.active a{background:#eabc7c;color:#fff}#tabs.unglued ul.tabs li.tabs1.active a{background:#8dc63f;color:#fff}#tabs ul.book-list-view{margin-bottom:0 !important}#tabs-1,#tabs-2,#tabs-3{margin-left:10px}ul.tabs{float:left;padding:0;margin:0;list-style:none}ul.tabs li{float:left;height:46px;line-height:46px;margin-right:2px}ul.tabs li.tabs1,ul.tabs li.tabs2,ul.tabs li.tabs3{width:112px}ul.tabs li a{height:46px;line-height:46px;display:block;text-align:center;padding:0 10px;min-width:80px;-moz-border-radius:7px 7px 0 0;-webkit-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;background:#6994a3;color:#fff}ul.tabs li.tabs1 a:hover,ul.tabs li.tabs1.active a{background:#8dc63f;color:#fff}ul.tabs li.tabs2 a:hover,ul.tabs li.tabs2.active a{background:#eabc7c;color:#fff}ul.tabs li.tabs3 a:hover,ul.tabs li.tabs3.active a{background:#d6dde0;color:#3d4e53}#rss{height:46px}#rss img{padding:16px 0 0 14px}#rss span{margin-left:3px;font-size:13px}.listview .rounded{line-height:normal;margin-right:0}div#content-block-content{padding-left:10px}.empty-wishlist{margin-top:10px}.js-news-text{float:left;width:70%;font-size:15px;color:#3d4e53;font-family:lucida grande}.js-news-links{float:right;width:30%}.column-left .item{margin:0 10px 10px 0}.column-center .item{margin:0 5px 10px 5px}.column-right .item{margin:0 0 10px 10px}.column .item{border:7px solid #edf3f4;padding:10px}.book-image{padding:0 0 10px 0}.book-info{padding:0 0 10px 0;line-height:125%;position:relative}.book-info span.book-new{background:url(/static/images/images/icon-new.png) 0 0 no-repeat;width:38px;height:36px;display:block;position:absolute;right:10px;top:0}.book-name{color:#3d4e53}.book-author{color:#6994a3}.book-status{margin:0 -10px;border-top:1px solid #edf3f4;padding:15px 10px 0 10px;position:relative}.book-status span.unglue{font-style:italic}.book-status span.status{position:absolute;right:10px;bottom:-5px;width:37px;height:25px;display:block}#js-slide .jsmodule{width:660px !important}#js-maincontainer-bot-block{padding-left:16px}.anon_about{height:43px;line-height:43px;font-size:15px;padding-left:37px;border:solid 3px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;width:665px;margin:7px 0}.anon_about a{font-size:15px;color:#8dc63f} + +/*# sourceMappingURL=../../../../../static/scss/supporter_layout.css.map */ \ No newline at end of file diff --git a/static/scss/supporter_layout.scss b/static/scss/supporter_layout.scss new file mode 100644 index 00000000..ec05e059 --- /dev/null +++ b/static/scss/supporter_layout.scss @@ -0,0 +1,494 @@ +@import "variables.scss"; + +.block-inner { + padding-right:10px; +} + +.user-block { + width:100%; + clear:both; +} + +.user-block-hide { + float: left; + width:100%; + clear:both; + padding-top: 10px; + + .block { + float:left; + } + + .block1, .block3 { + width:25%; + } + + .block2 { + width:50%; + + div { + float: left; + max-width: 340px; + } + + input { + margin-left: 5px; + } + } + + input { + float:left; + margin:3px 10px 0 0; + width: 45%; + + &[type=checkbox] { + float: none; + width: auto; + } + + &#librarything_input, &#goodreads_input { + width: auto; + cursor: pointer; + background: $pale-blue; + color: $text-blue; + cursor: pointer; + } + + &.profile-save { + width: 116px; + cursor: pointer; + } + } + + label { + float:left; + width:90%; + } + + textarea { + width:95%; + } + + select { + margin-bottom: 5px; + } +} + +#user-block1 { + float:left; + width:25%; + position: relative; +} + +.user-block2 { + color:$medium-blue; + font-size: $font-size-default; + line-height:normal; + float:left; + width:25%; +} +.user-block23 { + color:$medium-blue; + font-size: $font-size-larger; + line-height:normal; + float:left; + width:50%; +} +.user-block24 { + color:$medium-blue; + font-size: $font-size-larger; + line-height:normal; + float:left; + width:75%; +} + +.user-block3, +.user-block4 { + float:left; + width:25%; + + &.recommended { + margin-top: auto; + + img { + margin-right: 7px; + } + } +} + +.user-block3 { + margin-top:8px; + .ungluingtext { + @include height(29px); + float: left; + color: $text-blue; + padding-right: 5px; + } +} + +.user-block4 { + margin-top: 7px; +} + +.user-badges { + position: absolute; + bottom: 0; + left: 60px; + + img { + vertical-align:text-bottom; + border:1px solid #d4d4d4; + @include one-border-radius(5px); + } +} + +.social { + width:100%; +} + +#edit_profile { + float: right; + margin-top: -12px; + margin-right: -5px; + border: 2px solid white; + padding: 3px 2px 2px 3px; + + &:hover { + border: 2px solid $call-to-action; + @include one-border-radius(5px); + } +} +span.special-user-name { + display: block; + font-size: $font-size-header; + color:$text-blue; + margin-left:10px; + font-weight:bold; + height:50px; + line-height: 24px; +} + +span.user-name, +span.user-short-info { + display: block; +} + +.user-block2 .user-short-info { + padding-right:10px; +} + +span.user-name, +span.user-name a { + font-size: $font-size-default; + color:$text-blue; +} + +span.user-status-title { + float:left; + margin-right: 8px; + padding-top: 5px; +} + +span.rounded { + @include roundedspan; +} + +span.blue { + @include supporter-color-span(#a7d26a, "blue"); +} + +span.orange { + @include supporter-color-span(#eabc7c, "orange"); +} + +span.grey { + @include supporter-color-span(#bacfd6, "grey"); +} + +div.check-list { + float: left; + padding-bottom:7px; + clear: both; +} + +a.profile-edit { + display:block; +// background:url("#{$image-base}header/icon-edit.png") right top no-repeat; +} + +div.profile-save { + padding-top:15px; + border: none; +} + +input.profile-save { + background: url("#{$image-base}header/save-setting.png") 0 0 no-repeat; + width: 116px; + height: 42px; + display: block; + text-indent: -100000px; + border:none; + cursor: pointer; +} + +#loadgr { + background: url("#{$image-base}supporter_icons/goodreads_square.png") left center no-repeat; + min-height: 33px; + margin: 12px auto; + + span { + display: inline-block; + vertical-align: middle; + } + + div, input { + margin: auto 10px auto 36px; + } + + #goodreads_shelves { + margin: auto 10px auto 36px; + display: block; + } +} + +#loadlt { + background: url("#{$image-base}supporter_icons/librarything_square.png") left center no-repeat; + min-height: 32px; + padding-top: 4px; + + div, input { + margin: auto 10px auto 36px; + } +} + +.weareonthat { + background: url("#{$image-base}checkmark_small.png") left center no-repeat; +} +span.my-setting { + @include height(40px); + display:block; + padding:0 0 10px 10px; + font-size: $font-size-header; + font-weight: bold; + cursor:pointer; +} + +span.my-setting.active { + background:$blue-grey url("#{$image-base}header/collspane.png") 90% center no-repeat; +} + +#tabs { + clear: both; + float: left; + margin-left: 10px; + margin-top: 10px; + width: 100%; + border-bottom: 4px solid $blue-grey; + + ul.tabs li a:hover { + text-decoration: none; + } + + &.wantto { + ul.tabs li.tabs3.active a { + background: $blue-grey; + color: $text-blue; + } + } + + &.ungluing { + ul.tabs li.tabs2.active a { + background: #eabc7c; + color: #fff; + } + } + + &.unglued { + ul.tabs li.tabs1.active a { + background: $green; + color: #fff; + } + } +} + +#tabs ul.book-list-view { + margin-bottom:0 !important; +} + +#tabs-1, +#tabs-2, +#tabs-3 { + margin-left:10px; +} + +ul.tabs { + float:left; + padding:0; + margin:0; + list-style:none; + + li { + float: left; + @include height(46px); + margin-right:2px; + + &.tabs1, &.tabs2, &.tabs3 { + width:112px; + } + + a { + @include height(46px); + display:block; + text-align:center; + padding:0 10px; + min-width:80px; + @include border-radius(7px, 7px, 0, 0); + background:$medium-blue; + color:#fff; + } + + &.tabs1 a:hover, &.tabs1.active a { + background:$green; + color:#fff + } + + &.tabs2 a:hover, &.tabs2.active a { + background:#eabc7c; + color:#fff; + } + + &.tabs3 a:hover, &.tabs3.active a { + background:$blue-grey; + color:$text-blue; + } + } +} + +#rss { + height: 46px; + + img { + padding: 16px 0 0 14px; + } + + span { + margin-left: 3px; + font-size: $font-size-default; + } +} + +.listview .rounded { + // cancelling out styles that would otherwise apply + line-height: normal; + margin-right: 0; +} + +div#content-block-content { + padding-left: 10px; +} + +.empty-wishlist { + margin-top: 10px; +} + +.js-news-text { + float:left; + width:70%; + font-size: $font-size-larger; + color:$text-blue; + font-family:lucida grande; +} + +.js-news-links { + float:right; + width:30%; +} + +.column-left .item { + margin:0 10px 10px 0; +} + +.column-center .item { + margin:0 5px 10px 5px; +} + +.column-right .item { + margin:0 0 10px 10px; +} + +.column .item { + border:7px solid $pale-blue; + padding:10px; +} + +.book-image { + padding:0 0 10px 0; +} + +.book-info { + padding:0 0 10px 0; + line-height:125%; + position:relative; + + span.book-new { + background:url(/static/images/images/icon-new.png) 0 0 no-repeat; + width:38px; + height:36px; + display:block; + position:absolute; + right:10px; + top:0; + } +} + +.book-name { + color:$text-blue; +} + +.book-author { + color:$medium-blue; +} + +.book-status { + margin:0 -10px; + border-top:1px solid $pale-blue; + padding:15px 10px 0 10px; + position:relative; + + span.unglue { + font-style:italic; + } + + span.status { + position:absolute; + right:10px; + bottom:-5px; + width:37px; + height:25px; + display:block; + } + +} + +#js-slide .jsmodule { + width: 660px !important; +} + +#js-maincontainer-bot-block { + padding-left: 16px; +} + +.anon_about { + @include height(43px); + font-size: $font-size-larger; + padding-left: 37px; + border: solid 3px $blue-grey; + @include one-border-radius(5px); + width: 665px; + margin: 7px 0; + + a { + font-size: $font-size-larger; + color: $call-to-action; + } +} \ No newline at end of file diff --git a/static/scss/variables.scss b/static/scss/variables.scss index c47d3f51..cf27d5f7 100644 --- a/static/scss/variables.scss +++ b/static/scss/variables.scss @@ -150,7 +150,7 @@ $cursor-disabled: not-allowed; @mixin supporter-color-span($hex, $color) { - $url: %("%sheader-button-%s.png", $image-base, $color); + $url: "#{$image-base}header-button-#{$color}.png"; background:$hex url($url) left bottom repeat-x; } From ebd3b4a3b902c1c86131d0f424422da111967723 Mon Sep 17 00:00:00 2001 From: eric Date: Tue, 30 Jan 2018 15:40:26 -0500 Subject: [PATCH 099/109] remove less and old css --- static/css/book_list.css | 1 - static/css/book_panel.css | 1 - static/css/book_panel2.css | 1 - static/css/campaign.css | 1 - static/css/campaign2.css | 1 - static/css/campaign_tabs.css | 157 -- static/css/comments.css | 1 - static/css/documentation2.css | 1 - static/css/download.css | 1 - static/css/enhanced_download.css | 1 - static/css/enhanced_download_ie.css | 1 - static/css/landingpage3.css | 1 - static/css/landingpage4.css | 1 - static/css/learnmore2.css | 1 - static/css/liblist.css | 1 - static/css/libraries.css | 1 - static/css/lists.css | 1 - static/css/manage_campaign.css | 1 - static/css/notices.css | 1 - static/css/pledge.css | 1 - static/css/registration2.css | 1 - static/css/search.css | 1 - static/css/searchandbrowse2.css | 1 - static/css/sitewide3.css | 1 - static/css/sitewide4.css | 1 - static/css/supporter_layout.css | 1 - static/css/variables.css | 1 - static/less/README.md | 12 - static/less/book_detail.less | 194 -- static/less/book_list.less | 371 ---- static/less/book_panel2.less | 415 ---- static/less/bootstrap-social.less | 115 -- static/less/buttons.less | 166 -- static/less/campaign2.less | 439 ---- static/less/campaign_tabs.less | 75 - static/less/comments.less | 70 - static/less/documentation2.less | 290 --- static/less/download.less | 133 -- static/less/enhanced_download.less | 15 - static/less/enhanced_download_ie.less | 16 - static/less/font-awesome.css | 1801 ----------------- static/less/font-awesome.min.css | 4 - static/less/landingpage4.less | 396 ---- static/less/learnmore2.less | 140 -- static/less/liblist.less | 71 - static/less/libraries.less | 32 - static/less/lists.less | 26 - static/less/manage_campaign.less | 48 - static/less/mixins.less | 39 - static/less/mixins/alerts.less | 14 - static/less/mixins/background-variant.less | 9 - static/less/mixins/border-radius.less | 18 - static/less/mixins/buttons.less | 68 - static/less/mixins/center-block.less | 7 - static/less/mixins/clearfix.less | 22 - static/less/mixins/forms.less | 85 - static/less/mixins/gradients.less | 59 - static/less/mixins/grid-framework.less | 91 - static/less/mixins/grid.less | 122 -- static/less/mixins/hide-text.less | 21 - static/less/mixins/image.less | 33 - static/less/mixins/labels.less | 12 - static/less/mixins/list-group.less | 29 - static/less/mixins/nav-divider.less | 10 - static/less/mixins/nav-vertical-align.less | 9 - static/less/mixins/opacity.less | 8 - static/less/mixins/pagination.less | 23 - static/less/mixins/panels.less | 24 - static/less/mixins/progress-bar.less | 10 - static/less/mixins/reset-filter.less | 8 - static/less/mixins/resize.less | 6 - static/less/mixins/responsive-visibility.less | 15 - static/less/mixins/size.less | 10 - static/less/mixins/tab-focus.less | 9 - static/less/mixins/table-row.less | 28 - static/less/mixins/text-emphasis.less | 9 - static/less/mixins/text-overflow.less | 8 - static/less/mixins/vendor-prefixes.less | 227 --- static/less/notices.less | 97 - static/less/pledge.less | 326 --- static/less/registration2.less | 124 -- static/less/search.less | 15 - static/less/searchandbrowse2.less | 103 - static/less/sitewide4.less | 1027 ---------- static/less/social_share.less | 47 - static/less/supporter_layout.less | 494 ----- static/less/variables.css | 92 - static/less/variables.less | 227 --- 88 files changed, 8597 deletions(-) delete mode 100755 static/css/book_list.css delete mode 100644 static/css/book_panel.css delete mode 100644 static/css/book_panel2.css delete mode 100755 static/css/campaign.css delete mode 100644 static/css/campaign2.css delete mode 100644 static/css/campaign_tabs.css delete mode 100644 static/css/comments.css delete mode 100644 static/css/documentation2.css delete mode 100644 static/css/download.css delete mode 100644 static/css/enhanced_download.css delete mode 100644 static/css/enhanced_download_ie.css delete mode 100644 static/css/landingpage3.css delete mode 100644 static/css/landingpage4.css delete mode 100644 static/css/learnmore2.css delete mode 100644 static/css/liblist.css delete mode 100644 static/css/libraries.css delete mode 100644 static/css/lists.css delete mode 100644 static/css/manage_campaign.css delete mode 100644 static/css/notices.css delete mode 100644 static/css/pledge.css delete mode 100644 static/css/registration2.css delete mode 100644 static/css/search.css delete mode 100644 static/css/searchandbrowse2.css delete mode 100644 static/css/sitewide3.css delete mode 100644 static/css/sitewide4.css delete mode 100644 static/css/supporter_layout.css delete mode 100644 static/css/variables.css delete mode 100644 static/less/README.md delete mode 100644 static/less/book_detail.less delete mode 100755 static/less/book_list.less delete mode 100644 static/less/book_panel2.less delete mode 100644 static/less/bootstrap-social.less delete mode 100644 static/less/buttons.less delete mode 100644 static/less/campaign2.less delete mode 100644 static/less/campaign_tabs.less delete mode 100644 static/less/comments.less delete mode 100644 static/less/documentation2.less delete mode 100644 static/less/download.less delete mode 100644 static/less/enhanced_download.less delete mode 100644 static/less/enhanced_download_ie.less delete mode 100644 static/less/font-awesome.css delete mode 100644 static/less/font-awesome.min.css delete mode 100644 static/less/landingpage4.less delete mode 100644 static/less/learnmore2.less delete mode 100644 static/less/liblist.less delete mode 100644 static/less/libraries.less delete mode 100644 static/less/lists.less delete mode 100644 static/less/manage_campaign.less delete mode 100644 static/less/mixins.less delete mode 100644 static/less/mixins/alerts.less delete mode 100644 static/less/mixins/background-variant.less delete mode 100644 static/less/mixins/border-radius.less delete mode 100644 static/less/mixins/buttons.less delete mode 100644 static/less/mixins/center-block.less delete mode 100644 static/less/mixins/clearfix.less delete mode 100644 static/less/mixins/forms.less delete mode 100644 static/less/mixins/gradients.less delete mode 100644 static/less/mixins/grid-framework.less delete mode 100644 static/less/mixins/grid.less delete mode 100644 static/less/mixins/hide-text.less delete mode 100644 static/less/mixins/image.less delete mode 100644 static/less/mixins/labels.less delete mode 100644 static/less/mixins/list-group.less delete mode 100644 static/less/mixins/nav-divider.less delete mode 100644 static/less/mixins/nav-vertical-align.less delete mode 100644 static/less/mixins/opacity.less delete mode 100644 static/less/mixins/pagination.less delete mode 100644 static/less/mixins/panels.less delete mode 100644 static/less/mixins/progress-bar.less delete mode 100644 static/less/mixins/reset-filter.less delete mode 100644 static/less/mixins/resize.less delete mode 100644 static/less/mixins/responsive-visibility.less delete mode 100644 static/less/mixins/size.less delete mode 100644 static/less/mixins/tab-focus.less delete mode 100644 static/less/mixins/table-row.less delete mode 100644 static/less/mixins/text-emphasis.less delete mode 100644 static/less/mixins/text-overflow.less delete mode 100644 static/less/mixins/vendor-prefixes.less delete mode 100644 static/less/notices.less delete mode 100644 static/less/pledge.less delete mode 100644 static/less/registration2.less delete mode 100644 static/less/search.less delete mode 100644 static/less/searchandbrowse2.less delete mode 100644 static/less/sitewide4.less delete mode 100644 static/less/social_share.less delete mode 100644 static/less/supporter_layout.less delete mode 100644 static/less/variables.css delete mode 100644 static/less/variables.less diff --git a/static/css/book_list.css b/static/css/book_list.css deleted file mode 100755 index d8f78bf5..00000000 --- a/static/css/book_list.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.row1 .book-list.listview{background:#f6f9f9}.row1 .book-list.listview .book-name:hover{background:#f6f9f9}.row2 .book-list.listview{background:#fff}.row2 .book-list.listview .book-name:hover{background:#fff}div.book-list.listview{clear:both;display:block;vertical-align:middle;height:43px;line-height:43px;margin:0 5px 0 0;padding:7px 0;position:relative}div.book-list.listview div.unglue-this{float:left}div.book-list.listview div.book-thumb{margin-right:5px;float:left}div.book-list.listview div.book-name{width:235px;margin-right:10px;background:url("/static/images/booklist/booklist-vline.png") right center no-repeat;float:left}div.book-list.listview div.book-name .title{display:block;line-height:normal;overflow:hidden;height:19px;line-height:19px;margin-bottom:5px;font-weight:bold}div.book-list.listview div.book-name .listview.author{overflow:hidden;display:block;line-height:normal;height:19px;line-height:19px}div.book-list.listview div.book-name.listview:hover{overflow:visible;width:auto;min-width:219px;margin-top:-1px;padding-right:15px;border:1px solid #d6dde0;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;border-left:none}div.book-list.listview div.book-name.listview{z-index:100;position:absolute;left:42px}div.book-list.listview div.add-wishlist,div.book-list.listview div.remove-wishlist,div.book-list.listview div.on-wishlist,div.book-list.listview div.create-account,div.book-list.listview div.pledge{margin-right:10px;padding-right:10px;width:136px;background:url("/static/images/booklist/booklist-vline.png") right center no-repeat;margin-left:255px;float:left}div.book-list.listview div.add-wishlist span,div.book-list.listview div.remove-wishlist span,div.book-list.listview div.on-wishlist span,div.book-list.listview div.create-account span,div.book-list.listview div.pledge span{font-weight:normal;color:#3d4e53;text-transform:none;padding-left:20px}div.book-list.listview div.add-wishlist span.booklist_pledge,div.book-list.listview div.remove-wishlist span.booklist_pledge,div.book-list.listview div.on-wishlist span.booklist_pledge,div.book-list.listview div.create-account span.booklist_pledge,div.book-list.listview div.pledge span.booklist_pledge{padding-left:18px}div.book-list.listview div.pledge span.booklist_pledge{padding-left:0}div.book-list.listview div.add-wishlist span,div.book-list.listview div.create-account span{background:url("/static/images/booklist/add-wishlist.png") left center no-repeat}div.book-list.listview div.add-wishlist span.booklist_pledge{background:0}div.book-list.listview div.remove-wishlist span{background:url("/static/images/booklist/remove-wishlist-blue.png") left center no-repeat}div.book-list.listview div.on-wishlist>span,div.book-list.listview div>span.on-wishlist{background:url("/static/images/checkmark_small.png") left center no-repeat}div.book-list.listview div.booklist-status{margin-right:85px;float:left}div.add-wishlist,div.remove-wishlist{cursor:pointer}.booklist-status.listview span.booklist-status-label{display:none}.booklist-status.listview span.booklist-status-text{float:left;display:block;padding-right:5px;max-width:180px;overflow:hidden}.booklist-status.listview .read_itbutton{margin-top:4px}div.unglue-this a{text-transform:uppercase;color:#3d4e53;font-size:11px;font-weight:bold}div.unglue-this.complete .unglue-this-inner1{background:url("/static/images/booklist/bg.png") 0 -84px no-repeat;height:42px}div.unglue-this.complete .unglue-this-inner2{background:url("/static/images/booklist/bg.png") 100% -126px no-repeat;margin-left:29px;height:42px;padding-right:10px}div.unglue-this.complete a{color:#fff;display:block}div.unglue-this.processing .unglue-this-inner1{background:url("/static/images/booklist/bg.png") 0 0 no-repeat;height:42px}div.unglue-this.processing .unglue-this-inner2{background:url("/static/images/booklist/bg.png") 100% -42px no-repeat;margin-left:25px;height:42px;padding-right:10px}ul.book-list-view{padding:0;margin:15px;float:right;list-style:none}ul.book-list-view li{float:left;margin-right:10px;display:block;vertical-align:middle;line-height:22px}ul.book-list-view li:hover{color:#6994a3}ul.book-list-view li.view-list a{filter:alpha(opacity=30);-moz-opacity:.3;-khtml-opacity:.3;opacity:.3}ul.book-list-view li.view-list a:hover{filter:alpha(opacity=30);-moz-opacity:1;-khtml-opacity:1;opacity:1}ul.book-list-view li.view-list a.chosen{filter:alpha(opacity=30);-moz-opacity:1;-khtml-opacity:1;opacity:1}ul.book-list-view li.view-list a.chosen:hover{text-decoration:none}div.navigation{float:left;clear:both;width:100%;color:#37414d}ul.navigation{float:right;padding:0;margin:0;list-style:none}ul.navigation li{float:left;line-height:normal;margin-right:5px}ul.navigation li a{color:#37414d;font-weight:normal}ul.navigation li.arrow-l a{background:url("/static/images/booklist/bg.png") 0 -168px no-repeat;width:10px;height:15px;display:block;text-indent:-10000px}ul.navigation li.arrow-r a{background:url("/static/images/booklist/bg.png") -1px -185px no-repeat;width:10px;height:15px;display:block;text-indent:-10000px}ul.navigation li a:hover,ul.navigation li.active a{color:#8ac3d7;text-decoration:underline}.unglue-button{display:block;border:0}.book-thumb.listview a{display:block;height:50px;width:32px;overflow:hidden;position:relative;z-index:1}.book-thumb.listview a:hover{overflow:visible;z-index:1000;border:0}.book-thumb.listview a img{position:absolute}.listview.icons{position:absolute;right:31px}.listview.icons .booklist-status-img{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;background-color:#fff;margin-top:4px;height:37px}.listview.icons .booklist-status-img img{padding:5px}.listview.icons .booklist-status-label{display:none}.listview.icons .boolist-ebook img{margin-top:6px}div#content-block-content{padding-bottom:10px}.listview.panelback,.listview.panelback div{display:none}.nobold{font-weight:normal}div#libtools{margin-left:15px;margin-bottom:1em;border:1px solid #d6dde0;border-radius:10px;padding:10px}div#libtools p{margin-top:0}div#libtools div{margin-top:0;margin-left:2em}#facet_block div{background:url("/static/images/bg.png") 100% -223px no-repeat;padding:7px 7px 15px 7px}#facet_block div p{padding:0 10px 0 10px;font-size:smaller}#facet_block div p:first-child{font-size:larger;margin-top:5px}#facet_block div p:first-child img{float:left;padding-right:.5em} \ No newline at end of file diff --git a/static/css/book_panel.css b/static/css/book_panel.css deleted file mode 100644 index be5bed16..00000000 --- a/static/css/book_panel.css +++ /dev/null @@ -1 +0,0 @@ -@charset "utf-8";.header-text{height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;color:white;cursor:pointer;font-size:13px;font-weight:bold;padding:0 15px;border:0;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.greenpanelstuff{font-size:12px;width:120px;line-height:16px}.greenpanelactionborders{border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF}.panelhoverlink{text-decoration:none;color:#3d4e53}.readit{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}*{padding:0;margin:0}#main-wrapper{height:100%;width:725px;margin:0;padding:0}.panelview.tabs{padding:5px 0;margin:0;width:142px;float:left}.panelview.tabs span.active{padding:15px;margin:15px 0;font-weight:bold}.panelview.book-list{font-size:12px;width:120px;line-height:16px;margin:auto;padding:0 5px 5px 5px;height:300px;background-color:#fff;color:#3d4e53;border:5px solid #edf3f4;position:relative}.panelview.book-list:hover{color:#3d4e53}.panelview.book-list img{padding:5px 0;margin:0}.panelview.book-list .pledge.side1{display:none}.panelview.remove-wishlist,.panelview.on-wishlist,.panelview.create-account,.panelview.add-wishlist{display:none}.panelview.book-name div{font-size:12px;line-height:16px;max-height:32px;color:#3d4e53;overflow:hidden}.panelview.book-name div a{color:#6994a3}.panelview.booklist-status{display:none}.panelview.icons{position:absolute;bottom:-3px;width:140px}.panelview.icons .booklist-status-img{float:left}.panelview.icons .booklist-status-label{position:absolute;color:#8dc63f;padding-left:5px;left:40px;bottom:5px;font-size:17px;margin-bottom:3px}.panelview.icons .panelnope{display:none}.panelview.icons .rounded{margin-bottom:7px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url("/static/images/header-button-grey.png") left bottom repeat-x}.panelview.boolist-ebook a{display:none}div.panelview.side1{display:visible}div.panelview.side2{display:none}.panelback{position:relative}.greenpanel2{font-size:12px;width:120px;line-height:16px;margin:0;padding:10px;height:295px;background-color:#8dc63f;color:#fff;position:absolute;top:-5px;left:-10px}.greenpanel_top{height:135px}.greenpanel2 .button_text{height:30px;line-height:30px}.greenpanel2 .bottom_button{position:absolute;bottom:0;height:26px}.greenpanel2 .add_button{position:absolute;bottom:60px;height:26px}.unglued_white{font-size:12px;margin:0 auto 10px auto;padding:5px 0 10px 0;height:58px}.read_itbutton{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38;display:block}.read_itbutton span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 30px;color:#73a334;background:url("/static/images/book-panel/book_icon.png") no-repeat 10% center}.read_itbutton span:hover{text-decoration:none}.read_itbutton span:hover{text-decoration:none;color:#3d4e53}.read_itbutton.pledge{background-image:url("/static/images/icons/pledgearrow-green.png");background-repeat:no-repeat;background-position:90% center}.read_itbutton.pledge span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 25px;color:#73a334;background:0}.read_itbutton.pledge span:hover{text-decoration:none}.read_itbutton.pledge span:hover{text-decoration:none;color:#3d4e53}.read_itbutton_fail{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.read_itbutton_fail span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 15px;color:#73a334;background:0}.read_itbutton_fail span:hover{text-decoration:none}.panelview.panelfront.icons .read_itbutton{margin-bottom:7px;height:30px!important;line-height:30px!important}.Unglue_itbutton{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.Unglue_itbutton a{background-image:url("/static/images/book-panel/unglue_icon.png");height:40px;line-height:40px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 25px;color:#73a334}.Unglue_itbutton a:hover{text-decoration:none}.moreinfo.add-wishlist,.moreinfo.create-account{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/add_wish_icon.png") no-repeat left center;padding-right:0}.moreinfo.add-wishlist a,.moreinfo.create-account a,.moreinfo.add-wishlist span,.moreinfo.create-account span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.add-wishlist a:hover,.moreinfo.create-account a:hover,.moreinfo.add-wishlist span:hover,.moreinfo.create-account span:hover{text-decoration:none;color:#3d4e53}.moreinfo.remove-wishlist{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/booklist/remove-wishlist-white.png") no-repeat left center}.moreinfo.remove-wishlist a,.moreinfo.remove-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.remove-wishlist a:hover,.moreinfo.remove-wishlist span:hover{text-decoration:none;color:#3d4e53}.moreinfo.on-wishlist{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/checkmark_small-white.png") no-repeat left center}.moreinfo.on-wishlist a,.moreinfo.on-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.on-wishlist a:hover,.moreinfo.on-wishlist span:hover{text-decoration:none;color:#3d4e53}.white_text{width:120px;height:60px;padding:15px 0;margin:0}.white_text a{color:#FFF;text-decoration:none}.white_text a:hover{text-decoration:none;color:#3d4e53}.white_text p{line-height:16px;max-height:32px;overflow:hidden;margin:0 0 5px 0}.moreinfo{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/more_icon.png") no-repeat left center;cursor:pointer}.moreinfo a,.moreinfo span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 21px;color:#FFF}.moreinfo a:hover,.moreinfo span:hover{text-decoration:none;color:#3d4e53}.moreinfo>div{height:30px;line-height:30px;padding-bottom:8px}.read{margin:15px auto 5px auto;padding:0;width:140px;color:#8dc63f;height:40px;line-height:25px;float:left;position:absolute;bottom:-15px}.read p{margin:0;padding:10px 3px;width:50px;font-size:10pt;float:left}.read img{padding:5px 0;margin:0;float:left}.read2{margin:15px auto;padding:0;width:130px;color:#8dc63f;height:40px;line-height:25px}.read2 p{margin:0;padding:10px 3px;width:50px;font-size:10pt;float:left}.read2 img{padding:0;margin:0;float:left}.right_add{padding:10px;margin:0;float:right}.panelview.book-thumb{position:relative;margin:0;padding:0;left:0}.panelview.book-thumb img{z-index:100;width:120px;height:182px}.panelview.book-thumb span{position:absolute;bottom:0;left:-10px;top:-5px;z-index:1000;height:auto} \ No newline at end of file diff --git a/static/css/book_panel2.css b/static/css/book_panel2.css deleted file mode 100644 index 08b5c5d4..00000000 --- a/static/css/book_panel2.css +++ /dev/null @@ -1 +0,0 @@ -@charset "utf-8";.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.greenpanelstuff{font-size:12px;width:120px;line-height:16px}.greenpanelactionborders{border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF}.panelhoverlink{text-decoration:none;color:#3d4e53}.readit{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.buyit{font-size:13pt;color:#8dc63f}#main-wrapper{height:100%;width:725px;margin:0;padding:0}.panelview.tabs{padding:5px 0;margin:0;width:142px;float:left}.panelview.tabs span.active{padding:15px;margin:15px 0;font-weight:bold}.panelview.book-list{font-size:12px;width:120px;line-height:16px;margin:auto;padding:0 5px 5px 5px;height:300px;background-color:#fff;color:#3d4e53;border:5px solid #edf3f4;position:relative}.panelview.book-list:hover{color:#3d4e53}.panelview.book-list img{padding:5px 0;margin:0}.panelview.book-list .pledge.side1{display:none}.panelview.remove-wishlist,.panelview.on-wishlist,.panelview.create-account,.panelview.add-wishlist{display:none}.panelview.book-name div{font-size:12px;line-height:16px;max-height:32px;color:#3d4e53;overflow:hidden}.panelview.book-name div a{color:#6994a3}.panelview.booklist-status{display:none}.panelview.icons{position:absolute;bottom:-3px;width:140px}.panelview.icons .booklist-status-img{float:left}.panelview.icons .booklist-status-label{position:absolute;color:#8dc63f;padding-left:5px;left:40px;bottom:5px;font-size:17px;margin-bottom:3px}.panelview.icons .panelnope{display:none}.panelview.icons .rounded{margin-bottom:7px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url("/static/images/header-button-grey.png") left bottom repeat-x}.panelview.boolist-ebook a{display:none}div.panelview.side1{display:visible}div.panelview.side2{display:none}.panelback{position:relative}.greenpanel2{font-size:12px;width:120px;line-height:16px;margin:0;padding:10px;height:295px;background-color:#8dc63f;color:#fff;position:absolute;top:-5px;left:-10px}.greenpanel_top{height:135px}.greenpanel2 .button_text{height:30px;line-height:30px}.greenpanel2 .bottom_button{position:absolute;bottom:0;height:26px}.greenpanel2 .add_button{position:absolute;bottom:60px;height:26px}.unglued_white{font-size:12px;margin:0 auto 10px auto;padding:5px 0 10px 0;height:58px}.unglued_white p{margin:0}.read_itbutton{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38;display:block}.read_itbutton span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 30px;color:#73a334;background:url("/static/images/book-panel/book_icon.png") no-repeat 10% center}.read_itbutton span:hover{text-decoration:none}.read_itbutton span:hover{text-decoration:none;color:#3d4e53}.read_itbutton.pledge{background-image:url("/static/images/icons/pledgearrow-green.png");background-repeat:no-repeat;background-position:90% center}.read_itbutton.pledge span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 25px;color:#73a334;background:0}.read_itbutton.pledge span:hover{text-decoration:none}.read_itbutton.pledge span:hover{text-decoration:none;color:#3d4e53}.read_itbutton_fail{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.read_itbutton_fail span{height:35px;line-height:35px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 15px;color:#73a334;background:0}.read_itbutton_fail span:hover{text-decoration:none}.panelview.panelfront.icons .read_itbutton{margin-bottom:7px;height:30px!important;line-height:30px!important}.Unglue_itbutton{width:118px;height:35px;line-height:35px;padding:0;background:#FFF;margin:0;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #81bb38}.Unglue_itbutton a{background-image:url("/static/images/book-panel/unglue_icon.png");height:40px;line-height:40px;font-size:11px;background-repeat:no-repeat;background-position:10px auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 25px;color:#73a334}.Unglue_itbutton a:hover{text-decoration:none}.moreinfo.add-wishlist,.moreinfo.create-account{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/add_wish_icon.png") no-repeat left center;padding-right:0}.moreinfo.add-wishlist a,.moreinfo.create-account a,.moreinfo.add-wishlist span,.moreinfo.create-account span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.add-wishlist a:hover,.moreinfo.create-account a:hover,.moreinfo.add-wishlist span:hover,.moreinfo.create-account span:hover{text-decoration:none;color:#3d4e53}.moreinfo.remove-wishlist{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/booklist/remove-wishlist-white.png") no-repeat left center}.moreinfo.remove-wishlist a,.moreinfo.remove-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.remove-wishlist a:hover,.moreinfo.remove-wishlist span:hover{text-decoration:none;color:#3d4e53}.moreinfo.on-wishlist{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/checkmark_small-white.png") no-repeat left center}.moreinfo.on-wishlist a,.moreinfo.on-wishlist span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 5px 0 21px;color:#FFF}.moreinfo.on-wishlist a:hover,.moreinfo.on-wishlist span:hover{text-decoration:none;color:#3d4e53}.white_text{width:120px;height:60px;padding:15px 0;margin:0}.white_text a{color:#FFF;text-decoration:none}.white_text a:hover{text-decoration:none;color:#3d4e53}.white_text p{line-height:16px;max-height:32px;overflow:hidden;margin:0 0 5px 0}.moreinfo{width:120px;height:30px;padding:0;margin:0;border-top-width:1px;border-bottom-width:1px;border-top-style:solid;border-bottom-style:solid;border-top-color:#FFF;border-bottom-color:#FFF;background:url("/static/images/book-panel/more_icon.png") no-repeat left center;cursor:pointer}.moreinfo a,.moreinfo span{height:30px;line-height:30px;font-size:11px;background-repeat:no-repeat;background-position:left auto;font-weight:bold;text-decoration:none;text-transform:uppercase;padding:0 0 0 21px;color:#FFF}.moreinfo a:hover,.moreinfo span:hover{text-decoration:none;color:#3d4e53}.moreinfo>div{height:30px;line-height:30px;padding-bottom:8px}.read{margin:15px auto 5px auto;padding:0;width:140px;color:#8dc63f;height:40px;line-height:25px;float:left;position:absolute;bottom:-15px}.read p{margin:0;padding:10px 3px;width:50px;font-size:10pt;float:left}.read img{padding:5px 0;margin:0;float:left}.read2{margin:15px auto;padding:0;width:130px;color:#8dc63f;height:40px;line-height:25px}.read2 p{margin:0;padding:10px 3px;width:50px;font-size:10pt;float:left}.read2 img{padding:0;margin:0;float:left}.right_add{padding:10px;margin:0;float:right}.panelview.book-thumb{position:relative;margin:0;padding:0;left:0}.panelview.book-thumb img{z-index:100;width:120px;height:182px}.panelview.book-thumb span{position:absolute;bottom:0;left:-10px;top:-5px;z-index:1000;height:auto} \ No newline at end of file diff --git a/static/css/campaign.css b/static/css/campaign.css deleted file mode 100755 index 6320156d..00000000 --- a/static/css/campaign.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;color:white;cursor:pointer;font-size:13px;font-weight:bold;padding:0 15px;border:0;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}#tabs{border-bottom:4px solid #6994a3;clear:both;float:left;margin-top:10px;width:100%}#tabs ul.book-list-view{margin-bottom:4px!important}#tabs-1,#tabs-2,#tabs-3,#tabs-4{display:none}#tabs-1.active,#tabs-2.active,#tabs-3.active,#tabs-4.active{display:inherit}#tabs-2 textarea{width:95%}ul.tabs{float:left;padding:0;margin:0;list-style:none;width:100%}ul.tabs li{float:left;height:46px;line-height:20px;padding-right:2px;width:116px;background:0;margin:0;padding:0 2px 0 0}ul.tabs li.tabs4{padding-right:0}ul.tabs li a{height:41px;line-height:18px;display:block;text-align:center;padding:0 10px;min-width:80px;-moz-border-radius:7px 7px 0 0;-webkit-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;background:#d6dde0;color:#3d4e53;padding-top:5px}ul.tabs li a:hover{text-decoration:none}ul.tabs li a div{padding-top:8px}ul.tabs li a:hover,ul.tabs li.active a{background:#6994a3;color:#fff}.book-detail{float:left;width:100%;clear:both;display:block}#book-detail-img{float:left;margin-right:10px;width:151px}#book-detail-img img{padding:5px;border:solid 5px #edf3f4}.book-detail-info{float:left;width:309px}.book-detail-info h2.book-name,.book-detail-info h3.book-author,.book-detail-info h3.book-year{padding:0;margin:0;line-height:normal}.book-detail-info h2.book-name{font-size:19px;text-transform:capitalize;font-weight:bold;color:#3d4e53}.book-detail-info h3.book-author,.book-detail-info h3.book-year{font-size:13px;font-weight:normal;color:#6994a3}.book-detail-info>div{width:100%;clear:both;display:block;overflow:hidden;border-top:1px solid #edf3f4;padding:10px 0}.book-detail-info>div.layout{border:0;padding:0}.book-detail-info>div.layout div.pubinfo{float:left;width:auto;padding-bottom:7px}.book-detail-info .btn_wishlist span{text-align:right}.book-detail-info .find-book label{float:left;line-height:31px}.book-detail-info .find-link{float:right}.book-detail-info .find-link img{padding:2px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.book-detail-info .pledged-info{padding:10px 0;position:relative}.book-detail-info .pledged-info.noborder{border-top:0;padding-top:0}.book-detail-info .pledged-info .campaign-status-info{float:left;width:50%;margin-top:13px}.book-detail-info .pledged-info .campaign-status-info span{font-size:15px;color:#6994a3;font-weight:bold}.book-detail-info .thermometer{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;border:solid 2px #d6dde0;width:291px;padding:7px;position:relative;overflow:visible;background:-webkit-gradient(linear,left top,right top,from(#8dc63f),to(#cf6944));background:-webkit-linear-gradient(left,#cf6944,#8dc63f);background:-moz-linear-gradient(left,#cf6944,#8dc63f);background:-ms-linear-gradient(left,#cf6944,#8dc63f);background:-o-linear-gradient(left,#cf6944,#8dc63f);background:linear-gradient(left,#cf6944,#8dc63f);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert',endColorstr='@call-to-action');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert', endColorstr='@call-to-action')"}.book-detail-info .thermometer.successful{border-color:#8ac3d7;background:#edf3f4}.book-detail-info .thermometer .cover{position:absolute;right:0;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;width:50px;height:14px;margin-top:-7px;background:#f3f5f6}.book-detail-info .thermometer span{display:none}.book-detail-info .thermometer:hover span{display:block;position:absolute;z-index:200;right:0;top:-7px;font-size:19px;color:#6994a3;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .status{position:absolute;top:50%;right:0;height:25px;margin-top:-12px}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px!important;height:28px;line-height:28px!important;margin:0!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}#js-page-wrap{overflow:hidden}#main-container{margin-top:20px}#js-leftcol .jsmodule,.pledge.jsmodule{margin-bottom:10px}#js-leftcol .jsmodule.rounded .jsmod-content,.pledge.jsmodule.rounded .jsmod-content{-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background:#edf3f4;color:#3d4e53;padding:10px 20px;font-weight:bold;border:0;margin:0;line-height:16px}#js-leftcol .jsmodule.rounded .jsmod-content.ACTIVE,.pledge.jsmodule.rounded .jsmod-content.ACTIVE{background:#8dc63f;color:white;font-size:19px;font-weight:normal;line-height:20px}#js-leftcol .jsmodule.rounded .jsmod-content.No.campaign.yet,.pledge.jsmodule.rounded .jsmod-content.No.campaign.yet{background:#e18551;color:white}#js-leftcol .jsmodule.rounded .jsmod-content span,.pledge.jsmodule.rounded .jsmod-content span{display:inline-block;vertical-align:middle}#js-leftcol .jsmodule.rounded .jsmod-content span.spacer,.pledge.jsmodule.rounded .jsmod-content span.spacer{visibility:none}#js-leftcol .jsmodule.rounded .jsmod-content span.findtheungluers,.pledge.jsmodule.rounded .jsmod-content span.findtheungluers{cursor:pointer}.jsmodule.pledge{float:left;margin-left:10px}#js-slide .jsmodule{width:660px!important}a{color:#3d4e53}#js-search{margin:0 15px 0 15px!important}.alert>.errorlist{list-style-type:none;font-size:15px;border:0;text-align:left;font-weight:normal;font-size:13px}.alert>.errorlist>li{margin-bottom:14px}.alert>.errorlist .errorlist{margin-top:7px}.alert>.errorlist .errorlist li{width:auto;height:auto;padding-left:32px;padding-right:32px;font-size:13px}#js-maincol{float:left;width:470px;margin:0 10px}#js-maincol div#content-block{background:0;padding:0}.status{font-size:19px;color:#8dc63f}.add-wishlist,.add-wishlist-workpage,.remove-wishlist-workpage,.remove-wishlist,.on-wishlist,.create-account{float:right;cursor:pointer}.add-wishlist span,.add-wishlist-workpage span,.remove-wishlist-workpage span,.remove-wishlist span,.on-wishlist span,.create-account span{font-weight:normal;color:#3d4e53;text-transform:none;padding-left:20px}.add-wishlist span.on-wishlist,.add-wishlist-workpage span.on-wishlist,.remove-wishlist-workpage span.on-wishlist,.remove-wishlist span.on-wishlist,.on-wishlist span.on-wishlist,.create-account span.on-wishlist{background:url("/static/images/checkmark_small.png") left center no-repeat;cursor:default}.btn_wishlist .add-wishlist span,.add-wishlist-workpage span,.create-account span{background:url("/static/images/booklist/add-wishlist.png") left center no-repeat}.remove-wishlist-workpage span,.remove-wishlist span{background:url("/static/images/booklist/remove-wishlist-blue.png") left center no-repeat}div#content-block-content{padding-left:5px}div#content-block-content a{color:#6994a3}div#content-block-content #tabs-1 img{padding:5px;border:solid 5px #edf3f4}div#content-block-content #tabs-3{margin-left:-5px}.tabs-content{padding-right:5px}.tabs-content iframe{padding:5px;border:solid 5px #edf3f4}.tabs-content form{margin-left:-5px}.tabs-content .clearfix{margin-bottom:10px;border-bottom:2px solid #d6dde0}.work_supporter{height:auto;min-height:50px;margin-top:5px;vertical-align:middle}.work_supporter_avatar{float:left;margin-right:5px}.work_supporter_avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.work_supporter_name{height:50px;line-height:50px;float:left}.work_supporter_nocomment{height:50px;margin-top:5px;vertical-align:middle;min-width:235px;float:left}.show_supporter_contact_form{display:block;margin-left:5px;float:right}.supporter_contact_form{display:none;margin-left:5px}.contact_form_result{display:block;margin-left:5px}.work_supporter_wide{display:block;height:65px;margin-top:5px;float:none;margin-left:5px}.info_for_managers{display:block}.show_supporter_contact_form{cursor:pointer;opacity:.5}.show_supporter_contact_form:hover{cursor:pointer;opacity:1}.official{border:3px #8ac3d7 solid;padding:3px;margin-left:-5px}.editions div{float:left;padding-bottom:5px;margin-bottom:5px}.editions .image{width:60px;overflow:hidden}.editions .metadata{display:block;overflow:hidden;margin-left:5px}.editions a:hover{text-decoration:underline}.show_more_edition,.show_more_ebooks{cursor:pointer}.show_more_edition{text-align:right}.show_more_edition:hover{text-decoration:underline}.more_edition{display:none;clear:both;padding-bottom:10px;padding-left:60px}.more_ebooks{display:none}.show_more_ebooks:hover{text-decoration:underline}#js-rightcol .add-wishlist,#js-rightcol .on-wishlist,#js-rightcol .create-account{float:none}#js-rightcol .on-wishlist{margin-left:20px}#js-rightcol,#pledge-rightcol{float:right;width:235px;margin-bottom:20px}#js-rightcol h3.jsmod-title,#pledge-rightcol h3.jsmod-title{background:#a7c1ca;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px;height:auto;font-style:normal;font-size:15px;margin:0 0 10px 0;color:white}#js-rightcol h3.jsmod-title span,#pledge-rightcol h3.jsmod-title span{padding:0;color:#fff;font-style:normal;height:22px;line-height:22px}#js-rightcol .jsmodule,#pledge-rightcol .jsmodule{margin-bottom:10px}#js-rightcol .jsmodule a:hover,#pledge-rightcol .jsmodule a:hover{text-decoration:none}#pledge-rightcol{margin-top:7px}.js-rightcol-pad{border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}ul.support li{border-bottom:1px solid #d6dde0;padding:10px 5px 10px 10px;background:url("/static/images/icons/pledgearrow.png") 98% center no-repeat}ul.support li.last{border-bottom:0}ul.support li span{display:block;padding-right:10px}ul.support li span.menu-item-price{font-size:19px;float:left;display:inline;margin-bottom:3px}ul.support li span.menu-item-desc{float:none;clear:both;font-size:15px;font-weight:normal;line-height:19.5px}ul.support li:hover{color:#fff;background:#8dc63f url("/static/images/icons/pledgearrow-hover.png") 98% center no-repeat}ul.support li:hover a{color:#fff;text-decoration:none}.you_pledged{float:left;line-height:21px;font-weight:normal;color:#3d4e53;padding-left:20px;background:url("/static/images/checkmark_small.png") left center no-repeat}.thank-you{font-size:19px;font-weight:bold;margin:20px auto} \ No newline at end of file diff --git a/static/css/campaign2.css b/static/css/campaign2.css deleted file mode 100644 index eb044a01..00000000 --- a/static/css/campaign2.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}#tabs{border-bottom:4px solid #6994a3;clear:both;float:left;margin-top:10px;width:100%}#tabs ul.book-list-view{margin-bottom:4px!important}#tabs-1,#tabs-2,#tabs-3,#tabs-4{display:none}#tabs-1.active,#tabs-2.active,#tabs-3.active,#tabs-4.active{display:inherit}#tabs-2 textarea{width:95%}ul.tabs{float:left;padding:0;margin:0;list-style:none;width:100%}ul.tabs li{float:left;height:46px;line-height:20px;padding-right:2px;width:116px;background:0;margin:0;padding:0 2px 0 0}ul.tabs li.tabs4{padding-right:0}ul.tabs li a{height:41px;line-height:18px;display:block;text-align:center;padding:0 10px;min-width:80px;-moz-border-radius:7px 7px 0 0;-webkit-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;background:#d6dde0;color:#3d4e53;padding-top:5px}ul.tabs li a:hover{text-decoration:none}ul.tabs li a div{padding-top:8px}ul.tabs li a:hover,ul.tabs li.active a{background:#6994a3;color:#fff}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.book-detail{float:left;width:100%;clear:both;display:block}.book-cover{float:left;margin-right:10px;width:151px}.book-cover img{padding:5px;border:solid 5px #edf3f4}.book-detail-info{float:left;width:309px}.book-detail-info h2.book-name,.book-detail-info h3.book-author,.book-detail-info h3.book-year{padding:0;margin:0;line-height:normal}.book-detail-info h2.book-name{font-size:19px;font-weight:bold;color:#3d4e53}.book-detail-info h3.book-author,.book-detail-info h3.book-year{font-size:13px;font-weight:normal;color:#3d4e53}.book-detail-info h3.book-author span a,.book-detail-info h3.book-year span a{font-size:13px;font-weight:normal;color:#6994a3}.book-detail-info>div{width:100%;clear:both;display:block;overflow:hidden;border-top:1px solid #edf3f4;padding:10px 0}.book-detail-info>div.layout{border:0;padding:0}.book-detail-info>div.layout div.pubinfo{float:left;width:auto;padding-bottom:7px}.book-detail-info .btn_wishlist span{text-align:right}.book-detail-info .find-book label{float:left;line-height:31px}.book-detail-info .find-link{float:right}.book-detail-info .find-link img{padding:2px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.book-detail-info .pledged-info{padding:10px 0;position:relative}.book-detail-info .pledged-info.noborder{border-top:0;padding-top:0}.book-detail-info .pledged-info .campaign-status-info{float:left;width:50%;margin-top:13px}.book-detail-info .pledged-info .campaign-status-info span{font-size:15px;color:#6994a3;font-weight:bold}.book-detail-info .thermometer{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;border:solid 2px #d6dde0;width:291px;padding:7px;position:relative;overflow:visible;background:-webkit-gradient(linear,left top,right top,from(#8dc63f),to(#cf6944));background:-webkit-linear-gradient(left,#cf6944,#8dc63f);background:-moz-linear-gradient(left,#cf6944,#8dc63f);background:-ms-linear-gradient(left,#cf6944,#8dc63f);background:-o-linear-gradient(left,#cf6944,#8dc63f);background:linear-gradient(left,#cf6944,#8dc63f);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert',endColorstr='@call-to-action');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert', endColorstr='@call-to-action')"}.book-detail-info .thermometer.successful{border-color:#8ac3d7;background:#edf3f4}.book-detail-info .thermometer .cover{position:absolute;right:0;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;width:50px;height:14px;margin-top:-7px;background:#f3f5f6}.book-detail-info .thermometer span{display:none}.book-detail-info .thermometer:hover span{display:block;position:absolute;z-index:200;right:0;top:-7px;font-size:19px;color:#6994a3;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .explainer span.explanation{display:none}.book-detail-info .explainer:hover span.explanation{display:block;position:absolute;z-index:200;right:0;top:12px;font-size:13px;font-weight:normal;color:#3d4e53;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .status{position:absolute;top:50%;right:0;height:25px;margin-top:-12px}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px!important;height:28px;line-height:28px!important;margin:0!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}#js-page-wrap{overflow:hidden}#main-container{margin-top:20px}#js-leftcol .jsmodule,.pledge.jsmodule{margin-bottom:10px}#js-leftcol .jsmodule.rounded .jsmod-content,.pledge.jsmodule.rounded .jsmod-content{-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background:#edf3f4;color:#3d4e53;padding:10px 20px;font-weight:bold;border:0;margin:0;line-height:16px}#js-leftcol .jsmodule.rounded .jsmod-content.ACTIVE,.pledge.jsmodule.rounded .jsmod-content.ACTIVE{background:#8dc63f;color:white;font-size:19px;font-weight:normal;line-height:20px}#js-leftcol .jsmodule.rounded .jsmod-content.No.campaign.yet,.pledge.jsmodule.rounded .jsmod-content.No.campaign.yet{background:#e18551;color:white}#js-leftcol .jsmodule.rounded .jsmod-content span,.pledge.jsmodule.rounded .jsmod-content span{display:inline-block;vertical-align:middle}#js-leftcol .jsmodule.rounded .jsmod-content span.spacer,.pledge.jsmodule.rounded .jsmod-content span.spacer{visibility:none}#js-leftcol .jsmodule.rounded .jsmod-content span.findtheungluers,.pledge.jsmodule.rounded .jsmod-content span.findtheungluers{cursor:pointer}.jsmodule.pledge{float:left;margin-left:10px}#js-slide .jsmodule{width:660px!important}#js-search{margin:0 15px 0 15px!important}.alert>.errorlist{list-style-type:none;font-size:15px;border:0;text-align:left;font-weight:normal;font-size:13px}.alert>.errorlist>li{margin-bottom:14px}.alert>.errorlist .errorlist{margin-top:7px}.alert>.errorlist .errorlist li{width:auto;height:auto;padding-left:32px;padding-right:32px;font-size:13px}#js-maincol{float:left;width:470px;margin:0 10px}#js-maincol div#content-block{background:0;padding:0}.status{font-size:19px;color:#8dc63f}.add-wishlist,.add-wishlist-workpage,.remove-wishlist-workpage,.remove-wishlist,.on-wishlist,.create-account{float:right;cursor:pointer}.add-wishlist span,.add-wishlist-workpage span,.remove-wishlist-workpage span,.remove-wishlist span,.on-wishlist span,.create-account span{font-weight:normal;color:#3d4e53;text-transform:none;padding-left:20px}.add-wishlist span.on-wishlist,.add-wishlist-workpage span.on-wishlist,.remove-wishlist-workpage span.on-wishlist,.remove-wishlist span.on-wishlist,.on-wishlist span.on-wishlist,.create-account span.on-wishlist{background:url("/static/images/checkmark_small.png") left center no-repeat;cursor:default}.btn_wishlist .add-wishlist span,.add-wishlist-workpage span,.create-account span{background:url("/static/images/booklist/add-wishlist.png") left center no-repeat}.remove-wishlist-workpage span,.remove-wishlist span{background:url("/static/images/booklist/remove-wishlist-blue.png") left center no-repeat}div#content-block-content{padding-left:5px}div#content-block-content a{color:#6994a3}div#content-block-content #tabs-1 img{padding:5px;border:solid 5px #edf3f4}div#content-block-content #tabs-3{margin-left:-5px}.tabs-content{padding-right:5px}.tabs-content iframe{padding:5px;border:solid 5px #edf3f4}.tabs-content form{margin-left:-5px}.tabs-content .clearfix{margin-bottom:10px;border-bottom:2px solid #d6dde0}.work_supporter{height:auto;min-height:50px;margin-top:5px;vertical-align:middle}.work_supporter_avatar{float:left;margin-right:5px}.work_supporter_avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.work_supporter_name{height:50px;line-height:50px;float:left}.work_supporter_nocomment{height:50px;margin-top:5px;vertical-align:middle;min-width:235px;float:left}.show_supporter_contact_form{display:block;margin-left:5px;float:right}.supporter_contact_form{display:none;margin-left:5px}.contact_form_result{display:block;margin-left:5px}.work_supporter_wide{display:block;height:65px;margin-top:5px;float:none;margin-left:5px}.info_for_managers{display:block}.show_supporter_contact_form{cursor:pointer;opacity:.5}.show_supporter_contact_form:hover{cursor:pointer;opacity:1}.official{border:3px #8ac3d7 solid;padding:3px;margin-left:-5px}.editions div{float:left;padding-bottom:5px;margin-bottom:5px}.editions .image{width:60px;overflow:hidden}.editions .metadata{display:block;overflow:hidden;margin-left:5px}.editions a:hover{text-decoration:underline}.show_more_edition,.show_more_ebooks{cursor:pointer}.show_more_edition{text-align:right}.show_more_edition:hover{text-decoration:underline}.more_edition{display:none;clear:both;padding-bottom:10px;padding-left:60px}.more_ebooks{display:none}.show_more_ebooks:hover{text-decoration:underline}#js-rightcol .add-wishlist,#js-rightcol .on-wishlist,#js-rightcol .create-account{float:none}#js-rightcol .on-wishlist{margin-left:20px}#js-rightcol,#pledge-rightcol{float:right;width:235px;margin-bottom:20px}#js-rightcol h3.jsmod-title,#pledge-rightcol h3.jsmod-title{background:#a7c1ca;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px;height:auto;font-style:normal;font-size:15px;margin:0 0 10px 0;color:white}#js-rightcol h3.jsmod-title span,#pledge-rightcol h3.jsmod-title span{padding:0;color:#fff;font-style:normal;height:22px;line-height:22px}#js-rightcol .jsmodule,#pledge-rightcol .jsmodule{margin-bottom:10px}#js-rightcol .jsmodule a:hover,#pledge-rightcol .jsmodule a:hover{text-decoration:none}#pledge-rightcol{margin-top:7px}.js-rightcol-pad{border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}ul.support li{border-bottom:1px solid #d6dde0;padding:10px 5px 10px 10px;background:url("/static/images/icons/pledgearrow.png") 98% center no-repeat}ul.support li.no_link{background:0}ul.support li.last{border-bottom:0}ul.support li span{display:block;padding-right:10px}ul.support li span.menu-item-price{font-size:19px;float:left;display:inline;margin-bottom:3px}ul.support li span.menu-item-desc{float:none;clear:both;font-size:15px;font-weight:normal;line-height:19.5px}ul.support li:hover{color:#fff;background:#8dc63f url("/static/images/icons/pledgearrow-hover.png") 98% center no-repeat}ul.support li:hover a{color:#fff;text-decoration:none}ul.support li:hover.no_link{background:#fff;color:#8dc63f}.you_pledged{float:left;line-height:21px;font-weight:normal;color:#3d4e53;padding-left:20px;background:url("/static/images/checkmark_small.png") left center no-repeat}.thank-you{font-size:19px;font-weight:bold;margin:20px auto}div#libtools{border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;margin-left:0;margin-top:1em;padding:10px}div#libtools p{margin-top:0;margin-bottom:0}div#libtools span{margin-top:0;margin-left:.5em;display:inline-block}div#libtools input[type="submit"]{margin-left:4em} \ No newline at end of file diff --git a/static/css/campaign_tabs.css b/static/css/campaign_tabs.css deleted file mode 100644 index db81ff5e..00000000 --- a/static/css/campaign_tabs.css +++ /dev/null @@ -1,157 +0,0 @@ -/* Campaign and manage_campaign use same tab styling, so it's factored out here */ -/* variables and mixins used in multiple less files go here */ -.header-text { - height: 36px; - line-height: 36px; - display: block; - text-decoration: none; - font-weight: bold; - font-size: 13px; - letter-spacing: -0.05em; -} -.panelborders { - border-width: 1px 0px; - border-style: solid none; - border-color: #FFFFFF; -} -.roundedspan { - border: 1px solid #d4d4d4; - -moz-border-radius: 7px; - -webkit-border-radius: 7px; - border-radius: 7px; - padding: 1px; - color: #fff; - margin: 0 8px 0 0; - display: inline-block; -} -.roundedspan > span { - padding: 7px 7px; - min-width: 15px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - text-align: center; - display: inline-block; -} -.roundedspan > span .hovertext { - display: none; -} -.roundedspan > span:hover .hovertext { - display: inline; -} -.mediaborder { - padding: 5px; - border: solid 5px #EDF3F4; -} -.google_signup_div { - padding: 14px 0; -} -.google_signup_div div { - height: 24px; - line-height: 24px; - float: left; - padding-left: 5px; -} -.google_signup_div img { - float: left; - height: 24px; - width: 24px; -} -.actionbuttons { - width: auto; - height: 36px; - line-height: 36px; - background: #8dc63f; - -moz-border-radius: 32px; - -webkit-border-radius: 32px; - border-radius: 32px; - color: white; - cursor: pointer; - font-size: 13px; - font-weight: bold; - padding: 0 15px; - border: none; - margin: 5px 0; -} -.errors { - -moz-border-radius: 16px 16px 0 0; - -webkit-border-radius: 16px 16px 0 0; - border-radius: 16px 16px 0 0; - border: solid #e35351 3px; - clear: both; - width: 90%; - height: auto; - line-height: 16px; - padding: 7px 0; - font-weight: bold; - text-align: center; -} -.errors li { - list-style: none; - border: none; -} -#tabs { - border-bottom: 4px solid #6994a3; - clear: both; - float: left; - margin-top: 10px; - width: 100%; -} -#tabs ul.book-list-view { - margin-bottom: 4px !important; -} -#tabs-1, -#tabs-2, -#tabs-3, -#tabs-4 { - display: none; -} -#tabs-1.active, -#tabs-2.active, -#tabs-3.active, -#tabs-4.active { - display: inherit; -} -#tabs-2 textarea { - width: 95%; -} -ul.tabs { - float: left; - padding: 0; - margin: 0; - list-style: none; - width: 100%; -} -ul.tabs li { - float: left; - height: 46px; - line-height: 46px; - padding-right: 2px; - width: 116px; - background: none; - margin: 0; - padding: 0 2px 0 0; -} -ul.tabs li.tabs4 { - padding-right: 0px; -} -ul.tabs li a { - height: 46px; - line-height: 46px; - display: block; - text-align: center; - padding: 0 10px; - min-width: 80px; - -moz-border-radius: 7px 7px 0 0; - -webkit-border-radius: 7px 7px 0 0; - border-radius: 7px 7px 0 0; - background: #d6dde0; - color: #3d4e53; -} -ul.tabs li a:hover { - text-decoration: none; -} -ul.tabs li a:hover, ul.tabs li.active a { - background: #6994a3; - color: #fff; -} diff --git a/static/css/comments.css b/static/css/comments.css deleted file mode 100644 index 72e83f45..00000000 --- a/static/css/comments.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.comments{clear:both;padding:5px;margin:0 5px 8px 0;width:95%}.comments.row1{background:#f6f9f9}.comments.row2{background:#fff}.comments div{float:left}.comments div img{margin:0 5px}.comments .image img{height:100px}.comments:after{content:".";display:block;height:0;clear:both;visibility:hidden}.comments .nonavatar{width:620px}.comments .nonavatar span{padding-right:5px}.comments .nonavatar span.text:before{content:"\201C";font-size:15px;font-weight:bold}.comments .nonavatar span.text:after{content:"\201D";font-size:15px;font-weight:bold}.comments .avatar{float:right;margin:0 auto;padding-top:5px}.official{border:3px #b8dde0 solid;margin-top:3px;margin-bottom:5px;padding-left:2px} \ No newline at end of file diff --git a/static/css/documentation2.css b/static/css/documentation2.css deleted file mode 100644 index 693acf0f..00000000 --- a/static/css/documentation2.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.user-block{width:100%;clear:both}#user-block1{width:100%}#user-block1 a#readon{float:left}.user-block-hide .quicktour.last{background:0}.learnmore_block{float:left;width:100%;clear:both;border-top:solid 1px #8ac3d7;margin-top:20px}.learnmore_block .learnmore_row{border-bottom:dashed 2px #8ac3d7;clear:left;width:68%}.learnmore_block .arrow{color:#8ac3d7;line-height:48pt;float:left;padding-right:8px;padding-left:8px;padding-top:20px;font-size:24pt}.learnmore_block .quicktour{width:20%;float:left;font-style:italic;line-height:20px;font-size:13px;margin-top:0;text-align:center;min-height:64px}.learnmore_block .quicktour .highlight{font-weight:bold}.learnmore_block .quicktour .programlink{margin-top:20px}.learnmore_block .quicktour .panelback{margin-top:21px}.learnmore_block .quicktour .panelfront{font-size:48pt;line-height:48pt;font-style:normal}.learnmore_block .quicktour .panelfront .makeaskgive{position:relative;z-index:1;font-size:40pt;top:10px;right:10pt;text-shadow:4px 2px 4px white}.learnmore_block .quicktour .panelfront .qtbutton{position:relative;z-index:0;opacity:.8}.learnmore_block .quicktour .panelfront .make{line-height:10pt;color:red;font-size:12pt;top:0;left:50px}.learnmore_block .quicktour .panelfront .qtreadit{line-height:0;position:relative;height:34px}.learnmore_block .quicktour .panelfront .qtreadittext{top:-15px;left:50px;line-height:10pt}.learnmore_block .quicktour .panelfront input{line-height:10pt;display:inherit;font-size:10pt;padding:.7em 1em;top:-15px}.learnmore_block .quicktour.last{padding-left:10px;font-size:20px;width:28%;padding-top:20px}.learnmore_block .quicktour.last .signup{color:#8dc63f;font-weight:bold;margin-top:10px}.learnmore_block .quicktour.last .signup img{margin-left:5px;vertical-align:middle;margin-bottom:3px}.learnmore_block .quicktour.right{float:right}input[type="submit"].qtbutton{float:none;margin:0}#block-intro-text div{display:none;line-height:25px;padding-bottom:10px}#block-intro-text div#active{display:inherit}body{line-height:19.5px}.have-right #js-main-container{float:left}.js-main-container-inner{padding-left:15px}.have-right #js-rightcol{margin-top:50px;background:#edf3f4;border:1px solid #d6dde0;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px}.have-right #js-rightcol .jsmodule{border-bottom:1px solid #3c4e52;width:235px}.have-right #js-rightcol .jsmodule.last{border-bottom:0;padding-bottom:10px}.js-rightcol-padd{padding:10px}.doc h2{margin:20px 0;color:#3d4e53;font-size:15px;font-weight:bold}.doc h3{color:#3d4e53;font-weight:bold}.doc ul{list-style-type:none;padding:0;margin:0}.doc ul.errorlist li{background:0;margin-bottom:0}.doc ul li{margin-left:7px}.doc ul.terms{list-style:inherit;list-style-position:inside;padding-left:1em;text-indent:-1em}.doc ul.terms li{-moz-border-radius:auto;-webkit-border-radius:auto;border-radius:auto;background:inherit}.doc ul.bullets{list-style-type:disc;margin-left:9px}.doc div.inset{background:#edf3f4;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;padding:10px;font-style:italic}dt{font-style:italic;font-size:15px;margin-bottom:7px;border-top:solid #edf3f4 2px;border-bottom:solid #edf3f4 2px;padding:7px 0}dd{margin:0 0 0 7px;padding-bottom:7px}dd.margin{margin-left:7px}.doc ol li{margin-bottom:7px}.collapse ul{display:none}.faq,.answer{text-transform:none!important}.faq a,.answer a{color:#6994a3}.faq{cursor:pointer}.faq:hover{text-decoration:underline}.press_spacer{clear:both;height:0}.presstoc{overflow:auto;clear:both;padding-bottom:10px}.presstoc div{float:left;padding-right:15px;margin-bottom:7px}.presstoc div.pressemail{border:solid 2px #3d4e53;padding:5px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;max-width:678px;margin-top:7px}.pressarticles div{margin-bottom:10px}.pressvideos>div{margin-bottom:15px;padding-bottom:7px;border-bottom:solid 1px #3d4e53;float:left}.pressvideos iframe,.pressvideos div.mediaborder{padding:5px;border:solid 5px #edf3f4}.pressimages{clear:both}.pressimages .outer{clear:both}.pressimages .outer div{float:left;width:25%;padding-bottom:10px}.pressimages .outer div.text{width:75%}.pressimages .outer div p{margin:0 auto;padding-left:10px;padding-right:10px}.pressimages .screenshot{width:150px;padding:5px;border:solid 5px #edf3f4}a.manage{background:#8dc63f;color:white;font-weight:bold;padding:.5em 1em;cursor:pointer;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0}a.manage:hover{text-decoration:none}.rh_help{cursor:pointer;color:#8ac3d7}.rh_help:hover{text-decoration:underline}.rh_answer{display:none;padding-left:10px;margin-bottom:7px;border:solid 2px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-indent:0!important}.work_campaigns{border:1px solid #d6dde0;margin:10px auto}.work_campaigns div{float:left}.work_campaigns div.campaign_info{width:60%;margin:5px}h2.thank-you{font-size:34px;color:#8dc63f;line-height:40px}.pledge_complete,.pledge_complete a{font-size:15px;line-height:18px;margin-bottom:15px}#js-slide .jsmodule.pledge{width:960px!important}ul.social.pledge{margin-bottom:100px}ul.social.pledge li{float:left;padding-right:30px!important}#widgetcode{float:right}div.pledge-container{width:100%}.yikes{color:#e35351;font-weight:bold}.call-to-action{color:#8dc63f} \ No newline at end of file diff --git a/static/css/download.css b/static/css/download.css deleted file mode 100644 index a245a82c..00000000 --- a/static/css/download.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px!important;height:28px;line-height:28px!important;margin:0!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}.download_container{width:75%;margin:auto}#lightbox_content a{color:#6994a3}#lightbox_content .signuptoday a{color:white}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-top:15px}#lightbox_content h2 a{font-size:18.75px}#lightbox_content .ebook_download a{margin:auto 5px auto 0;font-size:15px}#lightbox_content .ebook_download img{vertical-align:middle}#lightbox_content .logo{font-size:15px}#lightbox_content .logo img{-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;height:50px;width:50px;margin-right:5px}#lightbox_content .one_click,#lightbox_content .ebook_download_container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-left:-0.25%;padding:.5%;padding-bottom:15px;margin-bottom:5px;width:74%}#lightbox_content .one_click h3,#lightbox_content .ebook_download_container h3{margin-top:5px}#lightbox_content .one_click{border:solid 2px #8dc63f}#lightbox_content .ebook_download_container{border:solid 2px #d6dde0}#lightbox_content a.add-wishlist .on-wishlist,#lightbox_content a.success,a.success:hover{text-decoration:none;color:#3d4e53}#lightbox_content a.success,a.success:hover{cursor:default}#lightbox_content ul{padding-left:50px}#lightbox_content ul li{margin-bottom:4px}.border{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 2px #d6dde0;margin:5px auto;padding-right:5px;padding-left:5px}.sharing{float:right;padding:.5%!important;width:23%!important;min-width:105px}.sharing ul{padding:.5%!important}.sharing .jsmod-title{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;height:auto}.sharing .jsmod-title span{padding:5%!important;color:white!important;font-style:normal}#widgetcode2{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode2 textarea{max-width:90%}.btn_support.kindle{height:40px}.btn_support.kindle a{width:auto;font-size:15px} \ No newline at end of file diff --git a/static/css/enhanced_download.css b/static/css/enhanced_download.css deleted file mode 100644 index 0642e01e..00000000 --- a/static/css/enhanced_download.css +++ /dev/null @@ -1 +0,0 @@ -.buttons,.yes_js,.other_instructions_paragraph{display:inherit}.instructions>div:not(.active){display:none}.no_js{display:none!important}.active{display:inherit!important} \ No newline at end of file diff --git a/static/css/enhanced_download_ie.css b/static/css/enhanced_download_ie.css deleted file mode 100644 index 348a90a2..00000000 --- a/static/css/enhanced_download_ie.css +++ /dev/null @@ -1 +0,0 @@ -.yes_js,.other_instructions_paragraph{display:inherit}.instructions>div{display:none}.no_js{display:none!important}.active{display:inherit!important} \ No newline at end of file diff --git a/static/css/landingpage3.css b/static/css/landingpage3.css deleted file mode 100644 index 75be0061..00000000 --- a/static/css/landingpage3.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;color:white;cursor:pointer;font-size:13px;font-weight:bold;padding:0 15px;border:0;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;color:white;cursor:pointer;font-size:13px;font-weight:bold;padding:0 15px;border:0;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.user-block{width:100%;clear:both}#user-block1{width:100%}#user-block1 a#readon{float:left}.user-block-hide .quicktour.last{background:0}.learnmore_block{float:left;width:100%;clear:both;border-top:solid 1px #8ac3d7;margin-top:20px}.learnmore_block .learnmore_row{border-bottom:dashed 2px #8ac3d7;clear:left;width:68%}.learnmore_block .arrow{color:#8ac3d7;line-height:48pt;float:left;padding-right:8px;padding-left:8px;padding-top:20px;font-size:24pt}.learnmore_block .quicktour{width:20%;float:left;font-style:italic;line-height:20px;font-size:13px;margin-top:0;text-align:center;min-height:64px}.learnmore_block .quicktour .highlight{font-weight:bold}.learnmore_block .quicktour .programlink{margin-top:20px}.learnmore_block .quicktour .panelback{margin-top:21px}.learnmore_block .quicktour .panelfront{font-size:48pt;line-height:48pt;font-style:normal}.learnmore_block .quicktour .panelfront .makeaskgive{position:relative;z-index:1;font-size:40pt;top:10px;right:10pt;text-shadow:4px 2px 4px white}.learnmore_block .quicktour .panelfront .qtbutton{position:relative;z-index:0;opacity:.8}.learnmore_block .quicktour .panelfront .make{line-height:10pt;color:red;font-size:12pt;top:0;left:50px}.learnmore_block .quicktour .panelfront .qtreadit{line-height:0;position:relative;height:34px}.learnmore_block .quicktour .panelfront .qtreadittext{top:-15px;left:50px;line-height:10pt}.learnmore_block .quicktour .panelfront input{line-height:10pt;display:inherit;font-size:10pt;padding:.7em 1em;top:-15px}.learnmore_block .quicktour.last{padding-left:10px;font-size:20px;width:30%;padding-top:20px}.learnmore_block .quicktour.last .signup{color:#8dc63f;font-weight:bold;margin-top:10px}.learnmore_block .quicktour.last .signup img{margin-left:5px;vertical-align:middle;margin-bottom:3px}.learnmore_block .quicktour.right{float:right}#block-intro-text div{display:none;line-height:25px;padding-bottom:10px}#block-intro-text div#active{display:inherit}#expandable{display:none}#main-container.main-container-fl .js-main{width:968px;background:#fff url("/static/images/landingpage/container-top.png") top center no-repeat}#js-maincol-fl{padding:30px 30px 0 30px;overflow:hidden}#js-maincol-fl #content-block{background:0;padding:0}#js-maincol-fl #js-main-container{float:left;width:672px}#js-maincol-fl .js-main-container-inner{padding-right:40px}#js-maincol-fl h2.page-heading{margin:0 0 20px 0;color:#3d4e53;font-size:19px;font-weight:bold}#user-block1,.user-block2{float:left}#user-block1 #block-intro-text{float:left;width:702px;font-size:19px}#user-block1 a#readon{font-size:15px}#js-rightcol,#js-rightcol2{float:right;width:230px}#js-rightcol .jsmodule,#js-rightcol2 .jsmodule{float:left;width:208px;background:#edf3f4;border:1px solid #d6dde0;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;margin-bottom:10px;padding:0 10px 10px 10px}#js-rightcol .jsmodule.last,#js-rightcol2 .jsmodule.last{border-bottom:0;padding-bottom:10px}#js-rightcol .jsmodule input,#js-rightcol2 .jsmodule input{-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;border:0;height:36px;line-height:36px;width:90%;outline:0;padding-left:16px}#js-rightcol .jsmodule input.signup,#js-rightcol2 .jsmodule input.signup{background:url("/static/images/landingpage/button.png") no-repeat 0 0;border:medium none;color:#FFF;cursor:pointer;display:inline-block;font-weight:bold;font-size:13px;overflow:hidden;padding:0 31px 0 11px;width:111px}#js-rightcol div.button,#js-rightcol2 div.button{padding-top:10px}#js-rightcol label,#js-rightcol2 label{width:100%;display:block;clear:both;padding:10px 0 5px 16px}.google_signup{padding:30px 0}.google_signup div{height:24px;line-height:24px;float:left;padding-left:5px;font-size:15px;display:inline-block}.google_signup img{float:left;height:24px;width:24px}.google_signup div{height:24px;line-height:24px;float:left;padding-left:5px;font-size:15px;display:inline-block}.google_signup img{float:left;height:24px;width:24px}.js-rightcol-padd{padding:0}h3.heading{color:#3d4e53;font-weight:bold}ul.ungluingwhat{list-style:none;padding:0;margin:0 -10px}ul.ungluingwhat li{margin-bottom:7px;background:#fff;padding:10px;display:block;overflow:hidden}ul.ungluingwhat li>span{float:left}ul.ungluingwhat .user-avatar{width:43px}ul.ungluingwhat .user-avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}ul.ungluingwhat .user-book-info{margin-left:5px;width:160px;word-wrap:break-word;font-size:15px;line-height:19.5px}ul.ungluingwhat .user-book-info a{font-weight:normal}div.typo2{background:#edf3f4;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;padding:10px;font-style:italic}div.signup_btn{display:block;overflow:hidden}div.signup_btn a{background:url("/static/images/bg.png") no-repeat scroll right top transparent;color:#fff;display:block;font-size:13px;font-weight:bold;height:36px;line-height:36px;letter-spacing:1px;text-decoration:none;text-transform:capitalize;float:left}div.signup_btn a span{background:url("/static/images/bg.png") no-repeat scroll -770px -36px transparent;display:block;margin-right:29px;padding:0 5px 0 15px}.have-content-right-module .item-content{float:left;width:364px;font-size:15px;height:132px;border-bottom:7px solid #8ac3d7}.have-content-right-module .item-content p{margin-bottom:20px;line-height:135%}.have-content-right-module .item-content h2.page-heading{padding-right:97px;line-height:43px;padding-bottom:4px;padding-top:5px}.have-content-right-module .content-right-module{width:268px;float:right}.have-content-right-module .content-right-module h3{color:#8ac3d7;text-transform:uppercase;font-size:24px;font-weight:normal;padding:0;margin:0 0 16px 0}h2.page-heading{color:#3c4e52;font-size:28px!important;font-style:italic;font-weight:normal!important}#js-maincontainer-faq{clear:both;overflow:hidden;margin:15px 0;width:100%}.js-maincontainer-faq-inner{float:right;color:#3d4e53;font-size:15px;padding-right:60px}.js-maincontainer-faq-inner a{font-weight:normal;color:#3d4e53;text-decoration:underline}h3.module-title{padding:10px 0;font-size:19px;font-weight:normal}.landingheader{border-bottom:solid 5px #6994a3;float:left;height:134px}h3.featured_books{clear:both;font-weight:normal;background:#edf3f4;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;padding:10px}a.more_featured_books{float:right;width:57px;height:305px;margin:5px 0;border:5px solid white;line-height:305px;text-align:center}a.more_featured_books:hover{cursor:pointer;border-color:#edf3f4;color:#8dc63f}.spacer{height:15px;width:100%;clear:both}ul#as_seen_on{margin:15px 0;position:relative;height:80px}ul#as_seen_on li{float:left;list-style-type:none;padding:10px;line-height:80px}ul#as_seen_on li:hover{background:#8ac3d7}ul#as_seen_on li img{vertical-align:middle;max-width:131px}.speech_bubble{position:relative;margin:1em 0;border:5px solid #6994a3;color:#3d4e53;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;background:#fff;font-size:19px;padding:1.5em}.speech_bubble:before{content:"";position:absolute;top:-20px;bottom:auto;left:auto;right:60px;border-width:0 20px 20px;border-style:solid;border-color:#6994a3 transparent;display:block;width:0}.speech_bubble:after{content:"";position:absolute;top:-13px;bottom:auto;left:auto;right:67px;border-width:0 13px 13px;border-style:solid;border-color:#fff transparent;display:block;width:0}.speech_bubble span{margin-left:1em}.speech_bubble span:before{position:absolute;top:.75em;left:.75em;font-size:38px;content:"\201C"}.speech_bubble span:after{position:absolute;top:.75em;font-size:38px;content:"\201D"}#footer{clear:both;margin-top:30px} \ No newline at end of file diff --git a/static/css/landingpage4.css b/static/css/landingpage4.css deleted file mode 100644 index eebaed09..00000000 --- a/static/css/landingpage4.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.user-block{width:100%;clear:both}#user-block1{width:100%}#user-block1 a#readon{float:left}.user-block-hide .quicktour.last{background:0}.learnmore_block{float:left;width:100%;clear:both;border-top:solid 1px #8ac3d7;margin-top:20px}.learnmore_block .learnmore_row{border-bottom:dashed 2px #8ac3d7;clear:left;width:68%}.learnmore_block .arrow{color:#8ac3d7;line-height:48pt;float:left;padding-right:8px;padding-left:8px;padding-top:20px;font-size:24pt}.learnmore_block .quicktour{width:20%;float:left;font-style:italic;line-height:20px;font-size:13px;margin-top:0;text-align:center;min-height:64px}.learnmore_block .quicktour .highlight{font-weight:bold}.learnmore_block .quicktour .programlink{margin-top:20px}.learnmore_block .quicktour .panelback{margin-top:21px}.learnmore_block .quicktour .panelfront{font-size:48pt;line-height:48pt;font-style:normal}.learnmore_block .quicktour .panelfront .makeaskgive{position:relative;z-index:1;font-size:40pt;top:10px;right:10pt;text-shadow:4px 2px 4px white}.learnmore_block .quicktour .panelfront .qtbutton{position:relative;z-index:0;opacity:.8}.learnmore_block .quicktour .panelfront .make{line-height:10pt;color:red;font-size:12pt;top:0;left:50px}.learnmore_block .quicktour .panelfront .qtreadit{line-height:0;position:relative;height:34px}.learnmore_block .quicktour .panelfront .qtreadittext{top:-15px;left:50px;line-height:10pt}.learnmore_block .quicktour .panelfront input{line-height:10pt;display:inherit;font-size:10pt;padding:.7em 1em;top:-15px}.learnmore_block .quicktour.last{padding-left:10px;font-size:20px;width:28%;padding-top:20px}.learnmore_block .quicktour.last .signup{color:#8dc63f;font-weight:bold;margin-top:10px}.learnmore_block .quicktour.last .signup img{margin-left:5px;vertical-align:middle;margin-bottom:3px}.learnmore_block .quicktour.right{float:right}input[type="submit"].qtbutton{float:none;margin:0}#block-intro-text div{display:none;line-height:25px;padding-bottom:10px}#block-intro-text div#active{display:inherit}#expandable{display:none}#main-container.main-container-fl .js-main{width:968px;background:#fff url("/static/images/landingpage/container-top.png") top center no-repeat}#js-maincol-fl{padding:30px 30px 0 30px;overflow:hidden}#js-maincol-fl #content-block{background:0;padding:0}#js-maincol-fl #js-main-container{float:left;width:672px}#js-maincol-fl .js-main-container-inner{padding-right:40px}#js-maincol-fl h2.page-heading{margin:0 0 20px 0;color:#3d4e53;font-size:19px;font-weight:bold}#user-block1,.user-block2{float:left}#user-block1 #block-intro-text{float:left;width:702px;font-size:19px}#user-block1 a#readon{font-size:15px}#js-rightcol,#js-rightcol2{float:right;width:230px}#js-rightcol .jsmodule,#js-rightcol2 .jsmodule{float:left;width:208px;background:#edf3f4;border:1px solid #d6dde0;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;margin-bottom:10px;padding:0 10px 10px 10px}#js-rightcol .jsmodule input,#js-rightcol2 .jsmodule input{border:0;height:36px;line-height:36px;width:90%;outline:0;padding-left:16px;font-size:15px}#js-rightcol .jsmodule input.signup,#js-rightcol2 .jsmodule input.signup{border:medium none;cursor:pointer;display:inline-block;overflow:hidden;padding:0 31px 0 11px;width:111px;margin-bottom:10px}#js-rightcol .jsmodule input.donate,#js-rightcol2 .jsmodule input.donate{cursor:pointer;display:inline-block;overflow:hidden;padding:0 31px 0 11px;width:50%}#js-rightcol .jsmodule .donate_amount,#js-rightcol2 .jsmodule .donate_amount{text-align:center}#js-rightcol .jsmodule div,#js-rightcol2 .jsmodule div{padding:0;margin:0}#js-rightcol div.button,#js-rightcol2 div.button{padding-top:10px;text-align:center;color:#FFF}#js-rightcol #donatesubmit,#js-rightcol2 #donatesubmit{font-size:15px}#js-rightcol label,#js-rightcol2 label{width:100%;display:block;clear:both;padding:10px 0 5px 0}.js-rightcol-padd{margin:0}h3.heading{color:#3d4e53;font-weight:bold}ul.ungluingwhat{list-style:none;padding:0;margin:0 -10px}ul.ungluingwhat li{margin-bottom:3px;background:#fff;padding:10px;display:block;overflow:hidden}ul.ungluingwhat li>span{float:left}ul.ungluingwhat .user-avatar{width:43px}ul.ungluingwhat .user-avatar img{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}ul.ungluingwhat .user-book-info{margin-left:5px;width:160px;word-wrap:break-word;font-size:13px;line-height:16.900000000000002px}ul.ungluingwhat .user-book-info a{font-weight:normal}div.typo2{background:#edf3f4;-moz-border-radius:12px;-webkit-border-radius:12px;border-radius:12px;padding:10px;font-style:italic}div.signup_btn{display:block;overflow:hidden}div.signup_btn a{background:url("/static/images/bg.png") no-repeat scroll right top transparent;color:#fff;display:block;font-size:13px;font-weight:bold;height:36px;line-height:36px;letter-spacing:1px;text-decoration:none;text-transform:capitalize;float:left}div.signup_btn a span{background:url("/static/images/bg.png") no-repeat scroll -770px -36px transparent;display:block;margin-right:29px;padding:0 5px 0 15px}.have-content-right-module .item-content{float:left;width:364px;font-size:15px;height:132px;border-bottom:7px solid #8ac3d7}.have-content-right-module .item-content p{margin-bottom:20px;line-height:135%}.have-content-right-module .item-content h2.page-heading{padding-right:97px;line-height:43px;padding-bottom:4px;padding-top:5px}.have-content-right-module .content-right-module{width:268px;float:right}.have-content-right-module .content-right-module h3{color:#8ac3d7;text-transform:uppercase;font-size:24px;font-weight:normal;padding:0;margin:0 0 16px 0}h2.page-heading{color:#3c4e52;font-size:28px!important;font-style:italic;font-weight:normal!important}#js-maincontainer-faq{clear:both;overflow:hidden;margin:15px 0;width:100%}.js-maincontainer-faq-inner{float:right;color:#3d4e53;font-size:15px;padding-right:60px}.js-maincontainer-faq-inner a{font-weight:normal;color:#3d4e53;text-decoration:underline}h3.module-title{padding:10px 0;font-size:19px;font-weight:normal;margin:0}.landingheader{border-bottom:solid 5px #6994a3;float:left;height:134px}h3.featured_books{clear:both;font-weight:normal;background:#edf3f4;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;padding:10px;-webkit-margin-before:0}a.more_featured_books{float:right;width:57px;height:305px;margin:5px 0;border:5px solid white;line-height:305px;text-align:center}a.more_featured_books:hover{cursor:pointer;border-color:#edf3f4;color:#8dc63f}a.more_featured_books.short{height:85px;line-height:85px}.spacer{height:15px;width:100%;clear:both}ul#as_seen_on{margin:15px 0;position:relative;height:80px;padding:0}ul#as_seen_on li{float:left;list-style-type:none;padding:10px;line-height:80px}ul#as_seen_on li:hover{background:#8ac3d7}ul#as_seen_on li img{vertical-align:middle;max-width:131px}.speech_bubble{position:relative;margin:1em 0;border:5px solid #6994a3;color:#3d4e53;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;background:#fff;font-size:19px;padding:1.5em}.speech_bubble:before{content:"";position:absolute;top:-20px;bottom:auto;left:auto;right:60px;border-width:0 20px 20px;border-style:solid;border-color:#6994a3 transparent;display:block;width:0}.speech_bubble:after{content:"";position:absolute;top:-13px;bottom:auto;left:auto;right:67px;border-width:0 13px 13px;border-style:solid;border-color:#fff transparent;display:block;width:0}.speech_bubble span{padding-left:1em}.speech_bubble span:before{position:absolute;top:.75em;left:.75em;font-size:38px;content:"\201C"}.speech_bubble span:after{position:absolute;top:.75em;font-size:38px;content:"\201D"}#footer{clear:both;margin-top:30px} \ No newline at end of file diff --git a/static/css/learnmore2.css b/static/css/learnmore2.css deleted file mode 100644 index fe4ce5ad..00000000 --- a/static/css/learnmore2.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.user-block{width:100%;clear:both}#user-block1{width:100%}#user-block1 a#readon{float:left}.user-block-hide .quicktour.last{background:0}.learnmore_block{float:left;width:100%;clear:both;border-top:solid 1px #8ac3d7;margin-top:20px}.learnmore_block .learnmore_row{border-bottom:dashed 2px #8ac3d7;clear:left;width:68%}.learnmore_block .arrow{color:#8ac3d7;line-height:48pt;float:left;padding-right:8px;padding-left:8px;padding-top:20px;font-size:24pt}.learnmore_block .quicktour{width:20%;float:left;font-style:italic;line-height:20px;font-size:13px;margin-top:0;text-align:center;min-height:64px}.learnmore_block .quicktour .highlight{font-weight:bold}.learnmore_block .quicktour .programlink{margin-top:20px}.learnmore_block .quicktour .panelback{margin-top:21px}.learnmore_block .quicktour .panelfront{font-size:48pt;line-height:48pt;font-style:normal}.learnmore_block .quicktour .panelfront .makeaskgive{position:relative;z-index:1;font-size:40pt;top:10px;right:10pt;text-shadow:4px 2px 4px white}.learnmore_block .quicktour .panelfront .qtbutton{position:relative;z-index:0;opacity:.8}.learnmore_block .quicktour .panelfront .make{line-height:10pt;color:red;font-size:12pt;top:0;left:50px}.learnmore_block .quicktour .panelfront .qtreadit{line-height:0;position:relative;height:34px}.learnmore_block .quicktour .panelfront .qtreadittext{top:-15px;left:50px;line-height:10pt}.learnmore_block .quicktour .panelfront input{line-height:10pt;display:inherit;font-size:10pt;padding:.7em 1em;top:-15px}.learnmore_block .quicktour.last{padding-left:10px;font-size:20px;width:28%;padding-top:20px}.learnmore_block .quicktour.last .signup{color:#8dc63f;font-weight:bold;margin-top:10px}.learnmore_block .quicktour.last .signup img{margin-left:5px;vertical-align:middle;margin-bottom:3px}.learnmore_block .quicktour.right{float:right}input[type="submit"].qtbutton{float:none;margin:0}#block-intro-text div{display:none;line-height:25px;padding-bottom:10px}#block-intro-text div#active{display:inherit} \ No newline at end of file diff --git a/static/css/liblist.css b/static/css/liblist.css deleted file mode 100644 index e7833136..00000000 --- a/static/css/liblist.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.items{clear:both;padding:5px;margin:0 5px 8px 0;width:95%}.items.row1{background:#f6f9f9}.items.row2{background:#fff}.items div{float:left}.items div img{margin:0 5px}.items .image img{height:100px}.items:after{content:".";display:block;height:0;clear:both;visibility:hidden}.items .nonavatar{width:620px;padding-top:5px}.items .nonavatar span{padding-right:5px}.items .nonavatar div.libname{width:100%}.items .nonavatar div.libname a{font-size:15px}.items .nonavatar div.libstat{width:25%;display:block}.items .avatar{float:left;margin:0 auto;padding-top:5px}.joined{border:3px #b8dde0 solid;margin-top:3px;margin-bottom:5px;padding-left:2px}.joined em{font-color:#b8dde0;font-style:italic} \ No newline at end of file diff --git a/static/css/libraries.css b/static/css/libraries.css deleted file mode 100644 index 4a5d4f08..00000000 --- a/static/css/libraries.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.doc h2.unglueit_loves_libraries{font-size:110px;text-align:center}.doc h3{text-align:center;font-style:italic;margin-bottom:37.5px}#widgetcode{display:none}ul.social.pledge{margin:0!important}ul.social.pledge li{margin-top:7px!important}.clearfix{margin-bottom:14px}a,dt a{color:#6994a3} \ No newline at end of file diff --git a/static/css/lists.css b/static/css/lists.css deleted file mode 100644 index e8d82ce4..00000000 --- a/static/css/lists.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.user-block2{width:48%;font-size:18px;padding-right:2%}#js-leftcol li.active_lang a{font-weight:bold}.show_langs:hover{text-decoration:underline}#lang_list{display:none}#tabs-1,#tabs-2,#tabs-3{margin-left:0}ul.tabs li a{height:41px;line-height:18px;padding-top:5px} \ No newline at end of file diff --git a/static/css/manage_campaign.css b/static/css/manage_campaign.css deleted file mode 100644 index dc4ebcfc..00000000 --- a/static/css/manage_campaign.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}#tabs{border-bottom:4px solid #6994a3;clear:both;float:left;margin-top:10px;width:100%}#tabs ul.book-list-view{margin-bottom:4px!important}#tabs-1,#tabs-2,#tabs-3,#tabs-4{display:none}#tabs-1.active,#tabs-2.active,#tabs-3.active,#tabs-4.active{display:inherit}#tabs-2 textarea{width:95%}ul.tabs{float:left;padding:0;margin:0;list-style:none;width:100%}ul.tabs li{float:left;height:46px;line-height:20px;padding-right:2px;width:116px;background:0;margin:0;padding:0 2px 0 0}ul.tabs li.tabs4{padding-right:0}ul.tabs li a{height:41px;line-height:18px;display:block;text-align:center;padding:0 10px;min-width:80px;-moz-border-radius:7px 7px 0 0;-webkit-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;background:#d6dde0;color:#3d4e53;padding-top:5px}ul.tabs li a:hover{text-decoration:none}ul.tabs li a div{padding-top:8px}ul.tabs li a:hover,ul.tabs li.active a{background:#6994a3;color:#fff}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.book-detail{float:left;width:100%;clear:both;display:block}.book-cover{float:left;margin-right:10px;width:151px}.book-cover img{padding:5px;border:solid 5px #edf3f4}.book-detail-info{float:left;width:309px}.book-detail-info h2.book-name,.book-detail-info h3.book-author,.book-detail-info h3.book-year{padding:0;margin:0;line-height:normal}.book-detail-info h2.book-name{font-size:19px;font-weight:bold;color:#3d4e53}.book-detail-info h3.book-author,.book-detail-info h3.book-year{font-size:13px;font-weight:normal;color:#3d4e53}.book-detail-info h3.book-author span a,.book-detail-info h3.book-year span a{font-size:13px;font-weight:normal;color:#6994a3}.book-detail-info>div{width:100%;clear:both;display:block;overflow:hidden;border-top:1px solid #edf3f4;padding:10px 0}.book-detail-info>div.layout{border:0;padding:0}.book-detail-info>div.layout div.pubinfo{float:left;width:auto;padding-bottom:7px}.book-detail-info .btn_wishlist span{text-align:right}.book-detail-info .find-book label{float:left;line-height:31px}.book-detail-info .find-link{float:right}.book-detail-info .find-link img{padding:2px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.book-detail-info .pledged-info{padding:10px 0;position:relative}.book-detail-info .pledged-info.noborder{border-top:0;padding-top:0}.book-detail-info .pledged-info .campaign-status-info{float:left;width:50%;margin-top:13px}.book-detail-info .pledged-info .campaign-status-info span{font-size:15px;color:#6994a3;font-weight:bold}.book-detail-info .thermometer{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;border:solid 2px #d6dde0;width:291px;padding:7px;position:relative;overflow:visible;background:-webkit-gradient(linear,left top,right top,from(#8dc63f),to(#cf6944));background:-webkit-linear-gradient(left,#cf6944,#8dc63f);background:-moz-linear-gradient(left,#cf6944,#8dc63f);background:-ms-linear-gradient(left,#cf6944,#8dc63f);background:-o-linear-gradient(left,#cf6944,#8dc63f);background:linear-gradient(left,#cf6944,#8dc63f);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert',endColorstr='@call-to-action');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert', endColorstr='@call-to-action')"}.book-detail-info .thermometer.successful{border-color:#8ac3d7;background:#edf3f4}.book-detail-info .thermometer .cover{position:absolute;right:0;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;width:50px;height:14px;margin-top:-7px;background:#f3f5f6}.book-detail-info .thermometer span{display:none}.book-detail-info .thermometer:hover span{display:block;position:absolute;z-index:200;right:0;top:-7px;font-size:19px;color:#6994a3;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .explainer span.explanation{display:none}.book-detail-info .explainer:hover span.explanation{display:block;position:absolute;z-index:200;right:0;top:12px;font-size:13px;font-weight:normal;color:#3d4e53;background:white;border:2px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:5px}.book-detail-info .status{position:absolute;top:50%;right:0;height:25px;margin-top:-12px}.preview_campaign{float:right;margin-right:40px}input[name="launch"]{display:none}#launchme{margin:15px auto}#premium_add span,#premium_add input[type="text"],#premium_add textarea{float:left}#premium_add input[type="submit"]{float:right}#premium_add input[type="text"]{width:33%}#premium_add textarea{width:60%}#premium_add .premium_add_label{width:30%;margin-right:2%}#premium_add .premium_field_label{width:1%;margin-left:-1%}div.edition_form{margin-bottom:2em} \ No newline at end of file diff --git a/static/css/notices.css b/static/css/notices.css deleted file mode 100644 index 16186011..00000000 --- a/static/css/notices.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.notices_menu{float:right;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background:#edf3f4;padding:10px 20px;margin:-15px auto 7px 7px}.notices_menu a{font-size:13px;font-weight:bold}#js-main-container{float:none!important;padding-right:15px}th{text-align:left}tr{line-height:24px}tr.row1{background:#edf3f4}td{padding-left:7px;padding-right:7px}td#last{padding:0}table input[type="submit"]{float:right;margin-right:0}.comments{border:solid 3px #d6dde0;margin:3px auto}.comments hr{margin:10px auto 5px;color:#d6dde0;background-color:#d6dde0;height:2px;border:0}.comments .comments_book{padding:5px;border:solid 5px #edf3f4;margin-right:10px;margin-bottom:10px;max-width:80px}.comments .comments_book img{max-width:80px}.comments .comments_textual{padding:10px 5px 5px}.comments .comments_textual div{margin-bottom:5px}.comments .comments_info{border-bottom:solid 1px #d6dde0;padding:5px}.comments .comments_info div{float:left}.comments .comments_info .comments_graphical{padding:5px auto}.comments .comments_info span{text-indent:0} \ No newline at end of file diff --git a/static/css/pledge.css b/static/css/pledge.css deleted file mode 100644 index 7344ac1b..00000000 --- a/static/css/pledge.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}#content-block .jsmod-content,.book-detail{float:left;width:auto}input[type="submit"],a.fakeinput{float:right;font-size:19px;margin:10px 0 10px;cursor:pointer}.pledge_amount{padding:10px;font-size:19px;background:#edf3f4}.pledge_amount.premium_level{margin-top:3px}form.pledgeform{width:470px}#id_preapproval_amount{width:50%;line-height:30px;font-size:15px}ul.support li,ul.support li:hover{background-image:none}p{margin:7px auto}.jsmodule.pledge{margin:auto}.jsmodule.pledge .jsmod-content{float:right!important}.modify_notification{width:452px;margin-bottom:7px;border:solid 2px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;padding:7px}.modify_notification h4{margin:0 0 5px 0}.cancel_notice{width:470px;padding:5px;margin-top:10px}#fakepledgesubmit{background-color:#e35351;cursor:default;font-weight:bold;font-size:19px;display:none}span.menu-item-price{float:none!important}ul#offers_list li div.on{display:block;background:#edf3f4;margin-top:1em}ul#offers_list li div.on .give_label{padding:4px;color:black}ul#offers_list li div.off{display:none}ul#offers_list li input[type=text],ul#offers_list li textarea{width:95%;font-size:15px;color:#3d4e53;margin:0 10px 5px 5px}ul#offers_list li input[type=text]{height:19.5px;line-height:19.5px}#mandatory_premiums{font-size:15px}#mandatory_premiums div{float:left}#mandatory_premiums div.ack_level{width:16%;margin-right:3%;height:100%;padding:1%}#mandatory_premiums div.ack_header{width:73%;padding:1%}#mandatory_premiums div.ack_active,#mandatory_premiums div.ack_inactive{width:100%;font-size:13px}#mandatory_premiums div.ack_active .ack_header,#mandatory_premiums div.ack_active .ack_level{border:solid #3d4e53;border-width:1%;background:white}#mandatory_premiums div.ack_inactive .ack_header,#mandatory_premiums div.ack_inactive .ack_level{border:solid #d6dde0;border-width:1%;background:#d6dde0}#mandatory_premiums div.ack_inactive input,#mandatory_premiums div.ack_inactive textarea{background:#d6dde0;border:dashed 1px #3d4e53}#mandatory_premiums>div{margin:7px 0}#mandatory_premiums input[type=text],#mandatory_premiums textarea{width:95%;font-size:15px;color:#3d4e53;margin:5px 0}#mandatory_premiums input[type=text]{height:19.5px;line-height:19.5px}#id_ack_link{border:0;cursor:default}.fund_options a.fakeinput{font-size:19px;margin:10px auto;float:left;line-height:normal}.fund_options input[type="submit"]{float:left}.fund_options div{width:50%;float:left}.fund_options div ul{background:#edf3f4}.fund_options div.highlight{color:#73a334}.fund_options div.highlight ul{border-color:#a7c1ca;background:white}.fund_options ul{padding:5px 10px 5px 15px;border:solid 1px #d6dde0;margin-right:15px;list-style-type:none}.fund_options ul li{margin:5px 0}.fund_options ul a{color:#6994a3}#authorize{border:3px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-top:10px;padding:10px}#authorize.off{display:none}#authorize div.innards input[type="text"],#authorize div.innards input[type="password"]{font-size:15px;line-height:22.5px;border-width:2px;padding:1% 1%;margin:1% 0;color:#3d4e53}#authorize div.innards input[type="text"]:disabled,#authorize div.innards input[type="password"]:disabled{border-color:white}#authorize div.innards input[type="text"].address,#authorize div.innards input[type="password"].address,#authorize div.innards input[type="text"]#card_Number,#authorize div.innards input[type="password"]#card_Number,#authorize div.innards input[type="text"]#id_email,#authorize div.innards input[type="password"]#id_email{width:61%}#authorize div.innards label{width:31%;float:left;line-height:22.5px;font-size:15px;border:solid white;border-width:2px 0;padding:1% 2% 1% 0;margin:1% 0;text-align:right}#authorize div.innards .form-row span{float:left;line-height:22.5px;font-size:15px;margin:1%;padding:1% 0}#authorize .cvc{position:relative;z-index:0}#authorize #cvc_help{font-style:italic;float:none;font-size:13px;color:#6994a3;cursor:pointer}#authorize #cvc_answer{display:none;z-index:100;border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin:1% 0;padding:1%;width:46%;position:absolute;top:90%;right:0;opacity:1;background-color:white}#authorize #cvc_answer img{float:right;margin-left:5px}.payment-errors{display:none;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;width:auto;margin:auto}.payment-errors li{list-style:none;border:0}span.level2.menu.answer{border-left:solid 7px #edf3f4}span.level2.menu.answer a{font-size:15px}#anonbox{margin-top:10px;background:#edf3f4;float:left;width:48%;padding:1%}#anonbox.off{display:none} \ No newline at end of file diff --git a/static/css/registration2.css b/static/css/registration2.css deleted file mode 100644 index 8f7db69c..00000000 --- a/static/css/registration2.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}#login_centerer{padding:10px;width:960px}#registration{width:960px;padding:10px;margin:0 auto;padding:10px 0;font-size:13px;line-height:19.5px}#registration .helptext{font-style:italic}#registration .helptext:before{white-space:pre;content:"\A"}.login_box{border:solid 3px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin:10px auto;padding:9px;width:45%}.login_box .google_signup{padding:21px}.login_box input[type="text"],.login_box input[type="password"]{width:90%}#login{border:solid 3px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin:10px auto;float:none;padding:10px;width:50%}#login input[type="text"],#login input[type="password"]{width:90%}.actionbutton{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0;float:left}#welcomesearch label{display:block;margin:0 auto;font-size:19px;padding-bottom:10px}#welcomesearch p{margin-bottom:5px}#welcomesearch form{margin:0 auto;width:210px;background:url("/static/images/landingpage/search-box-two.png") 0 0 no-repeat;height:36px;display:block;overflow:hidden}#welcomesearch input.inputbox{border:0;color:#66942e;height:26px;line-height:26px;font-size:13px;float:left;padding:0;margin:5px 0 5px 20px;width:149px;outline:0}#welcomesearch input.inputbox:focus{border:0}#welcomesearch input.greenbutton[type="submit"]{background:url("/static/images/landingpage/search-button-two.png") 0 0 no-repeat;width:40px;height:40px;padding:0;margin:0;border:0;display:block;float:right;text-indent:-10000px;font-size:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.welcomealternatives{border-top:1px solid #d6dde0;margin-top:10px;padding-top:5px}label:before{content:"\A";white-space:pre} \ No newline at end of file diff --git a/static/css/search.css b/static/css/search.css deleted file mode 100644 index 5a17699d..00000000 --- a/static/css/search.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.grey{background:#bacfd6 url("/static/images/header-button-undefined.png") left bottom repeat-x}.listview .rounded{line-height:normal;margin-right:0} \ No newline at end of file diff --git a/static/css/searchandbrowse2.css b/static/css/searchandbrowse2.css deleted file mode 100644 index a0b04160..00000000 --- a/static/css/searchandbrowse2.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}#js-maincontainer-bot-block{clear:both;overflow:visible;margin-top:55px}#js-maincontainer-bot-block #js-search{-moz-border-radius:64px;-webkit-border-radius:64px;border-radius:64px;background-color:#8dc63f;width:652px;height:80px;overflow:hidden;clear:both;color:#fff}#js-maincontainer-bot-block #js-search label{line-height:80px;font-size:19px;float:left;padding:0;width:auto;padding:0 15px 0 30px}#js-maincontainer-bot-block #js-search form{float:left;width:210px;background:url("/static/images/landingpage/search-box-two.png") 0 0 no-repeat;height:36px;display:block;overflow:hidden;margin-top:22px}#js-slideshow{padding:0 30px;position:relative}#js-slideshow a.prev{text-indent:-10000px;font-size:0;width:15px;height:22px;display:block;position:absolute;top:45%;background:url("/static/images/landingpage/arrow-left.png") 0 0 no-repeat;left:0}#js-slideshow a.next{text-indent:-10000px;font-size:0;width:15px;height:22px;display:block;position:absolute;top:45%;background:url("/static/images/landingpage/arrow-right.png") 0 0 no-repeat;right:0}.spacer{float:left;margin:0 4px}#js-search input.inputbox{border:0;color:#66942e;height:26px;line-height:26px;font-size:13px;float:left;padding:0;margin:5px 0 5px 20px;width:149px;outline:0}#js-search input.greenbutton{background:url("/static/images/landingpage/search-button-two.png") 0 0 no-repeat;width:40px;height:40px;padding:0;margin:0;border:0;display:block;float:right;text-indent:-10000px;font-size:0}#js-slide .jsmodule>h3{background:url("/static/images/landingpage/bg-slide.png") bottom center no-repeat;padding-bottom:7px;padding-left:35px}#js-slide .jsmodule>h3 span{background:#8ac3d7;color:#fff;padding:10px 20px;-moz-border-radius:10px 10px 0 0;-webkit-border-radius:10px 10px 0 0;border-radius:10px 10px 0 0;font-size:19px;overflow:hidden;display:inline-block;font-weight:normal} \ No newline at end of file diff --git a/static/css/sitewide3.css b/static/css/sitewide3.css deleted file mode 100644 index e5d97cda..00000000 --- a/static/css/sitewide3.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;color:white;cursor:pointer;font-size:13px;font-weight:bold;padding:0 15px;border:0;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;color:white;cursor:pointer;font-size:13px;font-weight:bold;padding:0 15px;border:0;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px!important;height:28px;line-height:28px!important;margin:0!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}.download_container{width:75%;margin:auto}#lightbox_content a{color:#6994a3}#lightbox_content .signuptoday a{color:white}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-top:15px}#lightbox_content h2 a{font-size:18.75px}#lightbox_content .ebook_download a{margin:auto 5px auto 0;font-size:15px}#lightbox_content .ebook_download img{vertical-align:middle}#lightbox_content .logo{font-size:15px}#lightbox_content .logo img{-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;height:50px;width:50px;margin-right:5px}#lightbox_content .unglued,#lightbox_content .not_unglued{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-left:-0.25%;padding:.5%;padding-bottom:15px;margin-bottom:5px;width:74%}#lightbox_content .unglued h3,#lightbox_content .not_unglued h3{margin-top:5px}#lightbox_content .unglued{border:solid 2px #8dc63f}#lightbox_content .not_unglued{border:solid 2px #d6dde0}#lightbox_content a.add-wishlist .on-wishlist,#lightbox_content a.success,a.success:hover{text-decoration:none;color:#3d4e53}#lightbox_content a.success,a.success:hover{cursor:default}#lightbox_content ul{padding-left:50px}#lightbox_content ul li{margin-bottom:4px}.border{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 2px #d6dde0;margin:5px auto;padding-right:5px;padding-left:5px}.sharing{float:right;padding:.5%!important;width:23%!important;min-width:105px}.sharing ul{padding:.5%!important}.sharing .jsmod-title{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;height:auto}.sharing .jsmod-title span{padding:5%!important;color:white!important;font-style:normal}#widgetcode2{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode2 textarea{max-width:90%}.preview{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:934px}.preview a{color:#8dc63f}.launch_top{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:934px;border-color:#8dc63f;margin:10px auto 0 auto;font-size:15px;line-height:22.5px}.launch_top a{color:#8dc63f}.launch_top.pale{border-color:#d6dde0;font-size:13px}.launch_top.alert{border-color:#e35351;font-size:13px}.preview_content{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:934px;width:80%;margin:10px auto}.preview_content a{color:#8dc63f}.utilityheaders{text-transform:uppercase;color:#3d4e53;font-size:15px;display:block}html,body{height:100%}body{background:url("/static/images/bg-body.png") 0 0 repeat-x;padding:0 0 20px 0;margin:0;font-size:13px;line-height:16.900000000000002px;font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Arial,Helvetica,sans-serif;color:#3d4e53}#feedback{position:fixed;bottom:10%;right:0;z-index:500}#feedback p{writing-mode:tb-rl;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);white-space:nowrap;display:block;bottom:0;width:160px;height:32px;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;background:#8dc63f;margin-bottom:0;text-align:center;margin-right:-67px;line-height:normal}#feedback p a{color:white;font-size:24px;font-weight:normal}#feedback p a:hover{color:#3d4e53}a{font-weight:bold;font-size:inherit;text-decoration:none;cursor:pointer;color:#6994a3}a:hover{text-decoration:underline}h1{font-size:22.5px}h2{font-size:18.75px}h3{font-size:17.549999999999997px}h4{font-size:15px}img{border:0}img.user-avatar{float:left;margin-right:10px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px}input,textarea,a.fakeinput{border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}input:focus,textarea:focus,a.fakeinput:focus{border:2px solid #8dc63f;outline:0}a.fakeinput:hover{text-decoration:none}.js-search input{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}h2.content-heading{padding:15px;margin:0;font-size:19px;font-weight:normal;color:#3d4e53;float:left;width:50%}h2.content-heading span{font-style:italic}h3.jsmod-title{-moz-border-radius:8px 8px 0 0;-webkit-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0;background:#a7c1ca;padding:0;margin:0;height:73px}h3.jsmod-title span{font-size:19px;font-style:italic;color:#3d4e53;padding:26px 40px 27px 20px;display:block}input[type="submit"],a.fakeinput{background:#8dc63f;color:white;font-weight:bold;padding:.5em 1em;cursor:pointer}.loader-gif[disabled="disabled"],.loader-gif.show-loading{background:url('/static/images/loading.gif') center no-repeat!important}.js-page-wrap{position:relative;min-height:100%}.js-main{width:960px;margin:0 auto;clear:both;padding:0}ul.menu{list-style:none;padding:0;margin:0}.errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errorlist li{list-style:none;border:0}.errorlist li{list-style:none;border:0}.errorlist+input{border:2px solid #e35351!important}.errorlist+input:focus{border:1px solid #8dc63f!important}.errorlist+textarea{border:2px solid #e35351!important}.errorlist+textarea:focus{border:2px solid #8dc63f!important}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}#js-header{height:90px}.js-logo{float:left;padding-top:10px}.js-logo a img{border:0}.js-topmenu{float:right;margin-top:25px;font-size:15px}.js-topmenu#authenticated{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:36px}.js-topmenu#authenticated:hover,.js-topmenu#authenticated.highlight{background:#d6dde0;cursor:pointer;position:relative}.js-topmenu#authenticated.highlight span#welcome{background-image:url("/static/images/menu_bar_up_arrow_textblue.png")}.js-topmenu ul#user_menu{white-space:nowrap;display:none;z-index:100;position:absolute;top:36px;left:0;padding:0;overflow:visible;margin:0}.js-topmenu ul#user_menu li{border-top:1px solid white;list-style-type:none;float:none;background:#d6dde0;padding:7px 10px}.js-topmenu ul#user_menu li:hover{background:#8dc63f}.js-topmenu ul#user_menu li:hover a{color:white}.js-topmenu ul#user_menu li:hover #i_haz_notifications{border-color:white;background-color:white;color:#3d4e53}.js-topmenu ul#user_menu li a{height:auto;line-height:26.25px}.js-topmenu ul#user_menu li span{margin-right:10px}.js-topmenu ul li{float:left;position:relative;z-index:50}.js-topmenu ul li a{color:#3d4e53;height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.js-topmenu ul li span#welcome{height:36px;line-height:36px;display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em;padding:0 10px;margin-right:5px;padding-right:22px;background-image:url("/static/images/menu_bar_down_arrow_textblue.png");background-repeat:no-repeat;background-position:right}.js-topmenu ul li span#welcome img{vertical-align:middle}.js-topmenu ul li img{padding:0;margin:0}.js-topmenu ul li.last{padding-left:20px}.js-topmenu ul li.last a{background:url("/static/images/bg.png") right top no-repeat}.js-topmenu ul li.last a span{-moz-border-radius:32px 0 0 32px;-webkit-border-radius:32px 0 0 32px;border-radius:32px 0 0 32px;background-color:#8dc63f;margin-right:29px;display:block;padding:0 5px 0 15px;color:white}.js-topmenu ul .unseen_count{border:solid 2px;-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;padding:3px;line-height:16px;width:16px;cursor:pointer;text-align:center}.js-topmenu ul .unseen_count#i_haz_notifications{background-color:#8dc63f;color:white;border-color:white}.js-topmenu ul .unseen_count#no_notifications_for_you{border-color:#edf3f4;background-color:#edf3f4;color:#3d4e53}#i_haz_notifications_badge{-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;font-size:13px;border:solid 2px white;margin-left:-7px;margin-top:-10px;padding:3px;background:#8dc63f;color:white;position:absolute;line-height:normal}form.login label,#login form label{display:block;line-height:18px}form.login input,#login form input{width:90%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0;height:18px;line-height:18px;margin-bottom:6px}form.login input[type=submit],#login form input[type=submit]{text-decoration:capitalize;width:auto;height:36px;line-height:36px;background:#8dc63f;-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;color:white;cursor:pointer;font-size:13px;font-weight:bold;padding:0 15px;border:0;margin:5px 0}form.login input:focus,#login form input:focus{border:solid 1px #8dc63f}form.login input[type="text"],#login form input[type="text"],form.login input[type="password"],#login form input[type="password"]{height:22.75px;line-height:22.75px;margin-bottom:13px;border-width:2px}form.login input[type="submit"],#login form input[type="submit"]{font-size:15px}form.login span.helptext,#login form span.helptext{display:block;margin-top:-11px;font-style:italic;font-size:13px}#lightbox_content .google_signup{padding:14px 0}#lightbox_content .google_signup div{height:36px;line-height:36px;float:left;padding-left:5px;font-size:15px;display:inline-block}#lightbox_content .google_signup img{float:left;height:36px;width:36px}#lightbox_content .google_signup div{height:36px;line-height:36px;float:left;padding-left:5px;font-size:15px;display:inline-block}#lightbox_content .google_signup img{float:left;height:36px;width:36px}.js-search{float:left;padding-top:25px;margin-left:81px}.js-search input{float:left}.js-search .inputbox{padding:0 0 0 15px;margin:0;border-top:solid 4px #8ac3d7;border-left:solid 4px #8ac3d7;border-bottom:solid 4px #8ac3d7;border-right:0;-moz-border-radius:50px 0 0 50px;-webkit-border-radius:50px 0 0 50px;border-radius:50px 0 0 50px;outline:0;height:28px;line-height:28px;width:156px;float:left;color:#6994a3}.js-search .button{background:url("/static/images/blue-search-button.png") no-repeat;padding:0;margin:0;width:40px;height:36px;display:block;border:0;text-indent:-10000px;cursor:pointer}.js-search-inner{float:right}#locationhash{display:none}#block-intro-text{padding-right:10px}#block-intro-text span.def{font-style:italic}a#readon{background:url("/static/images/learnmore-downarrow.png") right center no-repeat;color:#fff;text-transform:capitalize;display:block;float:right;font-size:13px;font-weight:bold}a#readon.down{background:url("/static/images/learnmore-uparrow.png") right center no-repeat}a#readon span{-moz-border-radius:32px 0 0 32px;-webkit-border-radius:32px 0 0 32px;border-radius:32px 0 0 32px;background-color:#8ac3d7;margin-right:34px;padding:0 5px 0 20px;height:36px;line-height:36px;display:block}.spread_the_word{height:24px;width:24px;position:top;margin-left:5px}#js-leftcol{float:left;width:235px;margin-bottom:20px}#js-leftcol a{font-weight:normal}#js-leftcol a:hover{text-decoration:underline}#js-leftcol .jsmod-content{border:solid 1px #edf3f4;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px}#js-leftcol ul.level1>li>a,#js-leftcol ul.level1>li>span{border-bottom:1px solid #edf3f4;border-top:1px solid #edf3f4;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:10px}#js-leftcol ul.level2 li{padding:5px 10px}#js-leftcol ul.level2 li a{color:#6994a3;font-size:15px}#js-leftcol ul.level2 li img{vertical-align:middle;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}#js-leftcol ul.level2 li .ungluer-name{height:30px;line-height:30px}#js-topsection{padding:15px 0 0 0;overflow:hidden}.js-topnews{float:left;width:100%}.js-topnews1{background:url("/static/images/header/header-m.png") 0 0 repeat-y}.js-topnews2{background:url("/static/images/header/header-t.png") 0 0 no-repeat}.js-topnews3{background:url("/static/images/header/header-b.png") 0 100% no-repeat;display:block;overflow:hidden;padding:10px}#main-container{margin:15px 0 0 0}#js-maincol-fr{float:right;width:725px}div#content-block{overflow:hidden;background:url("/static/images/bg.png") 100% -223px no-repeat;padding:0 0 0 7px;margin-bottom:20px}div#content-block.jsmodule{background:0}.content-block-heading a.block-link{float:right;padding:15px;font-size:13px;color:#3d4e53;text-decoration:underline;font-weight:normal}div#content-block-content,div#content-block-content-1{width:100%;overflow:hidden;padding-left:10px}div#content-block-content .cols3 .column,div#content-block-content-1 .cols3 .column{width:33.33%;float:left}#footer{background-color:#edf3f4;clear:both;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:15px 0 45px 0;margin-top:15px;overflow:hidden}#footer .column{float:left;width:25%;padding-top:5px}#footer .column ul{padding-top:5px;margin-left:0;padding-left:0}#footer .column li{padding:5px 0;text-transform:none;list-style:none;margin-left:0}#footer .column li a{color:#6994a3;font-size:15px}.pagination{width:100%;text-align:center;margin-top:20px;clear:both;border-top:solid #3d4e53 thin;padding-top:7px}.pagination .endless_page_link{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px}.pagination .endless_page_current{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px;background-color:#edf3f4}a.nounderline{text-decoration:none}.slides_control{height:325px!important}#about_expandable{display:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;background:white;z-index:500;top:25%;padding:9px;max-width:90%}#about_expandable .collapser_x{margin-top:-27px;margin-right:-27px}#lightbox_content p{padding:9px 0;font-size:15px;line-height:20px}#lightbox_content p a{font-size:15px;line-height:20px}#lightbox_content p b{color:#8dc63f}#lightbox_content p.last{border-bottom:solid 2px #d6dde0;margin-bottom:5px}#lightbox_content .right_border{border-right:solid 1px #d6dde0;float:left;padding:9px}#lightbox_content .signuptoday{float:right;margin-top:0;clear:none}#lightbox_content h2+form,#lightbox_content h3+form,#lightbox_content h4+form{margin-top:15px}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-bottom:10px}.nonlightbox .about_page{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;width:75%;margin:10px auto auto auto;padding:9px}.collapser_x{float:right;height:24px;line-height:24px;width:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px;-moz-box-shadow:-1px 1px #3d4e53;-webkit-box-shadow:-1px 1px #3d4e53;box-shadow:-1px 1px #3d4e53;border:solid 3px white;text-align:center;color:white;background:#3d4e53;font-size:17px;z-index:5000;margin-top:-12px;margin-right:-22px}.signuptoday{-moz-border-radius:32px;-webkit-border-radius:32px;border-radius:32px;background-color:#8dc63f;padding:0 15px;height:36px;line-height:36px;float:left;clear:both;margin:10px auto;cursor:pointer;font-style:normal}.signuptoday a{background:url("/static/images/icons/pledgearrow-hover.png") right center no-repeat;padding-right:17px;color:white}.signuptoday a:hover{text-decoration:none}.central{width:480px;margin:0 auto}li.checked{list-style-type:none;background:transparent url(/static/images/checkmark_small.png) no-repeat 0 0;margin-left:-20px;padding-left:20px}.btn_support{margin:10px;width:215px}.btn_support a,.btn_support form input,.btn_support>span{font-size:22px;border:4px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;display:block;text-align:center;padding-top:14.25px;padding-bottom:14.25px;background-color:#8dc63f;color:white!important}.btn_support a span,.btn_support form input span,.btn_support>span span{color:white!important;font-weight:bold;padding-left:0;margin-left:0!important;background:0}.btn_support.create-account span{padding:0;margin:0;background:0}.btn_support a:hover,.btn_support form input:hover{background-color:#7aae34;text-decoration:none}.btn_support a{width:207px}.btn_support form input{width:215px}.btn_support.modify a,.btn_support.modify form input{background-color:#a7c1ca}.btn_support.modify a:hover,.btn_support.modify form input:hover{background-color:#91b1bd}.buttons{display:none}.buttons .btn_support{float:left;width:auto}.buttons .btn_support a{width:auto;padding:14.25px;font-size:15px}.instructions h4{border-top:solid #d6dde0 1px;border-bottom:solid #d6dde0 1px;padding:.5em 0}.instructions p,.instructions ul{margin-left:2em;font-size:15px;line-height:22.5px} \ No newline at end of file diff --git a/static/css/sitewide4.css b/static/css/sitewide4.css deleted file mode 100644 index 2a9550f8..00000000 --- a/static/css/sitewide4.css +++ /dev/null @@ -1 +0,0 @@ -@import "font-awesome.min.css";.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}ul.social a:hover{text-decoration:none}ul.social li{padding:5px 0 5px 30px!important;height:28px;line-height:28px!important;margin:0!important;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}ul.social li.facebook{background:url("/static/images/icons/facebook.png") 10px center no-repeat;cursor:pointer}ul.social li.facebook span{padding-left:10px}ul.social li.facebook:hover{background:#8dc63f url("/static/images/icons/facebook-hover.png") 10px center no-repeat}ul.social li.facebook:hover span{color:#fff}ul.social li.twitter{background:url("/static/images/icons/twitter.png") 10px center no-repeat;cursor:pointer}ul.social li.twitter span{padding-left:10px}ul.social li.twitter:hover{background:#8dc63f url("/static/images/icons/twitter-hover.png") 10px center no-repeat}ul.social li.twitter:hover span{color:#fff}ul.social li.email{background:url("/static/images/icons/email.png") 10px center no-repeat;cursor:pointer}ul.social li.email span{padding-left:10px}ul.social li.email:hover{background:#8dc63f url("/static/images/icons/email-hover.png") 10px center no-repeat}ul.social li.email:hover span{color:#fff}ul.social li.embed{background:url("/static/images/icons/embed.png") 10px center no-repeat;cursor:pointer}ul.social li.embed span{padding-left:10px}ul.social li.embed:hover{background:#8dc63f url("/static/images/icons/embed-hover.png") 10px center no-repeat}ul.social li.embed:hover span{color:#fff}.download_container{width:75%;margin:auto}#lightbox_content a{color:#6994a3}#lightbox_content .signuptoday a{color:white}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-top:15px}#lightbox_content h2 a{font-size:18.75px}#lightbox_content .ebook_download a{margin:auto 5px auto 0;font-size:15px}#lightbox_content .ebook_download img{vertical-align:middle}#lightbox_content .logo{font-size:15px}#lightbox_content .logo img{-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;height:50px;width:50px;margin-right:5px}#lightbox_content .one_click,#lightbox_content .ebook_download_container{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;margin-left:-0.25%;padding:.5%;padding-bottom:15px;margin-bottom:5px;width:74%}#lightbox_content .one_click h3,#lightbox_content .ebook_download_container h3{margin-top:5px}#lightbox_content .one_click{border:solid 2px #8dc63f}#lightbox_content .ebook_download_container{border:solid 2px #d6dde0}#lightbox_content a.add-wishlist .on-wishlist,#lightbox_content a.success,a.success:hover{text-decoration:none;color:#3d4e53}#lightbox_content a.success,a.success:hover{cursor:default}#lightbox_content ul{padding-left:50px}#lightbox_content ul li{margin-bottom:4px}.border{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 2px #d6dde0;margin:5px auto;padding-right:5px;padding-left:5px}.sharing{float:right;padding:.5%!important;width:23%!important;min-width:105px}.sharing ul{padding:.5%!important}.sharing .jsmod-title{-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;height:auto}.sharing .jsmod-title span{padding:5%!important;color:white!important;font-style:normal}#widgetcode2{display:none;border:1px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;padding:10px}#widgetcode2 textarea{max-width:90%}.btn_support.kindle{height:40px}.btn_support.kindle a{width:auto;font-size:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#6994a3;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#496b77;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg :first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm :first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs :first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon :first-child{border:0;text-align:center;width:100%!important}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active:hover,.btn-adn.active:hover,.open>.dropdown-toggle.btn-adn:hover,.btn-adn:active:focus,.btn-adn.active:focus,.open>.dropdown-toggle.btn-adn:focus,.btn-adn:active.focus,.btn-adn.active.focus,.open>.dropdown-toggle.btn-adn.focus{color:#fff;background-color:#b94630;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn.disabled,.btn-adn[disabled],fieldset[disabled] .btn-adn,.btn-adn.disabled:hover,.btn-adn[disabled]:hover,fieldset[disabled] .btn-adn:hover,.btn-adn.disabled:focus,.btn-adn[disabled]:focus,fieldset[disabled] .btn-adn:focus,.btn-adn.disabled.focus,.btn-adn[disabled].focus,fieldset[disabled] .btn-adn.focus,.btn-adn.disabled:active,.btn-adn[disabled]:active,fieldset[disabled] .btn-adn:active,.btn-adn.disabled.active,.btn-adn[disabled].active,fieldset[disabled] .btn-adn.active{background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active:hover,.btn-bitbucket.active:hover,.open>.dropdown-toggle.btn-bitbucket:hover,.btn-bitbucket:active:focus,.btn-bitbucket.active:focus,.open>.dropdown-toggle.btn-bitbucket:focus,.btn-bitbucket:active.focus,.btn-bitbucket.active.focus,.open>.dropdown-toggle.btn-bitbucket.focus{color:#fff;background-color:#0f253c;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket.disabled,.btn-bitbucket[disabled],fieldset[disabled] .btn-bitbucket,.btn-bitbucket.disabled:hover,.btn-bitbucket[disabled]:hover,fieldset[disabled] .btn-bitbucket:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket[disabled]:focus,fieldset[disabled] .btn-bitbucket:focus,.btn-bitbucket.disabled.focus,.btn-bitbucket[disabled].focus,fieldset[disabled] .btn-bitbucket.focus,.btn-bitbucket.disabled:active,.btn-bitbucket[disabled]:active,fieldset[disabled] .btn-bitbucket:active,.btn-bitbucket.disabled.active,.btn-bitbucket[disabled].active,fieldset[disabled] .btn-bitbucket.active{background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active:hover,.btn-dropbox.active:hover,.open>.dropdown-toggle.btn-dropbox:hover,.btn-dropbox:active:focus,.btn-dropbox.active:focus,.open>.dropdown-toggle.btn-dropbox:focus,.btn-dropbox:active.focus,.btn-dropbox.active.focus,.open>.dropdown-toggle.btn-dropbox.focus{color:#fff;background-color:#0a568c;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox.disabled,.btn-dropbox[disabled],fieldset[disabled] .btn-dropbox,.btn-dropbox.disabled:hover,.btn-dropbox[disabled]:hover,fieldset[disabled] .btn-dropbox:hover,.btn-dropbox.disabled:focus,.btn-dropbox[disabled]:focus,fieldset[disabled] .btn-dropbox:focus,.btn-dropbox.disabled.focus,.btn-dropbox[disabled].focus,fieldset[disabled] .btn-dropbox.focus,.btn-dropbox.disabled:active,.btn-dropbox[disabled]:active,fieldset[disabled] .btn-dropbox:active,.btn-dropbox.disabled.active,.btn-dropbox[disabled].active,fieldset[disabled] .btn-dropbox.active{background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active:hover,.btn-facebook.active:hover,.open>.dropdown-toggle.btn-facebook:hover,.btn-facebook:active:focus,.btn-facebook.active:focus,.open>.dropdown-toggle.btn-facebook:focus,.btn-facebook:active.focus,.btn-facebook.active.focus,.open>.dropdown-toggle.btn-facebook.focus{color:#fff;background-color:#23345a;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook.disabled,.btn-facebook[disabled],fieldset[disabled] .btn-facebook,.btn-facebook.disabled:hover,.btn-facebook[disabled]:hover,fieldset[disabled] .btn-facebook:hover,.btn-facebook.disabled:focus,.btn-facebook[disabled]:focus,fieldset[disabled] .btn-facebook:focus,.btn-facebook.disabled.focus,.btn-facebook[disabled].focus,fieldset[disabled] .btn-facebook.focus,.btn-facebook.disabled:active,.btn-facebook[disabled]:active,fieldset[disabled] .btn-facebook:active,.btn-facebook.disabled.active,.btn-facebook[disabled].active,fieldset[disabled] .btn-facebook.active{background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active:hover,.btn-flickr.active:hover,.open>.dropdown-toggle.btn-flickr:hover,.btn-flickr:active:focus,.btn-flickr.active:focus,.open>.dropdown-toggle.btn-flickr:focus,.btn-flickr:active.focus,.btn-flickr.active.focus,.open>.dropdown-toggle.btn-flickr.focus{color:#fff;background-color:#a80057;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr.disabled,.btn-flickr[disabled],fieldset[disabled] .btn-flickr,.btn-flickr.disabled:hover,.btn-flickr[disabled]:hover,fieldset[disabled] .btn-flickr:hover,.btn-flickr.disabled:focus,.btn-flickr[disabled]:focus,fieldset[disabled] .btn-flickr:focus,.btn-flickr.disabled.focus,.btn-flickr[disabled].focus,fieldset[disabled] .btn-flickr.focus,.btn-flickr.disabled:active,.btn-flickr[disabled]:active,fieldset[disabled] .btn-flickr:active,.btn-flickr.disabled.active,.btn-flickr[disabled].active,fieldset[disabled] .btn-flickr.active{background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active:hover,.btn-foursquare.active:hover,.open>.dropdown-toggle.btn-foursquare:hover,.btn-foursquare:active:focus,.btn-foursquare.active:focus,.open>.dropdown-toggle.btn-foursquare:focus,.btn-foursquare:active.focus,.btn-foursquare.active.focus,.open>.dropdown-toggle.btn-foursquare.focus{color:#fff;background-color:#e30742;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare.disabled,.btn-foursquare[disabled],fieldset[disabled] .btn-foursquare,.btn-foursquare.disabled:hover,.btn-foursquare[disabled]:hover,fieldset[disabled] .btn-foursquare:hover,.btn-foursquare.disabled:focus,.btn-foursquare[disabled]:focus,fieldset[disabled] .btn-foursquare:focus,.btn-foursquare.disabled.focus,.btn-foursquare[disabled].focus,fieldset[disabled] .btn-foursquare.focus,.btn-foursquare.disabled:active,.btn-foursquare[disabled]:active,fieldset[disabled] .btn-foursquare:active,.btn-foursquare.disabled.active,.btn-foursquare[disabled].active,fieldset[disabled] .btn-foursquare.active{background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active:hover,.btn-github.active:hover,.open>.dropdown-toggle.btn-github:hover,.btn-github:active:focus,.btn-github.active:focus,.open>.dropdown-toggle.btn-github:focus,.btn-github:active.focus,.btn-github.active.focus,.open>.dropdown-toggle.btn-github.focus{color:#fff;background-color:#191919;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github.disabled,.btn-github[disabled],fieldset[disabled] .btn-github,.btn-github.disabled:hover,.btn-github[disabled]:hover,fieldset[disabled] .btn-github:hover,.btn-github.disabled:focus,.btn-github[disabled]:focus,fieldset[disabled] .btn-github:focus,.btn-github.disabled.focus,.btn-github[disabled].focus,fieldset[disabled] .btn-github.focus,.btn-github.disabled:active,.btn-github[disabled]:active,fieldset[disabled] .btn-github:active,.btn-github.disabled.active,.btn-github[disabled].active,fieldset[disabled] .btn-github.active{background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github .badge{color:#444;background-color:#fff}.btn-google-plus{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus:focus,.btn-google-plus.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.dropdown-toggle.btn-google-plus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active:hover,.btn-google-plus.active:hover,.open>.dropdown-toggle.btn-google-plus:hover,.btn-google-plus:active:focus,.btn-google-plus.active:focus,.open>.dropdown-toggle.btn-google-plus:focus,.btn-google-plus:active.focus,.btn-google-plus.active.focus,.open>.dropdown-toggle.btn-google-plus.focus{color:#fff;background-color:#a32b1c;border-color:rgba(0,0,0,0.2)}.btn-google-plus:active,.btn-google-plus.active,.open>.dropdown-toggle.btn-google-plus{background-image:none}.btn-google-plus.disabled,.btn-google-plus[disabled],fieldset[disabled] .btn-google-plus,.btn-google-plus.disabled:hover,.btn-google-plus[disabled]:hover,fieldset[disabled] .btn-google-plus:hover,.btn-google-plus.disabled:focus,.btn-google-plus[disabled]:focus,fieldset[disabled] .btn-google-plus:focus,.btn-google-plus.disabled.focus,.btn-google-plus[disabled].focus,fieldset[disabled] .btn-google-plus.focus,.btn-google-plus.disabled:active,.btn-google-plus[disabled]:active,fieldset[disabled] .btn-google-plus:active,.btn-google-plus.disabled.active,.btn-google-plus[disabled].active,fieldset[disabled] .btn-google-plus.active{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google-plus .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active:hover,.btn-instagram.active:hover,.open>.dropdown-toggle.btn-instagram:hover,.btn-instagram:active:focus,.btn-instagram.active:focus,.open>.dropdown-toggle.btn-instagram:focus,.btn-instagram:active.focus,.btn-instagram.active.focus,.open>.dropdown-toggle.btn-instagram.focus{color:#fff;background-color:#26455d;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram.disabled,.btn-instagram[disabled],fieldset[disabled] .btn-instagram,.btn-instagram.disabled:hover,.btn-instagram[disabled]:hover,fieldset[disabled] .btn-instagram:hover,.btn-instagram.disabled:focus,.btn-instagram[disabled]:focus,fieldset[disabled] .btn-instagram:focus,.btn-instagram.disabled.focus,.btn-instagram[disabled].focus,fieldset[disabled] .btn-instagram.focus,.btn-instagram.disabled:active,.btn-instagram[disabled]:active,fieldset[disabled] .btn-instagram:active,.btn-instagram.disabled.active,.btn-instagram[disabled].active,fieldset[disabled] .btn-instagram.active{background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active:hover,.btn-linkedin.active:hover,.open>.dropdown-toggle.btn-linkedin:hover,.btn-linkedin:active:focus,.btn-linkedin.active:focus,.open>.dropdown-toggle.btn-linkedin:focus,.btn-linkedin:active.focus,.btn-linkedin.active.focus,.open>.dropdown-toggle.btn-linkedin.focus{color:#fff;background-color:#00405f;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin.disabled,.btn-linkedin[disabled],fieldset[disabled] .btn-linkedin,.btn-linkedin.disabled:hover,.btn-linkedin[disabled]:hover,fieldset[disabled] .btn-linkedin:hover,.btn-linkedin.disabled:focus,.btn-linkedin[disabled]:focus,fieldset[disabled] .btn-linkedin:focus,.btn-linkedin.disabled.focus,.btn-linkedin[disabled].focus,fieldset[disabled] .btn-linkedin.focus,.btn-linkedin.disabled:active,.btn-linkedin[disabled]:active,fieldset[disabled] .btn-linkedin:active,.btn-linkedin.disabled.active,.btn-linkedin[disabled].active,fieldset[disabled] .btn-linkedin.active{background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active:hover,.btn-microsoft.active:hover,.open>.dropdown-toggle.btn-microsoft:hover,.btn-microsoft:active:focus,.btn-microsoft.active:focus,.open>.dropdown-toggle.btn-microsoft:focus,.btn-microsoft:active.focus,.btn-microsoft.active.focus,.open>.dropdown-toggle.btn-microsoft.focus{color:#fff;background-color:#0f4bac;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft.disabled,.btn-microsoft[disabled],fieldset[disabled] .btn-microsoft,.btn-microsoft.disabled:hover,.btn-microsoft[disabled]:hover,fieldset[disabled] .btn-microsoft:hover,.btn-microsoft.disabled:focus,.btn-microsoft[disabled]:focus,fieldset[disabled] .btn-microsoft:focus,.btn-microsoft.disabled.focus,.btn-microsoft[disabled].focus,fieldset[disabled] .btn-microsoft.focus,.btn-microsoft.disabled:active,.btn-microsoft[disabled]:active,fieldset[disabled] .btn-microsoft:active,.btn-microsoft.disabled.active,.btn-microsoft[disabled].active,fieldset[disabled] .btn-microsoft.active{background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active:hover,.btn-openid.active:hover,.open>.dropdown-toggle.btn-openid:hover,.btn-openid:active:focus,.btn-openid.active:focus,.open>.dropdown-toggle.btn-openid:focus,.btn-openid:active.focus,.btn-openid.active.focus,.open>.dropdown-toggle.btn-openid.focus{color:#fff;background-color:#b86607;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid.disabled,.btn-openid[disabled],fieldset[disabled] .btn-openid,.btn-openid.disabled:hover,.btn-openid[disabled]:hover,fieldset[disabled] .btn-openid:hover,.btn-openid.disabled:focus,.btn-openid[disabled]:focus,fieldset[disabled] .btn-openid:focus,.btn-openid.disabled.focus,.btn-openid[disabled].focus,fieldset[disabled] .btn-openid.focus,.btn-openid.disabled:active,.btn-openid[disabled]:active,fieldset[disabled] .btn-openid:active,.btn-openid.disabled.active,.btn-openid[disabled].active,fieldset[disabled] .btn-openid.active{background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active:hover,.btn-pinterest.active:hover,.open>.dropdown-toggle.btn-pinterest:hover,.btn-pinterest:active:focus,.btn-pinterest.active:focus,.open>.dropdown-toggle.btn-pinterest:focus,.btn-pinterest:active.focus,.btn-pinterest.active.focus,.open>.dropdown-toggle.btn-pinterest.focus{color:#fff;background-color:#801419;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest.disabled,.btn-pinterest[disabled],fieldset[disabled] .btn-pinterest,.btn-pinterest.disabled:hover,.btn-pinterest[disabled]:hover,fieldset[disabled] .btn-pinterest:hover,.btn-pinterest.disabled:focus,.btn-pinterest[disabled]:focus,fieldset[disabled] .btn-pinterest:focus,.btn-pinterest.disabled.focus,.btn-pinterest[disabled].focus,fieldset[disabled] .btn-pinterest.focus,.btn-pinterest.disabled:active,.btn-pinterest[disabled]:active,fieldset[disabled] .btn-pinterest:active,.btn-pinterest.disabled.active,.btn-pinterest[disabled].active,fieldset[disabled] .btn-pinterest.active{background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active:hover,.btn-reddit.active:hover,.open>.dropdown-toggle.btn-reddit:hover,.btn-reddit:active:focus,.btn-reddit.active:focus,.open>.dropdown-toggle.btn-reddit:focus,.btn-reddit:active.focus,.btn-reddit.active.focus,.open>.dropdown-toggle.btn-reddit.focus{color:#000;background-color:#98ccff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit.disabled,.btn-reddit[disabled],fieldset[disabled] .btn-reddit,.btn-reddit.disabled:hover,.btn-reddit[disabled]:hover,fieldset[disabled] .btn-reddit:hover,.btn-reddit.disabled:focus,.btn-reddit[disabled]:focus,fieldset[disabled] .btn-reddit:focus,.btn-reddit.disabled.focus,.btn-reddit[disabled].focus,fieldset[disabled] .btn-reddit.focus,.btn-reddit.disabled:active,.btn-reddit[disabled]:active,fieldset[disabled] .btn-reddit:active,.btn-reddit.disabled.active,.btn-reddit[disabled].active,fieldset[disabled] .btn-reddit.active{background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active:hover,.btn-soundcloud.active:hover,.open>.dropdown-toggle.btn-soundcloud:hover,.btn-soundcloud:active:focus,.btn-soundcloud.active:focus,.open>.dropdown-toggle.btn-soundcloud:focus,.btn-soundcloud:active.focus,.btn-soundcloud.active.focus,.open>.dropdown-toggle.btn-soundcloud.focus{color:#fff;background-color:#a83800;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud.disabled,.btn-soundcloud[disabled],fieldset[disabled] .btn-soundcloud,.btn-soundcloud.disabled:hover,.btn-soundcloud[disabled]:hover,fieldset[disabled] .btn-soundcloud:hover,.btn-soundcloud.disabled:focus,.btn-soundcloud[disabled]:focus,fieldset[disabled] .btn-soundcloud:focus,.btn-soundcloud.disabled.focus,.btn-soundcloud[disabled].focus,fieldset[disabled] .btn-soundcloud.focus,.btn-soundcloud.disabled:active,.btn-soundcloud[disabled]:active,fieldset[disabled] .btn-soundcloud:active,.btn-soundcloud.disabled.active,.btn-soundcloud[disabled].active,fieldset[disabled] .btn-soundcloud.active{background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active:hover,.btn-tumblr.active:hover,.open>.dropdown-toggle.btn-tumblr:hover,.btn-tumblr:active:focus,.btn-tumblr.active:focus,.open>.dropdown-toggle.btn-tumblr:focus,.btn-tumblr:active.focus,.btn-tumblr.active.focus,.open>.dropdown-toggle.btn-tumblr.focus{color:#fff;background-color:#111c26;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr.disabled,.btn-tumblr[disabled],fieldset[disabled] .btn-tumblr,.btn-tumblr.disabled:hover,.btn-tumblr[disabled]:hover,fieldset[disabled] .btn-tumblr:hover,.btn-tumblr.disabled:focus,.btn-tumblr[disabled]:focus,fieldset[disabled] .btn-tumblr:focus,.btn-tumblr.disabled.focus,.btn-tumblr[disabled].focus,fieldset[disabled] .btn-tumblr.focus,.btn-tumblr.disabled:active,.btn-tumblr[disabled]:active,fieldset[disabled] .btn-tumblr:active,.btn-tumblr.disabled.active,.btn-tumblr[disabled].active,fieldset[disabled] .btn-tumblr.active{background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active:hover,.btn-twitter.active:hover,.open>.dropdown-toggle.btn-twitter:hover,.btn-twitter:active:focus,.btn-twitter.active:focus,.open>.dropdown-toggle.btn-twitter:focus,.btn-twitter:active.focus,.btn-twitter.active.focus,.open>.dropdown-toggle.btn-twitter.focus{color:#fff;background-color:#1583d7;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter.disabled,.btn-twitter[disabled],fieldset[disabled] .btn-twitter,.btn-twitter.disabled:hover,.btn-twitter[disabled]:hover,fieldset[disabled] .btn-twitter:hover,.btn-twitter.disabled:focus,.btn-twitter[disabled]:focus,fieldset[disabled] .btn-twitter:focus,.btn-twitter.disabled.focus,.btn-twitter[disabled].focus,fieldset[disabled] .btn-twitter.focus,.btn-twitter.disabled:active,.btn-twitter[disabled]:active,fieldset[disabled] .btn-twitter:active,.btn-twitter.disabled.active,.btn-twitter[disabled].active,fieldset[disabled] .btn-twitter.active{background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active:hover,.btn-vimeo.active:hover,.open>.dropdown-toggle.btn-vimeo:hover,.btn-vimeo:active:focus,.btn-vimeo.active:focus,.open>.dropdown-toggle.btn-vimeo:focus,.btn-vimeo:active.focus,.btn-vimeo.active.focus,.open>.dropdown-toggle.btn-vimeo.focus{color:#fff;background-color:#0f7b9f;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo.disabled,.btn-vimeo[disabled],fieldset[disabled] .btn-vimeo,.btn-vimeo.disabled:hover,.btn-vimeo[disabled]:hover,fieldset[disabled] .btn-vimeo:hover,.btn-vimeo.disabled:focus,.btn-vimeo[disabled]:focus,fieldset[disabled] .btn-vimeo:focus,.btn-vimeo.disabled.focus,.btn-vimeo[disabled].focus,fieldset[disabled] .btn-vimeo.focus,.btn-vimeo.disabled:active,.btn-vimeo[disabled]:active,fieldset[disabled] .btn-vimeo:active,.btn-vimeo.disabled.active,.btn-vimeo[disabled].active,fieldset[disabled] .btn-vimeo.active{background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active:hover,.btn-vk.active:hover,.open>.dropdown-toggle.btn-vk:hover,.btn-vk:active:focus,.btn-vk.active:focus,.open>.dropdown-toggle.btn-vk:focus,.btn-vk:active.focus,.btn-vk.active.focus,.open>.dropdown-toggle.btn-vk.focus{color:#fff;background-color:#3a526b;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk.disabled,.btn-vk[disabled],fieldset[disabled] .btn-vk,.btn-vk.disabled:hover,.btn-vk[disabled]:hover,fieldset[disabled] .btn-vk:hover,.btn-vk.disabled:focus,.btn-vk[disabled]:focus,fieldset[disabled] .btn-vk:focus,.btn-vk.disabled.focus,.btn-vk[disabled].focus,fieldset[disabled] .btn-vk.focus,.btn-vk.disabled:active,.btn-vk[disabled]:active,fieldset[disabled] .btn-vk:active,.btn-vk.disabled.active,.btn-vk[disabled].active,fieldset[disabled] .btn-vk.active{background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active:hover,.btn-yahoo.active:hover,.open>.dropdown-toggle.btn-yahoo:hover,.btn-yahoo:active:focus,.btn-yahoo.active:focus,.open>.dropdown-toggle.btn-yahoo:focus,.btn-yahoo:active.focus,.btn-yahoo.active.focus,.open>.dropdown-toggle.btn-yahoo.focus{color:#fff;background-color:#39074e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo.disabled,.btn-yahoo[disabled],fieldset[disabled] .btn-yahoo,.btn-yahoo.disabled:hover,.btn-yahoo[disabled]:hover,fieldset[disabled] .btn-yahoo:hover,.btn-yahoo.disabled:focus,.btn-yahoo[disabled]:focus,fieldset[disabled] .btn-yahoo:focus,.btn-yahoo.disabled.focus,.btn-yahoo[disabled].focus,fieldset[disabled] .btn-yahoo.focus,.btn-yahoo.disabled:active,.btn-yahoo[disabled]:active,fieldset[disabled] .btn-yahoo:active,.btn-yahoo.disabled.active,.btn-yahoo[disabled].active,fieldset[disabled] .btn-yahoo.active{background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.preview{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%}.preview a{color:#8dc63f}.launch_top{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;border-color:#8dc63f;margin:10px auto 0 auto;font-size:15px;line-height:22.5px}.launch_top a{color:#8dc63f}.launch_top.pale{border-color:#d6dde0;font-size:13px}.launch_top.alert{border-color:#e35351;font-size:13px}.preview_content{border:solid 3px #e35351;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;clear:both;padding:5px 10px;font-size:13px;width:90%;width:80%;margin:10px auto}.preview_content a{color:#8dc63f}.utilityheaders{text-transform:uppercase;color:#3d4e53;font-size:15px;display:block}html,body{height:100%}body{background:url("/static/images/bg-body.png") 0 0 repeat-x;padding:0 0 20px 0;margin:0;font-size:13px;line-height:16.900000000000002px;font-family:"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Arial,Helvetica,sans-serif;color:#3d4e53}#feedback{position:fixed;bottom:10%;right:0;z-index:500}#feedback p{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);white-space:nowrap;display:block;bottom:0;width:160px;height:32px;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;background:#8dc63f;margin-bottom:0;text-align:center;margin-right:-67px;line-height:normal}#feedback p a{color:white;font-size:24px;font-weight:normal}#feedback p a:hover{color:#3d4e53}a{font-weight:bold;font-size:inherit;text-decoration:none;cursor:pointer;color:#6994a3}a:hover{text-decoration:underline}h1{font-size:22.5px}h2{font-size:18.75px}h3{font-size:17.549999999999997px}h4{font-size:15px}img{border:0}img.user-avatar{float:left;margin-right:10px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px}input,textarea,a.fakeinput{border:2px solid #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}input:focus,textarea:focus,a.fakeinput:focus{border:2px solid #8dc63f;outline:0}a.fakeinput:hover{text-decoration:none}.js-search input{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}h2.content-heading{padding:15px;margin:0;font-size:19px;font-weight:normal;color:#3d4e53;float:left;width:50%}h2.content-heading span{font-style:italic}h3.jsmod-title{-moz-border-radius:8px 8px 0 0;-webkit-border-radius:8px 8px 0 0;border-radius:8px 8px 0 0;background:#edf3f4;padding:0;margin:0;height:2.3em}h3.jsmod-title span{font-size:19px;font-style:italic;color:#3d4e53;padding:.7em 2em .5em 2em;display:block}input[type="submit"],a.fakeinput{background:#8dc63f;color:white;font-weight:bold;padding:.5em 1em;cursor:pointer}.loader-gif[disabled="disabled"],.loader-gif.show-loading{background:url('/static/images/loading.gif') center no-repeat!important}.js-page-wrap{position:relative;min-height:100%}.js-main{width:960px;margin:0 auto;clear:both;padding:0}.bigger{font-size:15px}ul.menu{list-style:none;padding:0;margin:0}.errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errorlist li{list-style:none;border:0}.errorlist li{list-style:none;border:0}.errorlist li{list-style:none;border:0}.errorlist+input{border:2px solid #e35351!important}.errorlist+input:focus{border:1px solid #8dc63f!important}.errorlist+textarea{border:2px solid #e35351!important}.errorlist+textarea:focus{border:2px solid #8dc63f!important}.p_form .errorlist{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:0;color:#e35351;clear:none;width:100%;height:auto;line-height:16px;padding:0;font-weight:normal;text-align:left;display:inline}.p_form .errorlist li{display:inline}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}#js-header{height:90px}.js-logo{float:left;padding-top:10px}.js-logo a img{border:0}.js-topmenu{float:right;margin-top:25px;font-size:15px}.js-topmenu#authenticated{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:36px}.js-topmenu#authenticated:hover,.js-topmenu#authenticated.highlight{background:#d6dde0;cursor:pointer;position:relative}.js-topmenu ul#user_menu{white-space:nowrap;display:none;z-index:100;position:absolute;top:36px;left:0;padding:0;overflow:visible;margin:0}.js-topmenu ul#user_menu li{border-top:1px solid white;list-style-type:none;float:none;background:#d6dde0;padding:7px 10px}.js-topmenu ul#user_menu li:hover{background:#8dc63f}.js-topmenu ul#user_menu li:hover a{color:white}.js-topmenu ul#user_menu li:hover #i_haz_notifications{border-color:white;background-color:white;color:#3d4e53}.js-topmenu ul#user_menu li a{height:auto;line-height:26.25px}.js-topmenu ul#user_menu li span{margin-right:10px}.js-topmenu ul li{float:left;position:relative;z-index:50}.js-topmenu ul li .notbutton{color:#3d4e53;line-height:36px}.js-topmenu ul li a{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.js-topmenu ul li span#welcome{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em;padding:0 10px}.js-topmenu ul li img{padding:0;margin:0}.js-topmenu ul li.last{padding-left:20px}.js-topmenu ul li.last a span{-moz-border-radius:32px 0 0 32px;-webkit-border-radius:32px 0 0 32px;border-radius:32px 0 0 32px;background-color:#8dc63f;margin-right:29px;display:block;padding:0 5px 0 15px;color:white}.js-topmenu ul .unseen_count{border:solid 2px;-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;padding:3px;line-height:16px;width:16px;cursor:pointer;text-align:center}.js-topmenu ul .unseen_count#i_haz_notifications{background-color:#8dc63f;color:white;border-color:white}.js-topmenu ul .unseen_count#no_notifications_for_you{border-color:#edf3f4;background-color:#edf3f4;color:#3d4e53}.btn-signup{color:#fff;background-color:#8dc63f;border-color:#ccc}.btn-signup:focus,.btn-signup.focus{color:#fff;background-color:#72a230;border-color:#8c8c8c}.btn-signup:hover{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active,.btn-signup.active,.open>.dropdown-toggle.btn-signup{color:#fff;background-color:#72a230;border-color:#adadad}.btn-signup:active:hover,.btn-signup.active:hover,.open>.dropdown-toggle.btn-signup:hover,.btn-signup:active:focus,.btn-signup.active:focus,.open>.dropdown-toggle.btn-signup:focus,.btn-signup:active.focus,.btn-signup.active.focus,.open>.dropdown-toggle.btn-signup.focus{color:#fff;background-color:#5e8628;border-color:#8c8c8c}.btn-signup:active,.btn-signup.active,.open>.dropdown-toggle.btn-signup{background-image:none}.btn-signup.disabled,.btn-signup[disabled],fieldset[disabled] .btn-signup,.btn-signup.disabled:hover,.btn-signup[disabled]:hover,fieldset[disabled] .btn-signup:hover,.btn-signup.disabled:focus,.btn-signup[disabled]:focus,fieldset[disabled] .btn-signup:focus,.btn-signup.disabled.focus,.btn-signup[disabled].focus,fieldset[disabled] .btn-signup.focus,.btn-signup.disabled:active,.btn-signup[disabled]:active,fieldset[disabled] .btn-signup:active,.btn-signup.disabled.active,.btn-signup[disabled].active,fieldset[disabled] .btn-signup.active{background-color:#8dc63f;border-color:#ccc}.btn-signup .badge{color:#8dc63f;background-color:#fff}.btn-readon{color:#fff;background-color:#8ac3d7;border-color:#ccc}.btn-readon:focus,.btn-readon.focus{color:#fff;background-color:#64b0ca;border-color:#8c8c8c}.btn-readon:hover{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active,.btn-readon.active,.open>.dropdown-toggle.btn-readon{color:#fff;background-color:#64b0ca;border-color:#adadad}.btn-readon:active:hover,.btn-readon.active:hover,.open>.dropdown-toggle.btn-readon:hover,.btn-readon:active:focus,.btn-readon.active:focus,.open>.dropdown-toggle.btn-readon:focus,.btn-readon:active.focus,.btn-readon.active.focus,.open>.dropdown-toggle.btn-readon.focus{color:#fff;background-color:#49a2c1;border-color:#8c8c8c}.btn-readon:active,.btn-readon.active,.open>.dropdown-toggle.btn-readon{background-image:none}.btn-readon.disabled,.btn-readon[disabled],fieldset[disabled] .btn-readon,.btn-readon.disabled:hover,.btn-readon[disabled]:hover,fieldset[disabled] .btn-readon:hover,.btn-readon.disabled:focus,.btn-readon[disabled]:focus,fieldset[disabled] .btn-readon:focus,.btn-readon.disabled.focus,.btn-readon[disabled].focus,fieldset[disabled] .btn-readon.focus,.btn-readon.disabled:active,.btn-readon[disabled]:active,fieldset[disabled] .btn-readon:active,.btn-readon.disabled.active,.btn-readon[disabled].active,fieldset[disabled] .btn-readon.active{background-color:#8ac3d7;border-color:#ccc}.btn-readon .badge{color:#8ac3d7;background-color:#fff}#i_haz_notifications_badge{-moz-border-radius:700px;-webkit-border-radius:700px;border-radius:700px;font-size:13px;border:solid 2px white;margin-left:-7px;margin-top:-10px;padding:3px;background:#8dc63f;color:white;position:absolute;line-height:normal}form.login label,#login form label{display:block;line-height:20px;font-size:15px}form.login input,#login form input{width:90%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #d6dde0;height:18px;line-height:18px;margin-bottom:6px}form.login input[type=submit],#login form input[type=submit]{text-decoration:capitalize;width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}form.login input:focus,#login form input:focus{border:solid 1px #8dc63f}form.login input[type="text"],#login form input[type="text"],form.login input[type="password"],#login form input[type="password"]{height:22.75px;line-height:22.75px;margin-bottom:13px;border-width:2px}form.login input[type="submit"],#login form input[type="submit"]{font-size:15px}form.login span.helptext,#login form span.helptext{display:block;margin-top:-11px;font-style:italic;font-size:13px}#lightbox_content a.btn{color:#FFF}.js-search{float:left;padding-top:25px;margin-left:81px}.js-search input{float:left}.js-search .inputbox{padding:0 0 0 15px;margin:0;border-top:solid 4px #8ac3d7;border-left:solid 4px #8ac3d7;border-bottom:solid 4px #8ac3d7;border-right:0;-moz-border-radius:50px 0 0 50px;-webkit-border-radius:50px 0 0 50px;border-radius:50px 0 0 50px;outline:0;height:28px;line-height:28px;width:156px;float:left;color:#6994a3}.js-search .button{background:url("/static/images/blue-search-button.png") no-repeat;padding:0;margin:0;width:40px;height:36px;display:block;border:0;text-indent:-10000px;cursor:pointer}.js-search-inner{float:right}#locationhash{display:none}#block-intro-text{padding-right:10px}#block-intro-text span.def{font-style:italic}a#readon{color:#fff;text-transform:capitalize;display:block;float:right;font-size:13px;font-weight:bold}.spread_the_word{height:24px;width:24px;position:top;margin-left:5px}#js-leftcol{float:left;width:235px;margin-bottom:20px}#js-leftcol a{font-weight:normal}#js-leftcol a:hover{text-decoration:underline}#js-leftcol .jsmod-content{border:solid 1px #edf3f4;-moz-border-radius:0 0 10px 10px;-webkit-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px}#js-leftcol ul.level1>li>a,#js-leftcol ul.level1>li>span{border-bottom:1px solid #edf3f4;border-top:1px solid #edf3f4;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:10px}#js-leftcol ul.level2 li{padding:5px 20px}#js-leftcol ul.level2 li a{color:#6994a3;font-size:15px}#js-leftcol ul.level2 li img{vertical-align:middle;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}#js-leftcol ul.level2 li .ungluer-name{height:30px;line-height:30px}#js-leftcol ul.level2 li.first{font-size:15px;color:#3d4e53;padding-left:10px}#js-leftcol ul.level3 li{padding:0 20px}#js-leftcol ul.level3 li a{color:#6994a3;font-size:15px}#js-topsection{padding:15px 0 0 0;overflow:hidden}.js-topnews{float:left;width:100%}.js-topnews1{background:url("/static/images/header/header-m.png") 0 0 repeat-y}.js-topnews2{background:url("/static/images/header/header-t.png") 0 0 no-repeat}.js-topnews3{background:url("/static/images/header/header-b.png") 0 100% no-repeat;display:block;overflow:hidden;padding:10px}#main-container{margin:15px 0 0 0}#js-maincol-fr{float:right;width:725px}div#content-block{overflow:hidden;background:url("/static/images/bg.png") 100% -223px no-repeat;padding:0 0 0 7px;margin-bottom:20px}div#content-block.jsmodule{background:0}.content-block-heading a.block-link{float:right;padding:15px;font-size:13px;color:#3d4e53;text-decoration:underline;font-weight:normal}div#content-block-content,div#content-block-content-1{width:100%;overflow:hidden;padding-left:10px}div#content-block-content .cols3 .column,div#content-block-content-1 .cols3 .column{width:33.33%;float:left}#footer{background-color:#edf3f4;clear:both;text-transform:uppercase;color:#3d4e53;font-size:15px;display:block;padding:15px 0 45px 0;margin-top:15px;overflow:hidden}#footer .column{float:left;width:25%;padding-top:5px}#footer .column ul{padding-top:5px;margin-left:0;padding-left:0}#footer .column li{padding:5px 0;text-transform:none;list-style:none;margin-left:0}#footer .column li a{color:#6994a3;font-size:15px}.pagination{width:100%;text-align:center;margin-top:20px;clear:both;border-top:solid #3d4e53 thin;padding-top:7px}.pagination .endless_page_link{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px}.pagination .endless_page_current{font-size:13px;border:thin #3d4e53 solid;font-weight:normal;margin:5px;padding:1px;background-color:#edf3f4}a.nounderline{text-decoration:none}.slides_control{height:325px!important}#about_expandable{display:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;background:white;z-index:500;top:25%;padding:9px;max-width:90%}#about_expandable .collapser_x{margin-top:-27px;margin-right:-27px}#lightbox_content p,#lightbox_content li{padding:9px 0;font-size:15px;line-height:20px}#lightbox_content p a,#lightbox_content li a{font-size:15px;line-height:20px}#lightbox_content p b,#lightbox_content li b{color:#8dc63f}#lightbox_content p.last,#lightbox_content li.last{border-bottom:solid 2px #d6dde0;margin-bottom:5px}#lightbox_content .right_border{border-right:solid 1px #d6dde0;float:left;padding:9px}#lightbox_content .signuptoday{float:right;margin-top:0;clear:none}#lightbox_content h2+form,#lightbox_content h3+form,#lightbox_content h4+form{margin-top:15px}#lightbox_content h2,#lightbox_content h3,#lightbox_content h4{margin-bottom:10px}.nonlightbox .about_page{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:solid 5px #d6dde0;width:75%;margin:10px auto auto auto;padding:9px}.collapser_x{float:right;height:24px;line-height:24px;width:24px;-moz-border-radius:24px;-webkit-border-radius:24px;border-radius:24px;-moz-box-shadow:-1px 1px #3d4e53;-webkit-box-shadow:-1px 1px #3d4e53;box-shadow:-1px 1px #3d4e53;border:solid 3px white;text-align:center;color:white;background:#3d4e53;font-size:17px;z-index:5000;margin-top:-12px;margin-right:-22px}.signuptoday{padding:0 15px;height:36px;line-height:36px;float:left;clear:both;margin:10px auto;cursor:pointer;font-style:normal}.signuptoday a{padding-right:17px;color:white}.signuptoday a:hover{text-decoration:none}.central{width:480px;margin:0 auto}li.checked{list-style-type:decimal;background:transparent url(/static/images/checkmark_small.png) no-repeat 0 0;margin-left:0;padding-left:20px}.btn_support{margin:10px;width:215px}.btn_support a,.btn_support form input,.btn_support>span{font-size:22px;border:4px solid #d6dde0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;display:block;text-align:center;padding-top:14.25px;padding-bottom:14.25px;background-color:#8dc63f;color:white!important}.btn_support a span,.btn_support form input span,.btn_support>span span{color:white!important;font-weight:bold;padding-left:0;margin-left:0!important;background:0}.btn_support.create-account span{padding:0;margin:0;background:0}.btn_support a:hover,.btn_support form input:hover{background-color:#7aae34;text-decoration:none}.btn_support a{width:207px}.btn_support form input{width:215px}.btn_support.modify a,.btn_support.modify form input{background-color:#a7c1ca}.btn_support.modify a:hover,.btn_support.modify form input:hover{background-color:#91b1bd}.instructions h4{border-top:solid #d6dde0 1px;border-bottom:solid #d6dde0 1px;padding:.5em 0}.instructions>div{padding-left:1%;padding-right:1%;font-size:15px;line-height:22.5px;width:98%}.instructions>div.active{float:left}.one_click{float:left}.one_click>div{float:left}.one_click>div #kindle a,.one_click>div .kindle a,.one_click>div #marvin a,.one_click>div .marvin a,.one_click>div #mac_ibooks a,.one_click>div .mac_ibooks a{font-size:15px;padding:9px 0}.one_click>div div{margin:0 10px 0 0}.ebook_download_container{clear:left}.other_instructions_paragraph{display:none}#iOS_app_div,#ios_div{display:none}.yes_js{display:none}.std_form,.std_form input,.std_form select{line-height:30px;font-size:15px}.contrib_amount{padding:10px;font-size:19px;text-align:center}#id_preapproval_amount{width:50%;line-height:30px;font-size:15px}#askblock{float:right;min-width:260px;background:#edf3f4;padding:10px;width:30%}.rh_ask{font-size:15px;width:65%}#contribsubmit{text-align:center;font-size:19px;margin:0 0 10px;cursor:pointer}#anoncontribbox{padding-bottom:10px}.faq_tldr{font-style:italic;font-size:19px;text-align:center;line-height:24.7px;color:#6994a3;margin-left:2em}.deletebutton,input[type='submit'].deletebutton{height:20px;padding:.2em .6em;background-color:lightgray;margin-left:1em;color:white;font-weight:bold;cursor:pointer} \ No newline at end of file diff --git a/static/css/supporter_layout.css b/static/css/supporter_layout.css deleted file mode 100644 index abc7e441..00000000 --- a/static/css/supporter_layout.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0}.block-inner{padding-right:10px}.user-block{width:100%;clear:both}.user-block-hide{float:left;width:100%;clear:both;padding-top:10px}.user-block-hide .block{float:left}.user-block-hide .block1,.user-block-hide .block3{width:25%}.user-block-hide .block2{width:50%}.user-block-hide .block2 div{float:left;max-width:340px}.user-block-hide .block2 input{margin-left:5px}.user-block-hide input{float:left;margin:3px 10px 0 0;width:45%}.user-block-hide input[type=checkbox]{float:none;width:auto}.user-block-hide input#librarything_input,.user-block-hide input#goodreads_input{width:auto;background:#edf3f4;color:#3d4e53;cursor:pointer}.user-block-hide input.profile-save{width:116px;cursor:pointer}.user-block-hide label{float:left;width:90%}.user-block-hide textarea{width:95%}.user-block-hide select{margin-bottom:5px}#user-block1{float:left;width:25%;position:relative}.user-block2{color:#6994a3;font-size:13px;line-height:normal;float:left;width:25%}.user-block23{color:#6994a3;font-size:15px;line-height:normal;float:left;width:50%}.user-block24{color:#6994a3;font-size:15px;line-height:normal;float:left;width:75%}.user-block3,.user-block4{float:left;width:25%}.user-block3.recommended,.user-block4.recommended{margin-top:auto}.user-block3.recommended img,.user-block4.recommended img{margin-right:7px}.user-block3{margin-top:8px}.user-block3 .ungluingtext{height:29px;line-height:29px;float:left;color:#3d4e53;padding-right:5px}.user-block4{margin-top:7px}.user-badges{position:absolute;bottom:0;left:60px}.user-badges img{vertical-align:text-bottom;border:1px solid #d4d4d4;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.social{width:100%}#edit_profile{float:right;margin-top:-12px;margin-right:-5px;border:2px solid white;padding:3px 2px 2px 3px}#edit_profile:hover{border:2px solid #8dc63f;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}span.special-user-name{display:block;font-size:19px;color:#3d4e53;margin-left:10px;font-weight:bold;height:50px;line-height:24px}span.user-name,span.user-short-info{display:block}.user-block2 .user-short-info{padding-right:10px}span.user-name,span.user-name a{font-size:13px;color:#3d4e53}span.user-status-title{float:left;margin-right:8px;padding-top:5px}span.rounded{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}span.rounded>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}span.rounded>span .hovertext{display:none}span.rounded>span:hover .hovertext{display:inline}span.blue{background:#a7d26a url("/static/images/header-button-blue.png") left bottom repeat-x}span.orange{background:#eabc7c url("/static/images/header-button-orange.png") left bottom repeat-x}span.grey{background:#bacfd6 url("/static/images/header-button-grey.png") left bottom repeat-x}div.check-list{float:left;padding-bottom:7px;clear:both}a.profile-edit{display:block}div.profile-save{padding-top:15px;border:0}input.profile-save{background:url("/static/images/header/save-setting.png") 0 0 no-repeat;width:116px;height:42px;display:block;text-indent:-100000px;border:0;cursor:pointer}#loadgr{background:url("/static/images/supporter_icons/goodreads_square.png") left center no-repeat;min-height:33px;margin:12px auto}#loadgr span{display:inline-block;vertical-align:middle}#loadgr div,#loadgr input{margin:auto 10px auto 36px}#loadgr #goodreads_shelves{margin:auto 10px auto 36px;display:block}#loadlt{background:url("/static/images/supporter_icons/librarything_square.png") left center no-repeat;min-height:32px;padding-top:4px}#loadlt div,#loadlt input{margin:auto 10px auto 36px}.weareonthat{background:url("/static/images/checkmark_small.png") left center no-repeat}span.my-setting{height:40px;line-height:40px;display:block;padding:0 0 10px 10px;font-size:19px;font-weight:bold;cursor:pointer}span.my-setting.active{background:#d6dde0 url("/static/images/header/collspane.png") 90% center no-repeat}#tabs{clear:both;float:left;margin-left:10px;margin-top:10px;width:100%;border-bottom:4px solid #d6dde0}#tabs ul.tabs li a:hover{text-decoration:none}#tabs.wantto ul.tabs li.tabs3.active a{background:#d6dde0;color:#3d4e53}#tabs.ungluing ul.tabs li.tabs2.active a{background:#eabc7c;color:#fff}#tabs.unglued ul.tabs li.tabs1.active a{background:#8dc63f;color:#fff}#tabs ul.book-list-view{margin-bottom:0!important}#tabs-1,#tabs-2,#tabs-3{margin-left:10px}ul.tabs{float:left;padding:0;margin:0;list-style:none}ul.tabs li{float:left;height:46px;line-height:46px;margin-right:2px}ul.tabs li.tabs1,ul.tabs li.tabs2,ul.tabs li.tabs3{width:112px}ul.tabs li a{height:46px;line-height:46px;display:block;text-align:center;padding:0 10px;min-width:80px;-moz-border-radius:7px 7px 0 0;-webkit-border-radius:7px 7px 0 0;border-radius:7px 7px 0 0;background:#6994a3;color:#fff}ul.tabs li.tabs1 a:hover,ul.tabs li.tabs1.active a{background:#8dc63f;color:#fff}ul.tabs li.tabs2 a:hover,ul.tabs li.tabs2.active a{background:#eabc7c;color:#fff}ul.tabs li.tabs3 a:hover,ul.tabs li.tabs3.active a{background:#d6dde0;color:#3d4e53}#rss{height:46px}#rss img{padding:16px 0 0 14px}#rss span{margin-left:3px;font-size:13px}.listview .rounded{line-height:normal;margin-right:0}div#content-block-content{padding-left:10px}.empty-wishlist{margin-top:10px}.js-news-text{float:left;width:70%;font-size:15px;color:#3d4e53;font-family:lucida grande}.js-news-links{float:right;width:30%}.column-left .item{margin:0 10px 10px 0}.column-center .item{margin:0 5px 10px 5px}.column-right .item{margin:0 0 10px 10px}.column .item{border:7px solid #edf3f4;padding:10px}.book-image{padding:0 0 10px 0}.book-info{padding:0 0 10px 0;line-height:125%;position:relative}.book-info span.book-new{background:url(/static/images/images/icon-new.png) 0 0 no-repeat;width:38px;height:36px;display:block;position:absolute;right:10px;top:0}.book-name{color:#3d4e53}.book-author{color:#6994a3}.book-status{margin:0 -10px;border-top:1px solid #edf3f4;padding:15px 10px 0 10px;position:relative}.book-status span.unglue{font-style:italic}.book-status span.status{position:absolute;right:10px;bottom:-5px;width:37px;height:25px;display:block}#js-slide .jsmodule{width:660px!important}#js-maincontainer-bot-block{padding-left:16px}.anon_about{height:43px;line-height:43px;font-size:15px;padding-left:37px;border:solid 3px #d6dde0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;width:665px;margin:7px 0}.anon_about a{font-size:15px;color:#8dc63f} \ No newline at end of file diff --git a/static/css/variables.css b/static/css/variables.css deleted file mode 100644 index 8f9dce94..00000000 --- a/static/css/variables.css +++ /dev/null @@ -1 +0,0 @@ -.header-text{display:block;text-decoration:none;font-weight:bold;letter-spacing:-0.05em}.panelborders{border-width:1px 0;border-style:solid none;border-color:#fff}.roundedspan{border:1px solid #d4d4d4;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px;padding:1px;color:#fff;margin:0 8px 0 0;display:inline-block}.roundedspan>span{padding:7px 7px;min-width:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;text-align:center;display:inline-block}.roundedspan>span .hovertext{display:none}.roundedspan>span:hover .hovertext{display:inline}.mediaborder{padding:5px;border:solid 5px #edf3f4}.actionbuttons{width:auto;height:36px;line-height:36px;background:#8dc63f;border:1px solid transparent;color:white;cursor:pointer;font-size:13px;font-weight:normal;padding:0 15px;margin:5px 0}.errors{-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;border:solid #e35351 3px;clear:both;width:90%;height:auto;line-height:16px;padding:7px 0;font-weight:bold;font-size:13px;text-align:center}.errors li{list-style:none;border:0} \ No newline at end of file diff --git a/static/less/README.md b/static/less/README.md deleted file mode 100644 index a05675e6..00000000 --- a/static/less/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Less practices -============== - -Version -------- -2.7.1 - -This is the latest version of Less and will not change. Updates are in CodeKit. We should consider moving to it. - -Config -______ -Minify all CSS. \ No newline at end of file diff --git a/static/less/book_detail.less b/static/less/book_detail.less deleted file mode 100644 index e28f9d12..00000000 --- a/static/less/book_detail.less +++ /dev/null @@ -1,194 +0,0 @@ -@import "variables.less"; - -/* needed for campaign, pledge, and manage_campaign */ - -.book-detail { - float:left; - width:100%; - clear:both; - display:block; -} - -.book-cover { - float: left; - margin-right:10px; - width:151px; - - img { - .mediaborder; - } -} - -.book-detail-info { - float:left; - /* if we want to nix the explore bar, width should be 544ish */ - width:309px; - - h2.book-name, h3.book-author, h3.book-year { - padding:0; - margin:0; - line-height:normal - } - - h2.book-name { - font-size: @font-size-header; - font-weight:bold; - color:@text-blue; - } - - h3.book-author, h3.book-year { - font-size: @font-size-default; - font-weight:normal; - color:@text-blue; - } - - h3.book-author span a, h3.book-year span a{ - font-size: @font-size-default; - font-weight:normal; - color:@link-color; - } - - > div { - width:100%; - clear:both; - display:block; - overflow:hidden; - border-top:1px solid @pale-blue; - padding:10px 0; - } - - > div.layout { - border: none; - padding: 0; - - div.pubinfo { - float: left; - width: auto; - padding-bottom: 7px; - } - } - - .btn_wishlist span { - text-align: right; - } - - .find-book label { - float:left; - line-height:31px; - } - - .find-link { - float:right; - - img { - padding: 2px; - .one-border-radius(5px); - } - } - - .pledged-info { - padding:10px 0; - position: relative; - - &.noborder { - border-top: none; - padding-top: 0; - } - - .campaign-status-info { - float: left; - width: 50%; - margin-top: @font-size-default; - - span { - font-size: @font-size-larger; - color: @medium-blue; - font-weight: bold; - } - } - } - - .thermometer { - .one-border-radius(10px); - border: solid 2px @blue-grey; - width: 291px; - padding: 7px; - position: relative; - overflow: visible; - - /* looks better if we start the gradient a little closer to the success color */ - @greener-than-alert: #CF6944; - - background: -webkit-gradient(linear, left top, right top, from(@call-to-action), to(@greener-than-alert)); - background: -webkit-linear-gradient(left, @greener-than-alert, @call-to-action); - background: -moz-linear-gradient(left, @greener-than-alert, @call-to-action); - background: -ms-linear-gradient(left, @greener-than-alert, @call-to-action); - background: -o-linear-gradient(left, @greener-than-alert, @call-to-action); - background: linear-gradient(left, @greener-than-alert, @call-to-action); - - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert', endColorstr='@call-to-action'); /* IE6 & IE7 */ - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='@alert', endColorstr='@call-to-action')"; /* IE8+ */ - - &.successful { - border-color: @bright-blue; - background: @pale-blue; - } - - .cover { - position: absolute; - right: 0; - .border-radius(0, 10px, 10px, 0); - width: 50px; - height: 14px; - margin-top: -7px; - background: lighten(@blue-grey, 10%); - } - - span { - display: none; - } - - &:hover span { - display: block; - position: absolute; - z-index: 200; - right: 0; - top:-7px; - font-size: @font-size-header; - color: @medium-blue; - background: white; - border: 2px solid @blue-grey; - .one-border-radius(10px); - padding: 5px; - } - } - .explainer{ - span.explanation{ - display: none; - } - - &:hover span.explanation { - display: block; - position: absolute; - z-index: 200; - right: 0; - top:12px; - font-size: @font-size-default; - font-weight: normal; - color: @text-blue; - background: white; - border: 2px solid @blue-grey; - .one-border-radius(10px); - padding: 5px; - } - - } - .status { - position: absolute; - top:50%; - right:0%; - height: 25px; - margin-top: -12px; - } - -} \ No newline at end of file diff --git a/static/less/book_list.less b/static/less/book_list.less deleted file mode 100755 index f36d88c5..00000000 --- a/static/less/book_list.less +++ /dev/null @@ -1,371 +0,0 @@ -@import "variables.less"; - -/* Cross-browser language */ -.opacity (@op) { - filter:alpha(opacity=@op); - -moz-opacity:@op/100; - -khtml-opacity:@op/100; - opacity:@op/100; -} - -/* rows in listview should alternate colors */ -.row1 .book-list.listview { - background: #f6f9f9; - - .book-name:hover { - background: #f6f9f9; - } -} - -.row2 .book-list.listview { - background: #fff; - - .book-name:hover { - background: #fff; - } -} - -div.book-list.listview{ - clear:both; - display:block; - vertical-align: middle; - .height(43px); - margin:0 5px 0 0; - padding:7px 0; - position: relative; - - /* row is a container for divs with individual content elements */ - /* these elements are styled differently to create list and panel views */ - div { - &.unglue-this { - float: left; - } - &.book-thumb { - margin-right: 5px; - float: left; - } - &.book-name { - width:235px; - margin-right:10px; - background:url("@{image-base}booklist/booklist-vline.png") right center no-repeat; - float: left; - - .title { - display:block; - line-height:normal; - overflow: hidden; - .height(19px); - margin-bottom: 5px; - font-weight:bold; - } - - .listview.author { - overflow: hidden; - display:block; - line-height:normal; - .height(19px); - } - - &.listview:hover { - // allow titles and authors to expand onhover - overflow: visible; - - width: auto; - min-width: 219px; - - margin-top: -1px; - padding-right: 15px; - border: 1px solid @blue-grey; - .border-radius(0, 10px, 10px, 0); - border-left: none; - } - - &.listview { - z-index:100; - // z-index only works on positioned elements, so if you - // do not include this the absolutely positioned add-wishlist - // div stacks above it! crazytown. - position: absolute; - left: 42px; - } - } - &.add-wishlist, &.remove-wishlist, &.on-wishlist, &.create-account, &.pledge { - margin-right: 10px; - padding-right: 10px; - width: 136px; - background:url("@{image-base}booklist/booklist-vline.png") right center no-repeat; - - //position: absolute; - margin-left:255px; - float:left; - - span { - font-weight:normal; - color:@text-blue; - text-transform: none; - padding-left:20px; - } - - span.booklist_pledge { - padding-left: 18px; - } - - } - - &.pledge span.booklist_pledge { - padding-left: 0; - } - - &.add-wishlist span, &.create-account span { - background:url("@{image-base}booklist/add-wishlist.png") left center no-repeat; - } - - &.add-wishlist span.booklist_pledge { - background: none; - } - - &.remove-wishlist span { - background:url("@{image-base}booklist/remove-wishlist-blue.png") left center no-repeat; - } - - &.on-wishlist > span, > span.on-wishlist { - background:url("@{image-base}checkmark_small.png") left center no-repeat; - } - - &.booklist-status { - //width: 110px; - margin-right:85px; - float: left; - } - } -} - -div.add-wishlist, div.remove-wishlist { - cursor: pointer; -} - -.booklist-status.listview { - span.booklist-status-label { - display: none; - } - - span.booklist-status-text { - float:left; - display:block; - padding-right:5px; - max-width: 180px; - overflow: hidden; - } - - .read_itbutton { - margin-top: 4px; - } -} - -div.unglue-this { - a { - text-transform:uppercase; - color:@text-blue; - font-size:11px; - font-weight:bold; - } - - &.complete { - .unglue-this-inner1 { - background:url(@background-booklist) 0 -84px no-repeat; - height:42px; - } - .unglue-this-inner2 { - background:url(@background-booklist) 100% -126px no-repeat; - margin-left:29px; - height:42px; - padding-right:10px; - } - a { - color:#fff; - display: block; - } - } - - &.processing { - .unglue-this-inner1 { - background:url(@background-booklist) 0 0 no-repeat; - height:42px; - } - - .unglue-this-inner2 { - background:url(@background-booklist) 100% -42px no-repeat; - margin-left:25px; - height:42px; - padding-right:10px; - } - } -} - -ul.book-list-view { - padding:0; - margin:15px; - float:right; - list-style:none; - - li { - float:left; - margin-right:10px; - display:block; - vertical-align:middle; - line-height:22px; - &:hover { - color: @medium-blue; - } - &.view-list a { - .opacity(30); - &:hover{ - .opacity(100); - } - } - &.view-list a.chosen{ - .opacity(100); - &:hover{ - text-decoration: none; - } - } - } -} - -div.navigation { - float: left; - clear:both; - width:100%; - color:@dark-blue; -} - -ul.navigation { - float:right; - padding:0; - margin:0; - list-style:none; - - li { - float: left; - line-height:normal; - margin-right:5px; - - a { - color:@dark-blue; - font-weight:normal; - } - - &.arrow-l a { - .navigation-arrows(0, -168px); - } - - &.arrow-r a { - .navigation-arrows(-1px, -185px); - } - } -} - -ul.navigation li a:hover, ul.navigation li.active a { - color: @bright-blue; - text-decoration:underline; -} - -.unglue-button { - display: block; - border: 0; -} - -.book-thumb.listview a { - display:block; - height: 50px; - width: 32px; - overflow:hidden; - position:relative; - z-index:1; - - &:hover { - overflow:visible; - z-index:1000; - border:none; - } - - img { - position:absolute; - /* the excerpt you get looks cooler if you select from the middle, but - the popup version doesn't extend past the containing div's boundaries, - so the positioned part is cut off. - top:-20px; - left:-50px; - */ - } -} - -.listview.icons { - position: absolute; - right: 31px; - - .booklist-status-img { - .one-border-radius(4px); - background-color: #fff; - margin-top: 4px; - height: 37px; - - img { - padding: 5px; - } - } - .booklist-status-label, { - display: none; - } - - .boolist-ebook img { - margin-top: 6px; - } -} - -div#content-block-content { - padding-bottom: 10px; -} - -.listview.panelback, .listview.panelback div { - display: none; -} - - -.nobold { - font-weight: normal; -} - -div#libtools { - margin-left: 15px; - margin-bottom: 1em; - border:1px solid @blue-grey; - border-radius: 10px; - padding: 10px; - - p { - margin-top: 0px; - } - div { - margin-top: 0px; - margin-left: 2em ; - } -} - -#facet_block div { - background:url(@background-header) 100% -223px no-repeat; - padding: 7px 7px 15px 7px; - p { - padding: 0 10px 0 10px; - font-size: smaller; - } - - p:first-child { - font-size: larger; - margin-top: 5px; - img { - float:left; - padding-right:0.5em; - } - } -} diff --git a/static/less/book_panel2.less b/static/less/book_panel2.less deleted file mode 100644 index 02a3ef1d..00000000 --- a/static/less/book_panel2.less +++ /dev/null @@ -1,415 +0,0 @@ -@import "variables.less"; - -/* Local variables */ -.greenpanelstuff { - font-size: 12px; - width: 120px; - line-height:16px; -} - -.greenpanelactionitems(@pos, @lineheight) { - .height(@lineheight); - font-size:11px; - background-repeat: no-repeat; - background-position: @pos auto; - font-weight:bold; - text-decoration:none; - text-transform: uppercase; -} - -.greenpanelactionborders { - border-top-width: 1px; - border-bottom-width: 1px; - border-top-style: solid; - border-bottom-style: solid; - border-top-color: #FFF; - border-bottom-color: #FFF; -} - -.panelhoverlink { - text-decoration:none; - color:@text-blue; -} - -.readit { - width:118px; - .height(35px); - padding:0px 0px; - background:#FFF; - margin:0px; - .one-border-radius(4px); - border: 1px solid #81bb38; -} - -.buyit { - font-size: 13pt; - color: @green; -} - -.readit_inner (@padding, @lineheight) { - .greenpanelactionitems(10px, @lineheight); - padding:0px 0px 0px @padding; - color:@dark-green; - - &:hover { - text-decoration:none; - } -} - -.banners (@right) { - width:120px; - height:30px; - padding:0px; - margin:0 0 0 0; - .greenpanelactionborders; - - a, span { - .greenpanelactionitems(left, 30px); - padding:0 @right 0 21px; - color:#FFF; - - &:hover { .panelhoverlink;} - } -} - -/* background */ -@charset "utf-8"; - -#main-wrapper{ - height: 100%; - width: 725px; - margin: 0px; - padding: 0px 0px; -} - -.panelview.tabs{ - padding:5px 0px; - margin:0px; - width:142px; - float: left; - - span.active{ - padding:15px; - margin:15px 0px; - font-weight:bold; - } -} - -/* styling of front side elements */ -.panelview.book-list { - .greenpanelstuff; - margin: auto; - padding: 0px 5px 5px 5px; - height: 300px; - background-color: #ffffff; - color: @text-blue; - border: 5px solid @pale-blue; - position: relative; - - &:hover { - color: @text-blue; - } - - img { - padding:5px 0px; - margin:0px; - } - - .pledge.side1 { - display: none; - } -} - -.panelview { - &.remove-wishlist, &.on-wishlist, &.create-account, &.add-wishlist { - display: none; - } -} - -.panelview.book-name div { - font-size: 12px; - line-height:16px; - max-height:32px; - color: @text-blue; - overflow: hidden; - - a { - color: @medium-blue; - } -} - -.panelview.booklist-status { - display: none; -} - -.panelview.icons { - position: absolute; - bottom: -3px; - width: 140px; - - .booklist-status-img { - float: left; - } - - .booklist-status-label { - position: absolute; - color: @green; - padding-left: 5px; - left: 40px; - bottom: 5px; - font-size: 17px; - margin-bottom: 3px; - } - - .panelnope { - display: none; - } - - .rounded { - margin-bottom: 7px; - } -} -/* make sure the box with the number of wishers displays right */ -span.rounded { - .roundedspan; -} - -span.grey { - .supporter-color-span(#bacfd6, "grey"); -} - -.panelview.boolist-ebook a { - display: none; -} - -/* switch to/from hover state when jquery swaps class names */ - -div.panelview.side1 { - display: visible; -} - -div.panelview.side2 { - display: none; -} - -/* styling of hover state */ -.panelback { - position: relative; -} - -.greenpanel2 { - .greenpanelstuff; - margin: 0; - padding: 10px; - height: 295px; - background-color: @green; - color: #fff; - position:absolute; - top:-5px; - left:-10px; -} - -.greenpanel_top { - height: 135px; -} -.greenpanel2 .button_text { - height: 30px; - line-height: 30px -} -.greenpanel2 .bottom_button { - position: absolute; - bottom: 0px; - height: 26px; -} -.greenpanel2 .add_button { - position: absolute; - bottom: 60px; - height: 26px; -} - -/* Campaign status text at top of hover state */ -.unglued_white { - font-size: 12px; - margin: 0px auto 10px auto; - padding: 5px 0 10px 0; - height:58px; - - p{ - margin:0; - } -} - -/* White-background action buttons; vary by state of campaign */ -.read_itbutton { - .readit; - display: block; - span { - .readit_inner(30px, 35px); - background: url("@{image-base}book-panel/book_icon.png") no-repeat 10% center; - - &:hover { .panelhoverlink; } - } - - &.pledge { - span { - .readit_inner(25px, 35px); - background: none; - - &:hover { .panelhoverlink; } - } - - background-image: url("@{image-base}icons/pledgearrow-green.png"); - background-repeat: no-repeat; - background-position: 90% center; - } -} - -.read_itbutton_fail { - .readit; - - span { - .readit_inner(15px, 35px); - background: none; - } -} - -.panelview.panelfront.icons .read_itbutton { - margin-bottom: 7px; - .height(30px) !important; -} - -.Unglue_itbutton{ - .readit; - - a { - background-image: url("@{image-base}book-panel/unglue_icon.png"); - .readit_inner(25px, 40px); - } -} - -.moreinfo.add-wishlist, .moreinfo.create-account { - .banners(5px); - background: url("@{image-base}book-panel/add_wish_icon.png") no-repeat left center; - padding-right:0; -} - -.moreinfo.remove-wishlist { - .banners(5px); - background: url("@{image-base}booklist/remove-wishlist-white.png") no-repeat left center; -} - -.moreinfo.on-wishlist { - .banners(5px); - background: url("@{image-base}checkmark_small-white.png") no-repeat left center; -} - -/* title, author */ -.white_text { - width:120px; - height:60px; - padding:15px 0px; - margin:0px; - - a { - color:#FFF; - text-decoration:none; - - &:hover { .panelhoverlink;} - } - - p { - /* necessary to ensure title/author don't overflow onto icons */ - line-height:16px; - max-height:32px; - overflow: hidden; - margin: 0 0 5px 0; - } -} - -.moreinfo { - .banners(0); - background: url("@{image-base}book-panel/more_icon.png") no-repeat left center; - cursor: pointer; - - > div { - .height(30px); - padding-bottom:8px; - } -} - -/*end the 2greenpanel*/ - -.read{ - margin: 15px auto 5px auto; - padding: 0px; - width: 140px; - color:@call-to-action; - height:40px; - line-height:25px; - float:left; - position: absolute; - bottom: -15px; -} -.read p { - margin: 0px; - padding: 10px 3px; - width: 50px; - font-size: 10pt; - float:left; -} -.read img{ - padding:5px 0px; - margin:0px; - float:left; -} - -/**/ -.read2{ - margin: 15px auto; - padding: 0px; - width: 130px; - color:@call-to-action; - height:40px; - line-height:25px; -} -.read2 p { - margin: 0px; - padding: 10px 3px; - width: 50px; - font-size:10pt; - float:left; -} -.read2 img{ - padding:0px; - margin:0px; - float:left; - -} -.right_add{ - padding:10px; - margin:0px; - float:right; -} -/* --------------- ( slideout hover state ) --------------------------------------------- */ -.panelview.book-thumb { - position: relative; - margin:0px; - padding:0px; - left:0px; - - img { - z-index: 100; - width: 120px; - height: 182px; - } - - span { - position:absolute; - bottom: 0; - left:-10px; - top:-5px; - z-index: 1000; - height:auto; - } - -} \ No newline at end of file diff --git a/static/less/bootstrap-social.less b/static/less/bootstrap-social.less deleted file mode 100644 index 37abc989..00000000 --- a/static/less/bootstrap-social.less +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Social Buttons for Bootstrap - * - * Copyright 2013-2014 Panayiotis Lipiridis - * Licensed under the MIT License - * - * https://github.com/lipis/bootstrap-social - */ - -@bs-height-base: (@line-height-computed + @padding-base-vertical * 2); -@bs-height-lg: (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2); -@bs-height-sm: (floor(@font-size-small * 1.5) + @padding-small-vertical * 2); -@bs-height-xs: (floor(@font-size-small * 1.2) + @padding-small-vertical + 1); - -.btn-social { - position: relative; - padding-left: (@bs-height-base + @padding-base-horizontal); - text-align: left; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - > :first-child { - position: absolute; - left: 0; - top: 0; - bottom: 0; - width: @bs-height-base; - line-height: (@bs-height-base + 2); - font-size: 1.6em; - text-align: center; - border-right: 1px solid rgba(0, 0, 0, 0.2); - } - &.btn-lg { - padding-left: (@bs-height-lg + @padding-large-horizontal); - :first-child { - line-height: @bs-height-lg; - width: @bs-height-lg; - font-size: 1.8em; - } - } - &.btn-sm { - padding-left: (@bs-height-sm + @padding-small-horizontal); - :first-child { - line-height: @bs-height-sm; - width: @bs-height-sm; - font-size: 1.4em; - } - } - &.btn-xs { - padding-left: (@bs-height-xs + @padding-small-horizontal); - :first-child { - line-height: @bs-height-xs; - width: @bs-height-xs; - font-size: 1.2em; - } - } -} - -.btn-social-icon { - .btn-social; - height: (@bs-height-base + 2); - width: (@bs-height-base + 2); - padding: 0; - :first-child { - border: none; - text-align: center; - width: 100%!important; - } - &.btn-lg { - height: @bs-height-lg; - width: @bs-height-lg; - padding-left: 0; - padding-right: 0; - } - &.btn-sm { - height: (@bs-height-sm + 2); - width: (@bs-height-sm + 2); - padding-left: 0; - padding-right: 0; - } - &.btn-xs { - height: (@bs-height-xs + 2); - width: (@bs-height-xs + 2); - padding-left: 0; - padding-right: 0; - } -} - -.btn-social(@color-bg, @color: #fff) { - background-color: @color-bg; - .button-variant(@color, @color-bg, rgba(0,0,0,.2)); -} - - -.btn-adn { .btn-social(#d87a68); } -.btn-bitbucket { .btn-social(#205081); } -.btn-dropbox { .btn-social(#1087dd); } -.btn-facebook { .btn-social(#3b5998); } -.btn-flickr { .btn-social(#ff0084); } -.btn-foursquare { .btn-social(#f94877); } -.btn-github { .btn-social(#444444); } -.btn-google-plus { .btn-social(#dd4b39); } -.btn-instagram { .btn-social(#3f729b); } -.btn-linkedin { .btn-social(#007bb6); } -.btn-microsoft { .btn-social(#2672ec); } -.btn-openid { .btn-social(#f7931e); } -.btn-pinterest { .btn-social(#cb2027); } -.btn-reddit { .btn-social(#eff7ff, #000); } -.btn-soundcloud { .btn-social(#ff5500); } -.btn-tumblr { .btn-social(#2c4762); } -.btn-twitter { .btn-social(#55acee); } -.btn-vimeo { .btn-social(#1ab7ea); } -.btn-vk { .btn-social(#587ea3); } -.btn-yahoo { .btn-social(#720e9e); } - diff --git a/static/less/buttons.less b/static/less/buttons.less deleted file mode 100644 index 740905f5..00000000 --- a/static/less/buttons.less +++ /dev/null @@ -1,166 +0,0 @@ -// -// Buttons -// -------------------------------------------------- - - -// Base styles -// -------------------------------------------------- - -.btn { - display: inline-block; - margin-bottom: 0; // For input.btn - font-weight: @btn-font-weight; - text-align: center; - vertical-align: middle; - touch-action: manipulation; - cursor: pointer; - background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 - border: 1px solid transparent; - white-space: nowrap; - .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base); - .user-select(none); - - &, - &:active, - &.active { - &:focus, - &.focus { - .tab-focus(); - } - } - - &:hover, - &:focus, - &.focus { - color: @btn-default-color; - text-decoration: none; - } - - &:active, - &.active { - outline: 0; - background-image: none; - .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); - } - - &.disabled, - &[disabled], - fieldset[disabled] & { - cursor: @cursor-disabled; - .opacity(.65); - .box-shadow(none); - } - - a& { - &.disabled, - fieldset[disabled] & { - pointer-events: none; // Future-proof disabling of clicks on `` elements - } - } -} - - -// Alternate buttons -// -------------------------------------------------- - -.btn-default { - .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); -} -.btn-primary { - .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); -} -// Success appears as green -.btn-success { - .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); -} -// Info appears as blue-green -.btn-info { - .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); -} -// Warning appears as orange -.btn-warning { - .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); -} -// Danger and error appear as red -.btn-danger { - .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); -} - - -// Link buttons -// ------------------------- - -// Make a button look and behave like a link -.btn-link { - color: @link-color; - font-weight: normal; - border-radius: 0; - - &, - &:active, - &.active, - &[disabled], - fieldset[disabled] & { - background-color: transparent; - .box-shadow(none); - } - &, - &:hover, - &:focus, - &:active { - border-color: transparent; - } - &:hover, - &:focus { - color: @link-hover-color; - text-decoration: @link-hover-decoration; - background-color: transparent; - } - &[disabled], - fieldset[disabled] & { - &:hover, - &:focus { - color: @btn-link-disabled-color; - text-decoration: none; - } - } -} - - -// Button Sizes -// -------------------------------------------------- - -.btn-lg { - // line-height: ensure even-numbered height of button next to large input - .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); -} -.btn-sm { - // line-height: ensure proper height of button next to small input - .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); -} -.btn-xs { - .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small); -} - - -// Block button -// -------------------------------------------------- - -.btn-block { - display: block; - width: 100%; -} - -// Vertically space out multiple block buttons -.btn-block + .btn-block { - margin-top: 5px; -} - -// Specificity overrides -input[type="submit"], -input[type="reset"], -input[type="button"] { - &.btn-block { - width: 100%; - } -} diff --git a/static/less/campaign2.less b/static/less/campaign2.less deleted file mode 100644 index b8639525..00000000 --- a/static/less/campaign2.less +++ /dev/null @@ -1,439 +0,0 @@ -@import "variables.less"; -@import "campaign_tabs.less"; -@import "book_detail.less"; -@import "social_share.less"; - -/* Page layout */ -#js-page-wrap { - overflow:hidden; -} - -#main-container { - margin-top:20px; -} - -#js-leftcol .jsmodule, .pledge.jsmodule { - margin-bottom:10px; - - &.rounded .jsmod-content { - .one-border-radius(20px); - background:@pale-blue; - color: @text-blue; - padding:10px 20px; - font-weight:bold; - border:none; - margin:0; - line-height: 16px; - - /* Bubble in upper left looks different depending on campaign status */ - &.ACTIVE { - background: @green; - color: white; - font-size: @font-size-header; - font-weight: normal; - line-height: 20px; - } - - &.No.campaign.yet { - background: @orange; - color: white; - } - - span { - display: inline-block; - vertical-align: middle; - - &.spacer { - visibility: none; - } - - &.findtheungluers { - cursor: pointer; - } - } - } -} - -.jsmodule.pledge { - float: left; - margin-left: 10px; -} - -#js-slide .jsmodule { - width: 660px !important; -} - -#js-search { - margin: 0 15px 0 15px !important; -} - -.alert > .errorlist { - list-style-type: none; - font-size: @font-size-larger; - border: none; - text-align: left; - font-weight: normal; - font-size: @font-size-default; - - > li { - margin-bottom: 14px; - } - - .errorlist { - margin-top: 7px; - - li { - width: auto; - height: auto; - padding-left: 32px; - padding-right: 32px; - font-size: @font-size-default; - } - } -} - -/* Center elements */ -#js-maincol { - float:left; - width:470px; - margin:0 10px; - - div#content-block { - background: none; - padding:0; - } -} - -.status { - font-size: @font-size-header; - color: @green; -} - -/* Center - add/remove actions in book detail area */ -.add-wishlist, .add-wishlist-workpage, &.remove-wishlist-workpage, .remove-wishlist, &.on-wishlist, &.create-account { - float: right; - cursor: pointer; - - span { - font-weight:normal; - color:@text-blue; - text-transform: none; - padding-left:20px; - - &.on-wishlist { - background:url("@{image-base}checkmark_small.png") left center no-repeat; - cursor: default; - } - } -} - -.btn_wishlist .add-wishlist span, .add-wishlist-workpage span, .create-account span { - background:url("@{image-base}booklist/add-wishlist.png") left center no-repeat; -} - -.remove-wishlist-workpage span, .remove-wishlist span { - background:url("@{image-base}booklist/remove-wishlist-blue.png") left center no-repeat; -} - -/* Center - tabs and content below them */ -div#content-block-content { - padding-left: 5px; - - a { - color: @medium-blue; - } - - #tabs-1 img { - .mediaborder; - } - - #tabs-3 { - margin-left: -5px; - } -} - -.tabs-content { - padding-right: 5px; - - iframe { - .mediaborder; - } - - form { - margin-left: -5px; - } - - .clearfix { - margin-bottom: 10px; - border-bottom: 2px solid @blue-grey; - } -} - -.work_supporter { - height: auto; - min-height: 50px; - margin-top: 5px; - vertical-align: middle; -} - -.work_supporter_avatar { - float: left; - margin-right: 5px; - - img { - .one-border-radius(5px); - } -} - -.work_supporter_name { - .height(50px); - float: left; -} - -.work_supporter_nocomment { - height: 50px; - margin-top: 5px; - vertical-align: middle; - min-width: 235px; - float: left; -} -.show_supporter_contact_form -{ - display:block; - margin-left: 5px; - float: right; -} -.supporter_contact_form -{ - display:none; - margin-left: 5px; -} -.contact_form_result -{ - display:block; - margin-left: 5px; -} - -.work_supporter_wide -{ - display: block; - height: 65px; - margin-top: 5px; - float: none; - margin-left: 5px; -} -.info_for_managers -{ - display: block; -} -.show_supporter_contact_form -{ - cursor:pointer; - opacity:0.5 - -} -.show_supporter_contact_form:hover -{ - cursor:pointer; - opacity:1 -} -.official { - border: 3px @bright-blue solid; - padding: 3px; - margin-left: -5px; -} - -.editions { - div { - float:left; - padding-bottom: 5px; - margin-bottom: 5px; - } - - .image { - width: 60px; - overflow: hidden; - } - - .metadata { - display:block; - overflow: hidden; - margin-left: 5px; - } - - a:hover { - text-decoration: underline; - } -} - -.show_more_edition, -.show_more_ebooks { - cursor: pointer; -} - -.show_more_edition { - text-align: right; - - &:hover { - text-decoration: underline; - } -} - -.more_edition { - display:none; - clear: both; - padding-bottom: 10px; - padding-left: 60px; -} - -.more_ebooks { - display:none; -} -.show_more_ebooks:hover { - text-decoration: underline; -} - -/* Right column */ - -/* Right - add/remove actions below big green button */ -#js-rightcol { - .add-wishlist, .on-wishlist, .create-account { - float: none; - } - - .on-wishlist { - margin-left: 20px; - } -} - -#js-rightcol, #pledge-rightcol { - float:right; - width:235px; - margin-bottom: 20px; - - h3.jsmod-title { - background:@medium-blue-grey; - .one-border-radius(10px); - padding:10px; - height:auto; - font-style:normal; - font-size: @font-size-larger; - margin:0 0 10px 0; - color: white; - - span { - padding:0; - color:#fff; - font-style:normal; - .height(22px); - } - } - - .jsmodule { - margin-bottom:10px; - - a:hover { - text-decoration: none; - } - } -} - -#pledge-rightcol { - margin-top: 7px; -} - -.js-rightcol-pad { - border:1px solid @blue-grey; - .one-border-radius(10px); - padding:10px; -} - -#widgetcode { - display: none; - border:1px solid @blue-grey; - .one-border-radius(10px); - padding:10px; -} - -/* Right column - support tiers */ -ul.support li { - border-bottom:1px solid @blue-grey; - padding:10px 5px 10px 10px; - background:url("@{image-base}icons/pledgearrow.png") 98% center no-repeat; - &.no_link{ - background:none; - } - &.last { - border-bottom: none; - } - - span { - display:block; - padding-right:10px; - - &.menu-item-price { - font-size: @font-size-header; - float: left; - display: inline; - margin-bottom: 3px; - } - - &.menu-item-desc { - float: none; - clear: both; - font-size: @font-size-larger; - font-weight: normal; - line-height: @font-size-larger*1.3; - } - } - - &:hover { - color: #fff; - background:@call-to-action url("@{image-base}icons/pledgearrow-hover.png") 98% center no-repeat; - a { - color: #fff; - text-decoration: none; - } - &.no_link{ - background:#fff; - color:@call-to-action - } - - } -} - -.you_pledged { - float: left; - line-height: 21px; - font-weight:normal; - color:@text-blue; - padding-left:20px; - background:url("@{image-base}checkmark_small.png") left center no-repeat; -} - -.thank-you { - font-size: @font-size-header; - font-weight: bold; - margin: 20px auto; -} - -div#libtools { - border:1px solid @blue-grey; - .one-border-radius(10px); - padding:10px; - margin-left: 0px; - margin-top: 1em; - padding: 10px; - p { - margin-top: 0px; - margin-bottom: 0px; - } - span { - margin-top: 0px; - margin-left: 0.5em ; - display: inline-block; - } - input[type="submit"]{ - margin-left: 4em; - } -} \ No newline at end of file diff --git a/static/less/campaign_tabs.less b/static/less/campaign_tabs.less deleted file mode 100644 index fc530d2d..00000000 --- a/static/less/campaign_tabs.less +++ /dev/null @@ -1,75 +0,0 @@ -/* Campaign and manage_campaign use same tab styling, so it's factored out here */ - -#tabs{ - border-bottom: 4px solid @medium-blue; - clear: both; - float: left; - margin-top: 10px; - width: 100%; - - ul.book-list-view { - margin-bottom:4px !important; - } -} - -#tabs-1, #tabs-2, #tabs-3, #tabs-4 { - display:none; -} - -#tabs-1.active, #tabs-2.active, #tabs-3.active, #tabs-4.active { - display: inherit; -} - -#tabs-2 textarea { - width: 95%; -} - -ul.tabs { - float:left; - padding:0; - margin:0; - list-style:none; - width: 100%; - - li { - float: left; - height: 46px; - line-height: 20px; - padding-right:2px; - width: 116px; - background: none; - margin: 0; - padding: 0 2px 0 0; - - &.tabs4 { - padding-right:0px; - } - - a { - height: 41px; - line-height: 18px; - display:block; - text-align:center; - padding:0 10px; - min-width:80px; - .border-radius(7px, 7px, 0, 0); - background:@blue-grey; - color:@text-blue; - padding-top: 5px; - - &:hover { - text-decoration: none; - } - - div { - padding-top: 8px; - } - } - - a:hover, &.active a { - background:@medium-blue; - color:#fff; - } - } - -} \ No newline at end of file diff --git a/static/less/comments.less b/static/less/comments.less deleted file mode 100644 index 451a6a70..00000000 --- a/static/less/comments.less +++ /dev/null @@ -1,70 +0,0 @@ -@import "variables.less"; - -.comments { - clear: both; - padding: 5px; - margin: 0 5px 8px 0; - //min-height: 105px; - width: 95%; - - &.row1 { - background: #f6f9f9; - } - - &.row2 { - background: #fff; - } - - div { - float: left; - - img { - margin: 0 5px; - } - } - - .image img { - height: 100px; - } - - // so div will stretch to height of content - &:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; - } - - .nonavatar { - width: 620px; - - span { - padding-right: 5px; - - &.text:before { - content: "\201C"; - font-size: @font-size-larger; - font-weight: bold; - } - - &.text:after { - content: "\201D"; - font-size: @font-size-larger; - font-weight: bold; - } - } - } - - .avatar { - float: right; - margin: 0 auto; - padding-top: 5px; - } -} -.official { - border: 3px #B8DDE0 solid; - margin-top: 3px; - margin-bottom: 5px; - padding-left: 2px; -} \ No newline at end of file diff --git a/static/less/documentation2.less b/static/less/documentation2.less deleted file mode 100644 index aedb58f3..00000000 --- a/static/less/documentation2.less +++ /dev/null @@ -1,290 +0,0 @@ -// Styles basedocumentation.html and its descendants. -@import "variables.less"; -@import "learnmore2.less"; - -body { - line-height: @font-size-default*1.5; -} - -/* Containers */ -.have-right #js-main-container { - float: left; -} - -.js-main-container-inner { - padding-left:15px; -} - -.have-right #js-rightcol { - margin-top:50px; - background:@pale-blue; - border:1px solid @blue-grey; - .one-border-radius(12px); - - .jsmodule { - border-bottom:1px solid #3c4e52; - width:235px; - - &.last { - border-bottom:none; - padding-bottom:10px; - } - } -} - -.js-rightcol-padd { - padding:10px; -} - - -/* Elements */ -.doc h2 { - margin:20px 0; - color:@text-blue; - font-size: @font-size-larger; - font-weight: bold; -} - -.doc h3 { - color:@text-blue; - font-weight:bold; -} - -.doc ul { - list-style-type: none; - padding:0; - margin:0; - - &.errorlist li { - background: none; - margin-bottom: 0; - } - - li { - margin-left: 7px; - } - - &.terms { - list-style: inherit; - list-style-position: inside; - padding-left: 1em; - text-indent: -1em; - - li { - .one-border-radius(auto); - background: inherit; - } - } - - &.bullets { - list-style-type: disc; - margin-left: 9px; - } -} - -.doc div.inset { - background:@pale-blue; - .one-border-radius(12px); - padding:10px; - font-style:italic; -} - -dt { - font-style: italic; - font-size: @font-size-larger; - margin-bottom: 7px; - border-top: solid @pale-blue 2px; - border-bottom: solid @pale-blue 2px; - padding: 7px 0; -} - -dd { - margin: 0 0 0 7px; - padding-bottom: 7px; - - &.margin { - margin-left: 7px; - } -} - -.doc ol li { - margin-bottom: 7px; -} - -.collapse ul { - display: none; -} - -.faq, .answer { - text-transform: none !important; - a { - color: @medium-blue; - } -} - -.faq { - cursor: pointer; - - &:hover { - text-decoration: underline; - } -} - -/* items on press page */ -.press_spacer { - clear:both; - height:0px; -} - -.presstoc { - div { - float: left; - padding-right: 15px; - margin-bottom: 7px; - - &.pressemail { - border: solid 2px @text-blue; - padding: 5px; - .one-border-radius(7px); - max-width: 678px; - margin-top: 7px; - } - } - overflow: auto; - clear: both; - padding-bottom: 10px; -} - -.pressarticles div { - margin-bottom: 10px; -} - -.pressvideos { - > div { - margin-bottom: 15px; - padding-bottom: 7px; - border-bottom: solid 1px @text-blue; - float: left; - } - - iframe, div.mediaborder { - .mediaborder; - } -} - -.pressimages { - .outer { - clear: both; - - div { - float: left; - width: 25%; - padding-bottom: 10px; - - &.text { - width: 75%; - } - - p { - margin: 0 auto; - padding-left: 10px; - padding-right: 10px; - } - } - } - clear: both; - - .screenshot { - width: 150px; - .mediaborder; - } -} - -/* Miscellaneous */ -a.manage { - background: @call-to-action; - color: white; - font-weight: bold; - padding: 0.5em 1em; - cursor: pointer; - .one-border-radius(5px); - border: 1px solid @blue-grey; - - &:hover { - text-decoration: none; - } -} - -.rh_help { - cursor: pointer; - color: @bright-blue; - - &:hover { - text-decoration: underline; - } -} - -.rh_answer { - display: none; - padding-left: 10px; - margin-bottom: 7px; - border: solid 2px @blue-grey; - .one-border-radius(5px); - text-indent: 0 !important; -} - -.work_campaigns { - border: 1px solid @blue-grey; - margin: 10px auto; - - div { - float: left; - - &.campaign_info { - width: 60%; - margin: 5px; - } - } -} - -h2.thank-you { - font-size: 34px; - color: @call-to-action; - line-height: 40px; -} - -.pledge_complete, .pledge_complete a { - font-size: @font-size-larger; - line-height: 18px; - margin-bottom: 15px; -} - -#js-slide .jsmodule.pledge { - width: 960px !important; -} - -ul.social.pledge { - li { - float: left; - padding-right: 30px !important; - } - - margin-bottom: 100px; -} - -#widgetcode { - float: right; -} - -div.pledge-container { - width: 100%; -} - -.yikes { - color: @alert; - font-weight: bold; -} - -.call-to-action { - color: @call-to-action; -} \ No newline at end of file diff --git a/static/less/download.less b/static/less/download.less deleted file mode 100644 index 37ceb49b..00000000 --- a/static/less/download.less +++ /dev/null @@ -1,133 +0,0 @@ -@import "variables.less"; -@import "social_share.less"; - -.download_container { - width: 75%; - margin: auto; -} - -#lightbox_content a { - color: @medium-blue; -} - -#lightbox_content .signuptoday a { - color: white; -} - -#lightbox_content h2, #lightbox_content h3, #lightbox_content h4 { - margin-top: 15px; -} - -#lightbox_content h2 a { - font-size: @font-size-larger*1.25; -} - -#lightbox_content .ebook_download { - a { - margin: auto 5px auto 0; - font-size: @font-size-larger; - } - - img { - vertical-align: middle; - } -} - -#lightbox_content .logo { - img { - .one-border-radius(7px); - height: 50px; - width: 50px; - margin-right: 5px; - } - - font-size: @font-size-larger; -} - -#lightbox_content .one_click, #lightbox_content .ebook_download_container { - .one-border-radius(5px); - margin-left: -.25%; - padding: 0.5%; - padding-bottom: 15px; - margin-bottom: 5px; - width: 74%; - - h3 { - margin-top: 5px; - } -} - -#lightbox_content .one_click { - border: solid 2px @call-to-action; -} - -#lightbox_content .ebook_download_container { - border: solid 2px @blue-grey; -} - -#lightbox_content a.add-wishlist .on-wishlist, #lightbox_content a.success, a.success:hover { - text-decoration: none; - color: @text-blue; -} - -#lightbox_content a.success, a.success:hover { - cursor: default; -} - -#lightbox_content ul { - padding-left: 50px; - - li { - margin-bottom: 4px; - } -} - -.border { - .one-border-radius(5px); - border: solid 2px @blue-grey; - margin: 5px auto; - padding-right: 5px; - padding-left: 5px; -} - -.sharing { - float: right; - padding: 0.5% !important; - width: 23% !important; - min-width: 105px; - - ul { - padding: 0.5% !important; - } - - .jsmod-title { - .one-border-radius(10px); - height: auto; - - span { - padding: 5% !important; - color: white !important; - font-style: normal; - } - } -} - -#widgetcode2 { - display: none; - border:1px solid @blue-grey; - .one-border-radius(10px); - padding:10px; - - textarea { - max-width: 90%; - } -} - -.btn_support.kindle{ - height: 40px; - - a { - width: auto; - font-size: @font-size-larger; - } -} \ No newline at end of file diff --git a/static/less/enhanced_download.less b/static/less/enhanced_download.less deleted file mode 100644 index 8e1032f0..00000000 --- a/static/less/enhanced_download.less +++ /dev/null @@ -1,15 +0,0 @@ -.buttons, .yes_js, .other_instructions_paragraph { - display: inherit; -} - -.instructions > div:not(.active) { - display: none; -} - -.no_js { - display: none !important; -} - -.active { - display: inherit !important; -} \ No newline at end of file diff --git a/static/less/enhanced_download_ie.less b/static/less/enhanced_download_ie.less deleted file mode 100644 index 60e2a799..00000000 --- a/static/less/enhanced_download_ie.less +++ /dev/null @@ -1,16 +0,0 @@ -.yes_js, .other_instructions_paragraph { - display: inherit; -} - -.instructions > div { - display: none; -} - -.no_js { - display: none !important; -} - -/* the not selector doesn't work in IE <= 8 */ -.active { - display: inherit !important; -} \ No newline at end of file diff --git a/static/less/font-awesome.css b/static/less/font-awesome.css deleted file mode 100644 index 2dcdc220..00000000 --- a/static/less/font-awesome.css +++ /dev/null @@ -1,1801 +0,0 @@ -/*! - * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.3.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; -} -.fa { - display: inline-block; - font: normal normal normal 14px/1 FontAwesome; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - transform: translate(0, 0); -} -/* makes the font 33% larger relative to the icon container */ -.fa-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.fa-2x { - font-size: 2em; -} -.fa-3x { - font-size: 3em; -} -.fa-4x { - font-size: 4em; -} -.fa-5x { - font-size: 5em; -} -.fa-fw { - width: 1.28571429em; - text-align: center; -} -.fa-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.fa-ul > li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.14285714em; - width: 2.14285714em; - top: 0.14285714em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.85714286em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eeeeee; - border-radius: .1em; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.fa.pull-right { - margin-left: .3em; -} -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -.fa-rotate-90 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); - -webkit-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.fa-flip-vertical { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); - -webkit-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical { - filter: none; -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #ffffff; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-remove:before, -.fa-close:before, -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video-camera:before { - content: "\f03d"; -} -.fa-photo:before, -.fa-image:before, -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before, -.fa-bar-chart:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook-f:before, -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-navicon:before, -.fa-reorder:before, -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-desc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-asc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell-o:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-mail-reply-all:before, -.fa-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before, -.fa-gratipay:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} -.fa-space-shuttle:before { - content: "\f197"; -} -.fa-slack:before { - content: "\f198"; -} -.fa-envelope-square:before { - content: "\f199"; -} -.fa-wordpress:before { - content: "\f19a"; -} -.fa-openid:before { - content: "\f19b"; -} -.fa-institution:before, -.fa-bank:before, -.fa-university:before { - content: "\f19c"; -} -.fa-mortar-board:before, -.fa-graduation-cap:before { - content: "\f19d"; -} -.fa-yahoo:before { - content: "\f19e"; -} -.fa-google:before { - content: "\f1a0"; -} -.fa-reddit:before { - content: "\f1a1"; -} -.fa-reddit-square:before { - content: "\f1a2"; -} -.fa-stumbleupon-circle:before { - content: "\f1a3"; -} -.fa-stumbleupon:before { - content: "\f1a4"; -} -.fa-delicious:before { - content: "\f1a5"; -} -.fa-digg:before { - content: "\f1a6"; -} -.fa-pied-piper:before { - content: "\f1a7"; -} -.fa-pied-piper-alt:before { - content: "\f1a8"; -} -.fa-drupal:before { - content: "\f1a9"; -} -.fa-joomla:before { - content: "\f1aa"; -} -.fa-language:before { - content: "\f1ab"; -} -.fa-fax:before { - content: "\f1ac"; -} -.fa-building:before { - content: "\f1ad"; -} -.fa-child:before { - content: "\f1ae"; -} -.fa-paw:before { - content: "\f1b0"; -} -.fa-spoon:before { - content: "\f1b1"; -} -.fa-cube:before { - content: "\f1b2"; -} -.fa-cubes:before { - content: "\f1b3"; -} -.fa-behance:before { - content: "\f1b4"; -} -.fa-behance-square:before { - content: "\f1b5"; -} -.fa-steam:before { - content: "\f1b6"; -} -.fa-steam-square:before { - content: "\f1b7"; -} -.fa-recycle:before { - content: "\f1b8"; -} -.fa-automobile:before, -.fa-car:before { - content: "\f1b9"; -} -.fa-cab:before, -.fa-taxi:before { - content: "\f1ba"; -} -.fa-tree:before { - content: "\f1bb"; -} -.fa-spotify:before { - content: "\f1bc"; -} -.fa-deviantart:before { - content: "\f1bd"; -} -.fa-soundcloud:before { - content: "\f1be"; -} -.fa-database:before { - content: "\f1c0"; -} -.fa-file-pdf-o:before { - content: "\f1c1"; -} -.fa-file-word-o:before { - content: "\f1c2"; -} -.fa-file-excel-o:before { - content: "\f1c3"; -} -.fa-file-powerpoint-o:before { - content: "\f1c4"; -} -.fa-file-photo-o:before, -.fa-file-picture-o:before, -.fa-file-image-o:before { - content: "\f1c5"; -} -.fa-file-zip-o:before, -.fa-file-archive-o:before { - content: "\f1c6"; -} -.fa-file-sound-o:before, -.fa-file-audio-o:before { - content: "\f1c7"; -} -.fa-file-movie-o:before, -.fa-file-video-o:before { - content: "\f1c8"; -} -.fa-file-code-o:before { - content: "\f1c9"; -} -.fa-vine:before { - content: "\f1ca"; -} -.fa-codepen:before { - content: "\f1cb"; -} -.fa-jsfiddle:before { - content: "\f1cc"; -} -.fa-life-bouy:before, -.fa-life-buoy:before, -.fa-life-saver:before, -.fa-support:before, -.fa-life-ring:before { - content: "\f1cd"; -} -.fa-circle-o-notch:before { - content: "\f1ce"; -} -.fa-ra:before, -.fa-rebel:before { - content: "\f1d0"; -} -.fa-ge:before, -.fa-empire:before { - content: "\f1d1"; -} -.fa-git-square:before { - content: "\f1d2"; -} -.fa-git:before { - content: "\f1d3"; -} -.fa-hacker-news:before { - content: "\f1d4"; -} -.fa-tencent-weibo:before { - content: "\f1d5"; -} -.fa-qq:before { - content: "\f1d6"; -} -.fa-wechat:before, -.fa-weixin:before { - content: "\f1d7"; -} -.fa-send:before, -.fa-paper-plane:before { - content: "\f1d8"; -} -.fa-send-o:before, -.fa-paper-plane-o:before { - content: "\f1d9"; -} -.fa-history:before { - content: "\f1da"; -} -.fa-genderless:before, -.fa-circle-thin:before { - content: "\f1db"; -} -.fa-header:before { - content: "\f1dc"; -} -.fa-paragraph:before { - content: "\f1dd"; -} -.fa-sliders:before { - content: "\f1de"; -} -.fa-share-alt:before { - content: "\f1e0"; -} -.fa-share-alt-square:before { - content: "\f1e1"; -} -.fa-bomb:before { - content: "\f1e2"; -} -.fa-soccer-ball-o:before, -.fa-futbol-o:before { - content: "\f1e3"; -} -.fa-tty:before { - content: "\f1e4"; -} -.fa-binoculars:before { - content: "\f1e5"; -} -.fa-plug:before { - content: "\f1e6"; -} -.fa-slideshare:before { - content: "\f1e7"; -} -.fa-twitch:before { - content: "\f1e8"; -} -.fa-yelp:before { - content: "\f1e9"; -} -.fa-newspaper-o:before { - content: "\f1ea"; -} -.fa-wifi:before { - content: "\f1eb"; -} -.fa-calculator:before { - content: "\f1ec"; -} -.fa-paypal:before { - content: "\f1ed"; -} -.fa-google-wallet:before { - content: "\f1ee"; -} -.fa-cc-visa:before { - content: "\f1f0"; -} -.fa-cc-mastercard:before { - content: "\f1f1"; -} -.fa-cc-discover:before { - content: "\f1f2"; -} -.fa-cc-amex:before { - content: "\f1f3"; -} -.fa-cc-paypal:before { - content: "\f1f4"; -} -.fa-cc-stripe:before { - content: "\f1f5"; -} -.fa-bell-slash:before { - content: "\f1f6"; -} -.fa-bell-slash-o:before { - content: "\f1f7"; -} -.fa-trash:before { - content: "\f1f8"; -} -.fa-copyright:before { - content: "\f1f9"; -} -.fa-at:before { - content: "\f1fa"; -} -.fa-eyedropper:before { - content: "\f1fb"; -} -.fa-paint-brush:before { - content: "\f1fc"; -} -.fa-birthday-cake:before { - content: "\f1fd"; -} -.fa-area-chart:before { - content: "\f1fe"; -} -.fa-pie-chart:before { - content: "\f200"; -} -.fa-line-chart:before { - content: "\f201"; -} -.fa-lastfm:before { - content: "\f202"; -} -.fa-lastfm-square:before { - content: "\f203"; -} -.fa-toggle-off:before { - content: "\f204"; -} -.fa-toggle-on:before { - content: "\f205"; -} -.fa-bicycle:before { - content: "\f206"; -} -.fa-bus:before { - content: "\f207"; -} -.fa-ioxhost:before { - content: "\f208"; -} -.fa-angellist:before { - content: "\f209"; -} -.fa-cc:before { - content: "\f20a"; -} -.fa-shekel:before, -.fa-sheqel:before, -.fa-ils:before { - content: "\f20b"; -} -.fa-meanpath:before { - content: "\f20c"; -} -.fa-buysellads:before { - content: "\f20d"; -} -.fa-connectdevelop:before { - content: "\f20e"; -} -.fa-dashcube:before { - content: "\f210"; -} -.fa-forumbee:before { - content: "\f211"; -} -.fa-leanpub:before { - content: "\f212"; -} -.fa-sellsy:before { - content: "\f213"; -} -.fa-shirtsinbulk:before { - content: "\f214"; -} -.fa-simplybuilt:before { - content: "\f215"; -} -.fa-skyatlas:before { - content: "\f216"; -} -.fa-cart-plus:before { - content: "\f217"; -} -.fa-cart-arrow-down:before { - content: "\f218"; -} -.fa-diamond:before { - content: "\f219"; -} -.fa-ship:before { - content: "\f21a"; -} -.fa-user-secret:before { - content: "\f21b"; -} -.fa-motorcycle:before { - content: "\f21c"; -} -.fa-street-view:before { - content: "\f21d"; -} -.fa-heartbeat:before { - content: "\f21e"; -} -.fa-venus:before { - content: "\f221"; -} -.fa-mars:before { - content: "\f222"; -} -.fa-mercury:before { - content: "\f223"; -} -.fa-transgender:before { - content: "\f224"; -} -.fa-transgender-alt:before { - content: "\f225"; -} -.fa-venus-double:before { - content: "\f226"; -} -.fa-mars-double:before { - content: "\f227"; -} -.fa-venus-mars:before { - content: "\f228"; -} -.fa-mars-stroke:before { - content: "\f229"; -} -.fa-mars-stroke-v:before { - content: "\f22a"; -} -.fa-mars-stroke-h:before { - content: "\f22b"; -} -.fa-neuter:before { - content: "\f22c"; -} -.fa-facebook-official:before { - content: "\f230"; -} -.fa-pinterest-p:before { - content: "\f231"; -} -.fa-whatsapp:before { - content: "\f232"; -} -.fa-server:before { - content: "\f233"; -} -.fa-user-plus:before { - content: "\f234"; -} -.fa-user-times:before { - content: "\f235"; -} -.fa-hotel:before, -.fa-bed:before { - content: "\f236"; -} -.fa-viacoin:before { - content: "\f237"; -} -.fa-train:before { - content: "\f238"; -} -.fa-subway:before { - content: "\f239"; -} -.fa-medium:before { - content: "\f23a"; -} diff --git a/static/less/font-awesome.min.css b/static/less/font-awesome.min.css deleted file mode 100644 index 24fcc04c..00000000 --- a/static/less/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} \ No newline at end of file diff --git a/static/less/landingpage4.less b/static/less/landingpage4.less deleted file mode 100644 index 6692361d..00000000 --- a/static/less/landingpage4.less +++ /dev/null @@ -1,396 +0,0 @@ -@import "variables.less"; -@import "learnmore2.less"; - -#expandable { - display: none; -} - -#main-container.main-container-fl .js-main { - width:968px; - background:#fff url("@{image-base}landingpage/container-top.png") top center no-repeat; -} -#js-maincol-fl { - padding:30px 30px 0 30px; - overflow:hidden; - - #content-block { - background:none; - padding:0; - } - - #js-main-container { - float: left; - width:672px; - } - - .js-main-container-inner { - padding-right:40px; - } - - h2.page-heading { - margin:0 0 20px 0; - color:@text-blue; - font-size: @font-size-header; - font-weight: bold; - } -} - -#user-block1, .user-block2 { - float:left; -} - -#user-block1 { - #block-intro-text { - float:left; - width:702px; - font-size: @font-size-header; - } - - a#readon { - font-size: @font-size-larger; - } -} - -#js-rightcol, #js-rightcol2 { - float:right; - width:230px; - - .jsmodule { - float: left; - width: 208px; - background:@pale-blue; - border:1px solid @blue-grey; - .one-border-radius(12px); - margin-bottom:10px; - padding: 0 10px 10px 10px; - - - input { - border: none; - .height(36px); - width:90%; - outline: none; - padding-left: 16px; - font-size: @font-size-larger; - } - - input.signup { - border: medium none; - - cursor: pointer; - display: inline-block; - - overflow: hidden; - padding: 0 31px 0 11px; - width: 111px; - margin-bottom: 10px; - } - input.donate { - cursor: pointer; - display: inline-block; - overflow: hidden; - padding: 0 31px 0 11px; - width: 50%; - - } - .donate_amount { - text-align: center; - } - - div { - padding:0px; - margin:0px; - } - } - - div.button { - padding-top:10px; - text-align: center; - color: #FFF; - } - #donatesubmit { - font-size: @font-size-larger; - } - label { - width:100%; - display:block; - clear:both; - padding:10px 0 5px 0; - } -} - - -.js-rightcol-padd { - margin:0px; -} - -h3.heading { - color:@text-blue; - font-weight:bold; -} - -ul.ungluingwhat { - list-style: none; - padding:0; - margin:0 -10px; - - li { - margin-bottom:3px; - background:#fff; - padding: 10px; - display:block; - overflow:hidden; - - > span { - float: left; - } - } - - .user-avatar { - width:43px; - - img { - .one-border-radius(5px); - } - } - - .user-book-info { - margin-left: 5px; - width: 160px; - word-wrap: break-word; - font-size: @font-size-default; - line-height: @font-size-default*1.3; - a { - font-weight: normal; - } - } -} - -div.typo2 { - background:@pale-blue; - .one-border-radius(12px); - padding:10px; - font-style:italic; -} - -div.signup_btn { - display:block; - overflow:hidden; - - a { - background: url("@{image-base}bg.png") no-repeat scroll right top transparent; - color: #fff; - display: block; - font-size: @font-size-default; - font-weight: bold; - .height(36px); - letter-spacing: 1px; - text-decoration: none; - text-transform: capitalize; - float:left; - - span { - background: url("@{image-base}bg.png") no-repeat scroll -770px -36px transparent; - display: block; - margin-right: 29px; - padding: 0 5px 0 15px; - } - } -} - -.have-content-right-module { - .item-content { - float:left; - width:364px; - font-size: @font-size-larger; - height: 132px; - border-bottom:7px solid @bright-blue; - - p { - margin-bottom:20px; - line-height:135%; - } - - h2.page-heading { - padding-right:97px; - line-height:43px; - padding-bottom:4px; - padding-top: 5px; - } - } - - .content-right-module { - width:268px; - float:right; - - h3 { - color:@bright-blue; - text-transform:uppercase; - font-size:24px; - font-weight:normal; - padding:0; - margin:0 0 16px 0; - } - } -} - -h2.page-heading { - color:#3c4e52; - font-size:28px !important; - font-style:italic; - font-weight:normal !important; -} - -#js-maincontainer-faq { - clear: both; - overflow:hidden; - margin:15px 0; - width:100%; -} - -.js-maincontainer-faq-inner { - float:right; - color:@text-blue; - font-size: @font-size-larger; - padding-right:60px; - - a { - font-weight:normal; - color:@text-blue; - text-decoration:underline; - } -} - -h3.module-title { - padding: 10px 0; - font-size: @font-size-header; - font-weight: normal; - margin: 0; -} - -.landingheader { - border-bottom: solid 5px @medium-blue; - float: left; - height:134px; -} - -h3.featured_books { - clear: both; - font-weight: normal; - background: @pale-blue; - .border-radius(10px, 10px, 0, 0); - padding: 10px; - -webkit-margin-before: 0; -} - -a.more_featured_books { - float: right; - width: 57px; - height: 305px; - margin: 5px 0; - border: 5px solid white; - line-height: 305px; - text-align: center; - &:hover { - cursor: pointer; - border-color: @pale-blue; - color: @green - } - &.short { - height: 85px; - line-height: 85px; - } -} - -.spacer { - height: 15px; - width: 100%; - clear: both; -} - -ul#as_seen_on { - margin: 15px 0; - position: relative; - height: 80px; - padding:0px; - li { - float: left; - list-style-type: none; - padding: 10px; - line-height: 80px; - - &:hover { - background: @bright-blue; - } - - img { - vertical-align: middle; - max-width: 131px; - } - } -} - -/* via http://nicolasgallagher.com/pure-css-speech-bubbles/demo/ */ -.speech_bubble { - position:relative; - margin:1em 0; - border:5px solid @medium-blue; - color:@text-blue; - .one-border-radius(10px); - background: #fff; - font-size: @font-size-header; - padding: 1.5em; - &:before { - content: ""; - position: absolute; - top:-20px; /* value = - border-top-width - border-bottom-width */ - bottom:auto; - left:auto; - right:60px; /* controls horizontal position */ - border-width:0 20px 20px; - border-style: solid; - border-color: @medium-blue transparent; - /* reduce the damage in FF3.0 */ - display:block; - width:0; - - } - - &:after { - content: ""; - position: absolute; - top:-13px; /* value = - border-top-width - border-bottom-width */ - bottom:auto; - left:auto; - right:67px; /* value = (:before right) + (:before border-right) - (:after border-right) */ - border-width:0 13px 13px; - border-style: solid; - border-color: #fff transparent; - /* reduce the damage in FF3.0 */ - display:block; - width:0; - } - - span { - padding-left: 1em; - &:before { - position: absolute; - top: .75em; - left: .75em; - font-size: @font-size-header*2; - content:"\201C"; - } - - &:after { - position: absolute; - top: .75em; - font-size: @font-size-header*2; - content:"\201D"; - } - } -} - -#footer { - clear: both; - margin-top:30px; -} \ No newline at end of file diff --git a/static/less/learnmore2.less b/static/less/learnmore2.less deleted file mode 100644 index 3621a126..00000000 --- a/static/less/learnmore2.less +++ /dev/null @@ -1,140 +0,0 @@ -@import "variables.less"; - -.user-block { - width:100%; - clear:both; -} - -#user-block1 { - width:100%; - - a#readon { - float: left; - } -} - -.user-block-hide .quicktour.last { - background: none; -} - -.learnmore_block { - float: left; - width:100%; - clear:both; - border-top: solid 1px @bright-blue; - margin-top: 20px; - - .learnmore_row{ - border-bottom: dashed 2px @bright-blue; - clear: left; - width: 68%; - } - .arrow { - font-size: 24pt; - color: @bright-blue; - line-height: 48pt; - float: left; - padding-right: 8px; - padding-left: 8px; - padding-top: 20px; - font-size: 24pt; - } - .quicktour { - width: 20%; - float: left; - font-style: italic; - line-height:20px; - font-size: @font-size-default; - margin-top: 0; - text-align: center; - min-height: 64px; - .highlight { - font-weight: bold; - } - .programlink{ - margin-top: 20px; - } - .panelback{ - margin-top: 21px; - } - .panelfront{ - font-size: 48pt; - line-height: 48pt; - font-style: normal; - - .makeaskgive{ - position: relative; - z-index: 1; - font-size: 40pt; - top: 10px; - right: 10pt; - text-shadow: 4px 2px 4px white; - } - .qtbutton{ - position: relative; - z-index: 0; - opacity: 0.8; - } - .make{ - line-height: 10pt; - color:red; - font-size:12pt; - top: 0; - left: 50px; - } - .qtreadit{ - line-height: 0; - position: relative; - height:34px - } - .qtreadittext{ - top: -15px; - left: 50px; - line-height: 10pt; - } - input{ - line-height: 10pt; - display: inherit; - font-size: 10pt; - padding: .7em 1em; - top: -15px; - } - } - &.last { - padding-left:10px; - font-size: 20px; - width: 28%; - padding-top: 20px; - .signup { - color: @call-to-action; - font-weight: bold; - margin-top: 10px; - - img { - margin-left: 5px; - vertical-align: middle; - margin-bottom: 3px; - } - } - } - - &.right { - float: right; - } - } -} - -input[type="submit"].qtbutton{ - float:none; - margin:0; -} - -#block-intro-text div { - display: none; - line-height: 25px; - padding-bottom: 10px; - - &#active { - display: inherit; - } -} \ No newline at end of file diff --git a/static/less/liblist.less b/static/less/liblist.less deleted file mode 100644 index 574763cb..00000000 --- a/static/less/liblist.less +++ /dev/null @@ -1,71 +0,0 @@ -@import "variables.less"; - -.items { - clear: both; - padding: 5px; - margin: 0 5px 8px 0; - //min-height: 105px; - width: 95%; - - &.row1 { - background: #f6f9f9; - } - - &.row2 { - background: #fff; - } - - div { - float: left; - - img { - margin: 0 5px; - } - } - - .image img { - height: 100px; - } - - // so div will stretch to height of content - &:after { - content: "."; - display: block; - height: 0; - clear: both; - visibility: hidden; - } - .nonavatar { - width: 620px; - padding-top: 5px; - span { - padding-right: 5px; - } - div.libname{ - width: 100%; - a{ - font-size: @font-size-larger; - } - } - div.libstat { - width:25%; - display: block; - } - } - - .avatar { - float: left; - margin: 0 auto; - padding-top: 5px; - } -} -.joined { - border: 3px #B8DDE0 solid; - margin-top: 3px; - margin-bottom: 5px; - padding-left: 2px; - em { - font-color:#B8DDE0; - font-style:italic; - } -} \ No newline at end of file diff --git a/static/less/libraries.less b/static/less/libraries.less deleted file mode 100644 index d38c3099..00000000 --- a/static/less/libraries.less +++ /dev/null @@ -1,32 +0,0 @@ -@import "variables.less"; - -.doc h2.unglueit_loves_libraries { - font-size: 110px; - text-align: center; -} - -.doc h3 { - text-align: center; - font-style: italic; - margin-bottom: @font-size-larger*2.5; -} - -#widgetcode { - display: none; -} - -ul.social.pledge { - margin: 0 !important; -} - -ul.social.pledge li { - margin-top: 7px !important; -} - -.clearfix { - margin-bottom: 14px; -} - -a, dt a { - color: @medium-blue; -} diff --git a/static/less/lists.less b/static/less/lists.less deleted file mode 100644 index ed72890b..00000000 --- a/static/less/lists.less +++ /dev/null @@ -1,26 +0,0 @@ -@import "variables.less"; - -.user-block2 { - width: 48%; - font-size: 18px; - padding-right: 2%; -} -#js-leftcol li.active_lang a { - font-weight: bold; -} -.show_langs:hover{ - text-decoration: underline; -} -#lang_list { - display: none; -} - -#tabs-1, #tabs-2, #tabs-3 { - margin-left: 0; -} - -ul.tabs li a { - height: 41px; - line-height: 18px; - padding-top: 5px; -} \ No newline at end of file diff --git a/static/less/manage_campaign.less b/static/less/manage_campaign.less deleted file mode 100644 index 9a80e8f6..00000000 --- a/static/less/manage_campaign.less +++ /dev/null @@ -1,48 +0,0 @@ -@import "variables.less"; -@import "campaign_tabs.less"; -@import "book_detail.less"; - -.preview_campaign { - float: right; - margin-right: 40px; -} - -input[name="launch"] { - display: none; -} - -#launchme { - margin: 15px auto; -} - -#premium_add { - span, input[type="text"], textarea { - float: left; - } - - input[type="submit"] { - float: right; - } - - input[type="text"] { - width: 33%; - } - - textarea { - width: 60%; - } - - .premium_add_label { - width: 30%; - margin-right: 2%; - } - - .premium_field_label { - width: 1%; - margin-left: -1%; - } -} - -div.edition_form { - margin-bottom: 2em; -} \ No newline at end of file diff --git a/static/less/mixins.less b/static/less/mixins.less deleted file mode 100644 index 690b12ee..00000000 --- a/static/less/mixins.less +++ /dev/null @@ -1,39 +0,0 @@ -// Mixins -// -------------------------------------------------- - -// Utilities -//@import "mixins/hide-text.less"; -@import "mixins/opacity.less"; -//@import "mixins/image.less"; -//@import "mixins/labels.less"; -//@import "mixins/reset-filter.less"; -//@import "mixins/resize.less"; -//@import "mixins/responsive-visibility.less"; -//@import "mixins/size.less"; -@import "mixins/tab-focus.less"; -//@import "mixins/text-emphasis.less"; -//@import "mixins/text-overflow.less"; -@import "mixins/vendor-prefixes.less"; - -// Components -//@import "mixins/alerts.less"; -@import "mixins/buttons.less"; -//@import "mixins/panels.less"; -//@import "mixins/pagination.less"; -//@import "mixins/list-group.less"; -//@import "mixins/nav-divider.less"; -//@import "mixins/forms.less"; -//@import "mixins/progress-bar.less"; -//@import "mixins/table-row.less"; - -// Skins -//@import "mixins/background-variant.less"; -//@import "mixins/border-radius.less"; -//@import "mixins/gradients.less"; - -// Layout -//@import "mixins/clearfix.less"; -//@import "mixins/center-block.less"; -//@import "mixins/nav-vertical-align.less"; -//@import "mixins/grid-framework.less"; -//@import "mixins/grid.less"; diff --git a/static/less/mixins/alerts.less b/static/less/mixins/alerts.less deleted file mode 100644 index 396196f4..00000000 --- a/static/less/mixins/alerts.less +++ /dev/null @@ -1,14 +0,0 @@ -// Alerts - -.alert-variant(@background; @border; @text-color) { - background-color: @background; - border-color: @border; - color: @text-color; - - hr { - border-top-color: darken(@border, 5%); - } - .alert-link { - color: darken(@text-color, 10%); - } -} diff --git a/static/less/mixins/background-variant.less b/static/less/mixins/background-variant.less deleted file mode 100644 index a85c22b7..00000000 --- a/static/less/mixins/background-variant.less +++ /dev/null @@ -1,9 +0,0 @@ -// Contextual backgrounds - -.bg-variant(@color) { - background-color: @color; - a&:hover, - a&:focus { - background-color: darken(@color, 10%); - } -} diff --git a/static/less/mixins/border-radius.less b/static/less/mixins/border-radius.less deleted file mode 100644 index ca05dbf4..00000000 --- a/static/less/mixins/border-radius.less +++ /dev/null @@ -1,18 +0,0 @@ -// Single side border-radius - -.border-top-radius(@radius) { - border-top-right-radius: @radius; - border-top-left-radius: @radius; -} -.border-right-radius(@radius) { - border-bottom-right-radius: @radius; - border-top-right-radius: @radius; -} -.border-bottom-radius(@radius) { - border-bottom-right-radius: @radius; - border-bottom-left-radius: @radius; -} -.border-left-radius(@radius) { - border-bottom-left-radius: @radius; - border-top-left-radius: @radius; -} diff --git a/static/less/mixins/buttons.less b/static/less/mixins/buttons.less deleted file mode 100644 index 6875a97c..00000000 --- a/static/less/mixins/buttons.less +++ /dev/null @@ -1,68 +0,0 @@ -// Button variants -// -// Easily pump out default styles, as well as :hover, :focus, :active, -// and disabled options for all buttons - -.button-variant(@color; @background; @border) { - color: @color; - background-color: @background; - border-color: @border; - - &:focus, - &.focus { - color: @color; - background-color: darken(@background, 10%); - border-color: darken(@border, 25%); - } - &:hover { - color: @color; - background-color: darken(@background, 10%); - border-color: darken(@border, 12%); - } - &:active, - &.active, - .open > .dropdown-toggle& { - color: @color; - background-color: darken(@background, 10%); - border-color: darken(@border, 12%); - - &:hover, - &:focus, - &.focus { - color: @color; - background-color: darken(@background, 17%); - border-color: darken(@border, 25%); - } - } - &:active, - &.active, - .open > .dropdown-toggle& { - background-image: none; - } - &.disabled, - &[disabled], - fieldset[disabled] & { - &, - &:hover, - &:focus, - &.focus, - &:active, - &.active { - background-color: @background; - border-color: @border; - } - } - - .badge { - color: @background; - background-color: @color; - } -} - -// Button sizes -.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { - padding: @padding-vertical @padding-horizontal; - font-size: @font-size; - line-height: @line-height; - border-radius: @border-radius; -} diff --git a/static/less/mixins/center-block.less b/static/less/mixins/center-block.less deleted file mode 100644 index d18d6de9..00000000 --- a/static/less/mixins/center-block.less +++ /dev/null @@ -1,7 +0,0 @@ -// Center-align a block level element - -.center-block() { - display: block; - margin-left: auto; - margin-right: auto; -} diff --git a/static/less/mixins/clearfix.less b/static/less/mixins/clearfix.less deleted file mode 100644 index 3f7a3820..00000000 --- a/static/less/mixins/clearfix.less +++ /dev/null @@ -1,22 +0,0 @@ -// Clearfix -// -// For modern browsers -// 1. The space content is one way to avoid an Opera bug when the -// contenteditable attribute is included anywhere else in the document. -// Otherwise it causes space to appear at the top and bottom of elements -// that are clearfixed. -// 2. The use of `table` rather than `block` is only necessary if using -// `:before` to contain the top-margins of child elements. -// -// Source: http://nicolasgallagher.com/micro-clearfix-hack/ - -.clearfix() { - &:before, - &:after { - content: " "; // 1 - display: table; // 2 - } - &:after { - clear: both; - } -} diff --git a/static/less/mixins/forms.less b/static/less/mixins/forms.less deleted file mode 100644 index 6f55ed96..00000000 --- a/static/less/mixins/forms.less +++ /dev/null @@ -1,85 +0,0 @@ -// Form validation states -// -// Used in forms.less to generate the form validation CSS for warnings, errors, -// and successes. - -.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { - // Color the label and help text - .help-block, - .control-label, - .radio, - .checkbox, - .radio-inline, - .checkbox-inline, - &.radio label, - &.checkbox label, - &.radio-inline label, - &.checkbox-inline label { - color: @text-color; - } - // Set the border and box shadow on specific inputs to match - .form-control { - border-color: @border-color; - .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work - &:focus { - border-color: darken(@border-color, 10%); - @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); - .box-shadow(@shadow); - } - } - // Set validation states also for addons - .input-group-addon { - color: @text-color; - border-color: @border-color; - background-color: @background-color; - } - // Optional feedback icon - .form-control-feedback { - color: @text-color; - } -} - - -// Form control focus state -// -// Generate a customized focus state and for any input with the specified color, -// which defaults to the `@input-border-focus` variable. -// -// We highly encourage you to not customize the default value, but instead use -// this to tweak colors on an as-needed basis. This aesthetic change is based on -// WebKit's default styles, but applicable to a wider range of browsers. Its -// usability and accessibility should be taken into account with any change. -// -// Example usage: change the default blue border and shadow to white for better -// contrast against a dark gray background. -.form-control-focus(@color: @input-border-focus) { - @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); - &:focus { - border-color: @color; - outline: 0; - .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); - } -} - -// Form control sizing -// -// Relative text size, padding, and border-radii changes for form controls. For -// horizontal sizing, wrap controls in the predefined grid classes. `