
function getKeyCode(e) {
    if (window.event) {
        return window.event.keyCode;
    } else if (e) {
        return e.which;
    } else {
        return null;
    }
}

function Entity(el, re) {
    re || (re = null);
    if (el) {
        this._type = el.tagName;
        this._html = {};
        for (var i = el.firstChild; i; i = i.nextSibling) {
            var val = '';
            if (i.firstChild && i.firstChild.data)
                val = i.firstChild.data;
            if (!re)
                this[i.tagName] = val;
            else if (re.test(i.tagName))
                this[i.tagName] = val;
        }
    }
};

function findPosX(obj) {
    var curleft = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curleft += obj.offsetLeft;
            obj = obj.offsetParent;
        }
    } else if (obj.x) {
        curleft += obj.x;
    }
    return curleft;
}

function findPosY(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curtop += obj.offsetTop;
            obj = obj.offsetParent;
        }
    }
    else if (obj.y)
        curtop += obj.y;
    return curtop;
}

function trim(str) {
    return str.replace(/^(\s+)?(\S*)(\s+)?$/, '$2');
}

function ltrim(str) {
    return str.replace(/^\s*/, '');
}

function rtrim(str) {
    return str.replace(/\s*$/, '');
}

function commify(num) {
    num = num.toString();
    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) {
        num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
    }
    return num;
}

function getkeycode(e) {
    if (document.layers) {
        return e.which;
    } else if (document.all) {
        return event.keyCode;
    } else if ($) {
        return e.keyCode;
    } else {
        return 0;
    }
}

// set list selection to option based on value
function selectOption(elementID, elementVal) {
    var lst = $(elementID);
    for(var i = 0; i< lst.options.length; i++) {
        if( lst.options[i].value == elementVal) {
            lst.selectedIndex = i;
            return;
        }
    }
}

function Timer(nPauseTime) {
    this._pauseTime = typeof nPauseTime == "undefined" ? 1000 : nPauseTime;
    this._timer = null;
    this._isStarted = false;
}

Timer.prototype.start = function () {
//     if (this.isStarted()) {
//         this.stop();
//     }
    var oThis = this;
    this._timer = window.setTimeout(function () {
        if (typeof oThis.ontimer == "function") {
            oThis.ontimer(oThis.handle);
        }
    }, this._pauseTime);
    this._isStarted = true;
};

Timer.prototype.stop = function () {
    if (this._timer != null) {
        window.clearTimeout(this._timer);
    }
    this._isStarted = false;
};

Timer.prototype.isStarted = function () {
    return this._isStarted;
};

Timer.prototype.getPauseTime = function () {
    return this._pauseTime;
};

Timer.prototype.setPauseTime = function (nPauseTime) {
    this._pauseTime = nPauseTime;
};

function fixStyle(styleName) {
    var words = new Array();
    words = styleName.split('-');
    for(var j = 1; j < words.length; j++) {
        firstLetter = words[j].substring(0,1);
        restOfWord = words[j].substring(1,words[j].length);
        firstLetter = firstLetter.toUpperCase();
        words[j] = firstLetter + restOfWord;
    }
    return words.join("");
}

