﻿/// CHCAUtil library developed and design by David Naas
/// CHCAUtil is overloaded to provide a namespace and act as class

//to use base object
//var chau = new CHCAUtil();
//chau.$clearNvc();
//chau.$addNvcKey('test', '1234123421434');
//alert(chau.$getNvcItem('test'));




CHCAUtil = function() {
    this.Name = "";
    this.HoverInfo = null;
    this.sdf$34536$Timer = null;
    this.NullLink = function() { }
    this.DisplayErrors = '';
    this.nvc = new Object();
    this.IsIE = false;
    this.Browser = "";
    this.MajorVersion = "";
    this.nvcError = false;
    this.CurrentEl = null;
    this.ComboArray = null;
    this.DdlArray = null;
    this.OverlayDataParent = '';
    this.PopUpCal = null;
    this.Debug = false;
    this.IsIPhone = false;
    this.$addNvcKey = function(key, value) {

        if (typeof (this.nvc[key] != "undefined")) {

            this.nvcError = true;
        }
        // if exists still go ahead and overwrite
        this.nvc[key] = value;
    };

    this.$clearNvc = function() {
        this.nvc = new Object();
    };

    this.$getNvc = function() {
        return this.nvc;
    };

    this.$getNvcItem = function(key) {
        return this.nvc[key];
    }
};


CHCAUtil.getDelimitor = function(s) {

    if (s.indexOf(':') > -1) {
        return ':';
    }

    if (s.indexOf('_') > -1) {
        return '_';
    }

    if (s.indexOf('-') > -1) {
        return '-';
    }

    if (s.indexOf(' ') > -1) {
        return ' ';
    }

    if (s.indexOf('||') > -1) {
        return '||';
    }

    if (s.indexOf('|') > -1) {
        return '|';
    }

    if (s.indexOf(',') > -1) {
        return ',';
    }

    return '-1';
};


var CHCAUtil_timeClass = {
    hours: 0,
    minutes: 0,
    useMilitaryTime: false,
    IsPm: false,
    timeBoxId: "",
    errorMessage: "",
    parseUserInput: function(userInput) {

        var inputs = userInput.split(":");
        var message = "";

        if (inputs.length == 2) {
            this.hours = parseInt(inputs[0]);
            this.minutes = parseInt(inputs[1]);
        }
        else {
            if (userInput >= 3 && userInput < 5) {
                var len = userInput.length;
                this.minutes = userInput.substring(len - 3, len - 1);
            }
            else {
                message = "invalid time input";
            }
        }


        if (this.hours > 24 || this.hours < 0) {
            message = "time entered incorrectly hours less than 0 or greater than 24\n"
        }

        if (this.minutes > 59 || this.minutes < 0) {
            message = "time entered incorrectly minutes greater than 60 or less than 0\n"
        }

        if (message.length > 0) {
            alert(message);
            CHCAUtil.$get('timeBoxId').value = '';
        }
    },

    hoursMinutes: function(dateObject) {
        this.hours = dateObject.getHours();
        this.minutes = dateObject.getMinutes();

        if (!this.useMilitaryTime) {
            if (this.hours >= 12) {
                this.hours = this.hours - 12;
                this.IsPm = true;
            }

            if (this.hours == 24 || this.hours == 0) {
                this.hours = 12;
                this.IsPm = false;
            }
        }

        CHCAUtil.$get(this.timeBoxId).value = CHCAUtil.fixHours(this.hours.toString()) + ":" + CHCAUtil.fixMinutes(this.minutes.toString());

        return CHCAUtil.fixHours(this.hours.toString()) + ":" + CHCAUtil.fixMinutes(this.minutes.toString());
    }
}



CHCAUtil.fixMinutes = function(s) {
    switch (s.length) {
        case 0:
            return '00';
        case 1:
            return s = '0' + s;
        case 2:
            return s;
        default:
            return s;
    }

};

CHCAUtil.fixHours = function(s) {
    return CHCAUtil.fixMinutes(s);
};




CHCAUtil.Debug = false;


CHCAUtil.$createElement = function(tag) {
    return document.createElementNS ? document.createElementNS('http://www.w3.org/1999/xhtml', tag) : document.createElement(tag);
};

CHCAUtil.$hasScriptInjection = function(s) {

    var status = false;
    if ((s.indexOf('<') > -1) && (s.indexOf('>') > -1)) {

        if ((s.indexOf('<')) < (s.indexOf('>'))) {

            status = true;
        }
    }

    return status;
};

/******************************************************* fixes the Overlay problem for IE 6 ******************************************/
CHCAUtil.$setDDLFixForIE6 = function(parentId) {
    CHCAUtil.ComboArray = new Array();
    if ((CHCAUtil.IsIE) && (CHCAUtil.MajorVersion == 6)) {
        var ddls = CHCAUtil.$get(parentId).getElementsByTagName('select');
        for (var i = 0; i < ddls.length; i++) {
            if ((ddls[i].style.display != 'none') && (ddls[i].style.visbility != 'hidden')) {
                CHCAUtil.ComboArray.push(ddls[i]);
                CHCAUtil.$hide(ddls[i]);
            }
        }
    }
};


// fixes the Overlay problem for IE 6
CHCAUtil.$resetDDLFixForIE6 = function() {
    if ((CHCAUtil.IsIE) && (CHCAUtil.MajorVersion == 6)) {
        for (var i = 0; i < CHCAUtil.ComboArray.length; i++) {
            CHCAUtil.$show(CHCAUtil.ComboArray[i]);
        }
    }
};

CHCAUtil.$addDdlForCalendar = function(ddlElem) {

    if ((ddlElem == null) || (ddlElem === undefined)) {
        return;
    }

    if ((CHCAUtil.DdlArray == null) || (CHCAUtil.DdlArray === undefined)) {
        CHCAUtil.DdlArray = new Array();
    }

    if ((CHCAUtil.IsIE) && (CHCAUtil.MajorVersion == 6)) {
        CHCAUtil.DdlArray.push(ddlElem);
    }
};


CHCAUtil.$hideDdlForCalendar = function() {
    if ((CHCAUtil.DdlArray == null) || (CHCAUtil.DdlArray === undefined)) {
        return;
    }

    for (var i = 0; i < CHCAUtil.DdlArray.length; i++) {
        CHCAUtil.$hide(CHCAUtil.DdlArray[i]);
    }
};


CHCAUtil.$showDdlForCalendar = function() {
    if ((CHCAUtil.DdlArray == null) || (CHCAUtil.DdlArray === undefined)) {
        return;
    }

    for (var i = 0; i < CHCAUtil.DdlArray.length; i++) {
        CHCAUtil.$show(CHCAUtil.DdlArray[i]);
    }
};



CHCAUtil.$setFormDirty = function() {
    CHCAUtil.$get('hdnFormDirty').value = '1';
   
    if (CHCAUtil.Debug) {
        CHCAError$Msgtext.push('***** Set Form Dirty has been called *****');
        CHCAUtil.initDebug();
    }
    
};

CHCAUtil.getBoolValue = function(s) {

    if (!isNaN(s)) {
        var i = parseInt(s);

        if (i > 0) {
            s = '1';
        } else {
            s = '0';
        }
    }

    switch (s.substring(0, 1).toLowerCase()) {

        case 'y':
        case 't':
        case '1':
            return true;
        default:
            return false;
    }

};


CHCAUtil.initDebug = function(evt) {

    var el;
    try {
        el = CHCAUtil.$getElement(evt);
        CHCAUtil.$assignBrowser();


    }
    catch (error) {
        //do nothing
    }

    if (CHCAUtil.Debug) {

        try {
            CHCAError$Msgtext.push('hdnFormDirty = ' + CHCAUtil.$get('hdnFormDirty').value);
            CHCAError$Msgtext.push('hdnReadOnly = ' + CHCAUtil.$get('hdnReadOnly').value);
            CHCAError$Msgtext.push('Browser version = ' + CHCAUtil.Browser + ' ' + CHCAUtil.MajorVersion);

            if ((typeof (evt) !== undefined) && (evt != null)) {
                CHCAError$Msgtext.push('Calling Event = ' + evt.type);
            }

            if ((el != null) && (typeof el !== undefined)) {
                CHCAError$Msgtext.push('Calling Element = ' + el.id);
            }

            CHCAUtil.$displayErrors('\n');
        }
        catch (e) { 
            //do nothing
        }
    }
};


CHCAUtil.$resetFormDirty = function() {
    CHCAUtil.$get('hdnFormDirty').value = '0';

    if (CHCAUtil.Debug) {
        alert('Reset FormDirty has been called')
    }
};


CHCAUtil.$callbusyInd = function(show, customMsg) { 

    // to be filled in
}


CHCAUtil.$pushArray = function(array1, array2) {
    for (var i = 0; i < array2.length; i++) {
        array1.push(array2[i]);
    }

    return array1;
};

CHCAUtil.$domReady = function(fnRef) {
    if (document.addEventListener) {
        document.addEventListener("DomContentLoaded", fnRef, false);
    }
    else {
        if (document.documentElement.doScroll) {
            try {
                document.documentElement.doScroll("left");
               
            }
            catch (e) {
                setTimeout(function() { CHCAUtil.$domReady(fnRef) }, 0);
                return;
            }
        }
        else {
            window.attachEvent('onload', fnRef);
        }

        setTimeout(fnRef, 4);
    }

};


CHCAUtil.$createElementNS = function(xmlNamespace,tag) {
    return document.createElementNS ? document.createElementNS(xmlNamespace, tag) : document.createElement(tag);
};

CHCAUtil.$createTextNode = function(el, value) {
    el.appendChild(document.createTextNode(value));
};

CHCAUtil.$createElemTextNode = function( tag, value, debug) {
    var el = CHCAUtil.$createElement(tag);

    CHCAUtil.$createTextNode(el, value);

    if (debug) {
        alert("   new tag = " + el.innerHTML);
    }
    return el;
};

