mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-30 19:02:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			289 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			8.6 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 control panel
 | |
|         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("Closing remote console");
 | |
|         };
 | |
| 
 | |
|         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 response received, 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);
 | |
|         }
 | |
|     }
 | |
| };
 |