function selectmouse(e) {
    var fobj = Event.element(e);
    fobj = Event.findElement(e, fobj.tagName);
    try {
        if ((isMenu.status) && (isMenu.overMenu == false)) {
            isMenu.status = false ;
            isMenu.overMenu = false;
            isMenu.handle.style.display = "none";
        }
    } catch (e) { }
    try {
        if (fobj.drag) {
            try {
                $("sizeN").style.display = "none";
                $("sizeS").style.display = "none";
                $("sizeE").style.display = "none";
                $("sizeW").style.display = "none";
            } catch (e) { }
            try {
                for (var i in isDrag.multiDrag) {
                    isDrag.multiDragtx[i] = parseInt(isDrag.multiDrag[i].style.left + 0);
                    isDrag.multiDragty[i] = parseInt(isDrag.multiDrag[i].style.top + 0);
                    if (fobj == isDrag.multiDrag[i]) {
                        isDrag.status = true;
                    }
                }
            } catch (e) { }
            isDrag.x = Event.pointerX(e);
            isDrag.y = Event.pointerY(e);
            document.onmousemove = movemouse;
            return false;
        }
    } catch (e) { }
    try {
        if (fobj.resize) {
            isResize.status = true;
            isResize.handle = fobj;
            try {
                isResize.tx = parseInt(isResize.handle.style.left + 0);
                isResize.ty = parseInt(isResize.handle.style.top + 0);
            } catch (e) { }
            isResize.x = Event.pointerX(e);
            isResize.y = Event.pointerY(e);
            document.onmousemove = resizemouse;
            return false;
        }
    } catch (e) { }
    var control = nn6 ? e.ctrlKey : event.ctrlKey;
    if (control) {
        box = $("selectorBox");
        box.x = Event.pointerX(e);
        box.y = Event.pointerY(e);
        box.style.display = "block";
        document.onmousemove = selectormouse;
        return false;
    }
}

function selectormouse(e) {
    box = $("selectorBox");
    x = Event.pointerX(e);
    y = Event.pointerY(e);
    if (x > box.x) {
        box.style.left = box.x+"px";
        box.style.width = (x - box.x)+"px";
    } else if (x < box.x) {
        box.style.left = x+"px";
        box.style.width = (box.x - x)+"px";
    }
    if (y > box.y) {
        box.style.top = box.y+"px";
        box.style.height = y - box.y+"px";
    } else if (y < box.y) {
        box.style.top = y+"px";
        box.style.height = (box.y - y)+"px";
    }
}

