1var card = 2 /******/ (function(modules) { // webpackBootstrap 3 /******/ // The module cache 4 /******/ var installedModules = {}; 5 6 /******/ // The require function 7 /******/ function __webpack_require__(moduleId) { 8 9 /******/ // Check if module is in cache 10 /******/ if(installedModules[moduleId]) 11 /******/ return installedModules[moduleId].exports; 12 13 /******/ // Create a new module (and put it into the cache) 14 /******/ var module = installedModules[moduleId] = { 15 /******/ exports: {}, 16 /******/ id: moduleId, 17 /******/ loaded: false 18 /******/ }; 19 20 /******/ // Execute the module function 21 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 22 23 /******/ // Flag the module as loaded 24 /******/ module.loaded = true; 25 26 /******/ // Return the exports of the module 27 /******/ return module.exports; 28 /******/ } 29 30 31 /******/ // expose the modules object (__webpack_modules__) 32 /******/ __webpack_require__.m = modules; 33 34 /******/ // expose the module cache 35 /******/ __webpack_require__.c = installedModules; 36 37 /******/ // __webpack_public_path__ 38 /******/ __webpack_require__.p = ""; 39 40 /******/ // Load entry module and return exports 41 /******/ return __webpack_require__(0); 42 /******/ }) 43/************************************************************************/ 44/******/ ([ 45 /* 0 */ 46 /***/ (function(module, exports, __webpack_require__) { 47 48 /* WEBPACK VAR INJECTION */(function(global) {var Card, QJ, extend, payment, 49 bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 50 51 __webpack_require__(1); 52 53 QJ = __webpack_require__(5); 54 55 payment = __webpack_require__(6); 56 57 extend = __webpack_require__(7); 58 59 Card = (function() { 60 var bindVal; 61 62 Card.prototype.initializedDataAttr = "data-jp-card-initialized"; 63 64 Card.prototype.cardTemplate = '' + '<div class="jp-card-container">' + '<div class="jp-card">' + '<div class="jp-card-front">' + '<div class="jp-card-logo jp-card-elo">' + '<div class="e">e</div>' + '<div class="l">l</div>' + '<div class="o">o</div>' + '</div>' + '<div class="jp-card-logo jp-card-visa">visa</div>' + '<div class="jp-card-logo jp-card-mastercard">MasterCard</div>' + '<div class="jp-card-logo jp-card-maestro">Maestro</div>' + '<div class="jp-card-logo jp-card-amex"></div>' + '<div class="jp-card-logo jp-card-discover">discover</div>' + '<div class="jp-card-logo jp-card-dinersclub"></div>' + '<div class="jp-card-logo jp-card-dankort"><div class="dk"><div class="d"></div><div class="k"></div></div></div>' + '<div class="jp-card-lower">' + '<div class="jp-card-shiny"></div>' + '<div class="jp-card-cvc jp-card-display">{{cvc}}</div>' + '<div class="jp-card-number jp-card-display">{{number}}</div>' + '<div class="jp-card-name jp-card-display">{{name}}</div>' + '<div class="jp-card-expiry jp-card-display" data-before="{{monthYear}}" data-after="{{validDate}}">{{expiry}}</div>' + '</div>' + '</div>' + '<div class="jp-card-back">' + '<div class="jp-card-bar"></div>' + '<div class="jp-card-cvc jp-card-display">{{cvc}}</div>' + '<div class="jp-card-shiny"></div>' + '</div>' + '</div>' + '</div>'; 65 66 Card.prototype.template = function(tpl, data) { 67 return tpl.replace(/\{\{(.*?)\}\}/g, function(match, key, str) { 68 return data[key]; 69 }); 70 }; 71 72 Card.prototype.cardTypes = ['jp-card-amex', 'jp-card-dankort', 'jp-card-dinersclub', 'jp-card-discover', 'jp-card-jcb', 'jp-card-laser', 'jp-card-maestro', 'jp-card-mastercard', 'jp-card-unionpay', 'jp-card-visa', 'jp-card-visaelectron', 'jp-card-elo']; 73 74 Card.prototype.defaults = { 75 formatting: true, 76 formSelectors: { 77 numberInput: 'input[name="number"]', 78 expiryInput: 'input[name="expiry"]', 79 cvcInput: 'input[name="cvc"]', 80 nameInput: 'input[name="name"]' 81 }, 82 cardSelectors: { 83 cardContainer: '.jp-card-container', 84 card: '.jp-card',
85 numberDisplay: '.jp-card-number', 86 expiryDisplay: '.jp-card-expiry', 87 cvcDisplay: '.jp-card-cvc', 88 nameDisplay: '.jp-card-name' 89 }, 90 messages: { 91 validDate: 'valid\nthru', 92 monthYear: 'month/year' 93 }, 94 placeholders: { 95 number: '•••• •••• •••• ••••', 96 cvc: '•••', 97 expiry: '••/••', 98 name: 'Full Name' 99 }, 100 masks: { 101 cardNumber: false 102 }, 103 classes: { 104 valid: 'jp-card-valid', 105 invalid: 'jp-card-invalid' 106 }, 107 debug: false 108 }; 109 110 function Card(opts) { 111 this.maskCardNumber = bind(this.maskCardNumber, this); 112 var toInitialize; 113 this.options = extend(true, this.defaults, opts); 114 if (!this.options.form) { 115 console.log("Please provide a form"); 116 return; 117 } 118 this.$el = QJ(this.options.form); 119 if (!this.options.container) { 120 console.log("Please provide a container"); 121 return; 122 } 123 this.$container = QJ(this.options.container); 124 toInitialize = QJ.isDOMElement(this.$container) ? this.$container : this.$container[0]; 125 if (toInitialize.getAttribute(this.initializedDataAttr)) { 126 return; 127 } 128 toInitialize.setAttribute(this.initializedDataAttr, true); 129 this.render(); 130 this.attachHandlers(); 131 this.handleInitialPlaceholders(); 132 } 133 134 Card.prototype.render = function() { 135 var $cardContainer, baseWidth, name, obj, ref, ref1, selector, ua; 136 QJ.append(this.$container, this.template(this.cardTemplate, extend({}, this.options.messages, this.options.placeholders))); 137 ref = this.options.cardSelectors; 138 for (name in ref) { 139 selector = ref[name]; 140 this["$" + name] = QJ.find(this.$container, selector); 141 } 142 ref1 = this.options.formSelectors; 143 for (name in ref1) { 144 selector = ref1[name]; 145 selector = this.options[name] ? this.options[name] : selector; 146 obj = QJ.find(this.$el, selector); 147 if (!obj.length && this.options.debug) { 148 console.error("Card can't find a " + name + " in your form."); 149 } 150 this["$" + name] = obj; 151 } 152 if (this.options.formatting) { 153 Payment.formatCardNumber(this.$numberInput); 154 Payment.formatCardCVC(this.$cvcInput); 155 Payment.formatCardExpiry(this.$expiryInput); 156 } 157 if (this.options.width) { 158 $cardContainer = QJ(this.options.cardSelectors.cardContainer)[0]; 159 baseWidth = parseInt($cardContainer.clientWidth || window.getComputedStyle($cardContainer).width); 160 $cardContainer.style.transform = "scale(" + (this.options.width / baseWidth) + ")"; 161 } 162 if (typeof navigator !== "undefined" && navigator !== null ? navigator.userAgent : void 0) { 163 ua = navigator.userAgent.toLowerCase(); 164 if (ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1) { 165 QJ.addClass(this.$card, 'jp-card-safari'); 166 } 167 } 168 if (/MSIE 10\./i.test(navigator.userAgent)) { 169 QJ.addClass(this.$card, 'jp-card-ie-10'); 170 } 171 if (/rv:11.0/i.test(navigator.userAgent)) { 172 return QJ.addClass(this.$card, 'jp-card-ie-11'); 173 } 174 }; 175 176 Card.prototype.attachHandlers = function() { 177 var expiryFilters, numberInputFilters; 178 numberInputFilters = [this.validToggler('cardNumber')]; 179 if (this.options.masks.cardNumber) { 180 numberInputFilters.push(this.maskCardNumber); 181 }
182 bindVal(this.$numberInput, this.$numberDisplay, { 183 fill: false, 184 filters: numberInputFilters 185 }); 186 QJ.on(this.$numberInput, 'payment.cardType', this.handle('setCardType')); 187 expiryFilters = [ 188 function(val) { 189 return val.replace(/(\s+)/g, ''); 190 } 191 ]; 192 expiryFilters.push(this.validToggler('cardExpiry')); 193 bindVal(this.$expiryInput, this.$expiryDisplay, { 194 join: function(text) { 195 if (text[0].length === 2 || text[1]) { 196 return "/"; 197 } else { 198 return ""; 199 } 200 }, 201 filters: expiryFilters 202 }); 203 bindVal(this.$cvcInput, this.$cvcDisplay, { 204 filters: this.validToggler('cardCVC') 205 }); 206 QJ.on(this.$cvcInput, 'focus', this.handle('flipCard')); 207 QJ.on(this.$cvcInput, 'blur', this.handle('unflipCard')); 208 return bindVal(this.$nameInput, this.$nameDisplay, { 209 fill: false, 210 filters: this.validToggler('cardHolderName'), 211 join: ' ' 212 }); 213 }; 214 215 Card.prototype.handleInitialPlaceholders = function() { 216 var el, name, ref, results, selector; 217 ref = this.options.formSelectors; 218 results = []; 219 for (name in ref) { 220 selector = ref[name]; 221 el = this["$" + name]; 222 if (QJ.val(el)) { 223 QJ.trigger(el, 'paste'); 224 results.push(setTimeout(function() { 225 return QJ.trigger(el, 'keyup'); 226 })); 227 } else { 228 results.push(void 0); 229 } 230 } 231 return results; 232 }; 233 234 Card.prototype.handle = function(fn) { 235 return (function(_this) { 236 return function(e) { 237 var args; 238 args = Array.prototype.slice.call(arguments); 239 args.unshift(e.target); 240 return _this.handlers[fn].apply(_this, args); 241 }; 242 })(this); 243 }; 244 245 Card.prototype.validToggler = function(validatorName) { 246 var isValid; 247 if (validatorName === "cardExpiry") { 248 isValid = function(val) { 249 var objVal; 250 objVal = Payment.fns.cardExpiryVal(val); 251 return Payment.fns.validateCardExpiry(objVal.month, objVal.year); 252 }; 253 } else if (validatorName === "cardCVC") { 254 isValid = (function(_this) { 255 return function(val) { 256 return Payment.fns.validateCardCVC(val, _this.cardType); 257 }; 258 })(this); 259 } else if (validatorName === "cardNumber") { 260 isValid = function(val) { 261 return Payment.fns.validateCardNumber(val); 262 }; 263 } else if (validatorName === "cardHolderName") { 264 isValid = function(val) { 265 return val !== ""; 266 }; 267 } 268 return (function(_this) { 269 return function(val, $in, $out) { 270 var result; 271 result = isValid(val);
272 _this.toggleValidClass($in, result); 273 _this.toggleValidClass($out, result); 274 return val; 275 }; 276 })(this); 277 }; 278 279 Card.prototype.toggleValidClass = function(el, test) { 280 QJ.toggleClass(el, this.options.classes.valid, test); 281 return QJ.toggleClass(el, this.options.classes.invalid, !test); 282 }; 283 284 Card.prototype.maskCardNumber = function(val, el, out) { 285 var mask, numbers; 286 mask = this.options.masks.cardNumber; 287 numbers = val.split(' '); 288 if (numbers.length >= 3) { 289 numbers.forEach(function(item, idx) { 290 if (idx !== numbers.length - 1) { 291 return numbers[idx] = numbers[idx].replace(/\d/g, mask); 292 } 293 }); 294 return numbers.join(' '); 295 } else { 296 return val.replace(/\d/g, mask); 297 } 298 }; 299 300 Card.prototype.handlers = { 301 setCardType: function($el, e) { 302 var cardType; 303 cardType = e.data; 304 if (!QJ.hasClass(this.$card, cardType)) { 305 QJ.removeClass(this.$card, 'jp-card-unknown'); 306 QJ.removeClass(this.$card, this.cardTypes.join(' ')); 307 QJ.addClass(this.$card, "jp-card-" + cardType); 308 QJ.toggleClass(this.$card, 'jp-card-identified', cardType !== 'unknown'); 309 return this.cardType = cardType; 310 } 311 }, 312 flipCard: function() { 313 return QJ.addClass(this.$card, 'jp-card-flipped'); 314 }, 315 unflipCard: function() { 316 return QJ.removeClass(this.$card, 'jp-card-flipped'); 317 } 318 }; 319 320 bindVal = function(el, out, opts) { 321 var joiner, o, outDefaults; 322 if (opts == null) { 323 opts = {}; 324 } 325 opts.fill = opts.fill || false; 326 opts.filters = opts.filters || []; 327 if (!(opts.filters instanceof Array)) { 328 opts.filters = [opts.filters]; 329 } 330 opts.join = opts.join || ""; 331 if (!(typeof opts.join === "function")) { 332 joiner = opts.join; 333 opts.join = function() { 334 return joiner; 335 }; 336 } 337 outDefaults = (function() { 338 var j, len, results; 339 results = []; 340 for (j = 0, len = out.length; j < len; j++) { 341 o = out[j]; 342 results.push(o.textContent); 343 } 344 return results; 345 })(); 346 QJ.on(el, 'focus', function() { 347 return QJ.addClass(out, 'jp-card-focused'); 348 }); 349 QJ.on(el, 'blur', function() { 350 return QJ.removeClass(out, 'jp-card-focused'); 351 }); 352 QJ.on(el, 'keyup change paste', function(e) { 353 var elem, filter, i, j, join, k, len, len1, outEl, outVal, ref, results, val; 354 val = (function() { 355 var j, len, results; 356 results = []; 357 for (j = 0, len = el.length; j < len; j++) { 358 elem = el[j]; 359 results.push(QJ.val(elem)); 360 } 361 return results; 362 })(); 363 join = opts.join(val); 364 val = val.join(join); 365 if (val === join) { 366 val = ""; 367 } 368 ref = opts.filters; 369 for (j = 0, len = ref.length; j < len; j++) { 370 filter = ref[j];
371 val = filter(val, el, out); 372 } 373 results = []; 374 for (i = k = 0, len1 = out.length; k < len1; i = ++k) { 375 outEl = out[i]; 376 if (opts.fill) { 377 outVal = val + outDefaults[i].substring(val.length); 378 } else { 379 outVal = val || outDefaults[i]; 380 } 381 results.push(outEl.textContent = outVal); 382 } 383 return results; 384 }); 385 return el; 386 }; 387 388 return Card; 389 390 })(); 391 392 module.exports = Card; 393 394 global.Card = Card; 395 396 /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) 397 398 /***/ }), 399 /* 1 */ 400 /***/ (function(module, exports, __webpack_require__) { 401 402 // style-loader: Adds some css to the DOM by adding a <style> tag 403 404 // load the styles 405 var content = __webpack_require__(2); 406 if(typeof content === 'string') content = [[module.id, content, '']]; 407 // add the styles to the DOM 408 var update = __webpack_require__(4)(content, {}); 409 if(content.locals) module.exports = content.locals; 410 // Hot Module Replacement 411 if(false) { 412 // When the styles change, update the <style> tags 413 if(!content.locals) { 414 module.hot.accept("!!../../node_modules/css-loader/index.js!../../node_modules/sass-loader/index.js!./card.scss", function() { 415 var newContent = require("!!../../node_modules/css-loader/index.js!../../node_modules/sass-loader/index.js!./card.scss"); 416 if(typeof newContent === 'string') newContent = [[module.id, newContent, '']]; 417 update(newContent); 418 }); 419 } 420 // When the module is disposed, remove the <style> tags 421 module.hot.dispose(function() { update(); }); 422 } 423 424 /***/ }), 425 /* 2 */ 426 /***/ (function(module, exports, __webpack_require__) { 427 428 exports = module.exports = __webpack_require__(3)(); 429 // imports 430 431 432 // module 433 exports.push([module.id, ".jp-card.jp-card-safari.jp-card-identified .jp-card-front:before, .jp-card.jp-card-safari.jp-card-identified .jp-card-back:before {\n background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 1px, rgba(255, 255, 255, 0) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.03) 4px), repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(210deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), -webkit-linear-gradient(-245deg, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 70%, rgba(255, 255, 255, 0) 90%);\n background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 1px, rgba(255, 255, 255, 0) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.03) 4px), repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(210deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), linear-gradient(-25deg, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 70%, rgba(255, 255, 255, 0) 90%); }\n\n.jp-card.jp-card-ie-10.jp-card-flipped, .jp-card.jp-card-ie-11.jp-card-flipped {\n -webkit-transform: 0deg;\n -moz-transform: 0deg;\n -ms-transform: 0deg;\n -o-transform: 0deg;\n transform: 0deg; }\n .jp-card.jp-card-ie-10.jp-card-flipped .jp-card-front, .jp-card.jp-card-ie-11.jp-card-flipped .jp-card-front {\n -webkit-transform: rotateY(0deg);\n -moz-transform: rotateY(0deg);\n -ms-transform: rotateY(0deg);\n -o-transform: rotateY(0deg);\n transform: rotateY(0deg); }\n .jp-card.jp-card-ie-10.jp-card-flipped .jp-card-back, .jp-card.jp-card-ie-11.jp-card-flipped .jp-card-back {\n -webkit-transform: rotateY(0deg);\n -moz-transform: rotateY(0deg);\n -ms-transform: rotateY(0deg);\n -o-transform: rotateY(0deg);\n transform: rotateY(0deg); }\n .jp-card.jp-card-ie-10.jp-card-flipped .jp-card-back:after, .jp-card.jp-card-ie-11.jp-card-flipped .jp-card-back:after {\n left: 18%; }\n .jp-card.jp-card-ie-10.jp-card-flipped .jp-card-back .jp-card-cvc, .jp-card.jp-card-ie-11.jp-card-flipped .jp-card-back .jp-card-cvc {\n -webkit-transform: rotateY(180deg);\n -moz-transform: rotateY(180deg);\n -ms-transform: rotateY(180deg);\n -o-transform: rotateY(180deg);\n transform: rotateY(180deg);\n left: 5%; }\n .jp-card.jp-card-ie-10.jp-card-flipped .jp-card-back .jp-card-shiny, .jp-card.jp-card-ie-11.jp-card-flipped .jp-card-back .jp-card-shiny {\n left: 84%; }\n .jp-card.jp-card-ie-10.jp-card-flipped .jp-card-back .jp-card-shiny:after, .jp-card.jp-card-ie-11.jp-card-flipped .jp-card-back .jp-card-shiny:after {\n left: -480%;\n -webkit-transform: rotateY(180deg);\n -moz-transform: rotateY(180deg);\n -ms-transform: rotateY(180deg);\n -o-transform: rotateY(180deg);\n transform: rotateY(180deg); }\n\n.jp-card.jp-card-ie-10.jp-card-amex .jp-card-back, .jp-card.jp-card-ie-11.jp-card-amex .jp-card-back {\n display: none; }\n\n.jp-card-logo {\n height: 36px;\n width: 60px;\n font-style: italic; }\n .jp-card-logo, .jp-card-logo:before, .jp-card-logo:after {\n box-sizing: border-box; }\n\n.jp-card-logo.jp-card-amex {\n text-transform: uppercase;\n font-size: 4px;\n font-weight: bold;\n color: white;\n background-image: repeating-radial-gradient(circle at center, #FFF 1px, #999 2px);\n background-image: repeating-radial-gradient(circle at center, #FFF 1px, #999 2px);\n border: 1px solid #EEE; }\n .jp-card-logo.jp-card-amex:before, .jp-card-logo.jp-card-amex:after {\n width: 28px;\n display: block;\n position: absolute;\n left: 16px; }\n .jp-card-logo.jp-card-amex:before {\n height: 28px;\n content: \"american\";\n top: 3px;\n text-align: left;\n padding-left: 2px;\n padding-top: 11px;\n background: #267AC3; }\n .jp-card-logo.jp-card-amex:after {\n content: \"express\";\n bottom: 11px;\n text-align: right;\n padding-right: 2px; }\n\n.jp-card.jp-card-amex.jp-card-flipped {\n -webkit-transform: none;\n -moz-transform: none;\n -ms-transform: none;\n -o-transform: none;\n transform: none; }\n\n.jp-card.jp-card-amex.jp-card-identified .jp-card-front:before, .jp-card.jp-card-amex.jp-card-identified .jp-card-back:before {\n background-color: #108168; }\n\n.jp-card.jp-card-amex.jp-card-identified .jp-card-front .jp-card-logo.jp-card-amex {\n opacity: 1; }\n\n.jp-card.jp-card-amex.jp-card-identified .jp-card-front .jp-card-cvc {\n visibility: visible; }\n\n.jp-card.jp-card-amex.jp-card-identified .jp-card-front:after {\n opacity: 1; }\n\n.jp-card-logo.jp-card-discover {\n background: #FF6600;\n color: #111;\n text-transform: uppercase;\n font-style: normal;\n font-weight: bold;\n font-size: 10px;\n text-align: center;\n overflow: hidden;\n z-index: 1;\n padding-top: 9px;\n letter-spacing: .03em;\n border: 1px solid #EEE; }\n .jp-card-logo.jp-card-discover:before, .jp-card-logo.jp-card-discover:after {\n content: \" \";\n display: block;\n position: absolute; }\n .jp-card-logo.jp-card-discover:before {\n background: white;\n width: 200px;\n height: 200px;\n border-radius: 200px;\n bottom: -5%;\n right: -80%;\n z-index: -1; }\n .jp-card-logo.jp-card-discover:after {\n width: 8px;\n height: 8px;\n border-radius: 4px;\n top: 10px;\n left: 27px;\n background-color: #FF6600;\n background-image: -webkit-radial-gradient(#FF6600, #fff);\n background-image: radial-gradient( #FF6600, #fff);\n content: \"network\";\n font-size: 4px;\n line-height: 24px;\n text-indent: -7px; }\n\n.jp-card .jp-card-front .jp-card-logo.jp-card-discover {\n right: 12%;\n top: 18%; }\n\n.jp-card.jp-card-discover.jp-card-identified .jp-card-front:before, .jp-card.jp-card-discover.jp-card-identified .jp-card-back:before {\n background-color: #86B8CF; }\n\n.jp-card.jp-card-discover.jp-card-identified .jp-card-logo.jp-card-discover {\n opacity: 1; }\n\n.jp-card.jp-card-discover.jp-card-identified .jp-card-front:after {\n -webkit-transition: 400ms;\n -moz-transition: 400ms;\n transition: 400ms;\n content: \" \";\n display: block;\n background-color: #FF6600;\n background-image: -webkit-linear-gradient(#FF6600, #ffa366, #FF6600);\n background-image: linear-gradient(#FF6600, #ffa366, #FF6600);\n height: 50px;\n width: 50px;\n border-radius: 25px;\n position: absolute;\n left: 100%;\n top: 15%;\n margin-left: -25px;\n box-shadow: inset 1px 1px 3px 1px rgba(0, 0, 0, 0.5); }
433\n\n.jp-card-logo.jp-card-visa {\n background: white;\n text-transform: uppercase;\n color: #1A1876;\n text-align: center;\n font-weight: bold;\n font-size: 15px;\n line-height: 18px; }\n .jp-card-logo.jp-card-visa:before, .jp-card-logo.jp-card-visa:after {\n content: \" \";\n display: block;\n width: 100%;\n height: 25%; }\n .jp-card-logo.jp-card-visa:before {\n background: #1A1876; }\n .jp-card-logo.jp-card-visa:after {\n background: #E79800; }\n\n.jp-card.jp-card-visa.jp-card-identified .jp-card-front:before, .jp-card.jp-card-visa.jp-card-identified .jp-card-back:before {\n background-color: #191278; }\n\n.jp-card.jp-card-visa.jp-card-identified .jp-card-logo.jp-card-visa {\n opacity: 1; }\n\n.jp-card-logo.jp-card-mastercard {\n color: white;\n font-weight: bold;\n text-align: center;\n font-size: 9px;\n line-height: 36px;\n z-index: 1;\n text-shadow: 1px 1px rgba(0, 0, 0, 0.6); }\n .jp-card-logo.jp-card-mastercard:before, .jp-card-logo.jp-card-mastercard:after {\n content: \" \";\n display: block;\n width: 36px;\n top: 0;\n position: absolute;\n height: 36px;\n border-radius: 18px; }\n .jp-card-logo.jp-card-mastercard:before {\n left: 0;\n background: #FF0000;\n z-index: -1; }\n .jp-card-logo.jp-card-mastercard:after {\n right: 0;\n background: #FFAB00;\n z-index: -2; }\n\n.jp-card.jp-card-mastercard.jp-card-identified .jp-card-front .jp-card-logo.jp-card-mastercard, .jp-card.jp-card-mastercard.jp-card-identified .jp-card-back .jp-card-logo.jp-card-mastercard {\n box-shadow: none; }\n\n.jp-card.jp-card-mastercard.jp-card-identified .jp-card-front:before, .jp-card.jp-card-mastercard.jp-card-identified .jp-card-back:before {\n background-color: #0061A8; }\n\n.jp-card.jp-card-mastercard.jp-card-identified .jp-card-logo.jp-card-mastercard {\n opacity: 1; }\n\n.jp-card-logo.jp-card-maestro {\n color: white;\n font-weight: bold;\n text-align: center;\n font-size: 14px;\n line-height: 36px;\n z-index: 1;\n text-shadow: 1px 1px rgba(0, 0, 0, 0.6); }\n .jp-card-logo.jp-card-maestro:before, .jp-card-logo.jp-card-maestro:after {\n content: \" \";\n display: block;\n width: 36px;\n top: 0;\n position: absolute;\n height: 36px;\n border-radius: 18px; }\n .jp-card-logo.jp-card-maestro:before {\n left: 0;\n background: #0064CB;\n z-index: -1; }\n .jp-card-logo.jp-card-maestro:after {\n right: 0;\n background: #CC0000;\n z-index: -2; }\n\n.jp-card.jp-card-maestro.jp-card-identified .jp-card-front .jp-card-logo.jp-card-maestro, .jp-card.jp-card-maestro.jp-card-identified .jp-card-back .jp-card-logo.jp-card-maestro {\n box-shadow: none; }\n\n.jp-card.jp-card-maestro.jp-card-identified .jp-card-front:before, .jp-card.jp-card-maestro.jp-card-identified .jp-card-back:before {\n background-color: #0B2C5F; }\n\n.jp-card.jp-card-maestro.jp-card-identified .jp-card-logo.jp-card-maestro {\n opacity: 1; }\n\n.jp-card-logo.jp-card-dankort {\n width: 60px;\n height: 36px;\n padding: 3px;\n border-radius: 8px;\n border: #000000 1px solid;\n background-color: #FFFFFF; }\n .jp-card-logo.jp-card-dankort .dk {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden; }\n .jp-card-logo.jp-card-dankort .dk:before {\n background-color: #ED1C24;\n content: '';\n position: absolute;\n width: 100%;\n height: 100%;\n display: block;\n border-radius: 6px; }\n .jp-card-logo.jp-card-dankort .dk:after {\n content: '';\n position: absolute;\n top: 50%;\n margin-top: -7.7px;\n right: 0;\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 7px 7px 10px 0;\n border-color: transparent #ED1C24 transparent transparent;\n z-index: 1; }\n .jp-card-logo.jp-card-dankort .d, .jp-card-logo.jp-card-dankort .k {\n position: absolute;\n top: 50%;\n width: 50%;\n display: block;\n height: 15.4px;\n margin-top: -7.7px;\n background: white; }\n .jp-card-logo.jp-card-dankort .d {\n left: 0;\n border-radius: 0 8px 10px 0; }\n .jp-card-logo.jp-card-dankort .d:before {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n display: block;\n background: #ED1C24;\n border-radius: 2px 4px 6px 0px;\n height: 5px;\n width: 7px;\n margin: -3px 0 0 -4px; }\n .jp-card-logo.jp-card-dankort .k {\n right: 0; }\n .jp-card-logo.jp-card-dankort .k:before, .jp-card-logo.jp-card-dankort .k:after {\n content: '';\n position: absolute;\n right: 50%;\n width: 0;\n height: 0;\n border-style: solid;\n margin-right: -1px; }\n .jp-card-logo.jp-card-dankort .k:before {\n top: 0;\n border-width: 8px 5px 0 0;\n border-color: #ED1C24 transparent transparent transparent; }\n .jp-card-logo.jp-card-dankort .k:after {\n bottom: 0;\n border-width: 0 5px 8px 0;\n border-color: transparent transparent #ED1C24 transparent; }\n\n.jp-card.jp-card-dankort.jp-card-identified .jp-card-front:before, .jp-card.jp-card-dankort.jp-card-identified .jp-card-back:before {\n background-color: #0055C7; }\n\n.jp-card.jp-card-dankort.jp-card-identified .jp-card-logo.jp-card-dankort {\n opacity: 1; }\n\n.jp-card-logo.jp-card-elo {\n height: 50px;\n width: 50px;\n border-radius: 100%;\n background: black;\n color: white;\n text-align: center;\n text-transform: lowercase;\n font-size: 21px;\n font-style: normal;\n letter-spacing: 1px;\n font-weight: bold;\n padding-top: 13px; }\n .jp-card-logo.jp-card-elo .e, .jp-card-logo.jp-card-elo .l, .jp-card-logo.jp-card-elo .o {\n display: inline-block;\n position: relative; }\n .jp-card-logo.jp-card-elo .e {\n -webkit-transform: rotate(-15deg);\n -moz-transform: rotate(-15deg);\n -ms-transform: rotate(-15deg);\n -o-transform: rotate(-15deg);\n transform: rotate(-15deg); }\n .jp-card-logo.jp-card-elo .o {\n position: relative;\n display: inline-block;\n width: 12px;\n height: 12px;\n right: 0;\n top: 7px;\n border-radius: 100%;\n background-image: -webkit-linear-gradient( yellow 50%, red 50%);\n background-image: linear-gradient( yellow 50%, red 50%);\n -webkit-transform: rotate(40deg);\n -moz-transform: rotate(40deg);\n -ms-transform: rotate(40deg);\n -o-transform: rotate(40deg);\n transform: rotate(40deg);\n text-indent: -9999px; }\n .jp-card-logo.jp-card-elo .o:before {\n content: \"\";\n position: absolute;\n width: 49%;\n height: 49%;\n background: black;\n border-radius: 100%;\n text-indent: -99999px;\n top: 25%;\n left: 25%; }\n\n.jp-card.jp-card-elo.jp-card-identified .jp-card-front:before, .jp-card.jp-card-elo.jp-card-identified .jp-card-back:before {\n background-color: #6F6969; }\n\n.jp-card.jp-card-elo.jp-card-identified .jp-card-logo.jp-card-elo {\n opacity: 1; }\n\n.jp-card-logo.jp-card-dinersclub {\n font-family: serif;\n height: 40px;\n width: 100px;\n color: white;\n font-size: 17px;\n font-style: normal;\n letter-spacing: 1px; }\n .jp-card-logo.jp-card-dinersclub::before, .jp-card-logo.jp-card-dinersclub::after {\n display: block;\n position: relative; }\n .jp-card-logo.jp-card-dinersclub::before {\n content: 'Diners Club'; }\n .jp-card-logo.jp-card-dinersclub::after {\n content: 'International';\n text-transform: uppercase;\n font-size: 0.6em; }\n\n.jp-card.jp-card-dinersclub .jp-card-front .jp-card-logo {\n box-shadow: none !important; }\n\n.jp-card.jp-card-dinersclub.jp-card-identified .jp-card-front:before, .jp-card.jp-card-dinersclub.jp-card-identified .jp-card-back:before {\n background-color: #999; }\n\n.jp-card.jp-card-dinersclub.jp-card-identified .jp-card-logo.jp-card-dinersclub {\n opacity: 1; }\n\n.jp-card-container {\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n width: 350px;\n max-width: 100%;\n height: 200px;\n margin: auto;\n z-index: 1;\n position: relative; }\n\n.jp-card {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n line-height: 1;\n position: relative;\n width: 100%;\n height: 100%;\n min-width: 315px;\n border-radius: 10px;\n -webkit-transform-style: preserve-3d;\n -moz-transform-style: preserve-3d;\n -ms-transform-style: preserve-3d;\n -o-transform-style: preserve-3d;\n transform-style: preserve-3d;\n -webkit-transition: all 400ms linear;\n -moz-transition: all 400ms linear;\n transition: all 400ms linear; }\n .jp-card > *, .jp-card > *:before, .jp-card > *:after {\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n font-family: inherit; }\n .jp-card.jp-card-flipped {\n -webkit-transform: rotateY(180deg);\n -moz-transform: rotateY(180deg);\n -ms-transform: rotateY(180deg);\n -o-transform: rotateY(180deg);\n transform: rotateY(180deg); }\n .jp-card .jp-card-front, .jp-card .jp-card-back {\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-transform-style: preserve-3d;\n -moz-transform-style: preserve-3d;\n -ms-transform-style: preserve-3d;\n -o-transform-style: preserve-3d;\n transform-style: preserve-3d;\n -webkit-transition: all 400ms linear;\n -moz-transition: all 400ms linear;\n transition: all 400ms linear;\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n overflow: hidden;\n border-radius: 10px;\n background: #DDD; }\n .jp-card .jp-card-front:before, .jp-card .jp-card-back:before {\n content: \" \";\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n opacity: 0;\n border-radius: 10px;\n -webkit-transition: all 400ms ease;\n -moz-transition: all 400ms ease;\n transition: all 400ms ease; }\n .jp-card .jp-card-front:after, .jp-card .jp-card-back:after {\n content: \" \";\n display: block; }\n .jp-card .jp-card-front .jp-card-display, .jp-card .jp-card-back .jp-card-display {\n color: white;\n font-weight: normal;\n opacity: 0.5;\n -webkit-transition: opacity 400ms linear;\n -moz-transition: opacity 400ms linear;\n transition: opacity 400ms linear; }\n .jp-card .jp-card-front .jp-card-display.jp-card-focused, .jp-card .jp-card-back .jp-card-display.jp-card-focused {\n opacity: 1;\n font-weight: 700; }\n .jp-card .jp-card-front .jp-card-cvc, .jp-card .jp-card-back .jp-card-cvc {\n font-family: \"Bitstream Vera S
433ans Mono\", Consolas, Courier, monospace;\n font-size: 14px; }\n .jp-card .jp-card-front .jp-card-shiny, .jp-card .jp-card-back .jp-card-shiny {\n width: 50px;\n height: 35px;\n border-radius: 5px;\n background: #CCC;\n position: relative; }\n .jp-card .jp-card-front .jp-card-shiny:before, .jp-card .jp-card-back .jp-card-shiny:before {\n content: \" \";\n display: block;\n width: 70%;\n height: 60%;\n border-top-right-radius: 5px;\n border-bottom-right-radius: 5px;\n background: #d9d9d9;\n position: absolute;\n top: 20%; }\n .jp-card .jp-card-front .jp-card-logo {\n position: absolute;\n opacity: 0;\n right: 5%;\n top: 8%;\n -webkit-transition: 400ms;\n -moz-transition: 400ms;\n transition: 400ms; }\n .jp-card .jp-card-front .jp-card-lower {\n width: 80%;\n position: absolute;\n left: 10%;\n bottom: 30px; }\n @media only screen and (max-width: 480px) {\n .jp-card .jp-card-front .jp-card-lower {\n width: 90%;\n left: 5%; } }\n .jp-card .jp-card-front .jp-card-lower .jp-card-cvc {\n visibility: hidden;\n float: right;\n position: relative;\n bottom: 5px; }\n .jp-card .jp-card-front .jp-card-lower .jp-card-number {\n font-family: \"Bitstream Vera Sans Mono\", Consolas, Courier, monospace;\n font-size: 24px;\n clear: both;\n margin-bottom: 30px; }\n .jp-card .jp-card-front .jp-card-lower .jp-card-expiry {\n font-family: \"Bitstream Vera Sans Mono\", Consolas, Courier, monospace;\n letter-spacing: 0em;\n position: relative;\n float: right;\n width: 25%; }\n .jp-card .jp-card-front .jp-card-lower .jp-card-expiry:before, .jp-card .jp-card-front .jp-card-lower .jp-card-expiry:after {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-weight: bold;\n font-size: 7px;\n white-space: pre;\n display: block;\n opacity: .5; }\n .jp-card .jp-card-front .jp-card-lower .jp-card-expiry:before {\n content: attr(data-before);\n margin-bottom: 2px;\n font-size: 7px;\n text-transform: uppercase; }\n .jp-card .jp-card-front .jp-card-lower .jp-card-expiry:after {\n position: absolute;\n content: attr(data-after);\n text-align: right;\n right: 100%;\n margin-right: 5px;\n margin-top: 2px;\n bottom: 0; }\n .jp-card .jp-card-front .jp-card-lower .jp-card-name {\n text-transform: uppercase;\n font-family: \"Bitstream Vera Sans Mono\", Consolas, Courier, monospace;\n font-size: 20px;\n max-height: 45px;\n position: absolute;\n bottom: 0;\n width: 190px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: horizontal;\n overflow: hidden;\n text-overflow: ellipsis; }\n .jp-card .jp-card-back {\n -webkit-transform: rotateY(180deg);\n -moz-transform: rotateY(180deg);\n -ms-transform: rotateY(180deg);\n -o-transform: rotateY(180deg);\n transform: rotateY(180deg); }\n .jp-card .jp-card-back .jp-card-bar {\n background-color: #444;\n background-image: -webkit-linear-gradient(#444, #333);\n background-image: linear-gradient(#444, #333);\n width: 100%;\n height: 20%;\n position: absolute;\n top: 10%; }\n .jp-card .jp-card-back:after {\n content: \" \";\n display: block;\n background-color: #FFF;\n background-image: -webkit-linear-gradient(#FFF, #FFF);\n background-image: linear-gradient(#FFF, #FFF);\n width: 80%;\n height: 16%;\n position: absolute;\n top: 40%;\n left: 2%; }\n .jp-card .jp-card-back .jp-card-cvc {\n position: absolute;\n top: 40%;\n left: 85%;\n -webkit-transition-delay: 600ms;\n -moz-transition-delay: 600ms;\n transition-delay: 600ms; }\n .jp-card .jp-card-back .jp-card-shiny {\n position: absolute;\n top: 66%;\n left: 2%; }\n .jp-card .jp-card-back .jp-card-shiny:after {\n content: \"This card has been issued by Jesse Pollak and is licensed for anyone to use anywhere for free. It comes with no warranty. For support issues, please visit: github.com/jessepollak/card.\";\n position: absolute;\n left: 120%;\n top: 5%;\n color: white;\n font-size: 7px;\n width: 230px;\n opacity: .5; }\n .jp-card.jp-card-identified {\n box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); }\n .jp-card.jp-card-identified .jp-card-front, .jp-card.jp-card-identified .jp-card-back {\n background-color: #000;\n background-color: rgba(0, 0, 0, 0.5); }\n .jp-card.jp-card-identified .jp-card-front:before, .jp-card.jp-card-identified .jp-card-back:before {\n -webkit-transition: all 400ms ease;\n -moz-transition: all 400ms ease;\n transition: all 400ms ease;\n background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 1px, rgba(255, 255, 255, 0) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.03) 4px), repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(210deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 70% 70%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 90% 20%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 15% 80%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), -webkit-linear-gradient(-245deg, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 70%, rgba(255, 255, 255, 0) 90%);\n background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 1px, rgba(255, 255, 255, 0) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.03) 4px), repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(210deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 70% 70%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 90% 20%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-radial-gradient(circle at 15% 80%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), linear-gradient(-25deg, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 70%, rgba(255, 255, 255, 0) 90%);\n opacity: 1; }\n .jp-card.jp-card-identified .jp-card-front .jp-card-logo, .jp-card.jp-card-identified .jp-card-back .jp-card-logo {\n box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.3); }\n .jp-card.jp-card-identified.no-radial-gradient .jp-card-front:before, .jp-card.jp-card-identified.no-radial-gradient .jp-card-back:before {\n background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 1px, rgba(255, 255, 255, 0) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.03) 4px), repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(210deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), -webkit-linear-gradient(-245deg, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 70%, rgba(255, 255, 255, 0) 90%);\n background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(135deg, rgba(255, 255, 255, 0.05) 1px, rgba(255, 255, 255, 0) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.03) 4px), repeating-linear-gradient(90deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), repeating-linear-gradient(210deg, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.04) 3px, rgba(255, 255, 255, 0.05) 4px), linear-gradient(-25deg, rgba(255, 255, 255, 0) 50%, rgba(255, 255, 255, 0.2) 70%, rgba(255, 255, 255, 0) 90%); }\n", ""]); 434 435 // exports 436 437 438 /***/ }), 439 /* 3 */
vendor: 11,714 bytes, lines 440-732
440 /***/ (function(module, exports) { 441 442 /* 443 MIT License http://www.opensource.org/licenses/mit-license.php 444 Author Tobias Koppers @sokra 445 */ 446 // css base code, injected by the css-loader 447 module.exports = function() { 448 var list = []; 449 450 // return the list of modules as css string 451 list.toString = function toString() { 452 var result = []; 453 for(var i = 0; i < this.length; i++) { 454 var item = this[i]; 455 if(item[2]) { 456 result.push("@media " + item[2] + "{" + item[1] + "}"); 457 } else { 458 result.push(item[1]); 459 } 460 } 461 return result.join(""); 462 }; 463 464 // import a list of modules into the list 465 list.i = function(modules, mediaQuery) { 466 if(typeof modules === "string") 467 modules = [[null, modules, ""]]; 468 var alreadyImportedModules = {}; 469 for(var i = 0; i < this.length; i++) { 470 var id = this[i][0]; 471 if(typeof id === "number") 472 alreadyImportedModules[id] = true; 473 } 474 for(i = 0; i < modules.length; i++) { 475 var item = modules[i]; 476 // skip already imported module 477 // this implementation is not 100% perfect for weird media query combinations 478 // when a module is imported multiple times with different media queries. 479 // I hope this will never occur (Hey this way we have smaller bundles) 480 if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { 481 if(mediaQuery && !item[2]) { 482 item[2] = mediaQuery; 483 } else if(mediaQuery) { 484 item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; 485 } 486 list.push(item); 487 } 488 } 489 }; 490 return list; 491 }; 492 493 494 /***/ }), 495 /* 4 */ 496 /***/ (function(module, exports, __webpack_require__) { 497 498 /* 499 MIT License http://www.opensource.org/licenses/mit-license.php 500 Author Tobias Koppers @sokra 501 */ 502 var stylesInDom = {}, 503 memoize = function(fn) { 504 var memo; 505 return function () { 506 if (typeof memo === "undefined") memo = fn.apply(this, arguments); 507 return memo; 508 }; 509 }, 510 isOldIE = memoize(function() { 511 return /msie [6-9]\b/.test(self.navigator.userAgent.toLowerCase()); 512 }), 513 getHeadElement = memoize(function () { 514 return document.head || document.getElementsByTagName("head")[0]; 515 }), 516 singletonElement = null, 517 singletonCounter = 0, 518 styleElementsInsertedAtTop = []; 519 520 module.exports = function(list, options) { 521 if(false) { 522 if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment"); 523 } 524 525 options = options || {}; 526 // Force single-tag solution on IE6-9, which has a hard limit on the # of <style> 527 // tags it will allow on a page 528 if (typeof options.singleton === "undefined") options.singleton = isOldIE(); 529 530 // By default, add <style> tags to the bottom of <head>. 531 if (typeof options.insertAt === "undefined") options.insertAt = "bottom"; 532 533 var styles = listToStyles(list); 534 addStylesToDom(styles, options); 535 536 return function update(newList) { 537 var mayRemove = []; 538 for(var i = 0; i < styles.length; i++) { 539 var item = styles[i]; 540 var domStyle = stylesInDom[item.id]; 541 domStyle.refs--; 542 mayRemove.push(domStyle); 543 } 544 if(newList) { 545 var newStyles = listToStyles(newList); 546 addStylesToDom(newStyles, options); 547 } 548 for(var i = 0; i < mayRemove.length; i++) { 549 var domStyle = mayRemove[i]; 550 if(domStyle.refs === 0) { 551 for(var j = 0; j < domStyle.parts.length; j++) 552 domStyle.parts[j](); 553 delete stylesInDom[domStyle.id]; 554 } 555 } 556 }; 557 } 558 559 function addStylesToDom(styles, options) { 560 for(var i = 0; i < styles.length; i++) { 561 var item = styles[i]; 562 var domStyle = stylesInDom[item.id]; 563 if(domStyle) { 564 domStyle.refs++; 565 for(var j = 0; j < domStyle.parts.length; j++) { 566 domStyle.parts[j](item.parts[j]); 567 } 568 for(; j < item.parts.length; j++) { 569 domStyle.parts.push(addStyle(item.parts[j], options)); 570 } 571 } else { 572 var parts = []; 573 for(var j = 0; j < item.parts.length; j++) { 574 parts.push(addStyle(item.parts[j], options)); 575 } 576 stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts}; 577 } 578 } 579 } 580 581 function listToStyles(list) { 582 var styles = []; 583 var newStyles = {}; 584 for(var i = 0; i < list.length; i++) { 585 var item = list[i]; 586 var id = item[0]; 587 var css = item[1]; 588 var media = item[2]; 589 var sourceMap = item[3]; 590 var part = {css: css, media: media, sourceMap: sourceMap}; 591 if(!newStyles[id]) 592 styles.push(newStyles[id] = {id: id, parts: [part]}); 593 else 594 newStyles[id].parts.push(part); 595 } 596 return styles; 597 } 598 599 function insertStyleElement(options, styleElement) { 600 var head = getHeadElement(); 601 var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1]; 602 if (options.insertAt === "top") { 603 if(!lastStyleElementInsertedAtTop) { 604 head.insertBefore(styleElement, head.firstChild); 605 } else if(lastStyleElementInsertedAtTop.nextSibling) { 606 head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling); 607 } else { 608 head.appendChild(styleElement); 609 } 610 styleElementsInsertedAtTop.push(styleElement); 611 } else if (options.insertAt === "bottom") { 612 head.appendChild(styleElement); 613 } else { 614 throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'."); 615 } 616 } 617 618 function removeStyleElement(styleElement) { 619 styleElement.parentNode.removeChild(styleElement); 620 var idx = styleElementsInsertedAtTop.indexOf(styleElement); 621 if(idx >= 0) { 622 styleElementsInsertedAtTop.splice(idx, 1); 623 } 624 } 625 626 function createStyleElement(options) { 627 var styleElement = document.createElement("style"); 628 styleElement.type = "text/css"; 629 insertStyleElement(options, styleElement); 630 return styleElement; 631 } 632 633 function createLinkElement(options) { 634 var linkElement = document.createElement("link"); 635 linkElement.rel = "stylesheet"; 636 insertStyleElement(options, linkElement); 637 return linkElement; 638 } 639 640 function addStyle(obj, options) { 641 var styleElement, update, remove; 642 643 if (options.singleton) { 644 var styleIndex = singletonCounter++; 645 styleElement = singletonElement || (singletonElement = createStyleElement(options)); 646 update = applyToSingletonTag.bind(null, styleElement, styleIndex, false); 647 remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true); 648 } else if(obj.sourceMap && 649 typeof URL === "function" && 650 typeof URL.createObjectURL === "function" && 651 typeof URL.revokeObjectURL === "function" && 652 typeof Blob === "function" && 653 typeof btoa === "function") { 654 styleElement = createLinkElement(options); 655 update = updateLink.bind(null, styleElement); 656 remove = function() { 657 removeStyleElement(styleElement); 658 if(styleElement.href) 659 URL.revokeObjectURL(styleElement.href); 660 }; 661 } else { 662 styleElement = createStyleElement(options); 663 update = applyToTag.bind(null, styleElement); 664 remove = function() { 665 removeStyleElement(styleElement); 666 }; 667 } 668 669 update(obj); 670 671 return function updateStyle(newObj) { 672 if(newObj) { 673 if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) 674 return; 675 update(obj = newObj); 676 } else { 677 remove(); 678 } 679 }; 680 } 681 682 var replaceText = (function () { 683 var textStore = []; 684 685 return function (index, replacement) { 686 textStore[index] = replacement; 687 return textStore.filter(Boolean).join('\n'); 688 }; 689 })(); 690 691 function applyToSingletonTag(styleElement, index, remove, obj) { 692 var css = remove ? "" : obj.css; 693 694 if (styleElement.styleSheet) { 695 styleElement.styleSheet.cssText = replaceText(index, css); 696 } else { 697 var cssNode = document.createTextNode(css); 698 var childNodes = styleElement.childNodes; 699 if (childNodes[index]) styleElement.removeChild(childNodes[index]); 700 if (childNodes.length) { 701 styleElement.insertBefore(cssNode, childNodes[index]); 702 } else { 703 styleElement.appendChild(cssNode); 704 } 705 } 706 } 707 708 function applyToTag(styleElement, obj) { 709 var css = obj.css; 710 var media = obj.media; 711 712 if(media) { 713 styleElement.setAttribute("media", media) 714 } 715 716 if(styleElement.styleSheet) { 717 styleElement.styleSheet.cssText = css; 718 } else { 719 while(styleElement.firstChild) { 720 styleElement.removeChild(styleElement.firstChild); 721 } 722 styleElement.appendChild(document.createTextNode(css)); 723 } 724 } 725 726 function updateLink(linkElement, obj) { 727 var css = obj.css; 728 var sourceMap = obj.sourceMap; 729 730 if(sourceMap) { 731 // http://stackoverflow.com/a/26603875 732 css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)
732))) + " */"; 733 } 734 735 var blob = new Blob([css], { type: "text/css" }); 736 737 var oldSrc = linkElement.href; 738 739 linkElement.href = URL.createObjectURL(blob); 740 741 if(oldSrc) 742 URL.revokeObjectURL(oldSrc); 743 } 744 745 746 /***/ }), 747 /* 5 */ 748 /***/ (function(module, exports) { 749 750 // Generated by CoffeeScript 1.10.0 751 (function() { 752 var QJ, rreturn, rtrim; 753 754 QJ = function(selector) { 755 if (QJ.isDOMElement(selector)) { 756 return selector; 757 } 758 return document.querySelectorAll(selector); 759 }; 760 761 QJ.isDOMElement = function(el) { 762 return el && (el.nodeName != null); 763 }; 764 765 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 766 767 QJ.trim = function(text) { 768 if (text === null) { 769 return ""; 770 } else { 771 return (text + "").replace(rtrim, ""); 772 } 773 }; 774 775 rreturn = /\r/g; 776 777 QJ.val = function(el, val) { 778 var ret; 779 if (arguments.length > 1) { 780 return el.value = val; 781 } else { 782 ret = el.value; 783 if (typeof ret === "string") { 784 return ret.replace(rreturn, ""); 785 } else { 786 if (ret === null) { 787 return ""; 788 } else { 789 return ret; 790 } 791 } 792 } 793 }; 794 795 QJ.preventDefault = function(eventObject) { 796 if (typeof eventObject.preventDefault === "function") { 797 eventObject.preventDefault(); 798 return; 799 } 800 eventObject.returnValue = false; 801 return false; 802 }; 803 804 QJ.normalizeEvent = function(e) { 805 var original; 806 original = e; 807 e = { 808 which: original.which != null ? original.which : void 0, 809 target: original.target || original.srcElement, 810 preventDefault: function() { 811 return QJ.preventDefault(original); 812 }, 813 originalEvent: original, 814 data: original.data || original.detail 815 }; 816 if (e.which == null) { 817 e.which = original.charCode != null ? original.charCode : original.keyCode; 818 } 819 return e; 820 }; 821 822 QJ.on = function(element, eventName, callback) { 823 var el, i, j, len, len1, multEventName, originalCallback, ref; 824 if (element.length) { 825 for (i = 0, len = element.length; i < len; i++) { 826 el = element[i]; 827 QJ.on(el, eventName, callback); 828 } 829 return; 830 } 831 if (eventName.match(" ")) { 832 ref = eventName.split(" "); 833 for (j = 0, len1 = ref.length; j < len1; j++) { 834 multEventName = ref[j]; 835 QJ.on(element, multEventName, callback); 836 } 837 return; 838 } 839 originalCallback = callback; 840 callback = function(e) { 841 e = QJ.normalizeEvent(e); 842 return originalCallback(e); 843 }; 844 if (element.addEventListener) { 845 return element.addEventListener(eventName, callback, false); 846 } 847 if (element.attachEvent) { 848 eventName = "on" + eventName; 849 return element.attachEvent(eventName, callback); 850 } 851 element['on' + eventName] = callback; 852 }; 853 854 QJ.addClass = function(el, className) { 855 var e; 856 if (el.length) { 857 return (function() { 858 var i, len, results; 859 results = []; 860 for (i = 0, len = el.length; i < len; i++) { 861 e = el[i]; 862 results.push(QJ.addClass(e, className)); 863 } 864 return results; 865 })(); 866 } 867 if (el.classList) { 868 return el.classList.add(className); 869 } else { 870 return el.className += ' ' + className; 871 } 872 }; 873 874 QJ.hasClass = function(el, className) { 875 var e, hasClass, i, len; 876 if (el.length) { 877 hasClass = true; 878 for (i = 0, len = el.length; i < len; i++) { 879 e = el[i]; 880 hasClass = hasClass && QJ.hasClass(e, className); 881 } 882 return hasClass; 883 } 884 if (el.classList) { 885 return el.classList.contains(className); 886 } else { 887 return new RegExp('(^| )' + className + '( |$)', 'gi').test(el.className); 888 } 889 }; 890 891 QJ.removeClass = function(el, className) { 892 var cls, e, i, len, ref, results; 893 if (el.length) { 894 return (function() { 895 var i, len, results; 896 results = []; 897 for (i = 0, len = el.length; i < len; i++) { 898 e = el[i]; 899 results.push(QJ.removeClass(e, className)); 900 } 901 return results; 902 })(); 903 } 904 if (el.classList) { 905 ref = className.split(' '); 906 results = []; 907 for (i = 0, len = ref.length; i < len; i++) { 908 cls = ref[i]; 909 results.push(el.classList.remove(cls)); 910 } 911 return results; 912 } else { 913 return el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); 914 } 915 }; 916 917 QJ.toggleClass = function(el, className, bool) { 918 var e; 919 if (el.length) { 920 return (function() { 921 var i, len, results; 922 results = []; 923 for (i = 0, len = el.length; i < len; i++) { 924 e = el[i]; 925 results.push(QJ.toggleClass(e, className, bool)); 926 } 927 return results; 928 })(); 929 } 930 if (bool) { 931 if (!QJ.hasClass(el, className)) { 932 return QJ.addClass(el, className); 933 } 934 } else { 935 return QJ.removeClass(el, className); 936 } 937 }; 938 939 QJ.append = function(el, toAppend) { 940 var e; 941 if (el.length) { 942 return (function() { 943 var i, len, results; 944 results = []; 945 for (i = 0, len = el.length; i < len; i++) { 946 e = el[i]; 947 results.push(QJ.append(e, toAppend)); 948 } 949 return results; 950 })(); 951 } 952 return el.insertAdjacentHTML('beforeend', toAppend); 953 }; 954 955 QJ.find = function(el, selector) { 956 if (el instanceof NodeList || el instanceof Array) { 957 el = el[0]; 958 } 959 return el.querySelectorAll(selector); 960 }; 961 962 QJ.trigger = function(el, name, data) { 963 var e, error, ev; 964 try { 965 ev = new CustomEvent(name, { 966 detail: data 967 }); 968 } catch (error) { 969 e = error; 970 ev = document.createEvent('CustomEvent'); 971 if (ev.initCustomEvent) { 972 ev.initCustomEvent(name, true, true, data); 973 } else { 974 ev.initEvent(name, true, true, data); 975 } 976 } 977 return el.dispatchEvent(ev); 978 }; 979 980 module.exports = QJ; 981 982 }).call(this); 983 984 985 /***/ }), 986 /* 6 */ 987 /***/ (function(module, exports, __webpack_require__) { 988 989 /* WEBPACK VAR INJECTION */(function(global) {// Generated by CoffeeScript 1.10.0 990 (function() {
991 var Payment, QJ, cardFromNumber, cardFromType, cards, defaultFormat, formatBackCardNumber, formatBackExpiry, formatCardNumber, formatExpiry, reFormatExpiry, formatForwardExpiry, formatForwardSlash, formatMonthExpiry, hasTextSelected, luhnCheck, reFormatCardNumber, restrictCVC, restrictCardNumber, restrictCombinedExpiry, restrictExpiry, restrictMonthExpiry, restrictNumeric, restrictYearExpiry, setCardType, 992 indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; 993 994 QJ = __webpack_require__(5); 995 996 defaultFormat = /(\d{1,4})/g; 997 998 cards = [ 999 { 1000 type: 'amex', 1001 pattern: /^3[47]/, 1002 format: /(\d{1,4})(\d{1,6})?(\d{1,5})?/, 1003 length: [15], 1004 cvcLength: [4], 1005 luhn: true 1006 }, { 1007 type: 'dankort', 1008 pattern: /^5019/, 1009 format: defaultFormat, 1010 length: [16], 1011 cvcLength: [3], 1012 luhn: true 1013 }, { 1014 type: 'dinersclub', 1015 pattern: /^(36|38|30[0-5])/, 1016 format: /(\d{1,4})(\d{1,6})?(\d{1,4})?/, 1017 length: [14], 1018 cvcLength: [3], 1019 luhn: true 1020 }, { 1021 type: 'discover', 1022 pattern: /^(6011|65|64[4-9]|622)/, 1023 format: defaultFormat, 1024 length: [16], 1025 cvcLength: [3], 1026 luhn: true 1027 }, { 1028 type: 'jcb', 1029 pattern: /^35/, 1030 format: defaultFormat, 1031 length: [16], 1032 cvcLength: [3], 1033 luhn: true 1034 }, { 1035 type: 'laser', 1036 pattern: /^(6706|6771|6709)/, 1037 format: defaultFormat, 1038 length: [16, 17, 18, 19], 1039 cvcLength: [3], 1040 luhn: true 1041 }, { 1042 type: 'maestro', 1043 pattern: /^(5018|5020|5038|6304|6703|6708|6759|676[1-3])/, 1044 format: defaultFormat, 1045 length: [12, 13, 14, 15, 16, 17, 18, 19], 1046 cvcLength: [3], 1047 luhn: true 1048 }, { 1049 type: 'mastercard', 1050 pattern: /^(5[1-5]|677189)|^(222[1-9]|2[3-6]\d{2}|27[0-1]\d|2720)/, 1051 format: defaultFormat, 1052 length: [16], 1053 cvcLength: [3], 1054 luhn: true 1055 }, { 1056 type: 'unionpay', 1057 pattern: /^62/, 1058 format: defaultFormat, 1059 length: [16, 17, 18, 19], 1060 cvcLength: [3], 1061 luhn: false 1062 }, { 1063 type: 'visaelectron', 1064 pattern: /^4(026|17500|405|508|844|91[37])/, 1065 format: defaultFormat, 1066 length: [16], 1067 cvcLength: [3], 1068 luhn: true 1069 }, { 1070 type: 'elo', 1071 pattern: /^(4011|438935|45(1416|76|7393)|50(4175|6699|67|90[4-7])|63(6297|6368))/, 1072 format: defaultFormat, 1073 length: [16], 1074 cvcLength: [3], 1075 luhn: true 1076 }, { 1077 type: 'visa', 1078 pattern: /^4/, 1079 format: defaultFormat, 1080 length: [13, 16, 19], 1081 cvcLength: [3], 1082 luhn: true 1083 } 1084 ]; 1085 1086 cardFromNumber = function(num) { 1087 var card, j, len; 1088 num = (num + '').replace(/\D/g, ''); 1089 for (j = 0, len = cards.length; j < len; j++) { 1090 card = cards[j]; 1091 if (card.pattern.test(num)) { 1092 return card; 1093 } 1094 } 1095 }; 1096 1097 cardFromType = function(type) { 1098 var card, j, len; 1099 for (j = 0, len = cards.length; j < len; j++) { 1100 card = cards[j]; 1101 if (card.type === type) { 1102 return card; 1103 } 1104 } 1105 }; 1106 1107 luhnCheck = function(num) { 1108 var digit, digits, j, len, odd, sum; 1109 odd = true; 1110 sum = 0; 1111 digits = (num + '').split('').reverse(); 1112 for (j = 0, len = digits.length; j < len; j++) { 1113 digit = digits[j]; 1114 digit = parseInt(digit, 10); 1115 if ((odd = !odd)) { 1116 digit *= 2; 1117 } 1118 if (digit > 9) { 1119 digit -= 9; 1120 } 1121 sum += digit; 1122 } 1123 return sum % 10 === 0; 1124 }; 1125 1126 hasTextSelected = function(target) { 1127 var e, error, ref; 1128 try { 1129 if ((target.selectionStart != null) && target.selectionStart !== target.selectionEnd) { 1130 return true; 1131 } 1132 if ((typeof document !== "undefined" && document !== null ? (ref = document.selection) != null ? ref.createRange : void 0 : void 0) != null) { 1133 if (document.selection.createRange().text) { 1134 return true; 1135 } 1136 } 1137 } catch (error) { 1138 e = error; 1139 } 1140 return false;
1141 }; 1142 1143 reFormatCardNumber = function(e) { 1144 return setTimeout((function(_this) { 1145 return function() { 1146 var target, value; 1147 target = e.target; 1148 value = QJ.val(target); 1149 value = Payment.fns.formatCardNumber(value); 1150 QJ.val(target, value); 1151 return QJ.trigger(target, 'change'); 1152 }; 1153 })(this)); 1154 }; 1155 1156 formatCardNumber = function(e) { 1157 var card, digit, i, j, len, length, re, target, upperLength, upperLengths, value; 1158 digit = String.fromCharCode(e.which); 1159 if (!/^\d+$/.test(digit)) { 1160 return; 1161 } 1162 target = e.target; 1163 value = QJ.val(target); 1164 card = cardFromNumber(value + digit); 1165 length = (value.replace(/\D/g, '') + digit).length; 1166 upperLengths = [16]; 1167 if (card) { 1168 upperLengths = card.length; 1169 } 1170 for (i = j = 0, len = upperLengths.length; j < len; i = ++j) { 1171 upperLength = upperLengths[i]; 1172 if (length >= upperLength && upperLengths[i + 1]) { 1173 continue; 1174 } 1175 if (length >= upperLength) { 1176 return; 1177 } 1178 } 1179 if (hasTextSelected(target)) { 1180 return; 1181 } 1182 if (card && card.type === 'amex') { 1183 re = /^(\d{4}|\d{4}\s\d{6})$/; 1184 } else { 1185 re = /(?:^|\s)(\d{4})$/; 1186 } 1187 if (re.test(value)) { 1188 e.preventDefault(); 1189 QJ.val(target, value + ' ' + digit); 1190 return QJ.trigger(target, 'change'); 1191 } 1192 }; 1193 1194 formatBackCardNumber = function(e) { 1195 var target, value; 1196 target = e.target; 1197 value = QJ.val(target); 1198 if (e.meta) { 1199 return; 1200 } 1201 if (e.which !== 8) { 1202 return; 1203 } 1204 if (hasTextSelected(target)) { 1205 return; 1206 } 1207 if (/\d\s$/.test(value)) { 1208 e.preventDefault(); 1209 QJ.val(target, value.replace(/\d\s$/, '')); 1210 return QJ.trigger(target, 'change'); 1211 } else if (/\s\d?$/.test(value)) { 1212 e.preventDefault(); 1213 QJ.val(target, value.replace(/\s\d?$/, '')); 1214 return QJ.trigger(target, 'change'); 1215 } 1216 }; 1217 1218 formatExpiry = function(e) { 1219 var digit, target, val; 1220 digit = String.fromCharCode(e.which); 1221 if (!/^\d+$/.test(digit)) { 1222 return; 1223 } 1224 target = e.target; 1225 val = QJ.val(target) + digit; 1226 if (/^\d$/.test(val) && (val !== '0' && val !== '1')) { 1227 e.preventDefault(); 1228 QJ.val(target, "0" + val + " / "); 1229 return QJ.trigger(target, 'change'); 1230 } else if (/^\d\d$/.test(val)) { 1231 e.preventDefault(); 1232 QJ.val(target, val + " / "); 1233 return QJ.trigger(target, 'change'); 1234 } 1235 }; 1236 1237 reFormatExpiry = function(e) { 1238 return setTimeout((function(_this) { 1239 return function() { 1240 var target, value; 1241 target = e.target; 1242 value = QJ.val(target); 1243 value = Payment.fns.formatExpiry(value); 1244 QJ.val(target, value); 1245 return QJ.trigger(target, 'change'); 1246 }; 1247 })(this)); 1248 }; 1249 1250 1251 formatMonthExpiry = function(e) { 1252 var digit, target, val; 1253 digit = String.fromCharCode(e.which); 1254 if (!/^\d+$/.test(digit)) { 1255 return; 1256 } 1257 target = e.target; 1258 val = QJ.val(target) + digit; 1259 if (/^\d$/.test(val) && (val !== '0' && val !== '1')) { 1260 e.preventDefault(); 1261 QJ.val(target, "0" + val); 1262 return QJ.trigger(target, 'change'); 1263 } else if (/^\d\d$/.test(val)) { 1264 e.preventDefault(); 1265 QJ.val(target, "" + val); 1266 return QJ.trigger(target, 'change'); 1267 } 1268 }; 1269 1270 formatForwardExpiry = function(e) { 1271 var digit, target, val; 1272 digit = String.fromCharCode(e.which); 1273 if (!/^\d+$/.test(digit)) { 1274 return; 1275 } 1276 target = e.target; 1277 val = QJ.val(target); 1278 if (/^\d\d$/.test(val)) { 1279 QJ.val(target, val + " / "); 1280 return QJ.trigger(target, 'change'); 1281 } 1282 }; 1283 1284 formatForwardSlash = function(e) { 1285 var slash, target, val; 1286 slash = String.fromCharCode(e.which); 1287 if (slash !== '/') { 1288 return; 1289 } 1290 target = e.target; 1291 val = QJ.val(target); 1292 if (/^\d$/.test(val) && val !== '0') { 1293 QJ.val(target, "0" + val + " / "); 1294 return QJ.trigger(target, 'change'); 1295 } 1296 }; 1297 1298 formatBackExpiry = function(e) { 1299 var target, value; 1300 if (e.metaKey) { 1301 return; 1302 } 1303 target = e.target; 1304 value = QJ.val(target); 1305 if (e.which !== 8) { 1306 return; 1307 } 1308 if (hasTextSelected(target)) { 1309 return; 1310 } 1311 if (/\d(\s|\/)+$/.test(value)) { 1312 e.preventDefault(); 1313 QJ.val(target, value.replace(/\d(\s|\/)*$/, '')); 1314 return QJ.trigger(target, 'change'); 1315 } else if (/\s\/\s?\d?$/.test(value)) { 1316 e.preventDefault(); 1317 QJ.val(target, value.replace(/\s\/\s?\d?$/, '')); 1318 return QJ.trigger(target, 'change'); 1319 } 1320 }; 1321 1322 restrictNumeric = function(e) { 1323 var input; 1324 if (e.metaKey || e.ctrlKey) { 1325 return true; 1326 } 1327 if (e.which === 32) { 1328 return e.preventDefault(); 1329 } 1330 if (e.which === 0) { 1331 return true; 1332 } 1333 if (e.which < 33) { 1334 return true; 1335 } 1336 input = String.fromCharCode(e.which); 1337 if (!/[\d\s]/.test(input)) { 1338 return e.preventDefault(); 1339 } 1340 }; 1341 1342 restrictCardNumber = function(e) { 1343 var card, digit, target, value; 1344 target = e.target; 1345 digit = String.fromCharCode(e.which); 1346 if (!/^\d+$/.test(digit)) { 1347 return; 1348 } 1349 if (hasTextSelected(target)) { 1350 return; 1351 } 1352 value = (QJ.val(target) + digit).replace(/\D/g, ''); 1353 card = cardFromNumber(value); 1354 if (card) { 1355 if (!(value.length <= card.length[card.length.length - 1])) { 1356 return e.preventDefault(); 1357 } 1358 } else { 1359 if (!(value.length <= 16)) { 1360 return e.preventDefault(); 1361 } 1362 } 1363 }; 1364 1365 restrictExpiry = function(e, length) { 1366 var digit, target, value; 1367 target = e.target; 1368 digit = String.fromCharCode(e.which); 1369 if (!/^\d+$/.test(digit)) { 1370 return; 1371 } 1372 if (hasTextSelected(target)) { 1373 return; 1374 } 1375 value = QJ.val(target) + digit; 1376 value = value.replace(/\D/g, ''); 1377 if (value.length > length) { 1378 return e.preventDefault(); 1379 } 1380 }; 1381 1382 restrictCombinedExpiry = function(e) { 1383 return restrictExpiry(e, 6); 1384 }; 1385 1386 restrictMonthExpiry = function(e) { 1387 return restrictExpiry(e, 2); 1388 }; 1389 1390 restrictYearExpiry = function(e) { 1391 return restrictExpiry(e, 4); 1392 }; 1393 1394 restrictCVC = function(e) { 1395 var digit, target, val; 1396 target = e.target; 1397 digit = String.fromCharCode(e.which); 1398 if (!/^\d+$/.test(digit)) { 1399 return; 1400 } 1401 if (hasTextSelected(target)) { 1402 return; 1403 } 1404 val = QJ.val(target) + digit; 1405 if (!(val.length <= 4)) { 1406 return e.preventDefault(); 1407 } 1408 }; 1409 1410 setCardType = function(e) { 1411 var allTypes, card, cardType, target, val; 1412 target = e.target; 1413 val = QJ.val(target); 1414 cardType = Payment.fns.cardType(val) || 'unknown'; 1415 if (!QJ.hasClass(target, cardType)) { 1416 allTypes = (function() { 1417 var j, len, results; 1418 results = []; 1419 for (j = 0, len = cards.length; j < len; j++) { 1420 card = cards[j]; 1421 results.push(card.type); 1422 } 1423 return results; 1424 })(); 1425 QJ.removeClass(target, 'unknown'); 1426 QJ.removeClass(target, allTypes.join(' ')); 1427 QJ.addClass(target, cardType); 1428 QJ.toggleClass(target, 'identified', cardType !== 'unknown'); 1429 return QJ.trigger(target, 'payment.cardType', cardType); 1430 } 1431 }; 1432 1433 Payment = (function() { 1434 function Payment() {} 1435 1436 Payment.fns = { 1437 cardExpiryVal: function(value) { 1438 var month, prefix, ref, year; 1439 value = value.replace(/\s/g, '');
1440 ref = value.split('/', 2), month = ref[0], year = ref[1]; 1441 if ((year != null ? year.length : void 0) === 2 && /^\d+$/.test(year)) { 1442 prefix = (new Date).getFullYear(); 1443 prefix = prefix.toString().slice(0, 2); 1444 year = prefix + year; 1445 } 1446 month = parseInt(month, 10); 1447 year = parseInt(year, 10); 1448 return { 1449 month: month, 1450 year: year 1451 }; 1452 }, 1453 validateCardNumber: function(num) { 1454 var card, ref; 1455 num = (num + '').replace(/\s+|-/g, ''); 1456 if (!/^\d+$/.test(num)) { 1457 return false; 1458 } 1459 card = cardFromNumber(num); 1460 if (!card) { 1461 return false; 1462 } 1463 return (ref = num.length, indexOf.call(card.length, ref) >= 0) && (card.luhn === false || luhnCheck(num)); 1464 }, 1465 validateCardExpiry: function(month, year) { 1466 var currentTime, expiry, prefix, ref, ref1; 1467 if (typeof month === 'object' && 'month' in month) { 1468 ref = month, month = ref.month, year = ref.year; 1469 } else if (typeof month === 'string' && indexOf.call(month, '/') >= 0) { 1470 ref1 = Payment.fns.cardExpiryVal(month), month = ref1.month, year = ref1.year; 1471 } 1472 if (!(month && year)) { 1473 return false; 1474 } 1475 month = QJ.trim(month); 1476 year = QJ.trim(year); 1477 if (!/^\d+$/.test(month)) { 1478 return false; 1479 } 1480 if (!/^\d+$/.test(year)) { 1481 return false; 1482 } 1483 month = parseInt(month, 10); 1484 if (!(month && month <= 12)) { 1485 return false; 1486 } 1487 if (year.length === 2) { 1488 prefix = (new Date).getFullYear(); 1489 prefix = prefix.toString().slice(0, 2); 1490 year = prefix + year; 1491 } 1492 expiry = new Date(year, month); 1493 currentTime = new Date; 1494 expiry.setMonth(expiry.getMonth() - 1); 1495 expiry.setMonth(expiry.getMonth() + 1, 1); 1496 return expiry > currentTime; 1497 }, 1498 validateCardCVC: function(cvc, type) { 1499 var ref, ref1; 1500 cvc = QJ.trim(cvc); 1501 if (!/^\d+$/.test(cvc)) { 1502 return false; 1503 } 1504 if (type && cardFromType(type)) { 1505 return ref = cvc.length, indexOf.call((ref1 = cardFromType(type)) != null ? ref1.cvcLength : void 0, ref) >= 0; 1506 } else { 1507 return cvc.length >= 3 && cvc.length <= 4; 1508 } 1509 }, 1510 cardType: function(num) { 1511 var ref; 1512 if (!num) { 1513 return null; 1514 } 1515 return ((ref = cardFromNumber(num)) != null ? ref.type : void 0) || null; 1516 }, 1517 formatCardNumber: function(num) { 1518 var card, groups, ref, upperLength; 1519 num = num.replace(/\D/g,''); 1520 card = cardFromNumber(num); 1521 if (!card) { 1522 $('[name="cvc"]').attr({"maxlength" : 4}) 1523 return num; 1524 } 1525 $('[name="cvc"]').attr({"maxlength" : card.cvcLength[0]}) 1526 upperLength = card.length[card.length.length - 1]; 1527 num = num.replace(/\D/g, ''); 1528 num = num.slice(0, upperLength); 1529 if (card.format.global) { 1530 return (ref = num.match(card.format)) != null ? ref.join(' ') : void 0; 1531 } else { 1532 groups = card.format.exec(num); 1533 if (groups != null) { 1534 groups.shift(); 1535 } 1536 return groups != null ? groups.join(' ') : void 0; 1537 } 1538 }, 1539 formatExpiry: function (value) { 1540 if (value.match(/^\d{2}\s\/$/) !== null) { 1541 return value.substr(0, 1); 1542 } 1543 value = value.replace(/\D/g,''); 1544 var v = value; 1545 if (v.match(/^\d{2}$/) !== null) { 1546 value = v + ' / '; 1547 } else if (v.match(/^\d{2}\/\d{2}$/) !== null) { 1548 value = v + ' / '; 1549 } else if (v.match(/\d{2}\d*/) !== null) { 1550 value = v.substr(0, 2) + ' / ' + v.substr(2, v.length); 1551 } 1552 return value; 1553 } 1554 }; 1555 1556 Payment.restrictNumeric = function(el) { 1557 return QJ.on(el, 'keypress', restrictNumeric); 1558 }; 1559 1560 Payment.cardExpiryVal = function(el) { 1561 return Payment.fns.cardExpiryVal(QJ.val(el)); 1562 }; 1563 1564 Payment.formatCardCVC = function(el) { 1565 Payment.restrictNumeric(el); 1566 QJ.on(el, 'keypress', restrictCVC); 1567 return el; 1568 }; 1569 1570 Payment.formatCardExpiry = function(el) { 1571 var month, year; 1572 Payment.restrictNumeric(el); 1573 if (el.length && el.length === 2) {
1574 month = el[0], year = el[1]; 1575 this.formatCardExpiryMultiple(month, year); 1576 } else { 1577 QJ.on(el, 'keypress', restrictCombinedExpiry); 1578 QJ.on(el, 'keypress', formatExpiry); 1579 QJ.on(el, 'keypress', formatForwardSlash); 1580 QJ.on(el, 'keypress', formatForwardExpiry); 1581 QJ.on(el, 'keydown', formatBackExpiry); 1582 QJ.on(el, 'paste', reFormatExpiry); 1583 QJ.on(el, 'input', reFormatExpiry); 1584 } 1585 return el; 1586 }; 1587 1588 Payment.formatCardExpiryMultiple = function(month, year) { 1589 QJ.on(month, 'keypress', restrictMonthExpiry); 1590 QJ.on(month, 'keypress', formatMonthExpiry); 1591 return QJ.on(year, 'keypress', restrictYearExpiry); 1592 }; 1593 1594 Payment.formatCardNumber = function(el) { 1595 Payment.restrictNumeric(el); 1596 QJ.on(el, 'keypress', restrictCardNumber); 1597 QJ.on(el, 'keypress', formatCardNumber); 1598 QJ.on(el, 'keydown', formatBackCardNumber); 1599 QJ.on(el, 'keyup blur', setCardType); 1600 QJ.on(el, 'paste', reFormatCardNumber); 1601 QJ.on(el, 'input', reFormatCardNumber); 1602 return el; 1603 }; 1604 1605 Payment.getCardArray = function() { 1606 return cards; 1607 }; 1608 1609 Payment.setCardArray = function(cardArray) { 1610 cards = cardArray; 1611 return true; 1612 }; 1613 1614 Payment.addToCardArray = function(cardObject) { 1615 return cards.push(cardObject); 1616 }; 1617 1618 Payment.removeFromCardArray = function(type) { 1619 var key, value; 1620 for (key in cards) { 1621 value = cards[key]; 1622 if (value.type === type) { 1623 cards.splice(key, 1); 1624 } 1625 } 1626 return true; 1627 }; 1628 1629 return Payment; 1630 1631 })(); 1632 1633 module.exports = Payment; 1634 1635 global.Payment = Payment; 1636 1637 }).call(this); 1638 1639 /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) 1640 1641 /***/ }), 1642 /* 7 */ 1643 /***/ (function(module, exports, __webpack_require__) { 1644 1645 'use strict'; 1646 1647 module.exports = __webpack_require__(8); 1648 1649 1650 /***/ }), 1651 /* 8 */ 1652 /***/ (function(module, exports, __webpack_require__) { 1653 1654 'use strict'; 1655 1656 /*! 1657 * node.extend 1658 * Copyright 2011, John Resig 1659 * Dual licensed under the MIT or GPL Version 2 licenses. 1660 * http://jquery.org/license 1661 * 1662 * @fileoverview 1663 * Port of jQuery.extend that actually works on node.js 1664 */ 1665 var is = __webpack_require__(9); 1666 1667 var extend = function extend() { 1668 var target = arguments[0] || {}; 1669 var i = 1; 1670 var length = arguments.length; 1671 var deep = false; 1672 var options, name, src, copy, copyIsArray, clone; 1673 1674 // Handle a deep copy situation 1675 if (typeof target === 'boolean') { 1676 deep = target; 1677 target = arguments[1] || {}; 1678 // skip the boolean and the target 1679 i = 2; 1680 } 1681 1682 // Handle case when target is a string or something (possible in deep copy) 1683 if (typeof target !== 'object' && !is.fn(target)) { 1684 target = {}; 1685 } 1686 1687 for (; i < length; i++) { 1688 // Only deal with non-null/undefined values 1689 options = arguments[i]; 1690 if (options != null) { 1691 if (typeof options === 'string') { 1692 options = options.split(''); 1693 } 1694 // Extend the base object 1695 for (name in options) { 1696 src = target[name]; 1697 copy = options[name]; 1698 1699 // Prevent never-ending loop 1700 if (target === copy) { 1701 continue; 1702 } 1703 1704 // Recurse if we're merging plain objects or arrays 1705 if (deep && copy && (is.hash(copy) || (copyIsArray = is.array(copy)))) { 1706 if (copyIsArray) { 1707 copyIsArray = false;
1708 clone = src && is.array(src) ? src : []; 1709 } else { 1710 clone = src && is.hash(src) ? src : {}; 1711 } 1712 1713 // Never move original objects, clone them 1714 target[name] = extend(deep, clone, copy); 1715 1716 // Don't bring in undefined values 1717 } else if (typeof copy !== 'undefined') { 1718 target[name] = copy; 1719 } 1720 } 1721 } 1722 } 1723 1724 // Return the modified object 1725 return target; 1726 }; 1727 1728 /** 1729 * @public 1730 */ 1731 extend.version = '1.1.3'; 1732 1733 /** 1734 * Exports module. 1735 */ 1736 module.exports = extend; 1737 1738 1739 /***/ }), 1740 /* 9 */ 1741 /***/ (function(module, exports) { 1742 1743 /* globals window, HTMLElement */ 1744 1745 'use strict'; 1746 1747 /**! 1748 * is 1749 * the definitive JavaScript type testing library 1750 * 1751 * @copyright 2013-2014 Enrico Marino / Jordan Harband 1752 * @license MIT 1753 */ 1754 1755 var objProto = Object.prototype; 1756 var owns = objProto.hasOwnProperty; 1757 var toStr = objProto.toString; 1758 var symbolValueOf; 1759 if (typeof Symbol === 'function') { 1760 symbolValueOf = Symbol.prototype.valueOf; 1761 } 1762 var isActualNaN = function (value) { 1763 return value !== value; 1764 }; 1765 var NON_HOST_TYPES = { 1766 'boolean': 1, 1767 number: 1, 1768 string: 1, 1769 undefined: 1 1770 }; 1771 1772 var base64Regex = /^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$/; 1773 var hexRegex = /^[A-Fa-f0-9]+$/; 1774 1775 /** 1776 * Expose `is` 1777 */ 1778 1779 var is = {}; 1780 1781 /** 1782 * Test general. 1783 */ 1784 1785 /** 1786 * is.type 1787 * Test if `value` is a type of `type`. 1788 * 1789 * @param {Mixed} value value to test 1790 * @param {String} type type 1791 * @return {Boolean} true if `value` is a type of `type`, false otherwise 1792 * @api public 1793 */ 1794 1795 is.a = is.type = function (value, type) { 1796 return typeof value === type; 1797 }; 1798 1799 /** 1800 * is.defined 1801 * Test if `value` is defined. 1802 * 1803 * @param {Mixed} value value to test 1804 * @return {Boolean} true if 'value' is defined, false otherwise 1805 * @api public 1806 */ 1807 1808 is.defined = function (value) { 1809 return typeof value !== 'undefined'; 1810 }; 1811 1812 /** 1813 * is.empty 1814 * Test if `value` is empty. 1815 * 1816 * @param {Mixed} value value to test 1817 * @return {Boolean} true if `value` is empty, false otherwise 1818 * @api public 1819 */ 1820 1821 is.empty = function (value) { 1822 var type = toStr.call(value); 1823 var key; 1824 1825 if (type === '[object Array]' || type === '[object Arguments]' || type === '[object String]') { 1826 return value.length === 0; 1827 } 1828 1829 if (type === '[object Object]') { 1830 for (key in value) { 1831 if (owns.call(value, key)) { 1832 return false; 1833 } 1834 } 1835 return true; 1836 } 1837 1838 return !value; 1839 }; 1840 1841 /** 1842 * is.equal 1843 * Test if `value` is equal to `other`. 1844 * 1845 * @param {Mixed} value value to test 1846 * @param {Mixed} other value to compare with 1847 * @return {Boolean} true if `value` is equal to `other`, false otherwise 1848 */ 1849 1850 is.equal = function equal(value, other) { 1851 if (value === other) { 1852 return true; 1853 } 1854 1855 var type = toStr.call(value); 1856 var key; 1857 1858 if (type !== toStr.call(other)) { 1859 return false; 1860 } 1861 1862 if (type === '[object Object]') { 1863 for (key in value) { 1864 if (!is.equal(value[key], other[key]) || !(key in other)) { 1865 return false;
1866 } 1867 } 1868 for (key in other) { 1869 if (!is.equal(value[key], other[key]) || !(key in value)) { 1870 return false; 1871 } 1872 } 1873 return true; 1874 } 1875 1876 if (type === '[object Array]') { 1877 key = value.length; 1878 if (key !== other.length) { 1879 return false; 1880 } 1881 while (key--) { 1882 if (!is.equal(value[key], other[key])) { 1883 return false; 1884 } 1885 } 1886 return true; 1887 } 1888 1889 if (type === '[object Function]') { 1890 return value.prototype === other.prototype; 1891 } 1892 1893 if (type === '[object Date]') { 1894 return value.getTime() === other.getTime(); 1895 } 1896 1897 return false; 1898 }; 1899 1900 /** 1901 * is.hosted 1902 * Test if `value` is hosted by `host`. 1903 * 1904 * @param {Mixed} value to test 1905 * @param {Mixed} host host to test with 1906 * @return {Boolean} true if `value` is hosted by `host`, false otherwise 1907 * @api public 1908 */ 1909 1910 is.hosted = function (value, host) { 1911 var type = typeof host[value]; 1912 return type === 'object' ? !!host[value] : !NON_HOST_TYPES[type]; 1913 }; 1914 1915 /** 1916 * is.instance 1917 * Test if `value` is an instance of `constructor`. 1918 * 1919 * @param {Mixed} value value to test 1920 * @return {Boolean} true if `value` is an instance of `constructor` 1921 * @api public 1922 */ 1923 1924 is.instance = is['instanceof'] = function (value, constructor) { 1925 return value instanceof constructor; 1926 }; 1927 1928 /** 1929 * is.nil / is.null 1930 * Test if `value` is null. 1931 * 1932 * @param {Mixed} value value to test 1933 * @return {Boolean} true if `value` is null, false otherwise 1934 * @api public 1935 */ 1936 1937 is.nil = is['null'] = function (value) { 1938 return value === null; 1939 }; 1940 1941 /** 1942 * is.undef / is.undefined 1943 * Test if `value` is undefined. 1944 * 1945 * @param {Mixed} value value to test 1946 * @return {Boolean} true if `value` is undefined, false otherwise 1947 * @api public 1948 */ 1949 1950 is.undef = is.undefined = function (value) { 1951 return typeof value === 'undefined'; 1952 }; 1953 1954 /** 1955 * Test arguments. 1956 */ 1957 1958 /** 1959 * is.args 1960 * Test if `value` is an arguments object. 1961 * 1962 * @param {Mixed} value value to test 1963 * @return {Boolean} true if `value` is an arguments object, false otherwise 1964 * @api public 1965 */ 1966 1967 is.args = is.arguments = function (value) { 1968 var isStandardArguments = toStr.call(value) === '[object Arguments]'; 1969 var isOldArguments = !is.array(value) && is.arraylike(value) && is.object(value) && is.fn(value.callee); 1970 return isStandardArguments || isOldArguments; 1971 }; 1972 1973 /** 1974 * Test array. 1975 */ 1976 1977 /** 1978 * is.array 1979 * Test if 'value' is an array. 1980 * 1981 * @param {Mixed} value value to test 1982 * @return {Boolean} true if `value` is an array, false otherwise 1983 * @api public 1984 */ 1985 1986 is.array = Array.isArray || function (value) { 1987 return toStr.call(value) === '[object Array]'; 1988 }; 1989 1990 /** 1991 * is.arguments.empty 1992 * Test if `value` is an empty arguments object. 1993 * 1994 * @param {Mixed} value value to test 1995 * @return {Boolean} true if `value` is an empty arguments object, false otherwise 1996 * @api public 1997 */ 1998 is.args.empty = function (value) { 1999 return is.args(value) && value.length === 0; 2000 }; 2001 2002 /** 2003 * is.array.empty 2004 * Test if `value` is an empty array. 2005 * 2006 * @param {Mixed} value value to test 2007 * @return {Boolean} true if `value` is an empty array, false otherwise 2008 * @api public 2009 */ 2010 is.array.empty = function (value) { 2011 return is.array(value) && value.length === 0; 2012 }; 2013 2014 /** 2015 * is.arraylike 2016 * Test if `value` is an arraylike object. 2017 * 2018 * @param {Mixed} value value to test 2019 * @return {Boolean} true if `value` is an arguments object, false otherwise 2020 * @api public 2021 */ 2022 2023 is.arraylike = function (value) { 2024 return !!value && !is.bool(value) 2025 && owns.call(value, 'length') 2026 && isFinite(value.length) 2027 && is.number(value.length) 2028 && value.length >= 0; 2029 }; 2030 2031 /** 2032 * Test boolean. 2033 */ 2034 2035 /** 2036 * is.bool 2037 * Test if `value` is a boolean. 2038 * 2039 * @param {Mixed} value value to test 2040 * @return {Boolean} true if `value` is a boolean, false otherwise 2041 * @api public 2042 */ 2043 2044 is.bool = is['boolean'] = function (value) { 2045 return toStr.call(value) === '[object Boolean]'; 2046 }; 2047 2048 /** 2049 * is.false 2050 * Test if `value` is false. 2051 * 2052 * @param {Mixed} value value to test 2053 * @return {Boolean} true if `value` is false, false otherwise 2054 * @api public 2055 */ 2056 2057 is['false'] = function (value) { 2058 return is.bool(value) && Boolean(Number(value)) === false; 2059 }; 2060 2061 /** 2062 * is.true 2063 * Test if `value` is true. 2064 * 2065 * @param {Mixed} value value to test 2066 * @return {Boolean} true if `value` is true, false otherwise 2067 * @api public 2068 */ 2069 2070 is['true'] = function (value) { 2071 return is.bool(value) && Boolean(Number(value)) === true; 2072 }; 2073 2074 /** 2075 * Test date. 2076 */ 2077 2078 /** 2079 * is.date 2080 * Test if `value` is a date. 2081 * 2082 * @param {Mixed} value value to test 2083 * @return {Boolean} true if `value` is a date, false otherwise 2084 * @api public 2085 */ 2086 2087 is.date = function (value) { 2088 return toStr.call(value) === '[object Date]'; 2089 }; 2090 2091 /** 2092 * is.date.valid 2093 * Test if `value` is a valid date. 2094 * 2095 * @param {Mixed} value value to test 2096 * @returns {Boolean} true if `value` is a valid date, false otherwise 2097 */ 2098 is.date.valid = function (value) { 2099 return is.date(value) && !isNaN(Number(value)); 2100 }; 2101 2102 /** 2103 * Test element. 2104 */ 2105 2106 /** 2107 * is.element 2108 * Test if `value` is an html element. 2109 * 2110 * @param {Mixed} value value to test 2111 * @return {Boolean} true if `value` is an HTML Element, false otherwise 2112 * @api public 2113 */ 2114 2115 is.element = function (value) { 2116 return value !== undefined 2117 && typeof HTMLElement !== 'undefined' 2118 && value instanceof HTMLElement 2119 && value.nodeType === 1; 2120 }; 2121 2122 /** 2123 * Test error. 2124 */ 2125 2126 /** 2127 * is.error 2128 * Test if `value` is an error object. 2129 * 2130 * @param {Mixed} value value to test 2131 * @return {Boolean} true if `value` is an error object, false otherwise 2132 * @api public 2133 */ 2134 2135 is.error = function (value) { 2136 return toStr.call(value) === '[object Error]'; 2137 }; 2138 2139 /** 2140 * Test function. 2141 */ 2142 2143 /** 2144 * is.fn / is.function (deprecated) 2145 * Test if `value` is a function. 2146 * 2147 * @param {Mixed} value value to test 2148 * @return {Boolean} true if `value` is a function, false otherwise 2149 * @api public 2150 */ 2151 2152 is.fn = is['function'] = function (value) { 2153 var isAlert = typeof window !== 'undefined' && value === window.alert; 2154 if (isAlert) { 2155 return true; 2156 } 2157 var str = toStr.call(value); 2158 return str === '[object Function]' || str === '[object GeneratorFunction]' || str === '[object AsyncFunction]'; 2159 }; 2160 2161 /** 2162 * Test number. 2163 */ 2164 2165 /** 2166 * is.number 2167 * Test if `value` is a number. 2168 * 2169 * @param {Mixed} value value to test 2170 * @return {Boolean} true if `value` is a number, false otherwise 2171 * @api public 2172 */ 2173 2174 is.number = function (value) { 2175 return toStr.call(value) === '[object Number]'; 2176 }; 2177 2178 /** 2179 * is.infinite 2180 * Test if `value` is positive or negative infinity. 2181 * 2182 * @param {Mixed} value value to test 2183 * @return {Boolean} true if `value` is positive or negative Infinity, false otherwise 2184 * @api public 2185 */ 2186 is.infinite = function (value) { 2187 return value === Infinity || value === -Infinity; 2188 }; 2189 2190 /** 2191 * is.decimal 2192 * Test if `value` is a decimal number. 2193 * 2194 * @param {Mixed} value value to test 2195 * @return {Boolean} true if `value` is a decimal number, false otherwise 2196 * @api public 2197 */ 2198 2199 is.decimal = function (value) { 2200 return is.number(value) && !isActualNaN(value) && !is.infinite(value) && value % 1 !== 0; 2201 }; 2202 2203 /** 2204 * is.divisibleBy 2205 * Test if `value` is divisible by `n`. 2206 * 2207 * @param {Number} value value to test 2208 * @param {Number} n dividend 2209 * @return {Boolean} true if `value` is divisible by `n`, false otherwise 2210 * @api public 2211 */ 2212 2213 is.divisibleBy = function (value, n) { 2214 var isDividendInfinite = is.infinite(value); 2215 var isDivisorInfinite = is.infinite(n); 2216 var isNonZeroNumber = is.number(value) && !isActualNaN(value) && is.number(n) && !isActualNaN(n) && n !== 0; 2217 return isDividendInfinite || isDivisorInfinite || (isNonZeroNumber && value % n === 0); 2218 }; 2219 2220 /** 2221 * is.integer 2222 * Test if `value` is an integer. 2223 * 2224 * @param value to test 2225 * @return {Boolean} true if `value` is an integer, false otherwise 2226 * @api public 2227 */ 2228 2229 is.integer = is['int'] = function (value) { 2230 return is.number(value) && !isActualNaN(value) && value % 1 === 0; 2231 }; 2232 2233 /** 2234 * is.maximum 2235 * Test if `value` is greater than 'others' values. 2236 * 2237 * @param {Number} value value to test 2238 * @param {Array} others values to compare with 2239 * @return {Boolean} true if `value` is greater than `others` values 2240 * @api public 2241 */ 2242 2243 is.maximum = function (value, others) { 2244 if (isActualNaN(value)) { 2245 throw new TypeError('NaN is not a valid value'); 2246 } else if (!is.arraylike(others)) { 2247 throw new TypeError('second argument must be array-like'); 2248 } 2249 var len = others.length; 2250 2251 while (--len >= 0) { 2252 if (value < others[len]) { 2253 return false;
2254 } 2255 } 2256 2257 return true; 2258 }; 2259 2260 /** 2261 * is.minimum 2262 * Test if `value` is less than `others` values. 2263 * 2264 * @param {Number} value value to test 2265 * @param {Array} others values to compare with 2266 * @return {Boolean} true if `value` is less than `others` values 2267 * @api public 2268 */ 2269 2270 is.minimum = function (value, others) { 2271 if (isActualNaN(value)) { 2272 throw new TypeError('NaN is not a valid value'); 2273 } else if (!is.arraylike(others)) { 2274 throw new TypeError('second argument must be array-like'); 2275 } 2276 var len = others.length; 2277 2278 while (--len >= 0) { 2279 if (value > others[len]) { 2280 return false; 2281 } 2282 } 2283 2284 return true; 2285 }; 2286 2287 /** 2288 * is.nan 2289 * Test if `value` is not a number. 2290 * 2291 * @param {Mixed} value value to test 2292 * @return {Boolean} true if `value` is not a number, false otherwise 2293 * @api public 2294 */ 2295 2296 is.nan = function (value) { 2297 return !is.number(value) || value !== value; 2298 }; 2299 2300 /** 2301 * is.even 2302 * Test if `value` is an even number. 2303 * 2304 * @param {Number} value value to test 2305 * @return {Boolean} true if `value` is an even number, false otherwise 2306 * @api public 2307 */ 2308 2309 is.even = function (value) { 2310 return is.infinite(value) || (is.number(value) && value === value && value % 2 === 0); 2311 }; 2312 2313 /** 2314 * is.odd 2315 * Test if `value` is an odd number. 2316 * 2317 * @param {Number} value value to test 2318 * @return {Boolean} true if `value` is an odd number, false otherwise 2319 * @api public 2320 */ 2321 2322 is.odd = function (value) { 2323 return is.infinite(value) || (is.number(value) && value === value && value % 2 !== 0); 2324 }; 2325 2326 /** 2327 * is.ge 2328 * Test if `value` is greater than or equal to `other`. 2329 * 2330 * @param {Number} value value to test 2331 * @param {Number} other value to compare with 2332 * @return {Boolean} 2333 * @api public 2334 */ 2335 2336 is.ge = function (value, other) { 2337 if (isActualNaN(value) || isActualNaN(other)) { 2338 throw new TypeError('NaN is not a valid value'); 2339 } 2340 return !is.infinite(value) && !is.infinite(other) && value >= other; 2341 }; 2342 2343 /** 2344 * is.gt 2345 * Test if `value` is greater than `other`. 2346 * 2347 * @param {Number} value value to test 2348 * @param {Number} other value to compare with 2349 * @return {Boolean} 2350 * @api public 2351 */ 2352 2353 is.gt = function (value, other) { 2354 if (isActualNaN(value) || isActualNaN(other)) { 2355 throw new TypeError('NaN is not a valid value'); 2356 } 2357 return !is.infinite(value) && !is.infinite(other) && value > other; 2358 }; 2359 2360 /** 2361 * is.le 2362 * Test if `value` is less than or equal to `other`. 2363 * 2364 * @param {Number} value value to test 2365 * @param {Number} other value to compare with 2366 * @return {Boolean} if 'value' is less than or equal to 'other' 2367 * @api public 2368 */ 2369 2370 is.le = function (value, other) { 2371 if (isActualNaN(value) || isActualNaN(other)) { 2372 throw new TypeError('NaN is not a valid value'); 2373 } 2374 return !is.infinite(value) && !is.infinite(other) && value <= other; 2375 }; 2376 2377 /** 2378 * is.lt 2379 * Test if `value` is less than `other`. 2380 * 2381 * @param {Number} value value to test 2382 * @param {Number} other value to compare with 2383 * @return {Boolean} if `value` is less than `other` 2384 * @api public 2385 */ 2386 2387 is.lt = function (value, other) { 2388 if (isActualNaN(value) || isActualNaN(other)) { 2389 throw new TypeError('NaN is not a valid value'); 2390 } 2391 return !is.infinite(value) && !is.infinite(other) && value < other; 2392 }; 2393 2394 /** 2395 * is.within 2396 * Test if `value` is within `start` and `finish`. 2397 * 2398 * @param {Number} value value to test 2399 * @param {Number} start lower bound 2400 * @param {Number} finish upper bound 2401 * @return {Boolean} true if 'value' is is within 'start' and 'finish' 2402 * @api public 2403 */ 2404 is.within = function (value, start, finish) { 2405 if (isActualNaN(value) || isActualNaN(start) || isActualNaN(finish)) { 2406 throw new TypeError('NaN is not a valid value'); 2407 } else if (!is.number(value) || !is.number(start) || !is.number(finish)) { 2408 throw new TypeError('all arguments must be numbers'); 2409 } 2410 var isAnyInfinite = is.infinite(value) || is.infinite(start) || is.infinite(finish); 2411 return isAnyInfinite || (value >= start && value <= finish); 2412 }; 2413 2414 /** 2415 * Test object. 2416 */ 2417 2418 /** 2419 * is.object 2420 * Test if `value` is an object. 2421 * 2422 * @param {Mixed} value value to test 2423 * @return {Boolean} true if `value` is an object, false otherwise 2424 * @api public 2425 */ 2426 is.object = function (value) { 2427 return toStr.call(value) === '[object Object]'; 2428 }; 2429 2430 /** 2431 * is.primitive 2432 * Test if `value` is a primitive. 2433 * 2434 * @param {Mixed} value value to test 2435 * @return {Boolean} true if `value` is a primitive, false otherwise 2436 * @api public 2437 */ 2438 is.primitive = function isPrimitive(value) { 2439 if (!value) { 2440 return true; 2441 } 2442 if (typeof value === 'object' || is.object(value) || is.fn(value) || is.array(value)) { 2443 return false;
2444 } 2445 return true; 2446 }; 2447 2448 /** 2449 * is.hash 2450 * Test if `value` is a hash - a plain object literal. 2451 * 2452 * @param {Mixed} value value to test 2453 * @return {Boolean} true if `value` is a hash, false otherwise 2454 * @api public 2455 */ 2456 2457 is.hash = function (value) { 2458 return is.object(value) && value.constructor === Object && !value.nodeType && !value.setInterval; 2459 }; 2460 2461 /** 2462 * Test regexp. 2463 */ 2464 2465 /** 2466 * is.regexp 2467 * Test if `value` is a regular expression. 2468 * 2469 * @param {Mixed} value value to test 2470 * @return {Boolean} true if `value` is a regexp, false otherwise 2471 * @api public 2472 */ 2473 2474 is.regexp = function (value) { 2475 return toStr.call(value) === '[object RegExp]'; 2476 }; 2477 2478 /** 2479 * Test string. 2480 */ 2481 2482 /** 2483 * is.string 2484 * Test if `value` is a string. 2485 * 2486 * @param {Mixed} value value to test 2487 * @return {Boolean} true if 'value' is a string, false otherwise 2488 * @api public 2489 */ 2490 2491 is.string = function (value) { 2492 return toStr.call(value) === '[object String]'; 2493 }; 2494 2495 /** 2496 * Test base64 string. 2497 */ 2498 2499 /** 2500 * is.base64 2501 * Test if `value` is a valid base64 encoded string. 2502 * 2503 * @param {Mixed} value value to test 2504 * @return {Boolean} true if 'value' is a base64 encoded string, false otherwise 2505 * @api public 2506 */ 2507 2508 is.base64 = function (value) { 2509 return is.string(value) && (!value.length || base64Regex.test(value)); 2510 }; 2511 2512 /** 2513 * Test base64 string. 2514 */ 2515 2516 /** 2517 * is.hex 2518 * Test if `value` is a valid hex encoded string. 2519 * 2520 * @param {Mixed} value value to test 2521 * @return {Boolean} true if 'value' is a hex encoded string, false otherwise 2522 * @api public 2523 */ 2524 2525 is.hex = function (value) { 2526 return is.string(value) && (!value.length || hexRegex.test(value)); 2527 }; 2528 2529 /** 2530 * is.symbol 2531 * Test if `value` is an ES6 Symbol 2532 * 2533 * @param {Mixed} value value to test 2534 * @return {Boolean} true if `value` is a Symbol, false otherise 2535 * @api public 2536 */ 2537 2538 is.symbol = function (value) { 2539 return typeof Symbol === 'function' && toStr.call(value) === '[object Symbol]' && typeof symbolValueOf.call(value) === 'symbol'; 2540 }; 2541 2542 module.exports = is; 2543 2544 2545 /***/ }) 2546 /******/ ]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.