Код AS3:
if (groupCont.contains(sel_group[i]))
groupCont.removeChild(sel_group[i]);
if (sel_group[i])
pieceCont.addChild(sel_group[i]);
Очень плохая привычка. У тебя тут отступ, как-будто второй if вложен в первый, а по факту это два независимых блока. Но это вообще относится ко всему коду. Тут простор для багов просто огромный.
Кстати, проверка contains тоже не самый лучший вариант. Лучше проверяй поле parent.
И еще, за массивами замечено, то если удаляешь что-то из них в цикле, то это что-то может не удалиться сразу. После этого добавив что-то, ты задублируешь ссылку, а потом одна из них удалится. Какая именно не известно.
А вот это что за фигня?
Код AS3:
for (i = 0; i < sel_group.length; i++)
sel_group[i].checked = false;
// mark dropped pieces
for (i = 0; i < old_group.length; i++)
sel_group[i].checked = true;
Во втором цикле ты задаешь checked = true объекту, находящемуся в sel_group, а перебираешь old_group.
Это так задумано что ли? Или это опечатка? Уверен, что тут может падать) Вряд ли sel_group всегда совпадает с old_group до последнего индекса
И еще. Что ты пытаешься здесь сделать? Зачем там проверка if (sel_group[i]) ?
То есть ты пытаешься сначала этот объект откудато удалить (хотя по твоей же логике он может быть null) и только после этого проверяешь а не null ли он?
И зачем его удалть откуда-то, а потом снова добавлять? Метод addChild уже и так подразумевает удаление из любого другого контейнера
Код AS3:
for (i = 0; i < sel_group.length; i++) {
if (groupCont.contains(sel_group[i]))
groupCont.removeChild(sel_group[i]);
if (sel_group[i])
pieceCont.addChild(sel_group[i]);
}