function resizemouse(e) {
    if (isResize.status) {
        canvasTop = isResize.handle.attachedTo.minTop;
        canvasLeft = isResize.handle.attachedTo.minLeft;
        deltax = isResize.tx + Event.pointerX(e) - isResize.x;
        deltay = isResize.ty + Event.pointerY(e) - isResize.y;
        if (isDrag.dragGrid) {
            deltax = (Math.round(deltax / isDrag.gridSize) * isDrag.gridSize) + (canvasLeft % isDrag.gridSize);
            deltay = (Math.round(deltay / isDrag.gridSize) * isDrag.gridSize) + (canvasTop % isDrag.gridSize);
        }
        var debug = $("debug");
        var sizeBox = $("sizeBox");
        var infoBox = $("infoBox");
        sizeBox.attachedTo = isResize.handle.attachedTo;
        switch (isResize.handle.id) {
        case "sizeN":
            sizeBox.style.left = isResize.handle.attachedTo.style.left;
            sizeBox.style.width = isResize.handle.attachedTo.clientWidth+"px";
            if ((deltay >= canvasTop) && (deltay <= (parseInt(isResize.handle.attachedTo.style.top + 0) + isResize.handle.attachedTo.clientHeight))) {
                sizeBox.style.top  = deltay+"px";
            } else if (deltay < canvasTop) {
                sizeBox.style.top = canvasTop+"px";
            } else {
                sizeBox.style.top = (parseInt(isResize.handle.attachedTo.style.top + 0) + isResize.handle.attachedTo.clientHeight)+"px";
            }
            sizeBox.style.height = ((parseInt(isResize.handle.attachedTo.style.top + 0) + isResize.handle.attachedTo.clientHeight) - parseInt(sizeBox.style.top + 0))+"px";
            sizeBox.style.display = "block";
            break;
        case "sizeS":
            sizeBox.style.left = isResize.handle.attachedTo.style.left;
            sizeBox.style.width = isResize.handle.attachedTo.clientWidth+"px";
            sizeBox.style.top = isResize.handle.attachedTo.style.top;
            if ( (deltay >= (parseInt(sizeBox.style.top + 0))) && (deltay <= isResize.handle.attachedTo.maxTop) ) {
                sizeBox.style.height = (deltay - (parseInt(sizeBox.style.top + 0)))+"px";
            } else if (deltay > isResize.handle.attachedTo.maxTop) {
                sizeBox.style.height = (isResize.handle.attachedTo.maxTop - (parseInt(isResize.handle.attachedTo.style.top + 0)))+"px";
            } else {
                sizeBox.style.height = (parseInt(isResize.handle.attachedTo.style.top + 0))+"px";
            }
            sizeBox.style.display = "block";
            break;
        case "sizeE":
            sizeBox.style.left = isResize.handle.attachedTo.style.left;
            sizeBox.style.top = isResize.handle.attachedTo.style.top;
            sizeBox.style.height = isResize.handle.attachedTo.clientHeight+"px";
            if ( (deltax >= (parseInt(sizeBox.style.left + 0))) && (deltax <= isResize.handle.attachedTo.maxLeft) ) {
                sizeBox.style.width = (deltax - (parseInt(sizeBox.style.left + 0)))+"px";
            } else if (deltax > isResize.handle.attachedTo.maxLeft) {
                sizeBox.style.width = (isResize.handle.attachedTo.maxLeft - (parseInt(isResize.handle.attachedTo.style.left + 0)))+"px";
            } else {
                sizeBox.style.width = (parseInt(isResize.handle.attachedTo.style.left + 0))+"px";
            }
            sizeBox.style.display = "block";
            break;
        case "sizeW":
            sizeBox.style.top = isResize.handle.attachedTo.style.top;
            sizeBox.style.height = isResize.handle.attachedTo.clientHeight+"px";
            if ((deltax >= canvasLeft) && (deltax <= (parseInt(isResize.handle.attachedTo.style.left + 0) + isResize.handle.attachedTo.clientWidth))) {
                sizeBox.style.left = deltax+"px";
            } else if (deltax < canvasLeft) {
                sizeBox.style.left = canvasLeft+"px";
            } else {
                sizeBox.style.left = (parseInt(isResize.handle.attachedTo.style.left + 0) + isResize.handle.attachedTo.clientWidth)+"px";
            }
            sizeBox.style.width = ((parseInt(isResize.handle.attachedTo.style.left + 0) + isResize.handle.attachedTo.clientWidth) - parseInt(sizeBox.style.left + 0))+"px";
            sizeBox.style.display = "block";
            break;
        }
        infoBox.style.top = (parseInt(sizeBox.style.top + 0) - infoBox.clientHeight)+"px";
        infoBox.style.left = (parseInt(sizeBox.style.left + 0) + sizeBox.clientWidth + 10)+"px";
        infoBox.innerHTML = "Loc: "+(parseInt(sizeBox.style.top+0) - canvasTop)+","+(parseInt(sizeBox.style.left+0) - canvasLeft)+"<br>Size: "+sizeBox.clientHeight+","+sizeBox.clientWidth;
        infoBox.style.display = "block";
        return false;
    }
}

