camaleon_ecommerce 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +37 -0
- data/app/assets/javascripts/plugins/ecommerce/admin.js +33 -0
- data/app/assets/javascripts/plugins/ecommerce/cart.js +207 -0
- data/app/assets/javascripts/plugins/ecommerce/fix_form.js +10 -0
- data/app/assets/javascripts/plugins/ecommerce/jquery.creditCardValidator.js +208 -0
- data/app/assets/stylesheets/plugins/ecommerce/admin.scss +122 -0
- data/app/assets/stylesheets/plugins/ecommerce/front.scss +36 -0
- data/app/controllers/plugins/ecommerce/admin/coupons_controller.rb +61 -0
- data/app/controllers/plugins/ecommerce/admin/orders_controller.rb +96 -0
- data/app/controllers/plugins/ecommerce/admin/payment_methods_controller.rb +90 -0
- data/app/controllers/plugins/ecommerce/admin/prices_controller.rb +70 -0
- data/app/controllers/plugins/ecommerce/admin/settings_controller.rb +22 -0
- data/app/controllers/plugins/ecommerce/admin/shipping_methods_controller.rb +62 -0
- data/app/controllers/plugins/ecommerce/admin/tax_rates_controller.rb +61 -0
- data/app/controllers/plugins/ecommerce/admin_controller.rb +20 -0
- data/app/controllers/plugins/ecommerce/front/checkout_controller.rb +166 -0
- data/app/controllers/plugins/ecommerce/front/orders_controller.rb +255 -0
- data/app/controllers/plugins/ecommerce/front_controller.rb +18 -0
- data/app/helpers/plugins/ecommerce/ecommerce_email_helper.rb +46 -0
- data/app/helpers/plugins/ecommerce/ecommerce_functions_helper.rb +49 -0
- data/app/helpers/plugins/ecommerce/ecommerce_helper.rb +240 -0
- data/app/helpers/plugins/ecommerce/ecommerce_payment_helper.rb +67 -0
- data/app/models/plugins/ecommerce/cart.rb +40 -0
- data/app/models/plugins/ecommerce/coupon.rb +25 -0
- data/app/models/plugins/ecommerce/coupon_decorator.rb +60 -0
- data/app/models/plugins/ecommerce/order.rb +65 -0
- data/app/models/plugins/ecommerce/order_decorator.rb +54 -0
- data/app/models/plugins/ecommerce/order_detail.rb +13 -0
- data/app/models/plugins/ecommerce/payment_method.rb +29 -0
- data/app/models/plugins/ecommerce/product.rb +14 -0
- data/app/models/plugins/ecommerce/shipping_method.rb +26 -0
- data/app/models/plugins/ecommerce/tax_rate.rb +18 -0
- data/app/views/camaleon_cms/html_mailer/order_received.html.erb +3 -0
- data/app/views/camaleon_cms/html_mailer/order_received_admin.html.erb +3 -0
- data/app/views/camaleon_cms/html_mailer/recovery_cart.html.erb +4 -0
- data/app/views/layouts/plugins/ecommerce/mailer.html.erb +22 -0
- data/app/views/plugins/ecommerce/admin/coupons/form.html.erb +73 -0
- data/app/views/plugins/ecommerce/admin/coupons/index.html.erb +50 -0
- data/app/views/plugins/ecommerce/admin/index.html.erb +2 -0
- data/app/views/plugins/ecommerce/admin/orders/form.html.erb +64 -0
- data/app/views/plugins/ecommerce/admin/orders/index.html.erb +90 -0
- data/app/views/plugins/ecommerce/admin/orders/show.html.erb +173 -0
- data/app/views/plugins/ecommerce/admin/payment_methods/form.html.erb +115 -0
- data/app/views/plugins/ecommerce/admin/payment_methods/index.html.erb +43 -0
- data/app/views/plugins/ecommerce/admin/payment_methods/show.html.erb +70 -0
- data/app/views/plugins/ecommerce/admin/prices/form.html.erb +49 -0
- data/app/views/plugins/ecommerce/admin/prices/index.html.erb +39 -0
- data/app/views/plugins/ecommerce/admin/prices/show.html.erb +19 -0
- data/app/views/plugins/ecommerce/admin/products/index.html.erb +114 -0
- data/app/views/plugins/ecommerce/admin/settings/index.html.erb +25 -0
- data/app/views/plugins/ecommerce/admin/shipping_methods/form.html.erb +39 -0
- data/app/views/plugins/ecommerce/admin/shipping_methods/index.html.erb +41 -0
- data/app/views/plugins/ecommerce/admin/shipping_methods/show.html.erb +22 -0
- data/app/views/plugins/ecommerce/admin/tax_rates/form.html.erb +36 -0
- data/app/views/plugins/ecommerce/admin/tax_rates/index.html.erb +41 -0
- data/app/views/plugins/ecommerce/front/_post_list_item.html.erb +18 -0
- data/app/views/plugins/ecommerce/front/checkout/cart_index.html.erb +59 -0
- data/app/views/plugins/ecommerce/front/checkout/index.html.erb +166 -0
- data/app/views/plugins/ecommerce/front/index.html.erb +2 -0
- data/app/views/plugins/ecommerce/front/list_products.html.erb +34 -0
- data/app/views/plugins/ecommerce/front/orders/index.html.erb +46 -0
- data/app/views/plugins/ecommerce/front/orders/pay_by_bank_transfer.html.erb +67 -0
- data/app/views/plugins/ecommerce/front/orders/pay_by_credit_card.html.erb +131 -0
- data/app/views/plugins/ecommerce/front/orders/pay_by_credit_card_authorize_net.erb +150 -0
- data/app/views/plugins/ecommerce/front/orders/select_payment.html.erb +70 -0
- data/app/views/plugins/ecommerce/front/orders/show.html.erb +76 -0
- data/app/views/plugins/ecommerce/front/product.html.erb +105 -0
- data/app/views/plugins/ecommerce/layouts/_ecommerce.html.erb +41 -0
- data/app/views/plugins/ecommerce/partials/_form_address.html.erb +84 -0
- data/app/views/plugins/ecommerce/partials/_table_order_products.html.erb +85 -0
- data/config/camaleon_plugin.json +48 -0
- data/config/currency.json +154 -0
- data/config/currency_en.json +154 -0
- data/config/currency_es.json +154 -0
- data/config/custom_models.rb +64 -0
- data/config/locales/readme.txt +1 -0
- data/config/locales/translation.yml +371 -0
- data/config/routes.rb +57 -0
- data/lib/camaleon_ecommerce.rb +4 -0
- data/lib/ecommerce.rb +4 -0
- data/lib/ecommerce/engine.rb +6 -0
- data/lib/ecommerce/version.rb +3 -0
- data/lib/tasks/ecommerce_tasks.rake +4 -0
- metadata +185 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c14d3d8eaab3ba498a24093c9335126ecd5c77e3
|
4
|
+
data.tar.gz: 09308d694b0989d78edab11a4a731c0af1f2901c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 094b55b0b27af000cf5c8e73dfee3423d78bedba057570a4b26e1261496ac3b7e393d6838afab20e70eb1794c89a2756820fba12a4e96886816d2dace187ac11
|
7
|
+
data.tar.gz: e5acc4616ff7beb1ec8dfd59b1eb5510aa040d197a6583bd2fb8927db01151d7892e732cf1da1d5bebae38e0c2832c536139b2246f432afce546faa6820c4b5c
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2015 Owen
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Ecommerce'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load 'rails/tasks/engine.rake'
|
19
|
+
|
20
|
+
|
21
|
+
load 'rails/tasks/statistics.rake'
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
Bundler::GemHelper.install_tasks
|
26
|
+
|
27
|
+
require 'rake/testtask'
|
28
|
+
|
29
|
+
Rake::TestTask.new(:test) do |t|
|
30
|
+
t.libs << 'lib'
|
31
|
+
t.libs << 'test'
|
32
|
+
t.pattern = 'test/**/*_test.rb'
|
33
|
+
t.verbose = false
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
task default: :test
|
@@ -0,0 +1,33 @@
|
|
1
|
+
jQuery(function(){
|
2
|
+
if($.fn.datepicker)$('#options_expirate_date').datepicker({
|
3
|
+
format: 'yyyy-mm-dd'
|
4
|
+
})
|
5
|
+
|
6
|
+
|
7
|
+
if($('#tab-select-payment-method > ul a').size() > 0)
|
8
|
+
{
|
9
|
+
$('#tab-select-payment-method > ul a').click(function (e) {
|
10
|
+
e.preventDefault()
|
11
|
+
disabled_inputs(this)
|
12
|
+
//$(this).tab('show')
|
13
|
+
})
|
14
|
+
|
15
|
+
function disabled_inputs(dom_a){
|
16
|
+
var attr_id = $(dom_a).attr('href')
|
17
|
+
$('#tab-select-payment-method .tab-content .tab-pane').find('input, select, textarea').attr('disabled', 'disabled');
|
18
|
+
$(attr_id).find('input, select, textarea').removeAttr('disabled');
|
19
|
+
}
|
20
|
+
disabled_inputs($('#tab-select-payment-method > ul li.active a')[0])
|
21
|
+
}
|
22
|
+
|
23
|
+
$('.box-adv-search').each(function(){
|
24
|
+
var cont = $(this);
|
25
|
+
var rnd = "input_"+Math.floor((Math.random() * 1000000) + 1);
|
26
|
+
cont.find('#adv-search > input').change(function(){
|
27
|
+
cont.find('form .' + rnd).val($(this).val());
|
28
|
+
}).clone().attr('type','hidden').addClass(rnd).appendTo(cont.find('form'));
|
29
|
+
cont.find('#adv-search .btn-group > button').click(function(){
|
30
|
+
cont.find('form').submit();
|
31
|
+
});
|
32
|
+
})
|
33
|
+
})
|
@@ -0,0 +1,207 @@
|
|
1
|
+
jQuery(function(){
|
2
|
+
if($('#table-shopping-cart td .text-qty').size() > 0)
|
3
|
+
{
|
4
|
+
$('#table-shopping-cart td .text-qty').change(function(){
|
5
|
+
if ($(this).val() < 1) return false;
|
6
|
+
var total = $('#table-shopping-cart tbody tr').map(function(){
|
7
|
+
var $tr = $(this);
|
8
|
+
var price = parseFloat($tr.find('td[data-price]').attr('data-price'));
|
9
|
+
var tax = parseFloat($tr.find('td[data-tax]').attr('data-tax'));
|
10
|
+
var qty = parseFloat($tr.find('td[data-qty] input.text-qty').val());
|
11
|
+
if(qty < 0) qty = 0;
|
12
|
+
var subtotal = (price + tax) * qty;
|
13
|
+
$tr.find('td[data-subtotal]').html('$'+subtotal.toFixed(2))
|
14
|
+
return subtotal;
|
15
|
+
}).get().reduce(function(a, b) { return a + b; }, 0);
|
16
|
+
|
17
|
+
$('#table-shopping-cart #total').html('$'+total.toFixed(2))
|
18
|
+
})
|
19
|
+
}
|
20
|
+
$('#checkout #ec_copy').click(function(){
|
21
|
+
$('#checkout #shipping_address').find('input, select, textarea').each(function(){
|
22
|
+
var id_from = $(this).attr('id').replace('shipping', 'billing');
|
23
|
+
$(this).val($('#billing_address #'+id_from).val())
|
24
|
+
})
|
25
|
+
return false;
|
26
|
+
});
|
27
|
+
|
28
|
+
if($('#e-payments-types > ul a').size() > 0)
|
29
|
+
{
|
30
|
+
$('#e-payments-types > ul a').click(function (e) {
|
31
|
+
e.preventDefault()
|
32
|
+
disabled_inputs(this)
|
33
|
+
//$(this).tab('show')
|
34
|
+
})
|
35
|
+
|
36
|
+
function disabled_inputs(dom_a){
|
37
|
+
var attr_id = $(dom_a).attr('href')
|
38
|
+
$('#e-payments-types .tab-content .tab-pane').find('input, select, textarea').attr('disabled', 'disabled');
|
39
|
+
$(attr_id).find('input, select, textarea').removeAttr('disabled');
|
40
|
+
}
|
41
|
+
disabled_inputs($('#e-payments-types > ul a')[0])
|
42
|
+
}
|
43
|
+
|
44
|
+
function set_total_amount(){
|
45
|
+
var value = parseFloat($('#checkout #shipping_methods option:checked').attr('data-price'));
|
46
|
+
var pre_total = parseFloat($('#checkout #order_total').attr('data-total'));
|
47
|
+
var dis = $('#checkout #coupon_application_total').attr('data-amount');
|
48
|
+
$('#checkout #shipping_total span').html(value.toFixed(2));
|
49
|
+
if(dis == 'free')
|
50
|
+
{
|
51
|
+
$('#checkout #order_total span').html(0);
|
52
|
+
$('#shipping_total').parent().hide()
|
53
|
+
}else{
|
54
|
+
$('#shipping_total').parent().show()
|
55
|
+
var total_final = (value + pre_total - parseFloat(dis)).toFixed(2);
|
56
|
+
$('#checkout #order_total span').html(total_final);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
$('#checkout #shipping_methods').change(function(){
|
61
|
+
set_total_amount()
|
62
|
+
});
|
63
|
+
|
64
|
+
$('#checkout #e_coupon_apply_box button').click(function(){
|
65
|
+
var href = $('#e_coupon_apply_box').attr('data-href');
|
66
|
+
var token = $('#e_coupon_apply_box').attr('data-token');
|
67
|
+
var code = $('#e_coupon_apply_box .coupon-text').val();
|
68
|
+
$.post(href, {code: code, authenticity_token: token}, function(res){
|
69
|
+
if(res.error){
|
70
|
+
alert(res.error)
|
71
|
+
}else{
|
72
|
+
|
73
|
+
var text = res.data.text;
|
74
|
+
var discount_type = res.data.options.discount_type;
|
75
|
+
var amount = 0;
|
76
|
+
var pre_total = parseFloat($('#checkout #order_total').attr('data-total'));
|
77
|
+
if(discount_type == 'free_ship'){
|
78
|
+
amount = 'free';
|
79
|
+
}else if(discount_type == 'percent'){
|
80
|
+
amount = (parseFloat(res.data.options.amount) * pre_total / 100).toFixed(2);
|
81
|
+
text += ' ('+ res.data.current_unit +' '+ amount +')';
|
82
|
+
}else if(discount_type == 'money'){
|
83
|
+
amount = res.data.options.amount;
|
84
|
+
}
|
85
|
+
$('#checkout #coupon_application_total').attr('data-amount', amount);
|
86
|
+
$('#checkout #coupon_application_row').show().find('#coupon_application_total span').html(text)
|
87
|
+
$('#checkout #coupon_code').val(res.data.code)
|
88
|
+
$('#checkout #coupon_options').val(JSON.stringify(res.data.options))
|
89
|
+
set_total_amount()
|
90
|
+
}
|
91
|
+
}, 'json')
|
92
|
+
});
|
93
|
+
|
94
|
+
|
95
|
+
// pay by credit card
|
96
|
+
var card_valid = false;
|
97
|
+
var $form = $('#payment-form');
|
98
|
+
if($form.size() > 0){
|
99
|
+
/* If you're using Stripe for payments */
|
100
|
+
function payWithStripe(e) {
|
101
|
+
// e.preventDefault();
|
102
|
+
|
103
|
+
/* Visual feedback */
|
104
|
+
$form.find('[type=submit]').html('Validating <i class="fa fa-spinner fa-pulse"></i>');
|
105
|
+
|
106
|
+
if(!card_valid)
|
107
|
+
{
|
108
|
+
/* Visual feedback */
|
109
|
+
$form.find('[type=submit]').html('Try again');
|
110
|
+
/* Show Stripe errors on the form */
|
111
|
+
$form.find('.payment-errors').text("Credit Card Invalid");
|
112
|
+
$form.find('.payment-errors').closest('.row').show();
|
113
|
+
return false
|
114
|
+
}else{
|
115
|
+
if($form.valid()){
|
116
|
+
/* Visual feedback */
|
117
|
+
$form.find('[type=submit]').html('Processing <i class="fa fa-spinner fa-pulse"></i>');
|
118
|
+
/* Hide Stripe errors on the form */
|
119
|
+
$form.find('.payment-errors').closest('.row').hide();
|
120
|
+
$form.find('.payment-errors').text("");
|
121
|
+
}else{
|
122
|
+
return false;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
$form.on('submit', payWithStripe);
|
128
|
+
$form.find('input[name="cardNumber"]').validateCreditCard(function(result) {
|
129
|
+
card_valid = result.valid;
|
130
|
+
// $('#credit_card_log').html('Card type: ' + (result.card_type == null ? '-' : result.card_type.name) + (result.valid ? '<span class="label label-success">Valid</span>' : '<span class="label label-danger">Not Valid</span>'))
|
131
|
+
});
|
132
|
+
|
133
|
+
/* Form validation */
|
134
|
+
jQuery.validator.addMethod("month", function(value, element) {
|
135
|
+
return this.optional(element) || /^(01|02|03|04|05|06|07|08|09|10|11|12)$/.test(value);
|
136
|
+
}, "Please specify a valid 2-digit month.");
|
137
|
+
|
138
|
+
jQuery.validator.addMethod("year", function(value, element) {
|
139
|
+
return this.optional(element) || /^[0-9]{2}$/.test(value);
|
140
|
+
}, "Please specify a valid 2-digit year.");
|
141
|
+
|
142
|
+
validator = $form.validate({
|
143
|
+
rules: {
|
144
|
+
cardNumber: {
|
145
|
+
required: true,
|
146
|
+
creditcard: true,
|
147
|
+
digits: true
|
148
|
+
},
|
149
|
+
expMonth: {
|
150
|
+
required: true,
|
151
|
+
month: true
|
152
|
+
},
|
153
|
+
expYear: {
|
154
|
+
required: true,
|
155
|
+
year: true
|
156
|
+
},
|
157
|
+
cvCode: {
|
158
|
+
required: true,
|
159
|
+
digits: true
|
160
|
+
}
|
161
|
+
},
|
162
|
+
highlight: function(element) {
|
163
|
+
$(element).closest('.form-control').removeClass('success').addClass('error');
|
164
|
+
},
|
165
|
+
unhighlight: function(element) {
|
166
|
+
$(element).closest('.form-control').removeClass('error').addClass('success');
|
167
|
+
},
|
168
|
+
errorPlacement: function(error, element) {
|
169
|
+
$(element).closest('.form-group').append(error);
|
170
|
+
}
|
171
|
+
});
|
172
|
+
|
173
|
+
paymentFormReady = function() {
|
174
|
+
if ($form.find('[name=cardNumber]').hasClass("success") &&
|
175
|
+
$form.find('[name=expMonth]').hasClass("success") &&
|
176
|
+
$form.find('[name=expYear]').hasClass("success") &&
|
177
|
+
$form.find('[name=cvCode]').val().length > 1) {
|
178
|
+
return true;
|
179
|
+
} else {
|
180
|
+
return false;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
$form.find('[type=submit]').prop('disabled', true);
|
185
|
+
var readyInterval = setInterval(function() {
|
186
|
+
if (paymentFormReady()) {
|
187
|
+
$form.find('[type=submit]').prop('disabled', false);
|
188
|
+
clearInterval(readyInterval);
|
189
|
+
}
|
190
|
+
}, 250);
|
191
|
+
}
|
192
|
+
|
193
|
+
if($.fn.validate){
|
194
|
+
$('.form-validate-ec').validate();
|
195
|
+
}
|
196
|
+
|
197
|
+
})
|
198
|
+
function log(d){
|
199
|
+
console.log(d)
|
200
|
+
}
|
201
|
+
|
202
|
+
/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
|
203
|
+
* http://jqueryvalidation.org/
|
204
|
+
* Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
|
205
|
+
!function(a){"function"==typeof define&&define.amd?define(["jquery.creditCardValidator.js"],a):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.settings.submitHandler?(c.submitButton&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),e=c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),void 0!==e?e:!1):!0}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,d=d.concat(c.errorList)}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){return!!a.trim(""+a(b).val())},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||-1!==a.inArray(c.keyCode,d)||(b.name in this.submitted||b===this.lastElement)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date ( ISO ).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=a.data(this.form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!a(this).is(e.ignore)&&e[d].call(c,this,b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c=this.clean(b),d=this.validationTargetFor(c),e=!0;return this.lastElement=d,void 0===d?delete this.invalid[c.name]:(this.prepareElement(d),this.currentElements=a(d),e=this.check(d)!==!1,e?delete this.invalid[d.name]:this.invalid[d.name]=!0),a(b).attr("aria-invalid",!e),this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),e},showErrors:function(b){if(b){a.extend(this.errorMap,b),this.errorList=[];for(var c in b)this.errorList.push({message:b[c],element:this.findByName(c)[0]});this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors();var b,c=this.elements().removeData("previousValue").removeAttr("aria-invalid");if(this.settings.unhighlight)for(b=0;c[b];b++)this.settings.unhighlight.call(this,c[b],this.settings.errorClass,"");else c.removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){return!this.name&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in c||!b.objectLength(a(this).rules())?!1:(c[this.name]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([]),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d=a(b),e=b.type;return"radio"===e||"checkbox"===e?this.findByName(b.name).filter(":checked").val():"number"===e&&"undefined"!=typeof b.validity?b.validity.badInput?!1:d.val():(c=d.val(),"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(j){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",j),j instanceof TypeError&&(j.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),j}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a];return void 0},defaultMessage:function(b,c){return this.findDefined(this.customMessage(b.name,c),this.customDataMessage(b,c),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c],"<strong>Warning: No message defined for "+b.name+"</strong>")},formatAndAdd:function(b,c){var d=this.defaultMessage(b,c.method),e=/\$?\{(\d+)\}/g;"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),this.errorList.push({message:d,element:b,method:c.method}),this.errorMap[b.name]=d,this.submitted[b.name]=d},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g=this.errorsFor(b),h=this.idOrName(b),i=a(b).attr("aria-describedby");g.length?(g.removeClass(this.settings.validClass).addClass(this.settings.errorClass),g.html(c)):(g=a("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(c||""),d=g,this.settings.wrapper&&(d=g.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement(d,a(b)):d.insertAfter(b),g.is("label")?g.attr("for",h):0===g.parents("label[for='"+h+"']").length&&(f=g.attr("id").replace(/(:|\.|\[|\]|\$)/g,"\\$1"),i?i.match(new RegExp("\\b"+f+"\\b"))||(i+=" "+f):i=f,a(b).attr("aria-describedby",i),e=this.groups[b.name],e&&a.each(this.groups,function(b,c){c===e&&a("[name='"+b+"']",this.currentForm).attr("aria-describedby",g.attr("id"))}))),!c&&this.settings.success&&(g.text(""),"string"==typeof this.settings.success?g.addClass(this.settings.success):this.settings.success(g,b)),this.toShow=this.toShow.add(g)},errorsFor:function(b){var c=this.idOrName(b),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+d.replace(/\s+/g,", #")),this.errors().filter(e)},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+b+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):!0},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(a){this.pending[a.name]||(this.pendingRequest++,this.pending[a.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b){return a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,"remote")})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0!==e.param?e.param:!0:delete b[d]}}),a.each(b,function(d,e){b[d]=a.isFunction(e)?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||d>=e},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||c>=a},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.off(".validate-equalTo").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d){if(this.optional(c))return"dependency-mismatch";var e,f,g=this.previousValue(c);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),g.originalMessage=this.settings.messages[c.name].remote,this.settings.messages[c.name].remote=g.message,d="string"==typeof d&&{url:d}||d,g.old===b?g.valid:(g.old=b,e=this,this.startRequest(c),f={},f[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:f,context:e.currentForm,success:function(d){var f,h,i,j=d===!0||"true"===d;e.settings.messages[c.name].remote=g.originalMessage,j?(i=e.formSubmitted,e.prepareElement(c),e.formSubmitted=i,e.successList.push(c),delete e.invalid[c.name],e.showErrors()):(f={},h=d||e.defaultMessage(c,"remote"),f[c.name]=g.message=a.isFunction(h)?h(b):h,e.invalid[c.name]=!0,e.showErrors(f)),g.valid=j,e.stopRequest(c,j)}},d)),"pending")}}});var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)})});
|
206
|
+
|
207
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
/**
|
2
|
+
* Created by Froilan on 02/09/2015.
|
3
|
+
*/
|
4
|
+
jQuery(function($){
|
5
|
+
$( '#form-post' ).on( "change", '.editor-custom-fields input[name="field_options[ecommerce_weight][values][]"], .editor-custom-fields .input-value.number', function() {
|
6
|
+
setTimeout(function(){
|
7
|
+
$(this).val(Math.abs($(this).val()) || 0);
|
8
|
+
}.bind(this), 60)
|
9
|
+
});
|
10
|
+
});
|
@@ -0,0 +1,208 @@
|
|
1
|
+
// Generated by CoffeeScript 1.8.0
|
2
|
+
|
3
|
+
/*
|
4
|
+
jQuery Credit Card Validator 1.0
|
5
|
+
|
6
|
+
Copyright 2012-2015 Pawel Decowski
|
7
|
+
|
8
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
+
of this software and associated documentation files (the "Software"), to deal
|
10
|
+
in the Software without restriction, including without limitation the rights
|
11
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
+
copies of the Software, and to permit persons to whom the Software
|
13
|
+
is furnished to do so, subject to the following conditions:
|
14
|
+
|
15
|
+
The above copyright notice and this permission notice shall be included
|
16
|
+
in all copies or substantial portions of the Software.
|
17
|
+
|
18
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
19
|
+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
21
|
+
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
24
|
+
IN THE SOFTWARE.
|
25
|
+
*/
|
26
|
+
|
27
|
+
(function() {
|
28
|
+
var $,
|
29
|
+
__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; };
|
30
|
+
|
31
|
+
$ = jQuery;
|
32
|
+
|
33
|
+
$.fn.validateCreditCard = function(callback, options) {
|
34
|
+
var bind, card, card_type, card_types, get_card_type, is_valid_length, is_valid_luhn, normalize, validate, validate_number, _i, _len, _ref;
|
35
|
+
card_types = [
|
36
|
+
{
|
37
|
+
name: 'amex',
|
38
|
+
pattern: /^3[47]/,
|
39
|
+
valid_length: [15]
|
40
|
+
}, {
|
41
|
+
name: 'diners_club_carte_blanche',
|
42
|
+
pattern: /^30[0-5]/,
|
43
|
+
valid_length: [14]
|
44
|
+
}, {
|
45
|
+
name: 'diners_club_international',
|
46
|
+
pattern: /^36/,
|
47
|
+
valid_length: [14]
|
48
|
+
}, {
|
49
|
+
name: 'jcb',
|
50
|
+
pattern: /^35(2[89]|[3-8][0-9])/,
|
51
|
+
valid_length: [16]
|
52
|
+
}, {
|
53
|
+
name: 'laser',
|
54
|
+
pattern: /^(6304|670[69]|6771)/,
|
55
|
+
valid_length: [16, 17, 18, 19]
|
56
|
+
}, {
|
57
|
+
name: 'visa_electron',
|
58
|
+
pattern: /^(4026|417500|4508|4844|491(3|7))/,
|
59
|
+
valid_length: [16]
|
60
|
+
}, {
|
61
|
+
name: 'visa',
|
62
|
+
pattern: /^4/,
|
63
|
+
valid_length: [16]
|
64
|
+
}, {
|
65
|
+
name: 'mastercard',
|
66
|
+
pattern: /^5[1-5]/,
|
67
|
+
valid_length: [16]
|
68
|
+
}, {
|
69
|
+
name: 'maestro',
|
70
|
+
pattern: /^(5018|5020|5038|6304|6759|676[1-3])/,
|
71
|
+
valid_length: [12, 13, 14, 15, 16, 17, 18, 19]
|
72
|
+
}, {
|
73
|
+
name: 'discover',
|
74
|
+
pattern: /^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,
|
75
|
+
valid_length: [16]
|
76
|
+
}
|
77
|
+
];
|
78
|
+
bind = false;
|
79
|
+
if (callback) {
|
80
|
+
if (typeof callback === 'object') {
|
81
|
+
options = callback;
|
82
|
+
bind = false;
|
83
|
+
callback = null;
|
84
|
+
} else if (typeof callback === 'function') {
|
85
|
+
bind = true;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
if (options == null) {
|
89
|
+
options = {};
|
90
|
+
}
|
91
|
+
if (options.accept == null) {
|
92
|
+
options.accept = (function() {
|
93
|
+
var _i, _len, _results;
|
94
|
+
_results = [];
|
95
|
+
for (_i = 0, _len = card_types.length; _i < _len; _i++) {
|
96
|
+
card = card_types[_i];
|
97
|
+
_results.push(card.name);
|
98
|
+
}
|
99
|
+
return _results;
|
100
|
+
})();
|
101
|
+
}
|
102
|
+
_ref = options.accept;
|
103
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
104
|
+
card_type = _ref[_i];
|
105
|
+
if (__indexOf.call((function() {
|
106
|
+
var _j, _len1, _results;
|
107
|
+
_results = [];
|
108
|
+
for (_j = 0, _len1 = card_types.length; _j < _len1; _j++) {
|
109
|
+
card = card_types[_j];
|
110
|
+
_results.push(card.name);
|
111
|
+
}
|
112
|
+
return _results;
|
113
|
+
})(), card_type) < 0) {
|
114
|
+
throw "Credit card type '" + card_type + "' is not supported";
|
115
|
+
}
|
116
|
+
}
|
117
|
+
get_card_type = function(number) {
|
118
|
+
var _j, _len1, _ref1;
|
119
|
+
_ref1 = (function() {
|
120
|
+
var _k, _len1, _ref1, _results;
|
121
|
+
_results = [];
|
122
|
+
for (_k = 0, _len1 = card_types.length; _k < _len1; _k++) {
|
123
|
+
card = card_types[_k];
|
124
|
+
if (_ref1 = card.name, __indexOf.call(options.accept, _ref1) >= 0) {
|
125
|
+
_results.push(card);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
return _results;
|
129
|
+
})();
|
130
|
+
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
131
|
+
card_type = _ref1[_j];
|
132
|
+
if (number.match(card_type.pattern)) {
|
133
|
+
return card_type;
|
134
|
+
}
|
135
|
+
}
|
136
|
+
return null;
|
137
|
+
};
|
138
|
+
is_valid_luhn = function(number) {
|
139
|
+
var digit, n, sum, _j, _len1, _ref1;
|
140
|
+
sum = 0;
|
141
|
+
_ref1 = number.split('').reverse();
|
142
|
+
for (n = _j = 0, _len1 = _ref1.length; _j < _len1; n = ++_j) {
|
143
|
+
digit = _ref1[n];
|
144
|
+
digit = +digit;
|
145
|
+
if (n % 2) {
|
146
|
+
digit *= 2;
|
147
|
+
if (digit < 10) {
|
148
|
+
sum += digit;
|
149
|
+
} else {
|
150
|
+
sum += digit - 9;
|
151
|
+
}
|
152
|
+
} else {
|
153
|
+
sum += digit;
|
154
|
+
}
|
155
|
+
}
|
156
|
+
return sum % 10 === 0;
|
157
|
+
};
|
158
|
+
is_valid_length = function(number, card_type) {
|
159
|
+
var _ref1;
|
160
|
+
return _ref1 = number.length, __indexOf.call(card_type.valid_length, _ref1) >= 0;
|
161
|
+
};
|
162
|
+
validate_number = (function(_this) {
|
163
|
+
return function(number) {
|
164
|
+
var length_valid, luhn_valid;
|
165
|
+
card_type = get_card_type(number);
|
166
|
+
luhn_valid = false;
|
167
|
+
length_valid = false;
|
168
|
+
if (card_type != null) {
|
169
|
+
luhn_valid = is_valid_luhn(number);
|
170
|
+
length_valid = is_valid_length(number, card_type);
|
171
|
+
}
|
172
|
+
return {
|
173
|
+
card_type: card_type,
|
174
|
+
valid: luhn_valid && length_valid,
|
175
|
+
luhn_valid: luhn_valid,
|
176
|
+
length_valid: length_valid
|
177
|
+
};
|
178
|
+
};
|
179
|
+
})(this);
|
180
|
+
validate = (function(_this) {
|
181
|
+
return function() {
|
182
|
+
var number;
|
183
|
+
number = normalize($(_this).val());
|
184
|
+
return validate_number(number);
|
185
|
+
};
|
186
|
+
})(this);
|
187
|
+
normalize = function(number) {
|
188
|
+
return number.replace(/[ -]/g, '');
|
189
|
+
};
|
190
|
+
if (!bind) {
|
191
|
+
return validate();
|
192
|
+
}
|
193
|
+
this.on('input.jccv', (function(_this) {
|
194
|
+
return function() {
|
195
|
+
$(_this).off('keyup.jccv');
|
196
|
+
return callback.call(_this, validate());
|
197
|
+
};
|
198
|
+
})(this));
|
199
|
+
this.on('keyup.jccv', (function(_this) {
|
200
|
+
return function() {
|
201
|
+
return callback.call(_this, validate());
|
202
|
+
};
|
203
|
+
})(this));
|
204
|
+
callback.call(this, validate());
|
205
|
+
return this;
|
206
|
+
};
|
207
|
+
|
208
|
+
}).call(this);
|