Checks that some string is palindrome. Checking performs case-insensitive
		
		:param str somestr:
		    It is some string that will be checked for palindrome as string.
			
		    The string is any string that you want. The string also can be multiline.
			
		    If the checked string does not contains any alphabetic characters or numbers or 
		    it is empty then it will never be palindrome
			
		:keyword dict interchange:
		    It is dictionary of interchangeable letters
			
		:except TypeError:
		    If the checked string is not a string

		:return bool:

def checkstring(somestr, interchange = ALL):
	"""
		Checks that some string is palindrome. Checking performs case-insensitive
		
		:param str somestr:
		    It is some string that will be checked for palindrome as string.
			
		    The string is any string that you want. The string also can be multiline.
			
		    If the checked string does not contains any alphabetic characters or numbers or 
		    it is empty then it will never be palindrome
			
		:keyword dict interchange:
		    It is dictionary of interchangeable letters
			
		:except TypeError:
		    If the checked string is not a string

		:return bool:
	"""
	# check invalid data types
	OnlyStringsCanBeChecked(somestr)
	
	if somestr != "":
		# remove all special symbols
		pattern = r'[^\w]+|[_]+'
		purestr = re.sub(pattern, '', somestr.casefold().strip(), flags = re.IGNORECASE | re.MULTILINE)
		
		for k,v in interchange.items():
			ic_pattern = '|'.join(v)
			purestr = re.sub(ic_pattern, k, purestr, flags = re.IGNORECASE | re.MULTILINE)
		
		# reverse pure string
		reversstr = purestr[-1::-1]
		
		# if purestr == "" that means that specified string contains 
		# only special symbols. This string is not palindrome
		if purestr != "" and reversstr == purestr:
			return True
	# in other cases
	return False