///nodeToInsert, nodeToInsertBefore are elements use CHCAUtil.$get(id);
CHCAUtil.$insertBefore = function(nodeToInsert, nodeToInsertBefore) {
    nodeToInsertBefore.parentNode.insertBefore(nodeToInsert, nodeToInsertBefore);
};


///nodeToInsert, nodeToInsertBefore are elements use CHCAUtil.$get(id);
CHCAUtil.$replaceChild = function(nodeToInsert, nodeToReplace) {
    nodeToReplace.replaceChild(s, nodeToInsert);
};

/// nvc = name value collection
CHCAUtil.$createEleWithAttribs = function(tag, nvc) {
    var el = CHCAUtil.$createElement(tag);
    var errStatus = false;

    for (var val in nvc) {
        if (val.indexOf('_type') == -1) {

            if (el.setAttribute) {
                el.setAttribute(val, nvc[val]);
            }
            else {
                errStatus = true;
            }
        }
    }

    if (errStatus) {
        alert("Error setting node attributes in function CHCAUtil.$createEleWithAttrib");
    }

    return el;
};


CHCAUtil.$setOpacity = function(elem, level) {
    if (elem.filters) {

     elem.style.filter = 'alpha(opacity=' + 80  + ')';
    }
    else {
        elem.style.opacity = level / 100;
    }
};

CHCAUtil.$toggleVisibility = function(elem) {

    var curDisplay = CHCAUtil.$getStyle(elem, "visibility");


    if ((curDisplay == "visible") || (curDisplay == "inherit")) {
        elem.style.visibility = "hidden";
    }
    else {

        elem.style.visibility =  "visible";

    }
};

CHCAUtil.$showVisibility = function(elem) {
    elem.style.visibility = "visible";
};


CHCAUtil.$hideVisibility = function(elem) {
    var curDisplay = CHCAUtil.$getStyle(elem, "visibility");

    if ((curDisplay == "visible") || (curDisplay == "inherit")) {
        elem.$oldDisplay = curDisplay;
        elem.style.visibility = "hidden";
    }
};


CHCAUtil.$markRequired = function(elem, required) {
    var curClassName = elem.className;
    if (required) {
        if (curClassName.indexOf('required') < 0) {
            elem.className = elem.$oldClassName;
        }
    }
    else {
        if (curClassName.indexOf('required') > -1) {
            elem.$oldClassName = curClassName;
            elem.className = elem.className.replace('required', '');
        }
    }
};


CHCAUtil.$toggleDisplay = function(elem) {

    var curDisplay = CHCAUtil.$getStyle(elem, "display");


    if ((curDisplay == "inline") || (curDisplay == "block") || (curDisplay == "inherit")) {
        elem.$oldDisplay = curDisplay;
        elem.style.display = "none";
    }
    else {

        elem.style.display = elem.$oldDisplay || "block";

    }
};


CHCAUtil.$getAllChildren = function(parentEl, arrayOfTypes) {
    var col = new Array();

    for (var i = 0; i < arrayOfTypes.length; i++) {
        col = CHCAUtil.$pushArray(col, parentEl.getElementsByTagName(arrayOfTypes[i]));
    }

    return col;
};


CHCAUtil.$hide = function(elem) {
    var curDisplay = CHCAUtil.$getStyle(elem, "display");

    if (curDisplay != "none") {
        elem.$oldDisplay = curDisplay;
    }
    elem.style.display = "none";
};

CHCAUtil.$show = function(elem) {
    elem.style.display = elem.$oldDisplay || "block";
};


//20 frames a second fade in
CHCAUtil.$fadeIn = function(elem, to, speed) {
    CHCAUtil.$setOpacity(elem, 0);
    CHCAUtil.$show(elem);
    for (var i = 0; i <= 100; i += 5) {
        (function() 
        {
            var opacity = i;

            // Set the timeout to occur at the specified time in the future
            setTimeout(function() {

                // Set the new opacity of the element
            CHCAUtil.$setOpacity(elem, (opacity / 100) * to);

            }, (i + 1) * speed);
        })();
    }
};



CHCAUtil.$fadeOut = function(elem,  speed) {
    for (var i = 0; i < 100; i += 5) {
        (function() {
            var opacity = i;
            setTimeout(function() {

            CHCAUtil.$setOpacity(elem, 100 - opacity);

                if (opacity == 95)
                    CHCAUtil.$hide(elem);

            }, (i + 1) * speed);
        })();
    }
};



CHCAUtil.$getByClass = function(name, type, parentElement) {
    var r = [];
    var re = new RegExp("(^|\\s)" + name + "(\\s|$)");
    var e = null;
    
    if ((typeof (parentElement) == "undefined") || (parentElement == null)) {
        document.getElementsByTagName(type || "*");
    }
    else { 
    
    }

    for (var i = 0; i < e.length; i++) {

        if (re.test(e[i].className)) {
            r.push(e[i]);
        }
    }
    // Return the list of matched elements
    return r;
}



CHCAUtil.$clearAllInput = function(parentEl) {
    var inputs = parentEl.getElementsByTagName('input');

    for (var i = 0; i < inputs.length; i++) {
        switch (inputs[i].type) {
            case "checkbox":
                inputs[i].checked = false;
                break;
            case "text":
                inputs[i].value = '';
                break;
            case "radio":
                inputs[i].checked = "";
                break;
        }

    }

    inputs = parentEl.getElementsByTagName("select");

    for (var i = 0; i < inputs.length; i++) {
        inputs[i].selectedIndex = 0;
    }

    inputs = parentEl.getElementsByTagName("textarea");

    for (var i = 0; i < inputs.length; i++) {
        inputs[i].value = '';
    }
};





/*********************************************** TR TD Grid helpers ********************************************************/


CHCAUtil.$getNumberOfRowsFromTable = function(tableName) {
    var tableRows = null;

    try {
        tableRows = CHCAUtil.$get(tableName).getElementsByTagName('tr');
        return tableRows.length;
    }
    catch (e) {
        return 0;
    }
};



CHCAUtil.$tdClass = function(id, cssClass, innerHtml) {
    var td = null;
    var nvc = new CHCAUtil();

    if ((typeof (innerHtml) == "undefined") || (innerHtml == null) || (innerHtml.length < 1)) {
        innerHtml = '&nbsp;'
    }

    if ((typeof (id) != "undefined") && (id != null)) {
        nvc.$addNvcKey('id', id);
    }

    td = CHCAUtil.$createEleWithAttribs('td', nvc.$getNvc())

    if ((typeof (cssClass) != "undefined") && (cssClass != null)) {
        td.className = cssClass;
    }

    td.innerHTML = innerHtml;
    nvc = null;
    return td;
};



CHCAUtil.$trBuilderClass = function() {
    this.error = '';
    this.tds = [];
    this.count = 0;

    this.addTdKey = function(td) {
        this.tds.push(td);
    };

    this.removeCellByIndex = function(index) {
        this.tds.splice(index, 1);
    };

    this.removeCellById = function(id) {
        for (var i = 0; i < this.tds.length; i++) {
            try {
                if (id.toLowerCase() === td.id.toLowerCase()) {
                    this.tds.splice(i, 1);
                    break;
                }
            }
            catch (err) {
                //do nothing
            }
        }
    };

    this.addCell = function(tdElement) {
        this.tds.push(tdElement);
    }

    this.assignRowStyle = function(trs, evenRowStyle, oddRowStyle) {
        var rowClass = null;

        try {
            rowClass = trs[trs.length - 1].className;
        }
        catch (e) {
            //assign temp style
            rowClass = evenRowStyle;
        }

        if (rowClass == evenRowStyle) {
            rowClass = oddRowStyle;
        }
        else {
            rowClass = evenRowStyle;
        }

        return rowClass;
    };


    this.addRow = function(tableId, newTrId, trIdpattern, evenRowStyle, oddRowStyle) {
        var nvc = new CHCAUtil();
        nvc.$addNvcKey('id', newTrId);
        var trs = CHCAUtil.$findAll('tr', trIdpattern, '*', CHCAUtil.$get('tableId'));
        var tr = CHCAUtil.$createEleWithAttribs("tr", nvc.$getNvc());

        for (var i = 0; i < this.tds.length; i++) {
            tr.appendChild(this.tds[i]);
        }

        tr.className = this.assignRowStyle(trs, evenRowStyle, oddRowStyle);

        try {
            trs[0].parentNode.appendChild(tr);
        }
        catch (e) {
            CHCAUtil.$get(tableId).getElementsByTagName('tbody')[0].appendChild(tr);
        }
        this.count++;

        return tr;
    };

    this.replaceRowElCells = function(trEl) {
        var nvc = new CHCAUtil();
        var css = trEl.className;
        nvc.$addNvcKey('id', trEl.id);

        trEl.innerHTML = '';

        for (var i = 0; i < this.tds.length; i++) {
            trEl.appendChild(this.tds[i]);
        }

        trEl.className = css;

        nvc = null;
    };
};


// **************************************** tables, Grid and overlay Class ********************************************


CHCAUtil.$getNumberOfRowsFromTable = function(tableName) {
    var tableRows = null;

    try {
        tableRows = CHCAUtil.$get(tableName).getElementsByTagName('tr');
        return tableRows.length;
    }
    catch (e) {
        return 0;
    }
};



