//// PREFERENCES ////

// keep the previous path, otherwise use current path
// each time the console is open
var saveConsolePath = true;
// the number of directories to show in the path
var consolePathLength = 3;

// don't clear the screen every time the console is open
var saveConsoleText = true;

//// END PREFERENCES ////
var consoleHistory = new Array();
var ENTER = 13;
var KEYUP = 38;
var KEYDN = 40;
var PAGEUP = 33;
var PAGEDN = 34;
var CTRL = 17;
var consoleObj;
var consoleDiv;
var consoleInput
var consoleInputDiv;
var consoleCmd = '';
var consoleIndex = 0;
var consoleCurrent = 0;
var consolePath = '';
var currentPath = '';
var consolePrompt;
var homePath = '';
var cmdseed;
var ctrlKey = false;
var consoleLoading = false;
var consoleCache = '';
var consoleInputCache = '';

function consoleInit(){
    if(!document.getElementById('overlayFG')){
        return false;
    }

    document.getElementById('overlayFG').style.overflowY = 'auto';
    consoleObj = document.getElementById('consoleText');
    consoleDiv = document.getElementById('console');
    consoleInput = document.getElementById('cmd');
    consoleInputDiv = document.getElementById('cmdDiv');
    consolePrompt = document.getElementById('consolePrompt');
    cmdseed = document.getElementById('cmdseed').value;
    ctrlKey = false;
    if(!saveConsolePath || consolePath == '' || currentPath != readCookie('last_path')){
        consolePath = consolePrompt.innerHTML.substr(1, consolePrompt.innerHTML.length - 4);
        homePath = consolePath;
        currentPath = readCookie('last_path');
    }
    consolePrompt.innerHTML = "[" + shortenPath(consolePath + '/', consolePathLength, true) + "]$ ";

    consoleInput.focus();
    consoleObj.innerHTML = consoleCache;
    consoleInput.value = consoleInputCache;
    positionConsoleInput();

    consoleInput.onkeydown = function(ev){
        var current = consoleInput.value;
        var last = consoleHistory.length - 1;
        if(last < 0){
            last = 0;
        }

        if(consoleIndex == consoleCurrent){
            consoleHistory[consoleCurrent] = current + '';
        }

        consoleInputCache = consoleInput.value;

        ev = ev || window.event;
        var key = ev.keyCode || ev.which;

        if(ctrlKey){
            switch(key){
                case 76:    // L - clear
                    clearConsole();
                    return false;
                break;
                case 68:    // D - exit
                    closeOverlay();
                    return false;
                break;
                case 85:    // U - clear before
                    consoleInput.value = consoleInput.value.substr(getCursorPos(consoleInput));
                case 65:    // A - home
                    setCursorPos(consoleInput, 0);
                    return false;
                break;
                case 75:    // K - clear after
                    consoleInput.value = consoleInput.value.substr(0, getCursorPos(consoleInput));
                case 69:    // E - end
                    setCursorPos(consoleInput, consoleInput.value.length);
                    return false;
                break;
            }
        }

        switch(key){
            case KEYUP:
                if(consoleIndex != 0){
                    consoleInput.value = consoleHistory[--consoleIndex];
                }
                return false;
            break;
            case KEYDN:
                if(consoleIndex != last){
                    consoleInput.value = consoleHistory[++consoleIndex];
                }
                return false;
            break;
            case PAGEUP:    // PageUp
                consoleIndex = 0;
                consoleInput.value = consoleHistory[consoleIndex];
                return false;
            break;
            case PAGEDN:    // PageDown
                consoleIndex = last;
                consoleInput.value = consoleHistory[consoleCurrent];
                return false;
            break;
            case CTRL:
                ctrlKey = true;
                return false;
            break;
            default:
                if(current != consoleHistory[consoleCurrent]){
                    consoleHistory[consoleCurrent] = current + '';
                }
        }
    }

    consoleInput.onkeyup = function(ev){
        var current = consoleInput.value + '';
        var last = consoleHistory.length - 1;
        if(last < 0){
            last = 0;
        }

        ev = ev || window.event;
        var key = ev.keyCode || ev.which;

        switch(key){
            case CTRL:
                ctrlKey = false;
                return false;
            break;

            case KEYUP:
            case KEYDN:
            case PAGEUP:
            case PAGEDN:
            break;

            default:
                if(current != consoleHistory[consoleCurrent]){
                    consoleHistory[consoleCurrent] = current + '';
                }
        }
    }
}

