%def .list_reorder>
<%init>
#require Storable;
my $sql = qq[SELECT ss_soc, ss_div, ss_order FROM bladberi.pb_ordered_list WHERE pb_id = ? AND quarter_id = ? ORDER BY ss_order];
my $cur_soclist = $dbh->selectall_arrayref($sql, {}, $user_id, $quarter_id);
#my $was_soclist = Storable::dclone($cur_soclist);
my @newlist;
my $slot;
$slot = $ARGS{inp_slot} if ($ARGS{inp_slot});
if (defined($ARGS{inp_slot}))
{
# boundary check 1.
return "" if ($slot <= 0);
# boundary check 2.
return "" if ($slot >= @$cur_soclist);
}
my $in_array = sub {
my $needle = shift;
my @haystack = @_;
foreach my $straw (@haystack)
{
return 1 if ($needle eq $straw);
}
return 0;
};
# abstract ašferš:
# 1. finna śt hvaša order range viš erum aš vinna meš.
# 2. finna hįpunkt og lįgpunkt
# 3. finna SOC fyrir gildiš sem upptekur [hįpunkt/lįgpunkt][+/-]1
# 4. constructa nżjan lista žar sem SOC fyrir hįpunkt+1 er stillt meš order lįggildis
# 5. incrementa order į öllu range sem į aš breyta
# 1.
my ($highv,$lowv,$highk,$lowk,$n);
$n = 0;
foreach my $row (@$cur_soclist)
{
foreach my $newsoc (@$soclist)
{
if ($newsoc eq $row->[0])
{
unless ($row->[2] <= $highv)
{
$highv = $row->[2];
$highk = $n;
}
unless ($row->[2] >= $lowv && $lowv)
{
$lowv = $row->[2];
$lowk = $n;
}
}
}
$newlist[$n] = $row;
$n++;
}
# boundary check 3.
return "" if ($highk >= (@$cur_soclist - 1) && $direction eq 'down');
# boundary check 4.
return "" if ($lowk <= 1 && $direction eq 'up');
#print "high=$highv (slot:$highk)\n";
#print "low=$lowv (slot:$lowk)\n";
#print "highsoc = " . $newlist[$highk]->[0] . " (order: $lowv)\n";
#print "lowsoc = " . $newlist[$lowk]->[0] . " (order: $highv)\n";
if ($direction eq 'up')
{
foreach my $row (@newlist)
{
if ($row->[2] >= $lowv && $row->[2] <= $highv)
{
# print "working on element: " . $row->[0] . "\n";
$row->[2] -= 1;
}
}
$newlist[$lowk-1]->[2] = $highv;
}
elsif ($direction eq 'down')
{
foreach my $row (@newlist)
{
if ($row->[2] >= $lowv && $row->[2] <= $highv)
{
# print "working on element: " . $row->[0] . "\n";
$row->[2] += 1;
}
}
$newlist[$highk+1]->[2] = $lowv;
}
elsif ($direction eq 'slot')
{
my @targetslots;
# print "soclist=" . join(',', @$soclist) . "
\n";
foreach my $row (@$cur_soclist)
{
# print "working on row:" . $row->[0] . " slot:" . $row->[2] . "
\n";
if ($in_array->($row->[0], @$soclist))
{
push(@targetslots, $row->[2]+($slot-$lowv));
# print "added " . $targetslots[@targetslots-1] . " to \@targetslots
\n";
}
}
@newlist = ();
my $j = 1;
foreach my $row (@$cur_soclist)
{
if ($in_array->($row->[0], @$soclist))
{
$row->[2] += ($slot-$lowv);
push(@newlist, $row);
next;
}
while ($in_array->($j, @targetslots))
{
$j++;
}
$row->[2] = $j++;
push(@newlist, $row);
}
}
foreach my $row (@newlist)
{
# my $was;
next if !$row->[0];
$dbh->do("UPDATE bladberi.pb_ordered_list SET ss_order = ? WHERE ss_soc = ? AND ss_div = ? AND pb_id = ? AND quarter_id = ?", {}, $row->[2], $row->[0], $row->[1], $user_id, $quarter_id);
}