PageSourceSearch

https://www.bogsfootwear.com.au/shop/style/resources/js/jquery.maskedinput.js

js bogsfootwear.com.au collected 2026-10-06 12:08:08 UTC 11,275 bytes, 449 lines download raw bytes

1(function (factory) {
2    if (typeof define === 'function' && define.amd) {
3        // AMD. Register as an anonymous module.
4        define(['jquery'], factory);
5    } else if (typeof exports === 'object') {
6        // Node/CommonJS
7        factory(require('jquery'));
8    } else {
9        // Browser globals
10        factory(jQuery);
11    }
12}(function ($) {
13
14var ua = navigator.userAgent,
15	iPhone = /iphone/i.test(ua),
16	chrome = /chrome/i.test(ua),
17	android = /android/i.test(ua),
18	caretTimeoutId;
19
20$.mask = {
21	//Predefined character definitions
22	definitions: {
23		'9': "[0-9]",
24		'a': "[A-Za-z]",
25		'*': "[A-Za-z0-9]"
26	},
27	autoclear: true,
28	dataName: "rawMaskFn",
29	placeholder: '_'
30};
31
32$.fn.extend({
33	//Helper Function for Caret positioning
34	caret: function(begin, end) {
35		var range;
36
37		if (this.length === 0 || this.is(":hidden") || this.get(0) !== document.activeElement) {
38			return;
39		}
40
41		if (typeof begin == 'number') {
42			end = (typeof end === 'number') ? end : begin;
43			return this.each(function() {
44				if (this.setSelectionRange) {
45					this.setSelectionRange(begin, end);
46				} else if (this.createTextRange) {
47					range = this.createTextRange();
48					range.collapse(true);
49					range.moveEnd('character', end);
50					range.moveStart('character', begin);
51					range.select();
52				}
53			});
54		} else {
55			if (this[0].setSelectionRange) {
56				begin = this[0].selectionStart;
57				end = this[0].selectionEnd;
58			} else if (document.selection && document.selection.createRange) {
59				range = document.selection.createRange();
60				begin = 0 - range.duplicate().moveStart('character', -100000);
61				end = begin + range.text.length;
62			}
63			return { begin: begin, end: end };
64		}
65	},
66	unmask: function() {
67		return this.trigger("unmask");
68	},
69	mask: function(mask, settings) {
70		var input,
71			defs,
72			tests,
73			partialPosition,
74			firstNonMaskPos,
75            lastRequiredNonMaskPos,
76            len,
77            oldVal;
78
79		if (!mask && this.length > 0) {
80			input = $(this[0]);
81            var fn = input.data($.mask.dataName)
82			return fn?fn():undefined;
83		}
84
85		settings = $.extend({
86			autoclear: $.mask.autoclear,
87			placeholder: $.mask.placeholder, // Load default placeholder
88			completed: null
89		}, settings);
90
91
92		defs = $.mask.definitions;
93		tests = [];
94		partialPosition = len = mask.length;
95		firstNonMaskPos = null;
96
97		mask = String(mask);
98
99		$.each(mask.split(""), function(i, c) {
100			if (c == '?') {
101				len--;
102				partialPosition = i;
103			} else if (defs[c]) {
104				tests.push(new RegExp(defs[c]));
105				if (firstNonMaskPos === null) {
106					firstNonMaskPos = tests.length - 1;
107				}
108                if(i < partialPosition){
109                    lastRequiredNonMaskPos = tests.length - 1;
110                }
111			} else {
112				tests.push(null);
113			}
114		});
115
116		return this.trigger("unmask").each(function() {
117			var input = $(this),
118				buffer = $.map(
119    				mask.split(""),
120    				function(c, i) {
121    					if (c != '?') {
122    						return defs[c] ? getPlaceholder(i) : c;
123    					}
124    				}),
125				defaultBuffer = buffer.join(''),
126				focusText = input.val();
127
128            function tryFireCompleted(){
129                if (!settings.completed) {
130                    return;
131                }
132
133                for (var i = firstNonMaskPos; i <= lastRequiredNonMaskPos; i++) {
134                    if (tests[i] && buffer[i] === getPlaceholder(i)) {
135                        return;
136                    }
137                }
138                settings.completed.call(input);
139            }
140
141            function getPlaceholder(i){
142                if(i < settings.placeholder.length)
143                    return settings.placeholder.charAt(i);
144                return settings.placeholder.charAt(0);
145            }
146
147			function seekNext(pos) {
148				while (++pos < len && !tests[pos]);
149				return pos;
150			}
151
152			function seekPrev(pos) {
153				while (--pos >= 0 && !tests[pos]);
154				return pos;
155			}
156
157			function shiftL(begin,end) {
158				var i,
159					j;
160
161				if (begin<0) {
162					return;
163				}
164
165				for (i = begin, j = seekNext(end); i < len; i++) {
166					if (tests[i]) {
167						if (j < len && tests[i].test(buffer[j])) {
168							buffer[i] = buffer[j];
169							buffer[j] = getPlaceholder(j);
170						} else {
171							break;
172						}
173
174						j = seekNext(j);
175					}
176				}
177				writeBuffer();
178				input.caret(Math.max(firstNonMaskPos, begin));
179			}
180
181			function shiftR(pos) {
182				var i,
183					c,
184					j,
185					t;
186
187				for (i = pos, c = getPlaceholder(pos); i < len; i++) {
188					if (tests[i]) {
189						j = seekNext(i);
190						t = buffer[i];
191						buffer[i] = c;
192						if (j < len && tests[j].test(t)) {
193							c = t;
194						} else {
195							break;
196						}
197					}
198				}
199			}
200
201			function androidInputEvent(e) {
202				var curVal = input.val();
203				var pos = input.caret();
204				var proxy = function () {
205						$.proxy($.fn.caret, input, pos.begin, pos.begin)();
206				};
207				
208				if (oldVal && oldVal.length && oldVal.length > curVal.length ) {
209					// a deletion or backspace happened
210					checkVal(true);
211					while (pos.begin > 0 && !tests[pos.begin-1])
212						pos.begin--;
213					if (pos.begin === 0)
214					{
215						while (pos.begin < firstNonMaskPos && !tests[pos.begin])
216							pos.begin++;
217					}
218					setTimeout(proxy, 0);
219				} else {
220					var pos2 = checkVal(true);
221					var lastEnteredValue = curVal.charAt(pos.begin);
222					if (pos.begin < len){
223						if(!tests[pos.begin]){
224							pos.begin = pos2;
225						}else{
226							if(tests[pos.begin].test(lastEnteredValue)){
227								pos.begin++;
228							}
229						}
230					}
231					setTimeout(proxy, 0); 
232				}
233				tryFireCompleted();
234			}
235
236
237			function blurEvent(e) {
238                checkVal();
239
240                if (input.val() != focusText)
241                    input.change();
242            }
243
244			function keydownEvent(e) {
245                if (input.prop("readonly")){
246                    return;
247                }
248
249				var k = e.which || e.keyCode,
250					pos,
251					begin,
252					end;
253                    oldVal = input.val();
254				//backspace, delete, and escape get special treatment
255				if (k === 8 || k === 46 || (iPhone && k === 127)) {
256					pos = input.caret();
257					begin = pos.begin;
258					end = pos.end;
259
260					if (end - begin === 0) {
261						begin=k!==46?seekPrev(begin):(end=seekNext(begin-1));
262						end=k===46?seekNext(end):end;
263					}
264					clearBuffer(begin, end);
265					shiftL(begin, end - 1);
266
267					e.preventDefault();
268				} else if( k === 13 ) { // enter
269					blurEvent.call(this, e);
270				} else if (k === 27) { // escape
271					input.val(focusText);
272					input.caret(0, checkVal());
273					e.preventDefault();
274				}
275			}
276
277			function keypressEvent(e) {
278                if (input.prop("readonly")){
279                    return;
280                }
281
282				var k = e.which || e.keyCode,
283					pos = input.caret(),
284					p,
285					c,
286					next;
287
288				if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore
289					return;
290				} else if ( k && k !== 13 ) {
291					if (pos.end - pos.begin !== 0){
292						clearBuffer(pos.begin, pos.end);
293						shiftL(pos.begin, pos.end-1);
294					}
295
296					p = seekNext(pos.begin - 1);
297					if (p < len) {
298						c = String.fromCharCode(k);
299						if (tests[p].test(c)) {
300							shiftR(p);
301
302							buffer[p] = c;
303							writeBuffer();
304							next = seekNext(p);
305
306							if(android){
307								//Path for CSP Violation on FireFox OS 1.1
308								var proxy = function() {
309									$.proxy($.fn.caret,input,next)();
310								};
311
312								setTimeout(proxy,0);
313							}else{
314								input.caret(next);
315							}
316                            if(pos.begin <= lastRequiredNonMaskPos){
317		                         tryFireCompleted();
318                             }
319						}
320					}
321					e.preventDefault();
322				}
323			}
324
325			function clearBuffer(start, end) {
326				var i;
327				for (i = start; i < end && i < len; i++) {
328					if (tests[i]) {
329						buffer[i] = getPlaceholder(i);
330					}
331				}
332			}
333
334			function writeBuffer() { input.val(buffer.join('')); }
335
336			function checkVal(allow) {
337				//try to place characters where they belong
338				var test = input.val(),
339					lastMatch = -1,
340					i,
341					c,
342					pos;
343
344				for (i = 0, pos = 0; i < len; i++) {
345					if (tests[i]) {
346						buffer[i] = getPlaceholder(i);
347						while (pos++ < test.length) {
348							c = test.charAt(pos - 1);
349							if (tests[i].test(c)) {
350								buffer[i] = c;
351								lastMatch = i;
352								break;
353							}
354						}
355						if (pos > test.length) {
356							clearBuffer(i + 1, len);
357							break;
358						}
359					} else {
360                        if (buffer[i] === test.charAt(pos)) {
361                            pos++;
362                        }
363                        if( i < partialPosition){
364                            lastMatch = i;
365                        }
366					}
367				}
368				if (allow) {
369					writeBuffer();
370				} else if (lastMatch + 1 < partialPosition) {
371					if (settings.autoclear || buffer.join('') === defaultBuffer) {
372						// Invalid value. Remove it and replace it with the
373						// mask, which is the default behavior.
374						if(input.val()) input.val("");
375						clearBuffer(0, len);
376					} else {
377						// Invalid value, but we opt to show the value to the
378						// user and allow them to correct their mistake.
379						writeBuffer();
380					}
381				} else {
382					writeBuffer();
383					input.val(input.val().substring(0, lastMatch + 1));
384				}
385				return (partialPosition ? i : firstNonMaskPos);
386			}
387
388			input.data($.mask.dataName,function(){
389				return $.map(buffer, function(c, i) {
390					return tests[i]&&c!=getPlaceholder(i) ? c : null;
391				}).join('');
392			});
393
394
395			input
396				.one("unmask", function() {
397					input
398						.off(".mask")
399						.removeData($.mask.dataName);
400				})
401				.on("focus.mask", function() {
402                    if (input.prop("readonly")){
403                        return;
404                    }
405
406					clearTimeout(caretTimeoutId);
407					var pos;
408
409					focusText = input.val();
410
411					pos = checkVal();
412
413					caretTimeoutId = setTimeout(function(){
414                        if(input.get(0) !== document.activeElement){
415                            return;
416                        }
417						writeBuffer();
418						if (pos == mask.replace("?","").length) {
419							input.caret(0, pos);
420						} else {
421							input.caret(pos);
422						}
423					}, 10);
424				})
425				.on("blur.mask", blurEvent)
426				.on("keydown.mask", keydownEvent)
427				.on("keypress.mask", keypressEvent)
428				.on("input.mask paste.mask", function() {
429                    if (input.prop("readonly")){
430                        return;
431                    }
432
433					setTimeout(function() {
434						var pos=checkVal(true);
435						input.caret(pos);
436                        tryFireCompleted();
437					}, 0);
438				});
439                if (chrome && android)
440                {
441                    input
442                        .off('input.mask')
443                        .on('input.mask', androidInputEvent);
444                }
445				checkVal(); //Perform initial check for existing values
446		});
447	}
448});
449}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.