function clearConsole(){
    consoleObj.innerHTML = '';
    if(saveConsoleText){
        consoleCache = ''; 
    }

    positionConsoleInput();
}

function consolePrint(text){
    consoleObj.innerHTML += text;
    if(saveConsoleText){
        consoleCache += text;
    }
}

function positionConsoleInput(){
    consoleInputDiv.style.top = consoleObj.offsetHeight + 'px';
    document.getElementById('overlayFG').scrollTop = consoleObj.offsetHeight;
}

function consoleParse(response){
    document.getElementById('overlayBG').innerHTML = '';
    consoleLoading = false;

    var response = response.split("\n");
    cmdseed = response.splice(0, 1)[0];
    document.getElementById('cmdseed').value = cmdseed;
    var newPath = response.splice(response.length - 1, 1)[0];
    if(newPath.substr(0, 6) == 'ERROR:'){
        switch(newPath.substr(6)){
            case '127':
                response[0] = "Command not found";
            break;
            case '126':
                response[0] = "Permission Denied";
            break;
            default:
                response[0] = "No such file or directory";
        }
    }else{
        consolePath = newPath || consolePath;
    }
    if(response[response.length - 1] == ''){
        response.splice(response.length - 1, 1);
    }
    var output = response.join("\n");
    output = output.replace(/\</g, "&lt;").replace(/\n/g, "<br>") + ((output != '') ? "<br>" : '');
    if(ie){
        output = output.replace(/\x20{1}/g, "&nbsp;");
    }
    consolePrint(output);
    consolePrompt.innerHTML = "[" + shortenPath(consolePath + '/', consolePathLength, true) + "]$ ";
    positionConsoleInput();
}

function cmdex(){
    if(consoleLoading){
        return false;
    }

    var command = consoleInput.value;

    if(!command){
        consolePrint("<span class='consolePrompt'>[" + shortenPath(consolePath + '/', consolePathLength, true) + "]$ </span><br>");
        positionConsoleInput();
    }

    if(command && cmdseed){
        consoleIndex = consoleHistory.length;
        consoleCurrent = consoleIndex;

        consoleInput.value = '';
        consolePrint("<span class='consolePrompt'>[" + shortenPath(consolePath + '/', consolePathLength, true) + "]$ </span>" + command.replace(/\</g, "&lt;") + '<br>');
        positionConsoleInput();

        if(command == 'quit' || command == 'exit' || command == 'logout'){
            closeOverlay();
            return false;
        }else if(command == 'clear' || command == 'cls'){
            clearConsole();
            document.getElementById('cmd').value = '';
            return false;
        }else if(command == 'history'){
            for(var i = 1; i <= consoleHistory.length; i++){
                consolePrint('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'.substr((i + '').length * 6) + i + '&nbsp;&nbsp;' + consoleHistory[i - 1] + '<br>');
            }
            document.getElementById('cmd').value = '';
            positionConsoleInput();

            return false;
        }else if(command == 'cd'){
            consolePath = homePath;
            document.getElementById('cmd').value = '';
            consolePrompt.innerHTML = "[" + shortenPath(consolePath + '/', consolePathLength, true) + "]$ ";
            positionConsoleInput();

            return false;
        }else{
            showSpinner(.75);
            consoleLoading = true;
            var url = 'console.php?cmd=' + escape(command) + '&path=' + escape(consolePath) + '&key=' + MD5(command + cmdseed);
            doCallback(url, consoleParse, 'POST');
        }
    }

    return false;
}
