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>
|