﻿var FS = 
{ 
    Root:0, IsRoot: function() { return this.Current == FS.Root; },
    Folder:1, IsFolder: function() { return this.Current == FS.Folder; },
    Public:2, IsPublic: function() { return this.Current == FS.Public; },
    MyLog:3, IsMyLog: function() { return this.Current == FS.MyLog; },
    ReceivedFriends:4, IsReceivedFriends: function() { return this.Current == FS.ReceivedFriends; },
    GuestLog:5, IsGuestLog: function() { return this.Current == FS.GuestLog; },
    FriendsLog:6, IsFriendsLog: function() { return this.Current == FS.FriendsLog; },
    
    States: ["Root","Folder","Public","MyLog","ReceivedFriends","GuestLog","FriendsLog"],
    PreCaption: ["","","Public Exercises","My Log","Received from Friends","","Friends' Logs"],
    PostCaption: ["","","","","","'s Log",""],
    Current:-1, toString: function() { return FS.States[this.Current]; },
    Caption:"", // main part of caption such as friend's name
    Sub:null, // sub-context such as id of friend for GuestLog
    
    Set: function(cur, sub, caption) 
        { 
            FS.Current = cur; 
            FS.Caption = (caption == null) ? "" : caption; 
            FS.Sub = sub; 
            $('FolderCaption').innerHTML = FS.PreCaption[cur] + FS.Caption + FS.PostCaption[cur];
            RefreshExerciseList();
        },
    IsSpecial: function() { return this.Current==FS.Public || this.Current==FS.MyLog || this.Current==FS.ReceivedFriends; },
    CanSave: function() { return this.Current==FS.Folder || this.Current==FS.MyLog || (this.Current==FS.Root && PublicUser); }
};

var CurrentFolder = null;