function movemouse(e) {
    function mover (handle, tx, ty) {
        deltax = tx + Event.pointerX(e) - isDrag.x;
        deltay = ty + Event.pointerY(e) - isDrag.y;
        if (isDrag.dragGrid) {
            deltax = (Math.round(deltax / isDrag.gridSize) * isDrag.gridSize) + (handle.minLeft % isDrag.gridSize);
            deltay = (Math.round(deltay / isDrag.gridSize) * isDrag.gridSize) + (handle.minTop % isDrag.gridSize);
        }
        if ((deltax >= handle.minLeft) && (deltax + handle.offsetWidth <= handle.maxLeft)) {
            handle.style.left = deltax+"px";
        } else if (deltax < handle.minLeft) {
            handle.style.left = handle.minLeft+"px";
        } else {
            handle.style.left = (handle.maxLeft - handle.offsetWidth)+"px";
        }
        if ((deltay >= handle.minTop) && (deltay + handle.offsetHeight <= handle.maxTop)) {
            handle.style.top  = deltay+"px";
        } else if (deltay < handle.minTop) {
            handle.style.top = handle.minTop+"px";
        } else {
            handle.style.top = (handle.maxTop - handle.offsetHeight)+"px";
        }
    }
    if (isDrag.status) {
        try {
            for (var i in isDrag.multiDrag) {
                mover(isDrag.multiDrag[i], isDrag.multiDragtx[i], isDrag.multiDragty[i]);
                element = isDrag.multiDrag[i];
            }
        } catch (e) { }
        element.handle.alignElements();
    }
    var infoBox = $("infoBox");
    element = isDrag.multiDrag[0];
    canvasTop = element.minTop;
    canvasLeft = element.minLeft;
    infoBox.style.top = (parseInt(element.style.top + 0) - infoBox.clientHeight)+"px";
    infoBox.style.left = (parseInt(element.style.left + 0) + element.clientWidth + 10)+"px";
    infoBox.innerHTML = "Loc: "+(parseInt(element.style.top+0) - canvasTop)+","+(parseInt(element.style.left+0) - canvasLeft)+"<br>Size: "+element.clientHeight+","+element.clientWidth;
    infoBox.style.display = "block";
}

setCookie = function ( sName, sValue, nDays ) {
    var expires = "";
    if ( nDays ) {
        var d = new Date();
        d.setTime( d.getTime() + nDays * 24 * 60 * 60 * 1000 );
        expires = "; expires=" + d.toGMTString();
    }

    document.cookie = sName + "=" + sValue + expires + "; path=/";
};

getCookie = function (sName) {
    var nameEQ = sName + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
};

removeCookie = function ( sName ) {
    setCookie( sName, "", -1 );
};

function $FN(element) {
    element = document.getElementsByName(element)[0];
    return element;
}

var TransactionForm = Class.create();
TransactionForm.prototype = {
    initialize : function (module, key) {
        this.formObj = new jcaForms('TransactionsFORM');
        this.formObj.module = module;
        this.formObj.key = key;
        this.formObj.formName = "TransactionHistory";
        this.formObj.afterLoad = function () {
            var args = {};
            args["funcName"] = "listTransactions";
            args["funcType"] = "HTML";
            args["funcKey[Module]"] = this.module;
            args["funcKey[Key]"] = this.key;
            var parms = $H(args).toQueryString();
            var myAjax = new Ajax.Updater("TransactionsFORMformElement5", "AjaxServ.php", { parameters: parms });
        }
    }
}

var JournalForm = Class.create();
JournalForm.prototype = {
    initialize : function (tableList) {
        this.formObj = new jcaForms('JournalFORM');
        this.formObj.formName = "Journal";
        this.formObj.ref = this;
        this.formObj.tableList = tableList;
        this.formObj.afterLoad = function () {
            var selObj = $("JournalFORMformElement15");
            selObj.ref = this.ref;
            selObj.options.length = 0;
            selObj.options[0] = new Option("", "")
            for (var i in this.tableList) {
                selObj.options[selObj.options.length] = new Option(i, this.tableList[i]);
            }
            selObj.onchange = function() {
                this.ref.showJournal({"funcKey[Key]"  :this.options[this.selectedIndex].value,
                                      "funcKey[Table]":this.options[this.selectedIndex].text});
            }
        }
    },
    showJournal : function(args) {
        args["funcName"] = "showJournal";
        args["funcType"] = "HTML";
        var parms = $H(args).toQueryString();
        var myAjax = new Ajax.Updater("JournalFORMformElement5", "AjaxServ.php", { parameters: parms });
    }
}

