
function initCommander(div_id, keyMap, activate){
    var commandDiv = $('<div id="commander">');
    commandDiv.append('<input type="text" id="input-command"/>');
    $(div_id).append(commandDiv);
   
     var modKeys = [9,16,17];
     var textPressBlock = false;
     $('#input-command').keydown(function (e) {

         textPressBlock = true;
         if ($('.ac_results').css('display') != 'block') {
            if (!checkMod(e.keyCode)) {
                keyPresser(e);
            }
         }
     });
     $(document).keydown(function(e) {
         if (textPressBlock == false) {
             if ($('.ac_results').css('display') != 'block') {
                 if (!checkMod(e.keyCode)) {
                      keyPresser(e);
                 }
             }
         } 
         textPressBlock = false;  
     });
    
    var mod = 'no-mod';
    function checkMod(code) {
        if (code == 17) {
            mod = 'cntrl-mod';
            return true;
        } 
        else if (code == 16) {
            mod = 'shift-mod';
            return true;
        }
        return false;
    }

    function keyPresser(e) {
        var code = e.keyCode;
	if (nam_state == 'state-command-line') {
	    if (code == 13) {
		handleCommand(parseCommand());
	    }
	    else if (code == 27) {
		escCommandLine();
	    }
	}
	else {
	    doKeyMap(keyMap, code,mod, e);  
	}
        mod = 'no-mod';
    }
       
};


function doKeyMap(keyMap,code,mod, e) {
    //log(keyMap+code+mod+nam_state);
    try {
        var func = keyMap.map[code+''][nam_state][mod];
        if (func != undefined) {
            func();
            e.stopPropagation();
            e.preventDefault();
        }
    }
    catch (e) {
        log(e);
    }
}
var commandStack = [];
var historyIndex = 0;
function parseCommand() {
    var commandStr = $('#input-command').attr('value');
    
    var args = commandStr.match(/([^\s\"]+)|(\"[^"]+\")/g);
    var commandArgs = [];
    for (var i = 0; i < args.length; i++) {
        if (args[i] != undefined && args[i][0] == "\"") {
            commandArgs[i] = args[i].substring(1,args[i].length-1);
        }
        else {
            commandArgs[i] = args[i];
        }
    }
    commandStack.push(commandArgs);
    historyIndex = commandStack.length-1;
    return commandArgs;
}
function getCommand(dir) {
   if (historyIndex < 0) {
       historyIndex = commandStack.length-1;
   }
   else if (historyIndex >= commandStack.length) {
      historyIndex = 0;
   }
   var commandStr = "";
   _.each(commandStack[historyIndex], function(arg) {

        if (arg.lastIndexOf(" ") != -1) {
             arg = "\""+arg+"\"";
        }
        commandStr += arg+" ";   
        //commandStr = commandStr.trim();    
   });
   $('#input-command').attr('value',commandStr);
   historyIndex += dir;
}
function showCommandLine() {
    $('#commander').show();
    $('#input-command').attr('value','');
    $('#input-command').focus();
    setState('state-command-line');
}
function escCommandLine() {
   if ($('.ac_results').css('display') == 'block') {
      $($('.ac_results')[0]).hide();
   }  
   else {

      $('#input-command').blur();
      $('#input-command').attr('value','');
      $('#commander').hide();
      setState();
   }
}

