// rev 23 February 20 2011

function select_first(type) {
    var select_type = type !== undefined ? type : 'text';
    var which_fld   = "";
    var i;
    var n;
    var e;
    if (document.forms[0]) {
        for (i=0; i < document.forms.length; i++) {
            e=document.forms[i].elements;
            for (n = 0; n < e.length; n++) {
                if (e[n]!==null && e[n].type) { if (e[n].type===select_type) { which_fld = e[n]; break; } }
            }
            if (which_fld !== "") { which_fld.focus(); break; }
        }
    }
}

function textPreview(from,to,start,end) {
    if (document.getElementById(from) && document.getElementById(to)) {
        start   = (start) ? start : '<p>';
        end     = (end) ? end : '</p>';
        var newline = /\n/g;
        var paragraph = /\n\n/g;
        var newText = document.getElementById(from).value;
        var divPreview = document.getElementById(to);
        if (newText !== "") {
            newText = newText.replace(paragraph, "</p><p>");
            newText = newText.replace(newline, "<br/>");
            divPreview.innerHTML = start + newText + end;
        } else {
            divPreview.innerHTML = "";
        }
    }
}

// Substitute for a common function
function $(id) {
    if (typeof id === "string") {
        var item        = null;
        if (document.getElementById) {
            item    = document.getElementById(id);
        } else if (document.all) {
            item    = document.all[id];
        }
        if (!item) {
            return;
        }
        return item;
    }
    return id;
}

function trainChars (str,carLen) {
    var origStr     = str;
    var chunkLen    = carLen;
    var pos         = 0;
    var trainer     = function() {
        origStr += origStr;
        pos++;
        return origStr.substring(pos,chunkLen+pos);
    };
    return trainer;
}

// Direct DOM Manipulation
function addDomElem (parentElemId,elemClass,elemType) {
    var newDomElem  = document.createElement(elemClass);
    if (elemType && newDomElem.type) {
        newDomElem.type=elemType;
    }
    var DomParent   = document.getElementById(parentElemId);
    DomParent.appendChild(newDomElem);
    return newDomElem;
}

// Direct DOM Manipulation
function deleteDomElem (elemId,parentElemId) {
    var DomElem     = document.getElementById(elemId);
    if (!DomElem) { return;}
    var DomParent   = document.getElementById(parentElemId);
    DomParent       = (DomParent) ? DomParent : DomElem.parentElement;
    DomParent.removeChild(DomElem);
    return DomElem;
}

// Set or append values in various elements
function setV (item,vals,mode,sep) {
    if (!item) { return ""; }
    var whichItem   = String( item.type || item.tagName ).toUpperCase();
    var newVals     = (vals) ? vals : [""];
    var append      = (mode === '+' || mode === 'add') ? true : false;
    var appendSep;
    var oldVals     = [];
    var i,v;
    switch ( whichItem ) {
        case 'TEXT':
            oldVals = [item.value];
            appendSep   = (sep) ? sep : ' ';
            item.value  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals[0] : newVals[0];
            return item.value;
        case 'SEARCH':
            oldVals = [item.value];
            appendSep   = (sep) ? sep : ' ';
            item.value  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals[0] : newVals[0];
            return item.value;
        case 'EMAIL':
            oldVals = [item.value];
            appendSep   = (sep) ? sep : ' ';
            item.value  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals[0] : newVals[0];
            return item.value;
        case 'HIDDEN':
            oldVals = [item.value];
            appendSep   = (sep) ? sep : ' ';
            item.value  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals[0] : newVals[0];
            return item.value;
        case 'TEXTAREA':
            oldVals = [item.value];
            appendSep   = (sep) ? sep : "\n";
            item.value  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals[0] : newVals[0];
            return item.value;
        case 'PASSWORD':
            oldVals = [item.value];
            appendSep   = (sep) ? sep : ' ';
            item.value  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals[0] : newVals[0];
            return item.value;
        case 'BUTTON':
            oldVals = [item.value];
            appendSep   = (sep) ? sep : ' ';
            item.value  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals[0] : newVals[0];
            return item.value;
        case 'SELECT-ONE':
            for (i = 0; i < item.options.length; i++) {
                if (item.options[i].value === newVals[0]) {
                    item.selectedIndex  = i;
                    break;
                }
            }
            if (i===item.options.length) {
                item.options[i] = new Option();
                item.options[i].value = newVals[0] || '';
                item.options[i].text = newVals[0] || 'Select One';
                item.options[i].selected = true;
            }
            return newVals[0];
        case 'SELECT-MULTIPLE':
            if (!append) { item.selectedIndex   = -1; }
            for (v = 0; v < newVals.length; v++) {
                for (i = 0; i < item.options.length; i++) {
                    if (item.options[i].value === newVals[v]) {
                        item.options[i].selected = true;
                    }
                }
            }
            return newVals;
        case 'CHECKBOX':
            oldVals = [item.checked];
            item.checked    = (newVals[0]) ? true : false;
            return item.checked;
        case 'RADIO':
            var thisRadio   = item.form.elements[item.name];
            if (newVals[0] === '-') {
                for (i = 0; i < thisRadio.length; i++) {
                    thisRadio[i].checked = false;
                }
            } else {
                for (i = 0; i < thisRadio.length; i++) {
                if (thisRadio[i].value === newVals[0]) {
                    thisRadio[i].checked = true;
                    break;
                    }
                }
            }
            return newVals[0];
        case 'P':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'H1':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'H2':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'H3':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'H4':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'H5':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'H6':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'FORM':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'SPAN':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        case 'DIV':
            oldVals = [item.innerHTML];
            appendSep       = (sep) ? sep : "<br />\n";
            item.innerHTML  = (append && oldVals[0]) ? oldVals[0] + appendSep + newVals.join(appendSep) : newVals.join(appendSep);
            return item.innerHTML;
        default:
            return "";
    }
}

