/**
Пусть для некоторого родительского узла с идентификатором $ID
существует пронумерованный список его дочерних узлов первого уровня.
Нумерация идет о 0 до n.
Обозначим I{} - некоторое поддерево, начинающиеся от дочернего узла i
первого уровня родительского узла с идентификатором $ID.
Обозначим J{} - некоторое поддерево, начинающиеся от другого дочернего узла j
первого уровня того же родительского узла с идентификатором $ID.
Тогда функция ChangeOrder($ID,$i,$j) перемещает поддерево I{} соответствующие номеру i
на место поддерева J{} соответсвующего номеру j. Причем если перемещение идет в направление
возрастания номеров (j>i) то поддерево J{} и идущие до него поддеревья смещаются к началу спика.
А если (j<i) то поддерево J{} и следующие за нм смещаются к концу списка.
*/
function ChangeOrder($ID,$i,$j){
$res=$this->enumChildren($ID);
$children=$this->db->result2array($res);
$n=count($children);
if ($i==$j) return false;
if (($i>$n-1 ) || ($i<0) ) return false;
if (($j>$n-1 ) || ($j<0) ) return false;
$nodeI=$this->getElementInfo($children[$i][$this->id]);
$nodeI[$this->id]=$children[$i][$this->id]; $nodeI[$this->left]=$nodeI[0]; $nodeI[$this->right]=$nodeI[1];
$nodeJ=$this->getElementInfo($children[$j][$this->id]);
$nodeJ[$this->id]=$children[$j][$this->id]; $nodeJ[$this->left]=$nodeJ[0]; $nodeJ[$this->right]=$nodeJ[1];
$i_sum=$nodeI[$this->right]-$nodeI[$this->left]+1;
if ($j>$i) { // перенос от начала к концу списка
$ij_sum=$nodeJ[$this->right]-$nodeI[$this->right];
$sql="UPDATE IGNORE {$this->table} SET
{$this->left}=IF({$this->left}>={$nodeI[$this->left]} AND {$this->right}<={$nodeI[$this->right]},
{$this->left}+$ij_sum,
IF(( {$this->left}>{$nodeI[$this->right]} ) AND ( {$this->right}<={$nodeJ[$this->right]}),{$this->left}-$i_sum,{$this->left})
),
{$this->right}=IF({$this->left}>={$nodeI[$this->left]} AND {$this->right}<={$nodeI[$this->right]},
{$this->right}+$ij_sum,
IF(( {$this->left}>{$nodeI[$this->right]} ) AND ( {$this->right}<={$nodeJ[$this->right]}),{$this->right}-$i_sum,{$this->right})
)
";
if(!$this->db->query($sql)) return false;
}
else
{ // перенос от конца в начало
$ij_sum=$nodeI[$this->left]-$nodeJ[$this->left];
$sql="UPDATE IGNORE {$this->table} SET
{$this->left}=IF({$this->left}>={$nodeI[$this->left]} AND {$this->right}<={$nodeI[$this->right]},
{$this->left}-$ij_sum,
IF(( {$this->left}>={$nodeJ[$this->left]} ) AND ( {$this->right}<{$nodeI[$this->left]}),{$this->left}+$i_sum,{$this->left})
),
{$this->right}=IF({$this->left}>={$nodeI[$this->left]} AND {$this->right}<={$nodeI[$this->right]},
{$this->right}-$ij_sum,
IF(( {$this->left}>={$nodeJ[$this->left]} ) AND ( {$this->right}<{$nodeI[$this->left]}),{$this->right}+$i_sum,{$this->right})
)
";
if(!$this->db->query($sql)) return false;
}
return true;
} // func