CHCAUtil.$gridOverlayClass = function(gridId, useVisibility, readOnlyId) {

    this.prefix = '';
    this.Grid = null;
    this.OverlayAndEntryNvc = new Object();
    this.trackingNvc = new Object();
    this.buttonNvc = new Object();
    this.nvcCount = 0;
    this.GridId = gridId;
    this.UseVisibility = useVisibility;
    this.ReadOnlyId = readOnlyId;
    this.isReadOnly = 1;
    this.secondaryKey = -1;
    this.UseVisibility = useVisibility;
    this.addEditAction = '';


    //Returns only data row count
    this.getDataRowsCount = function() {
        var count = this.Grid.getElementsByTagName('tr').length || 0;

        if (count > 0) {
            count--;
        }
        return count;
    };

    //returns data rows
    this.getDataRowsCount = function() {
        var rows = new Array();
        var trs = this.Grid.getElementsByTagName('tr') || 0;

        for (var i = 1; i < trs.length; i++) {
            rows.push(trs[i]);
        }

        return rows;
    }

    //Returns all row count
    this.getAllRowsCount = function() {
        var count = this.Grid.getElementsByTagName('tr').length || 0;
    };

    // key is the prefix + name
    this.addButton = function(prefix, name, elem, fn) {
        var key = prefix + name;
        this.addEditAction = 'add';
        
        if (fn === undefined) {
            elem.onclick = function() {
                eval("edit" + name + "('-1')");
                return false;
            };
        }
        else {
            elem.onclick = fn;

            return false;
        }

        this.buttonNvc[key] = elem;
    };

    this.getButton = function(key) {
        return this.buttonNvc[key];
    }

    this.getAllButton = function(key) {
        return this.buttonNvc;
    }

    // Add overlay
    this.addOverlay = function(key, elem) {

        if ((elem != "undefined") && (elem != null)) {
            if (this.OverlayAndEntryNvc[key] === undefined) {
                this.trackingNvc[this.nvcCount] = key;
                this.nvcCount++;
            }
            this.OverlayAndEntryNvc[key] = elem;
        }
        else {
            alert('CHCAUtil.$gridClass.addOverlay/addEntryDiv  undefined value error.')
        }
    };


    //add entry form Div
    this.addEntryDiv = function(key, value) {
        this.addOverlay(key, value);
    };

    this.getOverlayCollection = function() {
        return this.OverlayAndEntryNvc;
    };

    this.getOverlayCollectionItem = function(id) {
        return this.OverlayAndEntryNvc[id];
    };

};

/// *********************************************** additional gridOverlayClass functions ***********************************************
/// id id ID and type: 0,1 overlay and entry, 2= buttons
CHCAUtil.$gridOverlayClass.prototype.addDefaults = function(prefix, id, type, fn) {
    var nvcType = type || 0;

    try {
        switch (nvcType) {
            case 0:
            case 1:
                this.addEntryDiv(id, CHCAUtil.$get(id));
                break;
            case 2:
                this.addButton(prefix, id, CHCAUtil.$get(prefix + id), fn);
                break;
        }
    }
    catch (err) {
        //do nothing
    }
};


//Show all 
CHCAUtil.$gridOverlayClass.prototype.showAll = function() {
    for (var i = 0; i < this.nvcCount; i++) {
        if (this.UseVisibility) {
            CHCAUtil.$showVisibility(this.OverlayAndEntryNvc[this.trackingNvc[i]]);
        }
        else {
            CHCAUtil.$show(this.OverlayAndEntryNvc[this.trackingNvc[i]]);
        }
    }

};

//Show all display:none
CHCAUtil.$gridOverlayClass.prototype.show = function() {
    for (var i = 0; i < this.nvcCount; i++) {
            CHCAUtil.$show(this.OverlayAndEntryNvc[this.trackingNvc[i]]);
    }

};


//Init
CHCAUtil.$gridOverlayClass.prototype.init = function() {
    this.Grid = CHCAUtil.$get(this.GridId) || null;
    var tempId = this.GridId.substring(0, 3);

    if (this.UseVisibility === undefined || this.UseVisibility === null) {
        this.UseVisibility = true;
    }

    if (this.Grid == null) {
        this.Grid = CHCAUtil.$get('tro' + this.GridId);
        var tempId = this.GridId;
    }

    this.addDefaults('', 'entry' + tempId, 0);
    this.addDefaults('', 'overlay' + tempId, 0);
    this.addDefaults('btnAdd', tempId, 2);

    try {
        var rOId = this.ReadOnlyId || null;

        if (rOId == null) {
            this.isReadOnly = CHCAUtil.$get("hdnReadOnly").value;
        }
        else {
            this.isReadOnly = CHCAUtil.$get(rOId).value;
        }
    }
    catch (err) {
        // DO NOTHING
    }

};



//Hide div tags and clean out inputs and dropdowns
CHCAUtil.$gridOverlayClass.prototype.hideAll = function() {
    for (var i = 0; i < this.nvcCount; i++) {
        CHCAUtil.$clearAllInput(this.OverlayAndEntryNvc[this.trackingNvc[i]]);

        if (this.UseVisibility) {
            CHCAUtil.$hideVisibility(this.OverlayAndEntryNvc[this.trackingNvc[i]]);
        }
        else {
            CHCAUtil.$hide(this.OverlayAndEntryNvc[this.trackingNvc[i]]);
        }
    }
};



CHCAUtil.$gridOverlayClass.prototype.clearAll = function() {
    this.hideAll();
};


CHCAUtil.$gridOverlayClass.prototype.ClearCheckBoxes = function(parentElement) {
   CHCAUtil.$clearAllCheckboxes(parentElement);
};



// will be used to support multiple gridds on multile layers
CHCAUtil.$gridOverlayControlClass = function(_gridName) {
   


};



/**************************************************************************************************************/