// set value of an HTML element identified by id
function setItemValue (id,val) {
    var item        = null;
    var ret;
    if (document.getElementById) {
        item    = document.getElementById(id);
    } else if (document.all) {
        item    = document.all[id];
    }
    if (item !== null) {
        ret     = setV(item,[val]);
    }
    return ret;
}

function copyData (fld,type,src){
    if (!src) {return;}
    var typeStr = String(type);
    var setVal  = $(src) ? $(src).innerHTML : '_NO_SRC_';
    if (setVal === '_NO_SRC_') {return;}
    var fldStr = String(fld);
    var fldName = fldStr.split(/(?: |:)/,2);
    if (!fldName[1]) {
        fldName[1] = fldName[0];
        fldName[0] = 'SUP';
    }
    var dbfld = fldName[1];
    var db = fldName[0];
    if (typeStr.match(/^(t|n|a)$/)) {
        setItemValue(db+':'+dbfld,setVal);
    } else if (typeStr.match(/^(c|b)$/)) {
        if (setVal === 0) {setVal='';}
        setItemValue(db+':'+dbfld,setVal);
    }else if (typeStr.match(/^(r|rset)$/)) {
        if (setVal === '') {setVal='-';}
        setItemValue(document.forms.CompForm.elements[db+':'+dbfld][0].id,setVal);
    } else if (typeStr.match(/^(pop)$/)) {
        setItemValue(db+'_'+dbfld+'Select',setVal);
    } else if (typeStr.match(/^(d)$/)) {
        var date = String(setVal);
        var dateParts = date.split('-',3);
        dateParts[0] = (Number(dateParts[0])>0) ? dateParts[0] : 'Year';
        dateParts[1] = (Number(dateParts[1])>0) ? ['January','February','March','April','May','June','July','August','September','October','November','December'][dateParts[1]-1] : 'Month';
        dateParts[2] = (Number(dateParts[2])>0) ? Number(dateParts[2]) : 'Day';
        setItemValue(db+'_'+dbfld+'_yrSelect',dateParts[0]);
        setItemValue(db+'_'+dbfld+'_monSelect',dateParts[1]);
        setItemValue(db+'_'+dbfld+'_daySelect',dateParts[2]);
    } else {
        alert('unknown data type');
    }
    return setVal;
}

// append value to an HTML element identified by id
function appendItemValue (id,val) {
    var item        = null;
    var ret;
    if (document.getElementById) {
        item    = document.getElementById(id);
    } else if (document.all) {
        item    = document.all[id];
    }
    if (item !== null) {
        ret     = setV(item,[val], '+');
    }
    return ret;
}

// clear contents of an HTML element identified by id
function clearItem (id) {
    var item        = null;
    var ret;
    if (document.getElementById) {
        item    = document.getElementById(id);
    } else if (document.all) {
        item    = document.all[id];
    }
    if (item !== null) {
        ret     = setV(item,['']);
    }
    return ret;
}

function fadeClearItem (id) {
    var item        = null;
    var ret;
    if (document.getElementById) {
        item    = document.getElementById(id);
    } else if (document.all) {
        item    = document.all[id];
    }
    if (item !== null) {
        item.style.color    = "#999";
        setTimeout(function(){item.style.color  = "#CCC";},1000);
        ret     = setV(item,['']);
    }
    return ret;
}

// Get values from various elements
function getV (item) {
    var itemVals    = [""];
    if (!item || item === null) {
        return { vals:itemVals, srcStat:['Error', 'No item,'] };
    }
    var itemRef   = item.type || item.tagName || '';
    if (!itemRef || itemRef === null) {
        return { vals:itemVals, srcStat:['Error', 'Unknown item.'] };
    }
    var whichItem   = String( itemRef ).toUpperCase();
    var i;
    switch ( whichItem ) {
        case 'TEXT':
            itemVals    = [item.value];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'SEARCH':
            itemVals    = [item.value];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'EMAIL':
            itemVals    = [item.value];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'HIDDEN':
            itemVals    = [item.value];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'TEXTAREA':
            itemVals    = [item.value];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'PASSWORD':
            itemVals    = [item.value];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'BUTTON':
            itemVals    = [item.value];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'SELECT-ONE':
            itemVals    = (item.selectedIndex > -1) ? [ item.options[item.selectedIndex].value || item.options[item.selectedIndex].text ] : [""];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'SELECT-MULTIPLE':
            var idx         = 0;
            var itemArray   = [];
            for (i = 0; i < item.options.length; i++) {
                if (item.options[i].selected) {
                    itemArray[idx++] = (item.options[i].value) ? item.options[i].value : item.options[i].text;
                }
            }
            itemVals    = [itemArray.join(',')];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'CHECKBOX':
            itemVals    = item.checked ? [1] : [0];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'RADIO':
            var thisRadio   = (item.form) ? item.form.elements[item.name] : document.getElementsByName(item.name);
            for (i = 0; i < thisRadio.length; i++) {
                if (thisRadio[i].checked) {
                    itemVals    = [thisRadio[i].value];
                    break;
                }
            }
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'P':
            itemVals    = [item.innerHTML];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'DIV':
            itemVals    = [item.innerHTML];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'SPAN':
            itemVals    = [item.innerText]; //  || item.innerHTML
            return { vals:itemVals, srcStat:['OK', whichItem] };
        case 'FORM':
            itemVals    = [item.innerHTML];
            return { vals:itemVals, srcStat:['OK', whichItem] };
        default:
            return { vals:itemVals, srcStat:['Error', 'Unknown item reference: ' + whichItem] };
    }
}

// Form values
function formParams (form) {
    var thisForm    = form;
    var formLen     = thisForm.elements.length;
    if (!formLen) { return ''; }
    var params      = '';
    var found       = {};
    var i;
    for (i = 0; i < formLen; i++) {
        if (thisForm.elements[i].name && !found[thisForm.elements[i].name]) {
            found[thisForm.elements[i].name] = true;
            params += thisForm.elements[i].name + '=' + encodeURIComponent(getV(thisForm.elements[i]).vals[0]) + ';';
        }
    }
    return params;
}

