]> git.ipfire.org Git - ipfire.org.git/blame - src/templates/donate/donate.html
donations: Bring back PayPal
[ipfire.org.git] / src / templates / donate / donate.html
CommitLineData
c7bcb9ca 1{% extends "../base.html" %}
95b30f84 2
9b5ac075 3{% block title %}{{ _("Donate") }}{% end block %}
95b30f84 4
60b0917c 5{% block container %}
95b30f84
MT
6 {% set amounts = (10, 25, 50, 75, 100, 250) %}
7
0ccdfa9d
MT
8 <section>
9 <div class="container">
10 <div class="row">
11 <div class="col col-lg-6">
12 <h1 class="display-2">{{ _("Donate") }}</h1>
13
14 <p>
15 {{ _("Please support our project with your donation today") }}
16 </p>
17 </div>
18 </div>
19 </div>
20 </section>
95b30f84 21
6f151c32
MT
22 <section class="inverse">
23 <div class="container">
24 <div class="row justify-content-center">
25 <div class="col-12 col-md-8">
26 <form action="" method="POST">
27 {% raw xsrf_form_html() %}
28
54fd20d9 29 <div class="row">
6f151c32
MT
30 <div class="col-12">
31 <h6>Frequency</h6>
32
d1f119e3
MT
33 <input type="hidden" name="frequency" value="{{ frequency }}">
34
6f151c32 35 <div class="custom-control custom-radio custom-control-inline">
d1f119e3 36 <input class="custom-control-input" type="radio" name="frequency-selector" id="frequency-one-time"
6f151c32
MT
37 value="one-time" {% if frequency == "one-time" %}checked{% end %}>
38 <label class="custom-control-label" for="frequency-one-time">{{ _("One Time") }}</label>
39 </div>
95b30f84 40
6f151c32 41 <div class="custom-control custom-radio custom-control-inline">
d1f119e3 42 <input class="custom-control-input" type="radio" name="frequency-selector" id="frequency-monthly"
6f151c32
MT
43 value="monthly" {% if frequency == "monthly" %}checked{% end %}>
44 <label class="custom-control-label" for="frequency-monthly">{{ _("Monthly") }}</label>
f89c578d
MT
45 </div>
46 </div>
6f151c32 47 </div>
95b30f84 48
6f151c32
MT
49 <div class="mt-5 mb-3 p-4 bg-light rounded">
50 <h6>{{ _("Choose an amount") }}</h6>
a41e6d77 51
6f151c32 52 <input type="hidden" name="currency" value="{{ currency }}">
a41e6d77 53
6f151c32
MT
54 <div class="btn-group-toggle flex-wrap text-center mb-3" data-toggle="buttons">
55 {% for a in amounts %}
56 <label class="btn btn-outline-primary btn-lg mb-2">
57 <input type="radio" name="amount-selector" value="{{ a }}" {% if amount == a %}checked{% end %}
58 autocomplete="off"> <span class="EUR">€</span><span class="USD">$</span>{{ a }}
59 </label>
60 {% end %}
61 </div>
a41e6d77 62
6f151c32
MT
63 <p class="text-center small">
64 <a data-toggle="collapse" href="#more" role="button">
65 {{ _("More Options") }}
66 </a>
67 </p>
a6100896 68
6f151c32
MT
69 <div class="collapse" id="more">
70 <div class="form-group row">
71 <label class="col-sm-5 col-form-label col-form-label-lg">
72 Enter your own
73 </label>
74
75 <div class="col-sm-7">
76 <div class="input-group input-group-lg">
77 <div class="input-group-prepend">
78 <span class="input-group-text EUR">€</span>
79 <span class="input-group-text USD">$</span>
a6100896 80 </div>
6f151c32
MT
81
82 <input type="number" class="form-control form-control-lg" name="amount" min="5" step="0.01"
a5f94966 83 {% if amount %}value="{{ "%.2f" % amount }}"{% end %}>
a6100896 84 </div>
bddae05d 85 </div>
f89c578d 86 </div>
a41e6d77 87
6f151c32
MT
88 <p class="small text-right">
89 <a class="toggleCurrency EUR" href="#">{{ _("Prefer donating in US Dollar?") }}</a>
90 <a class="toggleCurrency USD" href="#">{{ _("Prefer donating in Euro?") }}</a>
91 </p>
92 </div>
93
94 <div class="row my-5">
95 <div class="col d-flex flex-column">
96 <div class="form-row">
97 <div class="col">
98 <div class="custom-control custom-radio custom-control-inline mb-3">
99 <input class="custom-control-input" type="radio" name="title" id="mr" value="Mr." checked>
100 <label class="custom-control-label" for="mr">{{ _("Mr.") }}</label>
101 </div>
102 <div class="custom-control custom-radio custom-control-inline mb-3">
103 <input class="custom-control-input" type="radio" name="title" id="mrs" value="Mrs.">
104 <label class="custom-control-label" for="mrs">{{ _("Mrs.") }}</label>
d7bbf25f 105 </div>
f89c578d 106 </div>
6f151c32 107 </div>
a41e6d77 108
6f151c32
MT
109 <div class="form-row">
110 <div class="col-sm-6">
111 <div class="form-group">
112 <input type="text" class="form-control" name="first_name"
b00cc400
MT
113 placeholder="{{ _("First Name" )}}" required
114 {% if first_name %}value="{{ first_name }}"{% end %}>
d7bbf25f 115 </div>
6f151c32 116 </div>
a41e6d77 117
6f151c32
MT
118 <div class="col-sm-6">
119 <div class="form-group">
120 <input type="text" class="form-control" name="last_name"
b00cc400
MT
121 placeholder="{{ _("Last Name" )}}" required
122 {% if last_name %}value="{{ last_name }}"{% end %}>
d7bbf25f 123 </div>
f89c578d 124 </div>
6f151c32 125 </div>
f89c578d 126
6f151c32
MT
127 <div class="form-group">
128 <input type="email" class="form-control" name="email"
129 placeholder="{{ _("Email Address") }}" required>
130 </div>
a41e6d77 131
6f151c32
MT
132 <div class="form-group">
133 <input type="text" class="form-control" name="street1"
134 placeholder="{{ _("Address Line 1") }}" required>
135 </div>
f89c578d 136
6f151c32
MT
137 <div class="form-group">
138 <input type="text" class="form-control" name="street2"
139 placeholder="{{ _("Address Line 2") }}">
140 </div>
f89c578d 141
6f151c32
MT
142 <div class="form-row">
143 <div class="col-sm-6">
144 <div class="form-group">
145 <input type="text" class="form-control" name="city"
146 placeholder="{{ _("City") }}" required>
d7bbf25f 147 </div>
6f151c32 148 </div>
95b30f84 149
6f151c32
MT
150 <div class="col-sm-6">
151 <div class="form-group">
152 <input type="text" class="form-control" name="post_code"
153 placeholder="{{ _("Post Code") }}" required>
d7bbf25f 154 </div>
f89c578d 155 </div>
6f151c32 156 </div>
a41e6d77 157
6f151c32
MT
158 <div class="form-row">
159 <div class="col-sm-6">
160 <div class="form-group">
161 <select class="form-control" name="country_code" required>
162 <option value="">- {{ _("Country") }} -</option>
d7bbf25f 163
6f151c32
MT
164 {% for c in countries %}
165 <option value="{{ c.alpha2 }}" {% if country == c.alpha2 %}selected{% end %}>{{ c.name }}</option>
166 {% end %}
167 </select>
d9d6d3c3
MT
168 </div>
169 </div>
a41e6d77 170
6f151c32
MT
171 <div class="col-sm-6">
172 <div class="form-group">
173 <input type="text" class="form-control" name="state"
174 placeholder="{{ _("State (optional)") }}">
175 </div>
176 </div>
bddae05d 177 </div>
6f151c32
MT
178
179 <input type="submit" class="btn btn-primary btn-lg"
180 id="donate" value="{{ _("Donate Now") }}">
f89c578d 181 </div>
6f151c32 182 </div>
f89c578d 183
6f151c32
MT
184 <div class="row">
185 <div class="col d-flex justify-content-around text-muted">
186 <span class="pf pf-2x pf-american-express"></span>
187 <span class="pf pf-2x pf-mastercard-alt"></span>
188 <span class="pf pf-2x pf-visa"></span>
189 <span class="pf pf-2x pf-sepa"></span>
32169873 190 <span class="pf pf-2x pf-paypal"></span>
f89c578d 191 </div>
6f151c32 192 </div>
f89c578d 193
9ae712ff 194 <div class="modal fade" tabindex="-1" role="dialog" id="modal-monthly-suggestions" aria-hidden="true">
6f151c32
MT
195 <div class="modal-dialog modal-dialog-centered" role="document">
196 <div class="modal-content">
197 <div class="modal-header">
9ae712ff
MT
198 <h5 class="modal-title">{{ _("Would you like to support us monthly?") }}</h5>
199
200 <button type="button" class="close" data-dismiss="modal" aria-label="{{ _("Close") }}">
6f151c32
MT
201 <span aria-hidden="true">&times;</span>
202 </button>
203 </div>
a41e6d77 204
6f151c32 205 <div class="modal-body">
9ae712ff
MT
206 <p class="mb-4">
207 {{ _("Long-term donations are an even better investment into our project, create lasting change for everyone who is working on the project and make IPFire even better!") }}
208 </p>
209
210 <div class="row mb-4">
211 {% for factor, default in ((3, False), (2, True), (1, False)) %}
212 <div class="col d-flex align-items-center">
213 <button type="submit"
214 class="btn btn-primary btn-block {% if default %}btn-lg{% else %}btn-sm{% end %} monthly-amount-suggestion"
215 data-factor="{{ factor }}" data-amount="">
216 <span class="EUR">€</span><span class="USD">$</span><span class="suggested-amount"></span>
217 <br>
218 <small>/ {{ _("month") }}</small>
219 </button>
220 </div>
221 {% end %}
222 </div>
a41e6d77 223
9ae712ff
MT
224 <button type="submit" class="btn btn-secondary btn-block">
225 Donate <span class="EUR">€</span><span class="USD">$</span><span class="amount"></span> once
226 </button>
be02b78f 227 </div>
a41e6d77 228 </div>
ef0d3151
SH
229 </div>
230 </div>
6f151c32 231 </div>
f89c578d 232
6f151c32
MT
233 <p class="small text-muted mb-0">
234 The organization you will be donating to is Lightning Wire Labs GmbH who is
235 kindly handling donations for the IPFire project.
236 After clicking "Donate Now", you will be redirected to Lightning Wire Labs
237 where you will be able to complete the transaction.
238 </p>
239 </form>
d7bbf25f 240 </div>
6f151c32
MT
241 </div>
242 </div>
243 </section>
d7bbf25f 244
6f151c32
MT
245 <section>
246 <div class="container">
0ba47b0f
MT
247 <div class="row justify-content-center">
248 <div class="col-12 col-md-8">
249 <h5>Why should I donate?</h5>
95b30f84 250
0ba47b0f
MT
251 <p>
252 At IPFire, we are working hard to provide you with a free firewall distribution
253 that is like no other. We release updates regularly and enhance functionality
254 to make IPFire more secure, faster and easier to use.
255 </p>
8bc72662 256
0ba47b0f
MT
257 <p>
258 To achieve our high standards that we have set for ourselves, we need your help.
8bc72662 259
0ba47b0f
MT
260 Only with your donation, we can get the right tools, people and utilities that
261 we need to make our work most efficient and reach our maximum potential.
8bc72662 262
0ba47b0f
MT
263 Only with your donation, we can achieve our vision to make the Internet a safer
264 place that is fair for everyone and giving equal opportunities.
265 </p>
8bc72662 266
0ba47b0f 267 <h5>How much should I give?</h5>
8bc72662 268
0ba47b0f
MT
269 <p>
270 We are grateful for every single donation, but of course, we appreciate
271 if you help us as much as you can.
272 </p>
8bc72662 273
0ba47b0f
MT
274 <p>
275 We rely on steady contributions from companies to keep the project healthy
276 and encourage them to set up a monthly donation.
277 </p>
8bc72662 278
0ba47b0f
MT
279 <div class="faq">
280 <h5>Frequently Asked Questions</h5>
a41e6d77 281
0ba47b0f
MT
282 <p>
283 <a data-toggle="collapse" href="#faq-bank-transfer">
284 Do you accept bank transfer via SEPA?
285 </a>
286 </p>
a41e6d77 287
0ba47b0f
MT
288 <div class="collapse" id="faq-bank-transfer">
289 <p>
290 We do accept direct transfers through SEPA. These are our bank details:
291 </p>
95b30f84 292
0ba47b0f 293 <dl>
8c89f8e3
MT
294 <dt>Bank Account Owner</dt>
295 <dd>IPFire Project</dd>
296
0ba47b0f
MT
297 <dt>IBAN</dt>
298 <dd>DE76 3605 0105 1010 8206 84</dd>
a41e6d77 299
0ba47b0f
MT
300 <dt>BIC</dt>
301 <dd>SPESDE3EXXX</dd>
302 </dl>
303 </div>
8bc72662 304
0ba47b0f
MT
305 <p>
306 <a data-toggle="collapse" href="#faq-address">
307 Why do you need my address in order to process a donation?
308 </a>
309 </p>
8bc72662 310
0ba47b0f
MT
311 <div class="collapse" id="faq-address">
312 <p>
313 We understand that your privacy is very important.
314 </p>
bddae05d 315
0ba47b0f
MT
316 <p>
317 We ask for a minimum amount of information required to process
318 credit card donations, including billing addresses.
319 This allows our payment processor to verify your identity,
320 process your payment, and prevent fraudulent charges to your credit card.
321 </p>
bddae05d 322
0ba47b0f
MT
323 <p>
324 We keep your information private - if you have questions, please refer to
325 Lightning Wire Labs' <a href="https://www.lightningwirelabs.com/legal">Privacy Policy</a>.
326 </p>
bddae05d 327
0ba47b0f
MT
328 <p>
329 If you would rather not fill in your information on our online donation form,
330 you can send your donation via SEPA bank transfer.
331 </p>
332 </div>
8bc72662 333
a3f22905
MT
334 <p>
335 <a data-toggle="collapse" href="#faq-credit-card">
336 I am concerned about losing my credit card details
337 </a>
338 </p>
339
340 <div class="collapse" id="faq-credit-card">
341 <p>
342 Credit card fraud is a serious and common problem.
343 To avoid that you and we fall victim of that, we comply with
344 <a href="https://en.wikipedia.org/wiki/Payment_Card_Industry_Data_Security_Standard">PCI DSS</a>,
345 which is mandatory in Europe.
346 </p>
347
348 <p>
349 That means that we never handle any credit card data
350 or store it on our systems. The entire transaction
351 is securely handled by our payment provider and our
352 systems are regularly audited to ensure that we
353 implement this standard correctly.
354 </p>
355 </div>
356
0ba47b0f
MT
357 <p>
358 <a data-toggle="collapse" href="#faq-tax-deduction">
359 Is my donation tax deductible?
360 </a>
361 </p>
8bc72662 362
0ba47b0f
MT
363 <div class="collapse" id="faq-tax-deduction">
364 <p>
365 IPFire is not registered as a charitable organization and therefore donations
366 are not tax deductible in Germany or the European Union.
367 </p>
a41e6d77 368
0ba47b0f
MT
369 <p>
370 For donors outside of the European Union, please consult your tax advisor
371 about whether your donation is tax deductible.
372 </p>
373 </div>
bddae05d 374
f04f2e81
MT
375 <p>
376 <a data-toggle="collapse" href="#faq-cc">
377 What will be charged to my credit card?
378 </a>
379 </p>
380
381 <div class="collapse" id="faq-cc">
382 <p>
383 We are based in Germany. Donations by credit card from other countries
384 my be subject to an international payment fee charged by your credit card issuer.
385 This is usually a small fee around 1%, but please check with your bank
386 before donating.
387 </p>
388
389 <p>
390 If you consider this charge too high, please consider using SEPA direct
391 Debit or Bank Transfer if you can.
392 Even with this charge, it is a lot cheaper than paying the higher processing
393 fees of other payment services like PayPal which keep a lot more of the
394 donation to themselves.
395 </p>
396 </div>
397
0ba47b0f
MT
398 <p>
399 <a data-toggle="collapse" href="#faq-cancel">
400 How do I cancel or change my recurring donation?
401 </a>
402 </p>
bddae05d 403
0ba47b0f
MT
404 <div class="collapse" id="faq-cancel">
405 <p>
406 Your credit card statements or bank statements will contain a link
407 that you can follow to cancel your donation at any time.
408 </p>
409 </div>
bddae05d 410
0ba47b0f
MT
411 <p>
412 <a data-toggle="collapse" href="#faq-email">
413 Who can I email directly with questions about donating?
414 </a>
415 </p>
bddae05d 416
0ba47b0f
MT
417 <div class="collapse" id="faq-email">
418 <p>
419 If you have a question about donating to the IPFire Project,
420 please contact us at <a href="mailto:donate@ipfire.org">donate@ipfire.org</a>.
421 </p>
422 </div>
423 </div>
6f151c32 424 </div>
a41e6d77 425 </div>
7771acea 426 </div>
6f151c32 427 </section>
95b30f84
MT
428{% end block %}
429
430{% block javascript %}
431 <script type="text/javascript">
432 $(document).ready(function() {
d1f119e3
MT
433 var amount = $("input[name='amount']");
434 var currency = $("input[name='currency']");
435 var frequency = $("input[name='frequency']");
436 var submit = $("#donate");
437 var modal = $("#modal-monthly-suggestions");
6d151de3 438
bd2723d4 439 // Adjust form to default currency
a6100896 440 if (currency.val() == "EUR") {
bd2723d4 441 $(".USD").hide();
a6100896 442 } else if (currency.val() == "USD") {
bd2723d4
MT
443 $(".EUR").hide();
444 }
95b30f84 445
a5f94966
MT
446 if (amount.val()) {
447 $("#more").collapse("show");
448 amount.change();
449 }
450
a6100896
MT
451 $(".toggleCurrency").click(function(event) {
452 event.preventDefault();
453
454 if (currency.val() == "EUR") {
455 currency.val("USD");
95b30f84 456
95b30f84
MT
457 $(".EUR").hide();
458 $(".USD").show();
a6100896
MT
459 } else if (currency.val() == "USD") {
460 currency.val("EUR");
461
462 $(".EUR").show();
463 $(".USD").hide();
95b30f84
MT
464 }
465 });
466
d1f119e3 467 // Copy amount when clicking on a radio buttons
6d151de3
MT
468 $("input[name='amount-selector']").on("change", function() {
469 var value = $(this).val();
470 if (value) {
471 amount.val(value);
9ae712ff 472 amount.change();
6d151de3
MT
473 }
474 });
475
d1f119e3
MT
476 // Copy frequency when clicking on a radio buttons
477 $("input[name='frequency-selector']").on("change", function() {
478 var value = $(this).val();
479 if (value) {
480 frequency.val(value);
481 }
482 });
483
a6100896 484 amount.on("change keyup mouseup", function() {
6d151de3 485 var value = $(this).val();
a5f94966 486 value = parseFloat(value);
9ae712ff
MT
487
488 // Enable/disable submit button
489 submit.prop("disabled", !value);
490
6d151de3 491 if (value) {
a6100896
MT
492 // Check matching elements
493 $("input[name='amount-selector']").each(function (i, selector) {
494 var s = $(selector);
495 var b = s.parent(".btn");
a5f94966 496 var v = parseFloat(s.val());
a6100896 497
a5f94966 498 if (value == v) {
a6100896
MT
499 b.addClass("active");
500 } else {
501 b.removeClass("active");
502 }
503 });
9ae712ff
MT
504
505 // Update all amounts
506 $(".amount").html(value);
507
508 // Update suggestions
509 $(".monthly-amount-suggestion").each(function (i, element) {
510 var factor = $(element).data("factor");
511 if (!factor)
512 return;
513
514 var suggested_amount = Math.floor(value / factor);
515
516 // Update value
517 $(element).data("amount", suggested_amount);
518
519 // Update text on button
520 $(element).find(".suggested-amount").html(suggested_amount);
521 });
6d151de3
MT
522 }
523 });
524
9ae712ff 525 submit.click(function (event) {
d1f119e3 526 if (frequency.val() == "one-time" && amount.val() > 10) {
95b30f84 527 event.preventDefault();
fedb34bf 528
9ae712ff 529 modal.modal("show");
95b30f84
MT
530 }
531 });
9ae712ff
MT
532
533 $(".monthly-amount-suggestion").click(function (event) {
534 // Set frequency to monthly
d1f119e3
MT
535 $("input[name='frequency-selector']").prop("checked", false);
536 $("input[name='frequency-selector'][value='monthly']").prop("checked", true);
537 frequency.val("monthly");
9ae712ff
MT
538
539 // Set amount
540 var value = $(this).data("amount");
541 amount.val(value);
542 amount.change();
543
544 // Hide the modal
545 modal.modal("hide");
546 });
547
548 // Update form with initial amount
549 amount.change();
95b30f84
MT
550 });
551 </script>
f5b55ea7 552{% end block %}