По коду:
if (settings[0]) // Выбор тега снежинки в зависимсти от опции settings[0]
76 {
77 flake_tag = 'img';
78 } else {
79 flake_tag = 'div';
80 }
Я бы не использовал имэдж, а использовал только див с бэком или без.
70 var clientWidth = document.getElementById(settings[6]).clientWidth;
71 var clientHeight = document.getElementById(settings[6]).clientHeight;
91 var flake_obj = document.getElementById(settings[6]).appendChild(flake_obj);
Много раз обращаясь к этому методу ты замедляешь выполнение кода.
Лучше один раз получить элемнт, сохранить его в переменную и использовать.
function delete_flakes()
105{
106 for (var id=1; id<=settings[5]; id++)
107 {
108 var flake_obj = document.getElementById('flake' + id);
109 document.getElementById(settings[6]).removeChild(flake_obj);
110 }
111}
Делать на каждой итерации document.getElementById(settings[6]) - плохо.
function stop_snowfall()
157{
158 delete_flakes();
159 clearInterval(positions);
160}
Удаляешь снежинки, а в этот момент сработал интервал (так как он не отключен). Что будет??? Правильно:
var flake_obj = document.getElementById('flake'+i); /* Получаем объект снежинки */
Получим undefined/
121 flake_obj.left += (flake_obj.speedX + flake_obj.amplitude*Math.cos(flake_obj.top*flake_o bj.tempo))*dt;
получим ошибку, так как у undefined нет свойства .left