PageSourceSearch

https://www.museum-newtonabbot.org.uk/js/jquery.textarea-counter.plugin.js

js museum-newtonabbot.org.uk collected 2026-10-02 19:29:40 UTC 4,985 bytes, 163 lines download raw bytes

1/*
2 * jQuery Textarea Characters Counter Plugin v 2.0
3 * Examples and documentation at: http://roy-jin.appspot.com/jsp/textareaCounter.jsp
4 * Copyright (c) 2010 Roy Jin
5 * Version: 2.0 (11-JUN-2010)
6 * Dual licensed under the MIT and GPL licenses:
7 * http://www.opensource.org/licenses/mit-license.php
8 * http://www.gnu.org/licenses/gpl.html
9 * Requires: jQuery v1.4.2 or later
10 */
11(function($){  
12	$.fn.textareaCount = function(options, fn) {   
13		var defaults = {  
14			maxCharacterSize: -1,  
15			originalStyle: 'originalTextareaInfo',
16			warningStyle: 'warningTextareaInfo',  
17			warningNumber: 20,
18			displayFormat: '#input characters | #words words'
19		};  
20		var options = $.extend(defaults, options);
21		
22		var container = $(this);
23		
24		$("<div class='charleft'>&nbsp;</div>").insertAfter(container);
25		
26		//create charleft css
27		var charLeftCss = {
28			'width' : container.width()
29		};
30		
31		var charLeftInfo = getNextCharLeftInformation(container);
32		charLeftInfo.addClass(options.originalStyle);
33		charLeftInfo.css(charLeftCss);
34		
35		var numInput = 0;
36		var maxCharacters = options.maxCharacterSize;
37		var numLeft = 0;
38		var numWords = 0;
39				
40		container.bind('keyup', function(event){limitTextAreaByCharacterCount();})
41				 .bind('mouseover', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);})
42				 .bind('paste', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);});
43		
44		
45		function limitTextAreaByCharacterCount(){
46			charLeftInfo.html(countByCharacters());
47			//function call back
48			if(typeof fn != 'undefined'){
49				fn.call(this, getInfo());
50			}
51			return true;
52		}
53		
54		function countByCharacters(){
55			var content = container.val();
56			var contentLength = content.length;
57			
58			//Start Cut
59			if(options.maxCharacterSize > 0){
60				//If copied content is already more than maxCharacterSize, chop it to maxCharacterSize.
61				if(contentLength >= options.maxCharacterSize) {
62					content = content.substring(0, options.maxCharacterSize); 				
63				}
64				
65				var newlineCount = getNewlineCount(content);
66				
67				// newlineCount new line character. For windows, it occupies 2 characters
68				var systemmaxCharacterSize = options.maxCharacterSize - newlineCount;
69				if (!isWin()){
70					 systemmaxCharacterSize = options.maxCharacterSize
71				}
72				if(contentLength > systemmaxCharacterSize){
73					//avoid scroll bar moving
74					var originalScrollTopPosition = this.scrollTop;
75					container.val(content.substring(0, systemmaxCharacterSize));
76					this.scrollTop = originalScrollTopPosition;
77				}
78				charLeftInfo.removeClass(options.warningStyle);
79				if(systemmaxCharacterSize - contentLength <= options.warningNumber){
80					charLeftInfo.addClass(options.warningStyle);
81				}
82				
83				numInput = container.val().length + newlineCount;
84				if(!isWin()){
85					numInput = container.val().length;
86				}
87			
88				numWords = countWord(getCleanedWordString(container.val()));
89				
90				numLeft = maxCharacters - numInput;
91			} else {
92				//normal count, no cut
93				var newlineCount = getNewlineCount(content);
94				numInput = container.val().length + newlineCount;
95				if(!isWin()){
96					numInput = container.val().length;
97				}
98				numWords = countWord(getCleanedWordString(container.val()));
99			}
100			
101			return formatDisplayInfo();
102		}
103		
104		function formatDisplayInfo(){
105			var format = options.displayFormat;
106			format = format.replace('#input', numInput);
107			format = format.replace('#words', numWords);
108			//When maxCharacters <= 0, #max, #left cannot be substituted.
109			if(maxCharacters > 0){
110				format = format.replace('#max', maxCharacters);
111				format = format.replace('#left', numLeft);
112			}
113			return format;
114		}
115		
116		function getInfo(){
117			var info = {
118				input: numInput,
119				max: maxCharacters,
120				left: numLeft,
121				words: numWords
122			};
123			return info;
124		}
125		
126		function getNextCharLeftInformation(container){
127				return container.next('.charleft');
128		}
129		
130		function isWin(){
131			var strOS = navigator.appVersion;
132			if (strOS.toLowerCase().indexOf('win') != -1){
133				return true;
134			}
135			return false;
136		}
137		
138		function getNewlineCount(content){
139			var newlineCount = 0;
140			for(var i=0; i<content.length;i++){
141				if(content.charAt(i) == '\n'){
142					newlineCount++;
143				}
144			}
145			return newlineCount;
146		}
147		
148		function getCleanedWordString(content){
149			var fullStr = content + " ";
150			var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi;
151			var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, "");
152			var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi;
153			var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " ");
154			var splitString = cleanedStr.split(" ");
155			return splitString;
156		}
157		
158		function countWord(cleanedWordString){
159			var word_count = cleanedWordString.length-1;
160			return word_count;
161		}
162	};  
163})(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.