1 {% extends
"../base.html" %}
3 {% block title %}{{ _(
"Donate") }}{% end block %}
6 {% set amounts = (
10,
25,
50,
75,
100,
250) %}
8 <section class=
"hero is-primary">
9 <div class=
"hero-body">
10 <div class=
"container">
11 <nav class=
"breadcrumb" aria-label=
"breadcrumbs">
16 <li class=
"is-active">
17 <a href=
"#" aria-current=
"page">Donate
</a>
24 <p class=
"subtitle">{{ _(
"Please support our project with your donation today") }}
</p>
29 <section class=
"section">
30 <div class=
"container">
32 <div class=
"column is-8">
33 <form id=
"donation-form" action=
"" method=
"POST">
34 {% raw xsrf_form_html() %}
36 <h5 class=
"title is-5">I am an ...
</h5>
38 <input type=
"hidden" name=
"type" value=
"individual">
43 <input class=
"custom-control-input" type=
"radio"
44 name=
"type-selector" id=
"type-individual" value=
"individual" checked
>
48 <label class=
"custom-control-label" for=
"type-individual"></label>
50 <input class=
"custom-control-input" type=
"radio"
51 name=
"type-selector" id=
"type-organization" value=
"organization">
53 {{ _(
"Organization") }}
55 <label class=
"custom-control-label" for=
"type-organization"></label>
59 <h5 class=
"title is-5">Frequency
</h5>
61 <input type=
"hidden" name=
"frequency" value=
"{{ frequency }}">
66 <input class=
"form-check-input" type=
"radio" name=
"frequency-selector" id=
"frequency-one-time"
67 value=
"one-time" {% if frequency ==
"one-time" %}checked{% end %}
>
71 <label class=
"form-check-label" for=
"frequency-one-time"></label>
74 <input class=
"form-check-input" type=
"radio" name=
"frequency-selector" id=
"frequency-monthly"
75 value=
"monthly" {% if frequency ==
"monthly" %}checked{% end %}
>
79 <label class=
"form-check-label" for=
"frequency-monthly"></label>
84 <h5 class=
"title is-5">{{ _(
"Choose an amount") }}
</h5>
87 <input type=
"hidden" name=
"currency" value=
"{{ currency }}">
90 <div class=
"buttons" data-toggle=
"buttons">
92 {% for a in amounts %}
93 <label class=
"button is-outlined is-primary">
94 <input type=
"radio" name=
"amount-selector" value=
"{{ a }}" {% if amount == a %}checked{% end %}
95 autocomplete=
"off" class=
"is-hidden"> <span class=
"EUR">€
</span><span class=
"USD">$
</span>{{ a }}
103 <h6 class=
"title is-6">Or Enter your own
</h6>
105 <div class=
"columns">
106 <div class=
"column is-3">
108 <p class=
"control has-icons-left">
109 <input type=
"number" class=
"input" name=
"amount" min=
"5" step=
"0.01"
110 {% if amount %}
value=
"{{ "%
.2f
" % amount }}"{% end %}
>
111 <span class=
"input-group-text EUR icon is-small is-left">
112 <i class=
"fas fa-euro-sign"></i>
114 <span class=
"input-group-text USD icon is-small is-left">
115 <i class=
"fas fa-dollar-sign"></i>
122 <p class=
"small text-end">
123 <a class=
"toggleCurrency EUR" href=
"#">{{ _(
"Prefer donating in US Dollar?") }}
</a>
124 <a class=
"toggleCurrency USD" href=
"#">{{ _(
"Prefer donating in Euro?") }}
</a>
129 <div class=
"control">
130 <div class=
"organization organization-required">
131 <input type=
"text" class=
"input" name=
"organization"
132 placeholder=
"{{ _("Organization
") }}">
137 <div class=
"control">
138 <div class=
"organization">
139 <input type=
"text" class=
"input" name=
"vat_number"
140 placeholder=
"{{ _("VAT Number
") }}">
145 <div class=
"organization">
146 <p class=
"is-size-6">
147 If you are an organization in Europe and you are VAT-registered,
148 please provide your VAT number here.
149 It will make your donation VAT free (if applicable) and the project
150 will benefit from more of your help
151 Please see the FAQ below for more details about VAT.
156 <div class=
"columns">
157 <div class=
"column is-2">
158 <div class=
"control">
159 <input class=
"form-check-input" type=
"radio" name=
"title" id=
"mr" value=
"Mr." checked
>
160 <label class=
"form-check-label" for=
"mr">{{ _(
"Mr.") }}
</label>
163 <div class=
"column is-2">
164 <div class=
"control">
165 <input class=
"form-check-input" type=
"radio" name=
"title" id=
"mrs" value=
"Mrs.">
166 <label class=
"form-check-label" for=
"mrs">{{ _(
"Mrs.") }}
</label>
171 <div class=
"columns">
173 <div class=
"control">
174 <input type=
"text" class=
"input" name=
"first_name"
175 placeholder=
"{{ _("First Name
" )}}" required
176 {% if current_user %}
value=
"{{ current_user.first_name }}"{% end %}
>
181 <div class=
"control">
182 <input type=
"text" class=
"input" name=
"last_name"
183 placeholder=
"{{ _("Last Name
" )}}" required
184 {% if current_user %}
value=
"{{ current_user.last_name }}"{% end %}
>
190 <div class=
"control">
191 <input type=
"email" class=
"input" name=
"email"
192 placeholder=
"{{ _("Email Address
") }}" required
193 {% if current_user %}
value=
"{{ current_user.email }}"{% end %}
>
197 {% set lines = current_user.street.splitlines() if current_user and current_user.street else [] %}
200 <div class=
"control">
201 <input type=
"text" class=
"input" name=
"street1"
202 placeholder=
"{{ _("Address Line
1") }}" required
203 {% if lines %}
value=
"{{ lines[0] }}"{% end %}
>
208 <div class=
"control">
209 <input type=
"text" class=
"input" name=
"street2"
210 placeholder=
"{{ _("Address Line
2") }}"
211 {% if lines and len(lines)
> 1 %}
value=
"{{ lines[1] }}"{% end %}
>
215 <div class=
"columns">
217 <div class=
"control">
218 <input type=
"text" class=
"input" name=
"city"
219 placeholder=
"{{ _("City
") }}" required
220 {% if current_user %}
value=
"{{ current_user.city }}"{% end %}
>
224 <div class=
"control">
225 <input type=
"text" class=
"input" name=
"post_code"
226 placeholder=
"{{ _("Post Code
") }}" required
227 {% if current_user %}
value=
"{{ current_user.postal_code }}"{% end %}
>
232 <div class=
"columns">
233 <div class=
"column is-half">
234 <div class=
"control">
236 <select name=
"country_code" required
>
237 <option value=
"">- {{ _(
"Country") }} -
</option>
239 {% for c in countries %}
240 <option value=
"{{ c.alpha2 }}" {% if country == c.alpha2 %}selected{% end %}
>{{ c.name }}
</option>
248 <div class=
"control">
249 <input type=
"text" class=
"input" name=
"state"
250 placeholder=
"{{ _("State (optional)
") }}">
256 <div class=
"control">
257 <input type=
"submit" class=
"button is-primary is-outlined is-fullwidth is-medium"
258 id=
"donate" value=
"{{ _("Donate Now
") }}">
264 <div class=
"level-item has-text-centered">
265 <span class=
"pf pf-2x pf-american-express"></span>
267 <div class=
"level-item has-text-centered">
268 <span class=
"pf pf-2x pf-mastercard-alt"></span>
270 <div class=
"level-item has-text-centered">
271 <span class=
"pf pf-2x pf-visa"></span>
273 <div class=
"level-item has-text-centered">
274 <span class=
"pf pf-2x pf-sepa"></span>
276 <div class=
"level-item has-text-centered">
277 <span class=
"pf pf-2x pf-paypal"></span>
282 <p class=
"is-size-6">
283 The organization you will be donating to is Lightning Wire Labs GmbH who is
284 kindly handling donations for the IPFire project.
285 After clicking
"Donate Now", you will be redirected to Lightning Wire Labs
286 where you will be able to complete the transaction.
294 <section class=
"section">
295 <div class=
"container">
296 <div class=
"columns">
297 <div class=
"column is-8">
299 <h5 class=
"title is-5">Why should I donate?
</h5>
302 At IPFire, we are working hard to provide you with a free firewall distribution
303 that is like no other. We release updates regularly and enhance functionality
304 to make IPFire more secure, faster and easier to use.
308 To achieve our high standards that we have set for ourselves, we need your help.
310 Only with your donation, we can get the right tools, people and utilities that
311 we need to make our work most efficient and reach our maximum potential.
313 Only with your donation, we can achieve our vision to make the Internet a safer
314 place that is fair for everyone and giving equal opportunities.
319 <h5 class=
"title is-5">How much should I give?
</h5>
322 We are grateful for every single donation, but of course, we appreciate
323 if you help us as much as you can.
327 We rely on steady contributions from companies to keep the project healthy
328 and encourage them to set up a monthly donation.
333 <h5 class=
"title is-5">Frequently Asked Questions
</h5>
336 <h6 class=
"title is-6">
337 Do you accept bank transfer via SEPA?
341 We do accept direct transfers through SEPA. These are our bank details:
345 <dt>Bank Account Owner
</dt>
346 <dd>IPFire Project
</dd>
349 <dd>DE76
3605 0105 1010 8206 84</dd>
357 <h6 class=
"title is-6">
358 Why do you need my address in order to process a donation?
362 We understand that your privacy is very important.
366 We ask for a minimum amount of information required to process
367 credit card donations, including billing addresses.
368 This allows our payment processor to verify your identity,
369 process your payment, and prevent fraudulent charges to your credit card.
373 We keep your information private - if you have questions, please refer to
374 Lightning Wire Labs'
<a href=
"https://www.lightningwirelabs.com/legal">Privacy Policy
</a>.
378 If you would rather not fill in your information on our online donation form,
379 you can send your donation via SEPA bank transfer.
384 <h6 class=
"title is-6">
385 I am concerned about losing my credit card details
389 Credit card fraud is a serious and common problem.
390 To avoid that you and we fall victim of that, we comply with
391 <a href=
"https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard">PCI DSS
</a>,
392 which is mandatory in Europe.
396 That means that we never handle any credit card data
397 or store it on our systems. The entire transaction
398 is securely handled by our payment provider and our
399 systems are regularly audited to ensure that we
400 implement this standard correctly.
405 <h6 class=
"title is-6">
406 Is my donation tax deductible?
410 IPFire is not registered as a charitable organization and therefore donations
411 are not tax deductible in Germany or the European Union.
415 For donors outside of the European Union, please consult your tax advisor
416 about whether your donation is tax deductible.
421 <h6 class=
"title is-6">
422 What will be charged to my credit card?
426 We are based in Germany. Donations by credit card from other countries
427 may be subject to an international payment fee charged by your credit card issuer.
428 This is usually a small fee around
1%, but please check with your bank
433 If you consider this charge too high, please consider using SEPA direct
434 Debit or Bank Transfer if you can.
435 Even with this charge, it is a lot cheaper than paying the higher processing
436 fees of other payment services like PayPal which keep a lot more of the
437 donation to themselves.
442 <h6 class=
"title is-6">
443 How do I cancel or change my recurring donation?
447 Your credit card statements or bank statements will contain a link
448 that you can follow to cancel your donation at any time.
453 <h6 class=
"title is-6">
454 Who can I email directly with questions about donating?
458 If you have a question about donating to the IPFire Project,
459 please contact us at
<a href=
"mailto:donate@ipfire.org">donate@ipfire.org
</a>.
469 {% block javascript %}
470 <script type=
"text/javascript">
471 $(document).ready(function() {
472 var type = $(
"input[name='type']");
473 var amount = $(
"input[name='amount']");
474 var currency = $(
"input[name='currency']");
475 var frequency = $(
"input[name='frequency']");
476 var submit = $(
"#donate");
477 var form = $(
"#donation-form");
479 // Adjust form to default currency
480 if (currency.val() ==
"EUR") {
482 } else if (currency.val() ==
"USD") {
487 //$(
"#more").collapse(
"show");
491 // Copy selected type
492 $(
"input[name='type-selector']").on(
"change", function() {
493 var value = $(this).val();
500 // Update Organization / Individual on radio-click
501 type.on(
"change", function() {
502 var value = $(this).val();
504 if (value ==
"individual") {
505 $(
".organization").hide();
506 $(
".organization-required").find(
"input").prop(
"required", false);
508 $(
".vat-included").show();
509 $(
".vat-excluded").hide();
510 } else if (value ==
"organization") {
511 $(
".organization").show();
512 $(
".organization-required").find(
"input").prop(
"required", true);
514 $(
".vat-included").hide();
515 $(
".vat-excluded").show();
519 $(
".toggleCurrency").click(function(event) {
520 event.preventDefault();
522 if (currency.val() ==
"EUR") {
527 } else if (currency.val() ==
"USD") {
536 // Copy amount when clicking on a radio buttons
537 $(
"input[name='amount-selector']").on(
"change", function() {
538 var value = $(this).val();
545 // Copy frequency when clicking on a radio buttons
546 $(
"input[name='frequency-selector']").on(
"change", function() {
547 var value = $(this).val();
549 frequency.val(value);
553 amount.on(
"change keyup mouseup", function() {
554 var value = $(this).val();
555 value = parseFloat(value);
557 // Enable/disable submit button
558 submit.prop(
"disabled", !value);
561 // Check matching elements
562 $(
"input[name='amount-selector']").each(function (i, selector) {
564 var b = s.parent(
".button");
565 var v = parseFloat(s.val());
568 b.removeClass(
"is-outlined");
570 b.addClass(
"is-outlined");
574 // Update all amounts
575 $(
".amount").html(value);
579 // Disable all submit buttons after the form has been submitted
580 form.one(
"submit", function() {
581 submit.prop(
"disabled", true);
584 // Update everything depending on type
587 // Update form with initial amount