// Specified Form Values
function formSpecifiedParams (form,fldList) {
    var thisForm    = form;
    var formLen     = thisForm.elements.length;
    var i;
    var params      = '';
    var found       = {};
    if (!formLen) { return ''; }
    if (!fldList || fldList.length === 0) { return ''; }
    var theseFlds   = {};
    for (i = 0; i < fldList.length; i++) {
        theseFlds[fldList[i]] = 1;
    }
    for (i = 0; i < formLen; i++) {
        if (thisForm.elements[i].name &&
                theseFlds[thisForm.elements[i].name] &&
                    !found[thisForm.elements[i].name]) {
            found[thisForm.elements[i].name] = true;
            params += thisForm.elements[i].name + '=' + encodeURIComponent(getV(thisForm.elements[i]).vals[0]) + ';';
        }
    }
    return params;
}

// get single value from an HTML element identified by id
// (first only if source returns multiple values)
function getItemValue (id) {
    var item        = null;
    var ret;
    if (document.getElementById) {
        item    = document.getElementById(id);
    } else if (document.all) {
        item    = document.all[id];
    }
    if (item !== null) {
        ret     = getV(item);
        if (ret.srcStat[0] === 'OK') {
            return ret.vals[0];
        }
    }
    return "";
}

// get multiple values from an HTML element identified by id
function getItemValues (id) {
    var item        = null;
    var ret;
    if (document.getElementById) {
        item    = document.getElementById(id);
    } else if (document.all) {
        item    = document.all[id];
    }
    if (item !== null) {
        ret     = getV(item);
        if (ret.srcStat[0] === 'OK') {
            return ret.vals;
        }
    }
    return [];
}

// get single value from an HTML element identified by tagname and index
// (first only if source returns multiple values)
function getElemValue (tag,idx) {
    var item        = null;
    idx             = (idx) ? idx : 0;
    var ret;
    if (document.getElementsByTagName) {
        item    = document.getElementsByTagName(tag)[idx];
    } else if (document.all) {
        item    = document.all.tags(tag)[idx];
    }
    if (item !== null) {
        ret     = getV(item);
        if (ret.srcStat[0] === 'OK') {
            return ret.vals[0] || "" ;
        }
    }
    return [];
}

// get multiple values from an HTML element identified by tagname and index
function getElemValues (tag,idx) {
    var item        = null;
    idx             = (idx) ? idx : 0;
    var ret;
    if (document.getElementsByTagName) {
        item    = document.getElementsByTagName(tag)[idx];
    } else if (document.all) {
        item    = document.all.tags(tag)[idx];
    }
    if (item !== null) {
        ret     = getV(item);
        if (ret.srcStat[0] === 'OK') {
            return ret.vals;
        }
    }
    return [];
}

// randomize items
function shuffleValues (tgt,sep) {
    var deck    = getItemValue(tgt);
    if (!deck) {return;}
    sep         = sep ? sep : '\n';
    var list    = deck.split(sep);
    var i, j, listVal;
    for (i = 1; i < list.length; i++) {
        j   = Math.floor(Math.random()*(i+1));
        if (j !== i) {
            listVal = list[i];
            list[i] = list[j];
            list[j] = listVal;
        }
    }
    var newDeck = list.join(sep);
    setV($(tgt), [newDeck]);
}

// Cascade Contructor  call with new Cascade(tgt,src,pause,len,sep,initCol)
function Cascade (tgt,src,pause,len,sep,initCol) {
    this.tgt        = tgt;
    this.src        = src;
    this.pause      = pause;
    this.len        = len;
    this.sep        = (sep) ? sep : '<br> ';
    this.initCol    = (initCol) ? initCol : "#000000";
    var store_name  = this.tgt + '_state';
    var paramStr = "({'tgt':'"    + this.tgt +
                  "','src':'"     + this.src +
                  "','pause':'"   + this.pause +
                  "','len':'"     + this.len +
                  "','sep':'"     + this.sep +
                  "','initCol':'" + this.initCol + "'})";
    setV($(store_name), [paramStr]);
}

// Cascade Action
Cascade.prototype.go = function go () {
    var store       = this.tgt + '_state';
    var paramStr    = getItemValue(store);
    var stateObj    = eval(paramStr);
    var names       = getItemValue(stateObj.src);
    var name_list   = names.split(" |");
    var thisName    = name_list.pop();
    name_list.unshift(thisName);
    var rev_names   = name_list.join(" |");
    var show_names  = name_list.slice(0,stateObj.len);
    show_names[0]   = "<span id='first_scroll' class='scroll_first'>" + show_names[0] + '<\/span>';
    var new_str     = show_names.join(stateObj.sep);
    setV($(stateObj.tgt), [new_str]);
    setV($(stateObj.src), [rev_names]);
/* 
    $(stateObj.tgt).style.color = stateObj.initCol;
    setTimeout(function(){$(stateObj.tgt).style.color   = "";},1000);    

 */
     $('first_scroll').style.color = stateObj.initCol;
    setTimeout(function(){$('first_scroll').style.color   = "";},1000);    

};

// Cascade Factory
function cascader (tgt,src,pause,len,sep,initCol) {
    var cascade         = new Cascade(tgt,src,pause,len,sep,initCol);
    function goNow() {
        cascade.go();
        setTimeout(goNow,cascade.pause);
    }
    return goNow;
}

// set a style attribute of an HTML element identified by id
function setItemStyle (id,selector,val) {
    var item        = null;
    if (document.getElementById) {
        item    = document.getElementById(id);
    } else if (document.all) {
        item    = document.all[id];
    }
    if (!item) { return; }
    if (!selector) { return; }
    if (!"selector" in item.style) { return; }
    item.style[selector] = val;
    return val;
}

