var httpCmd = getHTTPObject();
//httpCmd.id = "objhttpCmd";
var cmdUrl = "data/cmd.cs.php?cmd=";
var hlpUrl = "data/help.cs.php";
var cmdEntryHist = new Array();
var cmdHist = new Array();
var curHistPos = 0;

// values to keep around
var entryID = 0;
var fieldID = 0;
var currentType = '';
var searchResults = '';

var isMobile = false;

var checkEnter = function(e)
{ 
    // e is event object passed from function invocation
    // literal character code will be stored in this variable
    var characterCode;

    if(e && e.which){ 
        // if which property of event object is supported (NN4)
        e = e;
        // character code is contained in NN4's which property
        characterCode = e.which; 
    }
    else{
        try{
            e = event;
        }
        catch(err)
        {
            
        }
        
        // character code is contained in IE's keyCode property
        characterCode = e.keyCode; 
    }
    
        switch(characterCode)
    {
        case 13: // enter key
            addHistory();
            txtCmd_Enter();
            return false;
            break;

        case 38: // up arrow
            backInHistory();
            break;
        case 40: // down arrow
            forwardInHistory();
            break;
        default:
            return true;
            break;
    }
}

var addEntryHistory = function(entryID)
{
    var txtCmd = document.getElementById("txtCmd");


    if (cmdEntryHist.length > 100)
    {
        var tmp = new Array();

        for(var i=1; i < cmdEntryHist.length; i++)
        {
            tmp[i-1] = cmdEntryHist[i];
        }

        cmdEntryHist = tmp;
    }

    cmdEntryHist[cmdEntryHist.length] = entryID;
}

var backInEntryHistory = function(stepCount)
{
    //if (cmdEntryHist.length < stepCount) return false;
    var txtCmd = document.getElementById("txtCmd");

        var cmd = cmdEntryHist[cmdEntryHist.length-(stepCount++)];
        txtCmd.value = "e " + cmd;
        txtCmd_Enter();

    return true;
}

var addHistory = function()
{
    var txtCmd = document.getElementById("txtCmd");

    if (cmdHist.length > 100)
    {
        var tmp = new Array();

        for(var i=1; i < cmdHist.length; i++)
        {
            tmp[i-1] = cmdHist[i];
        }

        cmdHist = tmp;
    }

    curHistPos = cmdHist.length+1;
    cmdHist[cmdHist.length] = txtCmd.value;
}

var backInHistory = function()
{
    if (cmdHist.length < 1) return false;
    var txtCmd = document.getElementById("txtCmd");
    if (curHistPos > 0) curHistPos--;
    else curHistPos = cmdHist.length-1;

    txtCmd.value = cmdHist[curHistPos];
    txtCmd.focus();

    return true;
}

var forwardInHistory = function()
{
    var txtCmd = document.getElementById("txtCmd");
    if (curHistPos < cmdHist.length-1) curHistPos++;
    else
    {
        curHistPos = cmdHist.length;
        txtCmd.value = "";
        txtCmd.focus();
        return true;
    }

    txtCmd.value = cmdHist[curHistPos];
    txtCmd.focus();

    return true;
}


var initCmd = function()
{
    keywords = "";

    httpCmd.open("GET", cmdUrl + escape("search") + "&keywords=" + escape(keywords),true);
    httpCmd.onreadystatechange = exeCmd;
}

