1(function(a){if(typeof a.sprintf!=="function"){a.sprintf=function(){var g=/%%|%(\d+\$)?([-+\'#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;var h=arguments,f=0,k=h[f++];var b=function(o,i,l,n){if(!l){l=" "}var m=(o.length>=i)?"":Array(1+i-o.length>>>0).join(l);return n?o+m:m+o};var c=function(n,m,q,i,l,p){var o=i-n.length;if(o>0){if(q||!l){n=b(n,i,p,q)}else{n=n.slice(0,m.length)+b("",o,"0",true)+n.slice(m.length)}}return n};var j=function(q,p,o,r,l,i,n){var m=q>>>0;o=o&&m&&{"2":"0b","8":"0","16":"0x"}[p]||"";q=o+b(m.toString(p),i||0,"0",false);return c(q,o,r,l,n)};var e=function(n,p,l,i,m,o){if(i!=null){n=n.slice(0,i)}return c(n,"",p,l,m,o)};var d=function(A,n,o,s,C,x,m){var i;var w;var l;var B;var u;if(A=="%%"){return"%"}var t=false,p="",r=false,z=false,y=" ";var q=o.length;for(var v=0;o&&v<q;v++){switch(o.charAt(v)){case" ":p=" ";break;case"+":p="+";break;case"-":t=true;break;case"'":y=o.charAt(v+1);break;case"0":r=true;break;case"#":z=true;break}}if(!s){s=0}else{if(s=="*"){s=+h[f++]}else{if(s.charAt(0)=="*"){s=+h[s.slice(1,-1)]}else{s=+s}}}if(s<0){s=-s;t=true}if(!isFinite(s)){throw new Error("sprintf: (minimum-)width must be finite")}if(!x){x="fFeE".indexOf(m)>-1?6:(m=="d")?0:undefined}else{if(x=="*"){x=+h[f++]}else{if(x.charAt(0)=="*"){x=+h[x.slice(1,-1)]}else{x=+x}}}u=n?h[n.slice(0,-1)]:h[f++];switch(m){case"s":return e(String(u),t,s,x,r,y);case"c":return e(String.fromCharCode(+u),t,s,x,r);case"b":return j(u,2,z,t,s,x,r);case"o":return j(u,8,z,t,s,x,r);case"x":return j(u,16,z,t,s,x,r);case"X":return j(u,16,z,t,s,x,r).toUpperCase();case"u":return j(u,10,z,t,s,x,r);case"i":case"d":i=(+u)|0;w=i<0?"-":p;u=w+b(String(Math.abs(i)),x,"0",false);return c(u,w,t,s,r);case"e":case"E":case"f":case"F":case"g":case"G":i=+u;w=i<0?"-":p;l=["toExponential","toFixed","toPrecision"]["efg".indexOf(m.toLowerCase())];B=["toString","toUpperCase"]["eEfFgG".indexOf(m)%2];u=w+Math.abs(i)[l](x);return c(u,w,t,s,r)[B]();default:return A}};return k.replace(g,d)}}})(jQuery); 2var S2MEMBER_CURRENT_USER_IS_LOGGED_IN = false,S2MEMBER_CURRENT_USER_IS_LOGGED_IN_AS_MEMBER = false,S2MEMBER_CURRENT_USER_FIRST_NAME = '',S2MEMBER_CURRENT_USER_LAST_NAME = '',S2MEMBER_CURRENT_USER_LOGIN = '',S2MEMBER_CURRENT_USER_EMAIL = '',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED = 0,S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED = false,S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY = 0,S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS = 0; 3jQuery(document).ready(function(d){window.ws_plugin__s2member_skip_all_file_confirmations=window.ws_plugin__s2member_skip_all_file_confirmations||false;var c='',a='s2member-files',b=ws_plugin__s2member_skip_all_file_confirmations?true:false,e=[];window.ws_plugin__s2member_passwordMinLength=function(){return parseInt("6")};window.ws_plugin__s2member_passwordMinStrengthCode=function(){return"weak"};window.ws_plugin__s2member_passwordMinStrengthLabel=function(){return"`weak`, `good`, or `strong`"};window.ws_plugin__s2member_passwordMinStrengthScore=function(){return parseInt("10")};window.ws_plugin__s2member_passwordStrengthMeter=function(j,g,i){var h=0,f=ws_plugin__s2member_passwordMinLength();j=String(j);g=String(g);if(j!=g&&g.length>0){return"mismatch"}else{if(j.length<1){return"empty"}else{if(j.length<f){return"short"}}}if(j.match(/[0-9]/)){h+=10}if(j.match(/[a-z]/)){h+=10}if(j.match(/[A-Z]/)){h+=10}if(j.match(/[^0-9a-zA-Z]/)){h=h===30?h+20:h+10}if(i){return h}if(h<30){return"weak"}if(h<50){return"good"}return"strong"};window.ws_plugin__s2member_passwordStrength=function(h,k,i,g){if(h instanceof jQuery&&k instanceof jQuery&&i instanceof jQuery&&g instanceof jQuery){var j={empty:'Strength indicator',"short":'Very weak',weak:'Weak',good:'Good',strong:'Strong',mismatch:'Mismatch'};g.removeClass("ws-plugin--s2member-password-strength-short");g.removeClass("ws-plugin--s2member-password-strength-weak");g.removeClass("ws-plugin--s2member-password-strength-good");g.removeClass("ws-plugin--s2member-password-strength-strong");g.removeClass("ws-plugin--s2member-password-strength-mismatch");g.removeClass("ws-plugin--s2member-password-strength-empty");var f=ws_plugin__s2member_passwordStrengthMeter(k.val(),i.val());g.addClass("ws-plugin--s2member-password-strength-"+f).html(j[f])}};window.ws_plugin__s2member_validationErrors=function(r,q,g,m,l){if(typeof r==="string"&&r&&typeof q==="object"&&typeof g==="object"){if(typeof q.tagName==="string"&&/^(input|textarea|
3select)$/i.test(q.tagName)&&!q.disabled){var t=q.tagName.toLowerCase(),p=d(q),o=d.trim(p.attr("type")).toLowerCase(),f=d.trim(p.attr("name")),s=p.val();m=(typeof m==="boolean")?m:(p.attr("aria-required")==="true"),l=(typeof l==="string")?l:d.trim(p.attr("data-expected"));var k=('143'>0);var i=new RegExp('^(admin@|abuse@|postmaster@|noc@|root@|security@|sysadmin@|compliance@|registrar@|info@|help@|admin@|webmaster@|hostmaster@|sales@|support@|spam@)@',"i");if(t==="input"&&o==="checkbox"&&/\[\]$/.test(f)){if(typeof q.id==="string"&&/-0$/.test(q.id)){if(m&&!d('input[name="'+ws_plugin__s2member_escjQAttr(f)+'"]:checked',g).length){return r+'\nPlease check at least one of the boxes.'}}}else{if(t==="input"&&o==="checkbox"){if(m&&!q.checked){return r+'\nRequired. This box must be checked.'}}else{if(t==="input"&&o==="radio"){if(typeof q.id==="string"&&/-0$/.test(q.id)){if(m&&!d('input[name="'+ws_plugin__s2member_escjQAttr(f)+'"]:checked',g).length){return r+'\nPlease select one of the options.'}}}else{if(t==="select"&&p.attr("multiple")){if(m&&(!(s instanceof Array)||!s.length)){return r+'\nPlease select at least one of the options.'}}else{if(typeof s!=="string"||(m&&!(s=d.trim(s)).length)){return r+'\nThis is a required field, please try again.'}else{if((s=d.trim(s)).length&&((t==="input"&&/^(text|password)$/i.test(o))||t==="textarea")&&typeof l==="string"&&l.length){if(l==="numeric-wp-commas"&&(!/^[0-9\.,]+$/.test(s)||isNaN(s.replace(/,/g,"")))){return r+'\nMust be numeric (with or without decimals, commas allowed).'}else{if(l==="numeric"&&(!/^[0-9\.]+$/.test(s)||isNaN(s))){return r+'\nMust be numeric (with or without decimals, no commas).'}else{if(l==="integer"&&(!/^[0-9]+$/.test(s)||isNaN(s))){return r+'\nMust be an integer (a whole number, without any decimals).'}else{if(l==="integer-gt-0"&&(!/^[0-9]+$/.test(s)||isNaN(s)||s<=0)){return r+'\nMust be an integer > 0 (whole number, no decimals, greater than 0).'}else{if(l==="float"&&(!/^[0-9\.]+$/.test(s)||!/[0-9]/.test(s)||!/\./.test(s)||isNaN(s))){return r+'\nMust be a float (floating point number, decimals required).'}else{if(l==="float-gt-0"&&(!/^[0-9\.]+$/.test(s)||!/[0-9]/.test(s)||!/\./.test(s)||isNaN(s)||s<=0)){return r+'\nMust be a float > 0 (floating point number, decimals required, greater than 0).'}else{if(l==="date"&&!/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/.test(s)){return r+'\nMust be a date (required date format: dd/mm/yyyy).'}else{if(l==="email"&&!/^[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+(?:\.?[a-zA-Z0-9_!#$%&*+=?`{}~|\/\^\'\-]+)*@[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(s)){return r+'\nMust be a valid email address.'}else{if(l==="email"&&k&&i.test(s)){return r+"\n"+d.sprintf('Please use a personal email address.\nAddresses like <%s@> are problematic.',s.split("@")[0])}else{if(l==="url"&&!/^https?\:\/\/.+$/i.test(s)){return r+'\nMust be a full URL (starting with http or https).'}else{if(l==="domain"&&!/^[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*(?:\.[a-zA-Z0-9]+(?:\-*[a-zA-Z0-9]+)*)*(?:\.[a-zA-Z][a-zA-Z0-9]+)?$/.test(s)){return r+'\nMust be a domain name (domain name only, without http).'}else{if(l==="phone"&&(!/^[0-9 ()\-]+$/.test(s)||s.replace(/[^0-9]+/g,"").length!==10)){return r+'\nMust be a phone # (10 digits w/possible hyphens, spaces, brackets).'}else{if(l==="uszip"&&!/^[0-9]{5}(?:\-[0-9]{4})?$/.test(s)){return r+'\nMust be a US zipcode (5-9 digits w/ possible hyphen).'}else{if(l==="cazip"&&!/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(s)){return r+'\nMust be a Canadian zipcode (6 alpha-numerics w/possible space).'}else{if(l==="uczip"&&!/^[0-9]{5}(?:\-[0-9]{4})?$/.test(s)&&!/^[0-9A-Z]{3} ?[0-9A-Z]{3}$/i.test(s)){return r+'\nMust be a zipcode (either a US or Canadian zipcode).'}else{if(l==="ukpostcode"&&!/^(([a-zA-Z]{1,2}[0-9][a-zA-Z0-9]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?[0-9][a-zA-Z]{2}|BFPO ?[0-9]{1,4}|(KY[0-9]|MSR|VG|AI)[ -]?[0-9]{4}|[a-zA-Z]{2} ?[0-9]{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$/.test(s)){return r+'\nMust be a valid UK postcode.'}else{if(/^alphanumerics\-spaces\-punctuation\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z 0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(s)){return r+'\nPlease use alphanumerics, spaces & punctuation only.'}else{if(/^alphanumerics\-spaces\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z 0-9]+$/i.test(s)){return r+'\nPlease use alphanumerics & spaces only.'}else{if(/^alphanumerics\-punctuation\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z0-9\/\\\\,.?:;"\'{}[\]\^|+=_()*&%$#@!`~\-]+$/i.test(s)){return r+'\nPlease use alphanumerics & punctuation only (no spaces).'}else{if(/^alphanumerics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z0-9]+$/i.test(s)){return r+'\nPlease use alphanumerics only (no spaces/punctuation).'}else{if(/^alphabetics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[a-z]+$/i.test(s)){return r+'\nPlease use alphabetics only (no digits/spaces
3/punctuation).'}else{if(/^numerics\-[0-9]+(?:\-e)?$/.test(l)&&!/^[0-9]+$/i.test(s)){return r+'\nPlease use numeric digits only.'}else{if(/^(?:any|alphanumerics\-spaces\-punctuation|alphanumerics\-spaces|alphanumerics\-punctuation|alphanumerics|alphabetics|numerics)\-[0-9]+(?:\-e)?$/.test(l)){var n=l.split("-"),h=Number(n[1]),j=(n.length>2&&n[2]==="e");if(j&&s.length!==h){return r+"\n"+d.sprintf('Must be exactly %s %s.',h,((n[0]==="numerics")?((h===1)?'digit':'digits'):((h===1)?'character':'characters')))}else{if(s.length<h){return r+"\n"+d.sprintf('Must be at least %s %s.',h,((n[0]==="numerics")?((h===1)?'digit':'digits'):((h===1)?'character':'characters')))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}return""};window.ws_plugin__s2member_animateProcessing=function(g,f){if(f){d(g).removeClass("ws-plugin--s2member-animate-processing")}else{d(g).addClass("ws-plugin--s2member-animate-processing")}};window.ws_plugin__s2member_escAttr=window.ws_plugin__s2member_escHtml=function(f){if(/[&\<\>"']/.test(f=String(f))){f=f.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),f=f.replace(/"/g,""").replace(/'/g,"'")}return f};window.ws_plugin__s2member_escjQAttr=function(f){return String(f).replace(/([.:\[\]])/g,"\\$1")};if(!b&&S2MEMBER_CURRENT_USER_IS_LOGGED_IN&&S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY<S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED){d('a[href*="s2member_file_download="], a[href*="/s2member-files/"], a[href^="s2member-files/"], a[href*="/'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"], a[href^="'+a.replace(/([\:\.\[\]])/g,"\\$1")+'/"]').click(function(){if(!/s2member[_\-]file[_\-]download[_\-]key[\=\-].+/i.test(this.href)){var f='â Confirm File Download â\n\n';f+=d.sprintf('You`ve downloaded %s protected %s in the last %s.',S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY,((S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY===1)?'file':'files'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'24 hours':d.sprintf('%s days',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)))+"\n\n";f+=(S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_IS_UNLIMITED)?'You`re entitled to UNLIMITED downloads though (so, no worries).':d.sprintf('You`re entitled to %s unique %s %s.',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED,((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED===1)?'download':'downloads'),((S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS===1)?'each day':d.sprintf('every %s-day period',S2MEMBER_CURRENT_USER_DOWNLOADS_ALLOWED_DAYS)));if((/s2member[_\-]skip[_\-]confirmation/i.test(this.href)&&!/s2member[_\-]skip[_\-]confirmation[\=\-](0|no|false)/i.test(this.href))||confirm(f)){if(d.inArray(this.href,e)===-1){S2MEMBER_CURRENT_USER_DOWNLOADS_CURRENTLY++,e.push(this.href)}return true}return false}return true})}if(!/\/wp-admin([\/?#]|$)/i.test(location.href)){d("input#ws-plugin--s2member-profile-password1, input#ws-plugin--s2member-profile-password2").on("keyup initialize.s2",function(){ws_plugin__s2member_passwordStrength(d("input#ws-plugin--s2member-profile-login"),d("input#ws-plugin--s2member-profile-password1"),d("input#ws-plugin--s2member-profile-password2"),d("div#ws-plugin--s2member-profile-password-strength"))}).trigger("initialize.s2");d("form#ws-plugin--s2member-profile").submit(function(){var h=this,g="",f="",l="",j=d("input#ws-plugin--s2member-profile-password1",h),i=d("input#ws-plugin--s2member-profile-password2",h);var k=d("input#ws-plugin--s2member-profile-submit",h);d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("strong").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}});if(l=d.trim(l)){alert('â Oops, you missed something: â\n\n'+l);return false}else{if(d.trim(j.val())&&d.trim(j.val())!==d.trim(i.val())){alert('â Oops, you missed something: â\n\nPasswords do not match up. Please try again.');return false}else{if(d.trim(j.val())&&d.trim(j.val()).length<ws_plugin__s2member_passwordMinLength()){alert('â Oops, you missed something: â\n\nPassword MUST be at least 6 characters. Please try again.');return false}else{if(d.trim(j.val())&&ws_plugin__s2member_passwordStrengthMeter(d.trim(j.val()),d.trim(i.val()),true)<ws_plugin__s2member_passwordMinStrengthScore()){alert('â Oops, you missed something: â\n\nPassword strength MUST be `weak`, `good`, or `strong`. Please try again.');return false}}}}ws_plugin__s2member_animateProcessing(k);return true})}if(/\/wp-signup\.php/i.test(location.href)){d("div#content > div.mu_register > form#setupform").submit(function(){var h=this,g="",f="",j="",i=d('p.submit input[type="submit"]',h);d("input#user_email",h).attr("data-expected","email");d("input#user_name, input#user_email, input#blogname, input#blog_title, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var k=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(k&&(g=d.trim(d('label[for="'+k+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){j+=f+"\n\n"}}});if(j=d.trim(j)){alert('â Oops, you missed something: â\n\n'+j);return false}ws_plugin__s2member_animateProcessing(i);return true})}if(/\/wp-login\.php/i.test(location.href)){d("div#login > form#registerform input#user_login").attr("tabindex","10");d("div#login > form#registerform input#user_email").attr("tabindex","20");d("div#login > form#registerform input#wp-submit").attr("tabindex","1000");d("input#ws-plugin--s2member-custom-reg-field-user-pass1, input#ws-plugin--s2member-custom-reg-field-user-pass2").on("keyup initialize.s2",function(){ws_plugin__s2member_passwordStrength(d("input#user_login"),d("input#ws-plugin--s2member-custom-reg-field-user-pass1"),d("input#ws-plugin--s2member-custom-reg-field-user-pass2"),d("div#ws-
3plugin--s2member-custom-reg-field-user-pass-strength"))}).trigger("initialize.s2");d("div#login > form#registerform").submit(function(){var h=this,g="",f="",l="",k=d('input#ws-plugin--s2member-custom-reg-field-user-pass1[aria-required="true"]',h),i=d("input#ws-plugin--s2member-custom-reg-field-user-pass2",h),j=d("input#wp-submit",h);d("input#user_email",h).attr("data-expected","email");d("input#user_login, input#user_email, input#captcha_code",h).attr({"aria-required":"true"});d(":input",h).each(function(){var m=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(d.inArray(m,["user_login","user_email","captcha_code"])!==-1){if((g=d.trim(d(this).parent("label").text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}else{if(m&&(g=d.trim(d('label[for="'+m+'"]',h).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){l+=f+"\n\n"}}}});if(l=d.trim(l)){alert('â Oops, you missed something: â\n\n'+l);return false}else{if(k.length&&d.trim(k.val())!==d.trim(i.val())){alert('â Oops, you missed something: â\n\nPasswords do not match up. Please try again.');return false}else{if(k.length&&d.trim(k.val()).length<ws_plugin__s2member_passwordMinLength()){alert('â Oops, you missed something: â\n\nPassword MUST be at least 6 characters. Please try again.');return false}else{if(k.length&&ws_plugin__s2member_passwordStrengthMeter(d.trim(k.val()),d.trim(i.val()),true)<ws_plugin__s2member_passwordMinStrengthScore()){alert('â Oops, you missed something: â\n\nPassword strength MUST be `weak`, `good`, or `strong`. Please try again.');return false}}}}ws_plugin__s2member_animateProcessing(j);return true})}if(/\/wp-admin\/(?:user\/)?profile\.php/i.test(location.href)){d("form#your-profile").submit(function(){var h=this,g="",f="",i="";d("input#email",h).attr("data-expected","email");d(':input[id^="ws-plugin--s2member-profile-"]',h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('â Oops, you missed something: â\n\n'+i);return false}return true})}if(c){d("body.registration form div#ws-plugin--s2member-custom-reg-fields-4bp-section").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#signup_email",h).attr("data-expected","email");d("input#signup_username, input#signup_email, input#signup_password, input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('â Oops, you missed something: â\n\n'+i);return false}return true});d("body.logged-in.profile.profile-edit :input.ws-plugin--s2member-profile-field-4bp").closest("form").submit(function(){var h=this,g="",f="",i="";d("input#field_1",h).attr({"aria-required":"true"});d(":input",h).each(function(){var j=d.trim(d(this).attr("id")).replace(/---[0-9]+$/g,"");if(j&&(g=d.trim(d('label[for="'+j+'"]',h).first().text().replace(/[\r\n\t]+/g," ")))){if(f=ws_plugin__s2member_validationErrors(g,this,h)){i+=f+"\n\n"}}});if(i=d.trim(i)){alert('â Oops, you missed something: â\n\n'+i);return false}return true})}}); 4var S2MEMBER_PRO_VERSION = '261001'; 5jQuery(document).ready(function(a){}); 6var S2MEMBER_PRO_PAYPAL_GATEWAY = true,S2MEMBER_PRO_PAYPAL_CHECKOUT = {"enabled":true,"sandbox":false,"client_id":"BAAxmI939wk3deeFXoSHYiFLIYO9k7vW-HK4laRl_qUFTuSNe28UxohEmY6AmOuavL9hg6btR4ByUK8JyA","messages":{"prepare_failed":"Unable to prepare PayPal Checkout. Please try again.","payment_failed":"PayPal Checkout could not be completed. Please try again.","payment_recovering":"PayPal is taking longer than expected. Confirming your payment...","payment_unresolved":"PayPal could not confirm the payment yet. Please try again. If this continues, contact support for assistance.","subscription_failed":"PayPal subscription could not be completed. Please try again.","subscription_recovering":"PayPal is taking longer than expected. Confirming your subscription...","subscription_unresolved":"PayPal could not confirm the subscription yet. Please try again. If this continues, contact support for assistance.","sdk_failed":"PayPal Checkout could not be loaded. Please refresh the page and try again.","cancelled":"PayPal Checkout was cancelled."}}; 7jQuery(document).ready(function(A){var e,r,k,n,q,L,z,x={"aria-required":"true"},b={"aria-required":"false"},B={disabled:"disabled"},i={"aria-required":"false",disabled:"disabled"};z=new Image(),z.src='https://www.your-poc.com/wp-content/plugins/s2member/src/images/ajax-loader.gif';if(A("form.s2member-pro-paypal-registration-form").length>1||A("form.s2member-pro-paypal-checkout-form").length>1||A("form.s2member-pro-paypal-sp-checkout-form").length>1){return alert("Detected more than one s2Member Pro-Form.\n\nPlease use only ONE s2Member Pro-Form Shortcode on each Post/Page. Attempting to serve more than one Pro-Form on each Post/Page (even w/ DHTML) may result in unexpected/broken functionality.")}if((e=A("form#s2member-pro-paypal-cancellation-form")).length===1){var O="div#s2member-pro-paypal-cancellation-form-captcha-section",o="div#s2member-pro-paypal-cancellation-form-submission-section",w=A(o+" button#s2member-pro-paypal-cancellation-submit");ws_plugin__s2member_animateProcessing(w,"reset"),w.removeAttr("disabled");
7e.submit(function(){var U=this,S="",R="",V="";var T=A(O+" input#recaptcha_response_field, "+O+" #g-recaptcha-response");A(":input",U).each(function(){var W=A.trim(A(this).attr("id")).replace(/---[0-9]+$/g,"");if(W&&(S=A.trim(A('label[for="'+W+'"]',U).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(R=ws_plugin__s2member_validationErrors(S,this,U)){V+=R+"\n\n"}}});if(V=A.trim(V)){alert('â Oops, you missed something: â\n\n'+V);return false}else{if(T.length&&!T.val()){alert('â Oops, you missed something: â\n\nSecurity Verification missing. Please try again.');return false}}w.attr(B),ws_plugin__s2member_animateProcessing(w);return true})}else{if((r=A("form#s2member-pro-paypal-update-form")).length===1){var u,v="div#s2member-pro-paypal-update-form-billing-method-section",I="div#s2member-pro-paypal-update-form-billing-address-section",m=v+' input[name="s2member_pro_paypal_update[card_type]"]',O="div#s2member-pro-paypal-update-form-captcha-section",o="div#s2member-pro-paypal-update-form-submission-section",w=A(o+" button#s2member-pro-paypal-update-submit");ws_plugin__s2member_animateProcessing(w,"reset"),w.removeAttr("disabled");(u=function(R){var S=A(m+":checked").val();if(A.inArray(S,["Visa","MasterCard","Amex","Discover"])!==-1){A(v+" > div.s2member-pro-paypal-update-form-div").show();A(v+" > div.s2member-pro-paypal-update-form-div :input").attr(x);A(v+" > div#s2member-pro-paypal-update-form-card-start-date-issue-number-div").hide();A(v+" > div#s2member-pro-paypal-update-form-card-start-date-issue-number-div :input").attr(b);A(I+" > div.s2member-pro-paypal-update-form-div").show();A(I+" > div.s2member-pro-paypal-update-form-div :input").attr(x);A(I).show(),(R)?A(v+" input#s2member-pro-paypal-update-card-number").focus():null}else{if(A.inArray(S,["Maestro","Solo"])!==-1){A(v+" > div.s2member-pro-paypal-update-form-div").show();A(v+" > div.s2member-pro-paypal-update-form-div :input").attr(x);A(I+" > div.s2member-pro-paypal-update-form-div").show();A(I+" > div.s2member-pro-paypal-update-form-div :input").attr(x);A(I).show(),(R)?A(v+" input#s2member-pro-paypal-update-card-number").focus():null}else{if(!S){A(v+" > div.s2member-pro-paypal-update-form-div").hide();A(v+" > div.s2member-pro-paypal-update-form-div :input").attr(b);A(v+" > div#s2member-pro-paypal-update-form-card-type-div").show();A(v+" > div#s2member-pro-paypal-update-form-card-type-div :input").attr(x);A(I+" > div.s2member-pro-paypal-update-form-div").hide();A(I+" > div.s2member-pro-paypal-update-form-div :input").attr(b);A(I).hide(),(R)?A(o+" button#s2member-pro-paypal-update-submit").focus():null}}}})();A(m).click(u).change(u);r.submit(function(){var U=this,S="",R="",V="";var T=A(O+" input#recaptcha_response_field, "+O+" #g-recaptcha-response");if(!A(m+":checked").val()){alert('Please choose a Billing Method.');return false}A(":input",U).each(function(){var W=A.trim(A(this).attr("id")).replace(/---[0-9]+$/g,"");if(W&&(S=A.trim(A('label[for="'+W.replace(/-(month|year)/,"")+'"]',U).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(R=ws_plugin__s2member_validationErrors(S,this,U)){V+=R+"\n\n"}}});if(V=A.trim(V)){alert('â Oops, you missed something: â\n\n'+V);return false}else{if(T.length&&!T.val()){alert('â Oops, you missed something: â\n\nSecurity Verification missing. Please try again.');return false}}w.attr(B),ws_plugin__s2member_animateProcessing(w);return true})}else{if((k=A("form#s2member-pro-paypal-registration-form")).length===1){var j,M,s,a="div#s2member-pro-paypal-registration-form-options-section",G="div#s2member-pro-paypal-registration-form-description-section",N="div#s2member-pro-paypal-registration-form-registration-section",O="div#s2member-pro-paypal-registration-form-captcha-section",o="div#s2member-pro-paypal-registration-form-submission-section",l=o+" input#s2member-pro-paypal-registration-nonce",w=A(o+" button#s2member-pro-paypal-registration-submit");ws_plugin__s2member_animateProcessing(w,"reset"),w.removeAttr("disabled");(j=function(R){if(!A(a+" select#s2member-pro-paypal-registration-options option").length){A(a).hide();A(G).show()}else{A(a).show();A(G).hide();A(a+" select#s2member-pro-paypal-registration-options").change(function(){A(l).val("option");k.attr("action",k.attr("action").replace(/#.*$/,"")+"#s2p-form");k.submit()})}})();(M=function(R){if(A(o+" input#s2member-pro-paypal-registration-names-not-required-or-not-possible").length){A(N+" > div#s2member-pro-paypal-registration-form-first-name-div").hide();A(N+" > div#s2member-pro-paypal-registration-form-first-name-div :input").attr(i);A(N+" > div#s2member-pro-paypal-registration-form-last-name-div").hide();A(N+" > div#s2member-pro-paypal-registration-form-last-name-div :input").attr(i)}})();(s=function(R){if(A(o+" input#s2member-pro-paypal-registration-password-not-required-or-not-possible").length){A(N+" > div#s2member-pro-paypal-registration-form-password-div").hide();A(N+" > div#s2member-pro-paypal-registration-form-password-div :input").attr(i)}})();A(N+" > div#s2member-pro-paypal-registration-form-password-div :input").on("keyup initialize.s2",function(){ws_plugin__s2member_passwordStrength(A(N+" input#s2member-pro-paypal-registration-username"),A(N+" input#s2member-pro-paypal-registration-password1"),A(N+" input#s2member-pro-paypal-registration-password2"),A(N+" div#s2member-pro-paypal-registration-form-password-strength"))}).trigger("initialize.s2");k.submit(function(){if(A.inArray(A(l).val(),["option"])===-1){var U=this,S="",R="",X="";var T=A(O+" input#recaptcha_response_field, "+O+" #g-recaptcha-response");var W=A(N+' input#s2member-pro-paypal-registration-password1[aria-required="true"]');var V=A(N+" input#s2member-pro-paypal-registration-password2");A(":input",U).each(function(){var Y=A.trim(A(this).attr("id")).replace(/---[0-9]+$/g,"");if(Y&&(S=A.trim(A('label[for="'+Y+'"]',U).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(R=ws_plugin__s2member_validationErrors(S,this,U)){X+=R+"\n\n"}}});if(X=A.trim(X)){alert('â Oops, you missed something: â\n\n'+X);return false}else{if(W.length&&A.trim(W.val())!==A.trim(V.val())){alert('â Oops, you missed something: â\n\nPasswords do not match up. Please try again.');return false}else{if(W.length&&A.trim(W.val()).length<ws_plugin__s2member_passwordMinLength()){alert('â Oops, you missed something: â\n\nPassword MUST be at least 6 characters. Please try again.');return false}else{if(W.length&&ws_plugin__s2member_passwordStrengthMeter(A.trim(W.val()),A.trim(V.val()),true)<ws_plugin__s2member_passwordMinStrengthScore()){alert('â Oops, you missed something: â\n\nPassword strength MUST be `weak`, `good`, or `strong`. Please try again.');return false}else{if(T.length&&!T.val()){alert('â Oops, you missed something: â\n\nSecurity Verification missing. Please try again.');return false}}}}}}w.attr(B),ws_plugin__s2member_animateProcessing(w);return true})}else{if((n=A("form#s2member-pro-paypal-sp-checkout-form")).length===1){var j,F,K,t=true,J,p,f,D,c,E,u,a="div#s2member-pro-paypal-sp-checkout-form-options-section",G="div#s2member-pro-paypal-sp-checkout-form-description-section",H="div#s2member-pro-paypal-sp-checkout-form-coupon-section",P=H+" input#s2member-pro-paypal-sp-checkout-coupon-apply",N="div#s2member-pro-paypal-sp-checkout-form-registration-section",v="div#s2member-pro-paypal-sp-checkout-form-billing-method-section",m=v+' input[name="s2member_pro_paypal_sp_checkout[card_type]"]',I="div#s2member-pro-paypal-sp-checkout-form-billing-address-section",y=A(I+" > div#s2member-pro-paypal-sp-checkout-form-ajax-tax-div"),O="div#s2member-pro-paypal-sp-checkout-form-captcha-section",o="div#s2member-pro-paypal-sp-checkout-form-submission-section",l=o+" input#s2member-pro-paypal-sp-checkout-nonce",d=o+" #s2member-pro-paypal-sp-checkout-submit";var C=A.trim(A("input#s2member-pro-paypal-lang-attr").val());var g='<button type="submit" id="s2member-pro-paypal-sp-checkout-submit" class="s2member-pro-paypal-submit s2member-pro-paypal-sp-checkout-submit btn btn-primary" tabindex="500">Submit Form</button>';var h='<input type="image" src="https://www.paypal.com/'+((C)?C:'en_US')+'/i/btn/btn_xpressCheckout.gif" id="s2member-pro-paypal-sp-checkout-submit" class="s2member-pro-paypal-submit s2member-pro-paypal-sp-checkout-submit" value="Submit Form" tabindex="500" />';ws_plugin__s2member_animateProcessing(A(d),"reset"),A(d).removeAttr("disabled"),A(P).removeAttr("disabled");(j=function(R){if(!A(a+" select#s2member-pro-paypal-sp-checkout-options option").length){A(a).hide();A(G).show()}else{A(a).show();A(G).hide();A(a+" select#s2member-pro-paypal-sp-checkout-options").change(function(){A(l).val("option");n.attr("action",n.attr("action").replace(/#.*$/,"")+"#s2p-form");n.submit()})}})();(F=function(R){if(A(o+" input#s2member-pro-paypal-sp-checkout-coupons-not-required-or-not-possible").length){A(H).hide()}else{A(H).show()}})();(K=function(R){if(A(o+" input#s2member-pro-paypal-sp-checkout-tax-not-required-or-not-possible").length){y.hide(),t=false}})();(J=function(S){if(t&&!(S&&S.interval&&document.activeElement.id==="s2member-pro-paypal-sp-checkout-country")){var R=A(o+" input#s2member-pro-paypal-sp-checkout-attr").val();var V=A.trim(A(I+" input#s2member-pro-paypal-sp-checkout-state").val());var W=A(I+" select#s2member-pro-paypal-sp-checkout-country").val();var U=A.trim(A(I+" input#s2member-pro-paypal-sp-checkout-zip").val());var T=V+"|"+W+"|"+U;if(V&&W&&U&&T&&(!c||c!==T)&&(c=T)){(D)?D.abort():null,clearTimeout(f),f=null;y.html('<div><img src="https://www.your-poc.com/wp-content/plugins/s2member/src/images/ajax-loader.gif" alt="Calculating Sales Tax..." /> calculating sales tax...</div>');f=setTimeout(function(){D=A.post('https://www.your-poc.com/wp-admin/admin-ajax.php',{action:"ws_plugin__s2member_pro_paypal_ajax_tax",ws_plugin__s2member_pro_paypal_ajax_tax:'ZGVmNTAyMDBiYzNmOTBmYjAxNzg2OTg0ZWM0YTIyM2MxM2JmYmQyZDkzNzUyNGZlZjZlZTAxNDAxZDBjMjJjMDliNjc0YzkxNTIwMjQ5ZDg5ZDUyOWI0ZGEwMjQ2MTVhNTA2YjAzMmMzNzZhYzQyN2U0MzFjNGQ3NjgzYTg0NjU2NmJlMWU1ZGRjZTkyOTQzNGRhNjFiNjE5NGRkY2JiYTIwYjFhNzU4Y2U4MGVmNDFjNDc4NjkwMzA3NGVjOTFkY2IzMWI3Mzg0MTAwMDI2MzcxNDgyYmM2NmFiYzJkNzUyOThkZTcwZjg3ODdkMmUzYzY2ZWQy',"ws_plugin__s2member_pro_paypal_ajax_tax_vars[attr]":R,"ws_plugin__s2member_pro_paypal_ajax_tax_vars[state]":V,"ws_plugin__s2member_pro_paypal_ajax_tax_vars[country]":W,"ws_plugin__s2member_pro_paypal_ajax_tax_vars[zip]":U},function(X){clearTimeout(f),f=null;try{y.html("<div>"+A.sprintf('<strong>Sales Tax%s:</strong> %s<br /><strong>â Total%s:</strong> %s',((X.trial)?' Today':""),((X.tax_per)?"<em>"+X.tax_per+"</em> ( "+X.cur_symbol+""+X.tax+" )":X.cur_symbol+""+X.tax),((X.trial)?' Today':""),X.cur_symbol+""+X.total)+"</div>")}catch(Y){}},"json")},((S&&S.keyCode)?1000:100))}else{if(!V||!W||!U||!T){y.html(""),c=null}}}})();p=function(R){setTimeout(function(){J(R)},10)};
7A(I+" input#s2member-pro-paypal-sp-checkout-state").bind("keyup blur",J).bind("cut paste",p);A(I+" input#s2member-pro-paypal-sp-checkout-zip").bind("keyup blur",J).bind("cut paste",p);A(I+" select#s2member-pro-paypal-sp-checkout-country").bind("change",J);setInterval(function(){J({interval:true})},1000);(E=function(R){if(S2MEMBER_CURRENT_USER_IS_LOGGED_IN){A(N+" input#s2member-pro-paypal-sp-checkout-first-name").each(function(){var S=A(this),T=S.val();(!T)?S.val(S2MEMBER_CURRENT_USER_FIRST_NAME):null});A(N+" input#s2member-pro-paypal-sp-checkout-last-name").each(function(){var S=A(this),T=S.val();(!T)?S.val(S2MEMBER_CURRENT_USER_LAST_NAME):null});A(N+" input#s2member-pro-paypal-sp-checkout-email").each(function(){var S=A(this),T=S.val();(!T)?S.val(S2MEMBER_CURRENT_USER_EMAIL):null})}})();(u=function(R){if(A(o+" input#s2member-pro-paypal-sp-checkout-payment-not-required-or-not-possible").length){A(m).val(["Free"])}var S=A(m+":checked").val();if(A.inArray(S,["Free"])!==-1){A(v).hide(),A(I).hide();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div").hide();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(b);A(I+" > div.s2member-pro-paypal-sp-checkout-form-div").hide();A(I+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(b);(!t)?y.hide():null;A(o+" #s2member-pro-paypal-sp-checkout-submit").replaceWith(g);(R)?A(o+" #s2member-pro-paypal-sp-checkout-submit").focus():null}else{if(A.inArray(S,["Visa","MasterCard","Amex","Discover"])!==-1){A(v).show(),A(I).show();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div").show();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(x);A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-start-date-issue-number-div").hide();A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-start-date-issue-number-div :input").attr(b);A(I+" > div.s2member-pro-paypal-sp-checkout-form-div").show();A(I+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(x);(!t)?y.hide():null;A(o+" #s2member-pro-paypal-sp-checkout-submit").replaceWith(g);(R)?A(v+" input#s2member-pro-paypal-sp-checkout-card-number").focus():null}else{if(A.inArray(S,["Maestro","Solo"])!==-1){A(v).show(),A(I).show();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div").show();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(x);A(I+" > div.s2member-pro-paypal-sp-checkout-form-div").show();A(I+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(x);(!t)?y.hide():null;A(o+" #s2member-pro-paypal-sp-checkout-submit").replaceWith(g);(R)?A(v+" input#s2member-pro-paypal-sp-checkout-card-number").focus():null}else{if((!S||S==="PayPal")&&t){if(A(v).attr("data-paypal-only")){A(v).hide()}else{A(v).show()}A(I).show();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div").show();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(x);A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-number-div").hide();A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-number-div :input").attr(b);A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-expiration-div").hide();A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-expiration-div :input").attr(b);A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-verification-div").hide();A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-verification-div :input").attr(b);A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-start-date-issue-number-div").hide();A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-start-date-issue-number-div :input").attr(b);A(I+" > div.s2member-pro-paypal-sp-checkout-form-div").show();A(I+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(x);A(I+" > div#s2member-pro-paypal-sp-checkout-form-street-div").hide();A(I+" > div#s2member-pro-paypal-sp-checkout-form-street-div :input").attr(b);A(I+" > div#s2member-pro-paypal-sp-checkout-form-city-div").hide();A(I+" > div#s2member-pro-paypal-sp-checkout-form-city-div :input").attr(b);A(o+" #s2member-pro-paypal-sp-checkout-submit").replaceWith(h);(R)?A(I+" input#s2member-pro-paypal-sp-checkout-state").focus():null}else{if(!S||S==="PayPal"){if(A(v).attr("data-paypal-only")){A(v).hide()}else{A(v).show()}A(I).hide();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div").hide();A(v+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(b);A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-type-div").show();A(v+" > div#s2member-pro-paypal-sp-checkout-form-card-type-div :input").attr(x);A(I+" > div.s2member-pro-paypal-sp-checkout-form-div").hide();A(I+" > div.s2member-pro-paypal-sp-checkout-form-div :input").attr(b);A(o+" #s2member-pro-paypal-sp-checkout-submit").replaceWith(h);(R)?A(o+" #s2member-pro-paypal-sp-checkout-submit").focus():null}}}}}K()})();A(m).click(u).change(u);A(P).click(function(){A(l).val("apply-coupon"),n.submit()});n.submit(function(){if(A.inArray(A(l).val(),["option","apply-coupon"])===-1){var U=this,S="",R="",V="";var T=A(O+" input#recaptcha_response_field, "+O+" #g-recaptcha-response");if(!A(m+":checked").val()){A(m).val(["PayPal"])}A(":input",U).each(function(){var W=A.trim(A(this).attr("id")).replace(/---[0-9]+$/g,"");if(W&&(S=A.trim(A('label[for="'+W.replace(/-(month|year)/,"")+'"]',U).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(R=ws_plugin__s2member_validationErrors(S,this,U)){V+=R+"\n\n"}}});if(V=A.trim(V)){alert('â Oops, you missed something: â\n\n'+V);return false}else{if(T.length&&!T.val()){alert('â Oops, you missed something: â\n\nSecurity Verification missing. Please try again.');return false}}}
7A(d).attr(B),ws_plugin__s2member_animateProcessing(A(d)),A(P).attr(B);return true})}else{if((q=A("form#s2member-pro-paypal-checkout-form")).length===1){var j,F,K,t=true,J,p,f,D,c,s,u,E,a="div#s2member-pro-paypal-checkout-form-options-section",G="div#s2member-pro-paypal-checkout-form-description-section",H="div#s2member-pro-paypal-checkout-form-coupon-section",P=H+" input#s2member-pro-paypal-checkout-coupon-apply",N="div#s2member-pro-paypal-checkout-form-registration-section",Q="div#s2member-pro-paypal-checkout-form-custom-fields-section",v="div#s2member-pro-paypal-checkout-form-billing-method-section",m=v+' input[name="s2member_pro_paypal_checkout[card_type]"]',I="div#s2member-pro-paypal-checkout-form-billing-address-section",y=A(I+" > div#s2member-pro-paypal-checkout-form-ajax-tax-div"),O="div#s2member-pro-paypal-checkout-form-captcha-section",o="div#s2member-pro-paypal-checkout-form-submission-section",l=o+" input#s2member-pro-paypal-checkout-nonce",d=o+" #s2member-pro-paypal-checkout-submit";var C=A.trim(A("input#s2member-pro-paypal-lang-attr").val());var g='<button type="submit" id="s2member-pro-paypal-checkout-submit" class="s2member-pro-paypal-submit s2member-pro-paypal-checkout-submit btn btn-primary" tabindex="600">Submit Form</button>';var h='<input type="image" src="https://www.paypal.com/'+((C)?C:'en_US')+'/i/btn/btn_xpressCheckout.gif" id="s2member-pro-paypal-checkout-submit" class="s2member-pro-paypal-submit s2member-pro-paypal-checkout-submit" value="Submit Form" tabindex="600" />';ws_plugin__s2member_animateProcessing(A(d),"reset"),A(d).removeAttr("disabled"),A(P).removeAttr("disabled");(j=function(R){if(!A(a+" select#s2member-pro-paypal-checkout-options option").length){A(a).hide();A(G).show()}else{A(a).show();A(G).hide();A(a+" select#s2member-pro-paypal-checkout-options").change(function(){A(l).val("option");q.attr("action",q.attr("action").replace(/#.*$/,"")+"#s2p-form");q.submit()})}})();(F=function(R){if(A(o+" input#s2member-pro-paypal-checkout-coupons-not-required-or-not-possible").length){A(H).hide()}else{A(H).show()}})();(K=function(R){if(A(o+" input#s2member-pro-paypal-checkout-tax-not-required-or-not-possible").length){y.hide(),t=false}})();(J=function(S){if(t&&!(S&&S.interval&&document.activeElement.id==="s2member-pro-paypal-checkout-country")){var R=A(o+" input#s2member-pro-paypal-checkout-attr").val();var V=A.trim(A(I+" input#s2member-pro-paypal-checkout-state").val());var W=A(I+" select#s2member-pro-paypal-checkout-country").val();var U=A.trim(A(I+" input#s2member-pro-paypal-checkout-zip").val());var T=V+"|"+W+"|"+U;if(V&&W&&U&&T&&(!c||c!==T)&&(c=T)){(D)?D.abort():null,clearTimeout(f),f=null;y.html('<div><img src="https://www.your-poc.com/wp-content/plugins/s2member/src/images/ajax-loader.gif" alt="Calculating Sales Tax..." /> calculating sales tax...</div>');f=setTimeout(function(){D=A.post('https://www.your-poc.com/wp-admin/admin-ajax.php',{action:"ws_plugin__s2member_pro_paypal_ajax_tax",ws_plugin__s2member_pro_paypal_ajax_tax:'ZGVmNTAyMDBhMjI1Y2MxODc3MDQ2ZmQzMDY3MmQwYjUyMmU4MGU3NjlhNjNhZjE5MzFhMGU5YmMzYTgzN2E5M2NhM2Q3OGI5YmYxMTI4MGE2ZThiNWQ3YWE2Njk0MDE2Mzg4NTU5OGE0N2IwYjY1ZjE4M2NiNTlmOTQzNTExMmM2N2VmY2QxNjc0YjJhZGIzNzA5MTFmZDE0ODVkY2Q4MmYxN2I3ZWJkODdmODBkNWZkOTNiYzRlM2RiNDMzZmZjMTdmYWQyNmE5Mjk1NDk5NTEwZDc2ZGJkYmZmMDFiODU4N2U5NTUyZmRlNmZkYWRlMzU0ZGQ0',"ws_plugin__s2member_pro_paypal_ajax_tax_vars[attr]":R,"ws_plugin__s2member_pro_paypal_ajax_tax_vars[state]":V,"ws_plugin__s2member_pro_paypal_ajax_tax_vars[country]":W,"ws_plugin__s2member_pro_paypal_ajax_tax_vars[zip]":U},function(X,Z){clearTimeout(f),f=null;try{y.html("<div>"+A.sprintf('<strong>Sales Tax%s:</strong> %s<br /><strong>â Total%s:</strong> %s',((X.trial)?' Today':""),((X.tax_per)?"<em>"+X.tax_per+"</em> ( "+X.cur_symbol+""+X.tax+" )":X.cur_symbol+""+X.tax),((X.trial)?' Today':""),X.cur_symbol+""+X.total)+"</div>")}catch(Y){}},"json")},((S&&S.keyCode)?1000:100))}else{if(!V||!W||!U||!T){y.html(""),c=null}}}})();p=function(R){setTimeout(function(){J(R)},10)};
7A(I+" input#s2member-pro-paypal-checkout-state").bind("keyup blur",J).bind("cut paste",p);A(I+" input#s2member-pro-paypal-checkout-zip").bind("keyup blur",J).bind("cut paste",p);A(I+" select#s2member-pro-paypal-checkout-country").bind("change",J);setInterval(function(){J({interval:true})},1000);(s=function(R){if(A(o+" input#s2member-pro-paypal-checkout-password-not-required-or-not-possible").length){A(N+" > div#s2member-pro-paypal-checkout-form-password-div").hide();A(N+" > div#s2member-pro-paypal-checkout-form-password-div :input").attr(i)}})();(E=function(R){if(S2MEMBER_CURRENT_USER_IS_LOGGED_IN){A(N+" input#s2member-pro-paypal-checkout-first-name").each(function(){var S=A(this),T=S.val();(!T)?S.val(S2MEMBER_CURRENT_USER_FIRST_NAME):null});A(N+" input#s2member-pro-paypal-checkout-last-name").each(function(){var S=A(this),T=S.val();(!T)?S.val(S2MEMBER_CURRENT_USER_LAST_NAME):null});A(N+" input#s2member-pro-paypal-checkout-email").val(S2MEMBER_CURRENT_USER_EMAIL).attr(i);A(N+" input#s2member-pro-paypal-checkout-username").val(S2MEMBER_CURRENT_USER_LOGIN).attr(i);A(N+" > div#s2member-pro-paypal-checkout-form-password-div").hide();A(N+" > div#s2member-pro-paypal-checkout-form-password-div :input").attr(i);if(A.trim(A(N+" > div#s2member-pro-paypal-checkout-form-registration-section-title").html())==='Create Profile'){A(N+" > div#s2member-pro-paypal-checkout-form-registration-section-title").html('Your Profile')}A(Q).hide(),A(Q+" :input").attr(i)}})();(u=function(R){if(A(o+" input#s2member-pro-paypal-checkout-payment-not-required-or-not-possible").length){A(m).val(["Free"])}var S=A(m+":checked").val();if(A.inArray(S,["Free"])!==-1){A(v).hide(),A(I).hide();A(v+" > div.s2member-pro-paypal-checkout-form-div").hide();A(v+" > div.s2member-pro-paypal-checkout-form-div :input").attr(b);A(I+" > div.s2member-pro-paypal-checkout-form-div").hide();A(I+" > div.s2member-pro-paypal-checkout-form-div :input").attr(b);(!t)?y.hide():null;A(o+" #s2member-pro-paypal-checkout-submit").replaceWith(g);(R)?A(o+" #s2member-pro-paypal-checkout-submit").focus():null}else{if(A.inArray(S,["Visa","MasterCard","Amex","Discover"])!==-1){A(v).show(),A(I).show();A(v+" > div.s2member-pro-paypal-checkout-form-div").show();A(v+" > div.s2member-pro-paypal-checkout-form-div :input").attr(x);A(v+" > div#s2member-pro-paypal-checkout-form-card-start-date-issue-number-div").hide();A(v+" > div#s2member-pro-paypal-checkout-form-card-start-date-issue-number-div :input").attr(b);A(I+" > div.s2member-pro-paypal-checkout-form-div").show();A(I+" > div.s2member-pro-paypal-checkout-form-div :input").attr(x);(!t)?y.hide():null;A(o+" #s2member-pro-paypal-checkout-submit").replaceWith(g);(R)?A(v+" input#s2member-pro-paypal-checkout-card-number").focus():null}else{if(A.inArray(S,["Maestro","Solo"])!==-1){A(v).show(),A(I).show();A(v+" > div.s2member-pro-paypal-checkout-form-div").show();A(v+" > div.s2member-pro-paypal-checkout-form-div :input").attr(x);A(I+" > div.s2member-pro-paypal-checkout-form-div").show();A(I+" > div.s2member-pro-paypal-checkout-form-div :input").attr(x);(!t)?y.hide():null;A(o+" #s2member-pro-paypal-checkout-submit").replaceWith(g);(R)?A(v+" input#s2member-pro-paypal-checkout-card-number").focus():null}else{if((!S||S==="PayPal")&&t){if(A(v).attr("data-paypal-only")){A(v).hide()}else{A(v).show()}A(I).show();A(v+" > div.s2member-pro-paypal-checkout-form-div").show();A(v+" > div.s2member-pro-paypal-checkout-form-div :input").attr(x);A(v+" > div#s2member-pro-paypal-checkout-form-card-number-div").hide();A(v+" > div#s2member-pro-paypal-checkout-form-card-number-div :input").attr(b);A(v+" > div#s2member-pro-paypal-checkout-form-card-expiration-div").hide();A(v+" > div#s2member-pro-paypal-checkout-form-card-expiration-div :input").attr(b);A(v+" > div#s2member-pro-paypal-checkout-form-card-verification-div").hide();A(v+" > div#s2member-pro-paypal-checkout-form-card-verification-div :input").attr(b);A(v+" > div#s2member-pro-paypal-checkout-form-card-start-date-issue-number-div").hide();A(v+" > div#s2member-pro-paypal-checkout-form-card-start-date-issue-number-div :input").attr(b);A(I+" > div.s2member-pro-paypal-checkout-form-div").show();A(I+" > div.s2member-pro-paypal-checkout-form-div :input").attr(x);A(I+" > div#s2member-pro-paypal-checkout-form-street-div").hide();A(I+" > div#s2member-pro-paypal-checkout-form-street-div :input").attr(b);A(I+" > div#s2member-pro-paypal-checkout-form-city-div").hide();A(I+" > div#s2member-pro-paypal-checkout-form-city-div :input").attr(b);A(o+" #s2member-pro-paypal-checkout-submit").replaceWith(h);(R)?A(I+" input#s2member-pro-paypal-checkout-state").focus():null}else{if(!S||S==="PayPal"){if(A(v).attr("data-paypal-only")){A(v).hide()}else{A(v).show()}A(I).hide();A(v+" > div.s2member-pro-paypal-checkout-form-div").hide();A(v+" > div.s2member-pro-paypal-checkout-form-div :input").attr(b);A(v+" > div#s2member-pro-paypal-checkout-form-card-type-div").show();A(v+" > div#s2member-pro-paypal-checkout-form-card-type-div :input").attr(x);A(I+" > div.s2member-pro-paypal-checkout-form-div").hide();A(I+" > div.s2member-pro-paypal-checkout-form-div :input").attr(b);A(o+" #s2member-pro-paypal-checkout-submit").replaceWith(h);(R)?A(o+" #s2member-pro-paypal-checkout-submit").focus():null}}}}}})();A(m).click(u).change(u);A(P).click(function(){A(l).val("apply-coupon"),q.submit()});A(N+" > div#s2member-pro-paypal-checkout-form-password-div :input").on("keyup initialize.s2",function(){ws_plugin__s2member_passwordStrength(A(N+" input#s2member-pro-paypal-checkout-username"),A(N+" input#s2member-pro-paypal-checkout-password1"),A(N+" input#s2member-pro-paypal-checkout-password2"),A(N+" div#s2member-pro-paypal-checkout-form-password-strength"))}).trigger("initialize.s2");q.submit(function(){if(A.inArray(A(l).val(),["option","apply-coupon"])===-1){var U=this,S="",R="",X="";var T=A(O+" input#recaptcha_response_field, "+O+" #g-recaptcha-response");var W=A(N+' input#s2member-pro-paypal-checkout-password1[aria-required="true"]');var V=A(N+" input#s2member-pro-paypal-checkout-password2");if(!A(m+":checked").val()){A(m).val(["PayPal"])}A(":input",U).each(function(){var Y=A.trim(A(this).attr("id")).replace(/---[0-9]+$/g,"");if(Y&&(S=A.trim(A('label[for="'+Y.replace(/-(month|year)/,"")+'"]',U).first().children("span").first().text().replace(/[\r\n\t]+/g," ")))){if(R=ws_plugin__s2member_validationErrors(S,this,U)){X+=R+"\n\n"}}});if(X=A.trim(X)){alert('â Oops, you missed something: â\n\n'+X);return false}else{if(W.length&&A.trim(W.val())!==A.trim(V.val())){alert('â Oops, you missed something: â\n\nPasswords do not match up. Please try again.');return false}else{if(W.length&&A.trim(W.val()).length<ws_plugin__s2member_passwordMinLength()){alert('â Oops, you missed something: â\n\nPassword MUST be at least 6 characters. Please try again.');return false}else{if(W.length&&ws_plugin__s2member_passwordStrengthMeter(A.trim(W.val()),A.trim(V.val()),true)<ws_plugin__s2member_passwordMinStrengthScore()){alert('â Oops, you missed something: â\n\nPassword strength MUST be `weak`, `good`, or `strong`. Please try again.');return false}else{if(T.length&&!T.val()){alert('â Oops, you missed something: â\n\nSecurity Verification missing. Please try again.');return false}}}}}}A(d).attr(B),ws_plugin__s2member_animateProcessing(A(d)),A(P).attr(B);return true})}}}}}(L=function(){A("div#s2member-pro-paypal-form-response").each(function(){var R=A(this).offset();window.scrollTo(0,R.top-100)})})()});/** 8 * Modern PayPal Checkout UI for PayPal Pro-Forms. 9 * 10 * @package s2Member\PayPal 11 * @since 260818 12 */ 13jQuery(document).ready(function($) 14{ 15 if(typeof S2MEMBER_PRO_PAYPAL_CHECKOUT !== 'object' || !S2MEMBER_PRO_PAYPAL_CHECKOUT.enabled) 16 return; 17 18 var cfg = S2MEMBER_PRO_PAYPAL_CHECKOUT, sdkLoads = {}; 19
20 //260818.2056 Share one browser payment engine across membership and Specific Post/Page Pro-Forms. 21 var initForm = function(options) 22 { 23 var $form = $(options.form); 24 if($form.length !== 1) 25 return; 26 27 var $cardType = $form.find(options.cardType); 28 var $submitDiv = $form.find(options.submitDiv); 29 var $flow = $form.find(options.flow); 30 var $currency = $form.find(options.currency); 31 var $lc = $form.find(options.lc); 32 var $lang = $form.find('input#s2member-pro-paypal-lang-attr'); 33 var expectedFlow = $.trim($flow.val()); 34 var currency = $.trim($currency.val()).toUpperCase(); 35 var locale = $.trim($lang.val()); 36 var lc = $.trim($lc.val()).toUpperCase(); 37 var prepared = null, preparedFingerprint = ''; 38 var gatewayCheckoutOperation = expectedFlow === 'subscription' ? 'subscription' : 'payment'; 39 var gatewayCheckoutIdentity = null, subscriptionCreateUnresolved = false, paymentCreateUnresolved = false; 40 41 if(!expectedFlow || !currency || !cfg.client_id) 42 return; 43 44 //260901.0722 PPCO prepares over AJAX, so history.state can carry the signed logical checkout across reload/back-forward without adding coordinator fields to the rendered Pro-Form. 45 var gatewayCheckoutHistory = function(identity) 46 { 47 if(!options.gatewayCheckout || !window.history || !window.history.replaceState) 48 return; 49 50 var historyState = (window.history.state && typeof window.history.state === 'object') ? window.history.state : {}; 51 var gatewayCheckouts = (historyState.s2memberGatewayCheckouts && typeof historyState.s2memberGatewayCheckouts === 'object') ? historyState.s2memberGatewayCheckouts : {}; 52 var key = options.prefix; 53 var stored = gatewayCheckouts[key] || {}; 54 55 if(identity && identity.id && identity.token) 56 { 57 gatewayCheckoutIdentity = {id: identity.id, token: identity.token, operation: gatewayCheckoutOperation}; 58 gatewayCheckouts[key] = gatewayCheckoutIdentity; 59 historyState.s2memberGatewayCheckouts = gatewayCheckouts; 60 window.history.replaceState(historyState, document.title, window.location.href); 61 } 62 else if(stored.id && stored.token && stored.operation === gatewayCheckoutOperation) 63 gatewayCheckoutIdentity = stored; 64 }; 65 gatewayCheckoutHistory(); 66 67 //260818.2056 Different flow/currency/locale combinations need isolated SDK globals when multiple Pro-Forms share a page. 68 var sdkNamespace = ('s2m_pro_ppco_' + expectedFlow + '_' + currency + '_' + locale + '_' + lc).replace(/[^a-z0-9_]/gi, '_'); 69 var sdkScriptId = 's2member-pro-paypal-checkout-sdk-' + sdkNamespace; 70 71 var buttonId = options.prefix + '-paypal-checkout-button'; 72 var messageId = options.prefix + '-paypal-checkout-message'; 73 var responseId = options.prefix + '-paypal-checkout-response'; 74 var $submissionSection = $form.find('div#' + options.prefix + '-form-submission-section'); 75 var $responseDiv = $form.find('div#' + options.prefix + '-form-response-div'); 76 var $button = $('<div />', {'id': buttonId, 'class': 's2member-pro-paypal-checkout-button'}).css({'display': 'none', 'max-width': '145px', 'width': 'auto', 'margin': '0'}); 77 //260819.0124 Announce inline Checkout feedback without requiring visible keyboard focus on the message. 78 var $message = $('<div />', {'id': messageId, 'class': 's2member-pro-paypal-checkout-message ws-plugin--s2member-ppco-message', 'role': 'status', 'aria-live': 'polite'}).css({'display': 'none', 'clear': 'both', 'margin': '6px 0 0', 'text-align': 'right'}); 79 var $response = $('<div />', {'id': responseId}).hide(); 80 81 $submitDiv.append($button); 82 $submissionSection.append($message); //260819.0009 Keep the inline copy outside the floated submit div so messages cannot move the PayPal button. 83 $responseDiv.append($response); 84 85 var showMessage = function(message, type) 86 { 87 var content = message || cfg.messages.payment_failed; 88 var responseType = (type === 'info') ? 'info' : 'error'; 89 var responseClass = 's2member-pro-paypal-form-response-' + responseType + ' ' + options.prefix + '-form-response-' + responseType; 90 var messageClass = 'ws-plugin--s2member-ppco-' + responseType; 91 92 //260819.0042 Mirror the full Pro-Form response above and shared compact Checkout feedback beside the payment control. 93 $response.attr('class', responseClass).html(content).show(); 94 $message.empty().append($('<span />', {'class': messageClass}).html(content)).show(); 95 96 //260819.0124 Release PayPal's failed/cancelled button focus without moving visible focus onto another control. 97 try 98 { 99 if(document.activeElement && typeof document.activeElement.blur === 'function') 100 document.activeElement.blur(); 101 } 102 catch(error){} 103 }; 104 var showError = function(message) 105 { 106 showMessage(message, 'error'); 107 }; 108 var showInfo = function(message) 109 { 110 showMessage(message, 'info'); 111 }; 112 var clearMessage = function() 113 { 114 $response.hide().removeAttr('class').empty(); 115 $message.hide().empty(); 116 }; 117 var currentSubmit = function() 118 { 119 return $submitDiv.find(options.submit); 120 }; 121 var resetLegacySubmit = function() 122 { 123 var $submit = currentSubmit(); 124 ws_plugin__s2member_animateProcessing($submit, 'reset'); 125 $submit.removeAttr('disabled'); 126 $form.find(options.couponApply).removeAttr('disabled'); 127 }; 128 var billingMethod = function() 129 { 130 return $cardType.filter(':checked').val() || 'PayPal'; 131 }; 132 var isPayPal = function() 133 { 134 return billingMethod() === 'PayPal'; 135 }; 136 var encode = function(object) 137 { 138 var values = []; 139 $.each(object, function(key, value) 140 { 141 values.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); 142 }); 143 return values.join('&'); 144 }; 145 var formFingerprint = function() 146 { 147 var values = []; 148 $.each($form.serializeArray(), function(index, field) 149 { 150 //260831.2048 Password edits invalidate prepared state through an input/change handler below; never retain plaintext passwords inside the reusable browser fingerprint. 151 if(/(?:^|\[)(?:password1|password2)(?:\]|$)/.test(field.name)) 152 return; 153 //260818.2056 CAPTCHA responses are one-time transport proof, not purchase data; exclude them from prepared-token reuse. 154 if(/(?:^|\[)(?:g-recaptcha-response|recaptcha_challenge_field|recaptcha_response_field)(?:\]|$)/.test(field.name)) 155 return; 156 values.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value)); 157 }); 158 return values.join('&'); 159 }; 160 //260831.2048 Password values stay only in their form controls until a live final approval;
160 changing either field invalidates reuse without retaining another plaintext copy. 161 $form.on('input.s2memberPpcoPassword change.s2memberPpcoPassword', 'input[name="' + options.postName + '[password1]"], input[name="' + options.postName + '[password2]"]', function() 162 { 163 prepared = null, preparedFingerprint = ''; 164 }); 165 var resetCaptcha = function() 166 { 167 //260818.2056 Server preparation consumes the CAPTCHA token; reset its browser widget before any changed purchase can prepare again. 168 try 169 { 170 if(window.grecaptcha && typeof window.grecaptcha.reset === 'function') 171 window.grecaptcha.reset(); 172 else if(window.Recaptcha && typeof window.Recaptcha.reload === 'function') 173 window.Recaptcha.reload(); 174 } 175 catch(error){} 176 }; 177 var fetchJson = function(url, request) 178 { 179 return fetch(url, request).then(function(response) 180 { 181 return response.text(); 182 }).then(function(text) 183 { 184 try 185 { 186 return JSON.parse(text); 187 } 188 catch(error) 189 { 190 throw new Error('invalid_json'); 191 } 192 }); 193 }; 194 var postTo = function(url, data) 195 { 196 var form = document.createElement('form'); 197 form.method = 'post'; 198 form.acceptCharset = 'UTF-8'; 199 form.action = url; 200 $.each(data, function(name, value) 201 { 202 var input = document.createElement('input'); 203 input.type = 'hidden'; 204 input.name = name; 205 input.value = value; 206 form.appendChild(input); 207 }); 208 document.body.appendChild(form); 209 form.submit(); 210 }; 211 var validate = function() 212 { 213 var event = $.Event('submit'); 214 $form.data('s2member-ppco-validating', true); 215 $form.triggerHandler(event); 216 $form.removeData('s2member-ppco-validating'); 217 resetLegacySubmit(); 218 return !event.isDefaultPrevented(); 219 }; 220 var submitFree = function(freeHandoff) 221 { 222 //260818.2056 The opaque handoff proves preparation already validated this exact free purchase, including CAPTCHA. 223 $cardType.val(['Free']); 224 $form.find('input[name="' + options.postName + '[paypal_checkout_op]"], input[name="' + options.postName + '[paypal_checkout_free_handoff]"]').remove(); 225 $('<input />', {type: 'hidden', name: options.postName + '[paypal_checkout_op]', value: 'free'}).appendTo($form); 226 $('<input />', {type: 'hidden', name: options.postName + '[paypal_checkout_free_handoff]', value: freeHandoff}).appendTo($form); 227 HTMLFormElement.prototype.submit.call($form[0]); 228 }; 229 var prepare = function(formData, fingerprint) 230 { 231 var body = formData; 232 //260901.0722 Send only the signed coordinator identity recovered for this history entry; finalized purchase terms remain authoritative on the server. 233 if(options.gatewayCheckout && gatewayCheckoutIdentity && gatewayCheckoutIdentity.id && gatewayCheckoutIdentity.token) 234 { 235 body += (body ? '&' : '') + encodeURIComponent(options.postName + '[gateway_checkout_id]') + '=' + encodeURIComponent(gatewayCheckoutIdentity.id); 236 body += '&' + encodeURIComponent(options.postName + '[gateway_checkout_token]') + '=' + encodeURIComponent(gatewayCheckoutIdentity.token); 237 } 238 body += (body ? '&' : '') + encodeURIComponent(options.postName + '[paypal_checkout_op]') + '=prepare'; 239 240 return fetchJson($form.attr('action') || window.location.href, { 241 method: 'POST', 242 headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 243 body: body, 244 credentials: 'same-origin' 245 }).then(function(result) 246 { 247 if(result && result.error === 'pro_checkout_payment_not_required' && result.free_handoff) 248 { 249 submitFree(result.free_handoff); 250 throw new Error('payment_not_required'); 251 } 252 if(!result || !result.ok || !result.token || !result.endpoint || !result.invoice || result.flow !== expectedFlow) 253 { 254 showError(result && result.message ? result.message : cfg.messages.prepare_failed); 255 throw new Error(result && result.error ? result.error : 'prepare_failed'); 256 } 257 258 if(options.gatewayCheckout && result.gateway_checkout_id && result.gateway_checkout_token) 259 gatewayCheckoutHistory({id: result.gateway_checkout_id, token: result.gateway_checkout_token}); 260 prepared = result; 261 preparedFingerprint = fingerprint; 262 resetCaptcha(); 263 return result; 264 }); 265 }; 266 var sdkSource = function() 267 { 268 var base = cfg.sandbox ? 'https://www.sandbox.paypal.com/sdk/js' : 'https://www.paypal.com/sdk/js'; 269 var query = 'client-id=' + encodeURIComponent(cfg.client_id) + '¤cy=' + encodeURIComponent(currency) + '&disable-funding=card'; 270 query += (expectedFlow === 'subscription') ? '&vault=true&intent=subscription' : '&intent=capture&commit=true';
271 if(cfg.sandbox && lc) 272 query += '&buyer-country=' + encodeURIComponent(lc); 273 if(locale) 274 query += '&locale=' + encodeURIComponent(locale); 275 return base + '?' + query; 276 }; 277 var loadSdk = function(callback) 278 { 279 var PayPal = window[sdkNamespace], load = sdkLoads[sdkNamespace]; 280 if(PayPal && PayPal.Buttons) 281 { 282 callback(PayPal); 283 return; 284 } 285 286 if(load) 287 { 288 if(load.status === 'failed' || load.status === 'loaded') 289 showError(cfg.messages.sdk_failed); 290 else 291 load.callbacks.push({success: callback, failure: function(){ showError(cfg.messages.sdk_failed); }}); 292 return; 293 } 294 295 //260818.2056 One SDK request is shared by forms with identical SDK configuration; each form keeps its own render callback. 296 load = sdkLoads[sdkNamespace] = {status: 'loading', callbacks: [{success: callback, failure: function(){ showError(cfg.messages.sdk_failed); }}]}; 297 var script = document.createElement('script'); 298 script.id = sdkScriptId; 299 script.setAttribute('data-namespace', sdkNamespace); 300 script.src = sdkSource(); 301 script.async = true; 302 script.onload = function() 303 { 304 PayPal = window[sdkNamespace]; 305 var callbacks = load.callbacks.slice(0); 306 load.callbacks = []; 307 load.status = (PayPal && PayPal.Buttons) ? 'loaded' : 'failed'; 308 309 $.each(callbacks, function(index, queued) 310 { 311 if(load.status === 'loaded') 312 queued.success(PayPal); 313 else 314 queued.failure(); 315 }); 316 }; 317 script.onerror = function() 318 { 319 var callbacks = load.callbacks.slice(0); 320 load.callbacks = []; 321 load.status = 'failed'; 322 $.each(callbacks, function(index, queued){ queued.failure(); }); 323 }; 324 (document.head || document.body || document.documentElement).appendChild(script); 325 }; 326 var livePassword = function(name) 327 { 328 //260831.2048 Read a custom password only when sending the final browser approval; never copy it into prepared recovery state or browser storage. 329 var $password = $form.find('input[name="' + options.postName + '[' + name + ']"]'); 330 return $password.length ? String($password.val() || '') : ''; 331 }; 332 var frameworkRequest = function(operation, extra) 333 { 334 if(!prepared || !prepared.endpoint || !prepared.token) 335 return Promise.reject(new Error('purchase_not_prepared')); 336 337 var data = { 338 s2member_paypal_checkout_op: operation, 339 s2member_paypal_checkout_t: prepared.token 340 }; 341 $.extend(data, extra || {}); 342 343 return fetchJson(prepared.endpoint, { 344 method: 'POST', 345 headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 346 body: encode(data), 347 credentials: 'same-origin' 348 }); 349 }; 350 var delay = function(milliseconds) 351 { 352 return new Promise(function(resolve) 353 { 354 window.setTimeout(resolve, milliseconds); 355 }); 356 }; 357 var recoverSubscriptionId = function(attempt) 358 { 359 return frameworkRequest('get_subscription_id').then(function(result) 360 { 361 if(result && result.subscription_id) 362 { 363 clearMessage(); 364 return result.subscription_id; 365 } 366 if(result && result.error) 367 throw new Error(result.error); 368 if(attempt >= 10) 369 { 370 subscriptionCreateUnresolved = true; 371 throw new Error('subscription_create_unresolved'); 372 } 373 374 //260902.0200 Give the independent CREATED webhook a short window to repair an ambiguous create without repeatedly calling PayPal from the browser. 375 showInfo(cfg.messages.subscription_recovering); 376 return delay(1500).then(function(){ return recoverSubscriptionId(attempt + 1); }); 377 }); 378 }; 379 var confirmSubscription = function(subscriptionId, attempt) 380 { 381 return frameworkRequest('confirm_subscription', { 382 subscription_id: subscriptionId, 383 s2member_pro_paypal_checkout_password1: livePassword('password1'), 384 s2member_pro_paypal_checkout_password2: livePassword('password2') 385 }).then(function(result) 386 { 387 if(result && result.rtn_url && result.rtn_post) 388 { 389 clearMessage(); 390 postTo(result.rtn_url, result.rtn_post); 391 return; 392 } 393 if(result && result.pending_activation) 394 { 395 if(attempt >= 10) 396 throw new Error('subscription_activation_unresolved'); 397 398 //260902.0200 Buyer approval is not fulfillment; briefly wait for PayPal ACTIVE while the activation webhook remains an off-session fallback. 399 showInfo(cfg.messages.subscription_recovering); 400 return delay(1500).then(function(){ return confirmSubscription(subscriptionId, attempt + 1); }); 401 } 402 throw new Error(result && result.error ? result.error : 'subscription_confirm_failed'); 403 }); 404 }; 405 var recoverOrderId = function(attempt) 406 { 407 return frameworkRequest('get_order_status').then(function(result) 408 { 409 if(result && result.order_id) 410 { 411 clearMessage(); 412 return result.order_id; 413 } 414 if(result && result.error) 415 throw new Error(result.error); 416 if(attempt >= 10) 417 { 418 paymentCreateUnresolved = true; 419 throw new Error('order_create_unresolved'); 420 } 421 422 //260902.0646 This local poll is only for an overlapping server request that may still persist the order ID; ambiguous provider creation itself has no pre-approval webhook and is retried by the customer's next idempotent attempt. 423 showInfo(cfg.messages.payment_recovering); 424 return delay(1500).then(function(){ return recoverOrderId(attempt + 1); }); 425 }); 426 }; 427 var recoverPayment = function(orderId, attempt) 428 { 429 return frameworkRequest('get_order_status').then(function(result) 430 { 431 var status = result && result.status ? String(result.status).toUpperCase() : ''; 432 if(result && result.fulfilled) 433 return frameworkRequest('capture_order', {order_id: orderId}); 434 if(/^CAPTURE_(?:DENIED|FAILED|DECLINED)$/.test(status)) 435 throw new Error(status.toLowerCase()); 436 if(result && result.error) 437 throw new Error(result.error); 438 if(attempt >= 10) 439 { 440 paymentCreateUnresolved = true; 441 throw new Error('payment_completion_unresolved'); 442 } 443 444 //260902.0635 A PENDING capture is unpaid; briefly wait for the independent capture webhook to complete fulfillment while making only local coordinator checks. 445 showInfo(cfg.messages.payment_recovering); 446 return delay(1500).then(function(){ return recoverPayment(orderId, attempt + 1); }); 447 }); 448 }; 449 var renderButton = function(PayPal) 450 { 451 if($button.attr('data-s2m-ppco-rendered') === '1') 452 return; 453 454 var buttonOptions = { 455 fundingSource: PayPal.FUNDING.PAYPAL, 456 style: {layout: 'vertical', tagline: false, height: 40}, 457 onClick: function(data, actions) 458 { 459 clearMessage(); 460 461 //260818.2056 An unchanged purchase can safely reuse its prepared token even though its one-time CAPTCHA response was reset. 462 var fingerprint = formFingerprint(); 463 if(prepared && preparedFingerprint === fingerprint) 464 return actions.resolve(); 465 466 if(!validate()) 467 return actions.reject(); 468 469 var formData = $form.serialize(); 470 fingerprint = formFingerprint(); 471 prepared = null, preparedFingerprint = ''; 472 return prepare(formData, fingerprint).then(function() 473 { 474 return actions.resolve(); 475 }).catch(function(error) 476 { 477 return actions.reject(); 478 }); 479 }, 480 onCancel: function() 481 { 482 showInfo(cfg.messages.cancelled); 483 }, 484 onError: function() 485 { 486 if(expectedFlow === 'subscription' && subscriptionCreateUnresolved) 487 { 488 subscriptionCreateUnresolved = false;
489 showError(cfg.messages.subscription_unresolved); 490 } 491 else if(expectedFlow !== 'subscription' && paymentCreateUnresolved) 492 { 493 paymentCreateUnresolved = false; 494 showError(cfg.messages.payment_unresolved); 495 } 496 else showError(expectedFlow === 'subscription' ? cfg.messages.subscription_failed : cfg.messages.payment_failed); 497 } 498 }; 499 500 if(expectedFlow === 'subscription') 501 { 502 buttonOptions.createSubscription = function() 503 { 504 subscriptionCreateUnresolved = false; 505 //260901.2145 Create the PayPal subscription on s2Member's server so its ID is persisted in Gateway Checkout before browser approval/continuation can be lost. 506 return frameworkRequest('create_subscription').then(function(result) 507 { 508 if(result && result.subscription_id) 509 return result.subscription_id; 510 if(result && result.recoverable) 511 { 512 showInfo(cfg.messages.subscription_recovering); 513 return recoverSubscriptionId(0); 514 } 515 throw new Error(result && result.error ? result.error : 'subscription_create_failed'); 516 }); 517 }; 518 buttonOptions.onApprove = function(data) 519 { 520 var subscriptionId = data && data.subscriptionID ? data.subscriptionID : ''; 521 return confirmSubscription(subscriptionId, 0).catch(function(error) 522 { 523 showError(error && error.message === 'subscription_activation_unresolved' ? cfg.messages.subscription_unresolved : cfg.messages.subscription_failed); 524 }); 525 }; 526 } 527 else 528 { 529 buttonOptions.createOrder = function() 530 { 531 //260907.1820 Order creation is server-authoritative and idempotent; JS accepts only the persisted server order ID and locally polls only when another server request may still be finishing. 532 paymentCreateUnresolved = false; 533 return frameworkRequest('create_order').then(function(result) 534 { 535 if(result && result.order_id) 536 return result.order_id; 537 if(result && result.recoverable) 538 { 539 showInfo(cfg.messages.payment_recovering); 540 return recoverOrderId(0); 541 } 542 if(result && result.retryable) 543 paymentCreateUnresolved = true; 544 throw new Error(result && result.error ? result.error : 'order_create_failed'); 545 }); 546 }; 547 buttonOptions.onApprove = function(data) 548 { 549 var orderId = data && data.orderID ? data.orderID : ''; 550 //260907.1820 Capture remains server-authoritative; recoverable/PENDING responses switch to local coordinator polling so browser retries never issue a second capture POST for a known in-flight capture. 551 return frameworkRequest('capture_order', { 552 order_id: orderId, 553 s2member_pro_paypal_checkout_password1: livePassword('password1'), 554 s2member_pro_paypal_checkout_password2: livePassword('password2') 555 }).then(function(result) 556 { 557 if(result && result.rtn_url && result.rtn_post) 558 { 559 postTo(result.rtn_url, result.rtn_post); 560 return; 561 } 562 if(result && result.recoverable) 563 { 564 showInfo(cfg.messages.payment_recovering); 565 return recoverPayment(orderId, 0).then(function(recovered) 566 { 567 if(recovered && recovered.rtn_url && recovered.rtn_post) 568 { 569 postTo(recovered.rtn_url, recovered.rtn_post); 570 return; 571 } 572 throw new Error(recovered && recovered.error ? recovered.error : 'payment_completion_unresolved'); 573 }); 574 } 575 throw new Error(result && result.error ? result.error : 'order_capture_failed'); 576 }).catch(function(error) 577 { 578 var errorCode = error && error.message ? String(error.message) : ''; 579 if(/^capture_(?:denied|failed|declined)$/.test(errorCode)) 580 { 581 //260902.0646 A terminal failed capture is safe to abandon; force the next click through server validation so it receives a fresh logical checkout instead of replaying the failed order. 582 prepared = null, preparedFingerprint = ''; 583 } 584 if(/unresolved/.test(errorCode)) 585 { 586 paymentCreateUnresolved = false; 587 showError(cfg.messages.payment_unresolved); 588 } 589 else showError(cfg.messages.payment_failed); 590 }); 591 }; 592 } 593 594 try 595 { 596 $button.attr('data-s2m-ppco-rendered', '1'); 597 PayPal.Buttons(buttonOptions).render('#' + buttonId); 598 } 599 catch(error) 600 { 601 $button.removeAttr('data-s2m-ppco-rendered'); 602 showError(cfg.messages.sdk_failed); 603 } 604 }; 605 var ensureButton = function() 606 { 607 loadSdk(renderButton); 608 }; 609 var syncBillingMethod = function() 610 { 611 if(isPayPal()) 612 { 613 currentSubmit().hide(); 614 $button.show(); 615 ensureButton(); 616 } 617 else 618 {
619 $button.hide(); 620 clearMessage(); 621 currentSubmit().show(); 622 } 623 }; 624 625 //260818.2010 Legacy billing-method logic runs first; this second handler replaces only its PayPal submit presentation. 626 $cardType.on('click.s2memberPpco change.s2memberPpco', syncBillingMethod); 627 628 $form.on('submit.s2memberPpco', function(event) 629 { 630 if($form.data('s2member-ppco-validating')) 631 return true; 632 if($.inArray($form.find(options.nonce).val(), ['option', 'apply-coupon']) !== -1) 633 return true; 634 if(isPayPal()) 635 { 636 event.preventDefault(); 637 resetLegacySubmit(); 638 return false; 639 } 640 return true; 641 }); 642 643 syncBillingMethod(); 644 }; 645 646 initForm({ 647 form: 'form#s2member-pro-paypal-checkout-form', 648 prefix: 's2member-pro-paypal-checkout', 649 postName: 's2member_pro_paypal_checkout', 650 cardType: 'input[name="s2member_pro_paypal_checkout[card_type]"]', 651 submitDiv: 'div#s2member-pro-paypal-checkout-form-submit-div', 652 submit: '#s2member-pro-paypal-checkout-submit', 653 couponApply: 'input#s2member-pro-paypal-checkout-coupon-apply', 654 nonce: 'input#s2member-pro-paypal-checkout-nonce', 655 flow: 'input#s2member-pro-paypal-checkout-ppco-flow', 656 currency: 'input#s2member-pro-paypal-checkout-ppco-currency', 657 lc: 'input#s2member-pro-paypal-checkout-ppco-lc', 658 gatewayCheckout: true 659 }); 660 661 initForm({ 662 form: 'form#s2member-pro-paypal-sp-checkout-form', 663 prefix: 's2member-pro-paypal-sp-checkout', 664 postName: 's2member_pro_paypal_sp_checkout', 665 cardType: 'input[name="s2member_pro_paypal_sp_checkout[card_type]"]', 666 submitDiv: 'div#s2member-pro-paypal-sp-checkout-form-submit-div', 667 submit: '#s2member-pro-paypal-sp-checkout-submit', 668 couponApply: 'input#s2member-pro-paypal-sp-checkout-coupon-apply', 669 nonce: 'input#s2member-pro-paypal-sp-checkout-nonce', 670 flow: 'input#s2member-pro-paypal-sp-checkout-ppco-flow', 671 currency: 'input#s2member-pro-paypal-sp-checkout-ppco-currency', 672 lc: 'input#s2member-pro-paypal-sp-checkout-ppco-lc', 673 gatewayCheckout: true 674 }); 675}); 676 677;window.ws_plugin__s2member_asset_health=window.ws_plugin__s2member_asset_health||{};window.ws_plugin__s2member_asset_health["dynamic_js"]="dynamic-s2member-o";
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.