function disableItem (item) {
    if (!item) { return ""; }
    var whichItem   = String( item.type || item.tagName ).toUpperCase();
    switch ( whichItem ) {
        case 'TEXT':
            item.disabled  = true;
            return true;
        case 'TEXTAREA':
            item.disabled  = true;
            return true;
        case 'PASSWORD':
            item.disabled  = true;
            return true;
        case 'BUTTON':
            item.disabled  = true;
            return true;
        case 'SELECT-ONE':
            item.disabled  = true;
            return true;
        case 'SELECT-MULTIPLE':
            item.disabled  = true;
            return true;
        case 'CHECKBOX':
            item.disabled  = true;
            return true;
        case 'RADIO':
            item.disabled  = true;
            return true;
        default:
            return false;
    }
}

function enableItem (item) {
    if (!item) { return ""; }
    var whichItem   = String( item.type || item.tagName ).toUpperCase();
    switch ( whichItem ) {
        case 'TEXT':
            item.disabled  = false;
            return true;
        case 'TEXTAREA':
            item.disabled  = false;
            return true;
        case 'PASSWORD':
            item.disabled  = false;
            return true;
        case 'BUTTON':
            item.disabled  = false;
            return true;
        case 'SELECT-ONE':
            item.disabled  = false;
            return true;
        case 'SELECT-MULTIPLE':
            item.disabled  = false;
            return true;
        case 'CHECKBOX':
            item.disabled  = false;
            return true;
        case 'RADIO':
            item.disabled  = false;
            return true;
        default:
            return false;
    }
}

// Get META elements of document, returned as an object/hash
function getMeta () {
    var docMeta = {};
    var metaElements;
    var i;
    if (document.all) {
        metaElements = document.all.tags('META');
    } else if (document.getElementsByTagName) {
        metaElements = document.getElementsByTagName('META');
    } else {
        metaElements = [];
    }
    for (i = 0; i < metaElements.length; i++) {
        docMeta[metaElements[i].name]   = metaElements[i].content;
    }
    return docMeta;
}

// Get document keywords, returned as an array
function getMetaKeywords () {
    var metaKeywords = getMeta().keywords || [];
    return metaKeywords;
}

// Get the target of an event, mostly browser-proof
function getEventTarget (evt) {
    var targ;
    if (evt.target) {
        targ = evt.target;
    } else if (evt.currentTarget) {
        targ = evt.currentTarget;
    } else if (evt.srcElement) {
        targ = evt.srcElement;
    }
    // defeat Safari bug with text nodes:
    if (targ.nodeType === 3) {
        targ = targ.parentNode;
    }
    return targ;
}

// XHR Methods
// The core XHR executable object constructor -- call with "new AgentExec (url)".
// See prototypes below for methods.
function AgentExec (url) {
    // Initial values for the executable object
    this.statusText    = "INIT";
    this.returnVals    = [];
    this.msg           = "";
    this.err           = "";
}

// Main XHR Request method
function xhr(method,reqSync,params,reqOKProcs,preProcs,postProcs,reqTime,reqTimeProcs,noReqProcs,noExecProcs,uniqueAgent) {
    var ex  = {};
    if (uniqueAgent) {
        ex  = new AgentExec();
    } else {
        if (!window.xhrAgent) {
            window.xhrAgent = new AgentExec();
        }
        ex  = window.xhrAgent;
    }
    noExecProcs     = (noExecProcs) ? noExecProcs : [{fcn:'xhrReportErr', val:'No Remote Executable:'}];
    if (!ex.getExec()) {
        ex.statusText = "ERR";
        ex.process(noExecProcs);
        return ex;
    }
    noReqProcs      = (noReqProcs) ? noReqProcs : [{fcn:'xhrReportErr', val:'No Request Object Available.'}];
    if (!ex.getXHRequest()) {
        ex.process(noReqProcs);
        return ex;
    }
    method          = (method) ? method : 'GET';
    var aSync       = (reqSync) ? false : true;
    params          += '_t='+new Date().getTime()+';';
    preProcs        = (preProcs) ? preProcs : [];
    preProcs.unshift({fcn:'xhrReportMsg', val:'Ready (' + ex.dom + ').'});
    reqOKProcs      = (reqOKProcs) ? reqOKProcs : [{fcn:'xhrReportMsg', val:' OK. '}]; //[{fcn:'direct'}];
    postProcs       = (postProcs) ? postProcs : [];
    reqTime         = (reqTime && reqTime>0) ? reqTime : 90000;
    reqTimeProcs    = (reqTimeProcs) ? reqTimeProcs : [{'fcn':'xhrAbort', 'val':'HTTP Request Timed Out with ' + params}];
    ex.process(preProcs);
    ex.timeout      = setTimeout(function () {
        ex.process(reqTimeProcs);
    }, reqTime);
    var url;
    if (method === "GET") {
        url =   ex.makeExecURL(params);
        ex.request.open("GET", url, aSync);
        ex.request.onreadystatechange = function () {
            if (ex.request.readyState === 4) {
                ex.msg  += ex.request.readyState;
                clearTimeout(ex.timeout);
                if (ex.request.status === 200) {
                    if (aSync) {
                        ex.process(reqOKProcs);
                    }
                } else {
                    ex.err  += "Retrieval failure: " + ((ex.request.statusText) ? ex.request.statusText : 'unknown reason.') + " ";
                }
            } else {
                ex.msg  += ex.request.readyState + " - ";
            }
        };
        ex.request.send(null);
        if (!aSync) {
            ex.process(reqOKProcs);
        }
    } else if (method === "POST") {
        url =   ex.makeExecURL();
        ex.request.open("POST", url, aSync);
        ex.request.onreadystatechange = function () {
            if (ex.request.readyState === 4) {
                ex.msg  += ex.request.readyState;
                clearTimeout(ex.timeout);
                if (ex.request.status === 200) {
                    if (aSync) {
                        ex.process(reqOKProcs);
                    }
                } else {
                    ex.err  += "Retrieval failure: " + ((ex.request.statusText) ? ex.request.statusText : 'unknown reason.') + " ";
                }
            } else {
                ex.msg  += ex.request.readyState + " - ";
            }
        };
        ex.request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        ex.request.send(params);
        if (!aSync) {
            ex.process(reqOKProcs);
        }
    } else if (method === "HEAD") {
        url =   ex.makeExecURL(params);
        ex.request.open("HEAD", url, aSync);
        ex.request.onreadystatechange = function () {
            if (ex.request.readyState === 4) {
                ex.msg  += ex.request.readyState;
                clearTimeout(ex.timeout);
                if (ex.request.status === 200) {
                    if (aSync) {
                        ex.process(reqOKProcs);
                    }
                } else {
                    ex.err  += "Retrieval failure: " + ((ex.request.statusText) ? ex.request.statusText : 'unknown reason.') + " ";
                }
            } else {
                ex.msg  += ex.request.readyState + " - ";
            }
        };
        ex.request.send("");
        if (!aSync) {
            ex.process(reqOKProcs);
        }
    } else if (method === "PUT") {
        ex.err  += "Unsupported http request method: " + method;
        ex.statusText = "ERR";
    } else {
        ex.err  += "Unknown http request method: " + method;
        ex.statusText = "ERR";
    }
    if (postProcs) {
        ex.process(postProcs);
    }
    return ex;
}

