Well most of the things you can hack around. Take finding the thread's ID, for instance; it's not always in the URL, so I use this code:
Code:
ocuk.threadId = selectSingleNode(doc, doc, "//input[@type = 'hidden' and @name = 'searchthreadid']").value;
to get it out of the search form's hidden input. It's mainly stuff like that, hacking around the problems you find. Most of it's pretty straightforward though.
As for the language, all Firefox extensions are coded in Javascript and
XUL. This is the biggest thing I've ever written in pure JS but I've been pretty comfortable with it for a while. It's just getting used to the things that are different between writing JS for content and JS for XUL
and content.