#ifndef __FLTrack__H
#define __FLTrack__H

typedef struct FLTrack FLTrack;

#include "WimpLib:DocView.h"
#include "WimpLib:Sprites.h"
#include "MetaData.h"
#include "MetaScan.h"

#define FLTrack_Played          0x00000001
#define FLTrack_FailedToPlay    0x00000002
#define FLTrack_MustNotPlay     0x00000004
#define FLTrack_IsPlaylist      0x00000008
#define FLTrack_IsDir           0x00000010
#define FLTrack_DoNotAutoload   0x00000020
#define FLTrack_NeverPlay       0x00000040
#define FLTrack_Invalidated     0x00000080
#define FLTrack_IsUrl           0x00000100
#define FLTrack_ScanNames       0x00000200
#define FLTrack_Compilation     0x00000400
#define FLTrack_PlayAllSections 0x00000800
#define FLTrack_LoadMask        0x00000DFF
#define FLTrack_PlayedToday     0x80000000

#define Flag_TimVBlankMode               0x000001
#define Flag_TimNoInstSwap               0x000002
#define Flag_TimUltimateSTK              0x000004
#define Flag_TimIgnoreLastPatternLoops   0x020000
#define Flag_TimIgnoreRestartPos         0x040000
#define Flag_TimIgnoreSequenceEndMarkers 0x080000
#define Flag_TimDoNotPlayMutedChannels   0x100000

typedef enum
{ FLTrack_Type_FileList     = 1
, FLTrack_Type_Directory    = 2
, FLTrack_Type_YellowPage   = 3
, FLTrack_Type_File         = 8
, FLTrack_Type_Url          = 9
} FLTrack_ObjectType;

struct FileList;
//typedef struct FileList FileList;

FLTrack* throw_New_FLTrack(struct FileList* pOwner, unsigned int flags, const char* filename);
FLTrack* throw_New_FLTrack_Copy(struct FileList* pOwner, const FLTrack* pOldTrack);
FLTrack* throw_New_FLTrack_Link(struct FileList* pOwner, const FLTrack* pOldTrack);
void Delete_FLTrack(FLTrack*);

struct FileList* FLTrack_GetOwner(const FLTrack*);
const FLTrack* FLTrack_ResolveLink(const FLTrack* This);

struct FileList* FLTrack_GetSubList(const FLTrack*);
const MetaList* FLTrack_GetMeta(const FLTrack*);
const char* FLTrack_GetMetaString(const FLTrack* This, EMetaId id);
const char* FLTrack_GetInfo(const FLTrack*);
unsigned int FLTrack_GetOrder(const FLTrack*);
unsigned int FLTrack_GetRate(const FLTrack*);
unsigned int FLTrack_GetSection(const FLTrack*);
unsigned int FLTrack_GetVolume(const FLTrack*);
int FLTrack_GetPoints(const FLTrack*);
unsigned int FLTrack_GetRepeats(const FLTrack*);
unsigned int FLTrack_GetFlags(const FLTrack*);
unsigned int FLTrack_GetTimFlags(const FLTrack*);
const CSpriteHdr* FLTrack_GetClue(const FLTrack*);

const char* FLTrack_GetFilename(const FLTrack*);
const char* FLTrack_GetFullPathName(const FLTrack*);
const char* FLTrack_GetPathName(const FLTrack*);
const char* FLTrack_GetLeafName(const FLTrack*);
const char* FLTrack_GetTrackName(const FLTrack*);
MetaScan* FLTrack_GetScanner(const FLTrack*);
const char* FLTrack_GetScannerName(const FLTrack*);

FLTrack_ObjectType FLTrack_GetObjectType(const FLTrack*);
bool FLTrack_IsContainer(const FLTrack*);
bool FLTrack_IsPlayable(const FLTrack*);

void FLTrack_OpenFileDir(const FLTrack*);
void throw_FLTrack_DeleteFile(const FLTrack*);
void FLTrack_AttachSubList(FLTrack*, struct FileList* pSubList);

bool FLTrack_SetMetaText(FLTrack*, EMetaId id, EMetaOrigin o, const char* ps);
bool FLTrack_SetInfo(FLTrack*, const char* note);
bool FLTrack_SetOrder(FLTrack*, EMetaOrigin o, unsigned int order);
bool FLTrack_SetRate(FLTrack*, unsigned int rate);
bool FLTrack_SetSection(FLTrack*, unsigned int section);
bool FLTrack_SetVolume(FLTrack*, unsigned int volume);
bool FLTrack_SetPoints(FLTrack*, int points);
bool FLTrack_SetRepeats(FLTrack*, unsigned int repeats);
bool FLTrack_SetFlags(FLTrack*, unsigned int value, unsigned int mask);
bool FLTrack_SetTimFlags(FLTrack*, unsigned int value, unsigned int mask);
bool FLTrack_SetClue(FLTrack*, const CSpriteHdr*);
bool FLTrack_SetScannerName(FLTrack*, const char* id);

bool FLTrack_SetFilename(FLTrack*, const char* filename, bool bForce);
bool FLTrack_ScanFilename(FLTrack* This, MetaScan* pScanner);

unsigned int FLTrack_DecodeFlags(const char* pparams);
void FLTrack_DecodeParameters(FLTrack*, char* pparams);
void FLTrack_SaveParameters(const FLTrack*, char* pstring, bool bAll);

void FLTrack_RefreshViews(const FLTrack*, void* pSender, bool bSetAutoModified, bool bSetModified);
int FLTrack_IsValidUrl(const char* url);
#endif