// XHR GET
 function xhrGet(action,args,OKprocs,verbose,preProcs,postProcs,reqTime) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var timeLimit   = (reqTime && reqTime>0) ? reqTime : 90000;
    var requestor = xhr('GET',0,params,OKprocs,preProcs,postProcs,timeLimit);
    var outcome = requestor.execResult();
    switch (outcome.statusText) {
        case 'EXEC':
            if (verbose) { alert(outcome.statusText + " - " + outcome.msg); }
            return false;
        case 'TEXT':
            if (verbose) { alert(outcome.statusText + " - " + outcome.msg); }
            return false;
        case 'XML':
            if (verbose) { alert(outcome.statusText + " - " + outcome.returnVals + " - " + outcome.msg); }
            return false;
        case 'OK':
            if (verbose) { alert(outcome.statusText + " - " + outcome.msg); }
            return false;
        case 'ERR':
            if (verbose) { alert(outcome.statusText + " - " + outcome.err); }
            return true;
        case 'INIT':
            if (verbose) { alert(outcome.statusText + " - " + outcome.err); }
            return true;
        default:
            return true;
    }
}

// XHR RETRIEVE
 function xhrRetrieve(action,args,OKprocs,verbose,preProcs,postProcs) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var requestor = xhr('GET',1,params,OKprocs,preProcs,postProcs);
    return requestor.xhrText();
}

// XHR META
 function xhrAction(action,args,OKprocs,verbose) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var requestor = xhr('GET',0,params,OKprocs);
    return requestor.makeExecURL(params);
}

// XHR FCN
 function xhrFcn(action,args,OKprocs,verbose,preProcs,postProcs,reqTime) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var timeLimit   = (reqTime && reqTime>0) ? reqTime : 90000;
    var requestor = xhr('GET',1,params,OKprocs,preProcs,postProcs,timeLimit,[],[],[],1);
    var result_obj = requestor.xhrObject();
    var result_fcns = (result_obj.fcns) ? result_obj.fcns :
        (result_obj.length>0 && (result_obj[0].fcn)) ? result_obj :
        [{"fcn":"updateItem", "tgt":"xhr_msg", "val":"No functions returned."}];
    requestor.process(result_fcns);
    return false;
}

// XHR FORM FCN
 function xhrFormFcn(action,args,form,OKprocs,verbose,preProcs,postProcs,reqTime) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var i;
    if (form) {
        var formVals    = "";
        for (i = 0; i < form.elements.length; i++) {
            if (form.elements[i].name) {
                formVals += form.elements[i].name + "=" + encodeURIComponent(getV(form.elements[i]).vals[0]) + ";";
            }
        }
        if (formVals) { params += formVals; }
    }
    var timeLimit   = (reqTime && reqTime>0) ? reqTime : 90000;
    var requestor = xhr('POST',1,params,OKprocs,preProcs,postProcs,timeLimit,[],[],[],1);
    var result_obj = requestor.xhrObject();
    var result_fcns = (result_obj.fcns) ? result_obj.fcns :
        (result_obj.length>0 && (result_obj[0].fcn)) ? result_obj :
        [{"fcn":"updateItem", "tgt":"xhr_msg", "val":"No functions returned."}];
    requestor.process(result_fcns);
    return false;
}

// XHR OBJ
 function xhrObj(action,args,OKprocs,verbose,preProcs,postProcs) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var noProcs = [];
    preProcs    = (preProcs) ? preProcs : [];
    var requestor = xhr('GET',1,params,noProcs,preProcs,postProcs);
    var result_obj= requestor.xhrObject();
    requestor.result_val    = (result_obj.val) ? result_obj.val : "";
    var result_fcns = (result_obj.fcns) ? result_obj.fcns : [{fcn:'updateItem', tgt:'xhr_msg', val:'No object functions returned.'}];
    var fcns        = OKprocs;
    var fcn_list    = fcns.concat(result_fcns);
    requestor.process(fcn_list);
    return false;
}

// XHR LINK
 function xhrLink(action,args,OKprocs,verbose,preProcs,postProcs) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    xhr('GET',1,params,OKprocs,preProcs,postProcs);
    void(0);  // or return undefined;
}

// XHR REFRESH
 function xhrRefresh(action,args,OKprocs,interval,verbose,preProcs,postProcs) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    interval    = (interval) ? interval : 1000;
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var cntr    = 0;  // needed to force browser refresh
    var fcn     = function(){
        cntr++;
        xhr('GET',1,params+'cntr='+cntr,OKprocs,preProcs,postProcs,'',[],[],[],1);
        // last '1' is uniqueAgent - necessary to keep a long xhrRefresh from stepping on other actions
    };
    return window.setInterval(fcn,interval);
}