//getAll used for only array of dom elements, single use CHCUtil.$get(id)
CHCAUtil.$getAll = function(pattern) {
    var el = new Array();
 
    id = "_" + id;

    if (el == null) { el = CHCAUtil.$findAll("input", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("select", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("textarea", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("a", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("img", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("button", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("div", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("span", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("label", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("li", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("table", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("tr", pattern); }
    if (el == null) { el = CHCAUtil.$findAll("td", pattern); }

    return el;
};


CHCAUtil.$getCssTop = function() {
    return parseInt(CHCAUtil.$getStyle(elem, "top"));
};

CHCAUtil.$getCssLeft = function() {
    return parseInt(CHCAUtil.$getStyle(elem, "left"));
};

CHCAUtil.$getStyle = function(elem, name) {
    if (elem.style[name]) {
        return elem.style[name];
    }
    // IEs method
    else if (elem.currentStyle) {
        return elem.currentStyle[name];
    }
    else if (document.defaultView && document.defaultView.getComputedStyle) {
        name = name.replace(/([A-Z])/g, "-$1");
        name = name.toLowerCase();

        var s = document.defaultView.getComputedStyle(elem, "");

        return s && s.getPropertyValue(name);
    }
    else {
        return null;
    }
};



CHCAUtil.$pageX = function(elem, checkBody) {

    if ((typeof (checkBody) == "undefined") || (checkBody == null)) {
        checkBody = false;
    }
    var p = 0;
    var parentEl = elem.offsetParent;

    if (!checkBody) {
        var p = elem.offsetLeft;
    }

    while ((parentEl.offsetParent) && (parentEl.tagName != 'BODY')) {
            p += parentEl.offsetLeft;
            parentEl = parentEl.offsetParent;
    }

    return p;
};


CHCAUtil.$pageY = function(elem) {
    var p = 0;

    while (elem.offsetParent) {
        p += elem.offsetTop;
        elem = elem.offsetParent;
    }
    return p;
};




CHCAUtil.$addAttributesByEl = function(el, nvc, id) {
    var errStatus = false;
    
    if ((id != null) &&(typeof(id) != "undefined"))
    {
        el = CHCAUtil.$get(id);
    }
    
    
    for (var val in nvc) {
        if (val.indexOf('_type') == -1) {
            if (el.setAttribute) {
                el.setAttribute(val, nvc[val]);
            }
            else {
                errStatus = true;
            }
        }
    }

    if (errStatus) {
        alert("Error setting node attributes in function CHCAUtil.$addAttributesByEl");
    }
};


CHCAUtil.$addAttributesByTag = function(tag, nvc) {
    var els = CHCAUtil.$findAll(tag, '*', '*');

    for (var i = 0; i < els.length; i++) {
        for (var val in nvc) {
            if (val.indexOf('_type') == -1) {
                if (el[i].setAttribute) {
                    el[i].setAttribute(val, nvc[val]);
                }
                else {
                    errStatus = true;
                }
            }
        }
    }

    if (errStatus) {
        alert("Error setting node attributes in function CHCAUtil.$addAttributesByTag");
    }
};
 

CHCAUtil.$removeElement = function(id) {
    CHCAUtil.$get(id).parentNode.removeChild(CHCAUtil.$get(id));
};

CHCAUtil.Parent = function(elem, num) {
    num = num || 1;
    for (var i = 0; i < num; i++) { if (elem != null) elem = elem.parentNode; }

    return elem;
};



CHCAUtil.$getZeroFromNull = function(s) {

    if ((s === null) || (typeof (s) === undefined) ||
    ((typeof (s) == "string") && (s.length < 1))) {
        return "0";
    }

    if (parseInt(s) == 0) {
        return "0";
    }
    return s;
};




CHCAUtil.$displayClassProperties = function(cls, seperator) {
    var oClient = cls;
    var test = seperator;

    for (var val in oClient) {
        if (val != "TestCookie") {
            test += val + ": " + oClient[val] + seperator;
        } else {
            test += val + ": " + oClient.TestCookie() + "<br/>";
        }
    }
    return test;
};

/***********************  Drop Down utils ****************************************/
CHCAUtil.$addOption = function(selectbox, text, value) {
    var optn = CHCAUtil.$createElement("option");
    optn.text = text;
    optn.value = value;
    selectbox.options.add(optn);
};

CHCAUtil.$settingSelectOption = function(selectbox, value) {
    for (var i = 0; i < selectbox.options.length; i++) {
        if (selectbox.options[i].value === value) {
            selectbox.options[i].selected = true;
        }
    }
};

CHCAUtil.$removeOption = function(selectbox, value) {
    for (var i = 0; i < selectbox.options.length; i++) {
        if (selectbox.options[i].value === value) {
            selectbox.remove(i);
        }
    }
};

CHCAUtil.$removeAllOptions = function(selectbox) {
    for (var i = selectbox.options.length - 1; i >= 0; i--) {
        selectbox.remove(i);
    }
};

/***********************************  drop down options end *********************************/

/************************************* overlay and check boxes start *************************************/

CHCAUtil.$overlay = function(id) {
    var overlay = CHCAUtil.$get(id);
    overlay.style.visibility = (overlay.style.visibility == "visible") ? "hidden" : "visible";
};

CHCAUtil.$void = function() { };


CHCAUtil.$howManyCheckboxesChecked = function(pattern) {
    var retval = 0;
    var checkBoxes = CHCAUtil.$findAll('input', pattern, 'checkbox');

    for (var i = 0; i < checkBoxes.length; i++) {
        if (checkBoxes[i].checked) {
            retval++;
        }
    }
    return retval;
};

///CHCAUtil.$setCheckboxes() will clear all boxes for entire page
///CHCAUtil.$setCheckboxes(null, null, true) will set all boxes for entire page
///CHCAUtil.$setCheckboxes(null, parentEl, true) will set all boxesin the parent element
///CHCAUtil.$setCheckboxes('ch_', parentEl, true) will set all boxesin the parent element
CHCAUtil.$setCheckboxes = function(pattern, parentElement, flag ) {
    var parentEl = parentElement || null;
    var flag = flag || false;
    var retval = 0;
    var pat = pattern || '*' 
    var checkBoxes = CHCAUtil.$findAll('input', pat, 'checkbox', parentEl);

    for (var i = 0; i < checkBoxes.length; i++) {
       checkBoxes[i].checked = flag;
    }
    return retval;
};

/// CHCAUtil.$clearAllCheckboxes(CHCAutil.$get(id));
CHCAUtil.$clearAllCheckboxes = function (parentElement)
{
    var parentEl =  parentElement || null; 
    CHCAUtil.$setCheckboxes('*', parentEl, false);
};

/// CHCAUtil.$setAllCheckboxes(CHCAutil.$get(id));
CHCAUtil.$setAllCheckboxes = function (parentElement)
{
    var parentEl =  parentElement || null; 
    CHCAUtil.$setCheckboxes('*', parentEl, true);
};
/**********************************************************************/



CHCAUtil.$get = function(id)
{
   var el = document.getElementById(id);
   
   if (el != null)
   {
        return el;
   }
   else
   {
        id = "_" + id;
        if (el == null) { el = CHCAUtil.$find("table", id); }
        if (el == null) { el = CHCAUtil.$find("input", id); }
        if (el == null) { el = CHCAUtil.$find("select", id); }
        if (el == null) { el = CHCAUtil.$find("textarea", id); }
        if (el == null){el = CHCAUtil.$find("a", id);}
        if (el == null){el = CHCAUtil.$find("img", id);}
        if (el == null){el = CHCAUtil.$find("button", id);}
        if (el == null){el = CHCAUtil.$find("div", id);}
        if (el == null){el = CHCAUtil.$find("span", id);}
        if (el == null){el = CHCAUtil.$find("label", id);}
        if (el == null){el = CHCAUtil.$find("li", id);}
        if (el == null){el = CHCAUtil.$find("tr", id);}
        if (el == null) { el = CHCAUtil.$find("td", id); }
        if (el == null) { el = CHCAUtil.$find("form", id); }
      
        return el;  
   }

};

/**********************************************************************************************************/
CHCAUtil.$replaceCombos = function(array, useArrayOnly) {
    var combos = CHCAUtil.$tag("select");

    if (!useArrayOnly) {
        useArrayOnly = false;
    }

    if (useArrayOnly && array.length > 0) {

        for (var i = 0; i < array.length; i++) {
            array[i].style.visibility = 'hidden';
        }
    }
    else {

        for (var i = 0; i < combos.length; i++) {
            var combo = combos[i];

            if (combo.style.visibility != 'hidden' && combo.style.display != 'none') {

                array.push(combo);
            }

            combo.style.visibility = 'hidden';
        }
    }
};

 CHCAUtil.$revealCombos = function(array) {
     for (var i = 0; i < array.length; i++) {
         array[i].style.visibility = 'visible';
     }
 };

/***********************************************************************************************/
CHCAUtil.$tag = function(tag, parentEl) {
    if ((typeof (parentEl) != "undefined") && (parentEl != null)) {
        return parentEl.getElementsByTagName(tag)
    }
    else {
        return document.getElementsByTagName(tag);
    }
};


CHCAUtil.$name = function (name)
{
    return document.getElementsByName(name);
};

//example tag = 'input', 'chk_', 'checkbox'
//example tag = 'input', '*', 'checkbox'
CHCAUtil.$findAll = function(tag, pattern, type, parentEl) {
    
    if ((typeof (tag) == "undefined") ||
        (tag == null)) {
        tag = "*";
    }

    var els = CHCAUtil.$tag(tag, parentEl);
    var retval = Array();

    if ((type === "*") && (pattern === "*")) {
        return els;
    }

    for (var i = 0; i < els.length; i++) {

        if (type != '*') {
            if ((els[i].type.toLowerCase() === type) &&
            ((els[i].id.toLowerCase().indexOf(pattern.toLowerCase()) > -1) ||
            (els[i].name.toLowerCase().indexOf(pattern.toLowerCase()) > -1)||
            (pattern === '*'))) 
            {
                retval.push(els[i]);
            }
        }
        else if (type == '*') {
            if (els[i].id.toLowerCase().indexOf(pattern.toLowerCase()) > -1) {
                retval.push(els[i]);
            }
        }
    }
    return retval;
};

CHCAUtil.$getRealLeft = function(el) {
    return CHCAUtil.$pageX(el);
};


CHCAUtil.$getRealTop = function(el) {
    return CHCAUtil.$pageY(el);
};

CHCAUtil.$setInput = function(pattern, type, evt, fn) {
    var elArray = CHCAUtil.$findAll('input', pattern, type);
    var el2Array = CHCAUtil.$findAll('textarea', pattern, '*');
    var el3Array = CHCAUtil.$findAll('select', pattern, '*');

    elArray = CHCAUtil.$addArrays(elArray, el2Array);
    elArray = CHCAUtil.$addArrays(elArray, el3Array);

    for (var i = 0; i < elArray.length; i++) {
        elArray[i][evt] = fn;
    }
};

CHCAUtil.$addArrays = function(array1, array2) {
    for (var i = 0; i < array2.length; i++) {
        array1.push(array2[i]);
    }
    return array1;
};

CHCAUtil.$find = function(tag, _pattern)
{
     var el = document.getElementsByTagName(tag);
     
     for(var i = 0; i < el.length; i++)
     {
        if (el[i].id.indexOf(_pattern) > -1)
        {
            return el[i];
        }
     }
    return null;     
 }; 
  

CHCAUtil.AddEvent = function(obj, type, fn) 
{
    try 
    {
        if (obj.addEventListener) 
        {
            obj.addEventListener(type, fn, true);
        }
        else if (obj.attachEvent) 
        {
            obj.attachEvent('on' + type, fn);
        }
        else 
        {
           type = "on" + type;
            
            if(typeof obj[type] == "function")
            {
                var oldListener = obj[type];
                
                obj[type] = function ()
                {
                    oldListener();
                    
                    return fn;
                };
            }
            else
            {
                obj[type] = fn;
            }
         }
     }
    catch (err) 
    {
        alert("Your AddEvent() is not wired correctly; check your AddEvent javascript code in your initialize function, check that your element Id's are correct and/or not duplicated. Also check for capitalization. " + err);
    }
};


CHCAUtil.RemoveEvent = function (obj, type, fn) 
{
    try 
    {
        if (obj.removeEventListener) {
            obj.removeEventListener(type, fn, true);
        }
        else if (obj.detachEvent) 
        {
            obj.detachEvent('on' + type, fn);
        }
        else 
        {
            obj["on" + type] = null;
        }
    }
    catch (err) 
    {
        alert("RemoveEvent could not clear event!!" + obj.id + err.message);
    }
};



CHCAUtil.FixEvent = function(event) {
	// add W3C standard event methods
	event.preventDefault = CHCAUtil.FixEvent.PreventDefault;
	event.stopPropagation = CHCAUtil.FixEvent.StopPropagation;
	return event;
};

CHCAUtil.FixEvent.PreventDefault = function() {
	this.returnValue = false;
};

CHCAUtil.FixEvent.StopPropagation = function() {
	this.cancelBubble = true;
};

  
CHCAUtil.InfoPopupClass = function ()
{
    this.Popup = null;
    this.PopupArrow = null;
    this.PopupDescripton = null;
    this.PopupMiscInfo = null;
    this.PopupCloseButton = null;
    this.PopupLoadingBanner = null;
    this.HoverElement = null;
    this.DL_IE4Mac = false; // this should never happen
    this.HoverLeft = 0;
    this.HoverTop = 0;
    this.Webservice = null;
    this.Timer = null
    this.HoverArrowImageRight = "images/tooltipArrowRight.gif";
    this.HoverArrowImageLeft = "images/tooltipArrowLeft.gif";
    this.HoverInfoWidth = 250;
    this.HoverInfoHeight = 70;
    this.Name = null;
    this.OffsetLeft = 0;
    this.OffsetTop = 0;
    this.ForceLeft = false;
    this.ForceRight = false;

    this.Init = function()
    {
        try
        {
            this.Popup = CHCAUtil.$get("InfoPopup");
            this.PopupArrow = CHCAUtil.$get("InfoPopupArrow");
            this.PopupDescripton = CHCAUtil.$get("InfoPopupDescription");
            this.PopupCloseButton = CHCAUtil.$get("InfoPopupCloseBtn");
            this.PopupMiscInfo = CHCAUtil.$get("InfoPopupMisc");
            this.PopupLoadingBanner = CHCAUtil.$get("InfoLoading");
        }
        catch(e)
        {
           alert("Error Initializing CHCAUtil.InfoPopupClass() ensure you have all required div tags" + e);
        }
     };    
}; 
        
        
CHCAUtil.InfoPopupClass.prototype.GetRealLeft = function()
{
	var parentEl = (this.DL_bIE4Mac) ? this.HoverElement.parentElement : this.HoverElement.offsetParent;

	return CHCAUtil.$pageX(parentEl);

};


CHCAUtil.InfoPopupClass.prototype.GetRealTop = function()
{
	var parentEl = (this.DL_bIE4Mac) ? this.HoverElement.parentElement : this.HoverElement.offsetParent;

	return CHCAUtil.$pageY(parentEl);
};
        
CHCAUtil.InfoPopupClass.prototype.GetScreenTop = function() 
{
    var  tA = window.screenY? window.screenY: window.screenTop;
    
     return GetRealTop() + tA; 
}; 
      
CHCAUtil.InfoPopupClass.prototype.GetScrollTop = function() 
{
    if (document.documentElement.scrollTop != 0) 
	{
	    return document.documentElement.scrollTop;
	}
        	
	return document.body.scrollTop;
};
        
       
CHCAUtil.InfoPopupClass.prototype.GetScrollLeft = function() 
{
    if (document.documentElement.scrollLeft != 0) 
	{
	    return document.documentElement.scrollLeft;
	}
        	
	return document.body.scrollLeft;
};
   
        
CHCAUtil.InfoPopupClass.prototype.WindowHeight = function() 
{
    if (window.innerHeight != null)
	{ 
	    return window.innerHeight; 
	}
	        
	if (document.documentElement.clientHeight != null) 
	{ 
	    return document.documentElement.clientHeight;  
	} 
};

CHCAUtil.InfoPopupClass.prototype.WindowWidth = function() 
{
    if (window.innerWidth != null)
	{ 
	    return window.innerWidth; 
	}    
	
	if (document.documentElement.clientWidth != null) 
	{ 
	    return document.documentElement.clientWidth;  
	}    
};
        
CHCAUtil.InfoPopupClass.prototype.HoverInfoOff = function()
{
    this.PopupDescripton.innerHTML = "";
    this.Popup.style.display = "none";
    this.PopupArrow.style.display ="none";
};
        
CHCAUtil.InfoPopupClass.prototype.InfoPopupSuccess = function(result)
{
    this.Popup.style.display = "block";
	this.PopupMiscInfo.style.display = "none";
    this.PopupLoadingBanner.style.display = "none";
    this.PopupDescripton.innerHTML = result;
};
      
CHCAUtil.InfoPopupClass.prototype.HoverInfo = function(arg)
{
    this.HoverLeft = this.GetRealLeft() + (this.HoverElement.offsetWidth + 32) + this.OffsetLeft;
	this.HoverTop =  this.GetRealTop(this.HoverElement) - 8 + this.OffsetTop;
	
	var popupTop = this.HoverTop;
		   
	if ((this.HoverLeft < (this.WindowWidth()/2 + 100)) && (!this.ForceLeft)) 
	{
	    this.Popup.style.left = (this.HoverLeft - 20) + "px";
		this.PopupArrow.style.left = (this.HoverLeft - 40) + "px";
		this.PopupArrow.src = this.HoverArrowImageRight;
    } 
    else if((this.HoverLeft > (this.WindowWidth()/2 + 100)) || (this.ForceLeft))
    {
	   this.HoverLeft = this.GetRealLeft() - this.HoverInfoWidth - 20;
	   this.Popup.style.left = (this.HoverLeft)  + 'px';
	   this.PopupArrow.style.left = (this.HoverLeft + this.HoverInfoWidth) + 'px';
	   this.PopupArrow.src = this.HoverArrowImageLeft;
	}
   
    if (this.HoverTop < this.WindowHeight()/2)
    {
        this.Popup.style.top = this.HoverTop + 'px';
    }
    else
    {
          if (this.HoverInfoHeight > 50)
          {
            this.Popup.style.top = (this.HoverTop - (this.HoverInfoHeight/2) ) + 'px';
          }
          else
          {
              this.Popup.style.top = this.HoverTop + 'px';
          }
    }
    
 	this.PopupArrow.style.top = (this.HoverTop + 5) + 'px';
    this.PopupArrow.style.display = "block";
    this.Popup.style.display = "block";
    this.PopupDescripton.innerHTML = "";
    this.PopupLoadingBanner.style.display = "block";  
};



//************************************************ HOVER OVER  helper functions ------------------------------------------------------
CHCAUtil.HoverInfoOn = function(arg) {
    var e = arg.target || arg.srcElement;

    if (typeof (e) != "undefined")
    {
        if ((e.id == null) || (typeof (e.id) == "undefined")) {
            e = e.parent;
        }
    }
    else if (typeof (arg) != "undefined") 
    {
            if ((arg.id != null) || (typeof (e.id) == "undefined")) {

                e = arg;
            }
    }
    else
    {
        alert('invalid node for Hoverover function called--CHCAUtil.HoverInfoOn(arg)');
    }
    CHCAUtil.HoverInfo.HoverElement = e;
    CHCAUtil.sdf$34536$Timer = setTimeout(CHCAUtil.HoverWebserviceCall, 1000);
};
         

CHCAUtil.HoverWebserviceCall = function ()
{
    CHCAUtil.HoverInfo.HoverInfo(window["CHCAUtil"].HoverInfo.HoverElement.id);
             
    eval('CHCAUtil.HoverInfo.Webservice(window["CHCAUtil"].HoverInfo.HoverElement.id, CHCAUtil.InfoPopupSuccess)');
};
           
           
CHCAUtil.InfoPopupSuccess = function (result)
{
   CHCAUtil.HoverInfo.InfoPopupSuccess(result);
};
                
 CHCAUtil.HoverInfoOff = function()
{
   window.clearTimeout(window["CHCAUtil"].sdf$34536$Timer);
   CHCAUtil.HoverInfo.HoverInfoOff(); 
};

       
CHCAUtil.AddMouseOverEvent = function (arg)
{
  CHCAUtil.AddEvent( CHCAUtil.$get(arg),"mouseover", CHCAUtil.HoverInfoOn);
};

CHCAUtil.AddMouseOutEvent = function (arg)
{
   CHCAUtil.AddEvent( CHCAUtil.$get(arg),"mouseout", CHCAUtil.HoverInfoOff);
};
   
    
CHCAUtil.RemoveMouseOverEvent = function (arg) {
    CHCAUtil.RemoveEvent( CHCAUtil.$get(arg), "mouseover", CHCAUtil.HoverInfoOn);
};

CHCAUtil.RemoveMouseOutEvent = function (arg) {
    CHCAUtil.RemoveEvent( CHCAUtil.$get(arg), "mouseout", CHCAUtil.HoverInfoOff);
};
  


//**************************************  String Functions *****************************************
  
CHCAUtil.StripChars = function (s, chars)
{	
	var rx = new RegExp("["+chars+"]",'g');  
	return s.replace(rx,"");
};
CHCAUtil.StripNonDecimals = function (s)
{	
	return CHCAUtil.StripChars(s, "^\\d");
};

CHCAUtil.StripNonDecimalsWithPeriod = function(s) {
return CHCAUtil.StripChars(s, "^\\d|\\.");
};

CHCAUtil.AnonymousDateFunc = function(id) {CHCAUtil.$setFormDirty()};

CHCAUtil.FitRight = function (s, len, pad)
{
	s = s + "";
	var rc = s.substr(0, len);
	while(rc.length < len)
		rc = rc + pad;
	return rc;
};

CHCAUtil.NumericsAndPeriodOnly = function(evt) 
{
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode

    if (charCode > 31 && (charCode < 48 || charCode > 57) && (charCode != 46)) 
    {

        return false;
    }

    return true;
};


CHCAUtil.NumericsAndColon = function(evt) {
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode

    if (charCode > 31 && (charCode < 48 || charCode > 58) && (charCode != 47)) {

        return false;
    }

    return true;
};




CHCAUtil.NumericsAndSlashOnly = function(evt) {
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode

    if (charCode > 31 && (charCode < 48 || charCode > 57) && (charCode != 47)) {

        return false;
    }

    return true;
};





CHCAUtil.NumericsOnly = function(evt) {
    evt = (evt) ? evt : window.event
    var charCode = (evt.which) ? evt.which : evt.keyCode

    if (charCode > 31 && (charCode < 48 || charCode > 57)) {

        return false;
    }

    return true;
};




CHCAUtil.FitLeft = function (s, len, pad)
{
	s=s+"";
	var rc = s.substr(0, len);
	while(rc.length < len)
		rc = pad + rc;
	return rc;
};

CHCAUtil.$trim = function(s) {
    return CHCAUtil.Trim(s);
}

CHCAUtil.Trim = function(s) 
{
	s=s+"";
    var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);
    return (m == null) ? "" : m[1];
};

CHCAUtil.Rtrim = function (s) 
{
	s=s+"";
	var objRegExp = /^([\w\W]*)(\b\s*)$/;

	if(objRegExp.test(s)) 
	{
		s = s.replace(objRegExp, '$1');
	}
	return s;
};

CHCAUtil.Ltrim = function (s) 
{
	s=s+"";
	var objRegExp = /^(\s*)(\b[\w\W]*)$/;
    if(objRegExp.test(s)) 
    {
       s = s.replace(objRegExp, '$2');
    }
	return s;
};

CHCAUtil.BlankToValue = function (s, val)
{
    s = CHCAUtil.Trim(s);
	if (s.length == 0)
		s = val;
	return s;
};

CHCAUtil.BlankToZero = function (s)
{
	return CHCAUtil.BlankToValue(s, 0);
};

CHCAUtil.AddThousandSeperator = function (s)
{
	s=s+"";
	var left = s;
	var right = "";
	var period = s.indexOf('.');
	if(period > -1)
	{
		left = s.substring(0, period);
		right = s.substr(period);
	}
	var reg = new RegExp('(-?[0-9]+)([0-9]{3})');	
	while(reg.test(left)) 
	   left = left.replace(reg, '$1,$2');

	return left + right;
};

CHCAUtil.ParseDate = function (s)
{
	s = s+"";
	if (s.length == 0)
		return null;
	else
	{
		var dateArray = s.split("/");
		var parsedDate = new Date(dateArray[2],dateArray[0]-1, dateArray[1],0,0,0,0);
		return parsedDate;
	}
};

CHCAUtil.BetweenNumericRangeString = function(value, low, hi) {
   low =  CHCAUtil.$convertToString (low, "0");
   hi =   CHCAUtil.$convertToString( hi, "0");
   value = CHCAUtil.$convertToString(value, "0");
    

    if ((CHCAUtil.isNumber(value)) && (CHCAUtil.isNumber(low)) && (CHCAUtil.isNumber(hi))) {
        if (parseFloat(value) >= parseFloat(low) && parseFloat(hi) >= parseFloat(value)) {
            return true;
        }
    }
    return false;
};

CHCAUtil.BetweenNumericRange = function(value, low, hi) {
    (typeof (value) === undefined) ? 0 : value;
    (typeof (low) === undefined) ? 0 : low;
    (typeof (hi) === undefined) ? 0 : hi;

    if ((typeof (value) == String) || (typeof (low) == String) || (typeof (hi) == String)) {
        alert('CHCAUtil.BetweenNumericRange requires numeric values');
        return false;
    }

    if (value >= low && hi >= value) {
        return true;
    }

    return false;
};


CHCAUtil.$convertToString = function (value, definition) {
    (typeof(definition)=== undefined)? "":definition;
    
    if (typeof (value) === "string")
    {
        return value;
    }
    else if (typeof (value) === undefined)
    {
        return definition;
    }
        
   return value.toString();
}

CHCAUtil.DiffBetweenDatesInDays = function(s1, s2) 
{
    //Set 1 day in milliseconds
    var one_day = 1000 * 60 * 60 * 24

    //Calculate difference btw the two dates, and convert to days
    return (Math.ceil((Date.parse(s1) - Date.parse(s2)) / one_day))
};


CHCAUtil.DiffBetweenDatesInMinutes = function(s1, s2) 
{
    //Set 1 day in milliseconds
    var denominator = 1000 * 60;

    //Calculate difference btw the two dates, and convert to days
    return (Math.ceil((Date.parse(s1) - Date.parse(s2)) / denominator))
};



CHCAUtil.ValidDateRange = function(date, beginDate, endEnDate) {

    if ((CHCAUtil.IsDateGreaterOrEqual(date, beginDate)) && (CHCAUtil.IsDateGreaterOrEqual(endEnDate, date))) {
        return true;
    }

    return false;
};

CHCAUtil.IsDateGreaterOrEqual = function(date1, date2) {
    
    if (( Math.ceil((Date.parse(date1) - Date.parse(date2) ) )) >= 0)
       { 
        return true;
       }

    return false;
};


CHCAUtil.IsDateLessThanEqual = function(date1, date2) {
    
    if (( Math.ceil((Date.parse(date2) -Date.parse(date1)) )) >= 0)
       { 
        return true;
       }

    return false;
};


CHCAUtil.ValidDate = function(s)
{
	var longMonths = "(01|03|05|07|08|10|12)\\/(0[1-9]|[12]\\d|3[01])";
	var shortMonths = "(04|06|09|11)\\/(0[1-9]|[12]\\d|30)";
	var febCase = "02\\/(0[1-9]|[12]\\d)";
	var years = "(((19)|(20))\\d\\d)";
	var pattern = new RegExp("^((" + longMonths+")|(" + shortMonths + ")|" + febCase + ")\\/" + years+"$");

	var valid = false;
	if (pattern.test(s))
	{
		valid = true;
		if ((s.substr(0,2) == '02') && (s.substr(3,2)=='29'))
		{
			var testYear = parseInt(s.substr(6,4));
			if(!(testYear%4==0)||((testYear%100==0)&&!(testYear%400==0)))
				valid = false;
		}
	}
	return valid;
};


CHCAUtil.isValidDateAndFormat = function(el) {
    el.value = CHCAUtil.FormatDate(el.value);
    return CHCAUtil.ValidDate(el.value);
};

CHCAUtil.FormatDate = function(s) {
    s = s + "";
    s = s.replace(/[-.]/g, "/");

    if (s.match("^\\d\\/")) {
        s = "0" + s;
    }

    if (s.match("^\\d\\d\\/\\d\\/")) {
        s = s.substr(0, 3) + "0" + s.substr(3);
    }

    if (s.match("^\\d\\d\\/\\d\\d\\/\\d\\d$")) {
        if (parseInt(s.charAt(6)) < 5) {
            s = s.substr(0, 6) + "20" + s.substr(6)
        }
        else {
            s = s.substr(0, 6) + "19" + s.substr(6);
        }
    }

    if (CHCAUtil.ValidDate(s)) {
        return s;
    }
    else {
        return "";
    }
};



CHCAUtil.FormatDateWOVal = function(s) {
    s = s + "";
    s = s.replace(/[-.]/g, "/");

    if (s.match("^\\d\\/")) {
        s = "0" + s;
    }

    if (s.match("^\\d\\d\\/\\d\\/")) {
        s = s.substr(0, 3) + "0" + s.substr(3);
    }

    if (s.match("^\\d\\d\\/\\d\\d\\/\\d\\d$")) {
        if (parseInt(s.charAt(6)) < 5) {
            s = s.substr(0, 6) + "20" + s.substr(6)
        }
        else {
            s = s.substr(0, 6) + "19" + s.substr(6);
        }
    }

    return s;
};



CHCAUtil.FormatDouble = function(s, prec) {
    s = s + "";
    s = CHCAUtil.Trim(s);
    var sign = (s.indexOf('-') == 0) ? "-" : "";
    var rc = CHCAUtil.StripChars(s, '^\\d.');
    if (rc.length > 0) {
        rc = sign + rc;
        var left = rc;
        var right = "";

        if (rc.indexOf('.') > -1) {
            var sp = rc.split('.');
            left = sp[0];
            right = sp[1];
        }

        if (prec == 0) {
            rc = left;
        }
        else {
            rc = left + "." + CHCAUtil.FitRight(right, prec, "0");
        }
    }
    return rc;
};

CHCAUtil.FormatFixed = function(s)
{
	return CHCAUtil.FormatDouble(s, 2);
};

CHCAUtil.FormatFixedNoDecimal = function(s)
{	
	return CHCAUtil.FormatDouble(s, 0);
};

CHCAUtil.FormatMoney = function (s)
{
	return CHCAUtil.AddThousandSeperator(CHCAUtil.FormatFixed(s));
};

CHCAUtil.FormatMoneyNoDecimal = function(s)
{
	return CHCAUtil.AddThousandSeperator(CHCAUtil.FormatFixedNoDecimal(s));
};

CHCAUtil.FormatInteger = function(s) {
s = CHCAUtil.Trim(s);
    var sign = s.indexOf('-') == 0 ? "-" : "";
    var rc = CHCAUtil.StripChars(s, '^\\d');
    if (rc.length > 0) {
        rc = sign + rc;
    }
    
    return rc;
};

CHCAUtil.FormatSSN = function(s) {
    s = CHCAUtil.StripChars(s, "^\\d");
    var rc = "";
    var reg = new RegExp('^([0-9]{3})([0-9]{2})([0-9]{4})$');

    if (reg.test(s)) {
        rc = s.replace(reg, '$1-$2-$3');
    }
    
    return rc;
};


CHCAUtil.isNumber = function(s) {
    s = CHCAUtil.StripNonDecimalsWithPeriod(s);

    if (s.length > 0) {
        return true;
    }
    else {

        return false;
    }
};

CHCAUtil.FormatPhone = function(s) {
    s = CHCAUtil.StripChars(s, "^\\d");
    var rc = "";
    var seven = new RegExp('^([0-9]{3})([0-9]{4})$');
    var ten = new RegExp('^([0-9]{3})([0-9]{3})([0-9]{4})$');
    var more = new RegExp('^([0-9]{3})([0-9]{3})([0-9]{4})([0-9]+)$');

    if (seven.test(s)) {
        rc = s.replace(seven, '$1-$2');
    }
    else if (ten.test(s)) {
        rc = s.replace(ten, '($1)$2-$3');
    }
    else if (more.test(s)) {
        rc = s.replace(more, '($1)$2-$3 x$4');
    }

    return rc;
};

CHCAUtil.FormatZip = function(s) {
    s = CHCAUtil.StripChars(s, "^\\d");
    var rc = "";
    var zip = new RegExp('^([0-9]{5})$');
    var plus = new RegExp('^([0-9]{5})([0-9]{4})$');
    
    if (zip.test(s)) {
        rc = s.replace(zip, '$1');
    }
    else if (plus.test(s)) {
        rc = s.replace(plus, '$1-$2');
    }
    
    return rc;
};


CHCAUtil.ValidEmail = function (el, isRequired)
{
	var emailpattern = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
	var test = CHCAUtil.Trim(el.value);
	
	if ( test == '' )
	{
	    el.value = '';
		
		if (isRequired)
		{
		    return false;
		}
		else
		{
		    return true;
		}
	}

	test = test.match(emailpattern);
	
	if ( test != null )
	{
		return true;
	}
	else
	{
		return false;
	}
};


CHCAUtil.ValidZip = function (el)
{
    var s = CHCAUtil.Trim(el.value);
	
	if (s.length > 0)
	{
		s = CHCAUtil.FormatZip(s);
		
		if (s.length === 5 || (s.length === 9))
		{
			el.value = s;
			return true;
		}
		else
		{
			CHCAUtil.DisplayErrors("Invalid Zip Code\nZip Code must be 5 or 9 numeric digits\n12345 or 12345-6789");
			return false;
		}
	}
    return false;
};

CHCAUtil.ValidZipcode = function(el) {
    var s = CHCAUtil.Trim(el.value);

    if (s.length > 0) {
        s = CHCAUtil.FormatZip(s);

        if (s.length === 5 || (s.length === 9)) {
            el.value = s;
            return true;
        }
        else {
            return false;
        }
    }
    return false;
};




CHCAUtil.DisplayErrors = function(msg) {
    alert(msg);
};


// evt is the event the caused the launch
CHCAUtil.$getElement = function(evt) {
    evt = (evt) ? evt : window.event;
    var e = evt.target || evt.srcElement;

    return e;
};


//returns simple id from munge server control
CHCAUtil.getSimpleIdFromSC = function(id) {
    if (id.indexOf('_') > -1) {
        return id.substring(id.lastIndexOf('_') + 1);
    }
    else {
        return id;
    }
};

CHCAUtil.formReset = function(theForm) {
    var form = theForm;

    if (form == null || typeof (form) == 'undefined') {
        form = document.getElementsByTagName('form')[0];
    }

    form.onreset = function() {
        var input = form.getElementsByTagName('input');

        for (var i = 0; i < input.length; i++)
            input[i].value = '';
    };
};


//<input type="text" class="required email"/>
var CHCAError$Msgtext = [];
var errMsg =
{
    required:
       {
           msg: "This field is required.",
           test: function(obj) {

               return obj.value.length > 0;
           }
       },

    email:
        {

            msg: "Not a valid email address.",
            test: function(obj) {

                return !obj.value || CHCAUtil.ValidEmail(obj.value, true);
            }
        },

    phone:
    {
        msg: "Not a valid phone number.",
        test: function(obj) {
            var m = /(\d{3}).*(\d{3}).*(\d{4})/.exec(obj.value);
            if (m) obj.value = "(" + m[1] + ") " + m[2] + "-" + m[3];
            return !obj.value || m;
        }
    },

    date:
    {
        msg: "Not a valid date. Date Should be in DD/MM/YYYY format",
        test: function(obj) {
            return !obj.value || CHCAUtil.isValidDateAndFormat(obj);
        }
    },

    number:
    {
        msg: "Not a valid Number",
        test: function(obj) {
            return !obj.value || CHCAUtil.isNumber(obj.value);
        }
    },



    zip:
    {
        msg: "Not a valid zipcode.",
        test: function(obj) {
            return !obj.value || CHCAUtil.ValidZipcode(obj);
        }
    },

    url:
    {
        msg: "Not a valid URL.",
        test: function(obj) {
            return !obj.value || obj.value == 'http://' || /^https?:\/\/([a-z0-9-]+\.)+[a-z0-9]{2,4}.*$/.test(obj.value);
        }
    }
};


CHCAUtil.validateForm = function(theForm) {
var form = theForm;
var valid = true;

    if (form == null || typeof (form) == 'undefined') 
    {
        form = document.getElementsByTagName('form')[0];
    }

    for (var i = 0; i < form.elements.length; i++) 
    {
        if (!CHCAUtil.validateField(form.elements[i])) 
        {
            valid = false;
        }
    }

    return valid;
};


//todo:add drop down controls and mutiple check boxes
/// nvc is name value collection or a dictionary of objects
CHCAUtil.validateField = function(elem, nvcCustErr) {

    for (var name in errMsg) {

        var re = new RegExp("(^|\\s)" + name + "(\\s|$)");

        if (re.test(elem.className) && !errMsg[name].test(elem)) {

            if (nvcCustErr === undefined) {
                CHCAError$Msgtext.push(errMsg[name].msg);
            }
            else {
                CHCAError$Msgtext.push(nvcCustErr[CHCAUtil.getSimpleIdFromSC(elem.id)]);
            }
        }
    }
};


// id is used to find class
// var sbSelectId = new  SelectBoxClass(SelectBoxId, selectOneValue errSelectMsg, "default");
CHCAUtil.SelectBoxClass = function(selectBoxId, selectOneValue, errSelectMsg, fn) {
    this.optionsForOtherText = new Array();
    this.selectOneValue = selectOneValue;
    this.errSelectMsg = errSelectMsg;
    this.errEmptyText = 'The description text box must be filled out ';
    this.selectBoxId = selectBoxId
    this.childContainer = null;
    this.childContainerTriggers = new Object();
    this.childContTrigEnumeratior = new Object();
    this.containerCount = 0;
    this.trigCount = 0;

    this.removeAllOptions = function() {
        CHCAUtil.$removeAllOptions(CHCAUtil.$get(this.selectBoxId));
    };

    this.removeOption = function(value) {
        CHCAUtil.$removeOption(CHCAUtil.$get(this.selectBox), value);
    };

    this.addOptions = function(text, value) {
        CHCAUtil.$addOption(CHCAUtil.$get(this.selectBox), text, value);
    };

    this.addChildContainerTrigger = function(triggerOption, arrayOfElIds) {
        this.childContTrigEnumeratior[this.trigCount] = arrayOfElIds;

        if (this.childContainerTriggers[triggerOption] === undefined) {
            this.trigCount++;
        }
        this.childContainerTriggers[triggerOption] = arrayOfElIds;
    };

    this.init = function() {
        var el;
        if (fn !== undefined && fn !== null) {
            if (typeof (fn) == "string") {
                switch (fn.toLowerCase()) {
                    case 'default':
                        this.assignDefaultOnchange();
                        break;
                    case 'none':
                    default:
                        //do not assign
                        break;
                }
            }
            else {
                CHCAUtil.$get(this.selectBoxId).onchange = fn;
            }
        }
    };

    this.assignDefaultOnchange = function() {
        if ((this.childContainerTriggers === undefined) ||
            (this.childContainerTriggers === null)) {
            return;
        }

        var el = CHCAUtil.$get(this.selectBoxId);

        el.onchange = function() {
            var cls = window['sb_' + el.id.substring(el.id.lastIndexOf('_') + 1)];
            var index = el.selectedIndex;
            var selectedOption = el.options[index].value;
            var id = '';
            id = cls.childContainerTriggers[selectedOption];

            for (var i = 0; i < cls.trigCount; i++) {

                var temp = cls.childContTrigEnumeratior[i];

                for (var x = 0; x < temp.length; x++) {
                    CHCAUtil.$clearAllInput(CHCAUtil.$get(temp[i]));
                    CHCAUtil.$hide(CHCAUtil.$get(temp[i]));
                }
            }


            if (cls.childContainerTriggers[selectedOption] !== undefined) {

                var temp = cls.childContainerTriggers[selectedOption];
                for (var x = 0; x < temp.length; x++) {
                    CHCAUtil.$show(CHCAUtil.$get(temp[x]));
                }

            }


        };

    };

    this.validate = function() {
        var el = CHCAUtil.$get(this.selectBoxId);
        var status = true;
        var selectedIndex = el.selectedIndex;
        var selectedOption = el.options[selectedIndex].value;

        if ((el.style.visibility == "hidden") ||
        (el.style.display == "none")) {
            return status;
        }

        if (selectedIndex < 1) {
            CHCAError$Msgtext.push(errSelectMsg);
            status = false;
        }
        else {

            //check for text box 
            var id = this.childContainerTriggers[selectedOption];

            if ((id != null) || (id != undefined)) {
                var child = CHCAUtil.$get(id);

                if ((child.type === 'textbox') || (child.TagName == 'textarea')) {
                    if (child.value.length < 1) {
                        status = false;
                        CHCAError$Msgtext.push(errEmptyText + ' when option ' + selectedOption + ' is selected');
                    }
                }
            }
        }

        return status;
    };

    this.init();

};



CHCAUtil.$GetValidationClassNames = function(parentEl, isNewObjName) {
var classNames = new Array();
    isNewObjName = (isNewObjName !== undefined) ? isNewObjName : false;

    CHCAUtil.SetValidationElements(classNames, CHCAUtil.$findAll('table', '*', '*', parentEl), isNewObjName);
    CHCAUtil.SetValidationElements(classNames, CHCAUtil.$findAll('select', '*', '*', parentEl), isNewObjName);

    return classNames;
};


//classNames = array of strings, els = array of elements
CHCAUtil.SetValidationElements = function(classNames, els, isNewObjName) {
    var classPrefix = '';

    if (isNewObjName) {
        classPrefix = 'obj_';
    }
    else {
        classPrefix = 'sb_';
    }


    for (var i = 0; i < els.length; i++) {
        if (els[i].className.toLowerCase().indexOf('required') > -1) {
            if (els[i].id.indexOf('_') > -1) {
                classNames.push(classPrefix + els[i].id.substring(els[i].id.lastIndexOf('_') + 1));
            }
            else {
                classNames.push(classPrefix + els[i].id);
            }
        }
    }
};



CHCAUtil.RadioGroupClass = function(radioGroupId, selectOneValue, errSelectMsg, fn) {

    this.optionsForOtherText = new Array();
    this.selectOneValue = selectOneValue;
    this.errSelectMsg = errSelectMsg;
    this.errEmptyText = 'The description text box must be filled out ';
    this.radioGroupId = radioGroupId
    this.childContainer = null;
    this.childContainerTriggers = new Object();
    this.childContTrigEnumeratior = new Object();
    this.containerCount = 0;
    this.trigCount = 0;
    this.radioButtons = new Array();

    var row = CHCAUtil.$get(radioGroupId).getElementsByTagName('tr')[0];
    var cells = row.getElementsByTagName('td');
    var rdb;

    radioButton = function() {
        this.text;
        this.value;
        this.index;
        this.checked;
        this.radioObj;
        this.labelObj;
        this.cellObj;
    };

    for (var i = 0; i < cells.length; i++) {

        var rdb = new radioButton();

        rdb.labelObj = cells[i].getElementsByTagName("label")[0];
        rdb.radioObj = cells[i].getElementsByTagName("input")[0];
        rdb.cellObj = cells[i];
        rdb.text = rdb.labelObj.innerText;
        rdb.value = rdb.radioObj.value;
        rdb.checked = rdb.radioObj.checked;
        rdb.index = i;

        this.radioButtons[i] = rdb;
    }


    this.getSelected = function() {
        for (var i = 0; i < this.radioButtons.length; i++) {
            if (this.radioButtons[i].radioObj.checked) { return this.radioButtons[i]; }
        }
        return null;

    }

    this.addChildContainerTrigger = function(triggerOption, arrayOfElIds) {
        this.childContTrigEnumeratior[this.trigCount] = arrayOfElIds;

        if (this.childContainerTriggers[triggerOption] === undefined) {
            this.trigCount++;
        }
        this.childContainerTriggers[triggerOption] = arrayOfElIds;
    };

    this.init = function() {
        var el;
        if (fn !== undefined && fn !== null) {
            if (typeof (fn) == "string") {
                switch (fn.toLowerCase()) {
                    case 'default':
                        this.assignDefaultOnchange();
                        break;
                    case 'none':
                    default:
                        //do not assign
                        break;
                }
            }
            else {
                for (var i = 0; i < this.radioButtons.length; i++) {
                    this.radioButtons[i].radioObj.onclick = fn;
                }
            }
        }
    };

    this.assignDefaultOnchange = function() {
        if ((this.childContainerTriggers === undefined) ||
            (this.childContainerTriggers === null)) { return; }
    };

    this.validate = function() {
        var status = false;

        for (t = 0; t < this.radioButtons.length; t++) {
            if (this.radioButtons[t].radioObj.checked) { status = true; }
        }
        if (!status) { CHCAError$Msgtext.push(errSelectMsg); }
        return status;
    };
    this.init();
};

CHCAUtil.ValidationClass = function(element) {
    this.el = element;
    this.checkEl = new Array();
    this.nvcMessage = new Object();
    this.nvcMsgIterator = new Object();
    this.checkBoxPattern = new Array();
    //this.selectBoxClassId = new Array();
    this.nvcMsgCount = 0;
    this.validateCheckBoxes = false;

    this.addErrMsg = function(elId, newMsg) {
        if (this.nvcMessage[elId] === undefined || this.nvcMessage[elId] === null) {
            this.nvcMsgIterator[this.nvcMsgCount] = elId;
            this.nvcCount++;
        }

        this.nvcMessage[elId] = newMsg;
    };

    this.addCheckBoxPattern = function(pattern) {
        this.checkBoxPattern.push(pattern);
    };

    this.validate = function(isNewObjName) {
        isNewObjName !== undefined ? isNewObjName : false;
        this.el = this.el !== undefined ? this.el : document.forms[0];
        var classNames = CHCAUtil.$GetValidationClassNames(this.el, isNewObjName);
        var valid = true;
        var tempName = '';

        //first check checkboxes
        for (var i = 0; i < this.checkBoxPattern.length; i++) {

            if (CHCAUtil.$howManyCheckboxesChecked(this.checkBoxPattern[i]) < 1) {
                valid = false;
                CHCAError$Msgtext.push(this.findErrMessage(this.checkBoxPattern[i]));
            }
        }

        for (var i = 0; i < classNames.length; i++) {
            try {
                if (!window[classNames[i]].validate()) {
                    valid = false;
                }
            }
            catch (err) { }
        }

        var els = this.el.getElementsByTagName('textarea');

        for (var i = 0; i < els.length; i++) {
            CHCAUtil.validateField(els[i], this.nvcMessage);
        }

        els = this.el.getElementsByTagName('input');

        for (var i = 0; i < els.length; i++) {

            if (els[i].type == 'text') {
                CHCAUtil.validateField(els[i], this.nvcMessage);
            }

        }

        if (CHCAError$Msgtext.length > 0) {
            valid = false;
        }

        return valid;
    };


    this.findErrMessage = function(patternOrId) {
        for (var x = 0; x < this.nvcMessage.length; x++) {
            if (this.nvcMessage[x].toLowerCase().indexOf(patternOrId.toLowerCase()) > -1) {
                return this.nvcMessage[x];
            }
        }
    };

    this.displayErrors = function(delimeter) {
        CHCAUtil.$displayErrors(delimeter);
    };
};


CHCAUtil.$displayErrors = function(delimeter) {
    var delim = delimeter || '\n';
    var msg = '';

    for (var i = 0; i < CHCAError$Msgtext.length; i++) {

        msg += CHCAError$Msgtext[i] + delim;
    }

    CHCAError$Msgtext = [];

    alert(msg);

}




CHCAUtil.watchForm = function(theForm) 
{ 
    CHCAUtil.AddEvent( theForm, 'submit', function()
    {
        return CHCAUtil.validateForm(theForm);
    });
};



/******************************************************  blur events *************************************************************/

CHCAUtil.blurMoney = function(evt) {
    var e = CHCAUtil.$getElement(evt);
    e.value = formatMoney(e.value);
};

CHCAUtil.blurMoneyNoDecimal = function(evt) {
    var e = CHCAUtil.$getElement(evt);
    e.value = formatMoneyNoDecimal(e.value);
};

CHCAUtil.blurNSTrim = function(evt) {
    var e = CHCAUtil.$getElement(evt);
    e.value = CHCAUtil.Trim(e.value);
};

CHCAUtil.blurTrimUpper = function(evt) {
    var e = CHCAUtil.$getElement(evt);

    e.value = CHCAUtil.Trim(e.value).toUpperCase();
};

CHCAUtil.blurUpper = function(evt) {
    var e = CHCAUtil.$getElement(evt);

    e.value = e.value.toUpperCase();
};

CHCAUtil.blurSSN = function(evt) {

    var e = CHCAUtil.$getElement(evt);
    var s = CHCAUtil.Trim(e.value);

    if (s.length > 0) {
        s = formatSSN(s);
        if (s.length > 0)
            e.value = s;
        else {
            CHCAUtil.DisplayErrors("Invalid SSN\nSSN must be 9 numeric digits\n123-45-6789 or 123456789");
            setTimeout('CHCAUtil.$get(\"' + e.id + '\").focus()', 1);
        }
    }
    else
        e.value = s;
};


CHCAUtil.blurPhone10Digit = function(evt) {
    var e = CHCAUtil.$getElement(evt);
    var s = CHCAUtil.Trim(e.value);

    if (s.length > 0) {
        s = CHCAUtil.FormatPhone(s);
        if (s.length == 13)
            e.value = s;
        else {
            CHCAUtil.DisplayErrors("Invalid Phone Number\nPhone Number must be  10 numeric digits (123)456-7890 or 123456790 (extension optional)");
            setTimeout('CHCAUtil.$get(\"' + e.id + '\").focus()', 1);
        }
    }
    else {
        e.value = s;
    }
};




CHCAUtil.blurPhone = function(evt) {

    var e = CHCAUtil.$getElement(evt);
    var s = CHCAUtil.Trim(e.value);
    if (s.length > 0) {
        s = CHCAUtil.FormatPhone(s);
        if (s.length > 0)
            e.value = s;
        else {
            CHCAUtil.DisplayErrors("Invalid Phone Number\nPhone Number must be 7 or 10 numeric digits\n123-4567, (123)456-7890 or 123456790 (extension optional)");
            setTimeout('CHCAUtil.$get(\"' + e.id + '\").focus()', 1);
        }
    }
    else
        e.value = s;
};


CHCAUtil.blurZip = function(evt) {
    evt = (evt) ? evt : window.event
    var e = evt.target || evt.srcElement;
    var s = CHCAUtil.Trim(e.value);

    if (!CHCAUtil.ValidZipcode(e)) {
        //javascript 1.1 compatable
        CHCAUtil.DisplayErrors("Invalid Zip Code\nZip Code must be 5 or 9 numeric digits\n12345 or 12345-6789");
        setTimeout('CHCAUtil.$get(\"' + e.id + '\").focus()', 1);
        return false;
    }
    else
        e.value = s;
    return true;
};


CHCAUtil.blurEmail = function(evt) {
    evt = (evt) ? evt : window.event
    var e = evt.target || evt.srcElement;
    if (e.value.length > 0) {
        if (!CHCAUtil.ValidEmail(e, true)) {
            CHCAUtil.DisplayErrors('Invalid email address\nEmail address should be in the format \'myemail@mycompany.com\'');
            setTimeout('CHCAUtil.$get(\"' + e.id + '\").focus()', 1);
        }
    }
};


CHCAUtil.blurDate = function(evt) {

    var e = CHCAUtil.$getElement(evt);

    if (e.value.length > 0) {
        e.value = CHCAUtil.FormatDateWOVal(e.value);

        if (!CHCAUtil.ValidDate(e.value)) {
            e.value = '';

            CHCAUtil.DisplayErrors("Date must be a valid date in the format mm/dd/yyyy");

            setTimeout('CHCAUtil.$get(\"' + e.id + '\").focus()', 1);
        }
    }
};

/****************************************** AssignCalendar **********************************************************************/
var popup$Cal;
CHCAUtil.AssignPopupCalender = function(evt, zorder) {

    var e = CHCAUtil.$getElement(evt);

    if ((e.id == null) || (typeof (e.id) == "undefined")) {
        e = e.parent;
    }

    var id = 'txt' + e.id.substring(3, e.id.length)


    if (popup$Cal != null) {
        popup$Cal.hide();
        popup$Cal = null;
    }

    popup$Cal = new CHCAUtil.Calendar('CHCAUtil.Calendar_basic2', 'popup', CHCAUtil.$get(id));
    popup$Cal.showWeek = false;
    popup$Cal.calendar.style.left = (popup$Cal.getLeft(e) + 4);

    if (zorder !== undefined) {
        popup$Cal.calendar.style.zIndex = zorder;
    }
    popup$Cal.show();
};

CHCAUtil.AssignOverlayPopupCalender = function(evt) {
    CHCAUtil.AssignPopupCalender(evt,'1010');
}
/********************************************* calendar end ******************************************************************************/


CHCAUtil.$assignBrowser = function() {
    CHCAUtil.Browser = Sys.Browser.name;
    CHCAUtil.MajorVersion = Sys.Browser.version;

    if (Sys.Browser.agent == Sys.Browser.InternetExplorer) {
        CHCAUtil.IsIE = true;
        if (Sys.Browser.version == 6) {
            CHCAUtil.ComboArray = new Array();
        }
    }
};


/****************************************  newly added functions ****************************/

//if value is zero returns empty string
CHCAUtil.ZeroToEmptyString = function(s, passBackOrg) {
    passBackOrg = passBackOrg ? true : false;
    var org;
    var test;

    if (typeof (s) == 'string') {
        org = s;
        s = CHCAUtil.StripChars(s, '$,');

        if (parseFloat(s) == 0) {
            return '';
        }
    }
    else {
        if (s == 0) {
            return '';
        }
        
        return s.toString();
    }

    return (passBackOrg) ? org : s;

}; 




CHCAUtil.AddEvent(window, 'load', CHCAUtil.initDebug);

