mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-04 05:12:30 +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);
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 |