| ), elements using an ID, and classes if you use a '.' to prefix the class name.
		Usage to remove our postData tag that indicates that LD+Json is being used: removeStr(value, "postData") 
		Usage to remove the 'foo' class from a string: removeStrBetween(str, '.foo');
		*/
		var removeStrBetween = function(str, selector) {
			// Create a new container to operate on
			var wrapped = $(" " + str + "");
			// Remove the content between the tags.
			wrapped.find(selector).remove();
			// Return it
			return wrapped.html();
		}
		
		// Function to truncate and add an elipsis if the text exceeds a certain value
		function truncateWithEllipses(text, max) {
			return text.substr(0,max-1)+(text.length>max?'...':''); 
		}
		function stripHtml(html){
			html.replace(/<[^>]*>?/gm, '');
			return html;
		}
		
		// Determine if a string has a space 
		function hasWhiteSpace(s) {
			const whitespaceChars = [' ', '\t', '\n'];
			return whitespaceChars.some(char => s.includes(char));
		}
		
		// ColdFusion like string functions
		
		// ReplaceNoCase, scope is either 'all' or 'one'. 
		// Gregory Alexander 
		function replaceNoCase(string,subString,replacement, scope){
			if (scope == 'all'){
				// i is a RegEx ignore case flag, g is global flag
				var regEx = new RegExp(subString, "ig");
			} else {
				// i is an RegEx ignore case flag
				var regEx = new RegExp(subString, "i");
			}
			// i is an ignore case flag, g is global flag
			var regEx = new RegExp(subString, "ig");
			var result = string.replace(regEx, replacement);
			return result;
		}
		// ColdFusion like list functions
		function listLen(list, delimiter){
			// Gregory Alexander 
			if(delimiter == null) { delimiter = ','; }
			var thisLen = list.split(delimiter);
			return thisLen.length;
		}
		
		function listGetAt(list, position, delimiter, zeroIndex) {
			// Gregory Alexander 
			if(delimiter == null) { delimiter = ','; }
			if(zeroIndex == null) { zeroIndex = true; }
			list = list.split(delimiter);
			if(list.length > position) {
				if(zeroIndex){
					// Better handling for JavaScript arrays
					return list[position];
				} else {
					// Handles like the CF version without a zero-index
					return list[position-1];
				}
			} else {
				return 0;
			}
		}
		function listFind(list, value, delimiter) {
			// Adapted from a variety of sources by Gregory Alexander 
			var result = 0;
			if(delimiter == null) delimiter = ',';
			list = list.split(delimiter);
			for ( var i = 0; i < list.length; i++ ) {
				if ( value == list[i] ) {
					result = i + 1;
					return result;
				}
			}
			return result;
		}
		
		// Compares two lists of comma seperated strings. Used to determine if the selected capabilities match the default capabilities for a given role. Function based on the listCompare method found in cflib.
		function listCompare(string1, string2){
			// Adapted from a variety of sources by Gregory Alexander 
			var s = string1.split(",");
			for(var k = 0 ;k < s.length; k++){
				if(string2.indexOf("," + s[k] + ",") ){ 
				  return true;
				}
			}
			return false;
		}
		
		// Adds a value to a comma separated list. Will not add the value if the list already contains the value.
		function listAppend(list, value) {
		  // Adapted from a variety of sources by Gregory Alexander 
		  var re = new RegExp('(^|\\b)' + value + '(\\b|$)');
		  if (!re.test(list)) {
			return list + (list.length? ',' : '') + value;
		  }
		  return list;
		}
		
		// Removes a value to a comma separated list. Based on the ListDeleteValue function by Ben Nadel CF fuction https://gist.github.com/bennadel/9753040
		var listDeleteValue = function(list, value){
			// Adapted from a variety of sources by Gregory Alexander 
			var values = list.split(",");
			for(var i = 0 ; i < values.length ; i++) {
				if (values[i] == value) {
					values.splice(i, 1);
					return values.join(",");
				}
			}
			return list;
		}
		
		// URL functions
		
		// 
		// parseUri 1.2.2
		// (c) Steven Levithan 
		// MIT License
		/*
		Splits any well-formed URI into the following parts (all are optional):
		----------------------
		- source (since the exec method returns the entire match as key 0, we might as well use it)
		- protocol (i.e., scheme)
		- authority (includes both the domain and port)
		  - domain (i.e., host; can be an IP address)
		  - port
		- path (includes both the directory path and filename)
		  - directoryPath (supports directories with periods, and without a trailing backslash)
		  - fileName
		- query (does not include the leading question mark)
		- anchor (i.e., fragment) */
		function parseUri (str) {
			var	o   = parseUri.options,
				m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
				uri = {},
				i   = 14;
			while (i--) uri[o.key[i]] = m[i] || "";
			uri[o.q.name] = {};
			uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
				if ($1) uri[o.q.name][$1] = $2;
			});
			return uri;
		};
		parseUri.options = {
			strictMode: false,
			key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
			q:   {
				name:   "queryKey",
				parser: /(?:^|&)([^&=]*)=?([^&]*)/g
			},
			parser: {
				strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
				loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
			}
		}; 
		
				
			
			
		
			 Wildlife related posts
						
							
			 
				
					
						 
					
					Read More...
 Today I captured a video of these two juvenile bears in my front yard with my surveillance feed
 |