// XHR POST
function xhrPost(action,args,form,OKprocs,verbose,preProcs,postProcs,reqTime) {
    var params  = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params      += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    var i;
    if (form) {
        var formVals    = "";
        for (i = 0; i < form.elements.length; i++) {
            if (form.elements[i].name) {
                formVals += form.elements[i].name + "=" + encodeURIComponent(getV(form.elements[i]).vals[0]) + ";";
            }
        }
        if (formVals) { params += formVals; }
    }
    var timeLimit   = (reqTime && reqTime>0) ? reqTime : 90000;
    var requestor = xhr('POST',0,params,OKprocs,preProcs,postProcs,timeLimit);
    var outcome = requestor.execResult();
    switch (outcome.statusText) {
        case 'EXEC':
            if (verbose) { alert(outcome.statusText + " - " + outcome.msg); }
            if (requestor.output) { return outcome.returnVals; }  //???
            return false;
        case 'TEXT':
            if (verbose) { alert(outcome.statusText + " - " + outcome.msg); }
            return false;
        case 'XML':
            if (verbose) { alert(outcome.statusText + " - " + outcome.msg); }
            return false;
        case 'OK':
            if (verbose) { alert(outcome.statusText + " - " + outcome.msg); }
            return false;
        case 'ERR':
            if (verbose) { alert(outcome.statusText + " - " + outcome.err); }
            return true;
        case 'INIT':
            if (verbose) { alert(outcome.statusText + " - " + outcome.err); }
            return true;
        default:
            return true;
    }
}

// OBJ
// Main OBJECT method
function obj(object,method,params,objProcs,objOKProcs,objPreProcs,objPostProcs,uniqueAgent) {
    var ex  = {};
    if (uniqueAgent) {
        ex  = new AgentExec();
    } else {
        if (!window.xhrAgent) {
            window.xhrAgent = new AgentExec();
        }
        ex  = window.xhrAgent;
    }
    ex.msg  = '';
    var noExecProcs = [{fcn:'xhrReportErr', val:'No Remote Executable:'}];
    if (!ex.getExec()) {
        ex.statusText = "ERR";
        ex.process(noExecProcs);
        return ex;
    }
    method          = (method) ? method : 'SRC';
    params          += '_t='+new Date().getTime()+';';
    objProcs        = (objProcs) ? objProcs : [];
    objOKProcs      = (objOKProcs) ? objOKProcs : [{'fcn':'xhrReportMsg', 'val':'OK'}];
    objPreProcs     = (objPreProcs) ? objPreProcs : [{'fcn':'xhrReportMsg', 'val':'Ready.'}];
    objPostProcs    = (objPostProcs) ? objPostProcs : [];  // {fcn:'xhrReportMsg', val:'Done.'}
    var objFailedProcs  = [{'fcn':'xhrReportErr', 'val':'Object Source Failure.'}];
    ex.process(objPreProcs);
    if (method === "SRC") {
        ex.objURL =   ex.makeExecURL(params);
        ex.process(objProcs);
        if (ex.statusText === 'ERR') {
            ex.process(objFailedProcs);
            return ex;
        }
        ex.process(objOKProcs);
    } else {
        ex.err  += "Unknown http object method: " + method;
        ex.statusText = "ERR";
        return ex;
    }
    ex.process(objPostProcs);
    return ex;
}

function objSetSrc(object,action,args,OKProcs,preProcs,postProcs,uniqueAgent) {
    object          = (object) ? object : getEventTarget(event);
    var params      = (action) ? 'action=' + encodeURIComponent(action) + ';' : "";
    if (args) { params += args + ';'; }
    params          += (getItemValue('do_test')) ? 'SYS:do_test=1;' : "";
    OKProcs         = (OKProcs) ? OKProcs : [{fcn:'xhrReportMsg', val:'Source loaded OK'}];
    var objProcs    = [{'fcn':'setItemSrc','tgt':object}];
    obj(object,'SRC',params,objProcs,OKProcs,preProcs,postProcs,uniqueAgent);
    return false;
}

// XHR Executable Object Methods
// Prototypes for AgentExec
AgentExec.prototype.getXHRequest    = function() {
    this.msg           = "";
    try {
        this.request    = new XMLHttpRequest();
        this.dom            = "W3C-STD";
    } catch(e) {
        try {
            this.request    = new ActiveXObject("Msxml2.XMLHTTP");
            this.dom        = "IE6";
        } catch(f) {
            try {
                this.request    = new ActiveXObject("Microsoft.XMLHTTP");
                this.dom        = "IE5";
            } catch(g) {
                this.err            += "XHR Object initialization failed: " + g + " - ";
                this.statusText     = 'ERR';
                this.dom            = "Unknown";
                return false;
            }
        }
    }
    return true;
};

// Again, using heuristic to get the DOM, choose a dom-specific method for identifying an item during processing
     // Try IE/Windows ActiveX (IEx DOM)
if (window.ActiveXObject) {
    AgentExec.prototype.getItem    = function () {
        var item;
        if (this.processObj) {
            item  = (this.processObj.itm) ?
                        this.processObj.itm :
                    (this.processObj.tgt && document.all[this.processObj.tgt]) ?
                        document.all[this.processObj.tgt] :
                    (this.processObj.tgt && document.getElementById(this.processObj.tgt)) ?
                        document.getElementById(this.processObj.tgt) :
                    (this.processObj.tag && document.all.tags(this.processObj.tag)) ?
                         document.all.tags(this.processObj.tag)[this.processObj.idx || 0] :
                    null;
        }
        return item;
    };
} else {
    // Otherwise, assume standards (W3C DOM)
    AgentExec.prototype.getItem    = function () {
        var item;
        if (this.processObj) {
            item  = (this.processObj.itm) ?
                        this.processObj.itm :
                    (this.processObj.tgt && document.getElementById(this.processObj.tgt)) ?
                        document.getElementById(this.processObj.tgt) :
                    (this.processObj.tag && document.getElementsByTagName(this.processObj.tag) ) ?
                        document.getElementsByTagName(this.processObj.tag)[this.processObj.idx || 0] :
                    null;
        }
        return item;
    };
}

