content: --
  --	Created by: Mark Alldritt
  --	Created on: 2016-06-19
  --
  --	Copyright (c) 2016 Late Night Software Ltd.
  --	All Rights Reserved
  --
  
  use AppleScript version "2.4" -- Yosemite (10.10) or later
  use framework "Foundation"
  use scripting additions
  
  
  property pstrCharToTrim : {tab, linefeed, return, space, character id 160, character id 5760, character id 8192, character id 8193, character id 8194, character id 8195, character id 8196, character id 8197, character id 8198, character id 8199, character id 8200, character id 8201, character id 8202, character id 8239, character id 8287, character id 12288}
  
  
  on containerOf(theObject)
  	return «class from» of (theObject as record)
  end
  
  on replaceText(theString, fString, rString)
  	if class of theString is list then
  		local resultList
  		
  		set resultList to {}
  		repeat with anItem in theString
  			set end of resultList to replaceText(contents of anItem, fString, rString)
  		end repeat
  		return resultList
  	else
  		(*
  		local saveTID, stringList, newString
  		
  		set saveTID to AppleScript's text item delimiters
  		set AppleScript's text item delimiters to fString
  		set stringList to every text item of theString
  		set AppleScript's text item delimiters to rString
  		set newString to stringList as string
  		set AppleScript's text item delimiters to saveTID
  		return newString
  		*)
  		return ((current application's NSString's stringWithString:theString)'s ¬
  			stringByReplacingOccurrencesOfString:fString withString:rString) as text
  	end if
  end replaceText
  
  on throwError(errMsg)
  	error errMsg number 1000
  end throwError
  
  on trim(theString)
  	--	Trim whitespace from the beginning and end of string(s).  theString may be a single string or a list of strings.
  	if class of theString is list then
  		local resultList
  		
  		set resultList to {}
  		repeat with anItem in theString
  			set end of resultList to trim(contents of anItem)
  		end repeat
  		return resultList
  	else if class of theString is string or class of theString is text then
  		local lLoc, rLoc
  		
  		set lLoc to 1
  		set rLoc to count of theString
  		
  		--- From left to right, get location of first non-whitespace character
  		repeat until lLoc = (rLoc + 1) or character lLoc of theString is not in pstrCharToTrim
  			set lLoc to lLoc + 1
  		end repeat
  		
  		-- From right to left, get location of first non-whitespace character
  		repeat until rLoc = 0 or character rLoc of theString is not in pstrCharToTrim
  			set rLoc to rLoc - 1
  		end repeat
  		
  		if lLoc > rLoc then
  			return ""
  		else
  			return text lLoc thru rLoc of theString
  		end if
  	else
  		return theString
  	end if
  end trim
  
  on split(theString, theSeparator)
  	local saveTID, theResult
  	
  	set saveTID to AppleScript's text item delimiters
  	set AppleScript's text item delimiters to theSeparator
  	set theResult to text items of theString
  	set AppleScript's text item delimiters to saveTID
  	return theResult
  end split
  
  on |join|(theString, theSeparator)
  	local saveTID, theResult
  	
  	set saveTID to AppleScript's text item delimiters
  	set AppleScript's text item delimiters to theSeparator
  	set theResult to theString as text
  	set AppleScript's text item delimiters to saveTID
  	return theResult
  end |join|
  
  on formatForJSON(theValue)
  	--	Format a string as a valid JSON value
  	if (class of theValue is boolean) then
  		if (theValue) then
  			return true
  		else
  			return false
  		end if
  	else
  		set theValue to theValue as string
  		return "\"" & replaceText(replaceText(theValue, "\\", "\\\\"), "\"", "\\\"") & "\""
  	end if
  end formatForJSON
  
  on formatCSVString(theValue)
  	--	Format a string as a valid CSV value
  	if theValue is missing value then
  		return ""
  	else
  		set theValue to theValue as string
  		return "\"" & replaceText(theValue, "\"", "\"\"") & "\""
  	end if
  end formatCSVString
  
  on makeFileReference(theFile)
  	--	Convert a string path into a file reference
  	--
  	--	Parameters:
  	--
  	--	theFile - when a string, can be a full HFS path, a full Posix Path (beginning with /), a HOME-relative Posix path (beginning with ~/)
  	--			- when an alias, returned as is
  	--			- when a file referene, returned as is
  	--
  	if class of theFile is string and character 1 of theFile is "/" then
  		set theFile to POSIX file theFile
  	else if class of theFile is string and character 1 of theFile is "~" then
  		set theFile to POSIX file ((POSIX path of (path to home folder)) & text 2 thru -1 of theFile)
  	else if class of theFile is string then
  		try
  			set theFile to alias theFile
  		end try
  	end if
  	
  	return theFile
  end makeFileReference
  
  on writeToFile(theFile, theString)
  	--	Write theString to theFile (file ref or string path)
  	try
  		local fileReference, fileSpec
  		
  		set theFile to makeFileReference(theFile)
  		set fileReference to open for access theFile with write permission
  		set eof fileReference to 0
  		write theString to fileReference as «class utf8»
  		close access fileReference
  		return theFile
  	on error errMessage number errNum
  		try
  			close access file theFile
  		end try
  		error errMessage number errNum
  	end try
  	
  end writeToFile
  
  on writeDataToFile(theFile, theData)
  	--	Write theData to theFile (file ref or string path)
  	try
  		local fileReference, fileSpec
  		
  		set theFile to makeFileReference(theFile)
  		set fileReference to open for access theFile with write permission
  		set eof fileReference to 0
  		write theData to fileReference
  		close access fileReference
  		return theFile
  	on error errMessage number errNum
  		try
  			close access file theFile
  		end try
  		error errMessage number errNum
  	end try
  	
  end writeDataToFile
  
  
  on readFromFile(theFile)
  	return readFromFileAs(theFile, text)
  end readFromFile
  
  on readFromFileAs(theFile, theClass)
  	--	Read the contents of theFile (file ref or string path)
  	try
  		local fileReference, fileSpec
  		
  		set theFile to makeFileReference(theFile)
  		set fileReference to open for access theFile
  		set theData to read fileReference as theClass
  		close access fileReference
  		return theData
  	on error
  		try
  			close access file theFile
  		end try
  		return missing value
  	end try
  end readFromFileAs
  
  on doesFileExist(theFile)
  	try
  		makeFileReference(theFile) as alias
  		return true
  	on error
  		return false
  	end try
  end doesFileExist
  