diff --git a/.gitignore b/.gitignore index 1c3e58b..15a8f89 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .DS_Store -*.log \ No newline at end of file +*.log +*.orig \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index 246e534..d9a1704 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -13,19 +13,35 @@ module.exports = function (grunt) { } } }, + concat: { + dist: { + src: [ "", "src/paypal-button.js" ], + dest: "dist/paypal-button.js", + options: { + 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" + } + }, + bundled: { + src: [ "", "lib/MiniCart/src/minicart.js", "src/paypal-button.js" ], + dest: "dist/paypal-button-minicart.js", + options: { + 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" + } + } + }, uglify: { dist: { src: [ "", "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: "/*!\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" } }, bundled: { - src: [ "", "lib/MiniCart/minicart.js", "src/paypal-button.js" ], + src: [ "", "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: "/*!\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" } } } @@ -34,8 +50,9 @@ module.exports = function (grunt) { // Load grunt tasks from npm packages grunt.loadNpmTasks("grunt-contrib-jshint"); grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-contrib-concat"); // Default task. - grunt.registerTask("default", ["jshint", "uglify"]); + grunt.registerTask("default", ["jshint", "concat", "uglify"]); }; diff --git a/README.md b/README.md index 1361a96..b1d4a13 100644 --- a/README.md +++ b/README.md @@ -68,14 +68,20 @@ All of PayPal's [HTML button variables](https://cms.paypal.com/us/cgi-bin/?cmd=_ * `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. + ## 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. diff --git a/dist/paypal-button-minicart.js b/dist/paypal-button-minicart.js new file mode 100644 index 0000000..573602c --- /dev/null +++ b/dist/paypal-button-minicart.js @@ -0,0 +1,370 @@ +/*! + * PayPalJSButtons + * JavaScript integration for PayPal's payment buttons + * @version 1.0.1 - 2013-03-26 + * @author Jeff Harrell + */ +if (typeof PAYPAL === 'undefined' || !PAYPAL) { + var PAYPAL = {}; +} + +PAYPAL.apps = PAYPAL.apps || {}; + + +(function () { + + '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}', + bnCode = 'JavaScriptButton_{type}', + prettyParams = { + name: 'item_name', + number: 'item_number', + locale: 'lc', + currency: 'currency_code', + recurrence: 'p3', + period: 't3', + callback: 'notify_url' + }, + buttonText = { + 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) { + + /** + * Initial config for the app. These values can be overridden by the page. + */ + app.config = { + labels: {} + }; + + /** + * A count of each type of button on the page + */ + app.buttons = { + buynow: 0, + cart: 0, + donate: 0, + qr: 0, + subscribe: 0 + }; + + /** + * Renders a button in place of the given element + * + * @param business {Object} The ID or email address of the merchant to create the button for + * @param raw {Object} An object of key/value data to set as button params + * @param type (String) The type of the button to render + * @param parent {HTMLElement} The element to add the button to (Optional) + * @return {HTMLElement} + */ + app.create = function (business, raw, type, parent) { + var data = new DataStore(), button, key; + + 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); + } + + // Defaults + type = type || 'buynow'; + + // Cart buttons + if (type === 'cart') { + data.add('cmd', '_cart'); + data.add('add', true); + // Donation buttons + } else if (type === 'donate') { + data.add('cmd', '_donations'); + // Subscribe buttons + } else if (type === 'subscribe') { + data.add('cmd', '_xclick-subscriptions'); + + // TODO: "amount" cannot be used in prettyParams since it's overloaded + // Find a better way to do this + if (data.items.amount && !data.items.a3) { + data.add('a3', data.items.amount.value); + } + // Buy Now buttons + } else { + data.add('cmd', '_xclick'); + } + + // Add common data + data.add('business', business); + data.add('bn', bnCode.replace(/\{type\}/, type)); + + // Build the UI components + if (type === 'qr') { + button = buildQR(data, data.items.size); + data.remove('size'); + } else { + button = buildForm(data, type); + } + + // Inject CSS + injectCSS(); + + // Register it + this.buttons[type] += 1; + + // Add it to the DOM + if (parent) { + parent.appendChild(button); + } + + return button; + }; + + + PAYPAL.apps.ButtonFactory = app; + } + + + /** + * Builds the form DOM structure for a button + * + * @param data {Object} An object of key/value data to set as button params + * @param type (String) The type of the button to render + * @return {HTMLElement} + */ + function buildForm(data, type) { + var form = document.createElement('form'), + btn = document.createElement('button'), + hidden = document.createElement('input'), + items = data.items, + item, child, label, input, key, size, locale, localeText; + + form.method = 'post'; + form.action = paypalURL; + form.className = 'paypal-button'; + form.target = '_top'; + + hidden.type = 'hidden'; + + size = items.size && items.size.value || 'large'; + locale = items.lc && items.lc.value || 'en_US'; + localeText = buttonText[locale] || buttonText.en_US; + + for (key in items) { + item = items[key]; + + if (item.isEditable) { + input = document.createElement('input'); + input.type = 'text'; + input.className = 'paypal-input'; + input.name = item.key; + input.value = item.value; + + label = document.createElement('label'); + label.className = 'paypal-label'; + label.appendChild(document.createTextNode(app.config.labels[item.key] || localeText[item.key])); + label.appendChild(input); + + child = document.createElement('p'); + child.className = 'paypal-group'; + child.appendChild(label); + } else { + input = child = hidden.cloneNode(true); + input.name = item.key; + input.value = item.value; + } + + form.appendChild(child); + } + + btn.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.UI.itemList) { + MiniCart.render(); + } + + MiniCart.bindForm(form); + } + + 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: #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 image for a QR code + * + * @param data {Object} An object of key/value data to set as button params + * @param size {String} The size of QR code's longest side + * @return {HTMLElement} + */ + function buildQR(data, size) { + var img = document.createElement('img'), + url = paypalURL + '?', + pattern = 13, + items = data.items, + item, key; + + // QR defaults + size = size && size.value || 250; + + for (key in items) { + item = items[key]; + url += item.key + '=' + encodeURIComponent(item.value) + '&'; + } + + url = encodeURIComponent(url); + img.src = qrCodeURL.replace('{url}', url).replace('{pattern}', pattern).replace('{size}', size); + + return img; + } + + + /** + * Utility function to polyfill dataset functionality with a bit of a spin + * + * @param el {HTMLElement} The element to check + * @return {Object} + */ + function getDataSet(el) { + var dataset = {}, attrs, attr, matches, len, i; + + if ((attrs = el.attributes)) { + for (i = 0, len = attrs.length; i < len; i++) { + attr = attrs[i]; + + if ((matches = /^data-([a-z0-9_]+)(-editable)?/i.exec(attr.name))) { + dataset[matches[1]] = { + value: attr.value, + isEditable: !!matches[2] + }; + } + } + } + + return dataset; + } + + + /** + * A storage object to create structured methods around a button's data + */ + function DataStore() { + this.items = {}; + + this.add = function (key, value, isEditable) { + this.items[key] = { + key: key, + value: value, + isEditable: isEditable + }; + }; + + this.remove = function (key) { + delete this.items[key]; + }; + } + + + // Init the buttons + if (typeof document !== 'undefined') { + var ButtonFactory = PAYPAL.apps.ButtonFactory, + nodes = document.getElementsByTagName('script'), + node, data, type, business, i, len; + + for (i = 0, len = nodes.length; i < len; i++) { + node = nodes[i]; + + if (!node || !node.src) { continue; } + + data = node && getDataSet(node); + type = data && data.button && data.button.value; + business = node.src.split('?merchant=')[1]; + + if (business) { + ButtonFactory.create(business, data, type, node.parentNode); + + // Clean up + node.parentNode.removeChild(node); + } + } + } + + +}()); + + +// Export for CommonJS environments +if (typeof module === 'object' && typeof module.exports === 'object') { + module.exports = PAYPAL; +} diff --git a/dist/paypal-button-minicart.min.js b/dist/paypal-button-minicart.min.js index 260b7c7..30ebcee 100644 --- a/dist/paypal-button-minicart.min.js +++ b/dist/paypal-button-minicart.min.js @@ -1,6 +1,7 @@ /*! * PayPalJSButtons * JavaScript integration for PayPal's payment buttons - * @version 1.0.0 - 2013-03-15, 6:52:50 PM + * @version 1.0.1 - 2013-03-26 * @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(PAYPAL===void 0||!PAYPAL)var PAYPAL={};PAYPAL.apps=PAYPAL.apps||{},function(){"use strict";function e(e,t){var a,n,r,i,m,d,c,s,l=document.createElement("form"),p=document.createElement("button"),y=document.createElement("input"),A=e.items;l.method="post",l.action=u,l.className="paypal-button",l.target="_top",y.type="hidden",d=A.size&&A.size.value||"large",c=A.lc&&A.lc.value||"en_US",s=b[c]||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]||s[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),l.appendChild(n);if(p.type="submit",p.className="paypal-button "+d,p.appendChild(document.createTextNode(s[t])),l.appendChild(p),PAYPAL.apps.MiniCart&&"_cart"===e.items.cmd.value){var f=PAYPAL.apps.MiniCart;f.UI.itemList||f.render(),f.bindForm(l)}return l}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: #ffa823; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; z-index: 0; }',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; }",e+=n+".large { padding: 4px 19px; font-size: 14px; }",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",locale:"lc",currency:"currency_code",recurrence:"p3",period:"t3",callback:"notify_url"},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,c,s=new r;if(!n)return!1;for(c in o)s.add(d[c]||c,o[c].value,o[c].isEditable);return u=u||"buynow","cart"===u?(s.add("cmd","_cart"),s.add("add",!0)):"donate"===u?s.add("cmd","_donations"):"subscribe"===u?(s.add("cmd","_xclick-subscriptions"),s.items.amount&&!s.items.a3&&s.add("a3",s.items.amount.value)):s.add("cmd","_xclick"),s.add("business",n),s.add("bn",m.replace(/\{type\}/,u)),"qr"===u?(b=a(s,s.items.size),s.remove("size")):b=e(s,u),t(),this.buttons[u]+=1,i&&i.appendChild(b),b},PAYPAL.apps.ButtonFactory=o),"undefined"!=typeof document){var c,s,l,p,y,A,f=PAYPAL.apps.ButtonFactory,_=document.getElementsByTagName("script");for(y=0,A=_.length;A>y;y++)c=_[y],c&&c.src&&(s=c&&n(c),l=s&&s.button&&s.button.value,p=c.src.split("?merchant=")[1],p&&(f.create(p,s,l,c.parentNode),c.parentNode.removeChild(c)))}}(),"object"==typeof module&&"object"==typeof module.exports&&(module.exports=PAYPAL); \ No newline at end of file diff --git a/dist/paypal-button.js b/dist/paypal-button.js new file mode 100644 index 0000000..573602c --- /dev/null +++ b/dist/paypal-button.js @@ -0,0 +1,370 @@ +/*! + * PayPalJSButtons + * JavaScript integration for PayPal's payment buttons + * @version 1.0.1 - 2013-03-26 + * @author Jeff Harrell + */ +if (typeof PAYPAL === 'undefined' || !PAYPAL) { + var PAYPAL = {}; +} + +PAYPAL.apps = PAYPAL.apps || {}; + + +(function () { + + '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}', + bnCode = 'JavaScriptButton_{type}', + prettyParams = { + name: 'item_name', + number: 'item_number', + locale: 'lc', + currency: 'currency_code', + recurrence: 'p3', + period: 't3', + callback: 'notify_url' + }, + buttonText = { + 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) { + + /** + * Initial config for the app. These values can be overridden by the page. + */ + app.config = { + labels: {} + }; + + /** + * A count of each type of button on the page + */ + app.buttons = { + buynow: 0, + cart: 0, + donate: 0, + qr: 0, + subscribe: 0 + }; + + /** + * Renders a button in place of the given element + * + * @param business {Object} The ID or email address of the merchant to create the button for + * @param raw {Object} An object of key/value data to set as button params + * @param type (String) The type of the button to render + * @param parent {HTMLElement} The element to add the button to (Optional) + * @return {HTMLElement} + */ + app.create = function (business, raw, type, parent) { + var data = new DataStore(), button, key; + + 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); + } + + // Defaults + type = type || 'buynow'; + + // Cart buttons + if (type === 'cart') { + data.add('cmd', '_cart'); + data.add('add', true); + // Donation buttons + } else if (type === 'donate') { + data.add('cmd', '_donations'); + // Subscribe buttons + } else if (type === 'subscribe') { + data.add('cmd', '_xclick-subscriptions'); + + // TODO: "amount" cannot be used in prettyParams since it's overloaded + // Find a better way to do this + if (data.items.amount && !data.items.a3) { + data.add('a3', data.items.amount.value); + } + // Buy Now buttons + } else { + data.add('cmd', '_xclick'); + } + + // Add common data + data.add('business', business); + data.add('bn', bnCode.replace(/\{type\}/, type)); + + // Build the UI components + if (type === 'qr') { + button = buildQR(data, data.items.size); + data.remove('size'); + } else { + button = buildForm(data, type); + } + + // Inject CSS + injectCSS(); + + // Register it + this.buttons[type] += 1; + + // Add it to the DOM + if (parent) { + parent.appendChild(button); + } + + return button; + }; + + + PAYPAL.apps.ButtonFactory = app; + } + + + /** + * Builds the form DOM structure for a button + * + * @param data {Object} An object of key/value data to set as button params + * @param type (String) The type of the button to render + * @return {HTMLElement} + */ + function buildForm(data, type) { + var form = document.createElement('form'), + btn = document.createElement('button'), + hidden = document.createElement('input'), + items = data.items, + item, child, label, input, key, size, locale, localeText; + + form.method = 'post'; + form.action = paypalURL; + form.className = 'paypal-button'; + form.target = '_top'; + + hidden.type = 'hidden'; + + size = items.size && items.size.value || 'large'; + locale = items.lc && items.lc.value || 'en_US'; + localeText = buttonText[locale] || buttonText.en_US; + + for (key in items) { + item = items[key]; + + if (item.isEditable) { + input = document.createElement('input'); + input.type = 'text'; + input.className = 'paypal-input'; + input.name = item.key; + input.value = item.value; + + label = document.createElement('label'); + label.className = 'paypal-label'; + label.appendChild(document.createTextNode(app.config.labels[item.key] || localeText[item.key])); + label.appendChild(input); + + child = document.createElement('p'); + child.className = 'paypal-group'; + child.appendChild(label); + } else { + input = child = hidden.cloneNode(true); + input.name = item.key; + input.value = item.value; + } + + form.appendChild(child); + } + + btn.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.UI.itemList) { + MiniCart.render(); + } + + MiniCart.bindForm(form); + } + + 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: #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 image for a QR code + * + * @param data {Object} An object of key/value data to set as button params + * @param size {String} The size of QR code's longest side + * @return {HTMLElement} + */ + function buildQR(data, size) { + var img = document.createElement('img'), + url = paypalURL + '?', + pattern = 13, + items = data.items, + item, key; + + // QR defaults + size = size && size.value || 250; + + for (key in items) { + item = items[key]; + url += item.key + '=' + encodeURIComponent(item.value) + '&'; + } + + url = encodeURIComponent(url); + img.src = qrCodeURL.replace('{url}', url).replace('{pattern}', pattern).replace('{size}', size); + + return img; + } + + + /** + * Utility function to polyfill dataset functionality with a bit of a spin + * + * @param el {HTMLElement} The element to check + * @return {Object} + */ + function getDataSet(el) { + var dataset = {}, attrs, attr, matches, len, i; + + if ((attrs = el.attributes)) { + for (i = 0, len = attrs.length; i < len; i++) { + attr = attrs[i]; + + if ((matches = /^data-([a-z0-9_]+)(-editable)?/i.exec(attr.name))) { + dataset[matches[1]] = { + value: attr.value, + isEditable: !!matches[2] + }; + } + } + } + + return dataset; + } + + + /** + * A storage object to create structured methods around a button's data + */ + function DataStore() { + this.items = {}; + + this.add = function (key, value, isEditable) { + this.items[key] = { + key: key, + value: value, + isEditable: isEditable + }; + }; + + this.remove = function (key) { + delete this.items[key]; + }; + } + + + // Init the buttons + if (typeof document !== 'undefined') { + var ButtonFactory = PAYPAL.apps.ButtonFactory, + nodes = document.getElementsByTagName('script'), + node, data, type, business, i, len; + + for (i = 0, len = nodes.length; i < len; i++) { + node = nodes[i]; + + if (!node || !node.src) { continue; } + + data = node && getDataSet(node); + type = data && data.button && data.button.value; + business = node.src.split('?merchant=')[1]; + + if (business) { + ButtonFactory.create(business, data, type, node.parentNode); + + // Clean up + node.parentNode.removeChild(node); + } + } + } + + +}()); + + +// Export for CommonJS environments +if (typeof module === 'object' && typeof module.exports === 'object') { + module.exports = PAYPAL; +} diff --git a/dist/paypal-button.min.js b/dist/paypal-button.min.js index 6ef82bf..30ebcee 100644 --- a/dist/paypal-button.min.js +++ b/dist/paypal-button.min.js @@ -1,6 +1,7 @@ /*! * PayPalJSButtons * JavaScript integration for PayPal's payment buttons - * @version 1.0.0 - 2013-03-15, 6:52:49 PM + * @version 1.0.1 - 2013-03-26 * @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(PAYPAL===void 0||!PAYPAL)var PAYPAL={};PAYPAL.apps=PAYPAL.apps||{},function(){"use strict";function e(e,t){var a,n,r,i,m,d,c,s,l=document.createElement("form"),p=document.createElement("button"),y=document.createElement("input"),A=e.items;l.method="post",l.action=u,l.className="paypal-button",l.target="_top",y.type="hidden",d=A.size&&A.size.value||"large",c=A.lc&&A.lc.value||"en_US",s=b[c]||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]||s[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),l.appendChild(n);if(p.type="submit",p.className="paypal-button "+d,p.appendChild(document.createTextNode(s[t])),l.appendChild(p),PAYPAL.apps.MiniCart&&"_cart"===e.items.cmd.value){var f=PAYPAL.apps.MiniCart;f.UI.itemList||f.render(),f.bindForm(l)}return l}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: #ffa823; position: relative; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; z-index: 0; }',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; }",e+=n+".large { padding: 4px 19px; font-size: 14px; }",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",locale:"lc",currency:"currency_code",recurrence:"p3",period:"t3",callback:"notify_url"},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,c,s=new r;if(!n)return!1;for(c in o)s.add(d[c]||c,o[c].value,o[c].isEditable);return u=u||"buynow","cart"===u?(s.add("cmd","_cart"),s.add("add",!0)):"donate"===u?s.add("cmd","_donations"):"subscribe"===u?(s.add("cmd","_xclick-subscriptions"),s.items.amount&&!s.items.a3&&s.add("a3",s.items.amount.value)):s.add("cmd","_xclick"),s.add("business",n),s.add("bn",m.replace(/\{type\}/,u)),"qr"===u?(b=a(s,s.items.size),s.remove("size")):b=e(s,u),t(),this.buttons[u]+=1,i&&i.appendChild(b),b},PAYPAL.apps.ButtonFactory=o),"undefined"!=typeof document){var c,s,l,p,y,A,f=PAYPAL.apps.ButtonFactory,_=document.getElementsByTagName("script");for(y=0,A=_.length;A>y;y++)c=_[y],c&&c.src&&(s=c&&n(c),l=s&&s.button&&s.button.value,p=c.src.split("?merchant=")[1],p&&(f.create(p,s,l,c.parentNode),c.parentNode.removeChild(c)))}}(),"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..6e7e073 160000 --- a/lib/MiniCart +++ b/lib/MiniCart @@ -1 +1 @@ -Subproject commit 9dbe238f255bea468e8baf5dc945b76e404a523f +Subproject commit 6e7e0736a53efea94ce4343e3a1e43be564bb486 diff --git a/package.json b/package.json index 61e9ff4..df4b8a0 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,33 @@ { - "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.1", + "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": "*", + "grunt-contrib-concat": "~0.1.3" + }, + "scripts": { + "test": "mocha" + } } diff --git a/src/paypal-button.js b/src/paypal-button.js index 37754c5..623158f 100644 --- a/src/paypal-button.js +++ b/src/paypal-button.js @@ -17,9 +17,11 @@ PAYPAL.apps = PAYPAL.apps || {}; prettyParams = { name: 'item_name', number: 'item_number', - lang: 'lc', + locale: 'lc', + currency: 'currency_code', recurrence: 'p3', - period: 't3' + period: 't3', + callback: 'notify_url' }, buttonText = { 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' }, @@ -234,11 +236,11 @@ PAYPAL.apps = PAYPAL.apps || {}; 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 + ' { 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; line-height: 14px; }'; - css += paypalInput + '.large { padding: 4px 19px; font-size: 14px; line-height: 16px; }'; + 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'; @@ -295,7 +297,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 = /^data-([a-z0-9_]+)(-editable)?/i.exec(attr.name))) { dataset[matches[1]] = { value: attr.value, isEditable: !!matches[2] diff --git a/test/index.html b/test/index.html index eeabc6d..c770c9f 100644 --- a/test/index.html +++ b/test/index.html @@ -6,21 +6,20 @@ - -

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)

-