MediaWiki:Centralnotice-template-Donation: Difference between revisions
No edit summary Tag: Central Notice |
No edit summary Tag: Central Notice |
||
Line 1,242: | Line 1,242: | ||
<p> | <p> | ||
<svg class="frb-icon frb-icon-info" role="img" aria-hidden="true" width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><circle cx="8.035" cy="8.143" r="7.844"/><path d="M9.672 6.097l-1.695 5.879c-.094.336-.14.557-.14.662 0 .06.024.117.074.169.05.053.101.079.157.079a.428.428 0 0 0 .28-.124c.249-.204.547-.574.894-1.108l.28.165c-.831 1.45-1.716 2.175-2.653 2.175-.359 0-.644-.101-.856-.302a1.008 1.008 0 0 1-.318-.765c0-.204.046-.463.14-.777l1.15-3.953c.11-.38.165-.667.165-.86a.424.424 0 0 0-.157-.322c-.105-.094-.248-.14-.43-.14-.083 0-.182.002-.298.007l.108-.33 2.803-.455h.496zm-.513-3.804c.342 0 .63.119.864.356.234.237.352.524.352.86 0 .336-.119.623-.356.86-.225.232-.537.36-.86.355-.33 0-.615-.118-.852-.355a1.171 1.171 0 0 1-.355-.86c0-.336.117-.623.351-.86a1.16 1.16 0 0 1 .856-.356z" /></g></svg> | <svg class="frb-icon frb-icon-info" role="img" aria-hidden="true" width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><circle cx="8.035" cy="8.143" r="7.844"/><path d="M9.672 6.097l-1.695 5.879c-.094.336-.14.557-.14.662 0 .06.024.117.074.169.05.053.101.079.157.079a.428.428 0 0 0 .28-.124c.249-.204.547-.574.894-1.108l.28.165c-.831 1.45-1.716 2.175-2.653 2.175-.359 0-.644-.101-.856-.302a1.008 1.008 0 0 1-.318-.765c0-.204.046-.463.14-.777l1.15-3.953c.11-.38.165-.667.165-.86a.424.424 0 0 0-.157-.322c-.105-.094-.248-.14-.43-.14-.083 0-.182.002-.298.007l.108-.33 2.803-.455h.496zm-.513-3.804c.342 0 .63.119.864.356.234.237.352.524.352.86 0 .336-.119.623-.356.86-.225.232-.537.36-.86.355-.33 0-.615-.118-.852-.355a1.171 1.171 0 0 1-.355-.86c0-.336.117-.623.351-.86a1.16 1.16 0 0 1 .856-.356z" /></g></svg> | ||
Hi. This isn’t the first time we’ve interrupted your search recently, but 98% of our readers don't give; they keep reading. This <span class="frb-replace-dayofweek"></span> we ask you to protect | Hi. This isn’t the first time we’ve interrupted your search recently, but 98% of our readers don't give; they keep reading. This <span class="frb-replace-dayofweek"></span> we ask you to protect WikiCigar's future. All we ask is %MINIMUM% if you can afford %MINIMUM%, or <span class="frb-replace-amt-ps4"></span> if you can afford <span class="frb-replace-amt-ps4"></span>. We ask you, humbly: Please don't scroll away. | ||
</p> | </p> | ||
</div> | </div> | ||
Line 1,316: | Line 1,316: | ||
<div class="frb-step-2" style="display: none;"> | <div class="frb-step-2" style="display: none;"> | ||
<p class="frb-step-2" style="display:none;"> | <p class="frb-step-2" style="display:none;"> | ||
We depend on donations, but only a tiny portion of our readers give. When we made | We depend on donations, but only a tiny portion of our readers give. When we made WikiCigar a non-profit, people warned us we'd regret it. But if WikiCigar became commercial, it would be a great loss to the world. WikiCigar is a place to learn, not a place for advertising. It unites all of us who love knowledge: contributors, readers and the donors who keep us thriving. The heart and soul of WikiCigar is a community of people working to bring you unlimited access to reliable, neutral information. Please take a minute to help us keep WikiCigar growing. Thank you. | ||
</p> | </p> | ||
<fieldset class="frb-fieldset frb-frequency"> | <fieldset class="frb-fieldset frb-frequency"> | ||
Line 1,428: | Line 1,428: | ||
<span class="frb-legal-nonUS">{{{FR2015_translations,legal-non-us}}}</span> | <span class="frb-legal-nonUS">{{{FR2015_translations,legal-non-us}}}</span> | ||
<span class="frb-legal-US" style="display: none;">{{{FR2015_translations,legal-us}}}</span> | <span class="frb-legal-US" style="display: none;">{{{FR2015_translations,legal-us}}}</span> | ||
The Wikimedia Endowment provides dedicated funding to realize the power and promise of | The Wikimedia Endowment provides dedicated funding to realize the power and promise of WikiCigar and related for the long term. For more information, visit <a href="https://wikimediaendowment.org/" target="_blank">wikimediaendowment.org</a>. | ||
</div> | </div> | ||
Revision as of 23:59, 24 December 2022
<style> /* css variables */
- root {
--wmui-base100: #fff; --wmui-base90: #f8f9fa; --wmui-base80: #eaecf0; --wmui-base70: #c8ccd1; --wmui-base50: #a2a9b1; --wmui-base30: #72777d; --wmui-base20: #54595d; --wmui-base10: #202122; --wmui-base0: #000; --wmui-accent: #36c; --wmui-accent-light: #eaf3ff; --wmui-accent-dark: #2a4b8d; --wmui-red: #d33; --wmui-red-light: #fee7e6; --wmui-red-dark: #b32424; --wmui-green: #00af89; --wmui-green-light: #d5fdf4; --wmui-green-dark: #14866d; --wmui-yellow: #fc3; --wmui-yellow-light: #fef6e7; --wmui-yellow-dark: #ac6600; --frb-primary: #900; --frb-primary-light: #fee7e6; --frb-primary-dark: var(--frb-primary); --frb-body: var(--wmui-base0); --frb-link: var(--wmui-accent); --frb-link-hover: #447ff5; --frb-message-background: var(--wmui-base100); --frb-message: var(--wmui-base0); --frb-muted: var(--wmui-base20); --frb-muted-hover: var(--wmui-base0); --frb-radio: var(--wmui-accent); --frb-button: var(--wmui-base90); --frb-button-border: var(--wmui-base50); --frb-button-hover: var(--wmui-base100); --frb-button-border-hover: var(--wmui-base50); --frb-button-focus: var(--wmui-base90); --frb-button-border-focus: var(--wmui-accent); --frb-button-selected: var(--wmui-accent-dark); --frb-button-border-selected: #7d8389; --frb-submit: var(--wmui-accent); --frb-submit-border: var(--wmui-accent); --frb-submit-hover: #447ff5; --frb-submit-border-hover: #447ff5; --frb-error: var(--frb-primary);
}
/* Hide nag when editor overlay enabled, or reference drawer open */ .overlay-enabled #frb-nag, .has-drawer--with-scroll-locked #frb-nag {
display: none !important;
}
/* Box-sizing */ .frb, .frb *, .frb *:before, .frb *:after {
-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
}
.frb input[type="radio"], .frb input[type="number"], .frb input[type="email"] {
appearance: none; -webkit-appearance: none; -moz-appearance: none;
}
.frb input[type="number"] {
background-color: transparent; -moz-appearance:textfield;
}
.frb input[type="number"]::-webkit-outer-spin-button, .frb input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none; margin: 0;
}
.frb frb-amt {
white-space: nowrap;
}
/* Hide when printed */ @media print {
.frb { display: none !important; }
}
@media (prefers-reduced-motion: reduce) {
.frb, .frb * { transition: none; }
}
/* Typography
*/
/*Base font*/
- frb-inline {
font-family: system-ui, -apple-system,BlinkMacSystemFont, "Segoe UI", Roboto, "Oxygen-Sans", Ubuntu, Cantarell, Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.5; /*24px @16px*/
}
span.frb-emoji {
font-family: "Segoe UI Emoji";
}
.frb-error {
display: none; line-height: 1.25; /*20px @16px*/ font-weight: 400; margin: 4px 0; color: var(--frb-error); text-align: center;
}
.frb-inline-rml-form-close, .frb-inline-rml-wrapper, .frb-inline-close {
font-size: 12px;
}
- frb-inline legend,
.frb-inline-rml-label, .frb-other-txt, .frb-optin-no-prompt {
font-size: 14px; line-height: 1.2857142857; /*18px @14px*/
}
@media all and (min-width: 480px) {
.frb-other-txt { font-size: 15px; line-height: 1.2666666667; /*19px @15px*/ }
}
- frb-nag {
font-size: 15px; line-height: 1.2; /*18px @15px*/
}
@media all and (min-width: 720px) {
#frb-nag { font-size: 17px; }
}
.frb-submit {
font-size: 18px; line-height: 1.2222222222; /*22px @18px*/
}
.frb-inline-rml .frb-submit, .frb-inline-rml-form input {
font-size: 16px; /*overrides .frb-submit*/ line-height: 1.25; /*20px @16px*/
}
.frb-inline-rml-wrapper {
line-height: 18px; /*fixed line height due to normal/bold difference*/ text-transform: uppercase;
}
.frb-btn {
font-size: 15px; line-height: 1;
}
@media all and (min-width: 375px) {
.frb-btn { font-size: 16px; }
}
.frb-inline-rml .frb-submit, .frb-inline-rml-form input, .frb-ptf {
line-height: 1.25; /*20px @16px*/
}
/* In-article banner styles
*/
- frb-inline {
display: table; position: relative; background: var(--wmui-base100); color: var(--frb-body); margin-top: 14px; margin-left: -16px; margin-right: -16px;
}
.frb-inline-border {
position: relative; border-top: 5px solid var(--frb-primary); border-bottom: 5px solid var(--frb-primary); padding: 10px 16px 6px; background-color: var(--frb-primary-light);
}
.frb-inline-message .frb-icon-info {
height: 16px; margin-bottom: -2px; margin-right: 1px;
}
.frb-icon-info circle {
fill: var(--frb-primary);
}
.frb-icon-info path {
fill: var(--wmui-base100);
}
.frb-inline-message p:first-of-type {
margin-top: 0;
}
.frb-form {
position: relative; margin-top: 0; padding-bottom: 8px;
}
.frb-methods, .frb-amounts, .frb-frequency, .frb-optin {
margin-top: 1em; width: calc(100% + 8px); margin-left: -4px; margin-right: -4px;
}
.frb-form ul {
display: flex; flex-wrap: wrap; width: 100%; padding: 0;
}
/* --- Form legends --- */
.frb-form legend, .frb-inline-rml-label {
margin: 0; color: var(--wmui-base20); text-align: center; width: 100%;
}
.frb-form fieldset.frb-haserror .error-highlight {
color: var(--frb-error);
}
.frb-form legend {
font-weight: bold;
}
/* --- Common Button Styles --- */
.frb-btn {
display: flex; justify-content: center; align-items: center; background-color: var(--frb-button); color: var(--frb-body); border: 1px solid var(--frb-button-border); border-radius: 2px; padding: 17px 6px; min-height: 54px; outline: 0; text-align: center; cursor: pointer; font-weight: bold; transition: background 100ms, color 100ms, border-color 100ms, box-shadow 100ms;
} .frb-btn:hover {
background-color: var(--frb-button-hover); color: var(--frb-body); border-color: var(--frb-button-border-hover);
} .frb-btn:active {
background-color: #d9d9d9; color: var(--frb-body); border-color: #7d8389;
}
.frb-btn:focus, .frb-fieldset input[type="radio"]:focus + label, .frb-fieldset input[type="radio"]:focus + .frb-btn, .frb-frq-switch.is-active {
border-color: var(--frb-button-border-focus); box-shadow: inset 0 0 0 1px var(--frb-button-border-focus);
}
- frb-form .frb-btn.active,
- frb-form input[type="radio"]:checked + .frb-btn,
- frb-form .frb-btn.checked {
background-color: var(--frb-button-selected); color: var(--wmui-base100);
}
.frb-btn.active .frb-logo-paypal path, .frb-btn.active .frb-logo-paypal-usd path, .frb-btn.active .frb-logo-amazon-pay path, .frb-btn.active .frb-logo-applepay path {
fill: var(--wmui-base100);
}
/* Blue text buttons */ .frb-btn.frb-btn-btxt {
color: var(--wmui-accent);
} .frb-btn.frb-btn-btxt:active {
color: var(--wmui-accent-dark);
}
/* Disabled states */
- frb-frequency-monthly:disabled + label,
.form-monthly .no-monthly button {
opacity: 0.4 !important; cursor: default;
}
/* Submit/Continue buttons (blue background) */ .frb-submit {
display: block; width: 100%; margin-top: 12px; padding: 17px 6px; font-weight: bold; color: var(--frb-submit); background-color: var(--frb-button); border: 1px solid var(--frb-button-border-hover); cursor: default; border-radius: 2px; transition: background-color 0.5s ease; opacity: .5;
}
.frb-submit.active {
color: var(--wmui-base100); background-color: var(--frb-submit); border-color: var(--frb-submit-border); cursor: pointer; opacity: 1;
} .frb-submit.active:hover {
background-color: var(--frb-submit-hover); border-color: var(--frb-submit-border-hover);
}
.frb-submit-label-monthly {
display: none;
} .frb-submit-label-now {
display: inline;
} .form-monthly .frb-submit-label-monthly {
display: inline;
} .form-monthly .frb-submit-label-now {
display: none;
}
.frb-inline-rml .frb-submit {
margin: 8px 0; padding: 12px 6px;
}
/* Hide radio buttons. Based on http://jqueryui.com/button/#radio */ .frb-ptf-checkbox, .frb-fieldset li input[type="radio"], .frb-frequency li input[type="radio"] {
position: absolute; overflow: hidden; height: 1px; width: 1px; clip: rect(0 0 0 0); border: 0; margin: -1px; padding: 0;
}
/* --- Amount buttons layout --- */
.frb-amounts ul li, .frb-frequency ul li, .frb-optin ul li {
display: block; width: 50%; clear: none; float: left; padding: 4px; margin: 0;
}
body.rtl .frb-amounts ul li, body.rtl .frb-frequency ul li, body.rtl .frb-optin ul li {
float: right;
}
/* Larger screen layout, 3 amount buttons per row */ @media (min-width: 375px) {
.frb-amounts ul li { flex: 0 0 33.33%; max-width: 33.33%; }
.frb-amounts ul li.frb-button--other { flex: 0 0 66.67%; max-width: 66.67%; }
}
/* --- Amount buttons appearance --- */
.frb-amounts li label:active , .frb-amounts li input[type="radio"]:checked + label, .frb-amounts li input[type="radio"].checked + label, .frb-amounts li label.checked {
background-color: var(--frb-button-selected); border-color: var(--frb-button-border-selected); color: var(--wmui-base100);
}
.frb-amounts li label {
display: block; width: 100%; min-height: auto; height: 54px;
}
/* --- Other amount --- */
/* Other amount field */ .frb-other-txt, .frb-other-input {
line-height: 1; text-align: left;
}
.frb-other-txt {
display: block; text-align: center; margin-top: 1px; margin-bottom: 3px;
}
.frb-other-input {
width: 100%; max-width: 120px; border: none; text-align: center !important; font-weight: bold; color: var(--frb-body); box-shadow: 0 2px 0 0 #222; text-align: right; border-radius: 0; /* Needed for iOS */
}
.frb-button--other .frb-btn {
padding: 6px;
}
.frb-button--other .frb-label {
padding: 2px 6px 6px;
}
.frb-radio:checked + .frb-other-txt, .frb-radio:checked + .frb-btn .frb-other-input {
color: var(--wmui-base100);
}
.frb-radio:checked + .frb-btn .frb-other-input {
box-shadow: 0 2px 0 0 var(--wmui-base100);
}
.frb-input {
background: var(--wmui-base100); padding: 7px; margin: 0; color: #000; border: 1px solid var(--frb-button-border); border-radius: 2px;
}
.frb-input:focus {
outline: 0; border-color: var(--frb-button-border-focus); box-shadow: inset 0 0 0 1px var(--frb-button-border-focus);
}
.frb-input.frb-haserror {
border-color: var(--frb-error); box-shadow: inset 0 0 0 1px var(--frb-error);
}
/* --- Pay the fee --- */ .frb-ptf {
margin-left: 2px; width: calc(100% - 6px); padding-top: 9px; padding-bottom: 6px;
}
.frb-ptf-fee {
white-space: nowrap;
}
.frb-ptf-checkbox:focus + .frb-ptf-label .frb-ptf-img {
box-shadow: inset 0 0 0 2px var(--frb-button-border-focus), inset 0 0 0 2px var(--wmui-base100);
}
.frb-ptf-checkbox:focus + .frb-ptf-label .frb-ptf-img {
border-radius: 5px;
}
.frb-ptf-checkbox + .frb-ptf-label .frb-ptf-img {
display: inline-block; margin-bottom: -4px; width: 32px; height: 32px; background-image: url('https://upload.wikimedia.org/wikipedia/donate/b/b1/Wmf-frb-checkbox.png'); background-size: 64px; background-repeat: no-repeat; background-position: 0 0;
}
.frb-ptf-checkbox:checked + .frb-ptf-label .frb-ptf-img {
background-position: -32px 0;
}
.frb-ptf-label {
display: flex; align-items: center; cursor: pointer;
}
.frb-ptf-cell {
display: table-cell; vertical-align: middle;
}
.frb-ptf-cell:first-child {
padding-left: 2px;
}
body.rtl .frb-ptf-cell:first-child {
padding-left: 0; padding-right: 2px;
}
.frb-ptf-cell:nth-child(2) {
padding-left: 12px;
}
body.rtl .frb-ptf-cell:nth-child(2) {
padding-left: 0; padding-right: 12px;
}
/* --- Payment method buttons layout --- */
/* Always horizontal */ .frb-methods ul {
display: flex; width: 100%;
}
.frb-methods ul li {
display: inline-block; flex: 1 0 0; padding: 4px; margin: 0;
}
/* --- Payment method buttons appearance --- */ .frb-methods .frb-btn {
width: 100%; padding: 2px 4px; min-height: 54px;
}
.frb-methods ul li:first-child:nth-last-child(4) .frb-btn, .frb-methods ul li:first-child:nth-last-child(4) ~ li .frb-btn {
padding: 2px;
}
/* Adjust padding for method buttons with logo, e.g. payment methods */ .frb-methods .frb-btn-logo {
padding: 2px 7px;
}
.frb-methods ul li:first-child:nth-last-child(4) .frb-btn-logo, .frb-methods ul li:first-child:nth-last-child(4) ~ li .frb-btn-logo {
padding: 2px 4px;
}
/* -- Credit card logos -- */
/* Countries with 4 card types */ .frb-cc-logo-wrapper {
display: none; margin: 0 auto; width: 80px; font-size: 0; /* Remove spacing between icons */
}
.frb-methods ul li:first-child:nth-last-child(4) .frb-cc-logo-wrapper, .frb-methods ul li:first-child:nth-last-child(4) ~ li .frb-cc-logo-wrapper {
width: 56px;
}
@media (min-width: 360px) {
.frb-methods ul li:first-child:nth-last-child(4) .frb-cc-logo-wrapper, .frb-methods ul li:first-child:nth-last-child(4) ~ li .frb-cc-logo-wrapper { width: 64px; }
}
@media (min-width: 720px) {
.frb-methods ul li:first-child:nth-last-child(4) .frb-cc-logo-wrapper, .frb-methods ul li:first-child:nth-last-child(4) ~ li .frb-cc-logo-wrapper { width: 128px; }
}
.frb-pm-cc svg {
width: 30px; height: 18px; margin: 2px; display: none;
}
.frb-methods ul li:first-child:nth-last-child(4) .frb-cc-logo-wrapper svg, .frb-methods ul li:first-child:nth-last-child(4) ~ li .frb-cc-logo-wrapper svg {
width: 24px; height: 16px;
}
@media (min-width: 360px) {
.frb-methods ul li:first-child:nth-last-child(4) .frb-cc-logo-wrapper svg, .frb-methods ul li:first-child:nth-last-child(4) ~ li .frb-cc-logo-wrapper svg { width: 28px; height: 18px; }
}
/* Countries with 3 card types */ .frb-cctypes-vma .frb-cc-logo-wrapper {
width: 100%;
}
.frb-cctypes-vma svg {
width: 30%; max-height: 34px;
}
.frb-cctypes-vmad .frb-cc-logo-wrapper, .frb-cctypes-vmaj .frb-cc-logo-wrapper, .frb-cctypes-vma .frb-cc-logo-wrapper, .frb-cctypes-vm .frb-cc-logo-wrapper {
display: block;
}
.frb-cctypes-vmad .frb-pm-cc-label, .frb-cctypes-vmaj .frb-pm-cc-label, .frb-cctypes-vma .frb-pm-cc-label, .frb-cctypes-vm .frb-pm-cc-label {
display: none;
}
.frb-cctypes-vmad .frb-cc-logo-visa, .frb-cctypes-vmad .frb-cc-logo-mastercard, .frb-cctypes-vmad .frb-cc-logo-amex, .frb-cctypes-vmad .frb-cc-logo-discover,
.frb-cctypes-vmaj .frb-cc-logo-visa, .frb-cctypes-vmaj .frb-cc-logo-mastercard, .frb-cctypes-vmaj .frb-cc-logo-amex, .frb-cctypes-vmaj .frb-cc-logo-jcb,
.frb-cctypes-vma .frb-cc-logo-visa, .frb-cctypes-vma .frb-cc-logo-mastercard, .frb-cctypes-vma .frb-cc-logo-amex,
.frb-cctypes-vm .frb-cc-logo-visa, .frb-cctypes-vm .frb-cc-logo-mastercard {
display: inline-block;
}
/* Payment method buttons logo sizing */ .frb-btn-logo svg {
width: 100%; height: 100%; max-height: 24px;
}
.frb-logo-paypal-usd {
margin-bottom: -4px; /* visual tweak */
}
.frb-methods legend, .frb-methods button {
transition: all .2s ease-in-out;
}
.frb-methods.hint legend {
color: #588fbb;
} .frb-methods.hint button {
box-shadow: 0 0 5px #588fbb;
}
/* --- Close and RML Options --- */
.frb-inline-bottombar {
text-align: center;
}
.frb-inline-rml-wrapper {
display: inline-block; position: relative; padding: 0;
}
.frb-inline-close, .frb-inline-rml-link {
display: inline-block; padding: 9px; text-transform: uppercase; cursor: pointer;
}
.frb-inline-close {
z-index: 999; color: var(--wmui-base20);
} .frb-inline-close:hover, .frb-inline-close:focus {
color: var(--wmui-base0);
}
/* Close button icon */ .frb-close-x {
margin-bottom: -3px; width: 13px; height: 13px;
} .frb-close-x {
stroke: currentColor;
}
/* RML link */ .frb-inline-rml-link {
color: var(--frb-link); font-weight: bold;
} .frb-inline-rml-link:hover, .frb-inline-rml-link:focus {
color: var(--frb-link-hover);
}
/* RML clock icon */ .frb-inline-rml-icon {
margin-bottom: -2px; width: 13px; height: 13px;
} .frb-inline-rml-icon path {
fill: currentColor;
} .frb-inline-rml-icon circle {
stroke: currentColor;
}
/* --- Remind Me Later (inline) --- */ .frb-rml-disabled .frb-inline-rml-wrapper {
display: none;
}
.frb-inline-rml {
display: none; cursor: default; margin: 2px 16px 16px; padding: 14px 14px 2px 14px; z-index: 10000; width: calc(100% - 32px); background: var(--wmui-base100); color: var(--frb-body); border: 1px solid var(--wmui-base50); border-radius: 2px; text-transform: none;
}
.frb-inline-bottombar.active .frb-inline-rml-wrapper:before, .frb-inline-bottombar.active .frb-inline-rml-wrapper:after {
display: block;
}
.frb-inline-rml-wrapper:before, .frb-inline-rml-wrapper:after {
display: none; bottom: -3px; border: solid transparent; content: " "; height: 0; width: 0; position: absolute; left: auto; right: 5px; pointer-events: none;
}
body.rtl .frb-inline-rml-wrapper:before, body.rtl .frb-inline-rml-wrapper:after {
left: 5px; right: auto;
}
.frb-inline-rml-wrapper:before {
border-bottom-color: #888; border-width: 11px;
}
.frb-inline-rml-wrapper:after {
border-bottom-color: var(--wmui-base100); border-width: 10px; margin-right: 1px; /*Triangle pixel glitch fix (margin left and right)*/ margin-left: 0;
}
/* Triangle pixel glitch fix for RTL */ body.rtl .frb-inline-rml-wrapper:after {
margin-right: 0; margin-left: 1px;
}
.frb-inline-rml-form form {
display: table; width: 100%;
}
.frb-inline-rml-label {
font-weight: normal; margin-bottom: 4px;
}
.frb-inline-rml-form input {
width: 100%;
}
.frb-inline-rml-form input.frb-haserror {
border-color: var(--frb-error); box-shadow: inset 0 0 0 1px var(--frb-error);
}
.frb-inline-rml-done {
text-align: center;
}
body.rtl .frb-inline-rml-done {
text-align: right;
}
.frb-inline-rml .frb-smallprint {
text-align: left;
}
.frb-inline-rml-form-close {
display: inline-block; margin: 0 auto; color: var(--frb-muted); cursor: pointer; padding: 8px 4px 6px; text-transform: uppercase;
} .frb-inline-rml-form-close:hover {
color: var(--frb-muted-hover);
}
.frb-inline-rml-form-close-icon {
margin-bottom: -3px; width: 13px; height: 13px;
}
.frb-inline-rml-form-close-icon {
stroke: currentColor;
}
/* --- Smallprint --- */
.frb-footer {
width: 100%; margin-top: 24px; margin-bottom: 8px;
}
.frb-smallprint {
font-size: 12px; line-height: 1.5; color: var(--frb-muted); font-weight: normal;
}
.frb-smallprint a {
color: var(--frb-muted); text-decoration: underline
}
.frb-smallprint a:hover, .frb-smallprint a:focus {
color: var(--frb-muted-hover); text-decoration: underline
}
- frb-inline .recurring-details {
display: none;
}
/* Bottom "nag" banner styles
*/
- frb-nag {
z-index: 100; position: fixed; left: 2.5%; bottom: 0; width: 95%; display: block; color: var(--frb-body); background-color: var(--wmui-base100); box-shadow: 0 0 15px 0 rgba(0,0,0,.7); border-radius: 10px 10px 0 0; padding: 16px; text-align: center; font-weight: bold; cursor: pointer;
}
- frb-nag:hover {
text-decoration: none;
}
- frb-nag .frb-icon-info {
height: 19px; width: 19px; margin-bottom: -3px; padding-right: 4px;
}
body.rtl #frb-nag .frb-icon-info {
padding-right: 0; padding-left: 4px;
}
- frb-nag .frb-btn {
display: inline-block; padding: 8px 10px; min-height: 44px; font-size: 14px;
}
.frb-nag-message {
vertical-align: middle; margin-bottom: 10px; padding: 0 20px;
} .frb-nag-message:hover {
text-decoration: underline;
}
.frb-nag-close {
position: absolute; display: block; top: -6px; right: -6px; width: 44px; height: 44px; padding: 10px; cursor: pointer; transition: all .25s ease-in-out;
} body.rtl .frb-nag-close {
right: auto; left: 0;
} .frb-nag-close g {
fill: var(--frb-muted);
}
.frb-nag-close:active {
-moz-transform: scale(1.05); -ms-transform: scale(1.05); -webkit-transform: scale(1.05); transform: scale(1.05);
}
.frb-icon-nag-close {
width: 21px; height: 21px;
}
/* give the footer padding so it's visible above the nag */ .minerva-footer {
padding-bottom: 140px;
}
/*!--- Focus styles ----*/
/*Outline reset*/ .frb-submit:focus,
- frb-amt-other-input:focus,
.email_input:focus {
outline: 0;
}
.frb-submit:focus,
- frb-form .frb-amounts input[type="radio"]:checked + label:focus,
- frb-form .frb-amounts input[type="radio"]:checked + .frb-btn:focus,
- frb-form .frb-amounts input[type="radio"]:checked:focus + label,
- frb-form .frb-amounts input[type="radio"]:checked:focus + .frb-btn,
- frb-form .frb-frequency input[type="radio"]:checked + label:focus,
- frb-form .frb-frequency input[type="radio"]:checked + .frb-btn:focus,
- frb-form .frb-frequency input[type="radio"]:checked:focus + label,
- frb-form .frb-frequency input[type="radio"]:checked:focus + .frb-btn,
- frb-form .frb-amt-other.is-focused .frb-btn,
.email_input:focus,
- frb-form .frb-button--is-focused .frb-btn {
border-color: var(--frb-button-border-focus); box-shadow: inset 0 0 0 2px var(--frb-button-border-focus), inset 0 0 0 3px var(--wmui-base100);
}
/* Email optin */ .frb-optin-no-prompt {
display: none; clear: both; padding: 6px 8px; border: 1px solid var(--wmui-red-dark); background-color: var(--wmui-red-light); border-radius: 2px; font-weight: normal; margin: 4px;
}
.frb-optin-no-prompt.is-positive {
border-color: var(--wmui-green-dark); background-color: var(--wmui-green-light); font-weight: bold;
}
.frb-optin-no-prompt__yes {
display: none;
}
.frb-optin-no-prompt__no {
display: block;
}
.frb-optin-no-prompt.is-positive .frb-optin-no-prompt__yes {
display: block;
}
.frb-optin-no-prompt.is-positive .frb-optin-no-prompt__no {
display: none;
}
.frb-optin-legal {
font-size: 14px; padding: 0 4px;
}
/* Back button */ .frb-back {
cursor: pointer; position: absolute; left: 0; top: 0; color: var(--wmui-base30);
} .frb-back:hover {
color: var(--frb-muted-hover);
}
.frb-back path {
stroke: currentColor;
} .frb-back rect {
fill: currentColor;
}
.frb-icon-back {
height: 13px; width: 20px;
}
.frb-icon-lock {
fill: var(--wmui-accent); width: 14px; height: 14px;
}
.active .frb-icon-lock {
fill: var(--wmui-base100);
}
/* STEP 2 UPSELL*/
.frb-upsell, .frb-step-monthly-diff-amt .frb-amt-monthly {
width: calc(100% + 8px) !important; transition: background-color 0.5s ease; padding: 10px 4px; text-align: center;
}
.frb-upsell {
padding-top: 0; margin-top: 1em;
}
.frb-step-monthly-diff-amt .frb-amt-monthly {
display: block; padding: 0 4px 10px 4px;
}
.frb-upsell-cta, .frb-upsell-ty {
font-size: 17px; line-height: 1.3; font-weight: bold; text-align: center;
}
- monthly-support-text {
max-width: 400px; margin: 0.5em auto;
}
.frb-upsell-color, .frb-step-monthly-diff-amt .frb-amt-monthly label {
display: block; font-size: 15px; line-height: 1.3; font-weight: normal; padding: 0 5%; margin: .5em 0;
}
.frb-monthly-diff-amt-link {
display: block; font-size: 15px; line-height: 1.3; color: var(--frb-link); margin: 8px auto; padding: 12px; text-align: center; cursor: pointer; font-weight: bold;
}
.frb-monthly-diff-amt-link:hover {
text-decoration: underline;
}
- frb-amt-monthly-other-input {
text-align: center; font-size: 18px;
}
.frb-step-monthly-diff-amt {
display: none; text-align: center;
}
/* New RML Nag Styles */
.frb-rml-disabled .frb-nag-rml-link {
display: none !important;
}
- frb-nag .frb-inline-rml {
margin: 0; padding: 0; width: 100%; color: var(--frb-body); border: 0;
}
- frb-nag .frb-inline-rml-label {
font-weight: bold; color: var(--frb-body); font-size: 100%; padding: 0 20px;
}
- frb-nag .frb-inline-rml-form-close {
margin: 10px auto auto;
}
- frb-nag .frb-btn-btxt {
background-color: var(--frb-primary); border: 1px solid var(--frb-primary); color: var(--wmui-base100); transition: background 100ms, color 100ms; text-transform: uppercase;
}
- frb-nag .frb-btn-btxt:active {
background-color: var(--wmui-base0); color: var(--wmui-base100);
}
- frb-nag.active .frb-nag-action {
display: none;
} </style>
<script> var frb = frb || {};
frb.isEndowment = true;
/* jshint maxerr: 600 */ frb.amounts = frb.amounts || {};
// Hard minimum amounts that can be given // From https://github.com/wikimedia/wikimedia-fundraising-SmashPig/blob/master/PaymentData/ReferenceData/CurrencyRates.php // Updated 2022-02-03 frb.amounts.minimums = {
'USD' : 1, 'CAD' : 1.24, 'AUD' : 1.34, 'NZD' : 1.40, 'GBP' : 0.73, 'EUR' : 0.86, 'DKK' : 6.40, 'HUF' : 314, 'ILS' : 3.20, 'INR' : 10, // T309818 'JPY' : 114, 'MYR' : 4.15, 'NOK' : 8.35, 'PLN' : 3.96, 'RON' : 4.25, 'SEK' : 8.59, 'UAH' : 26, 'ZAR' : 15, // Latin America 'BRL' : 5.61, 'ARS' : 99, 'CLP' : 812, 'COP' : 3762, 'MXN' : 20, 'PEN' : 3.63, 'UYU' : 43, 'CHF' : 1
};
frb.amounts.options7 = {
// Big English 'USD' : [2, 10, 15, 25, 50, 75, 100], 'CAD' : [2, 10, 15, 25, 50, 75, 100], 'AUD' : [2, 10, 15, 25, 50, 75, 100], 'NZD' : [2, 10, 15, 25, 50, 75, 100], 'GBP' : [2, 10, 15, 25, 50, 75, 100], 'EUR' : { 'default' : [2, 10, 15, 25, 50, 75, 100] }, // Others 'DKK' : [20, 100, 150, 200, 300, 500, 750], 'HUF' : [500, 1000, 2000, 4000, 5000, 7000, 10000], 'ILS' : [10, 35, 50, 100, 200, 300, 400], 'INR' : [75, 300, 500, 1000, 1500, 3000, 5000], 'JPY' : [300, 1000, 1500, 2000, 3000, 5000, 10000], 'MYR' : [10, 30, 50, 100, 200, 300, 500], 'NOK' : [20, 100, 150, 200, 500, 750, 1000], 'PLN' : [10, 20, 50, 100, 200, 300, 500], 'RON' : [10, 50, 75, 100, 200, 300, 500], 'SEK' : [30, 50, 100, 200, 300, 500, 1000], 'UAH' : [50, 75, 150, 300, 500, 750, 1000], 'ZAR' : [30, 50, 100, 200, 300, 500, 1000], // Latin America 'BRL' : [10, 20, 30, 50, 100, 200, 300], 'ARS' : [175, 250, 500, 750, 1000, 1500, 2000], 'CLP' : [1500, 2500, 5000, 10000, 15000, 25000, 50000], 'COP' : [7000, 10000, 20000, 50000, 100000, 150000, 200000], 'MXN' : [40, 70, 150, 250, 500, 700, 1000], 'PEN' : [10, 15, 25, 50, 75, 100, 200], 'UYU' : [100, 200, 300, 500, 1000, 1500, 2000], 'CHF' : [3, 5, 10, 25, 50, 100, 200]
};
// 5 amount options. Since 2020 6C, no longer used frb.amounts.options5 = {
// Big English 'USD' : [2.75, 15, 20, 50, 100], 'CAD' : [2.75, 15, 20, 50, 100], 'AUD' : [2.75, 15, 20, 50, 100], 'NZD' : [2.75, 15, 20, 50, 100], 'GBP' : [2, 10, 20, 50, 100], 'EUR' : [2, 10, 20, 50, 100], // Others 'DKK' : [20, 100, 200, 500, 1000], 'HUF' : [500, 2500, 4000, 7000, 10000], 'ILS' : [10, 50, 200, 600, 1000], 'INR' : [150, 500, 1000, 3000, 5000], 'JPY' : [300, 1500, 2000, 5000, 10000], 'MYR' : [10, 50, 100, 300, 500], 'NOK' : [20, 100, 200, 500, 1000], 'PLN' : [10, 50, 100, 300, 500], 'RON' : [10, 50, 100, 200, 1000], 'SEK' : [30, 100, 200, 500, 1000], 'UAH' : [50, 150, 300, 750, 1000], 'ZAR' : [30, 100, 200, 500, 1000], // Latin America 'BRL' : [10, 30, 50, 100, 250], 'ARS' : [60, 200, 400, 1000, 2000], 'CLP' : [1500, 5000, 10000, 25000, 50000], 'COP' : [7000, 20000, 50000, 150000, 200000], 'MXN' : [35, 100, 200, 750, 1000], 'PEN' : [10, 50, 150, 300, 700], 'UYU' : [70, 200, 400, 1500, 2000], 'CHF' : [3, 10, 25, 50, 100]
};
// "Average" donation frb.amounts.averages = {
'USD' : 15, 'CAD' : 14, 'AUD' : 13, 'NZD' : 12, 'GBP' : 7, 'EUR' : 9, // Others 'DKK' : 100, 'HUF' : 2500, 'ILS' : 50, 'INR' : 1000, 'JPY' : 1500, 'MYR' : 50, 'NOK' : 100, 'PLN' : 50, 'RON' : 50, 'SEK' : 100, 'UAH' : 150, 'ZAR' : 150, // Latin America 'BRL' : 25, 'ARS' : 200, 'CLP' : 8000, 'COP' : 30000, 'MXN' : 150, 'PEN' : 40, 'UYU' : 300, 'CHF' : 15
};
// 'If everyone gave X'. Mostly the same as first asks option. frb.amounts.ifEveryone = {
// Big English 'USD' : 2, 'CAD' : 2, 'AUD' : 2, 'NZD' : 2, 'GBP' : 2, 'EUR' : { 'default' : 2 }, // Others 'DKK' : 20, 'HUF' : 500, 'ILS' : 10, 'INR' : 75, 'JPY' : 300, 'MYR' : 10, 'NOK' : 20, 'PLN' : 10, 'RON' : 10, 'SEK' : 30, 'UAH' : 50, 'ZAR' : 30, // Latin America 'BRL' : 10, 'ARS' : 175, 'CLP' : 1500, 'COP' : 7000, 'MXN' : 40, 'PEN' : 10, 'UYU' : 100, 'CHF' : 3
};
// Minimum fee/PTF amounts. Default is 0.35. // Updated 2018-07-05 based on Ppena's feedback // Updated 2019-05-21 to approx 0.35 USD equivalent frb.amounts.feeMinimums = {
'DKK' : 2, 'HUF' : 100, 'ILS' : 1.2, 'INR' : 4, 'JPY' : 35, 'MYR' : 1, 'NOK' : 3, 'PLN' : 1.35, 'RON' : 1.5, 'SEK' : 3, 'UAH' : 10, 'ZAR' : 5, // Latin America 'BRL' : 2, 'ARS' : 32, 'CLP' : 255, 'COP' : 1300, 'MXN' : 7.4, 'PEN' : 1.3, 'UYU' : 15.5
};
// If one-time amount <= left amount, suggest right amount for monthly // If changing these, please update spreadsheet // https://docs.google.com/spreadsheets/d/1z36zi8EegPLAvR5FYAgwz8ywKZ50QNB82SpwpTdk-xQ/edit#gid=1258723967 frb.amounts.monthlySuggest = {
'USD' : [ // also CAD, AUD, NZD, GBP, EUR [ 1.99, 0 ], [ 2.35, 1.40 ], [ 9, 1.75 ], [ 12, 2 ], [ 15, 2.5 ], [ 18, 3 ], [ 21, 3.5 ], [ 24, 4 ], [ 27, 4.5 ], [ 30, 5 ], [ 33, 5.5 ], [ 36, 6 ], [ 39, 6.5 ], [ 42, 7 ], [ 45, 7.5 ], [ 48, 8 ], [ 51, 8.5 ], [ 54, 9 ], [ 57, 9.5 ], [ 60, 10 ], [ 63, 10.5 ], [ 66, 11 ], [ 69, 11.5 ], [ 72, 12 ], [ 75, 12.5 ], [ 102, 17 ], [ 250, 25 ], [ 499, 50 ], [ Infinity, 0 ] ], 'INR' : [ [ 200, 0 ], [ 300, 150 ], [ 500, 175 ], [ 1000, 250 ], [ 1500, 350 ], [ 3000, 500 ], [ 5000, 750 ], [ 10000, 1000 ], [ 25000, 2500 ], [ Infinity, 0 ] ], 'JPY' : [ [ 299, 0 ], [ 900, 150 ], [ 1200, 200 ], [ 1500, 250 ], [ 1800, 300 ], [ 2100, 350 ], [ 2400, 400 ], [ 2700, 450 ], [ 3000, 500 ], [ 3300, 550 ], [ 3600, 600 ], [ 3900, 650 ], [ 4200, 700 ], [ 4500, 750 ], [ 4800, 800 ], [ 5100, 850 ], [ 5400, 900 ], [ 5700, 950 ], [ 6000, 1000 ], [ 6300, 1050 ], [ 6600, 1100 ], [ 6900, 1150 ], [ 7200, 1200 ], [ 7500, 1250 ], [ 10800, 1800 ], [ 18000, 3000 ], [ 50000, 6000 ], [ Infinity, 0 ] ], 'SEK' : [ [ 25, 0 ], [ 50, 25 ], [ 100, 30 ], [ 200, 50 ], [ 300, 70 ], [ 500, 90 ], [ 1000, 110 ], [ 2500, 250 ], [ 5000, 500 ], [ Infinity, 0 ] ], 'HUF' : [ [ 499, 0 ], [ 3000, 500 ], [ 6000, 1000 ], [ 9000, 1500 ], [ 12000, 2000 ], [ 18000, 3000 ], [ 24000, 4000 ], [ 30000, 5000 ], [ 36000, 6000 ], [ 42000, 7000 ], [ 48000, 8000 ], [ 54000, 9000 ], [ 60000, 10000 ], [ Infinity, 0 ] ], 'ILS' : [ [ 9, 0 ], [ 10, 5 ], [ 60, 10 ], [ 90, 15 ], [ 120, 20 ], [ 180, 30 ], [ 240, 40 ], [ 300, 50 ], [ 360, 60 ], [ 420, 70 ], [ 480, 80 ], [ 540, 90 ], [ 600, 100 ], [ Infinity, 0 ] ], 'ZAR' : [ [ 29, 0 ], [ 30, 20 ], [ 50, 30 ], [ 100, 40 ], [ 300, 50 ], [ 450, 75 ], [ 600, 100 ], [ 900, 150 ], [ 1200, 200 ], [ 1500, 250 ], [ 1800, 300 ], [ 2400, 400 ], [ 3000, 500 ], [ 3600, 600 ], [ Infinity, 0 ] ], 'MYR' : [ // Also RON, PLN [ 9, 0 ], [ 30, 5 ], [ 50, 10 ], [ 120, 20 ], [ 180, 30 ], [ 240, 40 ], [ 300, 50 ], [ 360, 60 ], [ 420, 70 ], [ 480, 80 ], [ 540, 90 ], [ 600, 100 ], [ 900, 150 ], [ Infinity, 0 ] ], 'DKK' : [ // Also NOK [ 19, 0 ], [ 20, 10 ], [ 120, 20 ], [ 180, 30 ], [ 300, 50 ], [ 450, 75 ], [ 600, 100 ], [ 750, 125 ], [ 900, 150 ], [ 1200, 200 ], [ 1500, 250 ], [ 1800, 300 ], [ 2100, 350 ], [ Infinity, 0 ] ]
}; frb.amounts.monthlySuggest.GBP = frb.amounts.monthlySuggest.USD; frb.amounts.monthlySuggest.EUR = frb.amounts.monthlySuggest.USD; frb.amounts.monthlySuggest.CAD = frb.amounts.monthlySuggest.USD; frb.amounts.monthlySuggest.AUD = frb.amounts.monthlySuggest.USD; frb.amounts.monthlySuggest.NZD = frb.amounts.monthlySuggest.USD;
frb.amounts.monthlySuggest.RON = frb.amounts.monthlySuggest.MYR; frb.amounts.monthlySuggest.PLN = frb.amounts.monthlySuggest.MYR; frb.amounts.monthlySuggest.NOK = frb.amounts.monthlySuggest.DKK;
frb.currencyFormats = {
'USD' : '$\t', 'CAD' : { 'fr' : '$\t', 'default' : '$\t' }, 'AUD' : '$\t', 'NZD' : '$\t', 'GBP' : '£\t', 'EUR' : { 'en' : '€\t', 'cy' : '€\t', 'ga' : '€\t', 'mt' : '€\t', 'nl' : '€ \t', 'lv' : '€ \t', 'tr' : '€ \t', 'default' : '\t €' }, // Others 'DKK' : '\t kr.', 'HUF' : '\t Ft', 'ILS' : { 'he' : '\t ₪', 'yi' : '\t ₪', 'ar' : '\t ₪', 'default' : '₪ \t' }, 'INR' : '₹ \t', 'JPY' : '¥\t', 'MYR' : 'RM\t', 'NOK' : '\t kr', 'PLN' : '\t zł', 'RON' : '\t lei', 'SEK' : '\t kr', 'UAH' : '₴\t', 'ZAR' : 'R \t', // Latin America 'BRL' : { 'en' : 'R$\t', 'default' : 'R$ \t' }, 'ARS' : '$\t', 'CLP' : '$\t', 'COP' : '$\t', 'MXN' : '$\t', 'PEN' : 'S/. \t', 'UYU' : '$U \t', 'CHF' : '\t CHF'
};
// Check in user language first, then fall back to English frb.countryNames = {
'af' : { 'ZA' : 'Suid-Afrika' }, 'en' : { 'US' : 'the U.S.', 'CA' : 'Canada', 'GB' : 'the UK', 'IE' : 'Ireland', 'AU' : 'Australia', 'NZ' : 'New Zealand', 'AR' : 'Argentina', 'AT' : 'Austria', 'BE' : 'Belgium', 'BR' : 'Brazil', 'CH' : 'Switzerland', 'CL' : 'Chile', 'CO' : 'Colombia', 'DK' : 'Denmark', 'ES' : 'Spain', 'FR' : 'France', 'HK' : 'Hong Kong', 'HU' : 'Hungary', 'IL' : 'Israel', 'IN' : 'India', 'IT' : 'Italy', 'JP' : 'Japan', 'LU' : 'Luxembourg', 'LV' : 'Latvia', 'MX' : 'Mexico', 'MY' : 'Malaysia', 'NL' : 'the Netherlands', 'NO' : 'Norway', 'PE' : 'Peru', 'PL' : 'Poland', 'PT' : 'Portugal', 'RO' : 'Romania', 'SE' : 'Sweden', 'SK' : 'Slovakia', 'UA' : 'Ukraine', 'UY' : 'Uruguay', 'ZA' : 'South Africa' }, 'ca' : { 'AT' : 'd’Àustria', 'BE' : 'de Bèlgica', 'DK' : 'de Dinamarca', 'ES' : 'a Espanya', 'HU' : 'd’Hongria', 'IL' : 'd’Israel', 'LV' : 'de Letònia', 'LU' : 'de Luxemburg', 'MY' : 'de Malàisia', 'NO' : 'de Noruega', 'PL' : 'de Polònia', 'PT' : 'de Portugal', 'RO' : 'de Romania', 'SK' : 'd’Eslovàquia', 'ZA' : 'de Sud-àfrica', 'UA' : 'd’Ucraïna' }, 'es' : { 'AR' : 'en Argentina', 'AT' : 'en Austria', 'BE' : 'en Bélgica', 'BR' : 'en Brasil', 'CL' : 'en Chile', 'CO' : 'en Colombia', 'DK' : 'en Dinamarca', 'ES' : 'en España', 'HU' : 'en Hungría', 'IL' : 'en Israel', 'LU' : 'en Luxemburgo', 'LV' : 'en Letonia', 'MX' : 'en México', 'MY' : 'en Malasia ', 'NO' : 'en Noruega', 'PE' : 'en Perú', 'PL' : 'en Polonia', 'PT' : 'en Portugal', 'RO' : 'en Rumania', 'SK' : 'en Eslovaquia', 'UA' : 'en Ucrania', 'UY' : 'en Uruguay', 'ZA' : 'en Sudafrica' }, 'da' : { 'AT' : 'i Østrig', 'BE' : 'i Belgien', 'DK' : 'i Danmark', 'ES' : 'i Spanien', 'HU' : 'i Ungarn', 'IL' : 'i Israel', 'LV' : 'i Letland', 'LU' : 'i Luxembourg', 'MY' : 'i Malaysia', 'NO' : 'i Norge', 'PL' : 'i Polen', 'PT' : 'i Portugal', 'RO' : 'i Rumænien', 'SK' : 'i Slovakiet', 'ZA' : 'i Sydafrika', 'UA' : 'i Ukraine' }, 'nl' : { 'NL' : 'in Nederland', 'AT' : 'in Oostenrijk', 'BE' : 'in België', 'DK' : 'in Denemarken', 'ES' : 'in Spanje', 'HU' : 'in Hongarije', 'IL' : 'in Israël', 'LV' : 'in Letland', 'LU' : 'in Luxemburg', 'MY' : 'in Maleisië', 'NO' : 'in Noorwegen', 'PL' : 'in Polen', 'PT' : 'in Portugal', 'RO' : 'in Roemenië', 'SK' : 'in Slowakije', 'ZA' : 'in Zuid-Afrika', 'UA' : 'in Oekraïne' }, 'fr' : { 'AT' : 'en Autriche', 'BE' : 'en Belgique', 'CH' : 'en Suisse', 'CA' : 'au Canada', 'DK' : 'au Danemark', 'ES' : 'en Espagne', 'HU' : 'en Hongrie', 'IL' : 'en Israël', 'LV' : 'en Lettonie', 'LU' : 'au Luxembourg', 'MY' : 'en Malaisie', 'NO' : 'en Norvège', 'PL' : 'en Pologne', 'PT' : 'au Portugal', 'RO' : 'en Roumanie', 'SK' : 'en Slovaquie', 'ZA' : 'en Afrique du Sud', 'UA' : 'en Ukraine' }, 'de' : { 'AT' : 'in Österreich', 'BE' : 'in Belgien', 'CH' : 'in der Schweiz', 'DK' : 'in Dänemark', 'ES' : 'in Spanien', 'HU' : 'in Ungarn', 'IL' : 'in Israel', 'LV' : 'in Lettland', 'LU' : 'in Luxemburg', 'MY' : 'in Malaysia', 'NO' : 'in Norwegen', 'PL' : 'in Polen', 'PT' : 'in Portugal', 'RO' : 'in Rumänien', 'SK' : 'in der Slowakei', 'ZA' : 'in Südafrika', 'UA' : 'in der Ukraine' }, 'he' : { 'AT' : 'אוסטרליה', 'BE' : 'בלגיה', 'DK' : 'דנמרק', 'ES' : 'ספרד', 'HU' : 'הונגריה', 'IL' : 'ישראל', 'LV' : 'לטביה', 'LU' : 'לוקסמבורג', 'MY' : 'מלזיה', 'NO' : 'נורווגיה', 'PL' : 'פולין', 'PT' : 'פורטוגל', 'RO' : 'רומניה', 'SK' : 'סלובקיה', 'ZA' : 'דרום אפריקה', 'UA' : 'אוקראינה' }, 'hu' : { 'AT' : 'ausztriai', 'BE' : 'belgiumi', 'DK' : 'dániai', 'ES' : 'spanyolországi', 'HU' : 'magyarországi', 'IL' : 'izraeli', 'LV' : 'lettországi', 'LU' : 'luxemburgi', 'MY' : 'malajziai', 'NO' : 'norvégiai', 'PL' : 'lengyelországi', 'PT' : 'portugáliai', 'RO' : 'romániai', 'SK' : 'szlovákiai', 'ZA' : 'dél-afrikai', 'UA' : 'ukrajnai' }, 'it' : { 'IT' : 'Italia', 'CH' : 'Svizzera' }, 'lv' : { 'AT' : 'valstī Austrijā', 'BE' : 'valstī Beļģijā', 'DK' : 'valstī Dānijā', 'ES' : 'valstī Spānijā', 'HU' : 'valstī Ungārijā', 'IL' : 'Izraēlas valstī', 'LV' : 'valstī Latvijā', 'LU' : 'valstī Luksemburgā', 'MY' : 'valstī Malaizijā', 'NO' : 'valstī Norvēģijā', 'PL' : 'valstī Polijā', 'PT' : 'valstī Portugālē', 'RO' : 'valstī Rumānijā', 'SK' : 'valstī Slovākijā', 'ZA' : 'Dienvidāfrikas valstī', 'UA' : 'valstī Ukrainā' }, 'nb' : { 'AT' : 'i Østerrike', 'BE' : 'i Belgia', 'DK' : 'i Danmark', 'ES' : 'i Spania', 'HU' : 'i Ungarn', 'IL' : 'i Israel', 'LV' : 'i Latvia', 'LU' : 'i Luxembourg', 'MY' : 'i Malaysia', 'NO' : 'i Norge', 'PL' : 'i Polen', 'PT' : 'i Portugal', 'RO' : 'i Romania', 'SK' : 'i Slovakia', 'ZA' : 'i Sør-Afrika', 'UA' : 'i Ukraina' }, 'pl' : { 'AT' : 'w Austrii', 'BE' : 'w Belgii', 'DK' : 'w Danii', 'ES' : 'w Hiszpanii', 'HU' : 'na Węgrzech', 'IL' : 'w Izraelu', 'LV' : 'na Łotwie', 'LU' : 'w Luksemburgu', 'MY' : 'w Malezji', 'NO' : 'w Norwegii', 'PL' : 'w Polsce', 'PT' : 'w Portugalii', 'RO' : 'w Rumunii', 'SK' : 'na Słowacji', 'ZA' : 'w Republice Południowej Afryki', 'UA' : 'na Ukrainie' }, 'pt' : { 'AT' : 'na Áustria', 'BE' : 'na Bélgica', 'DK' : 'na Dinamarca', 'ES' : 'na Espanha', 'HU' : 'na Hungria', 'IL' : 'em Israel', 'LV' : 'na Letónia', 'LU' : 'no Luxemburgo', 'MY' : 'na Malásia', 'NO' : 'na Noruega', 'PL' : 'na Polónia', 'PT' : 'em Portugal', 'RO' : 'na Roménia', 'SK' : 'na Eslováquia', 'ZA' : 'na África do Sul', 'UA' : 'na Ucrânia' }, 'ro' : { 'AT' : 'din Austria', 'BE' : 'din Belgia', 'DK' : 'din Danemarca', 'ES' : 'în Spania', 'HU' : 'din Ungaria', 'IL' : 'din Israel', 'LV' : 'din Latvia', 'LU' : 'din Luxemburg', 'MY' : 'din Malaezia', 'NO' : 'din Norvegia', 'PL' : 'din Polonia', 'PT' : 'din Portugalia', 'RO' : 'din România', 'SK' : 'din Slovacia', 'ZA' : 'din Africa de Sud', 'UA' : 'din Ucraina' }, 'ru' : { 'AT' : 'в Австрии', 'BE' : 'в Бельгии', 'DK' : 'в Дании', 'ES' : 'в Испании', 'HU' : 'в Венгрии', 'IL' : 'в Израиле', 'LV' : 'в Латвии', 'LU' : 'в Люксембурге', 'MY' : 'в Малайзии', 'NO' : 'в Норвегии', 'PL' : 'в Польше', 'PT' : 'в Португалии', 'RO' : 'в Румынии', 'SK' : 'в Словакии', 'ZA' : 'в Южной Африке', 'UA' : 'в Украине' }, 'sk' : { 'AT' : 'v Rakúsku', 'BE' : 'v Belgicku', 'DK' : 'v Dánsku', 'ES' : 'v Španielsku', 'HU' : 'v Maďarsku', 'IL' : 'v Izraeli', 'LV' : 'v Lotyšsku', 'LU' : 'v Luxembursku', 'MY' : 'v Malajzii', 'NO' : 'v Nórsku', 'PL' : 'v Poľsku', 'PT' : 'v Portugalsku', 'RO' : 'v Rumunsku', 'SK' : 'na Slovensku', 'ZA' : 'v Juhoafrickej republike', 'UA' : 'na Ukrajine' }, 'sv' : { 'SE' : 'i Sverige' }, 'uk' : { 'AT' : 'у Австрії', 'BE' : 'у Бельгії', 'DK' : 'у Данії', 'ES' : 'в Іспанії', 'HU' : 'в Угорщині', 'IL' : 'в Ізраїлі', 'LV' : 'у Латвії', 'LU' : 'у Люксембургу', 'MY' : 'у Малайзії', 'NO' : 'у Норвегії', 'PL' : 'у Польщі', 'PT' : 'у Португалії', 'RO' : 'у Румунії', 'SK' : 'у Словаччині', 'ZA' : 'у ПАР', 'UA' : 'в Україні' }
};
frb.dayNames = {
'en' : [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ], 'ca' : [ 'diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte' ], 'ja' : [ '日', '月', '火', '水', '木', '金', '土' ], 'es' : [ 'domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado' ], 'sv' : [ 'söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag' ], 'da' : [ 'søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag' ], 'nb' : [ 'søndagen', 'mandagen', 'tirsdagen', 'onsdagen', 'torsdagen', 'fredagen', 'lørdagen' ], 'it' : [ 'domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato' ], 'nl' : [ 'zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag' ], 'fr' : [ 'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi' ], 'de' : [ 'Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag' ], 'he' : [ 'ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת' ], 'lv' : [ 'svētdienā', 'pirmdienā', 'otrdienā', 'trešdienā', 'ceturtdienā', 'piektdienā', 'sestdienā' ], 'pl' : [ 'niedzielę', 'poniedziałek', 'wtorek', 'środę', 'czwartek', 'piątek', 'sobotę' ], 'pt' : [ 'neste domingo', 'nesta segunda-feira', 'nesta terça-feira', 'nesta quarta-feira', 'nesta quinta-feira', 'nesta sexta-feira', 'neste sábado' ], 'ru' : [ 'воскресенье', 'понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу' ], 'uk' : [ 'неділі', 'понеділка', 'вівторка', 'середи', 'четверга', 'п’ятниц', 'суботи' ], 'hu' : [ 'vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat' ], 'ro' : [ 'duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă' ], 'af' : [ 'Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag' ], 'aa' : [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ]
};
// "This fooday" translations. Needed for some languages where gender varies and "this" must agree frb.dayNamesThis = {
'en' : [ 'this Sunday', 'this Monday', 'this Tuesday', 'this Wednesday', 'this Thursday', 'this Friday', 'this Saturday' ], 'jp' : [ 'この日曜日', 'この月曜日', 'この火曜日', 'この水曜日', 'この木曜日', 'この金曜日', 'この土曜日' ], 'it' : [ 'questa domenica', 'questo lunedì', 'questo martedì', 'questo mercoledì', 'questo giovedì', 'questo venerdì', 'questo sabato'], 'pl' : [ 'w tę niedzielę', 'w ten poniedziałek', 'w ten wtorek', 'w tę środę', 'w ten czwartek', 'w ten piątek', 'w tę sobotę' ], 'ru' : [ 'в это воскресенье', 'в этот понедельник', 'в этот вторник', 'в эту среду', 'в этот четверг', 'в эту пятницу', 'в эту субботу' ], 'uk' : [ 'цієї неділі', 'цього понеділка', 'цього вівторка', 'цієї середи', 'цього четверга', 'цієї п’ятниці', 'цієї суботи' ], 'pt' : [ 'este domingo', 'esta segunda-feira', 'esta terça-feira', 'esta quarta-feira', 'esta quinta-feira', 'esta sexta-feira', 'este sábado'], 'sk' : [ 'túto nedeľu', 'tento pondelok', 'tento utorok', 'túto stredu', 'tento štvrtok', 'tento piatok', 'túto sobotu']
};
frb.iPadTranslations = {
'en' : 'iPad'
}; /* jshint maxerr: 600 */ /* MediaWiki:FundraisingBanners/CoreJS-2018.js
* Core code for banner forms, with new inline error messages */
var frb = frb || {};
if ( !mw.centralNotice.adminUi ) { // T262693
frb.loadedTime = Date.now(); frb.didSelectAmount = false; frb.optinRequiredCountries = [ 'AR', 'AT', 'BE', 'BR', 'CL', 'CO', 'DK', 'ES', 'FR', 'GB', 'HU', 'IE', 'IT', 'IL', 'LU', 'LV', 'MX', 'NL', 'NO', 'PE', 'PL', 'PT', 'RO', 'SE', 'SK', 'UA', 'UY' ]; frb.optinRequired = frb.optinRequiredCountries.indexOf(mw.centralNotice.data.country) !== -1; frb.maxUSD = 25000; frb.reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
}
// Keyboard shortcut to go from banner preview to editor - Ctrl+Shift+E if ( mw.config.get('wgUserName') ) {
if ( mw.config.get('wgUserName').match(/\(WMF\)/) ) { window.addEventListener('keydown', function(e) { if ( e.ctrlKey && e.shiftKey && e.keyCode === 69 ) { window.open( 'https://meta.wikimedia.org/wiki/Special:CentralNoticeBanners/Edit/' + mw.centralNotice.data.banner ); } }); }
}
/**
* Main function to submit to paymentswiki * * @param {Object} options * - method (required) * - submethod (optional) * - gateway (optional) * - skipValidation (optional boolean, for pp-usd. Not yet implemented.) * @param {Boolean} isEndowment - deprecated, set frb.isEndowment instead */
frb.submitForm = function( options, isEndowment ) {
var uri = new mw.Uri('https://payments.wikimedia.org/index.php/Special:GatewayChooser'); var params = {};
if ( !frb.validateForm( options ) ) { frb.extraData.validateError = 1; // Flag they had an error, even if fixed later return false; // Error, bail out of submitting }
// Skip form chooser for Apple Pay / Google Pay if ( options.method === 'apple' || options.method === 'google' ) { uri = new mw.Uri('https://payments.wikimedia.org/index.php/Special:AdyenCheckoutGateway'); }
// Form selection data params.payment_method = options.method; if ( options.submethod ) { params.payment_submethod = options.submethod; } if ( options.gateway ) { params.gateway = options.gateway; } if ( options.variant ) { params.variant = options.variant; } params.recurring = frb.getRecurring();
if ( params.recurring && params.variant && params.variant.match( /monthlyConvert/ ) ) { // Post-payments monthly convert makes no sense if it's already recurring // Avoid things like T312905 delete params.variant; }
params.currency = frb.getCurrency(mw.centralNotice.data.country) || 'USD';
params.uselang = mw.centralNotice.data.uselang || 'en'; params.country = mw.centralNotice.data.country || 'XX';
if ( params.uselang === 'pt' && params.country === 'BR' ) { params.uselang = 'pt-br'; } if ( params.uselang === 'es' && ( params.country === 'AR' || params.country === 'CL' || params.country === 'CO' || params.country === 'MX' || params.country === 'PE' || params.country === 'UY' || params.country === 'US' ) ) { params.uselang = 'es-419'; }
// Adyen override. frb.ccAdyenCountries is defined in LocalizeJS-2017.js if ( params.payment_method === 'cc' && frb.ccAdyenCountries.indexOf( params.country ) !== -1 ) { params.gateway = 'adyen'; } // dLocal override for South Africa if ( params.payment_method === 'cc' && params.country === 'ZA' ) { params.gateway = 'astropay'; }
// Amount var amount = frb.getAmount(); if ( $('#frb-ptf-checkbox').prop('checked') ) { amount = amount + frb.calculateFee(amount); frb.extraData.ptf = 1; } params.amount = amount;
// Email optin if ( $('input[name="opt_in"]').length > 0 ) { var opt_inValue = $('input[name="opt_in"]:checked').val(); params.opt_in = opt_inValue; // frb.validateForm() already checked it's 1 or 0 }
// Tracking info if ( isEndowment || frb.isEndowment ) { params.utm_medium = 'endowment'; params.appeal = 'EndowmentQuote'; } else { params.utm_medium = 'sitenotice'; } params.utm_campaign = mw.centralNotice.data.campaign || 'test'; params.utm_source = frb.buildUtmSource(params);
frb.extraData.vw = window.innerWidth; frb.extraData.vh = window.innerHeight; frb.extraData.time = Math.round( (Date.now() - frb.loadedTime)/1000 );
if ( navigator.brave !== undefined ) { // T283367 frb.extraData.brave = '1'; }
if ( !$.isEmptyObject( frb.extraData ) ) { params.utm_key = frb.buildUtmKey( frb.extraData ); }
// Link to Banner History if enabled var mixins = mw.centralNotice.getDataProperty( 'mixins' ); if ( mixins && mixins.bannerHistoryLogger ) { params.bannerhistlog = mw.centralNotice.bannerHistoryLogger.id; }
uri.extend(params);
// Set a cookie with current location so we can return here from TY page mw.loader.using( [ 'mediawiki.cookie', 'mediawiki.util' ] ).then( function () { // Exclude URL parameters like banner, but cope with paths like /w/index.php?title=Foo var returnToUrl = window.location.origin + mw.util.getUrl(); mw.cookie.set( 'fundraising_returnTo', returnToUrl, { expires: 300, prefix: , domain: '.wikipedia.org', secure: true } ); });
if ( mixins && mixins.bannerHistoryLogger ) { mw.centralNotice.bannerHistoryLogger.ensureLogSent().always(function() { frb.goToPayments( uri ); }); } else { frb.goToPayments( uri ); }
};
frb.goToPayments = function( uri ) {
if ( window.top !== window.self ) { // banner is in a frame, open payments in a new tab window.open( uri.toString() ); } else { window.location.href = uri.toString(); }
};
/**
* Check the form for errors. * * Called on submission, can also be called on input * * @param {object} options * @return {boolean} Whether form is error-free */
frb.validateForm = function( options ) {
var error = false;
/* Reset all errors */ $('.frb-haserror').removeClass('frb-haserror'); $('.frb-error').hide();
if ( !options.method ) { error = true; $('.frb-methods').addClass('frb-haserror'); $('.frb-error-method').show(); }
if ( !frb.validateAmount() ) { error = true; }
/* Email optin */ if ( frb.optinRequired && $('.frb-optin').is(':visible') ) { var opt_inValue = $('input[name="opt_in"]:checked').val(); if ( opt_inValue !== '1' && opt_inValue !== '0' ) { $('.frb-optin').addClass('frb-haserror'); $('.frb-error-optin').show(); error = true; } }
return !error;
};
/**
* Check if selected amount is valid i.e. a positive number, between minimum and maximum. * If not, show an error and return false. */
frb.validateAmount = function() {
var amount = frb.getAmount(), currency = frb.getCurrency( mw.centralNotice.data.country ), minAmount = frb.amounts.minimums[ currency ], maxAmount = Math.round( frb.maxUSD * minAmount ); // Math.round to account for floating point math errors: https://phabricator.wikimedia.org/T246262
if ( amount === null || isNaN(amount) || amount <= 0 || amount < minAmount ) { $('fieldset.frb-amounts').addClass('frb-haserror'); $('.frb-error-bigamount').hide(); $('.frb-error-smallamount').show(); return false; } else if ( amount > Math.round( maxAmount ) ) { $('fieldset.frb-amounts').addClass('frb-haserror'); $('.frb-error-bigamount').show(); return false; } else { $('fieldset.frb-amounts').removeClass('frb-haserror'); $('.frb-error-smallamount, .frb-error-bigamount').hide(); return true; }
};
/**
* Build the utm_source for analytics. * * Own function so it can be overriden for weird tests * * @param {Object} params * @return {string} utm_source */
frb.buildUtmSource = function(params) {
var utm_source; var fullDottedPaymentMethod = params.payment_method; if ( params.recurring ) { fullDottedPaymentMethod = 'r' + fullDottedPaymentMethod; } if ( params.payment_submethod ) { fullDottedPaymentMethod = fullDottedPaymentMethod + '.' + params.payment_submethod; }
utm_source = mw.centralNotice.data.banner;
// Keeping opt-in in utm_source for safety for now // Eventually remove it, or move to utm_key? if ( params.opt_in ) { utm_source += '_optIn' + params.opt_in; }
utm_source += '.no-LP.' + fullDottedPaymentMethod;
return utm_source;
};
/**
* Build a string for utm_key from extra tracking data * * @param {Object} data * @return {string} utm_key */
frb.buildUtmKey = function(data) {
var dataArray = []; for (var key in data) { if (data.hasOwnProperty(key)) { dataArray.push( key + '_' + data[key] ); } } return dataArray.join('~');
};
/**
* Determine if we should show recurring choice on step 2 * * @param {Object} options Including method and optional gateway * @param {String} country * @return {boolean} */
frb.shouldShowRecurring = function( options, country ) {
if ( frb.isEndowment ) { return false; } if ( frb.noRecurringCountries.indexOf( country ) !== -1 ) { // Defined in LocalizeJS-2017.js return false; } if ( options.method === undefined ) { return true; // Show if a method hasn't been selected yet } if ( [ 'cc', 'paypal', 'apple', 'google' ].indexOf( options.method ) !== -1 ) { return true; } // Adyen iDEAL if ( options.submethod === 'rtbt_ideal' ) { return true; } return false;
};
/* Is recurring method selected? This function can be overriden for different forms */ frb.getRecurring = function() {
// Can't use simple form.frequency.value, doesn't work in IE var selected = $('#frb-form input[name="frequency"]:checked').val(); return selected === 'monthly';
};
/* Return amount selected */ frb.getAmount = function() {
var form = document.getElementById('frb-form'); var amount = null; frb.extraData.otherAmt = 0;
// If there are some amount radio buttons, then look for the checked one if (form.amount) { for (var i = 0; i < form.amount.length; i++) { if (form.amount[i].checked) { amount = form.amount[i].value; } } }
// Check the "other" amount box if (form.otherAmount.value !== ) { var otherAmount = form.otherAmount.value; otherAmount = otherAmount.replace(/[,.](\d)$/, ':$10'); otherAmount = otherAmount.replace(/[,.](\d)(\d)$/, ':$1$2'); otherAmount = otherAmount.replace(/[$£€¥,.]/g, ); otherAmount = otherAmount.replace(/:/, '.'); amount = otherAmount; frb.extraData.otherAmt = 1; }
amount = parseFloat(amount);
if ( isNaN(amount) ) { return 0; } else { return amount; }
};
/* Localize the amount errors. Call when initialising banner. */ frb.localizeErrors = function() {
var currency = frb.getCurrency( mw.centralNotice.data.country ), language = mw.centralNotice.data.uselang, minAmount = frb.amounts.minimums[ currency ], maxAmount = Math.round( frb.maxUSD * minAmount ); // Math.round to account for floating point math errors: https://phabricator.wikimedia.org/T246262
$('.frb-error-smallamount').text( function( index, oldText ) { return oldText.replace( '$1', frb.formatCurrency(currency, minAmount, language) ); });
$('.frb-error-bigamount').text( function( index, oldText ) { // We cannot accept donations greater than $1 $2 through our website. Please contact our major gifts staff at $3. return oldText.replace( '$1', maxAmount ) .replace( '$2', currency ) .replace( '$3', 'benefactors@wikimedia.org' ); });
};
/**
* Shared code for amount input handling */
frb.initAmountOptions = function() {
// Reset "Other" input if user clicks a preset amount $('#frb-form [id^=frb-amt-ps]').click(function() { $('#frb-amt-other-input').val(); });
// Track if they selected and then later changed amount var checkAmountChange = function(e) { if ( frb.didSelectAmount ) { frb.extraData.changedAmt = 1; } // check if amount radio button is selected OR there is a value in the other amount if ( $('.frb-amounts input[type="radio"]:checked').val() !== 'Other' || $('#frb-amt-other-input').val().length > 0 ) { frb.didSelectAmount = true; } return; };
$('.frb-amounts input[type="radio"]').on('change', checkAmountChange); $('#frb-amt-other-input').on('focusout', checkAmountChange);
// Block typing non-numerics in input field, otherwise Safari allows them and then chokes // https://phabricator.wikimedia.org/T118741, https://phabricator.wikimedia.org/T173431 var blockNonNumeric = function(e) { // Allow special keys in Firefox if ((e.code == 'ArrowLeft') || (e.code == 'ArrowRight') || (e.code == 'ArrowUp') || (e.code == 'ArrowDown') || (e.code == 'Delete') || (e.code == 'Backspace')) { return; } var chr = String.fromCharCode(e.which); if ("0123456789., ".indexOf(chr) === -1) { return false; } }; $('#frb-amt-other-input').on('keypress', blockNonNumeric); $('#frb-amt-monthly-other-input').on('keypress', blockNonNumeric);
};
/**
* Calculate approximate transaction fee on given amount * * @param {number} amount * @return {number} Rounded to 2 decimal places */
frb.calculateFee = function(amount) {
var currency = frb.getCurrency(mw.centralNotice.data.country), feeMultiplier = 0.04, feeMinimum = frb.amounts.feeMinimums[currency] || 0.35, feeAmount = amount * feeMultiplier;
if ( feeAmount < feeMinimum ) { feeAmount = feeMinimum; } return parseFloat(feeAmount.toFixed(2));
};
frb.updateFeeDisplay = function() {
var currency = frb.getCurrency(mw.centralNotice.data.country), language = mw.centralNotice.data.uselang, amount, feeAmount, totalAmount;
amount = frb.getAmount(); feeAmount = frb.calculateFee(amount); if ( $('#frb-ptf-checkbox').prop('checked') ) { totalAmount = amount + feeAmount; } else { totalAmount = amount; }
var feeAmountFormatted = frb.formatCurrency(currency, feeAmount, language); $('.frb-ptf-fee').text(feeAmountFormatted);
var totalAmountFormatted = frb.formatCurrency(currency, totalAmount, language); $('.frb-ptf-total').text(totalAmountFormatted);
$('.frb-ptf').slideDown( frb.reduceMotion ? 0 : 400 );
};
/**
* Custom hide cookie function * * Purposely sets only for this domain. * CentralNotice builtin method seems buggy - see T270401 * * @param {string} reason Reason to store in the hide cookie * @param {number} duration Cookie duration, in seconds */
frb.altSetHideCookie = function ( reason, duration ) {
var cookieName = 'centralnotice_hide_fundraising', date = new Date(), hideData = { v: 1, created: Math.floor( date.getTime() / 1000 ), reason: reason };
// Re-use the same date object to set the cookie's expiry time date.setSeconds( date.getSeconds() + duration );
$.cookie( cookieName, JSON.stringify( hideData ), { expires: date, path: '/', domain: 'wikipedia.org' } );
};
/**
* Determine if banner should be shown, and set correct data for impression logging * * @return {boolean} Show banner? */
frb.shouldShowBanner = function() {
mw.centralNotice.bannerData.hideResult = false;
/* Hide in Internet Explorer */ if ( window.document.documentMode ) { mw.centralNotice.bannerData.hideResult = true; mw.centralNotice.bannerData.hideReason = 'browser'; }
/* Hide outside main namespace (except Main Page, for sites where it isn't in main namespace) */ if ( mw.config.get('wgNamespaceNumber') > 0 && !mw.config.get('wgIsMainPage') ) { mw.centralNotice.bannerData.hideResult = true; mw.centralNotice.bannerData.hideReason = 'namespace'; }
// Hide banner on sensitive articles // TODO - possibly add wgWikibaseItemId for multilingual support and resilience to moves? var hideTitles = [ 'Murder of Don Banfield' ]; if ( hideTitles.indexOf( mw.config.values.wgTitle ) !== -1 ) { mw.centralNotice.bannerData.hideResult = true; mw.centralNotice.bannerData.hideReason = 'article'; }
/* Hide banner if on wrong site (desktop/mobile) in case wrong device settings were chosen */ var bannerName = mw.centralNotice.data.banner, skin = mw.config.get('skin'); if ( ( bannerName.indexOf('_dsk_') !== -1 && skin === 'minerva' ) || ( bannerName.indexOf('_m_') !== -1 && skin !== 'minerva' ) ) { mw.centralNotice.bannerData.hideResult = true; mw.centralNotice.bannerData.hideReason = 'other'; console.warn('Hiding fundraising banner on wrong site (desktop/mobile)'); }
return !mw.centralNotice.bannerData.hideResult;
};
/* Debug function to highlight dynamically replaced elements */ frb.highlightReplacements = function() {
$('.frb [class^="frb-replace"], .frb-ptf-fee, .frb-ptf-total, .frb-upsell-ask, frb-amt').css('background-color', '#fa0');
};
if ( !mw.centralNotice.adminUi ) { // T262693
/** * Provides alterImpressionData hook for CentralNotice * This info will be sent back with Special:RecordImpression * TODO: check if/when we can remove this (and RecordImpression) */ mediaWiki.centralNotice.bannerData.alterImpressionData = function( impressionData ) { // Returning true from this function indicates the banner was shown if (mediaWiki.centralNotice.bannerData.hideReason) { impressionData.reason = mediaWiki.centralNotice.bannerData.hideReason; } if (mediaWiki.centralNotice.bannerData.cookieCount) { impressionData.banner_count = mediaWiki.centralNotice.bannerData.cookieCount; }
return !mediaWiki.centralNotice.bannerData.hideResult; };
}
/* End of MediaWiki:FundraisingBanners/CoreJS-2018.js */ /* jshint maxerr: 600 */ /* == MediaWiki:FundraisingBanners/LocalizeJS-2017.js == */
/**
* Get the currency for a given country * * NOTE: The following currency mapping is WMF-specific based on payment * provider availability, NOT necessarily the official currency of the country * * @param {string} country code * @return {string} currency code */
frb.getCurrency = function(country) {
switch ( country ) { // Big 6 case 'US': return 'USD'; case 'CA': return 'CAD'; case 'AU': return 'AUD'; case 'NZ': return 'NZD'; case 'GB': return 'GBP'; case 'IE': return 'EUR'; // Euro countries case 'AT': case 'BE': case 'ES': case 'FR': case 'IE': case 'IT': case 'LU': case 'LV': case 'NL': case 'PT': case 'SK': return 'EUR'; // Others case 'DK': return 'DKK'; case 'HU': return 'HUF'; case 'IL': return 'ILS'; case 'IN': return 'INR'; case 'JP': return 'JPY'; case 'MY': return 'MYR'; case 'NO': return 'NOK'; case 'PL': return 'PLN'; case 'RO': return 'RON'; case 'SE': return 'SEK'; case 'UA': return 'UAH'; case 'ZA': return 'ZAR'; // Latin America case 'BR': return 'BRL'; case 'AR': return 'ARS'; case 'CL': return 'CLP'; case 'CO': return 'COP'; case 'MX': return 'MXN'; case 'PE': return 'PEN'; case 'UY': return 'UYU'; case 'CH': return 'CHF'; // Fall back to USD default: return 'USD'; }
};
/**
* Format a currency value * * @param {string} currency code. Leave undefined to get without symbol. * @param {number} amount * @param {string} language code * @return {string} formatted string e.g. '$3', '£5', '10 €' */
frb.formatCurrency = function(currency, amount, language) {
var locale, formatterOptions, formatter, fmAmount, supportsIntl;
if ( isNaN(amount) || amount === ) { // Not a number, it's probably the 'other' string or box // TODO: better way of doing this? fmAmount = amount; } else { // Check browser support try { supportsIntl = typeof window.Intl === 'object'; } catch (e) { supportsIntl = false; // T265396 }
if ( supportsIntl ) { // Use Intl for fancy number formatting - thousands separators etc locale = language + '-' + mw.centralNotice.data.country; if ( amount % 1 !== 0 ) { formatterOptions = { minimumFractionDigits: 2 }; } else { formatterOptions = {}; } formatter = new Intl.NumberFormat(locale, formatterOptions); } else { // Bad browser i.e. IE. Just do the basics: 2 decimal places if needed, or none formatter = {}; formatter.format = function(number) { if ( amount % 1 !== 0 ) { return number.toFixed(2); } else { return number.toString(); } }; } fmAmount = formatter.format(amount); }
// No symbol needed if ( currency === undefined ) { return fmAmount; }
// Better dive into the formatting object if ( frb.currencyFormats[currency] === undefined ) { return currency + ' ' + fmAmount; } if ( frb.currencyFormats[currency] instanceof Object ) { // not a string if ( frb.currencyFormats[currency][language] !== undefined ) { return frb.currencyFormats[currency][language].replace('\t', fmAmount); } return frb.currencyFormats[currency]['default'].replace('\t', fmAmount); }
return frb.currencyFormats[currency].replace('\t', fmAmount);
};
/*
* Select the correct amount or array of amounts from object in "source" * * @param {Object} source - the amounts data object e.g. frb.amounts.options7, frb.amounts.averages * @param {string} currency - ISO code of currency * @param {string} country - ISO code of country (optional) * @return {array/number} - depending on source */
frb.pickAmounts = function(source, currency, country) {
if ( source[currency]['default'] ) { // we need to go deeper if ( source[currency][country] !== undefined ) { return source[currency][country]; } else { return source[currency]['default']; } } else { return source[currency]; }
};
/* Credit card types so we can show the correct logos */ frb.cardTypes = {
// Big 6 'US' : 'vmad', 'CA' : 'vma', 'GB' : 'vmaj', 'IE' : 'vmaj', 'AU' : 'vmaj', 'NZ' : 'vma', // Euro countries 'AT' : 'vmaj', 'BE' : 'vmaj', 'ES' : 'vmaj', 'FR' : 'vma', // Adyen 'IT' : 'vmaj', 'LU' : 'vmaj', 'LV' : 'vma', 'NL' : 'vmaj', // Adyen 'PT' : 'vmaj', 'SK' : 'vmaj', // Others 'DK' : 'vma', 'HU' : 'vma', 'IL' : 'vmad', // Adyen 'JP' : 'vmj', 'MY' : 'vmaj', 'NO' : 'vma', 'PL' : 'vma', 'RO' : 'vma', 'SE' : 'vma', 'UA' : 'vma', // Adyen 'ZA' : 'vm', 'IN' : 'vmar' // dLocal
};
/**
* Should we show Apple Pay? * * Note there is a ~500ms delay in Safari when checking, so only call this if needed * * @param {string} country * @return {boolean} */
frb.shouldShowApplePay = function ( country ) {
// https://support.apple.com/en-us/HT207957 - minus China mainland var appleCountries = [ 'ZA', 'AU', 'HK', 'JP', 'MO', 'NZ', 'SG', 'TW', 'AM', 'AT', 'AZ', 'BY', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GG', 'HU', 'IS', 'IE', 'IM', 'IT', 'KZ', 'JE', 'LV', 'LI', 'LT', 'LU', 'MT', 'MC', 'ME', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'SM', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'UA', 'GB', 'VA', 'CO', 'CR', 'BR', 'MX', 'BH', 'IL', 'PS', 'QA', 'SA', 'AE', 'CA', 'US' ]; if ( appleCountries.indexOf( country ) === -1 ) { return false; } if ( location.search.match('forceApplePay') ) { return true; } if ( window.ApplePaySession ) { if ( ApplePaySession.canMakePayments() ) { return true; } } return false;
};
/**
* Display the correct payment methods for current country * * Methods should be labeled with class 'frb-pm-xxxx' * TODO: clean this function up more * * @param {string} country */
frb.localizeMethods = function(country) {
// Test country with *all the methods* if ( country === 'ZZ' ) { $('.frb-payment-options > div').show(); return; }
// Hide recurring completely for some countries and endowment if ( frb.isEndowment || frb.noRecurringCountries.indexOf(country) !== -1 ) { $('.frb-frequency, .recurring-details').hide(); }
// Remove any leftover WorldPay and Adyen $('.frb-pm-cc-wp').remove(); $('.frb-pm-cc-adyen').remove();
// Monthly Adyen credit card is allowed now // if ( frb.ccAdyenCountries.indexOf( country ) !== -1 ) { // $('.frb-pm-cc').addClass('no-monthly'); // }
// Countries with no PayPal option var noPP = ['IN', 'RU', 'SG', 'AE', 'QA', 'OM', 'BD', 'BO', 'PA', 'PY', 'GT', 'JM', 'TT', 'DZ']; if ($.inArray(country, noPP) !== -1) { $('.frb-pm-pp').remove(); $('.frb-pm-pp-usd').remove(); }
// Countries with no PayPal for mobile only - https://phabricator.wikimedia.org/T173001 var noPPmobile = ['PH', 'ID', 'TH', 'KR', 'MY', 'VN']; var mobileRegex = /(_mob_|_ipd_|_m_)/; if ($.inArray(country, noPPmobile) !== -1) { if (mw.centralNotice.data.banner.search(mobileRegex) !== -1) { $('.frb-pm-pp').remove(); $('.frb-pm-pp-usd').remove(); } }
// Countries where PayPal must be in USD var ppUSD = ['BG', 'HR', 'LT', 'MK', 'RO', 'UA', 'SA', 'CN', 'ID', 'KR', 'KZ', 'MY', 'VN', 'AR', 'CL', 'DO', 'CO', 'NI', 'UY', 'ZA', 'BH', 'LB', 'VE', 'TR', 'IS', 'BA', 'MV', 'BB', 'BM', 'BZ', 'CR', 'CW', 'SX', 'HN', 'KN', 'DM', 'AG', 'LC', 'GD', 'FJ', 'TN', 'BJ', 'BF', 'CI', 'GW', 'ML', 'NE', 'SN', 'TG', 'BR', 'PE']; if ($.inArray(country, ppUSD) !== -1) { $('.frb-pm-pp').remove(); $('.frb-pm-pp-usd').show(); } else { $('.frb-pm-pp').show(); $('.frb-pm-pp-usd').remove(); }
// Show any extra local payment methods, or remove them if not needed var extrapaymentmethods = { 'amazon' : ['US'], 'bpay' : [], 'ideal' : ['NL'], 'bt' : ['BR', 'AR', 'CO', 'CL', 'PE', 'IN', 'ZA'], // Bank Transfer (Astropay) 'cash' : ['BR', 'MX', 'AR', 'CO', 'PE', 'UY'], // 'Cash' methods (Astropay) 'pix' : ['BR'] };
// Methods with different labels per country
var language = mw.config.get('wgUserLanguage'); var cashTranslation = 'Cash'; var btTranslation = 'Bank Transfer';
if (language === 'en') {
if (country === 'BR') { cashTranslation = 'Boleto'; }
} else if (language === 'pt') {
if (country === 'BR') { btTranslation = 'Transferência Bancária'; cashTranslation = 'Boleto'; }
} else if (language === 'es') {
if (country === 'AR') { btTranslation = 'Transferencia Bancaria'; cashTranslation = 'Efectivo'; } if (country === 'CL') { btTranslation = 'WebPay'; } if (country === 'CO') { btTranslation = 'PSE Pagos'; cashTranslation = 'Efectivo'; } if (country === 'MX') { cashTranslation = 'Efectivo'; } if (country === 'PE') { btTranslation = 'Transferencia Bancaria'; cashTranslation = 'Efectivo'; } if (country === 'UY') { cashTranslation = 'Efectivo'; }
}
$('.frb-pm-bt button, .frb-pm-bt label, button.frb-pm-bt' ).text( btTranslation ); $('.frb-pm-cash button, .frb-pm-cash label, button.frb-pm-cash').text( cashTranslation );
for (var method in extrapaymentmethods) { var $methodbutton = $('.frb-pm-' + method); if ( $.inArray(country, extrapaymentmethods[method]) !== -1 && !frb.isEndowment ) { $methodbutton.show(); } else { $methodbutton.remove(); } }
// Google Pay - separated from extrapaymentmethods as we want to show on Endowment too var googlePayCountries = [ 'AE', 'AT', 'AU', 'BE', 'BG', 'BR', 'CA', 'CH', 'CL', 'CO', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FR', 'GB', 'GR', 'HK', 'HR', 'HU', 'IE', 'IL', 'IT', 'JP', 'LU', 'LV', 'MX', 'MY', 'NL', 'NO', 'NZ', 'OM', 'PL', 'PT', 'QA', 'RO', 'RU', 'SA', 'SE', 'SG', 'SK', 'TH', 'TR', 'TW', 'UA', 'US', 'VN', 'ZA' ]; if ( $.inArray(country, googlePayCountries) !== -1 ) { $('.frb-pm-google').show(); } else { $('.frb-pm-google').remove(); }
// Apple Pay if ( $('.frb-pm-applepay').length > 0 ) { if ( !frb.shouldShowApplePay( country ) ) { $('.frb-pm-applepay').remove(); } }
/* Add card types class to credit card button, so we can show correct logos */ if ( frb.cardTypes[country] ) { $('.frb-pm-cc').addClass('frb-cctypes-' + frb.cardTypes[country] ); }
};
/**
* Check scheduled payment method outages and hide buttons if needed * * Data at https://meta.wikimedia.org/wiki/MediaWiki:FR2013/Resources/PaymentOutages.js * Methods should be labeled with class 'frb-pm-xxxx' * * @param {string} country code */
frb.checkMethodOutages = function(country) {
// TODO - can we load this a better way? MediaWiki:FR2013/Resources/PaymentOutages.js // jshint ignore:line var now = new Date();
for (var i = outages.length - 1; i >= 0; i--) { if ( now > outages[i].start && now < outages[i].end ) { if (outages[i].country === undefined || outages[i].country == country) { $('.frb-pm-' + outages[i].method).hide(); } } }
};
/**
* Adjust the amount options and their labels * * Inputs should have id frb-amt-psX where X is the index number (starting from 1) * * @param {Object} source - object with amounts e.g. frb.amounts.options7 * @param {string} currency - currency code e.g. 'USD' * @param {string} country - country code e.g. 'FR' Some currencies can have different options per country. * @param {string} language - language code e.g. 'en' For symbol formatting * @param {boolean} useSymbols - use currency symbols on labels or not? (3 vs $3) */
frb.localizeAmountOptions = function(source, currency, country, language, useSymbols) {
var amountOptions = frb.pickAmounts(source, currency, country);
$('#frb-form input[name="amount"]').each(function(index) { var $input = $(this); var $label = $input.siblings('label');
var i = $input.attr('id').replace('frb-amt-ps', ); var amount = amountOptions[i-1]; // because IDs start from 1
if ( amount ) { $input.val( amount ); if ( useSymbols ) { $label.text( frb.formatCurrency( currency, amount, language) ); } else { $label.text( frb.formatCurrency( undefined, amount, language) ); } } });
};
/**
* Make an element into a link * * @param {string} selector CSS selector for elements to convert to a link * @param {string} language Code of language (could be es-419 or pt-br) * @param {string} baseUrl URL of link (function will add language parameter) */
frb.makeLink = function( selector, language, baseUrl ) {
var url = baseUrl + '&language=' + language; $( selector ).each( function() { var $link = $( '<a></a>' ); $link.html( $( this ).html() ); $link.attr( { href: url, target: '_blank' } ); $( this ).replaceWith( $link ); });
};
/**
* Get the number of banners seen from localStorage * @return {number} Number of banners seen */
frb.getSeenCount = function () {
// Force with URL parameter 'impression' if ( typeof URLSearchParams === 'function' ) { // not available in old browsers var urlParams = new URLSearchParams( window.location.search ); if ( urlParams.has( 'impression' ) ) { return urlParams.get( 'impression' ); } }
try { if ( localStorage ) { var identifier = mw.centralNotice.internal.state.campaign.mixins.impressionDiet.cookieName, lsName = 'CentralNoticeKV|global|impression_diet_' + identifier, diet = JSON.parse( localStorage.getItem( lsName ) ); if ( diet ) { return diet.val.seenCount; } } } catch ( ex ) { // do nothing - localStorage is configured not to let us read it, or mixin not set return; }
};
/**
* Replace placeholders with number of banners seen * @param {string} Language code */
frb.replaceSeenCount = function( language ) {
var ordinalNums = { 'en' : [ , '1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th' ], 'ja' : [ , '初めて', '2回目', '3回目', '4回目', '5回目', '6回目', '7回目', '8回目', '9回目', '10回目' ], 'fr': [ , '1er', '2e', '3e', '4e', '5e', '6e', '7e', '8e', '9e', '10e' ], 'nl' : [ , '1e', '2e', '3e', '4e', '5e', '6e', '7e', '8e', '9e', '10e' ] }, ordinalWords = { 'en' : [ , 'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth', 'tenth' ], 'it' : [ , 'la prima', 'la seconda', 'la terza', 'la quarta', 'la quinta', 'la sesta', 'la settima', "l'ottava", 'la nona', 'la decima' ], 'sv' : [ , 'första', 'andra', 'tredje', 'fjärde', 'femte', 'sjätte', 'sjunde', 'åttonde', 'nionde', 'tionde' ], 'es' : [ , 'primera', 'segunda', 'tercera', 'cuarta', 'quinta', 'sexta', 'séptima', 'octava', 'novena', 'décima' ], 'pt' : [ , 'primeira', 'segunda', 'terceira', 'quarta', 'quinta', 'sexta', 'sétima', 'oitava', 'nona', 'décima' ], 'aa' : [ , 'primera', 'segunda', 'tercera', 'cuarta', 'quinta', 'sexta', 'séptima', 'octava', 'novena', 'décima' ], 'ja' : [ , '初めて', '2回目', '3回目', '4回目', '5回目', '6回目', '7回目', '8回目', '9回目', '10回目' ], 'fr' : [ , 'première', 'deuxième', 'troisième', 'quatrième', 'cinquième', 'sixième', 'septième', 'huitième', 'neuvième', 'dixième' ], 'de' : [ , 'erste', 'zweite', 'dritte', 'vierte', 'fünfte', 'sechste', 'siebente', 'achte', 'neunte', 'zehnte' ] }, textFragments = { 'en' : [ 'for the 1st time recently', 'for the 2nd time recently', 'for the 3rd time recently', 'for the 4th time recently', 'for the 5th time recently', 'for the 6th time recently', 'for the 7th time recently', 'for the 8th time recently', 'for the 9th time recently', 'for the 10th time recently' ] }; var getReplaceText = function( data, language, seenCount ) { if ( data[ language ] ) { return data[ language ][ seenCount ]; } else { return data[ 'en' ][ seenCount ]; } };
var seenCount = frb.getSeenCount(); if ( seenCount ) { $( '.frb-replace-seenCount' ).text( seenCount ); $( '.frb-replace-seenCount-ordinalNum' ).text( getReplaceText( ordinalNums, language, seenCount ) ); $( '.frb-replace-seenCount-ordinalWord' ).text( getReplaceText( ordinalWords, language, seenCount ) ); $( '.frb-replace-seenCount-textFragment' ).text( getReplaceText( textFragments, language, seenCount ) ); }
};
/**
* Replace elements with preset ask string amounts * * e.g. class="frb-replace-amt-ps4" will be replaced with amount #4, currently $25 in the US * * @param {string} currency - currency code e.g. 'USD' * @param {string} country - country code e.g. 'FR' * @param {string} language - language code e.g. 'en' For symbol formatting */
frb.replaceCustomAmounts = function( currency, country, language ) {
var amountOptions = frb.pickAmounts( frb.amounts.options7, currency, country ); $( '.frb [class^="frb-replace-amt-ps"]' ).each( function() { var i = $( this ).attr( 'class' ).replace( 'frb-replace-amt-ps', ), amount = amountOptions[ i - 1 ], formattedAmount = frb.formatCurrency( currency, amount, language ); $( this ).html( '<frb-amt>' + formattedAmount + '</frb-amt>' ); });
};
frb.noRecurringCountries = ['AR', 'CL', 'CO', 'MX', 'PE', 'UY', 'BR', 'IN']; frb.ccAdyenCountries = ['FR', 'IL', 'UA'];
/* These countries use potentially ambiguous $ sign. Use ISO code instead in text (but still $ for buttons) */ frb.textAmountIsoCountries = ['AR', 'CL', 'CO', 'MX'];
$(function() {
if ( mw.centralNotice.adminUi ) { // T262693 return; }
var language = mw.centralNotice.data.uselang; var variantLanguage; // for pt-br and es-419, note we can only use these for certain links var country = mw.centralNotice.data.country; var currency = frb.getCurrency(country);
if ( language === 'pt' && country === 'BR' ) { variantLanguage = 'pt-br'; } else if ( language === 'es' && ['AR', 'CL', 'CO', 'PE', 'MX', 'UY'].indexOf( country ) !== -1 ) { variantLanguage = 'es-419'; } else { variantLanguage = language; }
// Payment methods frb.localizeMethods(country); frb.checkMethodOutages(country);
// Preset amounts frb.replaceCustomAmounts( currency, country, language );
// Basic replacements $('.frb-replace-currencysymbol').text( frb.formatCurrency( currency, , language ).replace(' ', ) ); $('.frb-replace-currencycode').text( currency );
// Count banners seen frb.replaceSeenCount( language );
// Country name var countryName; if ( frb.countryNames[language] ) { countryName = frb.countryNames[language][country] || frb.countryNames.en[country]; } else { countryName = frb.countryNames.en[country]; } $('.frb-replace-countryname').text( countryName );
// Day of week var now = new Date(); var dayNumber = now.getDay(); var capitalizeText = function( text ) { // Capitalize first letter, for use at start of sentence return text.charAt(0).toUpperCase() + text.slice(1); };
if ( $('.frb-replace-dayofweek, .frb-replace-dayofweek-capitalize').length > 0 ) { if ( frb.dayNames[language] ) { $('.frb-replace-dayofweek').text( frb.dayNames[language][dayNumber] ); $('.frb-replace-dayofweek-capitalize').text( capitalizeText( frb.dayNames[language][dayNumber] ) ); } else { console.log('Warning: banner should contain a day of the week, but no translations found.'); } }
if ( $('.frb-replace-dayofweek-this, .frb-replace-dayofweek-this-capitalize').length > 0 ) { if ( frb.dayNamesThis[language] ) { $('.frb-replace-dayofweek-this').text( frb.dayNamesThis[language][dayNumber] ); $('.frb-replace-dayofweek-this-capitalize').text( capitalizeText( frb.dayNamesThis[language][dayNumber] ) ); } else { console.log('Warning: banner should contain "this DAY", but no translations found.'); } }
// Capitalize $('.frb-capitalize').text(function( index, text ) { return text.charAt(0).toUpperCase() + text.slice(1); });
// Replace device with iPad if needed var ua = navigator.userAgent; if ( ua.match( /ipad/i ) ) { $('.frb-replace-device').text( frb.iPadTranslations[language] || frb.iPadTranslations.en ); }
// Replace %AVERAGE% and %MINIMUM% var average = frb.pickAmounts( frb.amounts.averages, currency, country ), ifEveryone = frb.pickAmounts( frb.amounts.ifEveryone, currency, country ), avgString, ifString;
if ( frb.textAmountIsoCountries.indexOf(country) !== -1 ) { avgString = frb.formatCurrency( undefined, average, language ) + ' ' + currency; ifString = frb.formatCurrency( undefined, ifEveryone, language ) + ' ' + currency; } else { avgString = frb.formatCurrency( currency, average, language ).replace( /\.$/, ); // strip any period from end for use in running text ifString = frb.formatCurrency( currency, ifEveryone, language ).replace( /\.$/, ); } $( '.frb' ).each( function( index ) { var newHtml = $(this).html(); newHtml = newHtml.replace( /%AVERAGE%/g, '<frb-amt>' + avgString + '</frb-amt>' ); newHtml = newHtml.replace( /%MINIMUM%/g, '<frb-amt>' + ifString + '</frb-amt>' ); $( this ).html( newHtml ); });
/** * Call a function on every text node contained by a root node. * * Used so we can do text replacements without accidentally clobbering html and scripts * * @param {Node} rootNode The Node object whose descendants will be recursed through * @param {Function} callback Callback function that receives a Node as its only argument */ function eachTextNode( rootNode, callback ) { for ( var node = rootNode.firstChild; node !== null; node = node.nextSibling ) { if ( node.nodeType === Node.TEXT_NODE ) { callback( node ); } else if ( node.nodeType === Node.ELEMENT_NODE ) { eachTextNode( node, callback ); } } }
// French spacing: replace space before punctuation with if ( language === 'fr' ) { var bannerRootElements = document.getElementsByClassName( 'frb' ); for ( var i = 0; i < bannerRootElements.length; i++ ) { eachTextNode( bannerRootElements[i], function( node ) { node.textContent = node.textContent.replace( / ([!?;:%])/g, '\u00a0$1' ); }); } }
// Links (in smallprint) TODO: merge with frb.makeLink() $('.frb-localize-links a').each(function() { // Add parameters for LandingCheck var uri = new mw.Uri( $(this).attr('href') ); uri.extend({ country: country, language: variantLanguage, uselang: variantLanguage, utm_medium: 'sitenotice', utm_campaign: mw.centralNotice.data.campaign || 'test', utm_source: mw.centralNotice.data.banner }); $(this).attr('href', uri.toString()); $(this).attr('target', '_blank'); // Make links open in new tab });
// Add links frb.makeLink( '.frb-link-privacy', variantLanguage, 'https://foundation.wikimedia.org/wiki/Special:LandingCheck?basic=true&landing_page=Donor_privacy_policy' ); frb.makeLink( '.frb-link-tax', variantLanguage, 'https://donate.wikimedia.org/wiki/Special:LandingCheck?basic=true&landing_page=Tax_deductibility' ); frb.makeLink( '.frb-link-cancel', variantLanguage, 'https://donate.wikimedia.org/wiki/Special:LandingCheck?basic=true&landing_page=Cancel_or_change_recurring_giving' );
// Legal text variants if (country === 'US') { $('.frb-legal-US').show(); $('.frb-legal-nonUS, .frb-legal-NL').hide(); } else if (country === 'NL') { $('.frb-legal-NL').show(); $('.frb-legal-US, .frb-legal-nonUS').hide(); } else { $('.frb-legal-nonUS').show(); $('.frb-legal-US, .frb-legal-NL').hide(); }
// Quick hack for American/British/Commonwealth English differences if ( country === 'US' ) { $('.frb-lang-enUS').show(); $('.frb-lang-en5C').hide(); } else { $('.frb-lang-enUS').hide(); $('.frb-lang-en5C').show(); }
// Where Remind Me Later should be shown var rmlCountries = ['US', 'CA', 'GB', 'IE', 'AU', 'NZ', 'IT', 'NL', 'JP', 'FR', 'SE', 'ZA', 'IN', 'AR', 'BR', 'CL', 'CO', 'PE', 'UY', 'MX']; var rmlLanguages = ['en', 'fr', 'nl', 'ja', 'it', 'sv', 'pt', 'es']; var rmlEnabled = !frb.isEndowment && rmlCountries.indexOf(country) !== -1 && rmlLanguages.indexOf(language) !== -1;
if ( rmlEnabled ) { $('.frb').addClass('frb-rml-enabled'); } else { $('.frb').addClass('frb-rml-disabled'); }
});
/* == end of MediaWiki:FundraisingBanners/LocalizeJS-2017.js == */
frb.storedOptions = {};
frb.animationDuration = frb.reduceMotion ? 0 : 400; // slides and scrolls frb.fadeDuration = frb.reduceMotion ? 0 : 600; // transitions between steps
frb.setMethod = function (options, frequency) {
frb.storedOptions = options || { method: 'cc' }; // Default to credit card
if( frequency === 'no-monthly' ) { $('#frb-frequency-monthly').attr('disabled', true); } else { $('#frb-frequency-monthly').attr('disabled', false); } if ( frb.optinRequired ) { $('.frb-optin').show(); } $('.frb-step-2').slideDown( frb.fadeDuration );
};
frb.insertInlineBanner = function() {
// Place frb-inline in article, before first paragraph or at top var $inlineBanner = $('#frb-inline'); var $firstPara = $('.mw-parser-output > div > p:not(.mw-empty-elt)').first();
if ( $firstPara.length > 0 && !mw.config.get('wgIsMainPage') ) { $firstPara.before( $inlineBanner ); } else { $('#mw-content-text').prepend( $inlineBanner ); }
$inlineBanner.show();
};
frb.postReminderForm = function() {
// Create the iframe for the form and use it as the form's target var frameName = "remindFrame"; var $form = $(".frb-inline-rml-form form"); if ($("iframe[name=" + frameName + "]").length == 0) { var $iframe = $('<iframe style="display: none;" name="' + frameName + '"></iframe>'); $form.attr("target", $iframe.attr("name")); $form.after($iframe); } $form[0].submit();
};
frb.getCurrentDate = function() {
var today = new Date(); var dd = today.getDate(); var mm = today.getMonth()+1; //January is 0! var yyyy = today.getFullYear();
if(dd<10) { dd='0'+dd; } if(mm<10) { mm='0'+mm; }
today = mm+'/'+dd+'/'+yyyy; return today;
};
frb.initReminderForm = function() {
$(".frb-inline-rml-form input[name=rml_country]").val(mw.centralNotice.data.country); $(".frb-inline-rml-form input[name=rml_language]").val(mw.config.get('wgUserLanguage')); $(".frb-inline-rml-form input[name=rml_submitDate]").val(frb.getCurrentDate()); $(".frb-inline-rml-form input[name=rml_segment]").val(Math.floor((Math.random() * 100) + 1));
$('.frb-inline-rml-link').on('click', function(e) { $('.frb-inline-rml').appendTo('#frb-inline .frb-inline-bottombar').toggle(); if ( $('.frb-inline-rml').is(':visible') ) { $('.frb-inline-bottombar').addClass('active'); } else { $('.frb-inline-bottombar').removeClass('active'); } // Use standard JS focus() method not jQuery, because of IE10 scrolling bug // https://phabricator.wikimedia.org/T162049 $('.frb-inline-rml .email_input').get(0).focus(); return false; });
$('.frb-nag-rml-link').on('click', function(e) { // Add '_nag' to RML source value $('.frb-inline-rml-form input[name="rml_source"]').val('{{{banner}}}_nag'); $('.frb-inline-rml').appendTo('#frb-nag').toggle(); if ( $('.frb-inline-rml').is(':visible') ) { $('#frb-nag').addClass('active'); } else { $('#frb-nag').removeClass('active'); } // Use standard JS focus() method not jQuery, because of IE10 scrolling bug // https://phabricator.wikimedia.org/T162049 $('.frb-inline-rml .email_input').get(0).focus(); return false; });
$(".frb-inline-rml-form .frb-submit").on("click", function(e) { if ( mw.util.validateEmail( $(".frb-inline-rml-form form input[name='Email']").val() ) ) { frb.postReminderForm(); $(".frb-inline-rml-form form").hide(); $(".frb-inline-rml-done").show(); $(".frb-inline-rml").delay(2000).fadeOut(1000, function(){ $("#frb-inline").hide(); // Hide banner $("#centralNotice").hide(); // Hide nag }); mw.centralNotice.internal.hide.setHideWithCloseButtonCookies(); // Hide future banners for 7 days return false; } else { $('.frb-inline-rml-form form input[name="Email"]').addClass('frb-haserror'); $('.frb-inline-rml-form .frb-error-invalidemail').show(); $('.frb-inline-rml .email_input').get(0).focus(); return false; } });
};
frb.initNag = function() {
/* --- Code for sticky "nag" banner --- */ var nagHoverTimeout;
$(window).scroll(function() { var nagRevealPosition = $('#frb-inline').offset().top + $('#frb-inline').outerHeight();
if ( $(window).scrollTop() <= nagRevealPosition ) { $('#frb-nag').finish(); $('#frb-nag').hide(); } else { setTimeout(function(){ if ( $(window).scrollTop() > nagRevealPosition ) { $('#frb-nag').slideDown( frb.animationDuration ); } }, 1500); } });
$('.frb-nag-close').click(function(e) { $('#centralNotice').hide(); // Hide nag (but not inline banner) frb.altSetHideCookie( 'close', 86400 ); e.stopPropagation(); });
$('#frb-nag .frb-nag-action').click(function() { $('html, body').animate( { scrollTop: $('#frb-inline').offset().top }, frb.animationDuration ); $('#frb-nag').slideToggle( frb.animationDuration ); frb.extraData.clickedNag = 1; });
};
$(function() {
if ( mw.centralNotice.adminUi ) { // T262693 return; }
// TODO: clean this up frb.toggleMonthly = function (monthly) { if (monthly.type === 'checkbox') { monthly = monthly.checked; } if (monthly) { $('#frb-frequency-monthly').prop("checked", true); $('#frb-monthly-checkbox').prop("checked", true); $('#frb-form').addClass('form-monthly'); $('.no-monthly button').attr('disabled', true); $('.no-monthly input[type=radio]').attr('disabled', true); $('.no-monthly').prop('disabled', false); $('#frb-form').addClass('form-monthly'); if ($('.form-monthly .no-monthly input[type=radio]').is(':checked')) { $('.form-monthly .no-monthly input[type=radio]').removeAttr('checked'); frb.setMethod({}); } } else { $('#frb-frequency-onetime').prop("checked", true); $('#frb-monthly-checkbox').prop("checked", false); $('#frb-form').removeClass('form-monthly'); $('.no-monthly button').attr('disabled', false); $('.no-monthly input[type=radio]').attr('disabled', false); } };
var language = mw.centralNotice.data.uselang; var country = mw.centralNotice.data.country; var currency = frb.getCurrency(country); var validAmount, validStayInTouch; if ( !frb.optinRequired ) { validStayInTouch = 1; } var form = document.getElementById('frb-form');
frb.extraData = {};
frb.initReminderForm();
frb.initAmountOptions(); frb.localizeAmountOptions(frb.amounts.options7, currency, country, language, true); frb.localizeErrors();
frb.activateCTA = function () { if (validAmount && validStayInTouch) { $('.frb-form .frb-submit').addClass('active'); } else { $('.frb-form .frb-submit').removeClass('active'); } };
$('.frb-amounts').on('input change', function() { frb.validateAmount(); validAmount = 1; frb.updateFeeDisplay(); frb.activateCTA(); });
// Opt-in interaction $('.frb-optin').on('change', function() { $('.frb-optin').removeClass('frb-haserror'); validStayInTouch = 1; frb.activateCTA(); $('.frb-error-optin').hide(); if ( $('#frb-optin-no').is(':checked') ) { $('.frb-optin-no-prompt').removeClass('is-positive'); if ( !$('.frb-optin-no-prompt').is(':visible') ) { $('.frb-optin-no-prompt').slideDown( frb.animationDuration ); } } else { $('.frb-optin-no-prompt').addClass('is-positive'); } });
$('.frb-inline-close').on('click', function(e) { $('#frb-inline').hide(); mw.centralNotice.hideBanner(); return false; });
// Close inline rml form on click or return $('.frb-inline-rml-form-close').on('click', function(e) { $('.frb-inline-rml').hide(); $('.frb-inline-bottombar, #frb-nag').removeClass('active'); return false; });
// Provide a hint they should click the buttons $('.frb-inline-message').click(function() { $('.frb-methods').addClass('hint'); setTimeout(function() { $('.frb-methods').removeClass('hint'); }, 400); }); /* -- UPSELL -- */ frb.updateUpsellAsk = function(isOtherAmountStep) { var amount, feeAmount, upsellAmount, list = frb.amounts.monthlySuggest[currency] || frb.amounts.monthlySuggest.USD;
// If user is on third step (write a different amount) then get monthly amount if not, the the first form amount if (isOtherAmountStep !== undefined) { amount = frb.getMonthlyAmount(); } else { amount = frb.getAmount(form); }
// If PTF is checked when we need to calculate the fee for that amount if ( $('#frb-ptf-checkbox').prop('checked') ) { amount = amount + frb.calculateFee(amount); }
for (var i = list.length - 1; i >= 0; i--) { if ( amount <= list[i][0] ) { upsellAmount = list[i][1]; } }
// If user is in the upsell (second step) then the form.otherMonthlyAmount.value will be updated with the upsellAmount calculated if (isOtherAmountStep === undefined) { form.otherMonthlyAmount.value = upsellAmount; }
// A formatted value will be returned var upsellAmountFormatted = frb.formatCurrency(currency, upsellAmount, language);
// The value of the amount will be updated only if the user is in the upsell (second step) if (isOtherAmountStep === undefined) { $('.frb-upsell-ask').text(upsellAmountFormatted); } };
frb.upsellPossible = function() { // Only do monthly convert if initial selection is one-time, payment method supports monthly, upsell value is not 0 (meaning skip), and payment method isn't credit card. if ( frb.getRecurring(document.getElementById('frb-form')) || !frb.shouldShowRecurring( frb.storedOptions, mw.centralNotice.data.country ) || form.otherMonthlyAmount.value == 0 || frb.storedOptions.method == 'cc' ) { return false; } else { return true; } }
$('#frb-btn-first-submit').on('click', function (e) { e.preventDefault();
if ( frb.validateForm( frb.storedOptions ) ) { frb.updateUpsellAsk();
if ( frb.upsellPossible() ) { $('.frb-step-1, .frb-step-2').fadeOut( frb.fadeDuration, function () { $('.frb-step-upsell').fadeIn( frb.fadeDuration, function() { $('html, body').animate( { scrollTop: $('.frb-upsell-cta').offset().top - 10 }, frb.animationDuration ); }); $('.frb-rml-form').hide(); }); } else { frb.submitForm( frb.storedOptions ); } } else { frb.extraData.validateError = 1; } });
// Go back to step 2 from upsell $('.frb-step-upsell .frb-back').on('click', function (e) { $('.frb-step-upsell').hide(); $('.frb-step-1, .frb-step-2').show(); return false; });
// Go back to upsell from diff-amt $('.frb-step-monthly-diff-amt .frb-back').on('click', function (e) { form.otherMonthlyAmount.value = ; frb.updateUpsellAsk(); validAmount = 1; frb.activateCTA(); frb.toggleMonthly(false); $('.frb-step-monthly-diff-amt').hide(); $('.frb-step-upsell').show(); return false; });
// Donate monthly other amount $('.frb-monthly-diff-amt-link').on('click', function (e) { form.otherMonthlyAmount.value = ; validAmount = 0; frb.activateCTA(); frb.toggleMonthly(true); $('.frb-step-upsell').hide(); $('.frb-step-monthly-diff-amt').show(); return false; });
// Validate monthly other amount $('#frb-amt-monthly-other-input').on('input change', function (e) { if (frb.validateMonthlyAmount()) { validAmount = 1; frb.updateUpsellAsk(true); } else { validAmount = 0; } frb.activateCTA(); });
// Submit/"Donate now" buttons $('#frb-monthly-donate-yes').on('click', function (e) { frb.submitMonthly(); return false; });
$('#frb-monthly-donate-no').on('click', function (e) { frb.submitForm(frb.storedOptions); return false; });
$('#frb-donate-monthly-other').on('click', function (e) { if (frb.validateMonthlyAmount()) { frb.submitMonthly(); } return false; });
frb.getMonthlyAmount = function () { var form = document.getElementById('frb-form'); var amount = null;
// Check the "monthly other" amount box if (form.otherMonthlyAmount.value !== ) { var otherMonthlyAmount = form.otherMonthlyAmount.value; otherMonthlyAmount = otherMonthlyAmount.replace(/[,.](\d)$/, ':$10'); otherMonthlyAmount = otherMonthlyAmount.replace(/[,.](\d)(\d)$/, ':$1$2'); otherMonthlyAmount = otherMonthlyAmount.replace(/[$£€¥,.]/g, ); otherMonthlyAmount = otherMonthlyAmount.replace(/:/, '.'); amount = otherMonthlyAmount; }
amount = parseFloat(amount);
if (isNaN(amount)) { return 0; } else { var totalMonthlyAmountFormatted = frb.formatCurrency(currency, amount, language); $('.frb-monthly-total').text(totalMonthlyAmountFormatted);
return amount; } };
frb.validateMonthlyAmount = function () {
var amount = frb.getMonthlyAmount(); var currency = frb.getCurrency( mw.centralNotice.data.country ); var minAmount = frb.amounts.minimums[ currency ];
if ( amount === null || isNaN(amount) || amount <= 0 || amount < minAmount ) { $('.frb-error-bigamount').hide(); $('.frb-error-smallamount').show(); return false; } else if ( amount > frb.maxUSD * minAmount ) { $('.frb-error-bigamount').show(); return false; } else { $('.frb-error-smallamount, .frb-error-bigamount').hide(); return true; } };
frb.submitMonthly = function() { frb.extraData.monthlyUpsell = 1; frb.extraData.originalAmt = frb.getAmount().toString();
frb.toggleMonthly(true); document.getElementById('frb-input-other').checked = true; document.getElementById('frb-ptf-checkbox').checked = false; form.otherAmount.value = form.otherMonthlyAmount.value; frb.submitForm(frb.storedOptions); }
// Focus for Other field $('.frb-button--other').on('click keypress', function(e) { if ( e.which === 13 || e.type === 'click' ) { document.getElementById('frb-input-other').checked = true; frb.updateFeeDisplay(); $('.frb-other-input').focus(); e.stopPropagation(); } });
/* Other amount field focus styles */ $('.frb-other-input') .focus(function() { $('.frb-button--other').addClass('frb-button--is-focused'); }) .blur(function() { $('.frb-button--other').removeClass('frb-button--is-focused'); });
// Activate #input_amount_other radio when tabbing into #frb-amt-other-input // Add focus class to parent $('#frb-amt-other-input') .blur(function() { $(this).closest('.frb-amt-other').removeClass('is-focused'); }) .focus(function() { document.getElementById('frb-input-other').checked = true; frb.updateFeeDisplay(); $(this).closest('.frb-amt-other').addClass('is-focused'); }); /** * Simplified custom hide cookie only for this domain, * since CentralNotice builtin method seems buggy - T270401 * * @param {string} reason Reason to store in the hide cookie * @param {number} duration Cookie duration, in seconds */ frb.altSetHideCookie = function ( reason, duration ) {
var cookieName = 'centralnotice_hide_fundraising', date = new Date(), hideData = { v: 1, created: Math.floor( date.getTime() / 1000 ), reason: reason };
// Re-use the same date object to set the cookie's expiry time date.setSeconds( date.getSeconds() + duration );
$.cookie( cookieName, JSON.stringify( hideData ), { expires: date, path: '/' } );
};
if ( frb.shouldShowBanner() ) { frb.insertInlineBanner(); frb.initNag(); }
}); </script>