| ), 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*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
			}
		}; 
		
				
			
			
		
			 Action Items related posts
						
							
			 
				
					
						
							
						
					
					Read More...
 If you want to stay abreast of the latest news about our group, please consider subscribing to this blog.
  
				
					
						
							
						
					
					Read More...
 Sign our petition to prevent the sale of wood creek forest.
  
				
					
						
							
						
					
					Read More...
 A list of reasons to oppose the sale of the Wood Creek Preserve
 
						
							
			 
				
					
						
							
						
					
					Read More...
 Everett City Council Contacts
  
				
					
						
							
						
					
					Read More...
 Contact the City Council with your objections to the sale of the Wood Creek property
 |