AgentExec.prototype.getExec   = function (url) {
    // Get the XHR executable
    // Determine the URL of the XHR executable
    if (url) {
        this.execSrc    = 'url';
    } else if (window.cgi) {
        // allow use of top-level variables cgi, exec, and sid
        url                     = window.cgi + ((window.sid) ? "/" + window.sid : "");
        this.execSrc    = 'wcgi';
    } else if (window.exec) {
        // cgi & exec are used the same way, as the URL of the executable
        url                     = window.exec + ((window.sid) ? "/" + window.sid : "");
        this.execSrc    = 'wexec';
    } else if (getMeta().xhr_exec) {
        // the executable may be specified as a META element, name = xhr_exec
        url                     = getMeta().xhr_exec;
        url                     += (getMeta().xhr_sid) ? "/" + getMeta().xhr_sid : (window.sid) ? "/" + window.sid : "";
        this.execSrc    = 'meta';
    } else {
        // use the document's own url
        url                     = (document.URL) ? document.URL : document.location;
        this.execSrc    = 'doc';
    }
    // Parse and check the URL
    if (url) {
        var execRE  = /^(.*\/([^\.\/]+\.(cgi|pl|exe|scpt)))\/?(([^\?]+)\??(.*))?$/i;
        var res     = execRE.exec(url);
        if (res) {
            this.origURL       = res[0];
            // properties cgi & exec have the same value in this object instance
            this.cgi           = res[1];
            this.exec          = res[1];
            this.scriptName    = res[2];
            this.scriptSuf     = res[3] || "";
            this.queryStr      = res[4] || "";
            this.sid           = res[5] || "";
            this.args          = res[6] || "";
        } else {
            this.err   += "Source URL failed to yield known executable: " + url + " ";
            return false;
        }
    } else {
        this.err    += "No source URL. ";
        return false;
    }
    this.msg       += " OK. Executable loaded (" + this.execSrc + "). - ";
    this.statusText    = "EXEC";
    return true;
};

// A method to handle callbacks at any stage of execution
AgentExec.prototype.process       = function (processObjects) {
    var i;
    for (i = 0; i < processObjects.length; i++) {
        // check
        if (processObjects[i] && processObjects[i].fcn) {
            // Assign this process object and its function to the executable object
            this.processObj     = processObjects[i];
            this.processFcn     = (this[this.processObj.fcn]) ? this[this.processObj.fcn] : this.processObj.fcn;
            // Execute the process, capturing any result value
            this.returnVals[i]  = this.processFcn();
        }
    }
};

// A method to stringify the executable object
AgentExec.prototype.toString      = function () {
    return  "Status: " + this.statusText + " " +
        ((this.msg) ? "Msg: " + this.msg + " " : "") +
        ((this.err) ? "Err: " + this.err + " " : "") +
        this.returnVals.join(" - ");
};

// A method to stringify the result array
AgentExec.prototype.resToString       = function () {
    return this.returnVals.join(" - ");
};

// A method to get the result (current state, really) from the executable
AgentExec.prototype.execResult        = function () {
    return {msg:this.msg, err:this.err, statusText:this.statusText, returnVals:this.returnVals};
};

AgentExec.prototype.xhrAbort      = function () {
    this.statusText     = 'ERR';
    this.request.abort();
    this.err        += this.processObj.val || 'Aborted with ' + this.toString();
    window.status   = this.err;
};

AgentExec.prototype.xhrReportErr  = function () {
    this.statusText     = 'ERR';
    window.status   = this.err + ((this.processObj.val) ? '  ' + this.processObj.val : '');
    this.err        += (this.processObj.val) ? ' - ' + this.processObj.val : '';
};

AgentExec.prototype.xhrReportMsg  = function () {
    window.status   = this.msg + ((this.processObj.val) ? '  ' + this.processObj.val : '  ' + this.statusText);
    this.msg        += ((this.processObj.val) ? this.processObj.val : this.statusText) + " - ";
};

AgentExec.prototype.say   = function () {
    alert(this.processObj.val);
};

AgentExec.prototype.hey   = function (msg) {
    alert((msg) ? msg : this.statusText);
};

// A method for assembling the executable's url on the fly
AgentExec.prototype.makeExecURL   = function (args) {
    var exURL       = this.exec;
    exURL           += (this.sid) ? '/' + this.sid : "";
    exURL           += (args) ? '?' + args : "";
    return exURL;
};

AgentExec.prototype.clearItem    = function () {
    return setV(this.getItem(), [""]);
};

AgentExec.prototype.fadeClearItem    = function () {
    var thisItem    = this.getItem();
    var upd         = setV(thisItem, [""]);
    thisItem.style.color    = "#666";
    setTimeout(function(){thisItem.style.color  = "#CCC";},1000);
    return upd;
};

AgentExec.prototype.clearElem    = function () {
    return setV(this.getItem(), [""]);
};

AgentExec.prototype.updateItem    = function () {
    var retVal  = (this.processObj.val) ? this.processObj.val : (this.result_val) ? this.result_val : this.request.responseText || '';
    return setV(this.getItem(), [retVal]);
};

AgentExec.prototype.flashUpdateItem    = function () {
    var retVal  = (this.processObj.val) ? this.processObj.val : (this.result_val) ? this.result_val : this.request.responseText || '';
    var thisItem    = this.getItem();
    var upd     =  setV(thisItem, [retVal]);
    thisItem.style.color    = "#F00";
    setTimeout(function(){thisItem.style.color  = "";},1000);
    return upd;
};

