For me this:
var pattern = /^([a-zA-Z])([a-zA-Z0-9_ -]){1,80}$/;
works.
Maybe you ran into the issue with trying it like this ?
var pattern = /^([a-zA-Z])([a-zA-Z0-9_- ]){1,80}$/;
and the regex Parser thought you ment "underscore to spacebar" and not "underscore dash and spacebar ?
(Didn't test that)
Edit
Did a little testing
<script>
alert(/^([a-zA-Z])([a-zA-Z0-9_-]){1,80}$/.test("Aa232423"));
// true
alert(/^([a-zA-Z])([a-zA-Z0-9_ -]){1,80}$/.test("Aa232 423"));
// true
alert(/^([a-zA-Z])([a-zA-Z0-9_- ]){1,80}$/.test("Aa232423"));
// parser error: invalid range in character set
</script>
Do i guess i was right with my assumption ;)
Secound Edit in Response to OPs Comment:
<script>
alert(/^([a-zA-Z])([a-zA-Z0-9_ -]){1,80}$/.test("Aa232-423"));
//true
alert(/^([a-zA-Z])([a-zA-Z0-9_ -]){1,80}$/.test("Aa232-42 3"));
//true
</script>