﻿
$(document).ready(function () {
    Extend.Init();
    Chat.GetChatHTML();
    Chat.GetChatStatus(function(){});
});
Extend = {
    Init: function () {
        String.prototype.Replace = function (strOld, strNew) {
            var strReplaceOutput = this;
            while (strReplaceOutput.indexOf(strOld, 0) > -1) {
                strReplaceOutput = strReplaceOutput.replace(strOld, strNew);
            }
            return strReplaceOutput.toString();
        };
    }
},
UserTypeCheck = {
    Init: function () {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=CheckLoggedInUserType",
            type: "post",
            dataType: "text",
            success: function (Result) {
                if (Result == "Staff") {
                    Staff.Init();
                } else if (Result == "User") {
                    User.Init();
                }
            }
        });
    }
},
User = {
    Init: function () {
        Chat.Init();
        Chat.GetOnlineDepartments();
        Chat.HideCurrentUserChatRequest();
    }
},
Staff = {
    Init: function () {
        Chat.Init();
        Chat.GetCurrentUserChatRequests();
        Chat.GetOnlineUsers();
    }
},
MessagesArea = {
    Init: function () {
        if (this.Messages.length > 0) {
            this.AddMessages();
        }
    },
    Messages: null,
    AddMessages: function () {
        for (var i = 0; i < this.Messages.length; i++) {
            var Text = $("<p>").attr('lang', 'fa').attr('dir', 'rtl');
            var Message = $("<div>").attr('class', 'Message');
            var SenderName = $("<span>").attr('class', 'Name').text(this.Messages[i].FullName + ": ");
            var Txt = $("<span>").attr('class', 'Txt').text(this.Messages[i].Message).attr('class', 'Text');

            Text.append(SenderName);
            Text.append(Txt);
            Message.append(Text);

            $("#ChatSection .Messages").append(Message);

            var Messages = $("#ChatSection .Messages");
            Messages.scrollTop(9999999999999);
        }
    },
    ClearMessageBox: function () {
        var Message = $("#MessageTextForm").find("input[name=Message]");
        Message.val("");
    }
},
UsersInChatArea = {
    Conversations: null,
    Init: function (Conversations) {
        this.Conversations = Conversations;
        this.LoadChatUsersInfo();
    },
    ChatUsers: [],
    AddedIDs: [],
    LoadChatUsersInfo: function () {
        var ConversationCount = this.Conversations.length;
        if (ConversationCount > 0) {
            for (var i = 0; i < ConversationCount; i++) {
                Chat.GetUserFromSessionByUserIDToJson(this.Conversations[i].SenderID, i);
            }
        }
    },
    AddToList: function (i) {
        var ListItem = $('<li>');
        var SenderID = this.Conversations[i].SenderID;
        var ConversationID = this.Conversations[i].ID;
        if ($.inArray(SenderID, this.AddedIDs) == -1) {
            var CloseConversationButton = $("<span>").addClass("CloseConversation").text("x").attr('title', 'پایان گفتگو');
            var Anchor = $('<a>').attr('href', '').attr('class', 'ChangeChatUser').attr('ReceiverID', SenderID).attr('ConversationID', ConversationID);
            Anchor.text(this.ChatUsers[SenderID].FullName);
            Anchor.append(CloseConversationButton);
            ListItem.append(Anchor);
            $("#UsersInChat .List").append(ListItem);
            this.AddedIDs[i] = SenderID;
        }
    },
    CloseConversation: function (Options) {
        Chat.CloseConversation(Options.ConversationID);
        ChatWindow.RemoveUser(Options);
    }
},
ChatWindow = {
    Init: function (Options) {
        this.HighlightCurrentUser(Options);
    },
    HighlightCurrentUser: function (Options) {
        $("#UsersInChat .List li").removeClass('SelectedChatUsers');
        $("#UsersInChat .List").find("a[receiverid=" + Options.RecieverID + "]").parent().addClass('SelectedChatUsers');
    },
    RemoveUser: function (Options) {
        $("#UsersInChat .List").find("a[receiverid=" + Options.RecieverID + "]").parent().fadeOut(500).remove(function () {
            ChatWindow.CheckUsersInChatArea();
        });
    },
    CheckUsersInChatArea: function () {
        var ListCountUsers = $("#UsersInChat .List li").length;
        if (ListCountUsers < 1) {
            $("#UsersInChat").remove();
        }
    }
}
LoggedInUser = null,
CurrentConversations = null,
Chat = {
    Init: function () {
        Chat.GetLoggedInUser();
        Chat.SetUserStatus();
        Chat.CheckConversation();
        Chat.BindEvents();
    },
    Enabled: null,
    GetChatHTML: function () {
        $.get('Contents/Themes/common/chat.html', function (Result) {
            $('body').prepend(Result);
            if (Chat.Enabled == true) {
                Chat.ShowMainChatWindow();
            }
        });
    },
    SwitchButton: function (ChatStatus) {
        if (ChatStatus == true) {
            Chat.ShowChatEndButton();
            Chat.ShowMainChatWindow();
        } else {
            Chat.ShowChatStartButton();
            Chat.HideMainChatWindow();
        }
    },
    Start: function () {
        Chat.StartChatForTheFirstTime();
    },
    StartChatForTheFirstTime: function () {
        Chat.Enabled = true;
        $("#TopBarPlaceHolder .ChatStartButton").hide();
        $("#TopBarPlaceHolder .ChatEndButton").show();
        $("#ChatWindow .UserList li").remove();
        Chat.SetChatStatus();
        UserTypeCheck.Init();
        Chat.ShowMainChatWindow();
    },
    End: function () {
        Chat.Enabled = false;
        $("#TopBarPlaceHolder .ChatStartButton").show();
        $("#TopBarPlaceHolder .ChatEndButton").hide();
        $("#ChatWindow .UserList li").remove();
        Chat.SetChatStatus();
        if (Chat.SetUserStatusTimeOut !== null) {
            clearTimeout(Chat.SetUserStatusTimeOut);
        }

        if (Chat.CheckConversationTimeout !== null) {
            clearTimeout(Chat.CheckConversationTimeout);
        }

        if (Chat.ShowCurrentUserChatRequestsTimeout !== null) {
            clearTimeout(Chat.ShowCurrentUserChatRequestsTimeout);
        }

        Chat.SwitchButton(false);
        Chat.CloseConversation();
    },
    SetChatStatus: function () {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=SetChatStatus",
            type: "post",
            dataType: "json",
            data: {
                ChatStatus: Chat.Enabled
            }
        });
    },
    GetChatStatus: function (CallBackFunction) {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetChatStatus",
            type: "post",
            dataType: "json",
            success: function (Result) {
                Chat.Enabled = Result;
                Chat.SetChatStatus();
                if (Chat.Enabled == true) {
                    UserTypeCheck.Init();
                    Chat.SwitchButton(Result);
                }
                else {
                    Chat.HideMainChatWindow();
                }
                CallBackFunction();
            },
            error: function (data) {
                if (data.responseText == 'ChatDidntStart') {
                    Chat.Enabled = true;
                    Chat.SetChatStatus();
                }
            }
        });
    },
    ShowChatEndButton: function () {
        if (Chat.Enabled == true) {
            $(".ChatStartButton").hide();
            $(".ChatEndButton").show();
        }
    },
    ShowChatStartButton: function () {
        if (Chat.Enabled == false) {
            $(".ChatEndButton").hide();
            $(".ChatStartButton").show();
        }
    },
    BindEvents: function () {
        $("#ChatWindow .UserList .Department").live('click', function () {
            var DepartmentID = $(this).attr('DepartmentID');
            Chat.GetDeparmentsOnlineStaffsByDeparmentID(DepartmentID);
            return false;
        });
        $("#ChatWindow .UserList .User").live('click', function () {
            var UserID = $(this).attr('UserID');
            Chat.StartConversation(UserID);
            return false;
        });
        $("#ChatWindow #MessageTextForm").live('submit', function () {

            var Message = $("#MessageTextForm").find("input[name=Message]");
            var MessageText = Message.val();
            if (MessageText.length > 0) {
                Chat.ShowNewMessageInMessageArea(MessageText);
                MessagesArea.ClearMessageBox();
                Chat.SendMessage(MessageText);
                Message.focus();
            }
            return false;
        });
        $("#UsersInChat .List .ChangeChatUser").live('click', function () {

            var UserID = $(this).attr('receiverid');
            var ConversationID = $(this).attr('conversationid');
            var Options = {
                RecieverID: UserID,
                ConversationID: ConversationID
            };
            try {
                Chat.ChangeChatUser(Options);
            }
            catch (e) {
                alert(e);
            }
            return false;
        });
        $("#UsersInChat .List .CloseConversation").live('click', function () {

            var UserID = $(this).parent().attr('receiverid');
            var ConversationID = $(this).parent().attr('conversationid');
            var Options = {
                RecieverID: UserID,
                ConversationID: ConversationID
            };
            UsersInChatArea.CloseConversation(Options);
            return false;
        });

    },
    ChangeChatUser: function (Options) {
        ChatWindow.Init(Options);
        Chat.ShowChatSection(Options);
    },
    GetLoggedInUser: function () {
        var Form = $("#MessageTextForm");
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetLoggedInUserJson",
            type: "post",
            dataType: "json",
            success: function (Result) {
                if (Result) {
                    Chat.LoggedInUser = Result;
                }
            }
        });
    },
    GetUserFromSessionByUserIDToJson: function (UserID, Counter) {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetUserFromSessionByUserIDToJson",
            type: "post",
            dataType: "json",
            data: {
                UserID: UserID
            },
            success: function (Result) {
                UsersInChatArea.ChatUsers[Result.ID.toString()] = Result;
                UsersInChatArea.AddToList(Counter);
            }
        });
    },
    CheckConversationTimeout: null,
    CheckConversation: function () {
        var Form = $("#MessageTextForm");
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=CheckConversation",
            type: "post",
            dataType: "json",
            success: function (Result) {
                var Length = Result.length;
                if (Length > 0) {
                    for (var i = 0; i < Length; i++) {
                        $("#ChatWindow .Window").show();
                        var ChatOptions = {
                            ConversationID: Result[i].ID,
                            RecieverID: Result[i].SenderID
                        };
                        Chat.ShowChatSection(ChatOptions);
                    }
                }
                Chat.CheckConversationTimeout = setTimeout("Chat.CheckConversation();", 10000);
            }
        });
    },
    GetCurrentUserChatRequests: function () {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetCurrentUserChatRequests",
            type: "post",
            dataType: "json",
            success: function (Result) {
                Chat.ShowCurrentUserChatRequests(Result);
            },
            error: function (data) {
            }
        });
    },
    ShowCurrentUserChatRequestsTimeout: null,
    ShowCurrentUserChatRequests: function (Result) {
        if (Result.length > 0) {
            UsersInChatArea.Init(Result);
            $("#UsersInChat:hidden").show();
            Chat.ShowMainChatWindow();
        } else {
            $("#UsersInChat:visible").hide();
            Chat.HideMainChatWindow();

        }
        Chat.ShowCurrentUserChatRequestsTimeout = setTimeout("Chat.GetCurrentUserChatRequests();", 10000);
    },
    HideCurrentUserChatRequest: function () {
        $("#UsersInChat").hide().remove();
    },
    SetUserStatusTimeout: null,
    SetUserStatus: function () {
        if (Chat.Enabled == true) {
            $.ajax({
                url: "Admin/Plugins/Chat/default.php?Function=SetUserStatus",
                type: "post",
                dataType: "json",
                complete: function () {
                    var Form = $("#ChatWindow #MessageTextForm");

                    var ConversationID = Form.find("input[name=ConversationID]").val();
                    if (ConversationID > 0) {
                        Chat.GetMessages();
                    }
                    Chat.SetUserStatusTimeout = setTimeout("Chat.SetUserStatus();", 10000);
                }
            });
            return false;
        }
    },
    GetOnlineDepartments: function () {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetOnlineDepartments",
            type: "post",
            dataType: "json",
            success: function (Result) {
                if (Result.length > 0) {
                    Chat.ShowOnlineDepartments(Result);
                }
            }
        });
    },
    GetOnlineUsers: function () {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetOnlineUsers",
            type: "post",
            dataType: "json",
            success: function (Result) {
                if (Result.length > 0) {
                    Chat.ShowOnlineUsers(Result);
                }
            }
        });
    },
    ShowOnlineDepartments: function (OnlineDepartments) {
        var HTML = "";
        var UserList = $("#ChatWindow .UserList");
        var Template = "<li>" +
    				    "<a href='#' class='Department' DepartmentID='{DepartmentID}'>" +
    				     "{DepartmentTitle}" +
    				    "</a>" +
    				   "</li>";
        var CurrentTemplate = "";
        for (var i = 0; i < OnlineDepartments.length; i++) {
            CurrentTemplate = Template;
            CurrentTemplate = CurrentTemplate.Replace("{DepartmentID}", OnlineDepartments[i].ID);
            CurrentTemplate = CurrentTemplate.Replace("{DepartmentTitle}", OnlineDepartments[i].Title);
            HTML = HTML + CurrentTemplate;
        }
        UserList.append(HTML);
    },
    ShowOnlineUsers: function (OnlineUsers) {
        var HTML = "";
        var UserList = $("#ChatWindow .UserList");
        var Template = "<li>" +
    				    "<a href='#' class='User' UserID='{UserID}'>" +
    				     "{FullName}" +
    				    "</a>" +
    				   "</li>";
        var CurrentTemplate = "";
        for (var i = 0; i < OnlineUsers.length; i++) {
            CurrentTemplate = Template;
            CurrentTemplate = CurrentTemplate.Replace("{UserID}", OnlineUsers[i].ID);
            CurrentTemplate = CurrentTemplate.Replace("{FullName}", OnlineUsers[i].FullName);
            HTML = HTML + CurrentTemplate;
        }
        UserList.append(HTML);
    },
    GetMessages: function () {
        var Form = $("#MessageTextForm");
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetMessage",
            type: "post",
            dataType: "json",
            data: {
                ConversationID: Form.find("input[name=ConversationID]").val()
            },
            success: function (Result) {
                if (Result.length !== 0) {
                    Form.find("input[name=ConversationID]").val(Result[0].ConversationID);
                    MessagesArea.Messages = Result;
                    MessagesArea.Init();
                }
            }
        });
    },
    GetDeparmentsOnlineStaffsByDeparmentID: function (DepartmentID) {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=GetBestStaff",
            type: "post",
            dataType: "json",
            data: {
                DepartmentID: DepartmentID
            },
            success: function (Result) {
                Chat.StartConversation(Result);
            }
        });
        return false;
    },
    StartConversation: function (OnlineUser) {
        var CurrentOnlineUser
        if (typeof OnlineUser == "object") {
            CurrentOnlineUser = OnlineUser[0];
            Chat.OpenConversation(CurrentOnlineUser.ID);
        } else {
            Chat.OpenConversation(OnlineUser);
        }

        return false;
    },
    OpenConversation: function (RecieverID) {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=MakeConversation",
            type: "post",
            dataType: "json",
            data: {
                RecieverID: RecieverID
            },
            success: function (Result) {
                var ChatOptions = {
                    ConversationID: Result,
                    RecieverID: RecieverID
                };
                Chat.ShowChatSection(ChatOptions);
            }
        });
        return false;
    },
    CloseConversation: function (ConversationID) {
        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=CloseConversation",
            type: "post",
            dataType: "json",
            data: {
                ConversationID: ConversationID
            }
        });
        return false;
    },
    CloseChatWindow: function () {
        $("#ChatWindow .Window").hide();
        Chat.ChangeStartChatButtonText();
        return false;
    },
    CloseUsersInChatWindow: function () {
        $("#UsersInChat").hide();
        Chat.ChangeStartChatButtonText();
        return false;
    },
    ShowChatSection: function (ChatOptions) {

        var Form = $("#MessageTextForm");
        Form.find("input[name=ConversationID]").val(ChatOptions.ConversationID);
        Form.find("input[name=RecieverID]").val(ChatOptions.RecieverID);
        $("#ChatSection").show();
        $(".UserList").hide();
    },
    ShowMainChatWindow: function () {
        if (Chat.Enabled == true) {
            $("#ChatWindow").show();
            $("#ChatWindow .Window").show();
            return false;
        }
    },
    HideMainChatWindow: function () {
        $("#ChatWindow").hide();
        $("#ChatWindow .Window").hide();
        return false;
    },
    HideStartChatButtonText: function () {
        $(".ChatStartButton a").hide();
    },
    SendMessage: function (Message) {
        var Form = $("#MessageTextForm");
        
       

        $.ajax({
            url: "Admin/Plugins/Chat/default.php?Function=SendMessage",
            type: "post",
            dataType: "json",
            data: {
                ConversationID: Form.find("input[name=ConversationID]").val(),
                RecieverID: Form.find("input[name=RecieverID]").val(),
                Message: Message
            },
            success: function (Result) {
                var ChatOptions = {
                    ConvesationID: Form.find("input[name=ConversationID]").val(),
                    RecieverID: Form.find("input[name=RecieverID]").val(),
                    Message: Message
                };
                Chat.ShowChatSection(ChatOptions);
            }
        });
        return false;
    },
    ShowNewMessageInMessageArea: function (Message) {
        var ConversationID = $("#MessageTextForm").find("input[name=ConversationID]").val();
        var MessageText = [
    		{
    		    Message: Message,
    		    FullName: Chat.LoggedInUser.FullName
    		}
    	];
        if (ConversationID > 0) {
            MessagesArea.Messages = MessageText;
            MessagesArea.Init();
            var Messages = $("#ChatSection .Messages");
            Messages.scrollTop(9999999999999);
        }
    }
}

