caboose-cms 0.8.43 → 0.8.44

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