-- set the application to type into
-- you need to activate and focus a window prior to calling keyCmd
property process_name : "Finder"
on lowercase(_text)
	set _output to do shell script "echo " & quoted form of (_text) & " | tr A-Z a-z"
	return _output
end lowercase
(* Trigger a hotkey or character
Usage: keyCmd("hotkey to trigger")
Shortcuts:
$ : shift
~ : option
@ : command
^ : Control
Examples:
Trigger "k"
	keyCmd("k")
	
Trigger "K"
	keyCmd("K")
	keyCmd("$K")
Trigger Command-down arrow
	keyCmd("cmd down")
Trigger Command-I
	keyCmd("cmd i")
	keyCmd("@i")
Trigger Shift-Option-Command-S
	keyCmd("shift opt cmd s")
	keyCmd("$~@s")
*)
on keyCmd(_string)
	set _mod to {}
	
	set _codes to {{name:"left", code:123}, {name:"right", code:124}, {name:"down", code:125}, {name:"up", code:126}, {name:"escape", code:53}, {name:"esc", code:53}, {name:"pgdown", code:115}, {name:"pgup", code:119}, {name:"home", code:116}, {name:"end", code:121}, {name:"f1", code:122}, {name:"f2", code:120}, {name:"f3", code:99}, {name:"f4", code:118}, {name:"f5", code:96}, {name:"f6", code:97}, {name:"f7", code:98}, {name:"f8", code:100}, {name:"f9", code:101}, {name:"f10", code:109}, {name:"f11", code:103}, {name:"f12", code:111}, {name:"f13", code:105}, {name:"f14", code:107}, {name:"f15", code:113}, {name:"f16", code:106}, {name:"f17", code:64}, {name:"f18", code:79}, {name:"f19", code:80}, {name:"f20", code:90}, {name:"delete", code:51}, {name:"del", code:51}, {name:"tab", code:48}, {name:"return", code:36}, {name:"enter", code:76}, {name:"space", code:49}, {name:"shift", code:60}, {name:"option", code:61}, {name:"opt", code:61}, {name:"control", code:62}, {name:"ctrl", code:62}, {name:"command", code:55}, {name:"cmd", code:55}, {name:"capslock", code:48}}
	
	if _string contains "cmd" or _string contains "command" or _string contains "⌘" or _string contains "@" then set end of _mod to command down
	if _string contains "shift" or _string contains "⇧" or _string contains "$" then set end of _mod to shift down
	if _string contains "opt" or _string contains "option" or _string contains "⌥" or _string contains "~" then set end of _mod to option down
	if _string contains "ctrl" or _string contains "control" or _string contains "⌃" or _string contains "^" then set end of _mod to control down
	log (_string)
	
	try
		set _key to last item of words of _string
	on error errMsg number errNum -- errors if string is punctuation
		set _key to _string
	end try
	if _key contains "$" or _key contains "@" or _key contains "^" or _key contains "~" then
		set _key to last item of characters of _key
	end if
	
	set _code to 0
	set _maybe_sys_key to my lowercase(_key)
	
	repeat with _keycode in _codes
		if name of _keycode is equal to _maybe_sys_key then
			set _code to code of _keycode
		end if
	end repeat
	log (_code)
	
	
	tell application "System Events"
		tell process process_name
			if _code > 0 then
				key code _code using _mod
			else
				keystroke _key using _mod
			end if
		end tell
	end tell
end keyCmd
(* trigger a sequence of keystrokes
_sequence: Pass either a space separated string or a list of quoted keys
_delay: delay between characters, 0 for none
Usage: keySeq("character list with shortcut modifers", 0-9)
Example: 
Hit ⇧⌘K and type "test"
	keySeq("$@k t e s t")
	keySeq({"shift cmd k","t","e","s","t")
Select two words left
	keySeq({"shift opt left", "shift opt left"})
*)
on keySeq(_sequence, _delay)
	if class of _sequence is not list then
		set {astid, AppleScript's text item delimiters} to {AppleScript's text item delimiters, " "}
		set _sequence to every text item of _sequence
		set AppleScript's text item delimiters to astid
	end if
	repeat with _key in _sequence
		if _delay > 0 then delay _delay
		keyCmd(_key)
	end repeat
end keySeq
(* Type a string, no modifiers, with delay
_string: characters to type
_delay: float delay (0 for none) 
Usage: keyType("testing something out", 0.1)
*)
on keyType(_string, _delay)
	tell application "System Events"
		tell process process_name
			repeat with _chr in characters of _string
				if _delay > 0 then delay _delay
				
				keystroke _key
			end repeat
		end tell
	end tell
end keyType
-- example
set process_name to "TextEdit"
tell application process_name to activate
-- create a new doc, convert to rich text, type tab
keySeq("@n $@t tab", 1)
-- type out a sentence at a decent simulated typing speed
keyType("This is going to type out in TextEdit", 0.02)