1require(['domReady'], function (domReady) { 2 'use strict'; 3 4 var init = function () { 5 var textAreas = document.querySelectorAll('textarea'); 6 textAreas.forEach(function (textarea) { 7 var maxLength = textarea.className.match(/(^|\s)maxlength_(\d*)($|\s)/); 8 if (maxLength && maxLength[2] > 0) { 9 textarea.maxlength = maxLength[2]; 10 } 11 12 var maxLines = textarea.className.match(/(^|\s)maxlines_(\d*)($|\s)/); 13 if (maxLines && maxLines[2] > 0) { 14 textarea.maxlines = maxLines[2]; 15 } 16 17 var maxWords = textarea.className.match(/(^|\s)maxWords_(\d*)($|\s)/); 18 if (maxWords && maxWords[2] > 0) { 19 textarea.maxWords = maxWords[2]; 20 } 21 22 var smsCount = textarea.className.match(/(^|\s)smsCount_(\d*)($|\s)/); 23 if (smsCount) { 24 textarea.smsCount = smsCount[2]; 25 } 26 if (textarea.maxlines || textarea.maxlength || textarea.maxWords || textarea.smsCount) { 27 textarea.lastOkVal = textarea.value; 28 textarea.addEventListener('keydown', checkNextKey); 29 textarea.addEventListener('keyup', checkContent); 30 textarea.addEventListener('change', checkContent); 31 textarea.addEventListener('blur', checkContent); 32 textarea.addEventListener('focus', checkFocus); 33 } 34 35 if (document.getElementById('charscountdown_' + textarea.id)) { 36 textarea.showCountdown = 'chars'; 37 textarea.countDownElemId = 'charscountdown_' + textarea.id; 38 } 39 40 textarea.countdownspan = document.getElementById('wordscountdown_' + textarea.id); 41 if (textarea.countdownspan) { 42 textarea.showCountdown = 'words'; 43 } 44 45 textarea.smscountspan = document.getElementById('smscounter_' + textarea.id); 46 if (textarea.smscountspan) { 47 textarea.showSMSCounter = true; 48 } 49 }); 50 }; 51 52 function checkNextKey (event) { 53 var elem = event.target; 54 var regex; 55 56 if (event.keyCode === 8) { 57 return true; 58 } 59 if (elem.maxlength) { 60 if (elem.maxlength && elem.value.length >= elem.maxlength) { 61 return false; 62 } 63 } 64 if (elem.maxWords) { 65 regex = new RegExp('(.*\\s){' + (elem.maxlines - 1) + '}'); 66 if (elem.value.match(regex)) { 67 return false; 68 } 69 } 70 if (elem.maxlines && event.keyCode === 13) { 71 regex = new RegExp('(.*\\n){' + (elem.maxlines - 1) + '}'); 72 if (elem.value.match(regex)) { 73 return false; 74 } 75 } 76 return true; 77 } 78 79 function checkContent (event) { 80 var elem = event.target; 81 var wordCount = 0; 82 var characterCount = 0; 83 var messageCount; 84 85 if (elem.showCountdown === 'chars') { 86 updateCharCount(elem); 87 } 88 89 // Check for backspace and delete keys, they should always be allowed 90 if (typeof event.keyCode !== 'undefined' && (event.keyCode === 8 || event.keyCode === 46)) { 91 elem.lastOkVal = elem.value; 92 return; 93 } 94 95 if (elem.maxlength && elem.value.length > elem.maxlength) { 96 elem.value = elem.value.substring(0, elem.maxlength); 97 updateCharCount(elem); 98 return; 99 } 100 101 if (elem.maxlines) { 102 var re = new RegExp('(.*\\n){' + elem.maxlines + '}'); 103 if (elem.value.match(re)) { 104 elem.value = elem.lastOkVal; 105 return; 106 } 107 } 108 109 if (elem.maxWords) { 110 if (elem.value.strip()) { 111 wordCount = elem.value.strip().split(/[\s]+/).length; 112 } 113 if (wordCount > elem.maxWords) { 114 elem.value = elem.lastOkVal; 115 wordCount = elem.maxWords; 116 } 117 } 118 119 if (elem.smsCount) { 120 if (elem.value.length <= 160) { 121 characterCount = elem.value.length; 122 messageCount = 1; 123 } else if (elem.value.length > 160) { 124 characterCount = elem.value.length; 125 if (characterCount % 153 !== 0) { 126 var i = characterCount; 127 messageCount = 0; 128 while (i !== 0 && i >= 0) { 129 messageCount++;
130 i = i - 153; 131 } 132 } else { 133 messageCount = characterCount / 153; 134 } 135 } 136 } 137 138 if (elem.showCountdown === 'words') { 139 elem.countdownspan.innerHTML = (elem.maxWords - wordCount).toString(); 140 } 141 142 if (elem.showSMSCounter === true) { 143 if (messageCount > 1) { 144 elem.smscountspan.innerHTML = 145 elem.smsCount = characterCount + ' (' + messageCount + ' ' + 'messages' + ')'; 146 } else { 147 elem.smscountspan.innerHTML = 148 elem.smsCount = characterCount + ' (' + messageCount + ' ' + 'message' + ')'; 149 } 150 } 151 152 elem.lastOkVal = elem.value; 153 } 154 155 function checkFocus (event) { 156 event.target.lastOkVal = event.target.value; 157 } 158 159 function updateCharCount (elem) { 160 var countElement = document.getElementById(elem.countDownElemId); 161 if (countElement) { 162 countElement.innerHTML = (elem.maxlength - elem.value.length).toString(); 163 } 164 } 165 166 domReady(init); 167});
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.