﻿(function ($) {

    function HubProxy() {

        var _proxy = this;

        this.isMaster = false;
        this.hasFocus = true;
        this.hub = $.connection.chatterHub;
        this.ping = null;

        this.pingThreshold = 1500;
        this.pingCheckBounds = 500;

        this.pingUpdateInterval = 500;
        this.pingCheckInterval = 1500;

        this.deferredMasterSet = null;
        this.deferredMasterCheck = null;
        this.isConnected = false;
        this.suppressStorageEvent = false;
        this.initComplete = false;

        var _setLocalStorage = function (key, value) {
            value == null ? localStorage.removeItem(key) : localStorage.setItem(key, value);
        }

        this.storage = {
            masterKey: "chat.master",
            pingKey: "chat.ping",
            chatSendKey: "chat.messageSend_",
            chatReceivedKey: "chat.messageReceived_",
            chatSentKey: "chat.messageSent",
            connectedUserKey: "chat.connectedUser",
            clientDisconnectedKey: "chat.clientDisconnect",
            clientConnectKey: "chat.onConnect",
            addFriendKey: "chat.addFriend",
            friendAddedKey: "chat.friendAdded",
            removeFriendKey: "chat.removeFriend",
            friendRemovedKey: "chat.friendRemoved",
            processingKey: "chat.processing",

            get master() { return localStorage.getItem(this.masterKey); },
            set master(v) { _setLocalStorage(this.masterKey, v); },
            get ping() {

                var p = localStorage.getItem(this.pingKey);
                return new Date(parseFloat(p == null ? 0 : p));
            },
            set ping(date) { _setLocalStorage(this.pingKey, date.getTime()); },
            get connectedUser() { return JSON.parse(localStorage.getItem(this.connectedUserKey)); },
            set connectedUser(users) { _setLocalStorage(this.connectedUserKey, JSON.stringify(users)); },
            get addFriend() {

                var friend = JSON.parse(localStorage.getItem(this.addFriendKey));
                if (friend)
                    return friend.user;

                return null;
            },
            set addFriend(user) {
                var friend = { user: user, token: Math.random() * 1000 };
                _setLocalStorage(this.addFriendKey, JSON.stringify(friend));
            },
            get friendAdded() { return JSON.parse(localStorage.getItem(this.friendAddedKey)); },
            set friendAdded(user) {
                user.token = Math.random() * 1000;
                _setLocalStorage(this.friendAddedKey, JSON.stringify(user));

                var cu = this.connectedUser;
                cu.Friends.push(user)
                this.connectedUser = cu;

            },
            get removeFriend() {

                var friend = JSON.parse(localStorage.getItem(this.removeFriendKey));
                if (friend)
                    return friend.user;

                return null;
            },
            set removeFriend(user) {
                var friend = { user: user, token: Math.random() * 1000 };
                _setLocalStorage(this.removeFriendKey, JSON.stringify(friend));
            },
            get friendRemoved() { return JSON.parse(localStorage.getItem(this.friendRemovedKey)); },
            set friendRemoved(user) {
                user.token = Math.random() * 1000;
                _setLocalStorage(this.friendRemovedKey, JSON.stringify(user));

                var cu = this.connectedUser;
                for (var i = 0; i < cu.Friends.length; i++) {
                    if (cu.Friends[i].Name == user.Name) {

                        cu.Friends.splice(i, 1);
                        break;
                    }
                }

                this.connectedUser = cu;
            },
            get processing() {
                return localStorage.getItem(this.processingKey) === "true";
            },
            set processing(val) {
                _setLocalStorage(this.processingKey, val === true);
            },

            sendMessage: function (user, message) {
                _setLocalStorage(this.chatSendKey + user, JSON.stringify({ user: user, message: message }));
            },
            messageReceived: function (user, message) {
                _setLocalStorage(this.chatReceivedKey + user, JSON.stringify({ user: user, message: message }));
            },
            messageSent: function (user, message) {
                _setLocalStorage(this.chatSentKey, JSON.stringify({ user: user, message: message, token: Math.random() * 1000 }));
            },
            clientConnected: function (user) {
                _setLocalStorage(this.clientConnectKey, user);
            },
            clientDissconnected: function (user) {
                _setLocalStorage(this.clientDisconnectedKey, user);
            },
            listen: function () {
                $(window).on("storage", function (e) { _proxy.storageMonitor(e.originalEvent); });
            },
            stopListening: function () {
                $(window).off("storage");
            }

        };



    }

    HubProxy.prototype.start = function () {

        var _deferredStart = $.Deferred();
        var _proxy = this;

        setTimeout(function () {

            _proxy.checkForMaster().done(function () {



                _deferredStart.resolve(_proxy);

            });

        }, this.pingCheckBounds);

        return _deferredStart.done(function (proxy) { proxy.setup(); return proxy; });
    }

    HubProxy.prototype.setupHubEvents = function () {

        var _proxy = this;

        this.hub.client.connectedUser = function (user) {
            _proxy.suppressStorageEvent = true;
            _proxy.connectedUser(user);
            _proxy.storage.connectedUser = user;

            setTimeout(function () { _proxy.suppressStorageEvent = false; }, 300);
        }

        this.hub.client.messageReceived = function (from, message) {
            _proxy.suppressStorageEvent = true;
            _proxy.messageReceived(from, message);

            _proxy.storage.messageReceived(from, message);

            setTimeout(function () { _proxy.suppressStorageEvent = false; }, 300);
        }

        this.hub.client.userOffline = function (user) {
            _proxy.suppressStorageEvent = true;
            _proxy.clientDisconnected(user);
            _proxy.storage.clientDisconnected(user);

            setTimeout(function () { _proxy.suppressStorageEvent = false; }, 300);
        }

        this.hub.client.userOnline = function (user) {
            _proxy.suppressStorageEvent = true;
            _proxy.onConnected(user);
            _proxy.storage.clientConnected(user);

            setTimeout(function () { _proxy.suppressStorageEvent = false; }, 300);
        }

    }

    HubProxy.prototype.checkForMaster = function () {

        var _proxy = this;

        var t = (new Date() - (isNaN(this.storage.ping.getTime()) ? 0 : this.storage.ping));

        var def = $.Deferred();

        if (t > this.pingThreshold) {

            this.storage.ping = new Date();
            this.isMaster = true;
            this.initComplete = true;

            clearInterval(this.deferredMasterSet);
            clearTimeout(this.deferredMasterCheck);

            _proxy.setupHubEvents();

            $.connection.hub.start().done(function () {
                _proxy.isConnected = true;
                _proxy.storage.processing = false;
                _proxy.storage.connectedUser = null;

                _proxy.storage.master = $.connection.hub.id;

                _proxy.deferredMasterSet = setInterval(function () {
                    _proxy.storage.ping = new Date();
                }, _proxy.pingUpdateInterval);

                def.resolve();
            });

        } else {

            if (this.isMaster) {
                clearInterval(this.deferredMasterSet);
                this.isMaster = false;
            }

            if (this.isConnected) {

                $.connection.hub.stop().done(function () { _proxy.isConnected = false });
            }

            this.setDeferredMasterCheck();
            def.resolve();
        }

        return def;

    }

    HubProxy.prototype.stop = function () {
        this.isConnected = false;
        $.connection.hub.stop();
    }

    HubProxy.prototype.setDeferredMasterCheck = function () {
        var _proxy = this;

        if (!this.initComplete) {
            this.connectedUser(this.storage.connectedUser);
            this.initComplete = true;
        }

        clearTimeout(this.deferredMasterCheck);
        this.deferredMasterCheck = setTimeout(function () {
            _proxy.checkForMaster();
        }, this.pingCheckInterval);

    }

    HubProxy.prototype.setup = function () {
        this.storage.listen();
    }

    HubProxy.prototype.storageMonitor = function (e) {

        if (this.suppressStorageEvent)
            return;

        if (e.key == this.storage.pingKey)
            return;

        var _proxy = this;

        if (e.key == this.storage.masterKey && this.isMaster && this.isConnected) {

            if (this.storage.master != $.connection.hub.id) {
                this.stop();
                _proxy.checkForMaster();
            }

            return;
        }


        if (this.isMaster && this.isConnected) {

            if (e.key.indexOf(this.storage.chatSendKey) == 0) {

                if (e.newValue == null)
                    return;

                var message = JSON.parse(e.newValue);
                var dest = e.key.replace(this.storage.chatSendKey, "");

                localStorage.removeItem(e.key);

                if (dest != message.user)
                    return;

                this.sendMessage(message.user, message.message);
            } else if (e.key.indexOf(this.storage.addFriendKey) == 0) {

                this.addFriend(this.storage.addFriend);

            } else if (e.key.indexOf(this.storage.removeFriendKey) == 0) {

                this.removeFriend(this.storage.removeFriend);
            }

        }

        if (e.key.indexOf(this.storage.friendAddedKey) == 0) {

            this.friendAdded(this.storage.friendAdded);

        } else if (e.key.indexOf(this.storage.friendRemovedKey) == 0) {

            this.friendRemoved(this.storage.friendRemoved);

        } else if (e.key.indexOf(this.storage.chatSentKey) == 0) {

            if (e.newValue == null)
                return;

            var message = JSON.parse(e.newValue);

            this.messageSent(message.user, message.message);

        } else if (e.key.indexOf(this.storage.chatReceivedKey) == 0) {

            if (e.newValue == null)
                return;

            var message = JSON.parse(e.newValue);

            this.messageReceived(message.user, message.message);
        } else if (e.key == this.storage.connectedUserKey) {

            if (e.newValue == null)
                return;

            var users = JSON.parse(e.newValue);
            this.connectedUser(users);
        } else if (e.key == this.storage.clientConnectedKey) {

            if (e.newValue == null)
                return;

            var user = JSON.parse(e.newValue);
            this.clientConnected(user);
        } else if (e.key == this.storage.clientDisconnectedKey) {

            if (e.newValue == null)
                return;

            var user = JSON.parse(e.newValue);
            this.clientDisconnected(user);
        }

    }

    HubProxy.prototype.sendMessage = function (user, message) {
        var _proxy = this;


        if (this.isMaster && this.isConnected) {
            _proxy.storage.processing = true;

            this.suppressStorageEvent = true;
            this.hub.server.sendMessage(user, message).always(function () { _proxy.storage.processing = false; });
            this.messageSent(user, message);
            this.storage.messageSent(user, message);
            setTimeout(function () {
                _proxy.suppressStorageEvent = false;
            }, 300);

        } else {
            this.storage.sendMessage(user, message);
        }


    }

    HubProxy.prototype.addFriend = function (user) {
        var _proxy = this;
        var def = $.Deferred();

        if (this.isMaster && this.isConnected) {
            _proxy.storage.processing = true;
            this.hub.server.addFriend(user).done(function (friend) {
                _proxy.storage.stopListening();
                _proxy.storage.friendAdded = friend;
                _proxy.friendAdded(friend);
                _proxy.storage.listen();
                def.resolve();
            }).always(function () {
                _proxy.storage.processing = false;
            }).fail(function () { def.reject(); });

        } else {

            this.storage.stopListening();
            this.storage.addFriend = user;
            this.storage.listen();
            def.resolve();
        }

        return def;

    }

    HubProxy.prototype.removeFriend = function (user) {
        var _proxy = this;
        var def = $.Deferred();

        if (this.isMaster && this.isConnected) {
            _proxy.storage.processing = true;
            this.hub.server.removeFriend(user).done(function (friend) {
                _proxy.storage.stopListening();
                _proxy.storage.friendRemoved = friend;
                _proxy.friendRemoved(friend);
                _proxy.storage.listen();
                def.resolve();
            }).always(function () {
                _proxy.storage.processing = false;
            }).fail(function () { def.reject(); });


        } else {

            this.storage.stopListening();
            this.storage.removeFriend = user;
            this.storage.listen();
            def.resolve();
        }


        return def;
    }

    HubProxy.prototype.friendAdded = function (friend) { }

    HubProxy.prototype.friendRemoved = function (friend) { }

    HubProxy.prototype.messageReceived = function (user, message) { }

    HubProxy.prototype.messageSent = function (to, message) { }

    HubProxy.prototype.connectedUser = function (user) { }

    HubProxy.prototype.clientDisconnected = function (user) { }

    HubProxy.prototype.onConnected = function (user) { }

    function ChatBox(hubProxy) {

        var _chatBox = this;
        var _defferedRemoval = [];
        var _defferedRemovalTimeout = 5000;

        this.connectedUser = null;
        this.hub = hubProxy;
        this.userPanel = $("#chat");
        this.openChats = [];

        $("#page").append("<div id='cbc'>");

        this.hub.onConnected = function (userName) {

            if (!_chatBox.isRemoving(userName))
                _chatBox.userConnected(userName);
        };

        this.hub.clientDisconnected = function (userName) {
            _chatBox.isRemoving(userName);
            _defferedRemoval.push({ user: userName, t: setTimeout(function () { _chatBox.userDisconnected(userName); _chatBox.deleteDefferedRemoval(userName); }, _defferedRemovalTimeout) });
        };

        this.hub.connectedUser = function (user) {
            _chatBox.setUser(user);
        }

        this.hub.messageReceived = function (from, message) {
            _chatBox.messageReceived(from, message);
        };

        this.hub.messageSent = function (to, message) {
            _chatBox.messageSent(to, message);
        };

        this.hub.friendAdded = function (friend) {
            _chatBox.addUser(friend);
        }

        this.hub.friendRemoved = function (friend) {
            _chatBox.removeUser(friend);
        }

        this.isRemoving = function (user) {
            var found = false;

            for (var i = _defferedRemoval.length - 1; i >= 0; i--) {
                if (_defferedRemoval[i].user == user) {

                    clearTimeout(_defferedRemoval[i].t);
                    _defferedRemoval.splice(i, 1);
                    found = true;

                    break;
                }
            }

            return found;

        }

        this.deleteDefferedRemoval = function (user) {
            for (var i = _defferedRemoval.length - 1; i >= 0; i--) {

                if (_defferedRemoval[i].user == user) {
                    _defferedRemoval.splice(i, 1);
                }
            }

        }
    }

    ChatBox.prototype.initChat = function () {

        var chatBox = this;
        this.userPanel.empty();

        chatBox.addUser({ Name: this.connectedUser.User, IsOnline: true }, true);

        $.each(this.connectedUser.Friends, function () {

            chatBox.addUser(this, false);
        });

    }

    ChatBox.prototype.findFriends = function () {
        var chatBox = this;
        var m = $("#cbff");
        var uc = $("<div class='users'>");
        var cp = 0;
        var noMore = false;
        var loading = false;

        var getUsersFor = function (page) {

            if (loading)
                return;

            loading = true;

            $.post("/chat/users", { page: page }, function (data) {
                cp = page;

                uc.empty();

                $.each(data, function (i, o) {

                    var btn = $("<button class='btn' type='button'>").data("isFriend", o.IsFriend).text(o.IsFriend ? "Remove" : "Add").addClass(o.IsFriend ? "btn-warning" : "btn-primary");
                    btn.on("click", function () {

                        if (chatBox.hub.storage.processing)
                            return;

                        if ($(this).data("isFriend")) {
                            chatBox.hub.removeFriend($(this).parent().children("label").text());

                        } else {
                            chatBox.hub.addFriend($(this).parent().children("label").text());
                        }

                        $(this).hide();
                        $(this).parent().append($("<img src='/content/images/loader.gif'>"));
                    });

                    var u = $("<div>").addClass("clearfix").attr("data-user", o.Name.toLowerCase()).append($("<label>").text(o.Name)).append(btn);
                    uc.append(u);

                });

                if (data.length < 5)
                    noMore = true;

            }).always(function () { loading = false; });

        }

        if (!m.length) {
            m = infolens.utils.createModal();
            m.attr("id", "cbff");

            m.find(".modal-title").text("Add a friend");

            var body = m.find(".modal-body");


            body.append(uc);

            var p = $("<a class='prev btn btn-default' href='#'>").text("<").on("click", function (e) {
                e.preventDefault();

                if (cp == 0)
                    return;

                getUsersFor(cp - 1);

            });

            var n = $("<a class='next btn btn-default' href='#'>").text(">").on("click", function (e) {
                e.preventDefault();

                if (noMore)
                    return;

                getUsersFor(cp + 1);
            });

            var ucp = $("<div>").addClass("ucp clearfix").append(p).append(n);
            body.append(ucp);

            var footer = m.find(".modal-footer");
            footer.append($("<button type='button' class='btn btn-default' data-dismiss='modal'>").text("Close"));

        }

        getUsersFor(0);

        m.modal("show");
    }

    ChatBox.prototype.addUser = function (user, isCurrent) {
        var chatBox = this;

        var a = (user.IsOnline ? "ua" : "ui");
        var u = $("<li data-user='" + user.Name.toLowerCase() + "'>")
                .addClass(a)
                .append($("<img src='/content/images/chat/default.png' width='30px'>"))
                .append($("<label>").text(user.Name));

        if (isCurrent) {
            u.addClass("cu");

            u.append($("<button>").addClass("btn fa fa-users").attr("title", "Add users").on("click", function () {
                chatBox.findFriends();
            }));

            this.userPanel.prepend(u);
        } else {
            u.addClass("f");
            u.append("<span>");
            this.attachChatEvents(u, user.Name);


            if ($("#cbff").length) {

                var uid = ".users > div[data-user='" + user.Name.toLowerCase() + "']";

                var container = $("#cbff").find(uid);
                container.find("img").remove();

                var btn = container.find("button");
                btn.removeClass("btn-primary").addClass("btn-warning").text("Remove").data("isFriend", true).show();

            }

            var panel = this.openChatPanelFor(user.Name);
            if (panel != null) {
                panel.status(user.IsOnline);
            }

            var insertAfter = null;
            this.userPanel.children(".f").each(function (i, o) {

                if ($(o).data("user").localeCompare(user.Name) == 1)
                    insertAfter = $(o);
            });

            if (insertAfter == null) {
                this.userPanel.append(u);
            } else {
                u.insertBefore(insertAfter);
            }
        }

    }

    ChatBox.prototype.removeUser = function (user) {
        var chatBox = this;
        var id = "li[data-user='" + user.Name.toLowerCase() + "']";

        this.userPanel.find(id).remove();

        if ($("#cbff").length) {
            var u = ".users > div[data-user='" + user.Name.toLowerCase() + "']";

            var user = $("#cbff").find(u);
            user.find("img").remove();

            var btn = user.find("button");
            btn.removeClass("btn-warning").addClass("btn-primary").text("Add").data("isFriend", false).show();

        }

    }

    ChatBox.prototype.userConnected = function (user) {
        var id = "li[data-user='" + user.toLowerCase() + "']";
        this.userPanel.find(id).removeClass("ui").addClass("ua");

        var panel = this.openChatPanelFor(user);
        if (panel != null) {
            panel.status(true);
        }

    }

    ChatBox.prototype.userDisconnected = function (user) {
        var id = "li[data-user='" + user.toLowerCase() + "']";
        $(id).removeClass("ua").addClass("ui");

        var panel = this.openChatPanelFor(user);
        if (panel != null) {
            panel.status(false);
        }

    }

    ChatBox.prototype.messageReceived = function (from, message) {
        var current = this;

        var openChat = this.openChatPanelFor(from);

        if (openChat != null) {
            openChat.messageReceived(message);
        } else {

            openChat = this.newChatPanel(from, this.hub);
            openChat.messageReceived(message);

        }
    }

    ChatBox.prototype.messageSent = function (to, message) {
        var openChat = this.openChatPanelFor(to);
        if (openChat != null) {
            openChat.messageSent(message);
        }
    }

    ChatBox.prototype.openChatPanelFor = function (sender) {

        var open = null;

        var rex = new RegExp("^" + sender + "$", "i");

        for (var i = 0; i < this.openChats.length; i++) {
            var v = this.openChats[i].user;
            if (rex.test(v)) {
                open = this.openChats[i].panel;
                break;
            }
        }

        return open;
    }

    ChatBox.prototype.setUser = function (connectedUser) {

        this.connectedUser = $.extend({}, new ChatUser(), connectedUser);
        this.hub.storage.connectedUser = this.connectedUser;
        this.initChat();
    }

    ChatBox.prototype.removePanel = function (user) {

        var rex = new RegExp("^" + user + "$", "i");

        for (var i = this.openChats.length - 1; i >= 0; i--) {

            if (rex.test(this.openChats[i].user)) {
                this.openChats.splice(i, 1);
            }
        }
    }

    ChatBox.prototype.attachChatEvents = function (userElement, user) {

        var current = this;

        $(userElement).on("click", function () {

            if ($("#cbc").find(".c[data-user='" + user.toLowerCase() + "']").length)
                return false;

            current.newChatPanel(user, current.hub);

        });
    }

    ChatBox.prototype.newChatPanel = function (user, hub) {

        if (this.openChatPanelFor(user) != null) {
            return;
        }

        var current = this;

        var panel = new ChatPanel(user, this);
        panel.onClose = function (user) {
            current.removePanel(user);
        };

        this.openChats.push({ user: user, panel: panel });
        return panel;
    }


    function ChatUser() {
        this.User = null;
        this.Friends = null;
    }

    ChatUser.prototype.findFriend = function (friend) {

        if ($.isArray(this.Friends)) {
            for (var i = 0; i < this.Friends.length; i++) {

                if (this.Friends[i].Name == friend)
                    return this.Friends[i];
            }
        }

        return null;
    }


    function ChatPanel(user, chatBox) {

        var chatPanel = this;

        this.user = user;

        this.hub = chatBox.hub;
        this.title = $("<label>").text(user);
        this.messages = $("<div class='con'>");
        this.container = $("<div class='c'>");
        this.pageHistory = 0;
        this.bmid = null;
        this.loadingHistory = false;

        var header = $("<div class='h'>");
        this.container.append(header);
        header.append(this.title);

        $("<span class='fa fa-remove'>").on("click", function () {
            $(this).parents(".cb").remove();

            if (chatPanel.onClose != null) {
                chatPanel.onClose(chatPanel.user);
            }
        }).appendTo(header);

        var friend = chatBox.connectedUser.findFriend(user)

        if (friend == null) {
            $("<span class='fa fa-user-plus'>").attr("title", "Add user to friends").on("click", function () {
                chatBox.hub.addFriend(chatPanel.title.text());
                $(this).remove();
            }).appendTo(header);
        } else {
            this.status(friend.IsOnline);
        }

        this.container.append(this.messages);

        var footer = $("<div class='i'>");
        this.container.append(footer);

        var input = $("<textarea class='s' placeholder='Say something'>");
        footer.append(input);

        input.keypress(function (e) {
            if (e.which == 13) {
                chatPanel.sendMessage($(this).val());
                $(this).val('');
                e.preventDefault();
            }
        });

        $("#cbc").append($("<div class='cb'>").append(this.container));

        input.focus();

        this.loadingHistory = true;
        this.loadHistory(this.pageHistory, user).done(function (data) {
            chatPanel.loadingHistory = false;
            chatPanel.bmid = data.length ? data[0].ID : null;
            chatPanel.scrollDown();
            chatPanel.pageHistory += 1;

            chatPanel.messages.on("scroll", function (e) {

                if (chatPanel.loadingHistory)
                    return;

                if ($(this).scrollTop() == 0) {
                    chatPanel.loadingHistory = true;
                    var f = chatPanel.messages.children().first();

                    chatPanel.loadHistory(chatPanel.pageHistory, user, chatPanel.bmid).done(function () {

                        chatPanel.pageHistory += 1;

                        var s = f.offset().top - chatPanel.messages.offset().top;

                        chatPanel.messages.animate({ scrollTop: s }, 50, function () {
                            chatPanel.loadingHistory = false;
                        });

                    });
                }

            });
        });

    }

    ChatPanel.prototype.loadHistory = function (page, user, bmid) {
        var chatPanel = this;

        return $.post("/chat/messages", { page: page, toUser: user, bmid: bmid }, function (messages) {

            $.each(messages, function (i, o) {
                chatPanel.messageHistory(o.Received, o.Message, o.ID);
            });

        });
    }

    ChatPanel.prototype.status = function (online) {
        if (online) {
            this.container.addClass("ua");
        } else {
            this.container.removeClass("ua");
        }
    }

    ChatPanel.prototype.onClose = null;

    ChatPanel.prototype.sendMessage = function (message) {
        this.hub.sendMessage(this.user, message);
    }

    ChatPanel.prototype.messageHistory = function (received, message, id) {

        var c = this.message(received, message);
        c.data("id", id);

        this.messages.prepend(c);

    }

    ChatPanel.prototype.messageReceived = function (message) {

        var c = this.message(true, message);
        this.messages.append(c);
        this.scrollDown();
    }

    ChatPanel.prototype.messageSent = function (message) {
        var c = this.message(false, message);
        this.messages.append(c);
        this.scrollDown();
    }

    ChatPanel.prototype.message = function (received, message) {
        var c = $("<div>");
        received ? c.addClass("y") : c.addClass("m");
        c.append("<img src='/content/images/chat/default.png' width='30px'>");
        c.append($("<div class='cbt'>").append($("<span>").text(message)));
        c.append("<span class='clearfix'>");
        return c;
    }

    ChatPanel.prototype.scrollDown = function () {
        this.messages.animate({ scrollTop: this.messages.prop("scrollHeight") - this.messages.height() }, 30);
    }

    $.fn.infoChat = function () {

        var _hubProxy = new HubProxy();

        var _connectedUser = new ChatBox(_hubProxy)

        _hubProxy.start();

        return this;
    }


})(jQuery);

//$(function () {

//    var _currentMenu = $("#nav");

//    _currentMenu.find("#chat").infoChat();

//    _currentMenu.find("#nb #nl").addClass("active");

//    _currentMenu.find("#nb #nl").on("click", function () {

//        _currentMenu.find("#nb #cl").removeClass("active");
//        $(this).addClass("active");

//        _currentMenu.find("#chat").hide();
//        _currentMenu.find("#menu").show();

//    });

//    _currentMenu.find("#nb #cl").on("click", function () {

//        _currentMenu.find("#nb #nl").removeClass("active");
//        $(this).addClass("active");

//        _currentMenu.find("#chat").show();
//        _currentMenu.find("#menu").hide();
//    });

//    _currentMenu.find("#nb").show();


//});