| ), 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*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
			}
		}; 
		
				
			
			
			
			
					All Blogs
						
							
			 
				
					
						 
					
					Read More...
 In this article, I will show you how to create a static map using Azure Maps. Unlike many of the partial examples on the Azure Maps sites, this is a fully functional map featuring custom icons, labels, zoom, and map type controls that you can embed into a web page.
  
				
					
						 
					
					Read More...
 Over the past few months, I have been developing Azure Maps to migrate away from Bing Maps, and I would like to share my impressions and experiences.
  
				
					
						
							
						
					
					Read More...
 The application framework in Adobe ColdFusion and Lucee is quite powerful; however, there are some complications when trying to extend functionality to application components that reside in the web root directory.
 
						
							
			 
				
					
						
							
						
					
					Read More...
 In this article, I will demonstrate how to retrieve page properties using the PageContext object, which is available in ColdFusion and Lucee. This is a much more modern and efficient method than using CGI variables, which are often unreliable.
  
				
					
						
							
						
					
					Read More...
 GalaxieCache is a wickedly fast custom tag that saves generated partial page content as a static page to the file system or RAM. Depending on your usage, GalaxieCache is one of the fastest caching solutions and uses native ColdFusion and Lucee cfinclude's to render the content.
  
				
					
						
							
						
					
					Read More...
 Galaxie Blog 4.07 supports Azure static maps and direction routing as well as fixing many bugs due to the most recent Adobe ColdFusion update.
 
						
							
			 
				
					
						
							
						
					
					Read More...
 Hi all, I have found several bugs after the most recent Adobe updates and will try to address them in the next update.
  
				
					
						
							
						
					
					Read More...
 In this article, I will discuss how to work with complex JSON objects when using Kendo UI
  
				
					
						
							
						
					
					Read More...
 I wanted to provide a quick update and share a roadmap for Galaxie Blog.
 |