var GridWrapper = Class.create();
GridWrapper.prototype = {
    initialize : function (parms) {
        this.data = parms["default"];
        this.columns = parms["columns"];
        this.grid = new Active.Controls.Grid;
        this.grid.ref = this;
        this.grid.setId(parms["id"]);
        this.grid.setDataProperty("text", function(i, j) { return this.ref.data[i][j] });
        this.grid.setRowProperty("count", this.data.length);
        this.grid.setColumnProperty("text", function(i) { return this.ref.columns[i] });
        this.grid.setColumnProperty("count", this.columns.length);
        var x = document.styleSheets[0];
        if (x.insertRule) {
            x.insertRule('.active-controls-grid {height:100%;font:menu;}',x.cssRules.length);
        }
        if (x.addRule) {
            x.addRule('.active-controls-grid', 'height:100%;font:menu;');
        }
        for (var i = 0; i < parms["styles"].length; i++) {
            if (x.insertRule) {
                x.insertRule("#"+parms["id"]+" .active-column-"+i+" {"+parms["styles"][i]+"}",x.cssRules.length);
            }
            if (x.addRule) {
                x.addRule("#"+parms["id"]+" .active-column-"+i, parms["styles"][i]);
            }
        }
    }
}
var GridWrapper2 = Class.create();
GridWrapper2.prototype = {
    initialize : function (parms) {
        this.grid = new dhtmlXGridObject(parms["container"]);
        this.grid.setImagePath("/scripts/dhtmlXGrid/imgs/");
        this.grid.setHeader(parms["header"]);
        this.grid.setColAlign(parms["align"]);
        this.grid.setColTypes(parms["types"]);
        this.grid.setColSorting(parms["sorting"]);
        if (parms["widths"]) {
            this.grid.setInitWidths(parms["widths"]);
        }
        if (parms["widthsp"]) {
            this.grid.setInitWidthsP(parms["widthsp"]);
        }
        if (parms["colors"]) {
            this.grid.setColumnColor(parms["colors"]);
        }
        if (parms["multi"] == false) {
            this.grid.selMultiRows = false;
        } else {
            this.grid.selMultiRows = true;
        }
        if (parms["combos"]) {
            for (var h in parms["combos"]) {
                var combobox = this.grid.getCombo(h);
                for (var i in parms["combos"][h]) {
                    combobox.put(i, parms["combos"][h][i]);
                }
            }
        }
        this.grid.init();
        if (parms["url"]) {
            this.grid.loadXML(parms["url"]);
        }
    }
}

function ajaxDispatch (args, file, callback) {
    var parms = $H(args);
    parms = parms.toQueryString();
    var myAjax = new Ajax.Request(file, { parameters: parms, onComplete: callback });
}
function makeAutoComplete(id, func, opts) {
    var dropBox = document.createElement("div");
    dropBox.className = "auto_complete";
    dropBox.id = id+"_auto_complete";
    document.body.appendChild(dropBox);
    new Ajax.Autocompleter(id, dropBox.id, '/ajaxAutoComplete.php?Method='+func, opts);
}

var InfoBar = Class.create();
InfoBar.prototype = {
    initialize : function (startName, info) {
        infobar = new jcaForms('InfoBar');
        infobar.shadow = false;
        infobar.actions = form1.actions;
        infobar.formName = "InfoBar";
        infobar.afterLoad = function () {
            $("InfoBarformElement11").innerHTML = info[0];
            $("InfoBarformElement12").innerHTML = info[1];
            $("InfoBarformElement13").innerHTML = info[2];
            selectedTab(startName);
        }
        var unitID = "<!-- $unit.unitID -->";
        if (unitID != "-1") {
            infobar.loadForm();
        } else {
            selectedTab(startName);
        }
    }
}

function updateTree1Tier(response, tree) {
    eval("var json = " +response.responseText);
    for (var id in json["values"]) {
        var def = "";
        if (json["checked"].indexOf(id) != -1) {
            def = "CHECKED";
        }
        tree.insertNewChild(0, "p_"+id, json["values"][id], 0, 0, 0, 0, def);
    }
}