function RefreshExerciseList()
{
    ShowHide(null, $('GoLogFolder'));
    ShowHide(null, $('GoReceivedFriendsFolder'));
    SetShow($('GoPublicFolder'), FS.IsRoot());
    SetShow($('GoCreateFolder'), !FS.IsSpecial() && !FS.IsGuestLog() && !FS.IsFriendsLog());
    SetShow($('GetFriendApproval'), FS.IsFriendsLog());
    SetShow($('GoParentFolder'), !FS.IsRoot());//- && !FS.IsGuestLog());
    SetShow($('GoFriendLogFolder'), FS.IsRoot());

    //-SetShow($('ExercisePath'), FS.IsRoot() || FS.IsFolder());
    //-SetShow($('PublicFolder'), FS.IsPublic());
    //-SetShow($('ReceivedFriends'), FS.IsReceivedFriends());
    //-SetShow($('LogPath'), FS.IsMyLog() || FS.IsGuestLog());
    //-SetShow($('ExercisePath'), !FS.IsMyLog() && !FS.IsGuestLog());
    //-SetShow($('LogPathContainer'), FS.IsMyLog() || FS.IsGuestLog());
    //-SetShow($('LogFolder'), FS.IsMyLog());

    var s = [], i;
    CurrentFolder = null;
    if (FS.IsFriendsLog())
    {
        //if (IsFacebook)
        {
            var friends = eval($('FriendList').innerHTML);
            var friendsmenu = [];
            if (typeof(friends) != "undefined") //PATCH: some time we get an empty friends...
            for (var i = 0; i < friends.length; i++)
                if (typeof(friends[i]) != "undefined")
                {
                    //friendsmenu.push({ Text:friends[i].Name, Action:(friends[i].HasLog ? ShowFriendLog : null), Data:friends[i] });
                    var data = "{ID:\"" + friends[i].ID + "\",Name:\"" + friends[i].Name + "\"}";
                    if (friends[i].HasLog)
                        s.push( "<div onclick='OpenFriendLogFolder(" + data + ")' " + 
                                "oncontextmenu='return false' " +
                                " class='CutText' style='cursor:pointer; width:" + FILE_ENTRY_WIDTH + "px' " +
                                "onmouseenter='ExerciseListEnter()' onmouseleave='ExerciseListLeave()' " +
                                "><img src='Images/friend.png' /> <span>" + friends[i].Name.replace(/ /g, "&nbsp;") + "</span></div>");
                    else
                        s.push( "<div oncontextmenu='return false' " +
                                " class='CutText' style='cursor:arrow; width:" + FILE_ENTRY_WIDTH + "px;color:gray' " +
                                "><img src='Images/friend.png' /> <span style='cursor:arrow'>" + friends[i].Name.replace(/ /g, "&nbsp;") + "</span></div>");
                }
            $('ExerciseList').innerHTML = s.join("");
        }
    }
    else
    ajax("Handler.ashx?act=getexercises&path=" + GetPath() + "&fs=" + FS.toString() + (FS.Sub == null ? "" : ("&sub=" + FS.Sub)),
        null,
        function(resp)
        { 
            if (resp != null)
            {
                CurrentFolder = resp;
                SetShow($('GoLogFolder'), FS.IsRoot() && resp.HasLog);
                SetShow($('GoReceivedFriendsFolder'), FS.IsRoot() && (resp.ReceivedFriends != "none"), resp.ReceivedFriends == "new");
                if ("Folders" in resp)
                {
                    for (i = 0; i < resp.Folders.length - 1; i++) // last item is null
                        s.push( "<div onclick='OpenFolder(this.lastChild.innerText.replace(/&nbsp;/g, \" \"))' oncontextmenu='return false' " +
                                ((FS.IsPublic() || resp.Folders[i] == "My Exercises") 
                                    ? "" : "onmousedown='CreateFolderItemContextMenu()'") +
                                " class='CutText' style='cursor:pointer; width:" + FILE_ENTRY_WIDTH + "px' " +
                                "onmouseenter='ExerciseListEnter()' onmouseleave='ExerciseListLeave()' " +
                                "><img src='Images/folder.png' /> <span>" + resp.Folders[i].replace(/ /g, "&nbsp;") + "</span></div>");
                }
                if ((FS.IsMyLog() || FS.IsGuestLog()) && ("Exercises" in resp))
                {
                    for (i = 0; i < resp.Exercises.length - 1; i++) // last item is null
                        s.push( "<div onclick='TryOpenExercise(\"My Log\\\\" + resp.Exercises[i].FullName.replace(/&nbsp;/g, " ") + "\")' oncontextmenu='return false' " +
                                ((FS.IsPublic() || FS.IsGuestLog()) ? "" : "onmousedown='CreateLogItemContextMenu()'") +
                                " style='cursor:pointer' " +
                                "onmouseenter='LogListEnter()' onmouseleave='LogListLeave()' " +
                                "fullname='My Log\\" + resp.Exercises[i].FullName + "'" +
                                "comment='" + resp.Exercises[i].Comment + "'>" +
                                "<table><tr>" +
                                "<td width=55px style='font-size:x-small; color:gray'>" + toDDMMMYY(resp.Exercises[i].DateTime) + "</td>" +
                                "<td width=35px style='font-size:x-small; color:gray; text-align:right'>" + toHHMM(resp.Exercises[i].DateTime) + "</td>" +
                                "<td>&nbsp;</td>" +
                                "<td><div class='CutText' style='width:140px'>" + resp.Exercises[i].Name.replace(/ /g, "&nbsp;") + "</div></td></tr></table></div>");
                }
                else
                {
                    if ("Exercises" in resp)
                        for (i = 0; i < resp.Exercises.length - 1; i++) // last item is null
                            s.push( "<div onclick='TryOpenExercise(this.innerText.replace(/&nbsp;/g, \" \"))' oncontextmenu='return false' " +
                                    (FS.IsPublic() ? "" : "onmousedown='SelectItem(this);CreateExerciseItemContextMenu()'") +
                                    " class='CutText' " +
                                    "style='cursor:pointer; width:" + FILE_ENTRY_WIDTH + "px" + (resp.Exercises[i].Changed ? "; color:red; font-weight:bold" : "") + "' " +
                                    "onmouseenter='ExerciseListEnter()' onmouseleave='ExerciseListLeave()' " +
                                    ">" + resp.Exercises[i].Name.replace(/ /g, "&nbsp;") + "</div>");
                }
                $('ExerciseList').innerHTML = s.join("");
            }
        }
    );
}

function GetPath(tail)
{
    var path = ""; // if not logged-in, leave empty and server will use a session-specific temporary folder
    if (FS.IsReceivedFriends())
        path = "Received From Friends";
    else if (FS.IsFolder())
        path = FS.Sub;
    if (tail != null)
    {
        if (path.substring(path.length - 1) != '/')
            path += '/';
        path += tail;
    }
    return path.substring(0,1) == '/' ? path.substring(1) : path;
}

function OpenFolder(subfolder)
{
    FS.Set(FS.Folder, GetPath(subfolder), GetPath(subfolder));
    //-var folderpath = $("FolderPath").innerText;
    //-$("FolderPath").innerText = "/" + GetPath(subfolder);
    //-RefreshExerciseList();
}

