1/// <reference path="../../../lib/jquery-1.2.6.js" /> 2/* 3 Masked Input plugin for jQuery 4 Copyright (c) 2007-2009 Josh Bush (digitalbush.com) 5 Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 6 Version: 1.2.2 (03/09/2009 22:39:06) 7*/ 8(function($) { 9 var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask"; 10 var iPhone = (window.orientation != undefined); 11 12 $.mask = { 13 //Predefined character definitions 14 definitions: { 15 '9': "[0-9]", 16 'a': "[A-Za-z]", 17 '*': "[A-Za-z0-9]" 18 } 19 }; 20 21 $.fn.extend({ 22 //Helper Function for Caret positioning 23 caret: function(begin, end) { 24 if (this.length == 0) return; 25 if (typeof begin == 'number') { 26 end = (typeof end == 'number') ? end : begin; 27 return this.each(function() { 28 if (this.setSelectionRange) { 29 this.focus(); 30 this.setSelectionRange(begin, end); 31 } else if (this.createTextRange) { 32 var range = this.createTextRange(); 33 range.collapse(true); 34 range.moveEnd('character', end); 35 range.moveStart('character', begin); 36 range.select(); 37 } 38 }); 39 } else { 40 if (this[0].setSelectionRange) { 41 begin = this[0].selectionStart; 42 end = this[0].selectionEnd; 43 } else if (document.selection && document.selection.createRange) { 44 var range = document.selection.createRange(); 45 begin = 0 - range.duplicate().moveStart('character', -100000); 46 end = begin + range.text.length; 47 } 48 return { begin: begin, end: end }; 49 } 50 }, 51 unmask: function() { return this.trigger("unmask"); }, 52 mask: function(mask, settings) { 53 if (!mask && this.length > 0) { 54 var input = $(this[0]); 55 var tests = input.data("tests"); 56 return $.map(input.data("buffer"), function(c, i) { 57 return tests[i] ? c : null; 58 }).join(''); 59 } 60 settings = $.extend({ 61 placeholder: "_", 62 completed: null 63 }, settings); 64 65 var defs = $.mask.definitions; 66 var tests = []; 67 var partialPosition = mask.length; 68 var firstNonMaskPos = null; 69 var len = mask.length; 70 71 $.each(mask.split(""), function(i, c) { 72 if (c == '?') { 73 len--; 74 partialPosition = i; 75 } else if (defs[c]) { 76 tests.push(new RegExp(defs[c])); 77 if(firstNonMaskPos==null) 78 firstNonMaskPos = tests.length - 1; 79 } else { 80 tests.push(null); 81 } 82 }); 83 84 return this.each(function() { 85 var input = $(this); 86 var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c }); 87 var ignore = false; //Variable for ignoring control keys 88 var focusText = input.val(); 89 90 input.data("buffer", buffer).data("tests", tests); 91 92 function seekNext(pos) { 93 while (++pos <= len && !tests[pos]); 94 return pos; 95 }; 96 97 function shiftL(pos) { 98 while (!tests[pos] && --pos >= 0); 99 for (var i = pos; i < len; i++) { 100 if (tests[i]) { 101 buffer[i] = settings.placeholder; 102 var j = seekNext(i); 103 if (j < len && tests[i].test(buffer[j])) { 104 buffer[i] = buffer[j]; 105 } else 106 break; 107 } 108 } 109 writeBuffer(); 110 input.caret(Math.max(firstNonMaskPos, pos)); 111 }; 112 113 function shiftR(pos) { 114 for (var i = pos, c = settings.placeholder; i < len; i++) { 115 if (tests[i]) { 116 var j = seekNext(i); 117 var t = buffer[i]; 118 buffer[i] = c; 119 if (j < len && tests[j].test(t)) 120 c = t; 121 else 122 break; 123 } 124 } 125 }; 126 127 function keydownEvent(e) { 128 var pos = $(this).caret(); 129 var k = e.keyCode; 130 ignore = (k < 16 || (k > 16 && k < 32) || (k > 32 && k < 41)); 131 132 //delete selection before proceeding 133 if ((pos.begin - pos.end) != 0 && (!ignore || k == 8 || k == 46)) 134 clearBuffer(pos.begin, pos.end); 135 136 //backspace, delete, and escape get special treatment 137 if (k == 8 || k == 46 || (iPhone && k == 127)) {//backspace/delete 138 shiftL(pos.begin + (k == 46 ? 0 : -1)); 139 return false; 140 } else if (k == 27) {//escape 141 input.val(focusText); 142 input.caret(0, checkVal()); 143 return false; 144 } 145 }; 146 147 function keypressEvent(e) { 148 if (ignore) { 149 ignore = false;
150 //Fixes Mac FF bug on backspace 151 return (e.keyCode == 8) ? false : null; 152 } 153 e = e || window.event; 154 var k = e.charCode || e.keyCode || e.which; 155 var pos = $(this).caret(); 156 157 if (e.ctrlKey || e.altKey || e.metaKey) {//Ignore 158 return true; 159 } else if ((k >= 32 && k <= 125) || k > 186) {//typeable characters 160 var p = seekNext(pos.begin - 1); 161 if (p < len) { 162 var c = String.fromCharCode(k); 163 if (tests[p].test(c)) { 164 shiftR(p); 165 buffer[p] = c; 166 writeBuffer(); 167 var next = seekNext(p); 168 $(this).caret(next); 169 if (settings.completed && next == len) 170 settings.completed.call(input); 171 } 172 } 173 } 174 return false; 175 }; 176 177 function clearBuffer(start, end) { 178 for (var i = start; i < end && i < len; i++) { 179 if (tests[i]) 180 buffer[i] = settings.placeholder; 181 } 182 }; 183 184 function writeBuffer() { return input.val(buffer.join('')).val(); }; 185 186 function checkVal(allow) { 187 //try to place characters where they belong 188 var test = input.val(); 189 var lastMatch = -1; 190 for (var i = 0, pos = 0; i < len; i++) { 191 if (tests[i]) { 192 buffer[i] = settings.placeholder; 193 while (pos++ < test.length) { 194 var c = test.charAt(pos - 1); 195 if (tests[i].test(c)) { 196 buffer[i] = c; 197 lastMatch = i; 198 break; 199 } 200 } 201 if (pos > test.length) 202 break; 203 } else if (buffer[i] == test[pos] && i!=partialPosition) { 204 pos++; 205 lastMatch = i; 206 } 207 } 208 if (!allow && lastMatch + 1 < partialPosition) { 209 input.val(""); 210 clearBuffer(0, len); 211 } else if (allow || lastMatch + 1 >= partialPosition) { 212 writeBuffer(); 213 if (!allow) input.val(input.val().substring(0, lastMatch + 1)); 214 } 215 return (partialPosition ? i : firstNonMaskPos); 216 }; 217 218 if (!input.attr("readonly")) 219 input 220 .one("unmask", function() { 221 input 222 .unbind(".mask") 223 .removeData("buffer") 224 .removeData("tests"); 225 }) 226 .bind("focus.mask", function() { 227 focusText = input.val(); 228 var pos = checkVal(); 229 writeBuffer(); 230 setTimeout(function() { 231 if (pos == mask.length) 232 input.caret(0, pos); 233 else 234 input.caret(pos); 235 }, 0); 236 }) 237 .bind("blur.mask", function() { 238 checkVal(); 239 if (input.val() != focusText) 240 input.change(); 241 }) 242 .bind("keydown.mask", keydownEvent) 243 .bind("keypress.mask", keypressEvent) 244 .bind(pasteEventName, function() { 245 setTimeout(function() { input.caret(checkVal(true)); }, 0); 246 }); 247 248 checkVal(); //Perform initial check for existing values 249 }); 250 } 251 }); 252})(jQuery);
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.