I hit the same problem of crossing edges when doing this a while ago (in Python rather than JavaScript).
Rather than trying to get everything done automatically by the code I added the ability to click and drag a point. So the algorithm gets you close to a good layout and you can then make adjustments to avoid unwanted crossings.
Just remembered this discussion http://news.ycombinator.com/item?id=1218376 also featured a force-directed graph layout algorithm, with brief paper and all. Just in case you missed it.
I hit the same problem of crossing edges when doing this a while ago (in Python rather than JavaScript).
Rather than trying to get everything done automatically by the code I added the ability to click and drag a point. So the algorithm gets you close to a good layout and you can then make adjustments to avoid unwanted crossings.
It reminds me of an old HN comment "think cyborg, not robot" (http://news.ycombinator.com/item?id=164833).