1 | ajaxterm={}; |
---|
2 | ajaxterm.Terminal_ctor=function(id,width,height) { |
---|
3 | var ie=0; |
---|
4 | if(window.ActiveXObject) |
---|
5 | ie=1; |
---|
6 | var sid=""+Math.round(Math.random()*1000000000); |
---|
7 | var query0="s="+sid+"&w="+width+"&h="+height; |
---|
8 | var query1=query0+"&c=1&k="; |
---|
9 | var buf=""; |
---|
10 | var timeout; |
---|
11 | var error_timeout; |
---|
12 | var keybuf=[]; |
---|
13 | var sending=0; |
---|
14 | var rmax=1; |
---|
15 | |
---|
16 | var div=document.getElementById(id); |
---|
17 | var dstat=document.createElement('pre'); |
---|
18 | var sled=document.createElement('span'); |
---|
19 | var opt_get=document.createElement('a'); |
---|
20 | var opt_color=document.createElement('a'); |
---|
21 | var opt_paste=document.createElement('a'); |
---|
22 | var sdebug=document.createElement('span'); |
---|
23 | var dterm=document.createElement('div'); |
---|
24 | |
---|
25 | function debug(s) { |
---|
26 | sdebug.innerHTML=s; |
---|
27 | } |
---|
28 | function error() { |
---|
29 | sled.className='off'; |
---|
30 | debug("Connection lost timeout ts:"+((new Date).getTime())); |
---|
31 | } |
---|
32 | function opt_add(opt,name) { |
---|
33 | opt.className='off'; |
---|
34 | opt.innerHTML=' '+name+' '; |
---|
35 | dstat.appendChild(opt); |
---|
36 | dstat.appendChild(document.createTextNode(' ')); |
---|
37 | } |
---|
38 | function do_get(event) { |
---|
39 | opt_get.className=(opt_get.className=='off')?'on':'off'; |
---|
40 | debug('GET '+opt_get.className); |
---|
41 | } |
---|
42 | function do_color(event) { |
---|
43 | var o=opt_color.className=(opt_color.className=='off')?'on':'off'; |
---|
44 | if(o=='on') |
---|
45 | query1=query0+"&c=1&k="; |
---|
46 | else |
---|
47 | query1=query0+"&k="; |
---|
48 | debug('Color '+opt_color.className); |
---|
49 | } |
---|
50 | function mozilla_clipboard() { |
---|
51 | // mozilla sucks |
---|
52 | try { |
---|
53 | netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); |
---|
54 | } catch (err) { |
---|
55 | debug('Access denied, <a href="http://kb.mozillazine.org/Granting_JavaScript_access_to_the_clipboard" target="_blank">more info</a>'); |
---|
56 | return undefined; |
---|
57 | } |
---|
58 | var clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard); |
---|
59 | var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); |
---|
60 | if (!clip || !trans) { |
---|
61 | return undefined; |
---|
62 | } |
---|
63 | trans.addDataFlavor("text/unicode"); |
---|
64 | clip.getData(trans,clip.kGlobalClipboard); |
---|
65 | var str=new Object(); |
---|
66 | var strLength=new Object(); |
---|
67 | try { |
---|
68 | trans.getTransferData("text/unicode",str,strLength); |
---|
69 | } catch(err) { |
---|
70 | return ""; |
---|
71 | } |
---|
72 | if (str) { |
---|
73 | str=str.value.QueryInterface(Components.interfaces.nsISupportsString); |
---|
74 | } |
---|
75 | if (str) { |
---|
76 | return str.data.substring(0,strLength.value / 2); |
---|
77 | } else { |
---|
78 | return ""; |
---|
79 | } |
---|
80 | } |
---|
81 | function do_paste(event) { |
---|
82 | var p=undefined; |
---|
83 | if (window.clipboardData) { |
---|
84 | p=window.clipboardData.getData("Text"); |
---|
85 | } else if(window.netscape) { |
---|
86 | p=mozilla_clipboard(); |
---|
87 | } |
---|
88 | if (p) { |
---|
89 | debug('Pasted'); |
---|
90 | queue(encodeURIComponent(p)); |
---|
91 | } else { |
---|
92 | } |
---|
93 | } |
---|
94 | function update() { |
---|
95 | // debug("ts: "+((new Date).getTime())+" rmax:"+rmax); |
---|
96 | if(sending==0) { |
---|
97 | sending=1; |
---|
98 | sled.className='on'; |
---|
99 | var r=new XMLHttpRequest(); |
---|
100 | var send=""; |
---|
101 | while(keybuf.length>0) { |
---|
102 | send+=keybuf.pop(); |
---|
103 | } |
---|
104 | var query=query1+send; |
---|
105 | if(opt_get.className=='on') { |
---|
106 | r.open("GET","u?"+query,true); |
---|
107 | if(ie) { |
---|
108 | r.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); |
---|
109 | } |
---|
110 | } else { |
---|
111 | r.open("POST","u",true); |
---|
112 | } |
---|
113 | r.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); |
---|
114 | r.onreadystatechange = function () { |
---|
115 | // debug("xhr:"+((new Date).getTime())+" state:"+r.readyState+" status:"+r.status+" statusText:"+r.statusText); |
---|
116 | if (r.readyState==4) { |
---|
117 | if(r.status==200) { |
---|
118 | window.clearTimeout(error_timeout); |
---|
119 | de=r.responseXML.documentElement; |
---|
120 | if(de.tagName=="pre") { |
---|
121 | if(ie) { |
---|
122 | Sarissa.updateContentFromNode(de, dterm); |
---|
123 | } else { |
---|
124 | Sarissa.updateContentFromNode(de, dterm); |
---|
125 | // old=div.firstChild; |
---|
126 | // div.replaceChild(de,old); |
---|
127 | } |
---|
128 | rmax=100; |
---|
129 | } else { |
---|
130 | rmax*=2; |
---|
131 | if(rmax>2000) |
---|
132 | rmax=2000; |
---|
133 | } |
---|
134 | sending=0; |
---|
135 | sled.className='off'; |
---|
136 | timeout=window.setTimeout(update,rmax); |
---|
137 | } else { |
---|
138 | debug("Connection error status:"+r.status); |
---|
139 | } |
---|
140 | } |
---|
141 | } |
---|
142 | error_timeout=window.setTimeout(error,5000); |
---|
143 | if(opt_get.className=='on') { |
---|
144 | r.send(null); |
---|
145 | } else { |
---|
146 | r.send(query); |
---|
147 | } |
---|
148 | } |
---|
149 | } |
---|
150 | function queue(s) { |
---|
151 | keybuf.unshift(s); |
---|
152 | if(sending==0) { |
---|
153 | window.clearTimeout(timeout); |
---|
154 | timeout=window.setTimeout(update,1); |
---|
155 | } |
---|
156 | } |
---|
157 | function keypress(ev) { |
---|
158 | if (!ev) var ev=window.event; |
---|
159 | // s="kp keyCode="+ev.keyCode+" which="+ev.which+" shiftKey="+ev.shiftKey+" ctrlKey="+ev.ctrlKey+" altKey="+ev.altKey; |
---|
160 | // debug(s); |
---|
161 | // return false; |
---|
162 | // else { if (!ev.ctrlKey || ev.keyCode==17) { return; } |
---|
163 | var kc; |
---|
164 | var k=""; |
---|
165 | if (ev.keyCode) |
---|
166 | kc=ev.keyCode; |
---|
167 | if (ev.which) |
---|
168 | kc=ev.which; |
---|
169 | if (ev.altKey) { |
---|
170 | if (kc>=65 && kc<=90) |
---|
171 | kc+=32; |
---|
172 | if (kc>=97 && kc<=122) { |
---|
173 | k=String.fromCharCode(27)+String.fromCharCode(kc); |
---|
174 | } |
---|
175 | } else if (ev.ctrlKey) { |
---|
176 | if (kc>=65 && kc<=90) k=String.fromCharCode(kc-64); // Ctrl-A..Z |
---|
177 | else if (kc>=97 && kc<=122) k=String.fromCharCode(kc-96); // Ctrl-A..Z |
---|
178 | else if (kc==54) k=String.fromCharCode(30); // Ctrl-^ |
---|
179 | else if (kc==109) k=String.fromCharCode(31); // Ctrl-_ |
---|
180 | else if (kc==219) k=String.fromCharCode(27); // Ctrl-[ |
---|
181 | else if (kc==220) k=String.fromCharCode(28); // Ctrl-\ |
---|
182 | else if (kc==221) k=String.fromCharCode(29); // Ctrl-] |
---|
183 | else if (kc==219) k=String.fromCharCode(29); // Ctrl-] |
---|
184 | else if (kc==219) k=String.fromCharCode(0); // Ctrl-@ |
---|
185 | } else if (ev.which==0) { |
---|
186 | if (kc==9) k=String.fromCharCode(9); // Tab |
---|
187 | else if (kc==8) k=String.fromCharCode(127); // Backspace |
---|
188 | else if (kc==27) k=String.fromCharCode(27); // Escape |
---|
189 | else { |
---|
190 | if (kc==33) k="[5~"; // PgUp |
---|
191 | else if (kc==34) k="[6~"; // PgDn |
---|
192 | else if (kc==35) k="[4~"; // End |
---|
193 | else if (kc==36) k="[1~"; // Home |
---|
194 | else if (kc==37) k="[D"; // Left |
---|
195 | else if (kc==38) k="[A"; // Up |
---|
196 | else if (kc==39) k="[C"; // Right |
---|
197 | else if (kc==40) k="[B"; // Down |
---|
198 | else if (kc==45) k="[2~"; // Ins |
---|
199 | else if (kc==46) k="[3~"; // Del |
---|
200 | else if (kc==112) k="[[A"; // F1 |
---|
201 | else if (kc==113) k="[[B"; // F2 |
---|
202 | else if (kc==114) k="[[C"; // F3 |
---|
203 | else if (kc==115) k="[[D"; // F4 |
---|
204 | else if (kc==116) k="[[E"; // F5 |
---|
205 | else if (kc==117) k="[17~"; // F6 |
---|
206 | else if (kc==118) k="[18~"; // F7 |
---|
207 | else if (kc==119) k="[19~"; // F8 |
---|
208 | else if (kc==120) k="[20~"; // F9 |
---|
209 | else if (kc==121) k="[21~"; // F10 |
---|
210 | else if (kc==122) k="[23~"; // F11 |
---|
211 | else if (kc==123) k="[24~"; // F12 |
---|
212 | if (k.length) { |
---|
213 | k=String.fromCharCode(27)+k; |
---|
214 | } |
---|
215 | } |
---|
216 | } else { |
---|
217 | if (kc==8) |
---|
218 | k=String.fromCharCode(127); // Backspace |
---|
219 | else |
---|
220 | k=String.fromCharCode(kc); |
---|
221 | } |
---|
222 | if(k.length) { |
---|
223 | // queue(encodeURIComponent(k)); |
---|
224 | if(k=="+") { |
---|
225 | queue("%2B"); |
---|
226 | } else { |
---|
227 | queue(escape(k)); |
---|
228 | } |
---|
229 | } |
---|
230 | ev.cancelBubble=true; |
---|
231 | if (ev.stopPropagation) ev.stopPropagation(); |
---|
232 | if (ev.preventDefault) ev.preventDefault(); |
---|
233 | return false; |
---|
234 | } |
---|
235 | function keydown(ev) { |
---|
236 | if (!ev) var ev=window.event; |
---|
237 | if (ie) { |
---|
238 | // s="kd keyCode="+ev.keyCode+" which="+ev.which+" shiftKey="+ev.shiftKey+" ctrlKey="+ev.ctrlKey+" altKey="+ev.altKey; |
---|
239 | // debug(s); |
---|
240 | o={9:1,8:1,27:1,33:1,34:1,35:1,36:1,37:1,38:1,39:1,40:1,45:1,46:1,112:1, |
---|
241 | 113:1,114:1,115:1,116:1,117:1,118:1,119:1,120:1,121:1,122:1,123:1}; |
---|
242 | if (o[ev.keyCode] || ev.ctrlKey || ev.altKey) { |
---|
243 | ev.which=0; |
---|
244 | return keypress(ev); |
---|
245 | } |
---|
246 | } |
---|
247 | } |
---|
248 | function init() { |
---|
249 | sled.appendChild(document.createTextNode('\xb7')); |
---|
250 | sled.className='off'; |
---|
251 | dstat.appendChild(sled); |
---|
252 | dstat.appendChild(document.createTextNode(' ')); |
---|
253 | opt_add(opt_color,'Colors'); |
---|
254 | opt_color.className='on'; |
---|
255 | opt_add(opt_get,'GET'); |
---|
256 | opt_add(opt_paste,'Paste'); |
---|
257 | dstat.appendChild(sdebug); |
---|
258 | dstat.className='stat'; |
---|
259 | div.appendChild(dstat); |
---|
260 | div.appendChild(dterm); |
---|
261 | if(opt_color.addEventListener) { |
---|
262 | opt_get.addEventListener('click',do_get,true); |
---|
263 | opt_color.addEventListener('click',do_color,true); |
---|
264 | opt_paste.addEventListener('click',do_paste,true); |
---|
265 | } else { |
---|
266 | opt_get.attachEvent("onclick", do_get); |
---|
267 | opt_color.attachEvent("onclick", do_color); |
---|
268 | opt_paste.attachEvent("onclick", do_paste); |
---|
269 | } |
---|
270 | document.onkeypress=keypress; |
---|
271 | document.onkeydown=keydown; |
---|
272 | timeout=window.setTimeout(update,100); |
---|
273 | } |
---|
274 | init(); |
---|
275 | } |
---|
276 | ajaxterm.Terminal=function(id,width,height) { |
---|
277 | return new this.Terminal_ctor(id,width,height); |
---|
278 | } |
---|
279 | |
---|