function OpenParentFolder()
{
    if (FS.IsGuestLog())
        OpenFriendsLogFolder();
    //-else if (FS.IsSpecial())
    //-    OpenRootFolder();
    else if (FS.IsFolder())
    {
        var folderpath = FS.Sub;
        folderpath = folderpath.substring(0, folderpath.lastIndexOf('/'));
        if (folderpath != "")
            FS.Set(FS.Folder, folderpath, folderpath);
//-        {
//-            $("FolderPath").innerText = folderpath;
//-            RefreshExerciseList();
//-        }
        else
            OpenRootFolder(true);
    }
    else
        OpenRootFolder();
}

function OpenRootFolder()
{
    FS.Set(FS.Root);
    //-$("FolderPath").innerText = "/";
    //?if (refresh)
    //?    RefreshExerciseList();
}

function OpenPublicFolder()
{
    FS.Set(FS.Public);
    //-RefreshExerciseList();
}

function OpenReceivedFriendsFolder()
{
    FS.Set(FS.ReceivedFriends);
    //-RefreshExerciseList();
}

function OpenLogFolder(title)
{
    FS.Set(FS.MyLog);
    //-$('LogsTitle').innerText = (title != null) ? title : "My Log";
    //-RefreshExerciseList();
}

function OpenFriendsLogFolder()
{
    FS.Set(FS.FriendsLog);
    //-RefreshExerciseList();
}

function OpenFriendLogFolder(friend)
{
    FS.Set(FS.GuestLog, friend.ID, friend.Name);
    //-$('LogsTitle').innerText = friend.Name + "'s Log";
    //-RefreshExerciseList();
}

function CreateFolder()
{
    UserInput("Enter folder name",
        function(resp)
        {
            if (resp != null)
            {
                UserNotify("Creating folder");
                ajax("Handler.ashx?act=createfolder&path=" + GetPath(resp),
                    null,
                    function()
                    {
                        UserNotifyClose();
                        RefreshExerciseList();
                    }
                );
            }
        },
        "", FolderNameValidate
    );
}

function GetFriendApproval()
{
    UserInput("Enter friend's email",
        function(resp)
        {
            if (resp != null)
            {
                UserNotify("Getting friend's approval...");
                ajax("Handler.ashx?act=getfriendapproval&email=" + resp,
                    null,
                    function(resp)
                    {
                        UserNotifyClose();
                        if (resp != null) // if no errors
                            UserAlert("Your friend will receive an email asking his permission to view his log");
                    }
                );
            }
        },
        "", null
    );
}

function CreateExerciseItemContextMenu()
{
    if (event.button == 2)
    {
        if (LoginUserID == "Public")
        CreateContextMenu([
            { Text:'Rename', Action:RenameExercise },
            { Text:'Delete', Action:DeleteExercise },
            { Text:'Accept', Action:AcceptPublicExercise }
            ]);
        else
        CreateContextMenu([
            { Text:'Rename', Action:RenameExercise },
            { Text:'Delete', Action:DeleteExercise },
            //{ Text:'Facebook Favorites', Action:AddExerciseToFavorites },
            { Text:'Share with Friend', Action:ShareFriend },
            //{ Text:'Share with FaceBook Group', Action:ShareGroup },
            { Text:'Share with Public', Action:SharePublic }
            ]);
    }
}

function CreateLogItemContextMenu()
{
    if (event.button == 2)
    {
        CreateContextMenu([
            { Text:'Delete', Action:DeleteLog }
            ]);
    }
}

function CreateFolderItemContextMenu()
{
    if (event.button == 2)
    {
        CreateContextMenu([
            { Text:'Rename', Action:RenameFolder },
            { Text:'Delete', Action:DeleteFolder }
            ]);
    }
}

function SelectItem(item)
{
    if (contextitem != null)
        contextitem.style.backgroundColor = "";
    contextitem = item;
    if (contextitem != null)
        contextitem.style.backgroundColor = "LightGrey";
}
function ExerciseListLeave()
{
    if (!IsContextMenuOpen()) 
        SelectItem(null);
}
function ExerciseListEnter()
{
    if (!IsContextMenuOpen()) 
        SelectItem(event.srcElement);
}

function LogPopup() { return /*FS.IsGuestLog() ? $('GuestLogPopup') :*/ $('MyLogPopup'); }

function LogListEnter()
{
    ExerciseListEnter();
    var exeritem = event.srcElement;
    if (exeritem.comment != "")
    {
        LogPopup().innerText = exeritem.comment;
        ShowHide(LogPopup());
    }
}
function LogListLeave()
{
    ExerciseListLeave();
    ShowHide(null, LogPopup());
}

