{% extends "base.html" %}
{% block js_media %}
<script type="text/javascript">
    var chatSocket = new WebSocket(
        'ws://' + window.location.host +
        '/ws/chat/');
</script>
<script type="text/javascript" src="{{ static('mathjax_config.js') }}"></script>
<script type="text/javascript"
        src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML"></script>
<script type="text/javascript">
    $(function() {
        let currentPage = 1;

        $('#loader').hide();

        chatSocket.onmessage = function(e) {
            let data = JSON.parse(e.data);
            data = data['message'];
            loadMessage(data['body'],
                        data['author'],
                        data['time'],
                        data['id'],
                        data['image'],
                        data['css_class'],
                        true);
            // console.log(data);
            $('#chat-box').scrollTop($('#chat-box')[0].scrollHeight);
        };
        
        function encodeHTML(content) {
            return content.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
                   return '&#'+i.charCodeAt(0)+';';
            });
        }

        function loadMessage(content, user, time, messid, image, css_class, isNew) {
            // if (isNew) content = encodeHTML(content)
            time = new Date(time);
            time = moment(time).format("HH:mm DD-MM-YYYY");
            content = encodeHTML(content);
            li = `<li class="message"> 
                    <img src="${image}" class="profile-pic">
                    <div class="body-message">
                        <div class="user-time">
                            <span class="${css_class}">
                                <a href="{{ url('user_page') }}/${user}" class="user">
                                    ${user}
                                </a>
                            </span>
                            <span class="time">${time}</span>
                            {% if request.user.is_staff %}
                            <a class="chatbtn_remove_mess" style="color:red; cursor: pointer;" data-messtime="${time}" data-author="${user}" data-messid="${messid}">Delete</a>
                            {% endif %}
                        </div>
                        <span class="content-message">${content}                   </span>
                    </div>
                    <div class="clear"></div>
                </li>`
            ul = $('#chat-log')
            if (isNew) {
                ul.append(li)
            }
            else {
                ul.prepend(li)
            }
            MathJax.Hub.Queue(["Typeset",MathJax.Hub]);
        }

        (function init_chatlog() {
            ul = $('#chat-log')
            {% autoescape on %}
            {% for msg in message %}
                loadMessage("{{msg.body|safe|escapejs}}", `{{msg.author}}`, `{{msg.time}}`, `{{msg.id}}`, `{{gravatar(msg.author, 32)}}`,`{{msg.author.css_class}}`);
            {% endfor %}
            {% endautoescape %}
            $('#chat-box').scrollTop($('#chat-box')[0].scrollHeight);
        })()

        function scrollTopOfBottom(container) {
            return container[0].scrollHeight - container.innerHeight()
        }

        function scrollContainer(container, loader) {
            container.scroll(function() {
            if (container.scrollTop() == 0) {
                if (currentPage < {{paginator.num_pages}}) {
                    currentPage++;
                    loader.show();
                    $.ajax({
                        url: `{{request.path}}?page=${currentPage}`,
                        success: function(data) {
                            let lastMsg = $('.message:first')
                            let lastMsgPos = scrollTopOfBottom(container)

                            data = JSON.parse(data)
                            setTimeout( () => {
                                for (msg of data) {
                                    loadMessage(msg.body, msg.author, msg.time, msg.id, msg.image, msg.css_class)
                                }
                                
                                loader.hide()

                                // scroll to last msg
                                container.scrollTop(
                                    scrollTopOfBottom(container) - lastMsgPos
                                )
                            }, 500)
                        }
                    })
                }
            }
        })}

        scrollContainer($('#chat-box'), $('#loader'))

        {% if request.user.is_staff %}
        $(document).on("click", ".chatbtn_remove_mess", function() {
            var elt = $(this);
            $.ajax({
                url: 'delete/',
                type: 'post',
                data: elt.data(),
                dataType: 'json',
                success: function(data){
                    console.log('delete ajax call success!');
                    location.reload();
                }
            });
        });
        {% endif %}
        
        $("#chat-submit").click(function() {
            if ($("#chat-input").val().trim()) {
                let body = $('#chat-input').val().trim();
                let img = '{{ gravatar(request.user, 32) }}'
                
                message = {
                    'body': body,
                    'image': img,
                    'author': '{{request.profile}}',
                    'author_id': {{request.profile.id}},
                    'css_class': '{{request.profile.css_class}}',
                }

                chatSocket.send(JSON.stringify({
                    'message': message
                }));

                $('#chat-input').val('').focus();
            }
        });

        chatSocket.onclose = function(e) {
            console.error('Chat socket closed unexpectedly');
        };

        $("#chat-log").change(function() {
            $('#chat-log').scrollTop($('#chat-log')[0].scrollHeight);
        });
        
        $('#chat-input').focus();

        $('#chat-input').keydown(function(e) {
            if (e.keyCode === 13) {
                if (e.ctrlKey || e.shiftKey) {
                    var val = this.value;
                    if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
                        var start = this.selectionStart;
                        this.value = val.slice(0, start) + "\n" + val.slice(this.selectionEnd);
                        this.selectionStart = this.selectionEnd = start + 1;
                    } else if (document.selection && document.selection.createRange) {
                        this.focus();
                        var range = document.selection.createRange();
                        range.text = "\r\n";
                        range.collapse(false);
                        range.select();
                    }
                }
                else {
                    e.preventDefault();
                    $('#chat-submit').click();
                }
                return false
            }
            return true
        });

    });
</script>

{% endblock js_media %}

{% block body %}
{% csrf_token %}
    <div id="chat-area">
        <div id="chat-box">
            <img src="http://opengraphicdesign.com/wp-content/uploads/2009/01/loader64.gif" id="loader">
            <ul id="chat-log">
            </ul>
        </div>
        {{_('Your message')}}
    
        <textarea rows="6" id="chat-input"></textarea>
    </div>
    <button id="chat-submit"> Send </button>
{% endblock body %}