function updateTree2Tier(response, tree) {
    eval("var json = " +response.responseText);
    for (var id in json["values"]) {
        tree.insertNewChild(0, "p_"+id, json["values"][id]["name"], 0, 0, 0, 0, "CHILD");
        for (var id2 in json["values"][id]["value"]) {
            var def = "";
            if (json["checked"].indexOf(id2) != -1) {
                def = "CHECKED";
            }
            tree.insertNewChild("p_"+id, id+":"+id2, json["values"][id]["value"][id2], 0, 0, 0, 0, def);
        }
    }
}

GridWrapper3 = function(parms) {
    this.gridID = Ext.id();
    this.ddGroup = parms.ddGroup || null;
    this.autoExpandColumn = parms.autoExpandColumn || false;
    Ext.DomHelper.append(parms.element, { id: this.gridID, tag: 'div' });
    this.colModel = parms.colModel || [];
    if (parms.data && parms.fields) {
        this.data = parms.data;
        this.fields = parms.fields;
        this.ds = new Ext.data.Store({
            proxy: new Ext.data.MemoryProxy(this.data),
            reader: new Ext.data.ArrayReader({id: 0}, this.fields)
        });
        this.ds.load();
    }
    if (parms.ds) {
        this.ds = parms.ds;
    }
    this.colModel = new Ext.grid.ColumnModel(this.colModel);
    this.grid = new Ext.grid.EditorGrid(this.gridID, {
        enableDragDrop: true,
        autoExpandColumn: this.autoExpandColumn,
        selModel: new Ext.grid.RowSelectionModel({singleSelect: false}),
        trackMouseOver: true,
        ddGroup: this.ddGroup,
        ds: this.ds,
        cm: this.colModel,
        loadMask: true
    });
//    this.layout = Ext.BorderLayout.create({
//        center: {
//            panels: [new Ext.GridPanel(this.grid)]
//        }
//    }, parms.element);
}

blockValidate = true;

function validate(action) {
    if (blockValidate) {
        return;
    }
    blockValidate = true;
    if (Validator.Required(jcaRequiredFields)) {
        if (Validator.Restricted(jcaRestrictedFields)) {
            submitForm(action);
            return;
        }
    }
    blockValidate = false;
}

// function restrictedInput(element, restrictSet) {
//     if (restrictSet == "") {
//         return;
//     }
//     var newValue = "";
//     for (i = 0; i < element.value.length; i++) {
//         char = element.value.charAt(i);
//         if (restrictSet.indexOf(char,0) != -1) {
//             newValue += char;
//         }
//     }
//     element.value = newValue;
// }

Validator = function() {
    return {
        Required : function(fieldArray) {
            var strError = "Values are required in the highlighted fields\n\n";
            var isValid = true;
            for (var i = 0; i < fieldArray.length; i++) {
                try {
                    $(fieldArray[i]).style.borderColor = "";
                    if ($F(fieldArray[i]) == '') {
                        $(fieldArray[i]).style.borderColor = "red";
                        $(fieldArray[i]).focus();
                        isValid = false;
                    }
                } catch (e) { };
            }
            if(!isValid) {
                Ext.MessageBox.alert('Required Fields', strError);
            }
            return isValid;
        },
        Restricted : function (fieldArray) {
            var thePat, gotIt, i;
            var strError = "Invalid values in the highlighted fields\n\n";
            var isValid = true;
            for (i = 0; i < fieldArray.length; i++) {
                try {
                    $(fieldArray[i]).style.borderColor = "";
                    if ($F(fieldArray[i]) == '') {
                        continue;
                    }
                    thePat = FieldValidator[Ext.get(fieldArray[i]).getAttributeNS('jca', 'restriction')];
                    gotIt = thePat.exec($F(fieldArray[i]));
                    if(! gotIt) {
                        $(fieldArray[i]).style.borderColor = "red";
                        $(fieldArray[i]).focus();
                        isValid = false;
                    }
                } catch (e) { }
            }
            if(!isValid) {
                Ext.MessageBox.alert('Invalid Fields', strError);
            }
            return isValid;
        }
    }
}();

