mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 19:32:31 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@9329 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			224 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			224 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);
 | |
| 		}
 | |
| 	}
 | |
| }; |