A parte il tuo problema, ma qui anche le esprssioni regolari non vanno:

var pattern =/[0-9,|, +, --, =, <, >, !=, (, ), %, @, #, *]/ ;

perchè le virgole e gli spazi?
Nelle espressioni regolari gli spazi non sono opzionali, ma significano esattamente: qui uno spazio.

Se la metti dentro parentesi quadre, non è come per le funzioni che devi separare gli "argomenti" con una virgola. Devi mettere (fra parentesi QUADRE) i caratteri in sequenza senza virgole o spazi, il trattino segnala invece un range di caratteri o alfabetici o numerici 0-9a-zA-Z o anche, semmai, a-d 3-6. In tal caso per segnalare invece il trattino come tale e non come indicante un range, gli premetti il carattere di escape: \-

perchè le parentesi attorno ad una virgola?

Cioè guarda quando metti i caratteri in una espressione regolare fra parentesi quadre, significa che cerchi un qualsiasi carattere che sia fra quelli messi.

Inoltre, non ti permette di trovare combinazioni di simboli come != ma solo simboli isolati
Se tu hai messo !=
con la idea di trovare: !=
no, ti ritornerà true per qualsiasi istanza ISOLATA di ! o di =

per cui, semmai

var pattern =/[0-9|+\-,<>!=%@#*]/ ;

Inoltre i campi msg1 ecc:
document.getElementById('msg1')

io nell' html non li vedo.

Poi:
<button

no non esiste button nell' html del w3 esiste <input type="button"
un browser non è tenuto a interpretare correttamente il tag <button> perchè NON è nelle specifiche del w3

men che meno esiste un <button type="submit"
ma un
<input type="submit" value="cliccami" onclick="" />

Non è che non funziona su explorer, non dovrebbe funzionare da nessuna parte.