AgentExec.prototype.setItemSrc    = function () {
    var obj     = this.getItem();
    if (!obj) {
        this.statusText     = 'ERR';
        this.err        += 'No object!';
        window.status   = this.err;
        return;
    }
    var srcURL  = (this.processObj.url) ? this.processObj.url : (this.objURL) ? this.objURL : this.exec;
    try {
        obj.src = "";
        obj.src = srcURL;
    } catch (e) {
        this.statusText     = 'ERR';
        this.err        += 'Source not set: ' + e;
        window.status   = this.err;
        return;
        }
    return srcURL;
};

AgentExec.prototype.clearItemSrc    = function () {
    var obj     = this.getItem();
    if (!obj) {
        this.err        += 'No object!';
        window.status   = this.err;
        return;
    }
    try {
        obj.src = "";
    } catch (e) {
        this.err        += 'Source not cleared: ' + e;
        window.status   = this.err;
        return;
        }
    return 1;
};

AgentExec.prototype.setItemStyle  = function () {
    var item        = this.getItem();
    var selector    = (this.processObj.sel) ? this.processObj.sel : '';
    if (!item) { return; }
    if (!selector) { return; }
    if (!"selector" in item.style) { return; }
    item.style[selector] = ((this.processObj.val) ? this.processObj.val : '');
    return this.processObj.val;
};

AgentExec.prototype.direct    = function () {
    return (this.processObj.val) ? this.processObj.val : this.request.responseText;
};

AgentExec.prototype.updateItemXML = function () {
    var thisXML = (this.processObj.val) ? this.processObj.val : this.request.responseXML;
    thisXML     = (thisXML) ? thisXML : "<?xml version=\"1.0\"?><result><value>No XML Data Returned. </value><status>OK</status></result>";
    return setV(this.getItem(), [thisXML]);
};

AgentExec.prototype.updateElem    = function () {
    return setV(this.getItem(), [(this.processObj.val) ? this.processObj.val : (this.result_val) ? this.result_val : this.request.responseText]);
};

AgentExec.prototype.appendToItem  = function () {
    var val  = (this.processObj.val) ? this.processObj.val : (this.result_val) ? this.result_val : this.request.responseText;
    var sep  = (this.processObj.sep) ? this.processObj.sep : "<br />";
    return setV(this.getItem(), [val],'+',sep);
};

AgentExec.prototype.appendToElem  = function () {
    var val  = (this.processObj.val) ? this.processObj.val : (this.result_val) ? this.result_val : this.request.responseText;
    var sep  = (this.processObj.sep) ? this.processObj.sep : "<br />";
    return setV(this.getItem(), [val],'+',sep);
};

AgentExec.prototype.addSelect = function() {
    var val  = (this.processObj.val) ? this.processObj.val : (this.result_val) ? this.result_val : this.request.responseText;
    var thisItem   = this.getItem();
    var itemType   = String( thisItem.type || thisItem.tagName ).toUpperCase();
    if (itemType !== 'SELECT-ONE') {return 1;}
    var numOpts = thisItem.options.length;
    for (i=0;i<numOpts;i++) {
        if (thisItem.options[i].value===val[0]) {
            thisItem.options[i].innerHTML=val[1];
            return 1;
        }
    }
    thisItem.options.length++;
    thisItem.options[numOpts].value=val[0];
    thisItem.options[numOpts].innerHTML=val[1];
    thisItem.selectedIndex = numOpts;
    return 1;
};

// Direct DOM Manipulation
AgentExec.prototype.addDomElem   = function() {
    var elemClass  = (this.processObj.val) ? this.processObj.val : (this.result_val) ? this.result_val : this.request.responseText;
    var newDomElem  = document.createElement(elemClass);
    var newElemType    = (this.processObj.elemType) ? this.processObj.elemType : ''; 
    if (newElemType && newDomElem.type) {
        newDomElem.type=newElemType;
    }
    if (this.processObj.setId) {
        newDomElem.id = this.processObj.setId;
    }
    var DomParent   = this.getItem();
    DomParent.appendChild(newDomElem);
    return newDomElem;
};

AgentExec.prototype.deleteDomElem   = function() {
    var DomElem     = this.getItem();
    if (!DomElem) { return;}
    var DomParent   = DomElem.parentElement;
    DomParent.removeChild(DomElem);
    return DomElem;
};

AgentExec.prototype.focusItem     = function () {
    var item    = this.getItem();
    if (item !== null) { return item.focus(); }
    return 1;
};

AgentExec.prototype.xhrText       = function () {
    return this.request.responseText || "";
};

AgentExec.prototype.xhrXML        = function () {
    return this.request.responseXML || "<?xml version=\"1.0\"?><result><value>No XML Data Returned</value><status>OK</status></result>";
};

AgentExec.prototype.xhrObject       = function () {
    var result_str = this.request.responseText || "";
    var result_obj;
    try {
        if (typeof(result_str) !== 'string' || !result_str.length) {
            result_obj = [{"fcn":"xhrReportErr", "val":"Invalid XHR Object."}];
        } else {
            var t = result_str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
                    .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
                    .replace(/(?:^|:|,)(?:\s*\[)+/g, '');
            if (/^[\],:{}\s]*$/.test(t)) {
                result_obj = eval('(' + result_str + ')');
            } else{
                result_obj = [{"fcn":"xhrReportErr", "val":"Invalid Object Serialization: " + result_str}];
            }
        }
    } catch(e) {
        result_obj  = [{"fcn":"xhrReportErr", "val":"Functions " + e}];
    }
    return result_obj;
};

// Above is derived from Douglas Crockford <https://github.com/douglascrockford/JSON-js/blob/master/json2.js>
//  if (/^[\],:{}\s]*$/
//         .test(result_str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
//         .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
//         .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {



