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