var exeCmd = function()
{
    if (httpCmd.readyState == 4)
    {
        //if (httpCmd.responseText.indexOf('Exception') == -1)
        //{
            var msg = "";
            var queue = document.getElementById("preQueue");
                        var txtNotes = document.getElementById("txtNotes");
            var divInfo = document.getElementById("divInfo");
            var divCurrent = document.getElementById("divCurrent");
            var res = httpCmd.responseText;
            var arr = res.split("|++_++|");
            
            divInfo.innerHTML = "&nbsp;";

            // parse the response array
            var output = arr[0];
            var info = arr[1];
            var status = arr[2];
            var action = arr[3];
            var currentTypeIn = arr[4];
            var entryIDIn = arr[5];
            var fieldIDIn = arr[6];
            var arrayList = arr[7];

                        // clear out the search results array
                        searchResults = '';

                        switch (action)
                        {
                                case 'editentrynotes':
                                case 'editfieldnotes':
                                        txtNotes.value = output;
                                        queue.innerHTML = output;
                                        txtNotes.focus();
                                        break;
                                default:
                            if (output != '') queue.innerHTML = "<pre>" + output + "</pre>";
                                        break;
                        }

            divInfo.innerHTML = info;
            divCurrent.innerHTML = status;
            if (currentTypeIn != '') currentType = currentTypeIn;
            if (entryIDIn != '') entryID = entryIDIn;
            if (fieldIDIn != '') fieldID = fieldIDIn;
            if (arrayList != '') searchResults = arrayList;
        //}
        ajaxBusy = false;
    }
}
var exeCmdHelp = function()
{
    if (httpCmd.readyState == 4)
    {
                var msg = "";
                var queue = document.getElementById("preQueue");
                var divInfo = document.getElementById("divInfo");
                var divCurrent = document.getElementById("divCurrent");
                msg = httpCmd.responseText;
                var arr = msg.split("|++_++|");
                var res = "";

                queue.innerHTML = "&nbsp;";
                divInfo.innerHTML = "&nbsp;";
                divCurrent.innerHTML = "&nbsp;";
        
        divCurrent.innerHTML = arr[0];
        divInfo.innerHTML = arr[1];
        queue.innerHTML = arr[2];
        queue.className = "helpQueue";

        ajaxBusy = false;
    }
}
var exeCmdHome = function()
{
    if (httpCmd.readyState == 4)
    {
                var msg = "";
                var queue = document.getElementById("preQueue");
                var divInfo = document.getElementById("divInfo");
                var divCurrent = document.getElementById("divCurrent");
                msg = httpCmd.responseText;
                var arr = msg.split("|++_++|");
                var res = "";

                queue.innerHTML = "&nbsp;";
                divInfo.innerHTML = "&nbsp;";
                divCurrent.innerHTML = "&nbsp;";
                
                // parse the response array
                var output = arr[0];
                var info = arr[1];
                var status = arr[2];
                var action = arr[3];
                var currentTypeIn = arr[4];
                var entryIDIn = arr[5];
                var fieldIDIn = arr[6];
                var arrayList = arr[7];

                // clear out the search results array
                searchResults = '';

                if (output+"" == "")
                {
                        res = h_home() + "<br /><br />To log in use<br /><strong>login &lt;<u>email</u>&gt; &lt;<u>password</u>&gt; &lt;remember login (true|false)</strong>";
                }
                else
                {
                        res = h_home() + "<br /><pre>" + output + "</pre>";
                }
                
                if (queue == null) return;
                
                queue.innerHTML = res;
                
                divInfo.innerHTML = info+"&nbsp;";
                divCurrent.innerHTML = status+"&nbsp;";
                if (currentTypeIn != '') currentType = currentTypeIn;
                if (entryIDIn != '') entryID = entryIDIn;
                if (fieldIDIn != '') fieldID = fieldIDIn;
                if (arrayList != '') searchResults = arrayList;
        
                ajaxBusy = false;
    }
}

var exeNotesSave = function()
{
    var queue = document.getElementById("preQueue");
    var txtNotes = document.getElementById("txtNotes");
    var divInfo = document.getelementById("divInfo");

    if (httpCmd.readyState == 4)
    {
        var dt = new Date();
        var hr = dt.getHours();
        var min = dt.getMinutes();
        var sec = dt.getSeconds();
        var updDate = '';
        if (hr < 10) updDate += '0';
        updDate += hr + ':';
        if (min < 10) updDate += '0';
        updDate += min + ':';
        if (sec < 10) updDate += '0';
        updDate += sec;

        alert(sec + '\n' + sec < 10);

        queue.innerHTML = txtNotes.value;
        divInfo.innerHTML = "The notes have been saved (" + updDate + ")";
        ajaxBusy = false;
    }

    return;
}

