226 lines
5.9 KiB
JavaScript
226 lines
5.9 KiB
JavaScript
|
rconsTerm = function(nodeName, height, width){
|
||
|
var sid=nodeName;
|
||
|
var keyBuf = [];
|
||
|
var receivingFlag = false;
|
||
|
var sendTimeout;
|
||
|
var errorTimeout;
|
||
|
var queryStable = 's=' + sid + '&w=' + height + '&h=' + width + '&c=1&k=';
|
||
|
var maxDelay = 200;
|
||
|
var firstFlag = true;
|
||
|
|
||
|
var workingStatus;
|
||
|
var termArea;
|
||
|
var errorArea;
|
||
|
|
||
|
var ie=0;
|
||
|
if(window.ActiveXObject){
|
||
|
ie=1;
|
||
|
}
|
||
|
|
||
|
rconsInit();
|
||
|
//init
|
||
|
function rconsInit(){
|
||
|
//create status, configure the css
|
||
|
workingStatus = $('<span>.</span>');
|
||
|
workingStatus.attr('class', 'off');
|
||
|
|
||
|
//create the disconnect button
|
||
|
var disconnectButton = $('<a class="off">Disconnect</a>');
|
||
|
disconnectButton.bind('click', function(){
|
||
|
window.close();
|
||
|
});
|
||
|
|
||
|
//create the control panel, add to the rcons div
|
||
|
var controlPanel = $('<pre class="stat"></pre>');
|
||
|
$('#term').append(controlPanel);
|
||
|
|
||
|
//create the error erea
|
||
|
errorArea = $('<span></span>');
|
||
|
|
||
|
//add all item to controlPanel
|
||
|
controlPanel.append(workingStatus);
|
||
|
controlPanel.append(disconnectButton);
|
||
|
controlPanel.append(errorArea);
|
||
|
|
||
|
//create the termArea
|
||
|
termArea = $('<div></div>');
|
||
|
$('#term').append(termArea);
|
||
|
|
||
|
//bind keypress event
|
||
|
document.onkeypress=rconsKeypress;
|
||
|
document.onkeydown=rconsKeydown;
|
||
|
window.onbeforeunload = function(){
|
||
|
rconsDisconnect();
|
||
|
alert("This rcons page is closed.");
|
||
|
};
|
||
|
|
||
|
rconsSend();
|
||
|
}
|
||
|
|
||
|
//close the connection
|
||
|
function rconsDisconnect(){
|
||
|
window.clearTimeout(sendTimeout);
|
||
|
window.clearTimeout(errorTimeout);
|
||
|
|
||
|
$.ajax({
|
||
|
type : "POST",
|
||
|
url : "lib/rcons.php",
|
||
|
data : queryStable + '&q=1',
|
||
|
dataType : 'json'
|
||
|
});
|
||
|
}
|
||
|
|
||
|
//translate the key press
|
||
|
function rconsKeypress(event){
|
||
|
if (!event) var event=window.event;
|
||
|
var kc;
|
||
|
var k="";
|
||
|
if (event.keyCode)
|
||
|
kc=event.keyCode;
|
||
|
if (event.which)
|
||
|
kc=event.which;
|
||
|
if (event.altKey) {
|
||
|
if (kc>=65 && kc<=90)
|
||
|
kc+=32;
|
||
|
if (kc>=97 && kc<=122) {
|
||
|
k=String.fromCharCode(27)+String.fromCharCode(kc);
|
||
|
}
|
||
|
} else if (event.ctrlKey) {
|
||
|
if (kc>=65 && kc<=90) k=String.fromCharCode(kc-64); // Ctrl-A..Z
|
||
|
else if (kc>=97 && kc<=122) k=String.fromCharCode(kc-96); // Ctrl-A..Z
|
||
|
else if (kc==54) k=String.fromCharCode(30); // Ctrl-^
|
||
|
else if (kc==109) k=String.fromCharCode(31); // Ctrl-_
|
||
|
else if (kc==219) k=String.fromCharCode(27); // Ctrl-[
|
||
|
else if (kc==220) k=String.fromCharCode(28); // Ctrl-\
|
||
|
else if (kc==221) k=String.fromCharCode(29); // Ctrl-]
|
||
|
else if (kc==219) k=String.fromCharCode(29); // Ctrl-]
|
||
|
else if (kc==219) k=String.fromCharCode(0); // Ctrl-@
|
||
|
} else if (event.which==0) {
|
||
|
if (kc==9) k=String.fromCharCode(9); // Tab
|
||
|
else if (kc==8) k=String.fromCharCode(127); // Backspace
|
||
|
else if (kc==27) k=String.fromCharCode(27); // Escape
|
||
|
else {
|
||
|
if (kc==33) k="[5~"; // PgUp
|
||
|
else if (kc==34) k="[6~"; // PgDn
|
||
|
else if (kc==35) k="[4~"; // End
|
||
|
else if (kc==36) k="[1~"; // Home
|
||
|
else if (kc==37) k="[D"; // Left
|
||
|
else if (kc==38) k="[A"; // Up
|
||
|
else if (kc==39) k="[C"; // Right
|
||
|
else if (kc==40) k="[B"; // Down
|
||
|
else if (kc==45) k="[2~"; // Ins
|
||
|
else if (kc==46) k="[3~"; // Del
|
||
|
else if (kc==112) k="[[A"; // F1
|
||
|
else if (kc==113) k="[[B"; // F2
|
||
|
else if (kc==114) k="[[C"; // F3
|
||
|
else if (kc==115) k="[[D"; // F4
|
||
|
else if (kc==116) k="[[E"; // F5
|
||
|
else if (kc==117) k="[17~"; // F6
|
||
|
else if (kc==118) k="[18~"; // F7
|
||
|
else if (kc==119) k="[19~"; // F8
|
||
|
else if (kc==120) k="[20~"; // F9
|
||
|
else if (kc==121) k="[21~"; // F10
|
||
|
else if (kc==122) k="[23~"; // F11
|
||
|
else if (kc==123) k="[24~"; // F12
|
||
|
if (k.length) {
|
||
|
k=String.fromCharCode(27)+k;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if (kc==8)
|
||
|
k=String.fromCharCode(127); // Backspace
|
||
|
else
|
||
|
k=String.fromCharCode(kc);
|
||
|
}
|
||
|
if(k.length) {
|
||
|
if(k=="+") {
|
||
|
rconsQueue("%2B");
|
||
|
} else {
|
||
|
rconsQueue(escape(k));
|
||
|
}
|
||
|
}
|
||
|
event.cancelBubble=true;
|
||
|
if (event.stopPropagation) event.stopPropagation();
|
||
|
if (event.preventDefault) event.preventDefault();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//translate the key press, same with rconsKeypress
|
||
|
function rconsKeydown(event){
|
||
|
if (!event) var event=window.event;
|
||
|
if (ie) {
|
||
|
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, 113:1,114:1,115:1,116:1,117:1,118:1,119:1,120:1,121:1,122:1,123:1};
|
||
|
if (o[event.keyCode] || event.ctrlKey || event.altKey) {
|
||
|
event.which=0;
|
||
|
return keypress(event);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//send the command and request to server
|
||
|
function rconsSend(){
|
||
|
var keyPressList = '';
|
||
|
var requireString = '';
|
||
|
if(receivingFlag){
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
receivingFlag = true;
|
||
|
workingStatus.attr('class', 'on');
|
||
|
|
||
|
while(keyBuf.length > 0){
|
||
|
keyPressList += keyBuf.pop();
|
||
|
}
|
||
|
|
||
|
if (firstFlag){
|
||
|
requireString = queryStable + keyPressList + '&f=1';
|
||
|
firstFlag = false;
|
||
|
}
|
||
|
else{
|
||
|
requireString = queryStable + keyPressList;
|
||
|
}
|
||
|
|
||
|
$.ajax({
|
||
|
type : "POST",
|
||
|
url : "lib/rcons.php",
|
||
|
data : requireString,
|
||
|
dataType : 'json',
|
||
|
success : function(data){
|
||
|
rconsUpdate(data);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
errorTimeout = window.setTimeout(rconsSendError, 15000);
|
||
|
|
||
|
}
|
||
|
|
||
|
//when receive the response, update the term area
|
||
|
function rconsUpdate(data){
|
||
|
window.clearTimeout(errorTimeout);
|
||
|
errorArea.empty();
|
||
|
if (data.term){
|
||
|
termArea.empty().append(data.term);
|
||
|
maxDelay = 200;
|
||
|
}
|
||
|
else{
|
||
|
maxDelay = 2000;
|
||
|
}
|
||
|
|
||
|
receivingFlag = false;
|
||
|
workingStatus.attr('class', 'off');
|
||
|
sendTimeout = window.setTimeout(rconsSend, maxDelay);
|
||
|
}
|
||
|
|
||
|
function rconsSendError(){
|
||
|
workingStatus.attr('class', 'off');
|
||
|
errorArea.empty().append('Send require error.');
|
||
|
}
|
||
|
|
||
|
function rconsQueue(kc){
|
||
|
keyBuf.unshift(kc);
|
||
|
if (false == receivingFlag){
|
||
|
window.clearTimeout(sendTimeout);
|
||
|
sendTimeout = window.setTimeout(rconsSend, 1);
|
||
|
}
|
||
|
}
|
||
|
};
|