aboutsummaryrefslogtreecommitdiffstats
path: root/data/Template.html
blob: 708e85bdb75e527b2358b5539aa0a7898175e29d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <base href="%@">
    <script type="text/ecmascript" defer="defer">
    
        //Appending new content to the message view
        function appendMessage(html) {
            shouldScroll = nearBottom();
        
            //Remove any existing insertion point
            insert = document.getElementById("insert");
            if(insert) insert.parentNode.removeChild(insert);

            //Append the new message to the bottom of our chat block
            chat = document.getElementById("Chat");
            range = document.createRange();
            range.selectNode(chat);
            documentFragment = range.createContextualFragment(html);
            chat.appendChild(documentFragment);
            
            alignChat(shouldScroll);
        }
        function appendMessageNoScroll(html) {
            //Remove any existing insertion point
            insert = document.getElementById("insert");
            if(insert) insert.parentNode.removeChild(insert);

            //Append the new message to the bottom of our chat block
            chat = document.getElementById("Chat");
            range = document.createRange();
            range.selectNode(chat);
            documentFragment = range.createContextualFragment(html);
            chat.appendChild(documentFragment);
        }
        function appendNextMessage(html){
            shouldScroll = nearBottom();

            //Locate the insertion point
            insert = document.getElementById("insert");
        
            //make new node
            range = document.createRange();
            range.selectNode(insert.parentNode);
            newNode = range.createContextualFragment(html);

            //swap
            insert.parentNode.replaceChild(newNode,insert);
            
            alignChat(shouldScroll);
        }
        function appendNextMessageNoScroll(html){
            //Locate the insertion point
            insert = document.getElementById("insert");
        
            //make new node
            range = document.createRange();
            range.selectNode(insert.parentNode);
            newNode = range.createContextualFragment(html);

            //swap
            insert.parentNode.replaceChild(newNode,insert);
        }
        
        //Auto-scroll to bottom.  Use nearBottom to determine if a scrollToBottom is desired.
        function nearBottom() {
            return ( document.body.scrollTop >= ( document.body.offsetHeight - ( window.innerHeight * 1.2 ) ) );
        }
        function scrollToBottom() {
            document.body.scrollTop = document.body.offsetHeight;
        }

        //Dynamically exchange the active stylesheet
        function setStylesheet( id, url ) {
            code = "<style id=\"" + id + "\" type=\"text/css\" media=\"screen,print\">";
            if( url.length ) code += "@import url( \"" + url + "\" );";
            code += "</style>";
            range = document.createRange();
            head = document.getElementsByTagName( "head" ).item(0);
            range.selectNode( head );
            documentFragment = range.createContextualFragment( code );
            head.removeChild( document.getElementById( id ) );
            head.appendChild( documentFragment );
        }
        
        //Swap an image with its alt-tag text on click, or expand/unexpand an attached image
        document.onclick = imageCheck;
        function imageCheck() {     
            node = event.target;
            if(node.tagName == 'IMG' && !client.zoomImage(node) && node.alt) {
                a = document.createElement('a');
                a.setAttribute('onclick', 'imageSwap(this)');
                a.setAttribute('src', node.getAttribute('src'));
                a.className = node.className;
                text = document.createTextNode(node.alt);
                a.appendChild(text);
                node.parentNode.replaceChild(a, node);
            }
        }

        function imageSwap(node) {
            shouldScroll = nearBottom();

            //Swap the image/text
            img = document.createElement('img');
            img.setAttribute('src', node.getAttribute('src'));
            img.setAttribute('alt', node.firstChild.nodeValue);
            img.className = node.className;
            node.parentNode.replaceChild(img, node);
            
            alignChat(shouldScroll);
        }
        
        //Align our chat to the bottom of the window.  If true is passed, view will also be scrolled down
        function alignChat(shouldScroll) {
            var windowHeight = window.innerHeight;
            
            if (windowHeight > 0) {
                var contentElement = document.getElementById('Chat');
                var contentHeight = contentElement.offsetHeight;
                if (windowHeight - contentHeight > 0) {
                    contentElement.style.position = 'relative';
                    contentElement.style.top = (windowHeight - contentHeight) + 'px';
                } else {
                    contentElement.style.position = 'static';
                }
            }
            
            if (shouldScroll) scrollToBottom();
        }
        
        function windowDidResize(){
            alignChat(true/*nearBottom()*/); //nearBottom buggy with inactive tabs
        }
        
        window.onresize = windowDidResize;
    </script>
    
    <!-- This style is shared by all variants. !-->
    <style id="baseStyle" type="text/css" media="screen,print"> 
        %@  
        *{ word-wrap:break-word; }
        img.scaledToFitImage { height:auto; width:100%; }
    </style>
    
    <!-- Although we call this mainStyle for legacy reasons, it's actually the variant style !-->
    <style id="mainStyle" type="text/css" media="screen,print"> 
        @import url( "%@" );
    </style>

</head>
<body onload="alignChat(true);" style="==bodyBackground==">
%@
<div id="Chat">
</div>
%@
</body>
</html>