var getArrayID = function(idIn)
{
    if (searchResults != '')
    {
        var arr = searchResults.split('|');

        for (var i = 0; i < arr.length; i++)
        {
            var arrItem = arr[i].split(',');
            

            if (arrItem[0] == idIn)
            {
                idIn = arrItem[1];
                break;
            }
        }
    }

    return idIn;
}

var initializeCmd = function()
{
    var keywords = "";
    httpCmd.open("GET", cmdUrl + escape("search") + "&keywords=" + escape(keywords),true);
    httpCmd.onreadystatechange = exeCmdHome;
    
    ajaxBusy = true;

    try {
        httpCmd.send(null);
    }
    catch(err) {}
    
    return;
}

var txtCmd_Enter = function()
{
    var data = "";
    var cmd = "";
    var keywords = "";
    var txtCmd = document.getElementById("txtCmd");
    var preQueue = document.getElementById("preQueue");
    var divInfo = document.getElementById("divInfo");
    var divCurrent = document.getElementById("divCurrent");
    var txtNotes = document.getElementById("txtNotes");
    var hidID = document.getElementById("hidID");
    var hidType = document.getElementById("hidType");
    
    if (txtCmd == null) return;
    
    divInfo.innerHTML = "Processing...";
    
    data = txtCmd.value;
    var arr = data.split(" ");

    txtCmd.value = "";

    txtNotes.style.display = "none";
    preQueue.style.display = "";
    preQueue.className = "queue";
    
    switch (arr[0]) {
        case "addentry":
        case "adde":
            // addentry <entrytype (notes|entry)> <entryname>
            if (arr.length < 4) {
                divInfo.innerHTML = "<strong>Error!</strong> To create a new entry, use the following syntax <strong>addentry &lt;entry type(notes|entry)&gt; &lt;alias (single word)&gt; &lt;entry name&gt;</strong>";
                return;
            }
            if (arr[1] != "notes" && arr[1] != "entry") {
                divInfo.innerHTML = "<strong>Error!</strong> Be sure to specify a valid entry type: 'entry' or 'notes'";
                return;
            }

            name = "";
            for (var i=3; i < arr.length; i++)
            {
                if (name != "") name += " " + arr[i];
                else name = arr[i];
            }

            httpCmd.open("GET", cmdUrl + escape("addentry") + "&entrytype=" + arr[1] + "&alias=" + escape(arr[2]) + "&entryname=" + escape(name),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "addfield":
        case "addf":
            // addfield <entryid> <caption>
            if (arr.length < 3) {
                divInfo.innerHTML = "To create a new field, use the following syntax <strong>addfield &lt;entryid&gt; &lt;caption&gt;</strong>";
                return;
            }

            caption = "";
            for (var i=2; i < arr.length; i++)
            {
                if (caption != "") caption += " " + arr[i];
                else caption = arr[i];
            }

            httpCmd.open("GET", cmdUrl + escape("updatefield") + "&eid=" + escape(arr[1]) + "&fid=0&caption=" + escape(caption),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "back":
                        // back
            backInEntryHistory(arr[1]);
            break;

                case "admin.cleanup":
            // admin.cleanup <user id>
            if (arr.length < 2) {
                return;
            }

            httpCmd.open("GET", cmdUrl + escape("cleanup") + "&uid=" + escape(arr[1]),true);
            httpCmd.onreadystatechange = exeCmd;
                        break;

        case "close":
        case "x":
            // close, x
            txtNotes.style.display = "none";
            preQueue.style.display = "";
            hidID.value = "";
            divInfo.innerHTML = "Now exited notes editing mode";
            return;
            break;

        case "home":
        case "gh":
            // home, gh
            txtNotes.style.display = "none";
            divCurrent.innerHTML = "&nbsp;";
            preQueue.innerHTML = h_home();
            preQueue.style.display = "";
            hidID.value = "";

            currentType = '';

            var keywords = "";
            httpCmd.open("GET", cmdUrl + escape("search") + "&keywords=" + escape(keywords),true);
            httpCmd.onreadystatechange = exeCmdHome;
            break;

        case "count":
            // count
            httpCmd.open("GET", cmdUrl + escape("count"),true);
            httpCmd.onreadystatechange = exeCmd;
            break;
            
        case "deleteentry":
        case "dele":
            // deleteentry <entryid>
            if (arr.length != 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To delete an entry, use the following syntax <strong>deleteentry &lt;entry id&gt;</strong>";
                return;
            }

            currentType = '';
            
            httpCmd.open("GET", cmdUrl + escape("deleteentry") + "&eid=" + escape(arr[1]),true);
            httpCmd.onreadystatechange = exeCmdHome;
            break;
        
        case "deletefield":
        case "delf":
            // deletefield <fieldid>
            if (arr.length != 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To delete a field, use the following syntax <strong>deletefield &lt;field id&gt;</strong>";
                return;
            }

            currentType = 'entry';
            
            httpCmd.open("GET", cmdUrl + escape("deletefield") + "&eid=" + entryID + "&fid=" + escape(arr[1]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "entry":
        case "e":
            // e <entryid>
            if (arr.length != 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To view an entry, use the following syntax <strong>e &lt;entry id&gt;</strong>";
                return;
            }
            
            entryID = getArrayID(arr[1]);

            addEntryHistory(entryID);

            currentType = 'entry';

            httpCmd.open("GET", cmdUrl + escape("viewentry") + "&eid=" + escape(entryID),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "entryalias":
        case "ea":
            // entryalias <entry alias> <new alias (one word)>
            if (arr.length != 3) {
                divInfo.innerHTML = "<strong>Error!</strong> To edit an entry's alias, use the following syntax <strong>entryalias &lt;current alias&gt; &lt;new alias&gt;</strong>";
                return;
            }

            httpCmd.open("GET", cmdUrl + escape("updateentryalias") + "&eid=" + escape(arr[1]) + "&newalias=" + escape(arr[2]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "entryname":
        case "rn":
            // entryname <entryid> <entryname>
            if (arr.length < 3) {
                divInfo.innerHTML = "<strong>Error!</strong> To edit an entry's name, use the following syntax <strong>entryname &lt;entry id&gt; &lt;entry name&gt;</strong>";
                return;
            }

            name = "";
            for (var i=2; i < arr.length; i++)
            {
                if (name != "") name += " " + arr[i];
                else name = arr[i];
            }
    
            httpCmd.open("GET", cmdUrl + escape("updateentryname") + "&eid=" + escape(arr[1]) + "&entryname=" + escape(name),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "entrynotes":
        case "en":
            // entrynotes <entryid>
            if (arr.length != 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To edit a notes entry, use the following syntax <strong>entrynotes &lt;entry id&gt;</strong>";
                return;
            }

            preQueue.style.display = "none";
            txtNotes.style.display = "";
            hidID.value = arr[1];
            hidType.value = 'entrynotes';

            entryID = arr[1];
            currentType = 'entrynotes';


            httpCmd.open("GET", cmdUrl + escape("editentrynotes") + "&eid=" + escape(arr[1]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "entrytags":
        case "et":
            // entrytags <entryid> <tags>
            if (arr.length < 3) {
                divInfo.innerHTML = "<strong>Error!</strong> To edit an entry's tags, use the following syntax <strong>entrytags &lt;entry id&gt; &lt;tags&gt;</strong>";
                return;
            }

            tags = "";
            for (var i=2; i < arr.length; i++)
            {
                if (tags != "") tags += " " + arr[i];
                else tags = arr[i];
            }

            httpCmd.open("GET", cmdUrl + escape("updateentrytags") + "&eid=" + escape(arr[1]) + "&tags=" + escape(tags),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "favorite":
        case "fav":
            // favorite <entry id> <(true|false)>
            if (arr.length != 3) {
                divInfo.innerHTML = "<strong>Error!</strong> To change the specified entry's 'is favorite' status, use the following syntax <strong>favorite &lt;entry id&gt; &lt;(true|false&gt;</strong>";
                return;
            }
            if (arr[2] != 'true' && arr[2] != 'false') {
                divInfo.innerHTML = "<strong>Error!</strong> To change the specified entry's 'is favorite' status, use the following syntax <strong>favorite &lt;entry id&gt; &lt;(true|false&gt;</strong>";
                return;
            }

            httpCmd.open("GET", cmdUrl + escape("favorite") + "&eid=" + escape(arr[1]) + "&favorite=" + escape(arr[2]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "field":
        case "f":
            // field <fieldid>
            if (arr.length != 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To view an entry's field, use the following syntax: <strong>field &lt;fieldid&gt;</strong>";
                return;
            }

            fieldID = arr[1];
            currentType = 'field';

            httpCmd.open("GET", cmdUrl + escape("viewfield") + "&eid=" + entryID + "&fid=" + escape(arr[1]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "fieldcaption":
        case "fc":
            // fieldcaption <fieldid> <caption>
            if (arr.length < 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To update an entry's field's caption, use the following syntax: <strong>fieldcaption &lt;fieldid&gt; &lt;caption&gt;</strong>";
                return;
            }

            caption = "";
            for (var i=2; i < arr.length; i++)
            {
                if (caption != "") caption += " " + arr[i];
                else caption = arr[i];
            }

                        currentType = "field";

            httpCmd.open("GET", cmdUrl + escape("updatefieldcaption") + "&eid=" + entryID + "&fid=" + escape(arr[1]) + "&caption=" + escape(caption),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "fieldnotes":
        case "fn":
            // fieldnotes <fieldid>
            if (arr.length != 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To edit an entry's field's notes, use the following syntax: <strong>fieldnotes &lt;fieldid&gt;</strong>";
                return;
            }

            preQueue.style.display = "none";
            txtNotes.style.display = "";
            hidID.value = arr[1];
            hidType.value = 'fieldnotes';

            fieldID = arr[1];
            currentType = 'fieldnotes';

            httpCmd.open("GET", cmdUrl + escape("editfieldnotes") + "&eid=" + entryID + "&fid=" + escape(arr[1]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "fieldvalue":
        case "fv":
            // fieldvalue <fieldid> <value>
            if (arr.length < 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To update an entry's field's value, use the following syntax: <strong>fieldvalue &lt;fieldid&gt; &lt;value&gt;</strong>";
                return;
            }

            value = "";
            for (var i=2; i < arr.length; i++)
            {
                if (value != "") value += " " + arr[i];
                else value = arr[i];
            }

                        currentType = "field";

            httpCmd.open("GET", cmdUrl + escape("updatefieldvalue") + "&eid=" + entryID + "&fid=" + escape(arr[1]) + "&value=" + escape(value),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "gettingstarted":
            divCurrent.innerHTML = "&nbsp;";
            preQueue.innerHTML = h_gettingstarted();
            currentType = '';
            break;

        case "gui":
            //window.location = "main.php";
            break;
        
        case "help":
            keywords = "";
            for (var i=0; i < arr.length; i++)
            {
                if (keywords != "") keywords += " " + arr[i];
                else keywords = arr[i];
            }
                        
            httpCmd.open("GET", hlpUrl + "?cmd=" + escape(keywords),true);
            httpCmd.onreadystatechange = exeCmdHelp;
            currentType = '';
                        break;

        case "history":
        case "h":
            keywords = "-h";
            
            currentType = '';

            httpCmd.open("GET", cmdUrl + escape("search") + "&keywords=" + escape(keywords),true);
            httpCmd.onreadystatechange = exeCmd;
            break;
            
        case "info":
        case "i":
            // info <entryid>
            if (arr.length != 2) {
                divInfo.innerHTML = "<strong>Error!</strong> To view an entry's details, use the following syntax: <strong>info &lt;entryid&gt;</strong>";
                return;
            }
            
            httpCmd.open("GET", cmdUrl + escape("entryinfo") + "&eid=" + escape(arr[1]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;
        
        case "login":
            // login <email> <password>
            divCurrent.innerHTML = "&nbsp;";
            
            if (arr.length != 4) {
                divInfo.innerHTML = "<strong>Error!</strong> To login, use the following syntax: <strong>login &lt;email&gt; &lt;password&gt; &lt;remember me (true | false)&gt;</strong>";
                return;
            }

            currentType = '';
            
            httpCmd.open("GET", cmdUrl + escape("login") + "&email=" + escape(arr[1]) + "&pass=" + escape(arr[2]) + "&remember=" + escape(arr[3]),true);
            httpCmd.onreadystatechange = exeCmdHome; // exeCmd;
            break;
            
        case "logout":
            divCurrent.innerHTML = "&nbsp;";
            httpCmd.open("GET", cmdUrl + escape("logout"),true);
            httpCmd.onreadystatechange = exeCmd;

            currentType = '';
            break;
            
        case "movefield":
        case "mf":
            // movefield <source field id> <target field id>
            if (arr.length != 3) {
                divInfo.innerHTML = "<strong>Error!</strong> To move a field, use the following syntax: <strong>movefield &lt;source field id&gt; &lt;target field id&gt;</strong>";
                return;
            }
            
            httpCmd.open("GET", cmdUrl + escape("movefield") + "&eid=" + entryID + "&sourceid=" + escape(arr[1]) + "&targetid=" + escape(arr[2]),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "news":
            preQueue.innerHTML = h_news();
            currentType = '';
            break;

        case "parentid":
        case "pid":
                        // pid <entry id> <parent id>
            if (arr.length != 3) {
                divInfo.innerHTML = "<strong>Error!</strong> To set an entry parent, use the following syntax: <strong>pid &lt;entry id&gt; &lt;parent entry id&gt;</strong>";
                return;
            }
            
            httpCmd.open("GET", cmdUrl + escape("parentid") + "&eid=" + escape(arr[1]) + "&pid=" + escape(arr[2]),true);
            httpCmd.onreadystatechange = exeCmd;
                        break;


        case "ref":
            httpCmd.open("GET", hlpUrl + "?cmd=" + escape('help ref'),true);
            httpCmd.onreadystatechange = exeCmd;
            currentType = '';
            break;

                case "register":
            // register <username> <email> <password>
            divCurrent.innerHTML = "&nbsp;";
            
            if (arr.length != 4) {
                divInfo.innerHTML = "<strong>Error!</strong> To register, use the following syntax: <strong>register &lt;username&gt; &lt;email&gt; &lt;password&gt;</strong>";
                return;
            }

            currentType = '';
            
            httpCmd.open("GET", cmdUrl + escape("register") + "&username=" + escape(arr[1]) + "&email=" + escape(arr[2]) + "&pass=" + escape(arr[3]),true);
            httpCmd.onreadystatechange = exeCmdHome; // exeCmd;
                        break;

        case "savenotes":
        case "sn":
            // savenotes
            itemID = hidID.value;
            notes = txtNotes.value;
            txtCmd.value = "";
            preQueue.style.display = "none";
            txtNotes.style.display = "";
            txtNotes.focus();

            if (hidType.value == "entrynotes")
            {
                httpCmd.open("GET", cmdUrl + escape("saveentrynotes") + "&eid=" + itemID + "&notes=" + escape(notes),true);
                preQueue.innerHTML = notes;
            }
            else
            {
                httpCmd.open("GET", cmdUrl + escape("savefieldnotes") + "&eid=" + entryID + "&fid=" + itemID + "&notes=" + escape(notes),true);
                preQueue.innerHTML = notes;
            }

            httpCmd.onreadystatechange = exeNotesSave;
            
            var dt = new Date();
            var hr = dt.getHours();
            var min = dt.getMinutes();
            var sec = dt.getSeconds();
            var updDate = '';
            if (hr < 10) updDate += '0';
            updDate += hr + ':';
            if (min < 10) updDate += '0';
            updDate += min + ':';
            if (sec < 10) updDate += '0';
            updDate += sec;
            
            divInfo.innerHTML = "The notes have been saved (" + updDate + ")";
            
            break;

        case "search":
        case "s":
            keywords = "";
            for (var i=1; i < arr.length; i++)
            {
                if (keywords != "") keywords += " " + arr[i];
                else keywords = arr[i];
            }

            currentType = '';
            
            httpCmd.open("GET", cmdUrl + escape("search") + "&keywords=" + escape(keywords),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "searchresults":
        case "sr":
            if (searchResults != '')
            {
                preQueue.innerHTML = "&nbsp;<pre>" + searchResults + "</pre>";
                divInfo.innerHTML = "Search Results";
            }
            break;

        case "admin.searchusers":
            keywords = "";
            for (var i=1; i < arr.length; i++)
            {
                if (keywords != "") keywords += " " + arr[i];
                else keywords = arr[i];
            }

            currentType = '';
            
            httpCmd.open("GET", cmdUrl + escape("searchusers") + "&keywords=" + escape(keywords),true);
            httpCmd.onreadystatechange = exeCmd;
            break;

        case "up":
            switch (currentType)
            {
                    case 'field':
                    case 'fieldnotes':
                    case 'entrynotes':
                            currentType = 'entry';
                            httpCmd.open("GET", cmdUrl + escape("viewentry") + "&eid=" + escape(entryID),true);
                            httpCmd.onreadystatechange = exeCmd;
                            break;

                    case 'entry':
                            txtNotes.style.display = "none";
                            divCurrent.innerHTML = "&nbsp;";
                            preQueue.innerHTML = h_home();
                            preQueue.style.display = "";
                            hidID.value = "";

                            currentType = '';

                            var keywords = "";
                            httpCmd.open("GET", cmdUrl + escape("search") + "&keywords=" + escape(keywords),true);
                            httpCmd.onreadystatechange = exeCmdHome;
                            break;
            }
            break;
            
        default:
            divInfo.innerHTML = "ERROR! [" + arr[0] + "] is not a valid command";

            if (arr[0].indexOf("sear") >= 0) divInfo.innerHTML += " &nbsp; Did you mean :search ?";
            if (arr[0].indexOf("adden") >= 0) divInfo.innerHTML += " &nbsp; Did you mean :addentry ?";
            if (arr[0].indexOf("addfi") >= 0) divInfo.innerHTML += " &nbsp; Did you mean :addfield ?";

            return;
            break;
    }

    // clean up the stored id's etc - according to type
    if (currentType == 'entry')
    {
        fieldID = 0;
    }
    if (currentType == 'entrynotes')
    {
        fieldID = 0;
    }
    if (currentType == '')
    {
        entryID = 0;
        fieldID = 0;
    }
    
    // send the ajax command
    ajaxBusy = true;

    try {
        httpCmd.send(null);
    }
    catch(err) {
                return;
    }
    
    txtCmd.value = "";
    txtCmd.focus();
    
    return;
}
