wok view ajaxterm/stuff/usr/share/ajaxterm/ajaxterm.js @ rev 20157

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