Skip to content

Update formatting for jshint. Improve logic readability in validate() #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
265 changes: 135 additions & 130 deletions html/jquery.couponcode.js
Original file line number Diff line number Diff line change
@@ -1,163 +1,168 @@
/*jshint forin:true, noarg:true, noempty:true, eqeqeq:true, bitwise:true, strict:true, undef:true, unused:true, curly:true, browser:true, jquery:true, indent:4, laxbreak:true, maxerr:500 */
/*global alert:true */
/*
* couponCode - jQuery plugin
*
* Copyright (c) 2011 Grant McLean (grant@mclean.net.nz)
* Copyright (c) 2011-2017 Grant McLean (grant@mclean.net.nz)
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/

(function($) {
(function ($) {
'use strict';

var SYMBOL_SET = '0123456789ABCDEFGHJKLMNPQRTUVWXY';
var BAD_SYMBOL = new RegExp('[^' + SYMBOL_SET + ']');
var SYMBOL_SET = '0123456789ABCDEFGHJKLMNPQRTUVWXY';
var BAD_SYMBOL = new RegExp('[^' + SYMBOL_SET + ']');

$.fn.couponCode = function(options) {
return this.each(function() {
$.fn.couponCode.build(this, options);
});
};

$.fn.couponCode.build = function(base_entry, options) {
var self = $.extend({}, $.fn.couponCode.defaults, options);
self.focus = null;
self.inputs = [];
self.flags = [];
self.parts = parseInt(self.parts, 10);
if(isNaN(self.parts) || self.parts < 1 || self.parts > 6) {
alert("CouponCode 'parts' must be in range 1-6");
return;
}
$.fn.couponCode = function (options) {
return this.each(function () {
$.fn.couponCode.build(this, options);
});
};

var start_val = $(base_entry).val();
var name = base_entry.name;
var id = base_entry.id;
var wrapper = $( $(base_entry).wrap('<span class="jq-couponcode" />').parent()[0] );
wrapper[0].removeChild(base_entry);
var hidden = $('<input type="hidden">').attr({ 'name': name, 'id': id });
wrapper.append(hidden);
var inner = $('<span class="jq-couponcode-inner" />');
for(var i = 0; i < self.parts; i++) {
if(i > 0) {
inner.append($('<span class="jq-couponcode-sep" />').text(self.separator));
$.fn.couponCode.build = function (base_entry, options) {
var self = $.extend({}, $.fn.couponCode.defaults, options);
self.focus = null;
self.inputs = [];
self.flags = [];
self.parts = parseInt(self.parts, 10);
if (isNaN(self.parts) || self.parts < 1 || self.parts > 6) {
alert("CouponCode 'parts' must be in range 1-6");
return;
}
self.inputs[i] = $('<input type="text" class="jq-couponcode-part" />');
inner.append(self.inputs[i]);
}
$( self.inputs ).each(function(i, input) {
input
.keydown(function() { setTimeout(function() { validate(i); }, 5 ); } )
.blur(function() { self.focus = null; validate(i); } )
.focus( function() { self.focus = i; } );
});
self.inputs[0].on('paste', function() {
setTimeout(function() { set_parts(self.inputs[0].val()); }, 2);
});

if(start_val.length > 0) {
set_parts(start_val);
}
wrapper.append(inner);
if(self.setFocus) {
self.inputs[0].focus();
}
var start_val = $(base_entry).val();
var name = base_entry.name;
var id = base_entry.id;
var wrapper = $($(base_entry).wrap('<span class="jq-couponcode" />').parent()[0]);
wrapper[0].removeChild(base_entry);
var hidden = $('<input type="hidden">').attr({ 'name': name, 'id': id });
wrapper.append(hidden);
var inner = $('<span class="jq-couponcode-inner" />');
for (var i = 0; i < self.parts; i++) {
if (i > 0) {
inner.append($('<span class="jq-couponcode-sep" />').text(self.separator));
}
self.inputs[i] = $('<input type="text" class="jq-couponcode-part" />');
inner.append(self.inputs[i]);
}
$(self.inputs).each(function (i, input) {
input
.keydown(function () { setTimeout(function () { validate(i); }, 5); })
.blur(function () { self.focus = null; validate(i); })
.focus(function () { self.focus = i; });
});
self.inputs[0].on('paste', function () {
setTimeout(function () { set_parts(self.inputs[0].val()); }, 2);
});

function set_parts(code) {
var parts = code.split('-');
for(var i = 0; i < self.parts; i++) {
self.inputs[i].val( parts[i] || '');
validate(i);
if (start_val.length > 0) {
set_parts(start_val);
}
wrapper.append(inner);
if (self.setFocus) {
self.inputs[0].focus();
}
}

function validate(index) {
var input = self.inputs[index];
var result = validate_one_field(input, index);
if(result === true) {
input.removeClass('jq-couponcode-bad');
input.addClass('jq-couponcode-good');
self.flags[index] = 1;
function set_parts(code) {
var parts = code.split('-');
for (var i = 0; i < self.parts; i++) {
self.inputs[i].val(parts[i] || '');
validate(i);
}
}
else {
input.removeClass('jq-couponcode-good');
input.removeClass('jq-couponcode-bad');
if(result === false) {

function validate(index) {
var input = self.inputs[index];
var result = validate_one_field(input, index);
if (result === true) {
input.removeClass('jq-couponcode-bad');
input.addClass('jq-couponcode-good');
self.flags[index] = 1;
}
else if (result === false) {
input.removeClass('jq-couponcode-good');
input.addClass('jq-couponcode-bad');
self.flags[index] = 0;
}
self.flags[index] = 0;
else {// result === null
input.removeClass('jq-couponcode-good');
input.removeClass('jq-couponcode-bad');
self.flags[index] = 0;
}
update_hidden_field();
}
update_hidden_field();
}

function validate_one_field(input, index) {
var val = input.val();
var focussed = (self.focus === index);
if(val == '') { return; }
var code = clean_up( val );
if(code.length > 4 || BAD_SYMBOL.test(code)) {
return false;
}
if(code.length < 4) {
return focussed ? null : false;
}
if(code.charAt(3) != checkdigit(code, index + 1)) {
return false;
}
if(val != code) {
input.val(code);
}
if(focussed && (index < self.parts - 1)) {
self.inputs[index + 1].focus();
self.focus = index + 1;
function validate_one_field(input, index) {
var val = input.val();
var focussed = (self.focus === index);
if (val === '') { return; }
var code = clean_up(val);
if (code.length > 4 || BAD_SYMBOL.test(code)) {
return false;
}
if (code.length < 4) {
return focussed ? null : false;
}
if (code.charAt(3) !== checkdigit(code, index + 1)) {
return false;
}
if (val !== code) {
input.val(code);
}
if (focussed && (index < self.parts - 1)) {
self.inputs[index + 1].focus();
self.focus = index + 1;
}
return true;
}
return true;
}

function clean_up(code) {
code = code.toUpperCase()
.replace(/ /g, '')
.replace(/O/g, '0')
.replace(/I/g, '1')
.replace(/S/g, '5')
.replace(/Z/g, '2');
return code;
}

function checkdigit(data, pos) {
var check = pos;
for(var i = 0; i < 3; i++) {
var k = SYMBOL_SET.indexOf( data.charAt(i) );
check = check * 19 + k;
function clean_up(code) {
code = code.toUpperCase()
.replace(/ /g, '')
.replace(/O/g, '0')
.replace(/I/g, '1')
.replace(/S/g, '5')
.replace(/Z/g, '2');
return code;
}
return SYMBOL_SET.charAt(check % 31);
}

function update_hidden_field() {
var parts = [];
var old_code = hidden.val();
$( self.inputs ).each(function(i, input) {
parts.push(input.val());
});
var new_code = parts.join('-');
if(old_code == new_code) {
return;
function checkdigit(data, pos) {
var check = pos;
for (var i = 0; i < 3; i++) {
var k = SYMBOL_SET.indexOf(data.charAt(i));
check = check * 19 + k;
}
return SYMBOL_SET.charAt(check % 31);
}
hidden.val(new_code);
if(self.onChange) {
var good_parts = 0;
$( self.flags ).each(function(i, val) { good_parts = good_parts + val; });
self.onChange(good_parts === self.parts);

function update_hidden_field() {
var parts = [];
var old_code = hidden.val();
$(self.inputs).each(function (i, input) {
parts.push(input.val());
});
var new_code = parts.join('-');
if (old_code === new_code) {
return;
}
hidden.val(new_code);
if (self.onChange) {
var good_parts = 0;
$(self.flags).each(function (i, val) { good_parts = good_parts + val; });
self.onChange(good_parts === self.parts);
}
}
}

};
};

$.fn.couponCode.defaults = {
parts : 3,
separator : '-',
setFocus : false
};
$.fn.couponCode.defaults = {
parts : 3,
separator : '-',
setFocus : false
};

})(jQuery);