unit randomfromalbums;

interface
uses sysutils,graphics;


type tavail = record
album : integer;
track : integer;
end;


type TRandomCallback = function(c : integer) : boolean of object;


procedure InitRandom;
function AddAlbum(no : integer) : integer;
function RemoveAlbum(no : integer) : integer;
function makerandom(cb : TRandomCallback) : boolean;
function getrandomtrackcount : integer;


implementation
uses main;

var
avail : array of tavail;
trackcount : integer;



function getrandomtrackcount : integer;
begin
result:=trackcount;
end;

procedure InitRandom;
begin
setlength(avail,0);
trackcount:=0;
end;

function AddAlbum(no : integer) : integer;
var
n : integer;
begin
mainform.dalbumlist.itemindex:=no;
mainform.dalbumlistChange(nil);
for n:=0 to mainform.dtracklist.Items.Count-1 do begin
    inc(trackcount);
    setlength(avail,trackcount);
    avail[trackcount-1].album:=no;
    avail[trackcount-1].track:=n;
end;
result:=trackcount;
end;


procedure removeitem(i : integer);
var
n : integer;
begin
for n:=i to (trackcount-2) do begin
avail[n]:=avail[n+1];
end;
dec(trackcount);
setlength(avail,trackcount);
end;

function RemoveAlbum(no : integer) : integer;
var
found : integer;
n : integer;
begin


found:=-1;
for n:=0 to trackcount-1 do begin
    if avail[n].album=no then begin
       found:=n;
       break;
    end;
end;

if found=-1 then begin
 result:=trackcount;
 exit;
end;
mainform.dalbumlist.itemindex:=no;
mainform.dalbumlistChange(nil);

for n:=0 to mainform.dtracklist.items.count-1 do begin
    removeitem(found);
end;

result:=trackcount;
end;


procedure swappos(a,b : integer);
var
c : tavail;
begin
c:=avail[a];
avail[a]:=avail[b];
avail[b]:=c;
end;

function makerandom(cb : TRandomCallback) : boolean;
var
n, i : integer;
begin
randomize;
if trackcount=0 then  begin
result:=false;
exit;
end;

dice1:=tbitmap.create;
dice2:=tbitmap.create;
dice3:=tbitmap.create;
dice4:=tbitmap.create;
dice1.LoadFromResourceName(hinstance,'DICE1');
dice2.LoadFromResourceName(hinstance,'DICE2');
dice3.LoadFromResourceName(hinstance,'DICE3');
dice4.LoadFromResourceName(hinstance,'DICE4');

mainform.numberoftracks.enabled:=false;
 mainform.clearlistclick(nil);
   for n:=0 to trackcount-1 do begin
    i:=random(trackcount-1);
    swappos(n,i);
    mainform.dalbumlist.itemindex:=avail[n].album;
    mainform.dalbumlistchange(nil);
    mainform.dtracklist.itemindex:=avail[n].track;
    mainform.AddClick(nil);
    if cb(n)=true then break;
  end;
mainform.numberoftracks.enabled:=true;

dice1.free;
dice2.free;
dice3.free;
dice4.free;


result:=true;
end;

end.