function DeleteFolder()
{
    var foldername = contextitem.lastChild.innerText;
    ajax("Handler.ashx?act=folderhascontent&path=" + GetPath(foldername), null,
        function(resp)
        {
            if (resp.FolderHasContent)
                UserConfirm(foldername + " is not empty. Delete?", 
                    function(okay)
                    {
                        if (okay)
                            ajax("Handler.ashx?act=deletefolder&path=" + GetPath(foldername),
                                null, function(resp) { RefreshExerciseList(); });
                    });
            else
                ajax("Handler.ashx?act=deletefolder&path=" + GetPath(foldername),
                    null, function(resp) { RefreshExerciseList(); });
        }
    );
}

function RenameFolder()
{
    var foldername = contextitem.lastChild.innerText;
    UserInput("New folder name for " + foldername, 
        function(response) 
        { 
            if (response != null)
            {
                ajax("Handler.ashx?act=renamefolder&oldpath=" + GetPath(foldername) + "&newpath=" + GetPath(response),
                    null, function(resp) { RefreshExerciseList(); });
            }
        },
        "", FolderNameValidate
    );
}

function DeleteExercise()
{
    var exercisename = contextitem.innerText;
    UserConfirm("Delete exercise " + exercisename + "?", 
        function(okay)
        {
            if (okay)
                ajax("Handler.ashx?act=deleteexercise&exername=" + GetPath(exercisename),
                    null, function(resp) { RefreshExerciseList(); });
        }
    );
}

function DeleteLog()
{
    var exercisename = contextitem.innerText;
    UserConfirm("Delete exercise " + exercisename + "?", 
        function(okay)
        {
            if (okay)
                ajax("Handler.ashx?act=deleteexercise&exername=" + contextitem.fullname, null, 
                    function(resp) 
                    { 
                        if (resp != null && resp.LogDirectoryDeleted)
                            OpenParentFolder(); // Go to parent folder, as there is no log folder
                        else
                            RefreshExerciseList(); 
                    });
        }
    );
}

function RenameExercise()
{
    var exercisename = contextitem.innerText;
    UserInput("New exercise name for " + exercisename, 
        function(response) 
        { 
            if (response != null)
            {
                SetExerName(response);
                ajax("Handler.ashx/" + GetPath(exercisename) + "?act=renameexercise&newname=" + response + "&exer=" + exerState(),
                    null, function(resp) { RefreshExerciseList(); });
            }
        },
        "", ExerciseNameValidate
    );
}

function AddExerciseToFavorites()
{
    var exercisename = contextitem.innerText;
    UserNotify("Listing exercise in Facebook Favorites...");
    ajax("Handler.ashx/" + GetPath(exercisename) + "?act=addexercisetofavorites",
        null, function(resp) 
        { 
            UserNotifyClose(); 
            RefreshExerciseList(); 
            UserAlert("Exercise was added to Facebook Favorites.");
        }
    );
}

function ShareFriend()
{
    var exercisename = contextitem.innerText;
    //var exercisename = ExerName;
    if (IsFacebook) // facebook users are presented with a checked listbox of friends
    {
        OpenFBShareFriendDialog(exercisename, eval($('FriendList').innerHTML));
    }
    else // web version require user to know his friend's email
        UserInput("Share " + exercisename + " with friend (email)", 
            function(response) 
            { 
                if (response != null)
                {
                    UserNotify("Sharing exercise...");
                    ajax("Handler.ashx/" + GetPath(exercisename) + "?act=share&email=" + response,
                        null, function(resp) { UserNotifyClose(); });
                }
            }
        );
}

function SharePublic()
{
    var exercisename = contextitem.innerText;
    //var exercisename = ExerName;
    UserNotify("Submitting " + exercisename + " to Public Folder...");
    ajax("Handler.ashx/" + GetPath(exercisename) + "?act=share",
        null, function(resp) { UserNotifyClose(); UserAlert("Exercise submitted"); });
}

function ShareGroup()
{
    //ShareGroupDialog(null, function() {});
    UserAlert("Share with Groups is a Facebook feature only.");
}

//function ShareExercise()
//{
//    if (ExerName == "Default")
//    {
//        UserAlert("Cannot share the Default exercise.");
//        return;
//    }
//    var pos = FindPosition(ShareButton);
//    window.setTimeout(
//        function(){
//            CreateContextMenu([
//                { Text:'Friend', Action:ShareFriend },
//                { Text:'Group', Action:ShareGroup },
//                { Text:'Public', Action:SharePublic }
//                ],
//                { x:pos.x, y:pos.y+ShareButton.offsetHeight }
//                );}
//        , 100);
//}

function AcceptPublicExercise()
{
    var exercisename = contextitem.innerText;
    UserNotify("Accepting " + exercisename + " to Public Folder...");
    ajax("Handler.ashx/" + GetPath(exercisename) + "?act=acceptpublic",
        null, function(resp) { UserNotifyClose(); RefreshExerciseList(); });
}
