//*************************
// ValueClass
//*************************

function value_LoadValue(Val)
    {
//    alert("LoadValue Val='"+Val+"' Values.length="+this.Values.length);
    this.SetIndex(Val);
    }

function value_SaveValue()
    {
    return this.CurrentIndex;
    }

function value_SetNextValue()
    {
    this.CurrentIndex++;
    if (this.CurrentIndex>=this.Values.length) this.CurrentIndex=0;
    }

function value_SetPrevValue()
    {
    this.CurrentIndex--;
    if (this.CurrentIndex<0) this.CurrentIndex=this.Values.length-1;
    }

function value_SetIndex(NewIndex)
    {
    this.CurrentIndex=NewIndex;
    this.CurrentValue=this.Values[NewIndex];
    }

function value(ValuesArray,InitialValueIndex)
    {
    this.Values=ValuesArray;
    this.CurrentValue=this.Values[InitialValueIndex];
    this.CurrentIndex=InitialValueIndex;
    this.SetIndex=value_SetIndex;

    this.LoadValue=value_LoadValue;
    this.SaveValue=value_SaveValue;
    this.SetNextValue=value_SetNextValue;
    this.SetPrevValue=value_SetPrevValue;
    }

//*************************
// FileClass
//*************************
function DuplicateFile()
    {
    var NewFile=new Object();
    NewFile.Path    =this.Path;
    NewFile.FileName=this.FileName;
    NewFile.Extension=this.Extension;
    NewFile.DateStr =this.DateStr;
    NewFile.TimeStr =this.TimeStr;
    NewFile.Size    =this.Size;
    NewFile.Artist  =this.Artist;
    NewFile.Album   =this.Album;
    NewFile.Genre   =this.Genre;
    NewFile.SongName=this.SongName;
    NewFile.TrackNumber=this.TrackNumber;
    NewFile.TimeLength=this.TimeLength;
    NewFile.LastPlayedDateStr=this.LastPlayedDateStr;
    NewFile.LastPlayedTimeStr=this.LastPlayedTimeStr;
    NewFile.NumTimesPlayed=this.NumTimesPlayed;
    NewFile.Bookmark=this.Bookmark;
    NewFile.Duplicate=DuplicateFile;
    return NewFile;
    }

function file(Path,FileName,Extension,DateStr,TimeStr,Size,SongName,Artist,Album,Genre,TrackNumber,TimeLength)
    {
    this.Path    =Path;
    this.FileName=FileName;
    this.Extension=Extension;
    this.DateStr =DateStr;
    this.TimeStr =TimeStr;
    this.Size    =Size;
    this.Artist  =Artist;
    this.Album   =Album;
    this.Genre   =Genre;
    this.SongName=SongName;
    this.TrackNumber=TrackNumber;
//    if (!TimeLength) {alert(FileName+" has not timelength");}
    this.TimeLength=TimeLength;
    this.Duplicate=DuplicateFile;
    this.LastPlayedDateStr="01/01/2001";
    this.LastPlayedTimeStr="12:01a";
    this.NumTimesPlayed=0;
    this.Bookmark=0;
    }

//*************************
//Item class
//*************************
function DuplicateItem()
    {
//    inspect(this);
    var NewItem=new Object();
    NewItem.Name    =this.Name;
    NewItem.Icon    =this.Icon;
    NewItem.SubMenu =this.SubMenu;
    NewItem.Action  =this.Action;
    NewItem.Selected=this.Selected;
    NewItem.File    =this.File;//.Duplicate();
//    alert("this.File.TimeLength="+this.File.TimeLength+"\n"+
//        "NewItem.File.TimeLength="+NewItem.File.TimeLength);
    NewItem.Notes   =this.Notes;
    NewItem.Duplicate=DuplicateItem;
    return NewItem;
    }

function item(Icon,Name,SubMenu,Action,Notes)
    {
    this.Name=Name;
    this.Icon=Icon;
    this.SubMenu=SubMenu;
    this.Action=Action;
    this.Selected=false;
    this.Duplicate=DuplicateItem;
    this.Notes=Notes;
    }

//*************************
//Menu class
//*************************

function menu_AddItem(Item)
    {
    Item.Selected=false;
    this.ItemsByName[Item.Name]=Item;
    this.Items[this.Items.length]=Item;
    return Item;
    }

function menu_AddItemIfUnique(Item)
    {
    if (this.ItemsByName[Item.Name])    return this.ItemsByName[Item.Name];
    else                                return this.AddItem(Item);
    }

