﻿var chat = {
    alias: 'Unknown',
    clientId: 0,
    channels: {
        main: '/chat',
        meta: '/chat/meta'
    },
    dom: {
        prechat: {
            container: document.getElementById('prechat'),
            alias: document.getElementById('alias'),
            start: document.getElementById('start')
        },
        chat: {
            container: document.getElementById('chat'),
            text: document.getElementById('text'),
            log: document.getElementById('log'),
            send: document.getElementById('send')
        }
    },
    util: {
        start: function() {
            if (chat.util.isEmpty(chat.dom.prechat.alias)) {
                chat.util.setInvalid(chat.dom.prechat.alias);
            } else {
                chat.alias = chat.dom.prechat.alias.value;
                chat.util.hide(chat.dom.prechat.container);
                chat.util.show(chat.dom.chat.container);
                chat.util.scroll();
                chat.dom.chat.text.focus();
            }
        },
        send: function() {
            if (chat.util.isEmpty(chat.dom.chat.text)) {
                chat.util.setInvalid(chat.dom.chat.text);
            } else {
                client.publish({
                    channel: chat.channels.main,
                    data: {
                        alias: chat.alias,
                        text: chat.dom.chat.text.value
                    },
                    onSuccess: function(args) {
                        chat.util.logMessage(args.data.alias, args.data.text, true);
                        chat.util.clear(chat.dom.chat.text);
                    }
                });
            }
        },
        show: function(el) {
            el.style.display = '';
        },
        hide: function(el) {
            el.style.display = 'none';
        },
        clear: function(el) {
            el.value = '';
        },
        observe: fm.websync.utilities.observe,
        json: fm.websync.utilities.json,
        xhr: fm.websync.utilities.xhr,
        isEnter: function(e) {
            return (e.keyCode == 13);
        },
        isEmpty: function(el) {
            return (el.value == '');
        },
        setInvalid: function(el) {
            el.className = 'invalid';
        },
        logMessage: function(alias, text, me) {
            var html = '<span';
            if (me) {
                html += ' class="me"';
            }
            html += '>' + alias + ': ' + text + '</span>';
            chat.util.log(html);
        },
        logSuccess: function(text) {
            chat.util.log('<span class="success">' + text + '</span>');
        },
        logFailure: function(text) {
            chat.util.log('<span class="failure">' + text + '</span>');
        },
        log: function(html) {
            var div = document.createElement('div');
            div.innerHTML = html;
            chat.dom.chat.log.appendChild(div);
            chat.util.scroll();
        },
        scroll: function() {
            chat.dom.chat.log.scrollTop = chat.dom.chat.log.scrollHeight;
        }
    }
};

chat.util.observe(chat.dom.prechat.start, 'click', function(e) {
    chat.util.start();
});

chat.util.observe(chat.dom.prechat.alias, 'keydown', function(e) {
    if (chat.util.isEnter(e)) {
        chat.util.start();
    }
});

chat.util.observe(chat.dom.chat.send, 'click', function(e) {
    chat.util.send();
});

chat.util.observe(chat.dom.chat.text, 'keydown', function(e) {
    if (chat.util.isEnter(e)) {
        chat.util.send();
    }
});

client.connect({
    onSuccess: function(args) {
        chat.clientId = args.clientId;
        chat.util.logSuccess('Connected to WebSync.');
        chat.util.show(chat.dom.prechat.container);

    },
    onFailure: function(args) {
        chat.util.logSuccess('Could not connect to WebSync.');
    }
});

client.subscribe({
    channel: chat.channels.main,
    onSuccess: function(args) {
        chat.util.logSuccess('Subscribed to chat.');
        chat.util.xhr('/chat-history', '', function(responseText, xhr) {
            var logs = chat.util.json.parse(responseText);
            logs.reverse();
            for (var i = 0; i < logs.length; i++) {
                chat.util.logMessage(logs[i].alias, logs[i].text, false);
            }
        });
    },
    onFailure: function(args) {
        chat.util.logSuccess('Could not subscribe to chat.');
    },
    onReceive: function(args) {
        chat.util.logMessage(args.data.alias, args.data.text, false);
    }
});