diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9aac58c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index 1c3e58b..556ddd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ node_modules +coverage .DS_Store -*.log \ No newline at end of file +.idea/ +*.log +*.orig diff --git a/.gitmodules b/.gitmodules index a4287ae..cc20633 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "lib/MiniCart"] path = lib/MiniCart - url = git://github.com/jeffharrell/MiniCart.git \ No newline at end of file + url = git://github.com/jeffharrell/minicart.git diff --git a/.jshintrc b/.jshintrc index 7139b39..9d8abec 100644 --- a/.jshintrc +++ b/.jshintrc @@ -19,7 +19,6 @@ "debug": false, "devel": false, - "es5": true, "strict": true, "globalstrict": false, diff --git a/.travis.yml b/.travis.yml index db62acf..073c185 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,6 @@ - language: node_js - - # test on these node.js versions - node_js: - - "0.8" +language: node_js - before_script: - # Run lint on every commit - # - npm install grunt - # - npm install - # - grunt lint \ No newline at end of file +# test on these node.js versions +node_js: + - "0.8" + - "0.10" \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..df93817 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# CONTRIBUTING + +To contribute, please fork the repository and: + +1. Run `git checkout -b your-new-feature` to create a new branch. +2. Code. +3. Add test cases to support your feature. +3. Run `grunt test` to verify all of the tests pass. +4. Run `grunt build` to generate the dist/ files. +5. Push! +6. Open a [pull request](https://github.com/paypal/JavaScriptButtons/pulls) diff --git a/Gruntfile.js b/Gruntfile.js index 246e534..c41adb9 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -4,38 +4,56 @@ module.exports = function (grunt) { // Project configuration. grunt.initConfig({ + pkg: grunt.file.readJSON("package.json"), + + meta: { + banner: "/*!\n * <%= pkg.name %>\n * <%= pkg.description %>\n * @version <%= pkg.version %> - <%= grunt.template.today(\'yyyy-mm-dd\') %>\n * @author <%= pkg.author.name %> <<%= pkg.author.url %>>\n */\n" + }, + jshint: { all: { - src: [ "src/*.js", "test/*.js" ], + src: ["src/*.js", "test/spec/*.js"], options: { jshintrc: ".jshintrc" } } }, + uglify: { dist: { - src: [ "", "src/paypal-button.js" ], + src: [ "<%= meta.banner %>", "src/paypal-button.js" ], dest: "dist/paypal-button.min.js", options: { - banner: "/*!\n * <%= pkg.name %>\n * <%= pkg.description %>\n * @version <%= pkg.version %> - <%= grunt.template.today(\'yyyy-mm-dd, h:MM:ss TT\') %>\n * @author <%= pkg.author.name %> <<%= pkg.author.url %>>\n */" + banner: "<%= meta.banner %>" } }, bundled: { - src: [ "", "lib/MiniCart/minicart.js", "src/paypal-button.js" ], + src: [ "<%= meta.banner %>", "lib/MiniCart/src/minicart.js", "src/paypal-button.js" ], dest: "dist/paypal-button-minicart.min.js", options: { - banner: "/*!\n * <%= pkg.name %>\n * <%= pkg.description %>\n * @version <%= pkg.version %> - <%= grunt.template.today(\'yyyy-mm-dd, h:MM:ss TT\') %>\n * @author <%= pkg.author.name %> <<%= pkg.author.url %>>\n */" + banner: "<%= meta.banner %>" } } + }, + + mochaTest: { + all: { + options: { + reporter: "spec" + }, + src: ["test/spec/*.js"] + } } }); // Load grunt tasks from npm packages grunt.loadNpmTasks("grunt-contrib-jshint"); grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-mocha-test"); + grunt.loadNpmTasks("grunt-update-submodules"); - // Default task. - grunt.registerTask("default", ["jshint", "uglify"]); + grunt.registerTask("default", ["jshint", "update_submodules", "uglify"]); + grunt.registerTask("test", ["jshint", "mochaTest"]); }; diff --git a/README.md b/README.md index 1361a96..5fcbd64 100644 --- a/README.md +++ b/README.md @@ -63,19 +63,26 @@ Subscribe buttons let you set up payment subscriptions. ## Button variables -All of PayPal's [HTML button variables](https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_Appx_websitestandard_htmlvariables) are supported by prefixing their name with "data-". Here are the most commonly used: +All of PayPal's [HTML button variables](https://developer.paypal.com/webapps/developer/docs/classic/paypal-payments-standard/integration-guide/Appx_websitestandard_htmlvariables/) are supported by prefixing their name with "data-". Here are the most commonly used: * `data-name` Description of the item. * `data-number` The number of the item. * `data-amount` The price of the item. +* `data-currency` The currency of the item (note: these cannot be mixed). * `data-quantity` Quantity of items to purchase. * `data-shipping` The cost of shipping this item. * `data-tax` Transaction-based tax override variable. * `data-size` For button images: `small` and `large` work. For QR codes enter the pixel length of the longest side. +* `data-locale` The desired locale of the PayPal site. +* `data-callback` The IPN notify URL to be called on completion of the transaction. +* `data-env` The PayPal environment to checkout in, e.g. `sandbox` (defaults to 'www') + ## Editable fields Creating editable fields is easy! Just add `-editable` to the name of your variable, e.g. `data-quantity-editable`, and an input field will magically appear for your users. +## Callback notification +On completion of a transaction you can get a payment notification ([IPN](https://www.x.com/developers/paypal/documentation-tools/ipn/integration-guide/IPNIntro)) on a callback URL you specify using the `data-callback` attribute. An [IPN simulator](https://developer.paypal.com/webapps/developer/applications/ipn_simulator) is available on the sandbox. ## Localization * Changing the default language of a button can be done by setting the variable `data-lc` with the correct locale code, e.g. es_ES. @@ -99,8 +106,8 @@ Creates and returns an HTML element that contains the button code. ## Download To download the production-ready JavaScript you'll need to save one of these files: -* [JavaScript Buttons](https://github.com/paypal/JavaScriptButtons/blob/master/dist/paypal-button.min.js) -* [JavaScript Buttons + MiniCart](https://github.com/paypal/JavaScriptButtons/blob/master/dist/paypal-button-minicart.min.js) +* [JavaScript Buttons](http://www.paypalobjects.com/js/external/paypal-button.min.js) +* [JavaScript Buttons + MiniCart](http://www.paypalobjects.com/js/external/paypal-button-minicart.min.js) The first file gives you support for PayPal's JavaScript buttons. The second file has the same code from the first, but also contains functionality for the [PayPal Mini Cart](https://github.com/jeffharrell/MiniCart). diff --git a/dist/paypal-button-minicart.min.js b/dist/paypal-button-minicart.min.js index 260b7c7..920120c 100644 --- a/dist/paypal-button-minicart.min.js +++ b/dist/paypal-button-minicart.min.js @@ -1,6 +1,7 @@ /*! - * PayPalJSButtons + * paypaljsbuttons * JavaScript integration for PayPal's payment buttons - * @version 1.0.0 - 2013-03-15, 6:52:50 PM + * @version 1.0.2 - 2014-01-21 * @author Jeff Harrell - */if(PAYPAL===void 0||!PAYPAL)var PAYPAL={};PAYPAL.apps=PAYPAL.apps||{},function(){"use strict";function e(e,t){var a,n,r,i,m,d,s,c,p=document.createElement("form"),l=document.createElement("button"),y=document.createElement("input"),A=e.items;p.method="post",p.action=u,p.className="paypal-button",p.target="_top",y.type="hidden",d=A.size&&A.size.value||"large",s=A.lc&&A.lc.value||"en_US",c=b[s]||b.en_US;for(m in A)a=A[m],a.isEditable?(i=document.createElement("input"),i.type="text",i.className="paypal-input",i.name=a.key,i.value=a.value,r=document.createElement("label"),r.className="paypal-label",r.appendChild(document.createTextNode(o.config.labels[a.key]||c[a.key])),r.appendChild(i),n=document.createElement("p"),n.className="paypal-group",n.appendChild(r)):(i=n=y.cloneNode(!0),i.name=a.key,i.value=a.value),p.appendChild(n);if(l.type="submit",l.className="paypal-button "+d,l.appendChild(document.createTextNode(c[t])),p.appendChild(l),PAYPAL.apps.MiniCart&&"_cart"===e.items.cmd.value){var g=PAYPAL.apps.MiniCart;g.UI.itemList||g.render(),g.bindForm(p)}return p}function t(){var e,t,a,n;document.getElementById("paypal-button")||(e="",t=document.createElement("style"),a=".paypal-button",n=a+" button[type=submit]",e+=a+" { white-space: nowrap; }",e+=n+' { white-space: nowrap; overflow: hidden; border-radius: 13px; font-family: "Arial", bold, italic; font-weight: bold; font-style: italic; border: 1px solid #ffa823; color: #0E3168; background: transparent; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; }',e+=n+':before { content: " "; position: absolute; width: 100%; height: 100%; border-radius: 11px; top: 0; left: 0; background: #ffa823; background: -webkit-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -moz-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -ms-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); z-index: -2; }',e+=n+':after { content: " "; position: absolute; width: 98%; height: 60%; border-radius: 40px 40px 38px 38px; top: 0; left: 0; background: -webkit-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -moz-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -ms-linear-gradient(top, #fefefe 0%, #fed994 100%); background: linear-gradient(top, #fefefe 0%, #fed994 100%); z-index: -1; -webkit-transform: translateX(1%);-moz-transform: translateX(1%); -ms-transform: translateX(1%); transform: translateX(1%); }',e+=n+".small { padding: 3px 15px; font-size: 12px; line-height: 14px; }",e+=n+".large { padding: 4px 19px; font-size: 14px; line-height: 16px; }",t.type="text/css",t.id="paypal-button",t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e)),document.getElementsByTagName("head")[0].appendChild(t))}function a(e,t){var a,n,r=document.createElement("img"),o=u+"?",m=13,d=e.items;t=t&&t.value||250;for(n in d)a=d[n],o+=a.key+"="+encodeURIComponent(a.value)+"&";return o=encodeURIComponent(o),r.src=i.replace("{url}",o).replace("{pattern}",m).replace("{size}",t),r}function n(e){var t,a,n,r,o,u={};if(t=e.attributes)for(o=0,r=t.length;r>o;o++)a=t[o],(n=/^data-([a-z0-9]+)(-editable)?/i.exec(a.name))&&(u[n[1]]={value:a.value,isEditable:!!n[2]});return u}function r(){this.items={},this.add=function(e,t,a){this.items[e]={key:e,value:t,isEditable:a}},this.remove=function(e){delete this.items[e]}}var o={},u="https://www.paypal.com/cgi-bin/webscr",i="https://www.paypal.com/webapps/ppint/qrcode?data={url}&pattern={pattern}&height={size}",m="JavaScriptButton_{type}",d={name:"item_name",number:"item_number",lang:"lc",recurrence:"p3",period:"t3"},b={da_DK:{buynow:"Køb nu",cart:"Læg i indkøbsvogn",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Pris",quantity:"Antal"},de_DE:{buynow:"Jetzt kaufen",cart:"In den Warenkorb",donate:"Spenden",subscribe:"Abonnieren",item_name:"Artikel",number:"Nummer",amount:"Betrag",quantity:"Menge"},en_AU:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_GB:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_US:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},es_ES:{buynow:"Comprar ahora",cart:"Añadir al carro",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},es_XC:{buynow:"Comprar ahora",cart:"Añadir al carrito",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},fr_CA:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_FR:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_XC:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},he_IL:{buynow:"וישכע הנק",cart:"תוינקה לסל ףסוה",donate:"םורת",subscribe:"יונמכ ףרטצה",item_name:"טירפ",number:"רפסמ",amount:"םוכס",quantity:"מותכ"},id_ID:{buynow:"Beli Sekarang",cart:"Tambah ke Keranjang",donate:"Donasikan",subscribe:"Berlangganan",item_name:"Barang",number:"Nomor",amount:"Harga",quantity:"Kuantitas"},it_IT:{buynow:"Paga adesso",cart:"Aggiungi al carrello",donate:"Donazione",subscribe:"Iscriviti",item_name:"Oggetto",number:"Numero",amount:"Importo",quantity:"Quantità"},ja_JP:{buynow:"今すぐ購入",cart:"カートに追加",donate:"寄付",subscribe:"購読",item_name:"商品",number:"番号",amount:"価格",quantity:"数量"},nl_NL:{buynow:"Nu kopen",cart:"Aan winkelwagentje toevoegen",donate:"Doneren",subscribe:"Abonneren",item_name:"Item",number:"Nummer",amount:"Bedrag",quantity:"Hoeveelheid"},no_NO:{buynow:"Kjøp nå",cart:"Legg til i kurv",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Beløp",quantity:"Antall"},pl_PL:{buynow:"Kup teraz",cart:"Dodaj do koszyka",donate:"Przekaż darowiznę",subscribe:"Subskrybuj",item_name:"Przedmiot",number:"Numer",amount:"Kwota",quantity:"Ilość"},pt_BR:{buynow:"Comprar agora",cart:"Adicionar ao carrinho",donate:"Doar",subscribe:"Assinar",item_name:"Produto",number:"Número",amount:"Valor",quantity:"Quantidade"},ru_RU:{buynow:"Купить сейчас",cart:"Добавить в корзину",donate:"Пожертвовать",subscribe:"Подписаться",item_name:"Товар",number:"Номер",amount:"Сумма",quantity:"Количество"},sv_SE:{buynow:"Köp nu",cart:"Lägg till i kundvagn",donate:"Donera",subscribe:"Abonnera",item_name:"Objekt",number:"Nummer",amount:"Belopp",quantity:"Antal"},th_TH:{buynow:"ซื้อทันที",cart:"เพิ่มลงตะกร้า",donate:"บริจาค",subscribe:"บอกรับสมาชิก",item_name:"ชื่อสินค้า",number:"รหัสสินค้า",amount:"ราคา",quantity:"จำนวน"},tr_TR:{buynow:"Hemen Alın",cart:"Sepete Ekleyin",donate:"Bağış Yapın",subscribe:"Abone Olun",item_name:"Ürün",number:"Numara",amount:"Tutar",quantity:"Miktar"},zh_CN:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"},zh_HK:{buynow:"立即買",cart:"加入購物車",donate:"捐款",subscribe:"訂用",item_name:"項目",number:"號碼",amount:"金額",quantity:"數量"},zh_TW:{buynow:"立即購",cart:"加到購物車",donate:"捐款",subscribe:"訂閱",item_name:"商品",number:"商品編號",amount:"單價",quantity:"數量"},zh_XC:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"}};if(PAYPAL.apps.ButtonFactory||(o.config={labels:{}},o.buttons={buynow:0,cart:0,donate:0,qr:0,subscribe:0},o.create=function(n,o,u,i){var b,s,c=new r;if(!n)return!1;for(s in o)c.add(d[s]||s,o[s].value,o[s].isEditable);return u=u||"buynow","cart"===u?(c.add("cmd","_cart"),c.add("add",!0)):"donate"===u?c.add("cmd","_donations"):"subscribe"===u?(c.add("cmd","_xclick-subscriptions"),c.items.amount&&!c.items.a3&&c.add("a3",c.items.amount.value)):c.add("cmd","_xclick"),c.add("business",n),c.add("bn",m.replace(/\{type\}/,u)),"qr"===u?(b=a(c,c.items.size),c.remove("size")):b=e(c,u),t(),this.buttons[u]+=1,i&&i.appendChild(b),b},PAYPAL.apps.ButtonFactory=o),"undefined"!=typeof document){var s,c,p,l,y,A,g=PAYPAL.apps.ButtonFactory,f=document.getElementsByTagName("script");for(y=0,A=f.length;A>y;y++)s=f[y],s&&s.src&&(c=s&&n(s),p=c&&c.button&&c.button.value,l=s.src.split("?merchant=")[1],l&&(g.create(l,c,p,s.parentNode),s.parentNode.removeChild(s)))}}(),"object"==typeof module&&"object"==typeof module.exports&&(module.exports=PAYPAL); \ No newline at end of file + */ +if("undefined"==typeof PAYPAL||!PAYPAL)var PAYPAL={};if(PAYPAL.apps=PAYPAL.apps||{},function(){"use strict";var a={parent:document.body,displayEdge:"right",edgeDistance:"50px",formTarget:null,cookiePath:"/",cartDuration:30,strings:{button:"Checkout",subtotal:"Subtotal: ",discount:"Discount: ",shipping:"does not include shipping & tax",processing:"Processing..."},name:"PPMiniCart",peekEnabled:!0,paypalURL:"https://www.paypal.com/cgi-bin/webscr",assetURL:"http://www.minicartjs.com/build/",events:{onRender:null,afterRender:null,onHide:null,afterHide:null,onShow:null,afterShow:null,onAddToCart:null,afterAddToCart:null,onRemoveFromCart:null,afterRemoveFromCart:null,onCheckout:null,onReset:null,afterReset:null}};if(!PAYPAL.apps.MiniCart){PAYPAL.apps.MiniCart=function(){var d={},e=!1,f=!1,g={_cart:!0,_xclick:!0},h="MiniCart_AddToCart_WPS_US",i=/^(?:business|currency_code|lc|paymentaction|no_shipping|cn|no_note|invoice|handling_cart|weight_cart|weight_unit|tax_cart|page_style|image_url|cpp_|cs|cbt|return|cancel_return|notify_url|rm|custom|charset)/,j=function(){var b,c,d=a.name,e=[];e.push("#"+d+" form { position:fixed; float:none; top:-250px; "+a.displayEdge+":"+a.edgeDistance+"; width:265px; margin:0; padding:50px 10px 0; min-height:170px; background:#fff url("+a.assetURL+"images/minicart_sprite.png) no-repeat -125px -60px; border:1px solid #999; border-top:0; font:13px/normal arial, helvetica; color:#333; text-align:left; -moz-border-radius:0 0 8px 8px; -webkit-border-radius:0 0 8px 8px; border-radius:0 0 8px 8px; -moz-box-shadow:1px 1px 1px rgba(0, 0, 0, 0.1); -webkit-box-shadow:1px 1px 1px rgba(0, 0, 0, 0.1); box-shadow:1px 1px 1px rgba(0, 0, 0, 0.1); } "),e.push("#"+d+" ul { position:relative; overflow-x:hidden; overflow-y:auto; height:130px; margin:0 0 7px; padding:0; list-style-type:none; border-top:1px solid #ccc; border-bottom:1px solid #ccc; } "),e.push("#"+d+" li { position:relative; margin:-1px 0 0; padding:6px 5px 6px 0; border-top:1px solid #f2f2f2; } "),e.push("#"+d+" li a { display: block; width: 155px; color:#333; text-decoration:none; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } "),e.push("#"+d+" li a span { display:block; color:#999; font-size:10px; } "),e.push("#"+d+" li .quantity { position:absolute; top:.5em; right:78px; width:22px; padding:1px; border:1px solid #83a8cc; text-align:right; } "),e.push("#"+d+" li .price { position:absolute; top:.5em; right:4px; } "),e.push("#"+d+" li .remove { position:absolute; top:9px; right:60px; width:14px; height:14px; background:url("+a.assetURL+"images/minicart_sprite.png) no-repeat -134px -4px; border:0; cursor:pointer; } "),e.push("#"+d+" p { margin:0; padding:0 0 0 20px; background:url("+a.assetURL+"images/minicart_sprite.png) no-repeat; font-size:13px; font-weight:bold; } "),e.push("#"+d+" p:hover { cursor:pointer; } "),e.push("#"+d+" p input { float:right; margin:4px 0 0; padding:1px 4px; text-decoration:none; font-weight:normal; color:#333; background:#ffa822 url("+a.assetURL+"images/minicart_sprite.png) repeat-x left center; border:1px solid #d5bd98; border-right-color:#935e0d; border-bottom-color:#935e0d; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; } "),e.push("#"+d+" p .shipping { display:block; font-size:10px; font-weight:normal; color:#999; } "),b=document.createElement("style"),b.type="text/css",b.styleSheet?b.styleSheet.cssText=e.join(""):b.appendChild(document.createTextNode(e.join(""))),c=document.getElementsByTagName("head")[0],c.appendChild(b)},k=function(){var b,e,f,g,i,j=d.UI;j.wrapper=document.createElement("div"),j.wrapper.id=a.name,b=document.createElement("input"),b.type="hidden",b.name="cmd",b.value="_cart",e=b.cloneNode(!1),e.name="upload",e.value="1",f=b.cloneNode(!1),f.name="bn",f.value=h,j.cart=document.createElement("form"),j.cart.method="post",j.cart.action=a.paypalURL,a.formTarget&&(j.cart.target=a.formTarget),j.cart.appendChild(b),j.cart.appendChild(e),j.cart.appendChild(f),j.wrapper.appendChild(j.cart),j.itemList=document.createElement("ul"),j.cart.appendChild(j.itemList),j.summary=document.createElement("p"),j.cart.appendChild(j.summary),j.button=document.createElement("input"),j.button.type="submit",j.button.value=a.strings.button,j.summary.appendChild(j.button),j.subtotal=document.createElement("span"),c.util.setText(j.subtotal,a.strings.subtotal),j.subtotalAmount=document.createElement("span"),c.util.setText(j.subtotalAmount,"0.00"),j.subtotal.appendChild(j.subtotalAmount),j.summary.appendChild(j.subtotal),j.shipping=document.createElement("span"),j.shipping.className="shipping",c.util.setText(j.shipping,a.strings.shipping),j.summary.appendChild(j.shipping),window.attachEvent&&!window.opera&&(i=navigator.userAgent.match(/MSIE\s([^;]*)/),i&&(i=parseFloat(i[1]),(7>i||i>=7&&"BackCompat"===document.compatMode)&&(j.cart.style.position="absolute",j.wrapper.style[a.displayEdge]="0",j.wrapper.style.setExpression("top","x = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop")))),g="string"==typeof a.parent?document.getElementById(a.parent):a.parent,g.appendChild(j.wrapper)},l=function(){var b,f,h,i=d.UI;for(b=document.getElementsByTagName("form"),h=0;hd;d++)r(a[d])&&(e=!0)},o=function(a){var b,d,e,f,g=a.elements,h={};for(e=0,f=g.length;f>e;e++)b=g[e],(d=c.util.getInputValue(b))&&(h[b.name]=d);return h},p=function(b){var c,e,f,g,h,j,k,l={},m={};for(f in b)i.test(f)?m[f]=b[f]:l[f]=b[f];for(j=0,g=d.products.length;g>j;j++)if(c=d.products[j].product,l.item_name===c.item_name&&l.item_number===c.item_number){for(h=!0,k=0;c["os"+k];){if(l["os"+k]!==c["os"+k]){h=!1;break}k++}if(h){l.offset=c.offset;break}}for(l.href=l.href||window.location.href,l.quantity=l.quantity||1,l.amount=l.amount||0,m["return"]&&-1===m["return"].indexOf("#")&&(m["return"]+="#"+a.name+"=reset"),e=l.option_index?l.option_index:0;l["os"+e];){for(j=0;"undefined"!=typeof l["option_select"+j];){if(l["option_select"+j]===l["os"+e]){l.amount=l.amount+parseFloat(l["option_amount"+j]);break}j++}e++}return{product:l,settings:m}},q=function(b){d.products=[],c.util.setText(d.UI.itemList,""),c.util.setText(d.UI.subtotalAmount,""),d.UI.button.value=a.strings.button,n(),d.updateSubtotal(b)},r=function(a){var e,f,g,h=d.UI,i=h.cart,j=new b(a,d.UI.itemList.children.length+1),k=a.product.offset;d.products[k]=j;for(g in a.settings)i.elements[g]?i.elements[g].value?i.elements[g].value=a.settings[g]:i.elements[g]=a.settings[g]:(f=document.createElement("input"),f.type="hidden",f.name=g,f.value=a.settings[g],i.appendChild(f));if(j.isPlaceholder)return!1;c.event.add(j.removeInput,"click",function(){s(j,k)});var l=j.quantityInput.value;return c.event.add(j.quantityInput,"keyup",function(){var a=this;e=setTimeout(function(){var b=parseInt(a.value,10);isNaN(b)||b===l||(l=b,j.setQuantity(b),j.getQuantity()||s(j,k),d.updateSubtotal(),c.storage.save(d.products))},250)}),h.itemList.insertBefore(j.liNode,h.itemList.firstChild),c.util.animate(j.liNode,"opacity",{from:0,to:1}),!0},s=function(b,e){var f=a.events,g=f.onRemoveFromCart,h=f.afterRemoveFromCart;("function"!=typeof g||g.call(d,b)!==!1)&&(b.setQuantity(0),b.quantityInput.style.display="none",c.util.animate(b.liNode,"opacity",{from:1,to:0},function(){c.util.animate(b.liNode,"height",{from:18,to:0},function(){try{b.liNode.parentNode.removeChild(b.liNode)}catch(a){}var c,e,f,g,i,j,k=d.UI.cart.getElementsByTagName("li"),l=k.length,m=1;for(i=0;l>i;i++){for(c=k[i].getElementsByTagName("input"),e=c.length,j=0;e>j;j++)f=c[j],g=/(.+)_[0-9]+$/.exec(f.name),g&&g[1]&&(f.name=g[1]+"_"+m);m++}"function"==typeof h&&h.call(d,b)})}),d.products[e].product.item_name="",d.products[e].product.item_number="",d.updateSubtotal(),c.storage.save(d.products,a.cartDuration))},t=function(b){var c=a.events.onCheckout;return"function"==typeof c&&c.call(d,b)===!1?void b.preventDefault():void(d.UI.button.value=a.strings.processing)};return d.products=[],d.UI={},d.render=function(b){var g,h,i,n,o;m(b),g=a.events,h=g.onRender,i=g.afterRender,("function"!=typeof h||h.call(d)!==!1)&&(f||(j(),k(),l(),n=location.hash.substring(1),0===n.indexOf(a.name+"=")&&(o=n.split("=")[1],"reset"===o&&(d.reset(),location.hash=""))),q(!0),f||(e?setTimeout(function(){d.hide(null)},500):c.storage.remove()),f=!0,"function"==typeof i&&i.call(d))},d.bindForm=function(a){if(a.add)c.event.add(a,"submit",function(a){a.preventDefault(a);var b=o(a.target);d.addToCart(b)});else{if(!a.display)return!1;c.event.add(a,"submit",function(a){a.preventDefault(),d.show(a)})}return!0},d.addToCart=function(b){var e,f,g=a.events,h=g.onAddToCart,i=g.afterAddToCart,j=!1;return b=p(b),f=b.product.offset,"function"!=typeof h||h.call(d,b.product)!==!1?((e=this.getProductAtOffset(f))?(e.product.quantity+=parseInt(b.product.quantity||1,10),e.setPrice(b.product.amount*e.product.quantity),e.setQuantity(e.product.quantity),j=!0):(b.product.offset=d.products.length,j=r(b)),d.updateSubtotal(),d.show(null),c.storage.save(d.products,a.cartDuration),"function"==typeof i&&i.call(d,b),j):void 0},d.getProductAtOffset=function(a){return"undefined"!=typeof a&&this.products[a]},d.calculateSubtotal=function(){var a,b,c,e,f,g,h=0,i=d.products;for(g=0,f=i.length;f>g;g++)b=i[g],(a=b.product)&&a.quantity&&a.amount&&(c=a.amount,e=b.getDiscount(),h+=parseFloat(c*a.quantity-e));return h.toFixed(2)},d.updateSubtotal=function(a){var b,e,f,g,h,i=d.UI,j=i.cart.elements,k=i.subtotalAmount,l=d.calculateSubtotal(),m=1;if(b="",e="",j.currency_code)b=j.currency_code.value||j.currency_code;else for(h=0,g=j.length;g>h;h++)if("currency_code"===j[h].name){b=j[h].value||j[h];break}c.util.setText(k,c.util.formatCurrency(l,b)),a||!function n(){return f=m.toString(16),m++,k.style.backgroundColor="#ff"+f,m>=15?(k.style.backgroundColor="transparent",void("0.00"===l&&d.reset())):void setTimeout(n,30)}()},d.show=function(b){var f=parseInt(d.UI.cart.offsetTop,10),g=0,h=a.events,i=h.onShow,j=h.afterShow;b&&b.preventDefault&&b.preventDefault(),("function"!=typeof i||i.call(d,b)!==!1)&&(c.util.animate(d.UI.cart,"top",{from:f,to:g},function(){"function"==typeof j&&j.call(d,b)}),d.UI.summary.style.backgroundPosition="-195px 2px",e=!0)},d.hide=function(b,f){var g,h=d.UI,i=h.cart,j=h.summary,k=i.offsetHeight?i.offsetHeight:document.defaultView.getComputedStyle(i,"").getPropertyValue("height"),l=j.offsetHeight?j.offsetHeight:document.defaultView.getComputedStyle(j,"").getPropertyValue("height"),m=parseInt(i.offsetTop,10),n=a.events,o=n.onHide,p=n.afterHide;g=f||0===d.products.length||!a.peekEnabled?-1*k:-1*(k-l-8),b&&b.preventDefault&&b.preventDefault(),("function"!=typeof o||o.call(d,b)!==!1)&&(c.util.animate(i,"top",{from:m,to:g},function(){"function"==typeof p&&p.call(d,b)}),j.style.backgroundPosition="-195px -32px",e=!1)},d.toggle=function(a){e?d.hide(a):d.show(a)},d.reset=function(){var b=d.UI,f=a.events,g=f.onReset,h=f.afterReset;("function"!=typeof g||g.call(d)!==!1)&&(d.products=[],e&&(c.util.setText(b.itemList,""),c.util.setText(b.subtotalAmount,""),d.hide(null,!0)),c.storage.remove(),"function"==typeof h&&h.call(d))},d}();var b=function(a,b){this._view(a,b)};b.prototype={_view:function(a,b){var d,e,f,g,h,i,j;if(this.product=a.product,this.settings=a.settings,this.liNode=document.createElement("li"),this.nameNode=document.createElement("a"),this.metaNode=document.createElement("span"),this.discountNode=document.createElement("span"),this.discountInput=document.createElement("input"),this.priceNode=document.createElement("span"),this.quantityInput=document.createElement("input"),this.removeInput=document.createElement("input"),!this.product||!this.product.item_name&&!this.product.item_number)return void(this.isPlaceholder=!0);this.product.item_name&&(d=this.product.item_name),c.util.setText(this.nameNode,d),this.nameNode.href=this.product.href,this.nameNode.appendChild(this.metaNode),this.product.item_number&&c.util.setText(this.metaNode,this.product.item_number,null,"
"),h=this.getOptions();for(j in h)c.util.setText(this.metaNode,j+": "+h[j],this.metaNode.innerHTML,"
");g=this.getDiscount(),g>=0&&(this.discountInput.type="hidden",this.discountInput.name="discount_amount_"+b,this.discountInput.value=g,this.metaNode.appendChild(this.discountInput)),e=this.getPrice(),this.priceNode.className="price",f=this.getQuantity(),this.quantityInput.name="quantity_"+b,this.quantityInput.className="quantity",this.quantityInput.setAttribute("autocomplete","off"),this.setQuantity(f),this.removeInput.type="button",this.removeInput.className="remove",this.liNode.appendChild(this.nameNode),this.liNode.appendChild(this.quantityInput),g&&this.liNode.appendChild(this.discountInput),this.liNode.appendChild(this.removeInput),this.liNode.appendChild(this.priceNode);for(j in this.product)"quantity"!==j&&-1===j.indexOf("discount_")&&(i=document.createElement("input"),i.type="hidden",i.name=j+"_"+b,i.value=this.product[j],this.liNode.appendChild(i))},getDiscount:function(){var a,b=0,c=this.product.discount_num||-1;return this.product.discount_amount>=0?(b=parseFloat(this.product.discount_amount),this.product.discount_amount2&&(a=this.getQuantity(),a>1&&(b+=Math.min(a-1,c)*parseFloat(this.product.discount_amount2)))):this.product.discount_rate>=0&&(b=this.product.amount*parseFloat(this.product.discount_rate)/100,this.product.discount_rate2&&(a=this.getQuantity(),a>1&&(b+=Math.min(a-1,c)*this.product.amount*parseFloat(this.product.discount_amount2)/100))),b&&b.toFixed(2)},getOptions:function(){for(var a={},b=0;"undefined"!=typeof this.product["on"+b];)a[this.product["on"+b]]=this.product["os"+b],b++;return a},setQuantity:function(b){var d;b=parseInt(b,10),this.product.quantity=b,this.quantityInput.value!==b&&(this.quantityInput.value=b,(d=this.getDiscount())&&(this.discountInput.value=d,this.discountNode.innerHTML||this.metaNode.appendChild(this.discountNode),c.util.setText(this.discountNode,this.discountNode.innerHTML+a.strings.discount+c.util.formatCurrency(d,this.settings.currency_code)))),this.setPrice(this.product.amount*b)},getQuantity:function(){return void 0!==typeof this.product.quantity?this.product.quantity:1},setPrice:function(a){a=parseFloat(a,10),c.util.setText(this.priceNode,c.util.formatCurrency(a.toFixed(2),this.settings.currency_code))},getPrice:function(){return(this.product.amount*this.getQuantity()).toFixed(2)}};var c={};c.storage=function(){var b=a.name;return window.localStorage?{load:function(){var a,d,e=localStorage.getItem(b);return e&&(e=JSON.parse(decodeURIComponent(e))),e&&e.expires&&(a=new Date,d=new Date(e.expires),a>d)?void c.storage.remove():e&&e.value?e.value:e},save:function(a,c){var d,e,f,g,h=new Date,i=[];if(a){for(g=0,f=a.length;f>g;g++)e=a[g],i.push({product:e.product,settings:e.settings});h.setTime(h.getTime()+24*c*60*60*1e3),d={value:i,expires:h.toGMTString()},localStorage.setItem(b,encodeURIComponent(JSON.stringify(d)))}},remove:function(){localStorage.removeItem(b)}}:{load:function(){var a,c,d,e,f,g=b+"=";try{for(c=document.cookie.split(";"),f=0;ff;f++)d=b[f],h.push({product:d.product,settings:d.settings});g.setTime(g.getTime()+24*c*60*60*1e3),document.cookie=a.name+"="+encodeURIComponent(JSON.stringify(h))+"; expires="+g.toGMTString()+"; path="+a.cookiePath}},remove:function(){this.save(null,-1)}}}(),c.event=function(){var a=[];return document.addEventListener?{add:function(b,c,d,e){e=e||b;var f=function(a){d.call(e,a)};b.addEventListener(c,f,!1),a.push([b,c,d,f])},remove:function(b,c,d){var e,f,g,h=a.length;for(g=0;h>g;g++)f=a[g],f[0]===b&&f[1]===c&&f[2]===d&&(e=f[3],e&&(b.removeEventListener(c,e,!1),delete a[g]))}}:document.attachEvent?{add:function(b,c,d,e){e=e||b;var f=function(){var a=window.event;a.target=a.target||a.srcElement,a.preventDefault=function(){a.returnValue=!1},d.call(e,a)};b.attachEvent("on"+c,f),a.push([b,c,d,f])},remove:function(b,c,d){var e,f,g,h=a.length;for(g=0;h>g;g++)f=a[g],f[0]===b&&f[1]===c&&f[2]===d&&(e=f[3],e&&(b.detachEvent("on"+c,e),delete a[g]))}}:void 0}(),c.util={animate:function(a,b,c,d){c=c||{},c.from=c.from||0,c.to=c.to||0,c.duration=c.duration||10,c.unit=/top|bottom|left|right|width|height/.test(b)?"px":"";var e=(c.to-c.from)/20,f=c.from;!function g(){return a.style[b]=f+c.unit,f+=e,e>0&&f>c.to||0>e&&f",">"),e+=d||"",a.innerHTML=e},formatCurrency:function(a,b){var c={AED:{before:"ج"},ANG:{before:"ƒ"},ARS:{before:"$"},AUD:{before:"$"},AWG:{before:"ƒ"},BBD:{before:"$"},BGN:{before:"лв"},BMD:{before:"$"},BND:{before:"$"},BRL:{before:"R$"},BSD:{before:"$"},CAD:{before:"$"},CHF:{before:""},CLP:{before:"$"},CNY:{before:"¥"},COP:{before:"$"},CRC:{before:"₡"},CZK:{before:"Kc"},DKK:{before:"kr"},DOP:{before:"$"},EEK:{before:"kr"},EUR:{before:"€"},GBP:{before:"£"},GTQ:{before:"Q"},HKD:{before:"$"},HRK:{before:"kn"},HUF:{before:"Ft"},IDR:{before:"Rp"},ILS:{before:"₪"},INR:{before:"Rs."},ISK:{before:"kr"},JMD:{before:"J$"},JPY:{before:"¥"},KRW:{before:"₩"},KYD:{before:"$"},LTL:{before:"Lt"},LVL:{before:"Ls"},MXN:{before:"$"},MYR:{before:"RM"},NOK:{before:"kr"},NZD:{before:"$"},PEN:{before:"S/"},PHP:{before:"Php"},PLN:{before:"z"},QAR:{before:"﷼"},RON:{before:"lei"},RUB:{before:"руб"},SAR:{before:"﷼"},SEK:{before:"kr"},SGD:{before:"$"},THB:{before:"฿"},TRY:{before:"TL"},TTD:{before:"TT$"},TWD:{before:"NT$"},UAH:{before:"₴"},USD:{before:"$"},UYU:{before:"$U"},VEF:{before:"Bs"},VND:{before:"₫"},XCD:{before:"$"},ZAR:{before:"R"}},d=c[b]||{},e=d.before||"",f=d.after||"";return e+a+f}}}}(),"undefined"==typeof PAYPAL||!PAYPAL)var PAYPAL={};PAYPAL.apps=PAYPAL.apps||{},function(a){"use strict";function b(){var b,c,d,e;a.getElementById("paypal-button")||(b="",c=a.createElement("style"),d=".paypal-button",e=d+" button",b+=d+" { white-space: nowrap; }",b+=e+' { white-space: nowrap; overflow: hidden; border-radius: 13px; font-family: "Arial", bold, italic; font-weight: bold; font-style: italic; border: 1px solid #ffa823; color: #0E3168; background: #ffa823; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; z-index: 0; }',b+=e+':before { content: " "; position: absolute; width: 100%; height: 100%; border-radius: 11px; top: 0; left: 0; background: #ffa823; background: -webkit-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -moz-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -ms-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); z-index: -2; }',b+=e+':after { content: " "; position: absolute; width: 98%; height: 60%; border-radius: 40px 40px 38px 38px; top: 0; left: 0; background: -webkit-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -moz-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -ms-linear-gradient(top, #fefefe 0%, #fed994 100%); background: linear-gradient(top, #fefefe 0%, #fed994 100%); z-index: -1; -webkit-transform: translateX(1%);-moz-transform: translateX(1%); -ms-transform: translateX(1%); transform: translateX(1%); }',b+=e+".small { padding: 3px 15px; font-size: 12px; }",b+=e+".large { padding: 4px 19px; font-size: 14px; }",c.type="text/css",c.id="paypal-button",c.styleSheet?c.styleSheet.cssText=b:c.appendChild(a.createTextNode(b)),a.getElementsByTagName("head")[0].appendChild(c))}function c(b,c){var d,e,f,i,j,k,m,n,o,p=a.createElement("form"),q=a.createElement("button"),r=a.createElement("input"),s=b.items;p.method="post",p.action=h.replace("{env}",b.items.env.value),p.className="paypal-button",p.target="_top",r.type="hidden",k=s.size&&s.size.value||"large",m=s.lc&&s.lc.value||"en_US",n=l[m]||l.en_US;for(j in s)d=s[j],d.isEditable?(i=a.createElement("input"),i.type="text",i.className="paypal-input",i.name=d.key,i.value=d.value,f=a.createElement("label"),f.className="paypal-label",f.appendChild(a.createTextNode(g.config.labels[d.key]||n[d.key])),f.appendChild(i),e=a.createElement("p"),e.className="paypal-group",e.appendChild(f)):(i=e=r.cloneNode(!0),i.name=d.key,i.value=d.value),p.appendChild(e);try{q.type="submit"}catch(t){q.setAttribute("type","submit")}return q.className="paypal-button "+k,q.appendChild(a.createTextNode(n[c])),p.appendChild(q),(o=PAYPAL.apps.MiniCart)&&"_cart"===b.items.cmd.value&&(o.UI.itemList||o.render(),o.bindForm(p)),p}function d(b,c){var d,e,f=h.replace("{env}",b.items.env.value),g=a.createElement("img"),j=f+"?",k=13,l=b.items;c=c&&c.value||250;for(e in l)d=l[e],j+=d.key+"="+encodeURIComponent(d.value)+"&";return j=encodeURIComponent(j),g.src=i.replace("{env}",b.items.env.value).replace("{url}",j).replace("{pattern}",k).replace("{size}",c),g}function e(a){var b,c,d,e,f,g={};if(b=a.attributes)for(f=0,e=b.length;e>f;f++)c=b[f],(d=c.name.match(/^data-([a-z0-9_]+)(-editable)?/i))&&(g[d[1]]={value:c.value,isEditable:!!d[2]});return g}function f(){this.items={},this.add=function(a,b,c){this.items[a]={key:a,value:b,isEditable:c}},this.remove=function(a){delete this.items[a]}}var g={},h="https://{env}.paypal.com/cgi-bin/webscr",i="https://{env}.paypal.com/webapps/ppint/qrcode?data={url}&pattern={pattern}&height={size}",j="JavaScriptButton_{type}",k={name:"item_name",number:"item_number",locale:"lc",currency:"currency_code",recurrence:"p3",period:"t3",callback:"notify_url"},l={da_DK:{buynow:"Køb nu",cart:"Læg i indkøbsvogn",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Pris",quantity:"Antal"},de_DE:{buynow:"Jetzt kaufen",cart:"In den Warenkorb",donate:"Spenden",subscribe:"Abonnieren",item_name:"Artikel",number:"Nummer",amount:"Betrag",quantity:"Menge"},en_AU:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_GB:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_US:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},es_ES:{buynow:"Comprar ahora",cart:"Añadir al carro",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},es_XC:{buynow:"Comprar ahora",cart:"Añadir al carrito",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},fr_CA:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_FR:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_XC:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},he_IL:{buynow:"וישכע הנק",cart:"תוינקה לסל ףסוה",donate:"םורת",subscribe:"יונמכ ףרטצה",item_name:"טירפ",number:"רפסמ",amount:"םוכס",quantity:"מותכ"},id_ID:{buynow:"Beli Sekarang",cart:"Tambah ke Keranjang",donate:"Donasikan",subscribe:"Berlangganan",item_name:"Barang",number:"Nomor",amount:"Harga",quantity:"Kuantitas"},it_IT:{buynow:"Paga adesso",cart:"Aggiungi al carrello",donate:"Donazione",subscribe:"Iscriviti",item_name:"Oggetto",number:"Numero",amount:"Importo",quantity:"Quantità"},ja_JP:{buynow:"今すぐ購入",cart:"カートに追加",donate:"寄付",subscribe:"購読",item_name:"商品",number:"番号",amount:"価格",quantity:"数量"},nl_NL:{buynow:"Nu kopen",cart:"Aan winkelwagentje toevoegen",donate:"Doneren",subscribe:"Abonneren",item_name:"Item",number:"Nummer",amount:"Bedrag",quantity:"Hoeveelheid"},no_NO:{buynow:"Kjøp nå",cart:"Legg til i kurv",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Beløp",quantity:"Antall"},pl_PL:{buynow:"Kup teraz",cart:"Dodaj do koszyka",donate:"Przekaż darowiznę",subscribe:"Subskrybuj",item_name:"Przedmiot",number:"Numer",amount:"Kwota",quantity:"Ilość"},pt_BR:{buynow:"Comprar agora",cart:"Adicionar ao carrinho",donate:"Doar",subscribe:"Assinar",item_name:"Produto",number:"Número",amount:"Valor",quantity:"Quantidade"},ru_RU:{buynow:"Купить сейчас",cart:"Добавить в корзину",donate:"Пожертвовать",subscribe:"Подписаться",item_name:"Товар",number:"Номер",amount:"Сумма",quantity:"Количество"},sv_SE:{buynow:"Köp nu",cart:"Lägg till i kundvagn",donate:"Donera",subscribe:"Abonnera",item_name:"Objekt",number:"Nummer",amount:"Belopp",quantity:"Antal"},th_TH:{buynow:"ซื้อทันที",cart:"เพิ่มลงตะกร้า",donate:"บริจาค",subscribe:"บอกรับสมาชิก",item_name:"ชื่อสินค้า",number:"รหัสสินค้า",amount:"ราคา",quantity:"จำนวน"},tr_TR:{buynow:"Hemen Alın",cart:"Sepete Ekleyin",donate:"Bağış Yapın",subscribe:"Abone Olun",item_name:"Ürün",number:"Numara",amount:"Tutar",quantity:"Miktar"},zh_CN:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"},zh_HK:{buynow:"立即買",cart:"加入購物車",donate:"捐款",subscribe:"訂用",item_name:"項目",number:"號碼",amount:"金額",quantity:"數量"},zh_TW:{buynow:"立即購",cart:"加到購物車",donate:"捐款",subscribe:"訂閱",item_name:"商品",number:"商品編號",amount:"單價",quantity:"數量"},zh_XC:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"}};if(PAYPAL.apps.ButtonFactory||(g.config={labels:{}},g.buttons={buynow:0,cart:0,donate:0,qr:0,subscribe:0},g.create=function(a,e,g,h){var i,l,m,n=new f;if(!a)return!1;for(l in e)n.add(k[l]||l,e[l].value||e[l],e[l].isEditable);return g=g||"buynow",m="www",n.items.env&&n.items.env.value&&(m+="."+n.items.env.value),"cart"===g?(n.add("cmd","_cart"),n.add("add",!0)):"donate"===g?n.add("cmd","_donations"):"subscribe"===g?(n.add("cmd","_xclick-subscriptions"),n.items.amount&&!n.items.a3&&n.add("a3",n.items.amount.value)):n.add("cmd","_xclick"),n.add("business",a),n.add("bn",j.replace(/\{type\}/,g)),n.add("env",m),"qr"===g?(i=d(n,n.items.size),n.remove("size")):i=c(n,g),b(),this.buttons[g]+=1,h&&h.appendChild(i),i},PAYPAL.apps.ButtonFactory=g),"undefined"!=typeof a){var m,n,o,p,q,r,s=PAYPAL.apps.ButtonFactory,t=a.getElementsByTagName("script");for(q=0,r=t.length;r>q;q++)m=t[q],m&&m.src&&(n=m&&e(m),o=n&&n.button&&n.button.value,p=m.src.split("?merchant=")[1],p&&(s.create(p,n,o,m.parentNode),m.parentNode.removeChild(m)))}}(document),"object"==typeof module&&"object"==typeof module.exports&&(module.exports=PAYPAL); \ No newline at end of file diff --git a/dist/paypal-button.min.js b/dist/paypal-button.min.js index 6ef82bf..a5dc46e 100644 --- a/dist/paypal-button.min.js +++ b/dist/paypal-button.min.js @@ -1,6 +1,7 @@ /*! - * PayPalJSButtons + * paypaljsbuttons * JavaScript integration for PayPal's payment buttons - * @version 1.0.0 - 2013-03-15, 6:52:49 PM + * @version 1.0.2 - 2014-01-21 * @author Jeff Harrell - */if(PAYPAL===void 0||!PAYPAL)var PAYPAL={};PAYPAL.apps=PAYPAL.apps||{},function(){"use strict";function e(e,t){var a,n,r,i,m,d,s,c,p=document.createElement("form"),l=document.createElement("button"),y=document.createElement("input"),A=e.items;p.method="post",p.action=u,p.className="paypal-button",p.target="_top",y.type="hidden",d=A.size&&A.size.value||"large",s=A.lc&&A.lc.value||"en_US",c=b[s]||b.en_US;for(m in A)a=A[m],a.isEditable?(i=document.createElement("input"),i.type="text",i.className="paypal-input",i.name=a.key,i.value=a.value,r=document.createElement("label"),r.className="paypal-label",r.appendChild(document.createTextNode(o.config.labels[a.key]||c[a.key])),r.appendChild(i),n=document.createElement("p"),n.className="paypal-group",n.appendChild(r)):(i=n=y.cloneNode(!0),i.name=a.key,i.value=a.value),p.appendChild(n);if(l.type="submit",l.className="paypal-button "+d,l.appendChild(document.createTextNode(c[t])),p.appendChild(l),PAYPAL.apps.MiniCart&&"_cart"===e.items.cmd.value){var g=PAYPAL.apps.MiniCart;g.UI.itemList||g.render(),g.bindForm(p)}return p}function t(){var e,t,a,n;document.getElementById("paypal-button")||(e="",t=document.createElement("style"),a=".paypal-button",n=a+" button[type=submit]",e+=a+" { white-space: nowrap; }",e+=n+' { white-space: nowrap; overflow: hidden; border-radius: 13px; font-family: "Arial", bold, italic; font-weight: bold; font-style: italic; border: 1px solid #ffa823; color: #0E3168; background: transparent; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; }',e+=n+':before { content: " "; position: absolute; width: 100%; height: 100%; border-radius: 11px; top: 0; left: 0; background: #ffa823; background: -webkit-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -moz-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -ms-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); z-index: -2; }',e+=n+':after { content: " "; position: absolute; width: 98%; height: 60%; border-radius: 40px 40px 38px 38px; top: 0; left: 0; background: -webkit-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -moz-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -ms-linear-gradient(top, #fefefe 0%, #fed994 100%); background: linear-gradient(top, #fefefe 0%, #fed994 100%); z-index: -1; -webkit-transform: translateX(1%);-moz-transform: translateX(1%); -ms-transform: translateX(1%); transform: translateX(1%); }',e+=n+".small { padding: 3px 15px; font-size: 12px; line-height: 14px; }",e+=n+".large { padding: 4px 19px; font-size: 14px; line-height: 16px; }",t.type="text/css",t.id="paypal-button",t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e)),document.getElementsByTagName("head")[0].appendChild(t))}function a(e,t){var a,n,r=document.createElement("img"),o=u+"?",m=13,d=e.items;t=t&&t.value||250;for(n in d)a=d[n],o+=a.key+"="+encodeURIComponent(a.value)+"&";return o=encodeURIComponent(o),r.src=i.replace("{url}",o).replace("{pattern}",m).replace("{size}",t),r}function n(e){var t,a,n,r,o,u={};if(t=e.attributes)for(o=0,r=t.length;r>o;o++)a=t[o],(n=/^data-([a-z0-9]+)(-editable)?/i.exec(a.name))&&(u[n[1]]={value:a.value,isEditable:!!n[2]});return u}function r(){this.items={},this.add=function(e,t,a){this.items[e]={key:e,value:t,isEditable:a}},this.remove=function(e){delete this.items[e]}}var o={},u="https://www.paypal.com/cgi-bin/webscr",i="https://www.paypal.com/webapps/ppint/qrcode?data={url}&pattern={pattern}&height={size}",m="JavaScriptButton_{type}",d={name:"item_name",number:"item_number",lang:"lc",recurrence:"p3",period:"t3"},b={da_DK:{buynow:"Køb nu",cart:"Læg i indkøbsvogn",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Pris",quantity:"Antal"},de_DE:{buynow:"Jetzt kaufen",cart:"In den Warenkorb",donate:"Spenden",subscribe:"Abonnieren",item_name:"Artikel",number:"Nummer",amount:"Betrag",quantity:"Menge"},en_AU:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_GB:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_US:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},es_ES:{buynow:"Comprar ahora",cart:"Añadir al carro",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},es_XC:{buynow:"Comprar ahora",cart:"Añadir al carrito",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},fr_CA:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_FR:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_XC:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},he_IL:{buynow:"וישכע הנק",cart:"תוינקה לסל ףסוה",donate:"םורת",subscribe:"יונמכ ףרטצה",item_name:"טירפ",number:"רפסמ",amount:"םוכס",quantity:"מותכ"},id_ID:{buynow:"Beli Sekarang",cart:"Tambah ke Keranjang",donate:"Donasikan",subscribe:"Berlangganan",item_name:"Barang",number:"Nomor",amount:"Harga",quantity:"Kuantitas"},it_IT:{buynow:"Paga adesso",cart:"Aggiungi al carrello",donate:"Donazione",subscribe:"Iscriviti",item_name:"Oggetto",number:"Numero",amount:"Importo",quantity:"Quantità"},ja_JP:{buynow:"今すぐ購入",cart:"カートに追加",donate:"寄付",subscribe:"購読",item_name:"商品",number:"番号",amount:"価格",quantity:"数量"},nl_NL:{buynow:"Nu kopen",cart:"Aan winkelwagentje toevoegen",donate:"Doneren",subscribe:"Abonneren",item_name:"Item",number:"Nummer",amount:"Bedrag",quantity:"Hoeveelheid"},no_NO:{buynow:"Kjøp nå",cart:"Legg til i kurv",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Beløp",quantity:"Antall"},pl_PL:{buynow:"Kup teraz",cart:"Dodaj do koszyka",donate:"Przekaż darowiznę",subscribe:"Subskrybuj",item_name:"Przedmiot",number:"Numer",amount:"Kwota",quantity:"Ilość"},pt_BR:{buynow:"Comprar agora",cart:"Adicionar ao carrinho",donate:"Doar",subscribe:"Assinar",item_name:"Produto",number:"Número",amount:"Valor",quantity:"Quantidade"},ru_RU:{buynow:"Купить сейчас",cart:"Добавить в корзину",donate:"Пожертвовать",subscribe:"Подписаться",item_name:"Товар",number:"Номер",amount:"Сумма",quantity:"Количество"},sv_SE:{buynow:"Köp nu",cart:"Lägg till i kundvagn",donate:"Donera",subscribe:"Abonnera",item_name:"Objekt",number:"Nummer",amount:"Belopp",quantity:"Antal"},th_TH:{buynow:"ซื้อทันที",cart:"เพิ่มลงตะกร้า",donate:"บริจาค",subscribe:"บอกรับสมาชิก",item_name:"ชื่อสินค้า",number:"รหัสสินค้า",amount:"ราคา",quantity:"จำนวน"},tr_TR:{buynow:"Hemen Alın",cart:"Sepete Ekleyin",donate:"Bağış Yapın",subscribe:"Abone Olun",item_name:"Ürün",number:"Numara",amount:"Tutar",quantity:"Miktar"},zh_CN:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"},zh_HK:{buynow:"立即買",cart:"加入購物車",donate:"捐款",subscribe:"訂用",item_name:"項目",number:"號碼",amount:"金額",quantity:"數量"},zh_TW:{buynow:"立即購",cart:"加到購物車",donate:"捐款",subscribe:"訂閱",item_name:"商品",number:"商品編號",amount:"單價",quantity:"數量"},zh_XC:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"}};if(PAYPAL.apps.ButtonFactory||(o.config={labels:{}},o.buttons={buynow:0,cart:0,donate:0,qr:0,subscribe:0},o.create=function(n,o,u,i){var b,s,c=new r;if(!n)return!1;for(s in o)c.add(d[s]||s,o[s].value,o[s].isEditable);return u=u||"buynow","cart"===u?(c.add("cmd","_cart"),c.add("add",!0)):"donate"===u?c.add("cmd","_donations"):"subscribe"===u?(c.add("cmd","_xclick-subscriptions"),c.items.amount&&!c.items.a3&&c.add("a3",c.items.amount.value)):c.add("cmd","_xclick"),c.add("business",n),c.add("bn",m.replace(/\{type\}/,u)),"qr"===u?(b=a(c,c.items.size),c.remove("size")):b=e(c,u),t(),this.buttons[u]+=1,i&&i.appendChild(b),b},PAYPAL.apps.ButtonFactory=o),"undefined"!=typeof document){var s,c,p,l,y,A,g=PAYPAL.apps.ButtonFactory,f=document.getElementsByTagName("script");for(y=0,A=f.length;A>y;y++)s=f[y],s&&s.src&&(c=s&&n(s),p=c&&c.button&&c.button.value,l=s.src.split("?merchant=")[1],l&&(g.create(l,c,p,s.parentNode),s.parentNode.removeChild(s)))}}(),"object"==typeof module&&"object"==typeof module.exports&&(module.exports=PAYPAL); \ No newline at end of file + */ +if("undefined"==typeof PAYPAL||!PAYPAL)var PAYPAL={};PAYPAL.apps=PAYPAL.apps||{},function(a){"use strict";function b(){var b,c,d,e;a.getElementById("paypal-button")||(b="",c=a.createElement("style"),d=".paypal-button",e=d+" button",b+=d+" { white-space: nowrap; }",b+=e+' { white-space: nowrap; overflow: hidden; border-radius: 13px; font-family: "Arial", bold, italic; font-weight: bold; font-style: italic; border: 1px solid #ffa823; color: #0E3168; background: #ffa823; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; z-index: 0; }',b+=e+':before { content: " "; position: absolute; width: 100%; height: 100%; border-radius: 11px; top: 0; left: 0; background: #ffa823; background: -webkit-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -moz-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -ms-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); z-index: -2; }',b+=e+':after { content: " "; position: absolute; width: 98%; height: 60%; border-radius: 40px 40px 38px 38px; top: 0; left: 0; background: -webkit-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -moz-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -ms-linear-gradient(top, #fefefe 0%, #fed994 100%); background: linear-gradient(top, #fefefe 0%, #fed994 100%); z-index: -1; -webkit-transform: translateX(1%);-moz-transform: translateX(1%); -ms-transform: translateX(1%); transform: translateX(1%); }',b+=e+".small { padding: 3px 15px; font-size: 12px; }",b+=e+".large { padding: 4px 19px; font-size: 14px; }",c.type="text/css",c.id="paypal-button",c.styleSheet?c.styleSheet.cssText=b:c.appendChild(a.createTextNode(b)),a.getElementsByTagName("head")[0].appendChild(c))}function c(b,c){var d,e,f,i,j,k,m,n,o,p=a.createElement("form"),q=a.createElement("button"),r=a.createElement("input"),s=b.items;p.method="post",p.action=h.replace("{env}",b.items.env.value),p.className="paypal-button",p.target="_top",r.type="hidden",k=s.size&&s.size.value||"large",m=s.lc&&s.lc.value||"en_US",n=l[m]||l.en_US;for(j in s)d=s[j],d.isEditable?(i=a.createElement("input"),i.type="text",i.className="paypal-input",i.name=d.key,i.value=d.value,f=a.createElement("label"),f.className="paypal-label",f.appendChild(a.createTextNode(g.config.labels[d.key]||n[d.key])),f.appendChild(i),e=a.createElement("p"),e.className="paypal-group",e.appendChild(f)):(i=e=r.cloneNode(!0),i.name=d.key,i.value=d.value),p.appendChild(e);try{q.type="submit"}catch(t){q.setAttribute("type","submit")}return q.className="paypal-button "+k,q.appendChild(a.createTextNode(n[c])),p.appendChild(q),(o=PAYPAL.apps.MiniCart)&&"_cart"===b.items.cmd.value&&(o.UI.itemList||o.render(),o.bindForm(p)),p}function d(b,c){var d,e,f=h.replace("{env}",b.items.env.value),g=a.createElement("img"),j=f+"?",k=13,l=b.items;c=c&&c.value||250;for(e in l)d=l[e],j+=d.key+"="+encodeURIComponent(d.value)+"&";return j=encodeURIComponent(j),g.src=i.replace("{env}",b.items.env.value).replace("{url}",j).replace("{pattern}",k).replace("{size}",c),g}function e(a){var b,c,d,e,f,g={};if(b=a.attributes)for(f=0,e=b.length;e>f;f++)c=b[f],(d=c.name.match(/^data-([a-z0-9_]+)(-editable)?/i))&&(g[d[1]]={value:c.value,isEditable:!!d[2]});return g}function f(){this.items={},this.add=function(a,b,c){this.items[a]={key:a,value:b,isEditable:c}},this.remove=function(a){delete this.items[a]}}var g={},h="https://{env}.paypal.com/cgi-bin/webscr",i="https://{env}.paypal.com/webapps/ppint/qrcode?data={url}&pattern={pattern}&height={size}",j="JavaScriptButton_{type}",k={name:"item_name",number:"item_number",locale:"lc",currency:"currency_code",recurrence:"p3",period:"t3",callback:"notify_url"},l={da_DK:{buynow:"Køb nu",cart:"Læg i indkøbsvogn",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Pris",quantity:"Antal"},de_DE:{buynow:"Jetzt kaufen",cart:"In den Warenkorb",donate:"Spenden",subscribe:"Abonnieren",item_name:"Artikel",number:"Nummer",amount:"Betrag",quantity:"Menge"},en_AU:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_GB:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},en_US:{buynow:"Buy Now",cart:"Add to Cart",donate:"Donate",subscribe:"Subscribe",item_name:"Item",number:"Number",amount:"Amount",quantity:"Quantity"},es_ES:{buynow:"Comprar ahora",cart:"Añadir al carro",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},es_XC:{buynow:"Comprar ahora",cart:"Añadir al carrito",donate:"Donar",subscribe:"Suscribirse",item_name:"Artículo",number:"Número",amount:"Importe",quantity:"Cantidad"},fr_CA:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_FR:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},fr_XC:{buynow:"Acheter",cart:"Ajouter au panier",donate:"Faire un don",subscribe:"Souscrire",item_name:"Objet",number:"Numéro",amount:"Montant",quantity:"Quantité"},he_IL:{buynow:"וישכע הנק",cart:"תוינקה לסל ףסוה",donate:"םורת",subscribe:"יונמכ ףרטצה",item_name:"טירפ",number:"רפסמ",amount:"םוכס",quantity:"מותכ"},id_ID:{buynow:"Beli Sekarang",cart:"Tambah ke Keranjang",donate:"Donasikan",subscribe:"Berlangganan",item_name:"Barang",number:"Nomor",amount:"Harga",quantity:"Kuantitas"},it_IT:{buynow:"Paga adesso",cart:"Aggiungi al carrello",donate:"Donazione",subscribe:"Iscriviti",item_name:"Oggetto",number:"Numero",amount:"Importo",quantity:"Quantità"},ja_JP:{buynow:"今すぐ購入",cart:"カートに追加",donate:"寄付",subscribe:"購読",item_name:"商品",number:"番号",amount:"価格",quantity:"数量"},nl_NL:{buynow:"Nu kopen",cart:"Aan winkelwagentje toevoegen",donate:"Doneren",subscribe:"Abonneren",item_name:"Item",number:"Nummer",amount:"Bedrag",quantity:"Hoeveelheid"},no_NO:{buynow:"Kjøp nå",cart:"Legg til i kurv",donate:"Doner",subscribe:"Abonner",item_name:"Vare",number:"Nummer",amount:"Beløp",quantity:"Antall"},pl_PL:{buynow:"Kup teraz",cart:"Dodaj do koszyka",donate:"Przekaż darowiznę",subscribe:"Subskrybuj",item_name:"Przedmiot",number:"Numer",amount:"Kwota",quantity:"Ilość"},pt_BR:{buynow:"Comprar agora",cart:"Adicionar ao carrinho",donate:"Doar",subscribe:"Assinar",item_name:"Produto",number:"Número",amount:"Valor",quantity:"Quantidade"},ru_RU:{buynow:"Купить сейчас",cart:"Добавить в корзину",donate:"Пожертвовать",subscribe:"Подписаться",item_name:"Товар",number:"Номер",amount:"Сумма",quantity:"Количество"},sv_SE:{buynow:"Köp nu",cart:"Lägg till i kundvagn",donate:"Donera",subscribe:"Abonnera",item_name:"Objekt",number:"Nummer",amount:"Belopp",quantity:"Antal"},th_TH:{buynow:"ซื้อทันที",cart:"เพิ่มลงตะกร้า",donate:"บริจาค",subscribe:"บอกรับสมาชิก",item_name:"ชื่อสินค้า",number:"รหัสสินค้า",amount:"ราคา",quantity:"จำนวน"},tr_TR:{buynow:"Hemen Alın",cart:"Sepete Ekleyin",donate:"Bağış Yapın",subscribe:"Abone Olun",item_name:"Ürün",number:"Numara",amount:"Tutar",quantity:"Miktar"},zh_CN:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"},zh_HK:{buynow:"立即買",cart:"加入購物車",donate:"捐款",subscribe:"訂用",item_name:"項目",number:"號碼",amount:"金額",quantity:"數量"},zh_TW:{buynow:"立即購",cart:"加到購物車",donate:"捐款",subscribe:"訂閱",item_name:"商品",number:"商品編號",amount:"單價",quantity:"數量"},zh_XC:{buynow:"立即购买",cart:"添加到购物车",donate:"捐赠",subscribe:"租用",item_name:"物品",number:"编号",amount:"金额",quantity:"数量"}};if(PAYPAL.apps.ButtonFactory||(g.config={labels:{}},g.buttons={buynow:0,cart:0,donate:0,qr:0,subscribe:0},g.create=function(a,e,g,h){var i,l,m,n=new f;if(!a)return!1;for(l in e)n.add(k[l]||l,e[l].value||e[l],e[l].isEditable);return g=g||"buynow",m="www",n.items.env&&n.items.env.value&&(m+="."+n.items.env.value),"cart"===g?(n.add("cmd","_cart"),n.add("add",!0)):"donate"===g?n.add("cmd","_donations"):"subscribe"===g?(n.add("cmd","_xclick-subscriptions"),n.items.amount&&!n.items.a3&&n.add("a3",n.items.amount.value)):n.add("cmd","_xclick"),n.add("business",a),n.add("bn",j.replace(/\{type\}/,g)),n.add("env",m),"qr"===g?(i=d(n,n.items.size),n.remove("size")):i=c(n,g),b(),this.buttons[g]+=1,h&&h.appendChild(i),i},PAYPAL.apps.ButtonFactory=g),"undefined"!=typeof a){var m,n,o,p,q,r,s=PAYPAL.apps.ButtonFactory,t=a.getElementsByTagName("script");for(q=0,r=t.length;r>q;q++)m=t[q],m&&m.src&&(n=m&&e(m),o=n&&n.button&&n.button.value,p=m.src.split("?merchant=")[1],p&&(s.create(p,n,o,m.parentNode),m.parentNode.removeChild(m)))}}(document),"object"==typeof module&&"object"==typeof module.exports&&(module.exports=PAYPAL); \ No newline at end of file diff --git a/lib/MiniCart b/lib/MiniCart index 9dbe238..90e224d 160000 --- a/lib/MiniCart +++ b/lib/MiniCart @@ -1 +1 @@ -Subproject commit 9dbe238f255bea468e8baf5dc945b76e404a523f +Subproject commit 90e224d9fcf825d1406b240fefb702e4a94af408 diff --git a/package.json b/package.json index 61e9ff4..1e94021 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,46 @@ { - "name": "PayPalJSButtons", - "description": "JavaScript integration for PayPal's payment buttons", - "version": "1.0.0", - "homepage": "http://paypal.github.com/JavaScriptButtons", - "author": { - "name": "Jeff Harrell", - "url": "https://github.com/jeffharrell/" - }, - "contributors": [ - { - "name": "Mark Stuart", - "url": "https://github.com/mstuart/" - } - ], - "repository": { - "type": "git", - "url": "https://github.com/paypal/JavaScriptButtons.git" - }, - "dependencies": {}, - "devDependencies": { - "grunt": "*", - "grunt-contrib-jshint": "*", - "grunt-contrib-uglify": "*", - "mocha": "~1.7.4", - "should": "*", - "jsdom": "*" - }, - "scripts": { - "test": "mocha" + "name": "paypaljsbuttons", + "description": "JavaScript integration for PayPal's payment buttons", + "version": "1.0.2", + "author": { + "name": "Jeff Harrell", + "url": "https://github.com/jeffharrell/" + }, + "contributors": [ + { + "name": "Mark Stuart", + "url": "https://github.com/mstuart/" } + ], + "keywords": [ + "paypal", + "paypal button", + "credit card", + "payment", + "payments", + "ecommerce", + "javascriptbuttons", + "jsbuttons" + ], + "homepage": "http://paypal.github.com/JavaScriptButtons", + "issues": "http://github.com/paypal/JavaScriptButtons/issues", + "repository": { + "type": "git", + "url": "https://github.com/paypal/JavaScriptButtons.git" + }, + "scripts": { + "test": "grunt test" + }, + "dependencies": {}, + "devDependencies": { + "chai": "~1.8.1", + "grunt": "~0.4.2", + "grunt-contrib-jshint": "~0.8.0", + "grunt-contrib-uglify": "~0.2.7", + "grunt-update-submodules": "~0.2.1", + "grunt-mocha-test": "~0.7.0", + "jsdom": "~0.8.10", + "mocha": "~1.13.0", + "should": "~2.1.1" + } } diff --git a/src/paypal-button.js b/src/paypal-button.js index 37754c5..a8c97e0 100644 --- a/src/paypal-button.js +++ b/src/paypal-button.js @@ -4,24 +4,24 @@ if (typeof PAYPAL === 'undefined' || !PAYPAL) { PAYPAL.apps = PAYPAL.apps || {}; - -(function () { +(function (document) { 'use strict'; - var app = {}, - paypalURL = 'https://www.paypal.com/cgi-bin/webscr', - qrCodeURL = 'https://www.paypal.com/webapps/ppint/qrcode?data={url}&pattern={pattern}&height={size}', + paypalURL = 'https://{env}.paypal.com/cgi-bin/webscr', + qrCodeURL = 'https://{env}.paypal.com/webapps/ppint/qrcode?data={url}&pattern={pattern}&height={size}', bnCode = 'JavaScriptButton_{type}', prettyParams = { name: 'item_name', number: 'item_number', - lang: 'lc', + locale: 'lc', + currency: 'currency_code', recurrence: 'p3', - period: 't3' + period: 't3', + callback: 'notify_url' }, - buttonText = { + locales = { da_DK: { buynow: 'Køb nu', cart: 'Læg i indkøbsvogn', donate: 'Doner', subscribe: 'Abonner', item_name: 'Vare', number: 'Nummer', amount: 'Pris', quantity: 'Antal' }, de_DE: { buynow: 'Jetzt kaufen', cart: 'In den Warenkorb', donate: 'Spenden', subscribe: 'Abonnieren', item_name: 'Artikel', number: 'Nummer', amount: 'Betrag', quantity: 'Menge' }, en_AU: { buynow: 'Buy Now', cart: 'Add to Cart', donate: 'Donate', subscribe: 'Subscribe', item_name: 'Item', number: 'Number', amount: 'Amount', quantity: 'Quantity' }, @@ -80,17 +80,22 @@ PAYPAL.apps = PAYPAL.apps || {}; * @return {HTMLElement} */ app.create = function (business, raw, type, parent) { - var data = new DataStore(), button, key; + var data = new DataStore(), button, key, env; if (!business) { return false; } // Normalize the data's keys and add to a data store for (key in raw) { - data.add(prettyParams[key] || key, raw[key].value, raw[key].isEditable); + data.add(prettyParams[key] || key, raw[key].value || raw[key], raw[key].isEditable); } // Defaults type = type || 'buynow'; + env = "www"; + + if (data.items.env && data.items.env.value) { + env += "." + data.items.env.value; + } // Cart buttons if (type === 'cart') { @@ -116,6 +121,7 @@ PAYPAL.apps = PAYPAL.apps || {}; // Add common data data.add('business', business); data.add('bn', bnCode.replace(/\{type\}/, type)); + data.add('env', env); // Build the UI components if (type === 'qr') { @@ -144,6 +150,43 @@ PAYPAL.apps = PAYPAL.apps || {}; } + /** + * Injects button CSS in the + * + * @return {void} + */ + function injectCSS() { + var css, styleEl, paypalButton, paypalInput; + + if (document.getElementById('paypal-button')) { + return; + } + + css = ''; + styleEl = document.createElement('style'); + paypalButton = '.paypal-button'; + paypalInput = paypalButton + ' button'; + + css += paypalButton + ' { white-space: nowrap; }'; + css += paypalInput + ' { white-space: nowrap; overflow: hidden; border-radius: 13px; font-family: "Arial", bold, italic; font-weight: bold; font-style: italic; border: 1px solid #ffa823; color: #0E3168; background: #ffa823; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; z-index: 0; }'; + css += paypalInput + ':before { content: " "; position: absolute; width: 100%; height: 100%; border-radius: 11px; top: 0; left: 0; background: #ffa823; background: -webkit-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -moz-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -ms-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); z-index: -2; }'; + css += paypalInput + ':after { content: " "; position: absolute; width: 98%; height: 60%; border-radius: 40px 40px 38px 38px; top: 0; left: 0; background: -webkit-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -moz-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -ms-linear-gradient(top, #fefefe 0%, #fed994 100%); background: linear-gradient(top, #fefefe 0%, #fed994 100%); z-index: -1; -webkit-transform: translateX(1%);-moz-transform: translateX(1%); -ms-transform: translateX(1%); transform: translateX(1%); }'; + css += paypalInput + '.small { padding: 3px 15px; font-size: 12px; }'; + css += paypalInput + '.large { padding: 4px 19px; font-size: 14px; }'; + + styleEl.type = 'text/css'; + styleEl.id = 'paypal-button'; + + if (styleEl.styleSheet) { + styleEl.styleSheet.cssText = css; + } else { + styleEl.appendChild(document.createTextNode(css)); + } + + document.getElementsByTagName('head')[0].appendChild(styleEl); + } + + /** * Builds the form DOM structure for a button * @@ -156,10 +199,10 @@ PAYPAL.apps = PAYPAL.apps || {}; btn = document.createElement('button'), hidden = document.createElement('input'), items = data.items, - item, child, label, input, key, size, locale, localeText; + item, child, label, input, key, size, locale, localeText, MiniCart; form.method = 'post'; - form.action = paypalURL; + form.action = paypalURL.replace('{env}', data.items.env.value); form.className = 'paypal-button'; form.target = '_top'; @@ -167,7 +210,7 @@ PAYPAL.apps = PAYPAL.apps || {}; size = items.size && items.size.value || 'large'; locale = items.lc && items.lc.value || 'en_US'; - localeText = buttonText[locale] || buttonText.en_US; + localeText = locales[locale] || locales.en_US; for (key in items) { item = items[key]; @@ -196,15 +239,19 @@ PAYPAL.apps = PAYPAL.apps || {}; form.appendChild(child); } - btn.type = 'submit'; + // Safari won't let you set read-only attributes on buttons. + try { + btn.type = 'submit'; + } catch (e) { + btn.setAttribute('type', 'submit'); + } btn.className = 'paypal-button ' + size; btn.appendChild(document.createTextNode(localeText[type])); form.appendChild(btn); // If the Mini Cart is present then register the form - if (PAYPAL.apps.MiniCart && data.items.cmd.value === '_cart') { - var MiniCart = PAYPAL.apps.MiniCart; + if ((MiniCart = PAYPAL.apps.MiniCart) && data.items.cmd.value === '_cart') { if (!MiniCart.UI.itemList) { MiniCart.render(); @@ -216,42 +263,6 @@ PAYPAL.apps = PAYPAL.apps || {}; return form; } - /** - * Injects button CSS in the - * - * @return {void} - */ - function injectCSS() { - var css, styleEl, paypalButton, paypalInput; - - if (document.getElementById('paypal-button')) { - return; - } - - css = ''; - styleEl = document.createElement('style'); - paypalButton = '.paypal-button'; - paypalInput = paypalButton + ' button[type=submit]'; - - css += paypalButton + ' { white-space: nowrap; }'; - css += paypalInput + ' { white-space: nowrap; overflow: hidden; border-radius: 13px; font-family: "Arial", bold, italic; font-weight: bold; font-style: italic; border: 1px solid #ffa823; color: #0E3168; background: transparent; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; }'; - css += paypalInput + ':before { content: " "; position: absolute; width: 100%; height: 100%; border-radius: 11px; top: 0; left: 0; background: #ffa823; background: -webkit-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -moz-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: -ms-linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); background: linear-gradient(top, #FFAA00 0%,#FFAA00 80%,#FFF8FC 100%); z-index: -2; }'; - css += paypalInput + ':after { content: " "; position: absolute; width: 98%; height: 60%; border-radius: 40px 40px 38px 38px; top: 0; left: 0; background: -webkit-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -moz-linear-gradient(top, #fefefe 0%, #fed994 100%); background: -ms-linear-gradient(top, #fefefe 0%, #fed994 100%); background: linear-gradient(top, #fefefe 0%, #fed994 100%); z-index: -1; -webkit-transform: translateX(1%);-moz-transform: translateX(1%); -ms-transform: translateX(1%); transform: translateX(1%); }'; - css += paypalInput + '.small { padding: 3px 15px; font-size: 12px; line-height: 14px; }'; - css += paypalInput + '.large { padding: 4px 19px; font-size: 14px; line-height: 16px; }'; - - styleEl.type = 'text/css'; - styleEl.id = 'paypal-button'; - - if (styleEl.styleSheet) { - styleEl.styleSheet.cssText = css; - } else { - styleEl.appendChild(document.createTextNode(css)); - } - - document.getElementsByTagName('head')[0].appendChild(styleEl); - } - /** * Builds the image for a QR code @@ -261,8 +272,9 @@ PAYPAL.apps = PAYPAL.apps || {}; * @return {HTMLElement} */ function buildQR(data, size) { - var img = document.createElement('img'), - url = paypalURL + '?', + var baseUrl = paypalURL.replace('{env}', data.items.env.value), + img = document.createElement('img'), + url = baseUrl + '?', pattern = 13, items = data.items, item, key; @@ -276,7 +288,8 @@ PAYPAL.apps = PAYPAL.apps || {}; } url = encodeURIComponent(url); - img.src = qrCodeURL.replace('{url}', url).replace('{pattern}', pattern).replace('{size}', size); + + img.src = qrCodeURL.replace('{env}', data.items.env.value).replace('{url}', url).replace('{pattern}', pattern).replace('{size}', size); return img; } @@ -295,7 +308,7 @@ PAYPAL.apps = PAYPAL.apps || {}; for (i = 0, len = attrs.length; i < len; i++) { attr = attrs[i]; - if ((matches = /^data-([a-z0-9]+)(-editable)?/i.exec(attr.name))) { + if ((matches = attr.name.match(/^data-([a-z0-9_]+)(-editable)?/i))) { dataset[matches[1]] = { value: attr.value, isEditable: !!matches[2] @@ -353,7 +366,7 @@ PAYPAL.apps = PAYPAL.apps || {}; } -}()); +}(document)); // Export for CommonJS environments diff --git a/test/index.html b/test/index.html index eeabc6d..78ccd4d 100644 --- a/test/index.html +++ b/test/index.html @@ -4,23 +4,38 @@ + - +
+ + + +
+

Buy Now (Sandbox)

+ +

Buy Now (Small)

-

Buy Now (Large)

-

Buy Now (Large/Japanese)

-

Buy Now (Large/German)

-

Buy Now (Large/Editable/English)

-

Cart (Small/Italian)

-

Cart (Large/English)

-