function menu_AddItemAndGenSubMenu(Item)
    {
    if (!Item)          alert("AddItemAndGenSubMenu() Item="+Item.Name);
    if (!Item.SubMenu)  Item.SubMenu=new menu(Item.Icon,Item.Name);
    return this.AddItemIfUnique(Item);
    }

function menu_GetItemByName(Name)
    {
    if (!this.ItemsByName[Name])
        {
        alert("GetItemByName(\""+Name+"\") Error - item is not in Items array");
        }
    return this.ItemsByName[Name];
    }

function menu_GetCurrentItem()
    {
    return this.Items[this.CursorPos];
    }

function menu_SelectAll()
    {
    var I;
    for (I=0;I<this.Items.length;I++)
        this.Items[I].Selected=true;
    }

function menu_SelectNone()
    {
    var I;
    for (I=0;I<this.Items.length;I++)
        this.Items[I].Selected=false;
    }

function menu_InvertSelection()
    {
    var I;
    for (I=0;I<this.Items.length;I++)
        this.Items[I].Selected=!this.Items[I].Selected;
    }

function menu_GetNumItems()
    {
    return this.Items.length;
    }

function CompareItemNames(a,b)
    {
    var UpperA=a.Name.toUpperCase();
    var UpperB=b.Name.toUpperCase();
    if (UpperA<UpperB) return -1;
    if (UpperA==UpperB) return 0;
    return 1;
    }

function menu_SortMenu(SortType) //SortType="songname", "filename","pathfilename","random"
    {
    this.Items.sort(CompareItemNames);
    }

function menu(Icon,Name,Notes)
    {
    this.Notes=Notes;
    this.Icon=Icon;
    this.Name=Name;
//    this.ItemText=new Array();
    this.ItemsByName=new Array();
    this.Items=new Array();
    this.Selection=new Array();
    this.CursorPos=0;
    this.Offset=0;

    this.AddItemIfUnique=menu_AddItemIfUnique;
    this.GetCurrentItem =menu_GetCurrentItem;
    this.AddItem        =menu_AddItem;
    this.GetItemByName  =menu_GetItemByName;
    this.AddItemAndGenSubMenu=menu_AddItemAndGenSubMenu;
    this.SelectAll      =menu_SelectAll;
    this.SelectNone     =menu_SelectNone;
    this.InvertSelection=menu_InvertSelection;
    this.GetNumItems    =menu_GetNumItems;
    this.SortMenu       =menu_SortMenu;
    }
//**************************************
//**************************************

/*function GenerateHomogenousArray(Size,Value)
    {
    var Ret=new Array();
    var I;
    for (I=0;I<Size;I++)
        Ret[I]=Value;
    return Ret;
    }*/

function GenerateMenu(Icon,Name,Text,Icon,SubMenus)
    {
    var Menu=new menu(Icon,Name);

    for (var I=0;I<Text.length;I++)
        Menu.AddItem(new item(Icon,Text[I],SubMenus[I]));

    return Menu;
    }

//*************************
//JBMM UI class
//*************************
function ButtonNotImplemented()
    {
//    alert("ButtonNotImplemented()");
    }

function RefreshNotImplemented()
    {
    alert("RefreshNotImplemented()");
    }

function LockHold()
    {
    HoldReturnJBMMUI=CurrentJBMMUI;
    HoldLevel=0;
    CurrentJBMMUI=HoldUI;
    CurrentJBMMUI.RefreshDisplay();
    }

function jbmm_ui()
    {
    this.JBMMF1Hold=LockHold;
    this.JBMMF1=ButtonNotImplemented;
    this.JBMMF2=ButtonNotImplemented;
    this.JBMMF2Hold=ButtonNotImplemented;
    this.JBMMF3=ButtonNotImplemented;
    this.JBMMF3Hold=ImmediatlyRecord;
    this.JBMMOffHold=TurnOffJBMM;
    this.JBMMOff=ButtonNotImplemented;
    this.JBMMRight=ButtonNotImplemented;
    this.JBMMLeft=ButtonNotImplemented;
    this.JBMMUp=ButtonNotImplemented;
    this.JBMMUpHold=ButtonNotImplemented;
    this.JBMMDown=ButtonNotImplemented;
    this.JBMMDownHold=ButtonNotImplemented;
    this.JBMMPlayHold=ButtonNotImplemented;
    this.JBMMPlay=ButtonNotImplemented;
//    this.JBMMOn=ButtonNotImplemented;
    this.JBMMOn=GotoSetupMenu;
    this.JBMMOnHold=ButtonNotImplemented;
    this.RefreshDisplay=RefreshNotImplemented;
    }