var FieldValidator = {
    zipCode : /\d{5}(-\d{4})?/,
    zipCodeHelp : "<b>Zip Code</b><br/>12345 or 12345-6789",
    zipCodeInput : "-0123456789",
    Currency : /\d+/,
    CurrencyHelp : "<b>Currency</b><br/>1234.56 or 789",
    CurrencyInput : "-.0123456789",
    Numeric : /\d+/,
    NumericHelp : "<b>Numeric</b><br/>123",
    NumericInput : ".0123456789",
    Time : /^([1-9]|1[0-2]):[0-5]\d$/,
    TimeHelp : "<b>Time</b><br/>5:04 or 12:34 but not 75:83",
    TimeInput : " :0123456789",
    emailAddress : /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/,
    emailAddressHelp : "<b>Email Address</b><br/>xxx@xxx.xxx",
    emailAddressInput : "",
    phoneNumber : /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/,
    phoneNumberHelp : "<b>Phone Number</b><br/>123-456-7890",
    phoneNumberInput : "-0123456789",
    phoneNumberInternational : /^\d(\d|-){7,20}/,
    phoneNumberInternationalHelp : "<b>Internation Phone Number</b><br/>011-123456789",
    phoneNumberInternationalInput : "-0123456789",
    ipAddress : /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,
    ipAddressHelp : "<b>IP Address</b><br/>100.101.102.103",
    ipAddressInput : ".0123456789",
    Date : /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/,
    DateHelp : "<b>Date</b><br/>01/01/2000",
    DateInput : "/0123456789",
    State : /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i,
    StateHelp : "<b>State</b><br/>2 Character Abbr. (FL)",
    StateInput : "ABCDEFGHIJKLMNOPQRSTUVWXYZ ",
    SSN : /^\d{3}\-\d{2}\-\d{4}$/,
    SSNHelp : "<b>Social Security Number</b><br/>123-45-6789",
    SSNInput : "-0123456789"
}

var globalTabPanel;

function initTabs(tabs) {
    var tab;
    globalTabPanel = new Ext.TabPanel("TabForms");
    globalTabPanel.bodyEl.addClass("grady");
    for (var tabName in tabs) {
        tab = globalTabPanel.addTab(tabName, tabName, "<div id='" + tabName + "FORM' style='height:100%;'>");
        tab.on('activate', function(tabPanel, tabPanelItem) {
            var hnd = Ext.getDom(tabPanelItem.id+"FORM").handle;
            if(!hnd.loaded) {
                hnd.loadForm();
            }
        });
    }
}

function selectedTab(tab) {
    globalTabPanel.activate(0);
}

popDialog = function() {
    var dialog;
    return {
        showDialog : function(header, urlString, animTarget) {
            var i = Ext.id();
            dialog = new Ext.BasicDialog(id, {
                autoCreate:{
                    tag:"div",
                    cls:"x-dlg",
                    children:[
                        { tag:"div", cls:"x-dlg-hd", html: header },
                        { tag:"div", cls:"x-dlg-bd", children: [
                            { id: "popIFrame", tag:"iframe", style: 'border:0px none;', src: urlString }
                        ]},
                        { tag:"div", cls:"x-dlg-ft" }
                    ]
                },
                animateTarget: animTarget,
                modal: true,
                shim: true,
                width: 900,
                height: 650,
                shadow: true
            });
            dialog.on('show', function() {
                Ext.get('popIFrame').fitToParent();
            });
            dialog.on('resize', function() {
                Ext.get('popIFrame').fitToParent();
            });
            dialog.on('hide', function() {
                popDialog.hide();
            });
            dialog.show();
        },
        show : function() {
            dialog.show();
        },
        hide : function() {
            if (dialog) {
                dialog.destroy(true);
            }
        }
    }
}();
