| ), 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...
 As a long-term ColdFusion developer, I have used CGI environment variables for the last twenty years to extract IP addresses and client variables. However, in this day and age, getting the IP address is much more complex and is no longer a trivial issue.
 |