/*!
 * CDI data functions
 * version 1.20 (08/26/2009)
 * NO license granted to any party.  
 */

/**
 *  Core functions provide data list/get/save/parsing functionality used throughout foundation based cdi web applications.
 *  REQUIRES: jQuery.
 *  Special Thanks to: 
 *      Albion Research Ltd.  (various ideas on coding from postings from Albion)
 */

$.ajaxSetup ({    // Disable caching of AJAX responses */    
    cache: true});

    // TODO: rename these to follow conventions
    var cdiVAR_idcnt = 1;
    var cdiVARSuperFishInit = false;
    
    var cdiVAR_TimerTimeout = 1000;
    var cdiBaseObj = new Array();       

    //TODO: change vars - remove underscores
    var cdiVAR_JSONError = "json error";
    var cdiVAR_JSONDone = " done";
    var cdiVAR_MaxErrorMsgLength = 20;
    var cdiVAR_LoadedControls = [];
    var cdiVAR_CtrlCounter = 0;
    var cdiVAR_ElementData = "cdiEData";
    var cdiVAR_ElementTemplate = "cdiETemplate";
    var cdiVAR_ElementLastParams = "cdiELastParams";
    var cdiVAR_ElementDigestedTemplate = "cdiEDTemplate";
    var cdiVAR_ElementId = "cdiEId"
    var cdiVAR_ElementJSONpOptions = "cdiEJSONpOptions";
    var cdiVAR_ElementJSONpDigestOptions = "cdiEJSONpDigestOptions";

    cdiVAR_LoadedControls["STDDDLIST"] = "<option value='!datavalue1'>!datavalue2</option>";
    
    cdiVAR_LoadedControls["STDLIST"] = "<!--!data.id, !data.name, !data.code, !data.value, !data.i1, !data.dtm1, !data.desc, !data.customerid, !data.customername, !data.lastupddtm, !data.s_name, !data.s_code, !data.s_value-->"+
        "<div class='cdiui-ctrl-outside1' id='!cdiautoid_outsidediv'><div class='cdiui-ctrl-inside1' id='!cdiautoid_inside'>"+
        "<div style='width: 100%;' class='cdiui-title3'>!cdidigest_title</div>"+
        "<table id='!cdiautoid_' ><thead>"+
        "<tr id='!cdiautoid_search' class='cdiui-searchrow' >"+
            "<td width='25%' style='padding: 1px;'><input id='!cdiautoid_sname' name='s_name' class='cdiui-input cdiui-searchparam' type='text' value='' "+
            " onkeypress=\"$(this).stopTime();$(this).oneTime("+cdiVAR_TimerTimeout+", \'!cdiautoid_timer\', "+
            "function() {$(\'#!cditarget_\').cdiGetJSONData(null); });\" /></td>"+
            "<td width='25%' style='padding: 1px;'><input id='!cdiautoid_scode' name='s_code' class='cdiui-input cdiui-searchparam' type='text' value='' "+
            " onkeypress=\"$(this).stopTime();$(this).oneTime("+cdiVAR_TimerTimeout+", \'!cdiautoid_timer\', "+
            "function() {$(\'#!cditarget_\').cdiGetJSONData(null); });\" /></td>"+
            "<td width='25%' style='padding: 1px;'><input id='!cdiautoid_svalue' name='s_value' class='cdiui-input cdiui-searchparam' type='text' value='' "+
            " onkeypress=\"$(this).stopTime();$(this).oneTime("+cdiVAR_TimerTimeout+", \'!cdiautoid_timer\', "+
            "function() {$(\'#!cditarget_\').cdiGetJSONData(null); });\" /></td>"+
            "<td width='25%' style='padding: 1px;'>"+
            "</td></tr>"+
        "<tr class='cdiui-sortrow'>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Name</th>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Code</th>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Value</th>"+
            "<th class='cdiui-colheader'>&nbsp;</th>"+
        "</tr></thead><tbody id='!cdiautoid_body' class='cdiui-tablebody'><!--body-->"+
        "<tr id='!cdiautoid_row!data.id' class='cdiui-list' >"+
	        "<td class='cdiui-rowdata'>"+
	            "<span id='select' runat='server' class='cdiui-link'"+
    	            "onclick=\"$('#!cdiautoid_requestid').val(!data.id);cdiFNHighlightRow('#!cdiautoid_body', '#!cdiautoid_row!data.id');!cdidigest_selectClick;\">!data.name"+
	            "</span></td>"+
	        "<td class='cdiui-rowdata'>!data.code</td>"+
	        "<td class='cdiui-rowdata'>!data.value</td>"+
	        "<td class='cdiui-rowdata'>!data.lastupddtm</td>"+
        "</tr><!--endbody-->    </tbody></table>"+
        "<div id='!cdiautoid_statusbar' class='cdiui-statusbar'>"+
        "<div id='!cdiautoid_pagerctrl' style='float:left;'>!pagerctrl_</div><div style='float: left;'><img id='!cdiautoid_working' src='images/ajax-loader.gif' class='cdiui-working' style='visibility: hidden; float: left;'  />"+
        "<div id='!cdiautoid_result' style='float:left;' class='cdiui-result'>&nbsp;</div></div>&nbsp;"+
        "</div></div>";

    cdiVAR_LoadedControls["STDCHKLIST"] = "<!--!data.id, !data.name, !data.code, !data.value, !data.i1, !data.dtm1, !data.desc, !data.customerid, !data.customername, !data.lastupddtm, !data.s_name, !data.s_code, !data.s_value-->"+
        "<div class='cdiui-ctrl-outside1' id='!cdiautoid_outsidediv'><div class='cdiui-ctrl-inside1' id='!cdiautoid_inside'>"+
        "<div style='width: 100%;' class='cdiui-title3'>!cdidigest_title</div>"+
        "<table id='!cdiautoid_' style='table-layout: auto;' ><thead>"+
        "<tr class='cdiui-sortrow'>"+
            "<th width='75%' class='cdiui-colheader cdiui-sort cdiui-icon'>Name</th>"+
            "<th class='cdiui-colheader'>Select</th>"+
        "</tr></thead><tbody id='!cdiautoid_body' class='cdiui-tablebody'><!--body-->"+
        "<tr id='!cdiautoid_row!data.id' class='cdiui-list' >"+
	        "<td width='75%' class='cdiui-rowdata'>"+
	            "<span id='select' runat='server' class='cdiui-link'"+
    	            "onclick=\"$('#!cdiautoid_requestid').val(!data.id);cdiFNHighlightRow('#!cdiautoid_body', '#!cdiautoid_row!data.id');!cdidigest_selectClick;\">!data.name"+
	            "</span></td>"+
	        "<td class='cdiui-rowdata'><input class='cdiui-input' id='!cdiautoid_chk!data.id' type='checkbox' checked='checked' name='!data.code' onclick='!cdidigest_checkClick'/></td>"+
        "</tr><!--endbody-->    </tbody></table>"+
        "</div></div>";


    cdiVAR_LoadedControls["STDLISTNODTM"] = "<!--!data.id, !data.name, !data.code, !data.i1, !data.dtm1, !data.desc, !data.customerid, !data.customername, !data.lastupddtm, !data.s_name, !data.s_code, !data.s_value-->"+
        "<div class='cdiui-ctrl-outside1' id='!cdiautoid_outsidediv'><div class='cdiui-ctrl-inside1' id='!cdiautoid_inside'>"+
        "<div style='width: 100%;' class='cdiui-title3'>!cdidigest_title</div>"+
        "<table id='!cdiautoid_' ><thead>"+
        "<tr id='!cdiautoid_search' class='cdiui-searchrow' >"+
            "<td width='33%' style='padding: 1px;'><input id='!cdiautoid_sname' name='s_name' class='cdiui-input cdiui-searchparam' type='text' value='' "+
            " onkeypress=\"$(this).stopTime();$(this).oneTime("+cdiVAR_TimerTimeout+", \'!cdiautoid_timer\', "+
            "function() {$(\'#!cditarget_\').cdiGetJSONData(null); });\" /></td>"+
            "<td width='33%' style='padding: 1px;'><input id='!cdiautoid_scode' name='s_code' class='cdiui-input cdiui-searchparam' type='text' value='' "+
            " onkeypress=\"$(this).stopTime();$(this).oneTime("+cdiVAR_TimerTimeout+", \'!cdiautoid_timer\', "+
            "function() {$(\'#!cditarget_\').cdiGetJSONData(null); });\" /></td>"+
            "<td width='34%' style='padding: 1px;'><input id='!cdiautoid_svalue' name='s_value' class='cdiui-input cdiui-searchparam' type='text' value='' "+
            " onkeypress=\"$(this).stopTime();$(this).oneTime("+cdiVAR_TimerTimeout+", \'!cdiautoid_timer\', "+
            "function() {$(\'#!cditarget_\').cdiGetJSONData(null); });\" /></td>"+
            "</tr>"+
        "<tr class='cdiui-sortrow'>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Name</th>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Code</th>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Value</th>"+
        "</tr></thead><tbody id='!cdiautoid_body' class='cdiui-tablebody'><!--body-->"+
        "<tr id='!cdiautoid_row!data.id' class='cdiui-list' >"+
	        "<td class='cdiui-rowdata'>"+
	            "<span id='select' runat='server' class='cdiui-link'"+
    	            "onclick=\"$('#!cdiautoid_requestid').val(!data.id);cdiFNHighlightRow('#!cdiautoid_body', '#!cdiautoid_row!data.id');!cdidigest_selectClick;\">!data.name"+
	            "</span></td>"+
	        "<td class='cdiui-rowdata'>!data.code</td>"+
	        "<td class='cdiui-rowdata'>!data.i1</td>"+
        "</tr><!--endbody-->    </tbody></table>"+
        "<div id='!cdiautoid_statusbar' class='cdiui-statusbar'>"+
        "<div id='!cdiautoid_pagerctrl' style='float:left;'>!pagerctrl_</div><div style='float: left;'><img id='!cdiautoid_working' src='images/ajax-loader.gif' class='cdiui-working' style='visibility: hidden; float: left;'  />"+
        "<div id='!cdiautoid_result' style='float:left;' class='cdiui-result'>&nbsp;</div></div>&nbsp;"+
        "</div></div>";

    cdiVAR_LoadedControls["STDLISTNOSEARCH"] = "<!--!data.id, !data.name, !data.code, !data.value, !data.i1, !data.dtm1, !data.desc, !data.customerid, !data.customername, !data.lastupddtm, !data.s_name, !data.s_code, !data.s_value-->"+
        "<div class='cdiui-ctrl-outside1' id='!cdiautoid_outsidediv'><div class='cdiui-ctrl-inside1' id='!cdiautoid_inside'>"+
        "<div style='width: 100%;' class='cdiui-title3'>!cdidigest_title</div>"+
        "<table id='!cdiautoid_' ><thead>"+
        "<tr class='cdiui-sortrow'>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Name</th>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Code</th>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Value</th>"+
            "<th class='cdiui-colheader'>&nbsp;</th>"+
        "</tr></thead><tbody id='!cdiautoid_body' class='cdiui-tablebody'><!--body-->"+
        "<tr id='!cdiautoid_row!data.id' class='cdiui-list' >"+
	        "<td class='cdiui-rowdata'>"+
	            "<span id='select' runat='server' class='cdiui-link'"+
    	            "onclick=\"$('#!cdiautoid_requestid').val(!data.id);cdiFNHighlightRow('#!cdiautoid_body', '#!cdiautoid_row!data.id');!cdidigest_selectClick;\">!data.name"+
	            "</span></td>"+
	        "<td class='cdiui-rowdata'>!data.code</td>"+
	        "<td class='cdiui-rowdata'>!data.value</td>"+
	        "<td class='cdiui-rowdata'>!data.lastupddtm</td>"+
        "</tr><!--endbody-->    </tbody></table>"+
        "<div id='!cdiautoid_statusbar' class='cdiui-statusbar'>"+
        "<div id='!cdiautoid_pagerctrl' style='float:left;'>!pagerctrl_</div><div style='float: left;'><img id='!cdiautoid_working' src='images/ajax-loader.gif' class='cdiui-working' style='visibility: hidden; float:left;'  />"+
        "<div id='!cdiautoid_result' style='float:left;' class='cdiui-result'>&nbsp;</div></div>&nbsp;"+
        "</div></div>";

    cdiVAR_LoadedControls["STDLISTNVNOSEARCH"] = "<!--!data.id, !data.name, !data.code, !data.i1, !data.dtm1, !data.desc, !data.customerid, !data.customername, !data.lastupddtm, !data.s_name-->"+
        "<div class='cdiui-ctrl-outside1' id='!cdiautoid_outsidediv'><div class='cdiui-ctrl-inside1' id='!cdiautoid_inside'>"+
        "<div style='width: 100%;' class='cdiui-title3'>!cdidigest_title</div>"+
        "<table id='!cdiautoid_' ><thead>"+
        "<tr class='cdiui-sortrow'>"+
            "<th class='cdiui-colheader cdiui-sort cdiui-icon'>Name</th>"+
        "</tr></thead><tbody id='!cdiautoid_body' class='cdiui-tablebody'><!--body-->"+
        "<tr id='!cdiautoid_row!data.id' class='cdiui-list' >"+
	        "<td class='cdiui-rowdata'>"+
	            "<span id='select' runat='server' class='cdiui-link'"+
    	            "onclick=\"$('#!cdiautoid_requestid').val(!data.id);cdiFNHighlightRow('#!cdiautoid_body', '#!cdiautoid_row!data.id');!cdidigest_selectClick;\">!data.name"+
	            "</span></td>"+
        "</tr><!--endbody-->    </tbody></table>"+
        "<div id='!cdiautoid_statusbar' class='cdiui-statusbar'>"+
        "<div id='!cdiautoid_pagerctrl' style='float:left;'>!pagerctrl_</div><div style='float: left;'><img id='!cdiautoid_working' src='images/ajax-loader.gif' class='cdiui-working' style='visibility: hidden; float: left;'  />"+
        "<div id='!cdiautoid_result' style='float:left;' class='cdiui-result'>&nbsp;</div></div>&nbsp;"+
        "</div></div>";

    var cdiOBJPager = "<div id='!cdiautoid_pager' class='pager cdiui-pager' curpage='0'><form><table class='cdiui-pager-table'><tr><td width='13%' style='padding-left: 2px;' class='first'><a class='ui-icon ui-icon-seek-first cdiui-link'></a></td><td width='12%' style='padding-left: 2px;' class='prev'><a class='ui-icon ui-icon-seek-prev cdiui-link'></a></td><td width='45%'  ><div id='!cdiautoid_pagerdisplay' class='pagedisplay cdiui-input cdiui-fakeinput' style='width: 90%; padding: 2px; margin: auto;'></div></td><td width='12%' style='padding-left: 2px;' class='next'><a class='ui-icon ui-icon-seek-next cdiui-link'></a></td><td width='13%' style='padding-left: 2px;' class='last'><a class='ui-icon ui-icon-seek-end cdiui-link'></a></td></tr></table></form></div>";
    //var cdiSTD_Option = "<option value='!data.id'>data.name</option>";
    var cdiOBJPager2 = "<div id='!cdiautoid_pager' class='pager cdiui-pager' style='clear: both;'><form><table class='cdiui-pager-table'><tr><td width='13%' style='padding-left: 2px;' class='first' onclick='cdiFNPagedListVisible(this, &quot;cdioid_&quot;);'><a class='ui-icon ui-icon-seek-first cdiui-link'></a></td><td width='12%' style='padding-left: 2px;' class='prev' onclick='cdiFNPagedListVisible(this, &quot;cdioid_&quot;);'><a class='ui-icon ui-icon-seek-prev cdiui-link'></a></td><td width='45%'  ><div id='cdioid_pagedisplay' class='pagedisplay cdiui-input cdiui-fakeinput' style='width: 90%; padding: 2px; margin: auto;'></div></td><td width='12%' style='padding-left: 2px;' class='next' onclick='cdiFNPagedListVisible(this, &quot;cdioid_&quot;);'><a class='ui-icon ui-icon-seek-next cdiui-link'></a></td><td width='13%' style='padding-left: 2px;' class='last' onclick='cdiFNPagedListVisible(this, &quot;cdioid_&quot;);'><a class='ui-icon ui-icon-seek-end cdiui-link'></a></td></tr></table></form></div>";

    var cdiOBJDefaultDigest = {autoNew: false, forceValues: {}, noId: false, forceId: "", target: "", corner: "", pagerCount: 10,  data: {}};
    var cdiOBJDefaultJSON = {ws: "", processor: null, attach: true, validate: true, requiresInbound: true, inbound: "", callback: null, zebra: true, dataType: "$serialize", serialize: "", dataSource: "", id: "", historyId:"", accountId: "", rowStatus: "", type: "", link1: "", link2: "", link3: "", secondFunction: "" }    
   

    $.fn.extend({
        cdiGetJSONData: function(pDataOptions) {
            cdiFNGetJSONData(pDataOptions, $(this));
            return $(this);
        }
    });
    $.fn.extend({
        cdiRenderTemplate: function(pCtrlName, pDigestOptions) {
            cdiFNLoadTemplate(pCtrlName, pDigestOptions, $(this));
            cdiFNDrawTemplate($(this));
            return $(this);
        }
    });
    $.fn.extend({
        cdiLoadTemplate: function(pCtrlName, pDigestOptions) {
            cdiFNLoadTemplate(pCtrlName, pDigestOptions, $(this));
            return $(this);
        }
    });
    $.fn.extend({
        cdiDrawTemplate: function() {
            cdiFNDrawTemplate($(this));
            return $(this);
        }
    });
    $.fn.extend({
        cdiShowDialog: function(pDialogOptions, pDigestOptions) {
            cdiFNShowDialog(pDialogOptions, pDigestOptions);
            return $(this);
        }
    });
    $.fn.extend({
        cdiValidateDate: function(pFormat, pDefaultValue) {
            $(this).val(cdiFNValidateDate($(this).val(),pFormat, pDefaultValue));
            return $(this);
        }
    });
    $.fn.extend({
        cdiFloatDiv: function(pTarget, pOffsetX, pOffsetY) {
            pOffsetX = (pOffsetX==null) ? "0" : pOffsetX;
            $(this).hide()
                .css("display", "inline")
                .css("position", "absolute")
                .css("margin-left", pOffsetX)
                .fadeIn(700);
            return $(this);
        }
    });
    /*
    $.fn.extend({
       cdiFloat: function(pTarget) {    // target is the element against which we will float
            var _p = $(pTarget).offset();
            $(this).hide()
                .addClass("cdiui-float")
                .appendTo(document.body)
                .css("display","inline")
                .css("position", "absolute")
                .css("left", _p.left+5)
                .css("top", _p.top+5)
                .css("z-index", 1000)
                .fadeTo(300, .9);
            var _id = $(this).children(":first-child").attr("id");
            _id = _id.substring(0,_id.length-10);
            $(this).attr("ctrlid", _id);
            var _docw = $(document).attr("width");
            if (_p.left +$(this).width() > _docw) {
                $(this).css("left", _p.left -15 - (_p.left +$(this).width() - _docw));
            }
            return $(this)
       }
    });
    */

/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* GENERAL FUNCTIONS */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */

    function cdiFNGetUniqueId() {cdiVAR_idcnt ++; return 'i'+ cdiVAR_idcnt .toString();}
    function cdiFNIsChecked(val) {
        return (val=='' || val==0 || val==false || val=='False' || val=='false') ? '' : ' checked="checked" ';
    }
    function cdiFNIsNullOrEmpty(pObj) {
        return (pObj==null || pObj=="undefined" || pObj=="") ? true : false;
    }
    function cdiFNGetUserId() {return $("#loginuserid").val();}
    function cdiFNGetUserName() {return $("#loginusername").val();}
    function cdiFNGetCustomerId() {return $("#logincustomerid").val();}
    function cdiFNGetDefaultAccountIdType() { return $("#loginaccounttype").val();}
    function cdiFNGetDefaultRegMode() { return $("#loginregmode").val();}
    function cdiFNGetURL() {
        var _url = document.URL;
        var _startpos = (_url.substring(0,5)=="https") ? 8 : 7;
        return _url.substring(_startpos,_url.lastIndexOf("/"));
    }

    function cdiFNValidateDate(pGivenDate, pFormat, pDefaultValue) {
        var _ptemp = Date.parse(pGivenDate);
        if (_ptemp==null || _ptemp=="undefined") {_ptemp = Date.parse(pDefaultValue);}
        if (_ptemp==null || _ptemp=="undefined") {_ptemp = new Date();}
        return Date.parse(_ptemp).toString(pFormat);
    }

    function cdiFNGetDate(pDate) {
        var _dtmformat = "MM-dd-yyyy";
        switch(pDate) {
            case "boy":
                return Date.parse("jan-1").toString(_dtmformat);
                break;
            case "eoy":
                return Date.parse("dec-31").toString(_dtmformat);
                break;
            case  "eony":
                return Date.parse("dec-31").add({years: 1}).toString(_dtmformat);
            case "eonm":
                return Date.parse("1").add({months:2}).toString(_dtmformat);
                break;
            case "bom":
                return Date.parse("1").toString(_dtmformat);
                break;
            case "eom":
                return Date.parse("1").add({months:1}).toString(_dtmformat);
                break;
            case "bolm":
                return Date.parse("1").add({months:-1}).toString(_dtmformat);
                break;
            case "eolm":
                return Date.parse("0").toString(_dtmformat);
                break;
            case "0time":
                return Date.parse("1-1-1900").toString(_dtmformat);
                break;
            case "today":
                return Date.parse("today").toString(_dtmformat);
                break;
            default:
                return Date.parse(pDate).toString(_dtmformat);
                break;
        }
    }

    function cdiFNSetDateRange(pRange, pCtrlIdRangeStart, pCtrlIdRangeEnd) {
        var _dtmformat = "MM/dd/yyyy";
        pCtrlIdRangeStart = (pCtrlIdRangeStart.substring(0,1)=="#") ? pCtrlIdRangeStart : "#"+pCtrlIdRangeStart;
        pCtrlIdRangeEnd = (pCtrlIdRangeEnd.substring(0,1)=="#") ? pCtrlIdRangeEnd : "#"+pCtrlIdRangeEnd;
        switch(pRange) {
            case "ytony":
                $(pCtrlIdRangeStart).val(cdiFNGetDate("boy"));
                $(pCtrlIdRangeEnd).val(cdiFNGetDate("neoy"));
                break;
            case "cmo":
                $(pCtrlIdRangeStart).val(cdiFNGetDate("bom"));
                $(pCtrlIdRangeEnd).val(cdiFNGetDate("eom"));
                break;
            case "mtd":
                $(pCtrlIdRangeStart).val(cdiFNGetDate("bom"));
                $(pCtrlIdRangeEnd).val(Date.parse("today").toString(_dtmformat));
                break;
            case "lfm":
                $(pCtrlIdRangeStart).val(cdiFNGetDate("bolm"));
                $(pCtrlIdRangeEnd).val(cdiFNGetDate("eolm"));
                break;
            case "qtd":
                var _monum = Date.today().toString("M");
                var _q;
                var _stdtm;
                if (_monum<4) {_q=1;}
                if (_monum>3 && _monum<7) {_q=2;}
                if (_monum>6 && _monum<10) {_q=3;}
                if (_monum>9 && _monum<13) {_q=4;}
                switch (_q) {
                    case 1: _stdtm= Date.parse("jan-1").toString(_dtmformat);
                        break;
                    case 2:
                        _stdtm= Date.parse("apr-1").toString(_dtmformat);
                        break;
                    case 3:
                        _stdtm= Date.parse("jul-1").toString(_dtmformat);
                        break;
                    case 4:
                        _stdtm=Date.parse("oct-1").toString(_dtmformat);
                        break;
                }
                $(pCtrlIdRangeStart).val(Date.parse(_stdtm).toString(_dtmformat));
                $(pCtrlIdRangeEnd).val(Date.parse(_stdtm).add({months: 3}).add({days: -1}).toString(_dtmformat));
                break;
            case "lfq":
                var _monum = Date.today().toString("M");
                var _q; var _yradjust = 0;
                var _stdtm;
                if (_monum<4) {_q=1;}
                if (_monum>3 && _monum<7) {_q=2;}
                if (_monum>6 && _monum<10) {_q=3;}
                if (_monum>9 && _monum<13) {_q=4;}
                _q--;
                if (_q==0) {_q=4; _yradjust = -1;}
                switch (_q) {
                    case 1: _stdtm=Date.parse("jan-1").add({years: _yradjust}).toString(_dtmformat);
                        break;
                    case 2: _stdtm=Date.parse("apr-1").add({years: _yradjust}).toString(_dtmformat);
                        break;
                    case 3: _stdtm= Date.parse("jul-1").add({years: _yradjust}).toString(_dtmformat);
                        break;
                    case 4: _stdtm= Date.parse("oct-1").add({years: _yradjust}).toString(_dtmformat);
                        break;
                }
                $(pCtrlIdRangeStart).val(Date.parse(_stdtm).toString(_dtmformat));
                $(pCtrlIdRangeEnd).val(Date.parse(_stdtm).add({months: 3}).add({days: -1}).toString(_dtmformat));
                break;
            case "ytd":
                $(pCtrlIdRangeStart).val(Date.parse("jan-1").toString(_dtmformat));
                $(pCtrlIdRangeEnd).val(Date.parse("today").toString(_dtmformat));
                break;
            default: 
                break;
        }
        
    }


    function cdiFNUrlDecode(pValue) {
        if (pValue==null || pValue=="undefined") {return "";}
        var HEXCHARS = "0123456789ABCDEFabcdef"; 
        var _encoded = pValue;
        var _rtn= "";
        var i = 0;
        while (i < _encoded.length) {
           var ch = _encoded.charAt(i);
           if (ch == "+") {
               _rtn += " ";
	           i++;
           } else if (ch == "%") {
		        if (i < (_encoded.length-2) 
				        && HEXCHARS.indexOf(_encoded.charAt(i+1)) != -1 
				        && HEXCHARS.indexOf(_encoded.charAt(i+2)) != -1 ) {
			        _rtn += unescape( _encoded.substr(i,3) );
			        i += 3;
		        } else {
			        _rtn += "%[ERROR]";
			        i++;
		        }
	        } else {
	           _rtn += ch;
	           i++;
	        }
        } // while
        return _rtn;
    }

/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */



/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* UI FUNCTIONS */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
    $.fn.extend({
        cdiSetState: function(pOptions) {
            return this.each(function() {
                cdiFNSetState(this, pOptions);
            }); 
        }
    });
    $.fn.togglecheck = function(mode, all) {
        var md = mode || 'on';
        return this.each(function() {
            this.checked = !this.checked;
        });
    }
    function _cdiFNApplyHoverStyling(pClass, pHoverClass) { $(pClass).hover( function(){$(this).addClass(pHoverClass);}, function(){$(this).removeClass(pHoverClass);} ); }
    function cdiFNProcessUI() {
        _cdiFNApplyHoverStyling(".cdiui-cmd", "cdiui-state-hover");
        _cdiFNApplyHoverStyling(".cdiui-cmd2", "cdiui-state-hover2");
        _cdiFNApplyHoverStyling(".cdiui-cmdbig", "cdiui-state-hover3");
        _cdiFNApplyHoverStyling(".cdiui-cmdneg", "cdiui-state-hoverneg");
        _cdiFNApplyHoverStyling(".cdiui-checklink", "cdiui-state-hover");
        _cdiFNApplyHoverStyling(".cdiui-clicklink", "cdiui-state-hover");
        _cdiFNApplyHoverStyling(".cdiui-link", "cdiui-state-hover");
        _cdiFNApplyHoverStyling(".cdiui-link2", "cdiui-state-hover2");
        $(".cdiui-color").each(function(i,obj) {
            $(obj).ColorPicker({
	            color: "#0000ff",
	            onBeforeShow: function() {
		            $(this).ColorPickerSetColor( $(this).val().substring(1) );
	            },
	            onShow: function (colpkr) {
		            $(colpkr).fadeIn(500);
		            return false;
	            },
	            onHide: function (colpkr) {
		            $(colpkr).fadeOut(500);
		            return false;
	            },
	            onChange: function (hsb, hex, rgb) {
		            $(obj).css("backgroundColor", "#" + hex);
		            $(obj).val("#"+hex);
	            }
            });
        });
        $(".cdiui-cluetip").cluetip(
        {
            local: false,
            hideLocal: false,
            width: "700px",
            arrows: true,
            dropShadow: true,
            sticky: true,
            showTitle: false,
            mouseOutClose: false,
            localIdSuffix: '',
            closeText: '<img src="images/checkFalse.png" alt="close" />'
        });
        
        $(".cdiui-toggleglobal").each(function(i, obj) {
            var _rawval = $(obj).attr("alt");
            var _curval = (parseInt(_rawval) > 1) ? "0" : "1";
            $($(obj).attr("title")).val(_curval);
        });
        $(".cdiui-toggleglobal,.cdiui-toggle").unbind("click").bind("click", function() {
                var _target = "#"+$(this).attr("title");
                var _setval = ($(_target).val()=="0" || $(_target).val()=="f" || $(_target).val()=="F" || $(_target).val()=="False") ? "1" : "0";
                $(this).attr("src", "images/check"+_setval+".png");
                $(_target).val(_setval);
        }); 
        
        $(".cdiui-validate .cdiui-warning").unbind("click").bind("click", function() {
            $(this).removeClass("cdiui-warning");
        });
        
        $(".cdiui-validate").unbind("blur").bind("blur", function() {
            cdiFNValidate($(this));
        });
        
        $(".cdiui-special-ir").each(function(i, obj) {
            var _source = $(obj).html();
            $(obj).cdiRenderTemplate("CtrlImageRotator.aspx", {})
            .cdiGetJSONData({ws: "WSContentItem.asmx/ListIR", processor: cdiFNListResult, serialize: [{n: "pagename", v: _source}] });
        });        
        $(".cdiui-special-popup").each(function(i,obj) {$(obj).children(":first-child").hide();});
        $(".cdiui-special-popup").unbind("click").bind("click", function() {
            cdiFNShowDialog({title: "More information...", content: $(this).children(":first-child").html()},{});
        });
        $(".cdiui-round").each(function(i,obj) {$(obj).corner($(this).attr("title"));});
        $(".cdiui-rollup").unbind("click").bind("click", function() {
            var _p = $(this).parent();
            var _c = _p.next();
            //var _c = _p.siblings().eq(0);
            //_p = _p.children().eq(0);
            _c.slideToggle(500, function() {
                var _state = _c.css("height");
                if (_state=="auto") {_p.addClass("cdiui-rolledup").removeClass("cdiui-rolleddown");}
                else {_p.addClass("cdiui-rolleddown").removeClass("cdiui-rolledup");}
            });
        });

        $(".cdiui-imglist").unbind("click").bind("click", function() {
            var _imgtag = "#"+$(this).attr("imgtag");
            var _imgname = "#"+$(this).attr("imginput");
            var _folder = $(this).attr("imgfolder");
            var _inbound = _folder + "|"+$(this).attr("inbound");
            $("<div></div>").cdiRenderTemplate('CtrlListImages.aspx', {pagerCount: 5, data: [{n: "folder", v: _folder}, 
                    {n: "imageClick", v: "$('"+_imgtag+"').attr('src', '"+_folder+"/!data.value');$('" + _imgname + "').val('!data.value');"}] })
                .cdiGetJSONData({ws: "WSGeneral.asmx/ListImages", processor: cdiFNListObjResult, dataType: "$inbound", dataSource: _inbound})
                .cdiFloat($(this));
        });

        $(".cdiui-dtm").datepicker();
        
        /* this seems to have a bug on certain IE versions.
        $(".cdiui-dtm").datepicker({ 
            beforeShow: function (i, e) { 
                var z = jQuery(i).closest(".ui-dialog").css("z-index") + 4; 
                e.dpDiv.css('z-index', z);} });
        */
        $(".cdiui-menu").address(function() {
            alert('here-x');
            cdiFNLoadPage($.address.value);
            return false;
            });
    /*
        $(".cdiui-menu").unbind("click").bind("click", function() {
            $("#cdimenustatus").show();
            var _menuload = $(this).attr("href");cdiFNLoadMenuItem(_menuload);
            return false;
            });
    */
    }
    function cdiFNAmILoggedIn() {
        return $("#loginuserid").val()!="" && $("#loginuserid").val()!="0"
    }
    function cdiFNShowRegister(pContactValue) {
        var _type = cdiFNGetDefaultRegMode();
        var _page = (_type=="cc") ? "https://"+cdiFNGetURL()+"/if_regusercc.aspx" : "http://"+cdiFNGetURL() +"/if_reguser.aspx";
        if (_type=="cc") {
            var _d = $("<iframe scrolling='\no\' frameborder=0 style=\'width: 100%; height: 100%; border: 0\'></iframe>");
            _d.attr("src", _page);
            $(document.body).cdiShowDialog({title: "Register", width: "600", height: "600", modal: true, content: _d}, {});
        }
        else {
            $(document.body).cdiShowDialog({title: "Register", width: "600", height: "600", modal: true, ctrl: "CtrlRegisterUser.aspx"}, {});
        }
    }
    
    function cdiFNLoadPage(pObj) {
        $("#cdiContent").fadeOut(400, function() {
            if (pObj==null || pObj=="undefined") {pObj = $.address.value;}
            if (pObj.path.substring(0,1)=="/") {pObj.path=pObj.path.substring(1);}
            $("#cdiContent").empty().load(  
                ((pObj==null || pObj.path.length<3 || pObj.path=="" || pObj.path==null) ? "pagehome.aspx" : pObj.path)
                ,null,               
                function(rt,ts,rqst) {
                    if (pObj.path.indexOf("#")>-1) {
                        var _tab = pObj.path.split("#")[1].split("-")[1];
                        $("#Ctab1").tabs("select",_tab);
                }}
            ).show();
             
        });
    }

    

    function cdiFNGetResult(pRslt) {
        if (jQuery.trim(pRslt.substring(0,1))=='0') {this.result = false; this.text = pRslt.substring(2); return this;}
        else  {this.result = true;  this.text = ( (jQuery.trim(pRslt).length>4) ? "success" : jQuery.trim(pRslt.substring(2))  ); return this;}
    }
    function cdiFNHighlightRow(pTarget, pCtrl) {
        cdiFNAltRows(pTarget);
        $(pCtrl).removeClass("cdiui-altrow").addClass("cdiui-selectedrow");
    }
    function cdiFNAltRows(pCtrl) {
        $(pCtrl +' .cdiui-list').removeClass("cdiui-selectedrow");
        $(pCtrl + ' tr:odd').addClass("cdiui-altrow");
    }
    function cdiFNEdit(pSourcePage) {
        cdiFNShowDialog({title: "Edit Data", width: "900", height: "auto", modal: true, page: pSourcePage}, {});
    }
    function cdiFNShowDialog(pDialogOptions, pDigestOptions) {
        var _emptyd = $("<div id='dlg"+cdiFNGetUniqueId()+"'></div>");
        _emptyd.dialog("destroy");
        var _d;
        pDialogOptions.width = pDialogOptions.width || 500;
        pDialogOptions.height = pDialogOptions.height || 400;
        pDialogOptions.modal = pDialogOptions.modal || false;
        _d = $(_emptyd).dialog({closeOnEscape: true, autoResize: true,
            beforeclose: function() { $(this).empty();},
            position: 'center', 
            title: pDialogOptions.title || "", 
            width: pDialogOptions.width +"px", 
            height: pDialogOptions.height,
            modal: pDialogOptions.modal});    
        if (pDialogOptions.ctrl!=null && pDialogOptions.ctrl!="undefined" && pDialogOptions.ctrl!="") {
            _emptyd.cdiRenderTemplate(pDialogOptions.ctrl, pDigestOptions);
        }
        if (pDialogOptions.content!=null && pDialogOptions.content!="undefined") {
            _emptyd.append(pDialogOptions.content);
        }
        _d.dialog("open");
        _d.dialog("option", "position", "center");
        if (pDialogOptions.page!=null && pDialogOptions.page!="undefined") {
            _d.load(pDialogOptions.page);
        }
    }
    function _cdiFNSetResult(pCtrlId, pSuccess, pText) {
        if (pCtrlId==null || pCtrlId=="undefined" || pCtrlId=="") {return "";}
        pCtrlId = (pCtrlId.substring(0,1)=="#") ? pCtrlId : "#" + pCtrlId;
        $(pCtrlId+"result").removeClass("cdiui-result-working");
        if (pSuccess) { 
            $(pCtrlId+"result").removeClass("cdiui-result-failure").addClass("cdiui-result-success"); 
            if ($(pCtrlId+"saved").length >0) {$(pCtrlId+"saved").val(1);}
        }
        else { $(pCtrlId+"result").removeClass("cdiui-result-success").addClass("cdiui-result-failure"); }
        if (pText) {
            $(pCtrlId+"result").attr("title",pText).html("<span style='padding-left: 18px;'>"+pText+"</span>");
        }
        else {
            $(pCtrlId+"result").html("");
            if ($(pCtrlId+"hiddensuccess").length>0) { $(pCtrlId+"hiddensuccess").val(pSuccess); }
        }
    }
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */


/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* TEMPLATE FUNCTIONS */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
    function cdiFNLoadTemplate(pCtrlName, pDigestOptions, pThis) {
        // 12-7-2009: we have added dynamic editing of controls on pages.
        //  this disallows caching (storing here in cdiVAR_LoadedControls) of the controls
        //  this is true for all dynamically loaded controls.  Controls starting with STD (which are hard-coded in here) are not lost.
        
        // 12-30-2009: we still have dynamic editing of controls on pages.
        //  (btw: this means the "edit" button on the top-right hand corner of controls)
        //  We have re-introduced cache of controls.  Why?  Because mapping works WAY better with it.
        //  Further, because mapping introduces a load for every object, this reduces the memory footprint of the map page
        //  So..the work around is if you login, AND want to be able to edit, you have to login and refresh.
        //  Conversely, if you are editing and logout, a Refresh eliminates the Edit button.
        /// Note that when not logged in you can't edit even though the button is there (saves won't save)
        
        //  because the rendering is dependent on the current logged in status and authority.
        // loads the requested control.  
        // if the control is not already loaded, loads it and puts into array.
        // if pThis exists, then attaches to the DOM element under "cdiData.template"
        //  the attachment always is UNdigested
        // if pThis does not exist, then returns the control, digested or not dependent on the digest options
        var _ctrl;
        if (cdiVAR_LoadedControls[pCtrlName]==null || cdiVAR_LoadedControls[pCtrlName]=="") { cdiVAR_LoadedControls[pCtrlName] = $.ajax({url:pCtrlName, async: false}).responseText;}
        if (pDigestOptions!=null) {
            var _digcopy = {};
            $.extend(_digcopy, cdiOBJDefaultDigest, pDigestOptions);
            _cdiFNSetElementData(pThis, cdiVAR_ElementJSONpDigestOptions, _digcopy);
            _digcopy.target = $(pThis).attr("id");
            var _digobj = _cdiFNDigestTemplate(cdiVAR_LoadedControls[pCtrlName], _digcopy);
            _cdiFNSetElementData(pThis, cdiVAR_ElementDigestedTemplate, _digobj.template);
            _cdiFNSetElementData(pThis, cdiVAR_ElementId, _digobj.ctrlid);
        }
        if (pThis!=null && pThis!="undefined") { 
            _cdiFNSetElementData(pThis, cdiVAR_ElementTemplate, cdiVAR_LoadedControls[pCtrlName]);
        }
        // 12-7-2009 next eliminate cache because we can't store due to dynamic editing (other than STD)
        // 12-30-2009 put back cache because of reasons above (and other than menu)
        //if (pCtrlName.substring(0,3)!="STD") {cdiVAR_LoadedControls[pCtrlName]="";}
        if (pCtrlName=="CtrlMenu.aspx") {cdiVAR_LoadedControls[pCtrlName]="";}
        
        if ((pThis==null || pThis=="undefined") && pDigestOptions==null) {return cdiVAR_LoadedControls[pCtrlName];}
        if ((pThis==null || pThis=="undefined") && pDigestOptions!=null) {return _digobj.template}
        if (pThis!=null && pThis!="undefined") {return _digobj.template;}
    }
    function cdiFNDrawTemplate(pThis) {
        var _dtemplate = _cdiFNGetElementData(pThis, cdiVAR_ElementDigestedTemplate);
        var _template = _cdiFNGetElementData(pThis, cdiVAR_ElementTemplate);
        if (_dtemplate!=null) {
            $(pThis).empty().html(_dtemplate);
        } else {$(pThis).empty().html(_template);}
        cdiFNDrawTemplateEffects(pThis);
        var _autoNew = _cdiFNGetElementData(pThis, cdiVAR_ElementJSONpDigestOptions).autoNew;
        var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId);
        if (_autoNew) {$("#"+_ctrlid+"new").click(); }
        var _forceValues = _cdiFNGetElementData(pThis, cdiVAR_ElementJSONpDigestOptions).forceValues;
        if (_forceValues.length>0) {
            jQuery.each(_forceValues, function(i, val) {
                var _valsplt = val.v.toString().split("=");
                var _attrtype = (_valsplt.length>1) ? _valsplt[0] : "val";
                var _value = (_valsplt.length>1) ? _valsplt[1] : _valsplt[0];
                switch (_attrtype) {
                    case "val":
                        $("#"+_ctrlid+val.n).val(_value);
                        break;
                    case "src":
                        var _len = _value.length;
                        _value = (_value.substring(_len-4)==".gif" || _value.substring(_len-4)==".jpg" || _value.substring(_len-4)==".png" ) ? _value : _value+".gif";
                        $("#"+_ctrlid+val.n).attr("src", "images/"+_value);
                        break;
                    case "bg":
                         _value = (_value.substring(0,1)=="#") ? _value : "#"+_value;
                        $("#"+_ctrlid+val.n).css("background-color", _value);
                        break;
                    case "color":
                        _value = (_value.substring(0,1)=="#") ? _value : "#"+_value;
                        $("#"+_ctrlid+val.n).css("color", _value);
                        break;
                    default:
                        $("#"+_ctrlid+val.n).val(_value);
                        break;
                }
            });
        }
    }
    function cdiFNDrawTemplateEffects(pThis) {
        var _options = _cdiFNGetElementData(pThis, cdiVAR_ElementJSONpDigestOptions);
        if (_options==null || _options=="undefined") {return;}
        if (_options.doublecorner) {
            $(pThis).children(":first-child").children(":first-child").corner(_options.corner);
        }
        if (_options.corner != "") {$(pThis).children(":first-child").corner(_options.corner);}
    }

    function _cdiFNDigestTemplate(pTemplate, pOptions) {
        // this function digests the template.  
        // returns this.template (digested) and this.ctrlid
        // this occurs prior to processing of any data.
        // this replaces !cdidigest_ variables with some other value.
        // automatically handles adding paging 
        // there are several key reserved variables for digest:
        // !cdiautoid_ = the id of the control.
        // !cdithis_ = replaced with !cdiautoid_ so that it can be processed if/when the control is RE-digested (rare)
        // !cditarget_ = the target of the control.
        // !cdicounter_ = a counter which is incremented each time something is processed.
        var _cdiautoid = cdiFNGetUniqueId();
        if (pOptions==null) {pOptions = cdiOBJDefaultDigest;}
        // handle paging
        var _pagerctrl = (pOptions.pagerCount>0) ? cdiOBJPager : "";
        pTemplate = pTemplate.replace(/!pagerctrl_/,_pagerctrl);
        pTemplate = pTemplate.replace(/!cditarget_/g, pOptions.target);   // this replaces cdithis_ with cdiautoid_ so that in the NEXT processing, it will be evaluated.
        if (pOptions.noId) {this.ctrlid = _cdiautoid;}
        if (!pOptions.noId && pOptions.forceId!="") { pTemplate = pTemplate.replace(/!cdiautoid_/g, pOptions.forceId); this.ctrlid = pOptions.forceId; }
        if (!pOptions.noId && pOptions.forceId=="") { pTemplate = pTemplate.replace(/!cdiautoid_/g, _cdiautoid); this.ctrlid = _cdiautoid; }
        pTemplate = pTemplate.replace(/_cdiautoid_/g, _cdiautoid);
        pTemplate = pTemplate.replace(/!cdithis_/g, "!cdiautoid_");   // this replaces cdithis_ with cdiautoid_ so that in the NEXT processing, it will be evaluated.
        // process each !cdidigest_
        jQuery.each(pOptions.data, function(i, val) {
            _rgx = new RegExp("!cdidigest_"+val.n, "g");
            pTemplate = pTemplate.replace(_rgx, val.v);
        });
        pTemplate = pTemplate.replace(/!cdiautoid_/g, _cdiautoid);
        // process each DDList
        var _rgx = new RegExp(/!cdiDDList_.*?!/g);
        var _ddlists = pTemplate.match(_rgx);
        if (_ddlists!=null) {
            jQuery.each(_ddlists, function(i, _curitem) {
                var _rpl = cdiFNGetSimpleDD(_curitem);
                _rgx = new RegExp(_curitem, "g");
                pTemplate = pTemplate.replace(_rgx, _rpl);
            });
        }
        this.template = pTemplate; 
        return this;
    }
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */



/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* JSON/DATA FUNCTIONS */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
    function cdiFNGetSimpleDD(pRequest) {
        // format of request is !cdiSimpleDD_REQUEST!
        // where REQUEST is formatted as:
        //  ws~fields=~type=&dim1=&rowstatus=
        if (cdiVAR_LoadedControls[pRequest]!=null) {return cdiVAR_LoadedControls[pRequest];}
        
        // get REQUEST
        var _request = pRequest.split("_")[1];
        var _ws = _request.split("~")[0];
        var _fields = _request.split("~")[1].split("=")[1];
        var _paramstring = _request.split("~")[2].replace(/-/g, "_");
        var _forcenone = _request.indexOf("forcenone")>-1;
        var _forceall = _request.indexOf("forceall")>-1 || _request.indexOf("all")>-1;
        var _inbound = "{'inbound':'" + _paramstring + "'}";
        var _valuefield = _fields.split(",")[0];
        var _namefield = _fields.split(",")[1];
        var _template = cdiVAR_LoadedControls["STDDDLIST"];
        _template = _template.replace(/!datavalue1/g, "!data."+ _valuefield).replace(/!datavalue2/g, "!data."+ _namefield);
        var _content = "";
        $.ajax({
            async: false,
            type: "POST",
            url: _ws, 
            data: _inbound,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(rtnmsg) {
                var _data = rtnmsg.hasOwnProperty("d") ? rtnmsg.d : rtnmsg;
                var _result = _cdiJSONDataResult(_data); 
                if (_result.success) {
                    var _rowtemplate = _template;
                    if (_forceall) {_content +="<option value=''>(all)</option>";}
                    if (_forcenone) {_content +="<option value=''>(none)</option>";}
                    $.each(eval(_data), function(row, rowData) { 
                        var _rgx = new RegExp("!data."+_valuefield, "g");
                        _rowtemplate = _template.replace(_rgx, eval(rowData)[_valuefield]);
                        _rgx = new RegExp("!data."+_namefield, "g");
                        _rowtemplate = _rowtemplate.replace(_rgx, eval(rowData)[_namefield]);
                        _content += _rowtemplate;
                        }); // end loop
                    } // end success
                    else { _content = _template; } // end failure
                cdiVAR_LoadedControls[pRequest] = _content;
                return _content;
                },
            error: function() {},
            complete: function() {}
        }); 
        return _content;       
        
    }
    function cdiFNDoJSON(pOptions, pCtrlId) {
        $("#"+pCtrlId+"result").addClass("cdiui-result-working");
        var _dataobject ={}; 
        $.extend(_dataobject , cdiOBJDefaultJSON , pOptions);
        var _datasource = "#" + pCtrlId + _dataobject.dataSource + " :input";
        if (_dataobject.dataType=="" && _dataobject.requiresInbound) {_dataobject.inbound="{'inbound':''}";}
        if (_dataobject.dataType=="" && !_dataobject.requiresInbound) {_dataobject.inbound="{}";}
        if (_dataobject.dataType=="$inbound") {_dataobject.inbound="{'inbound':'"+_dataobject.dataSource+"'}";}
        if (_dataobject.dataType=="$values") {_dataobject.inbound="{'inbound':'"+_cdiFNGetDataSerializeInbound(_dataobject) + "'}"; }
        if (_dataobject.dataType=="$serialize") {
            var _ser = $(_datasource).serialize();
            _dataobject.inbound="{'inbound':'"+ _ser + _cdiFNGetDataSerializeInbound(_dataobject, true) + "'}"; 
            _dataobject.inbound = _dataobject.inbound.replace(/!.*?&/g, "&");
        }
        $.ajax({
            type: "POST",
            url: _dataobject.ws, 
            data: _dataobject.inbound,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(rtnmsg) {
                var _data = rtnmsg.hasOwnProperty("d") ? rtnmsg.d : rtnmsg;
                //TODO: review...
                // this seems to fail in IE8 for valid data...
                /*
                if (typeof(JSON) !== "undefined" && typeof(JSON.parse)==="function")
                    _data = JSON.parse(_data); 
                    else _data = eval("("+_data+")");
                */
                if (_dataobject.processor==null || _dataobject.processor=="undefined") {_dataobject.callback(_data); }
                else {
                    var _result = _cdiJSONDataResult(_data);
                    if (_result.success) { _dataobject.processor($("#"+pCtrlId), _dataobject, _result.data);}
                    else {_cdiFNJSONSuccess_ResultFailed($("#"+pCtrlId), _dataobject, _result.data);}
                    }
                },
            error: function() {_cdiFNJSONError("#"+pCtrlId, _dataobject);},
            complete: function() {_cdiFNJSONDone(pCtrlId, _dataobject);}
        });

    }

    function cdiFNGetJSONData(pOptions, pThis) {
        // processes the control pThis to get the data per pOptions.
        // must be called on an existing control which was loaded and digested.
        var _dataobject ={}; var _docopy = {};
        if (pOptions!=null && pOptions!="undefined") {
            $.extend(_docopy, cdiOBJDefaultJSON , pOptions);
            _docopy = _cdiFNSetElementData(pThis, cdiVAR_ElementJSONpOptions, _docopy);
            $.extend(_dataobject, _docopy);
        }
        else {
            _dataobject = _cdiFNGetElementData(pThis, cdiVAR_ElementJSONpOptions);
        }
        pCtrlId = _cdiFNGetElementData(pThis, cdiVAR_ElementId);
        $("#"+pCtrlId+"result").addClass("cdiui-result-working");
        var _datasource = "#" + pCtrlId + _dataobject.dataSource + " :input";
        if (_dataobject.validate) {
            if (!cdiFNValidationOkForAction("#"+pCtrlId)) {
            $("#"+pCtrlId+"result").removeClass("cdiui-result-working");
            if (_dataobject.processor==null || _dataobject.processor=="undefined") {
                _dataobject.callback("0.Validation");
                return false;
            }
                else {return "0.Validation";}
            }
        }
        if (_dataobject.dataType=="" && _dataobject.requiresInbound) {_dataobject.inbound="{'inbound':''}";}
        if (_dataobject.dataType=="" && !_dataobject.requiresInbound) {_dataobject.inbound="{}";}
        if (_dataobject.dataType=="$inbound") {_dataobject.inbound="{'inbound':'"+_dataobject.dataSource+"'}";}
        if (_dataobject.dataType=="$values") {_dataobject.inbound="{'inbound':'"+_cdiFNGetDataSerializeInbound(_dataobject) + "'}"; }
        if (_dataobject.dataType=="$serialize") {
            var _ser = $(_datasource).serialize(); _ser = _ser.replace(/'/g,'"');
            _dataobject.inbound="{'inbound':'"+ _ser + _cdiFNGetDataSerializeInbound(_dataobject, true) + "'}"; 
            _dataobject.inbound = _dataobject.inbound.replace(/!.*?&/g, "&");
            _cdiFNSetElementData(pThis, cdiVAR_ElementLastParams, _ser);
        }
        $.ajax({
            type: "POST",
            url: _dataobject.ws, 
            data: _dataobject.inbound,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            
            success: function(rtnmsg) {
                var _data = rtnmsg.hasOwnProperty("d") ? rtnmsg.d : rtnmsg;
                if (_dataobject.processor==null || _dataobject.processor=="undefined") {
                    if (_dataobject.attach && pThis!=null) {_cdiFNSetElementData(pThis, cdiVAR_ElementData, _data); _dataobject.callback(_data); }
                    else  {_dataobject.callback(_data);}
                    }
                else {
                    var _result = _cdiJSONDataResult(_data);
                    
                    if (_result.success) { _dataobject.processor(pThis, _dataobject, _result.data);}
                    else {_cdiFNJSONSuccess_ResultFailed( _cdiFNGetElementData(pThis, cdiVAR_ElementId), _dataobject, _result.data);}
                    }
                },
            error: function() {_cdiFNJSONError(_cdiFNGetElementData(pThis, cdiVAR_ElementId), _dataobject);},
            complete: function() {_cdiFNJSONDone(_cdiFNGetElementData(pThis, cdiVAR_ElementId), _dataobject);}
        });
    }

    function _cdiFNJSONDone(pCtrlId,pObject) {
        //var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId, "");
        $("#"+pCtrlId+"result").removeClass("cdiui-result-working");
    }
    function _cdiFNJSONError(pCtrlId,pObject) {
        //var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId, "");
        _cdiFNSetResult(pCtrlId, false, cdiVAR_JSONError);
    }
    function _cdiFNJSONSuccess_ResultFailed(pCtrlId, pObject, pResult) {
        // called when the call succeeds and the result is failed
        //var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId, "");
        _cdiFNSetResult(pCtrlId, false, pResult);
    }
    function _cdiFNJSONSuccess_ResultSuccess(pCtrlId, pObject, pResult) {
        // called when the call succeeds and the result is success
        //var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId, "");
        _cdiFNSetResult(pCtrlId, false);
    }

    function _cdiFNGetDataSerializeInbound(pObject, pPrependAmp) {
        var _rtn = ""; var _first = true;
        
        if (pObject.serialize!="") {
            jQuery.each(pObject.serialize, function(i, val) {
                _rtn += (!_first) ? "&" : "";
                switch (val.v.toString().substring(0,1)) {
                    case "#":
                        if(val.v.toString().substring(1)=="userid") {_rtn += val.n + "=" + cdiFNGetUserId()  }
                        if(val.v.toString().substring(1)=="customerid") {_rtn += val.n + "=" + cdiFNGetCustomerId()}
                        if(val.v.toString().substring(1,5)=="date") {_rtn += val.n + "=" +  cdiFNGetDate(val.v.substring(6))}
                        break;
                    case "$": _rtn += val.n + "=" + eval(val.v);
                        break;
                    default: _rtn += val.n + "=" + val.v;
                        break;
                }
                _first=false;
            });
        }
        if (_rtn.length>0 && pPrependAmp) {_rtn = "&"+_rtn;}
        return _rtn;
    }
    function _cdiGetCleanId(pId) { return (pId.substring(0,1)=='#') ? pId : '#'+pId; }
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */
/* ********** ********** ********** ********** */


    function _cdiJSONDataResult(pData) {
        if (jQuery.trim(pData).length==0) {this.success = false; this.data = "";}
        if (jQuery.trim(pData).substring(0,2)=="0." && jQuery.trim(pData).length < cdiVAR_MaxErrorMsgLength) {
            this.success = false; this.data = pData.substring(2); }
        if (jQuery.trim(pData).substring(0,2)=="0." && jQuery.trim(pData).length > cdiVAR_MaxErrorMsgLength) {
            this.success = true; this.data = pData.substring(2); }
        if (jQuery.trim(pData).substring(0,2)!="0." && jQuery.trim(pData).length < cdiVAR_MaxErrorMsgLength) {
            this.success = true; this.data = pData.substring(0); }
        if (jQuery.trim(pData).substring(0,2)!="0." && jQuery.trim(pData).length > cdiVAR_MaxErrorMsgLength) {
            this.success = true; this.data = pData; }
        return this;
    }
    function _cdiFNSetElementData(pThis, pElement, pValue) {
    // forces the set of the element value for the DOM entity.  if doesn't exist, creaets and sets.
        jQuery.data($(pThis).get(0), pElement, pValue);
        return pValue;
    }
    function _cdiFNGetElementData(pThis, pElement) { 
        if (jQuery.data($(pThis)) !=null) {
            return jQuery.data($(pThis).get(0), pElement); }
        else return null;
    }
    

    function _cdiFNGetTemplateParams(pTemplate) {
        if (pTemplate==null || pTemplate=="undefined") {return "";}
        var _params = pTemplate.split(/!--/)[1];
        return _params.substring(0,_params.search(/-->/)).split(',');
    }
    function _cdiFNSplitTemplate(pTemplate) {
        if (pTemplate==null || pTemplate=="undefined") {return null;}
        var _parts = pTemplate.split("<!--body-->");
        if (_parts.length<2) {this.body = pTemplate;return this;}
        var _top = _parts[0]; var _body = _parts[1];
        var _endbodypos = _body.indexOf("<!--endbody-->");
        var _bottom = _body.substring(_endbodypos);
        _body = _body.substring(0, _endbodypos);
        this.body = _body; this.toppart= _top; this.bottompart = _bottom;
        return this;
    }
    function cdiFNListResult(pThis, pOptions, pData) {
        var _template = _cdiFNGetElementData(pThis, cdiVAR_ElementDigestedTemplate);
        var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId);
        // split the template into parts and then get the list of data elements      
        var _splitTemplate= _cdiFNSplitTemplate(_template);
        var _plist = _cdiFNGetTemplateParams(_template);
        if (_plist=="") {return "";}
        // process the top and bottom against the data elements
        var _top = cdiFNGeneralParser(eval(pData)[0], _splitTemplate.toppart, _plist).item;
        var _bottom = cdiFNGeneralParser(eval(pData)[0], _splitTemplate.bottompart, _plist).item;
        // process the body (multi-row) against the data elements
        var _content ="";
        var _counter1 =0;
        $.each(eval(pData), function(row, rowData) { _counter1++; _content += cdiFNGeneralParser(rowData, _splitTemplate.body, _plist, _counter1).item; });
        // populate target with completed template
        $(pThis).empty().append(_top+_content+_bottom);
        // set paging
        var _pagerCount= _cdiFNGetElementData(pThis, cdiVAR_ElementJSONpDigestOptions).pagerCount;
        var _zebraform = (pOptions.zebra) ? "Zebra" : "nostripe";
        if (_pagerCount>0) {$("#"+_ctrlid).tablesorter({widthFixed: false, widgets: [_zebraform]}).tablesorterPager({positionFixed: false, size: _pagerCount, container: $("#"+_ctrlid+"pager")}); }
        else {$("#"+_ctrlid).tablesorter({widthFixed: false, widgets: [_zebraform]}); }

        // now put back in any search params
        var _servalues = _cdiFNGetElementData(pThis, cdiVAR_ElementLastParams);
        if (_servalues!=null) {
            $.each(_servalues.split(/&/), function(val, item) {$("#"+_ctrlid+item.split("=")[0].replace("_","")).val(  cdiFNUrlDecode(item.split("=")[1]) );  });}
        
        // now set the value of any select items
        $('#'+ _ctrlid + "search .cdiui-select").each(function(i,_obj) { $(_obj).val($(_obj).attr("selvalue")); });
        _cdiFNApplyHoverStyling(".cdiui-link", "cdiui-state-hover");
        
        // set result
        _cdiFNSetResult(_ctrlid, true);
        cdiFNDrawTemplateEffects(pThis);

        //TODO: second function (synchronous)
        if (pOptions.secondfunction!=null && pOptions.secondfunction!="" && pOptions.secondfunction!="undefined") {pOptions.secondfunction();}
    }
    function cdiFNListObjResult(pThis, pOptions, pData) {
        var _template = _cdiFNGetElementData(pThis, cdiVAR_ElementDigestedTemplate);
        var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId);
        // split the template into parts and then get the list of data elements      
        var _splitTemplate= _cdiFNSplitTemplate(_template);
        var _plist = _cdiFNGetTemplateParams(_template);
        if (_plist=="") {return "";}
        // process the top and bottom against the data elements
        var _top = cdiFNGeneralParser(eval(pData)[0], _splitTemplate.toppart, _plist).item;
        var _bottom = cdiFNGeneralParser(eval(pData)[0], _splitTemplate.bottompart, _plist).item;
        // process the body (multi-x) against the data elements
        var _content ="";
        var _counter1 =0;
        var _page = 0;
        var _pagerCount= _cdiFNGetElementData(pThis, cdiVAR_ElementJSONpDigestOptions).pagerCount;
        _content +="<div id='"+_ctrlid+"_pagerpage0' style='display:'>";
        $.each(eval(pData), function(row, rowData) { 
            _counter1++; 
            _content += cdiFNGeneralParser(rowData, _splitTemplate.body, _plist, _counter1).item; 
            if (_pagerCount>0) {
                if (_counter1>=_pagerCount) {
                    _page++;
                    _content +="</div><div id='"+_ctrlid+"_pagerpage"+_page+"' style='display:none'>";
                    _counter1=0;
                }
            }
        });
        if (_content.substring(_content.length-6)!="</div>") {_content+="</div>";}
        // populate target with completed template
        $(pThis).empty().append(_top+_content+_bottom);
        $("#"+_ctrlid+"pager").attr("curpage",0);
        $("#"+_ctrlid+"pager").attr("maxpage",_page);
        $("#"+_ctrlid+"pagerdisplay").html("1 / "+parseInt(_page+1));

        // now bind pager ctrl to actions
        $("#"+_ctrlid+"pager .first").unbind("click").bind("click", function() {
            var _curpage = parseInt($("#"+_ctrlid+"pager").attr("curpage"));
            var _maxpage = parseInt($("#"+_ctrlid+"pager").attr("maxpage"));
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "none"); _curpage = 0;
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "");
            $("#"+_ctrlid+"pager").attr("curpage", _curpage);
            var _disp = parseInt(_curpage+1) + " / " + parseInt(_maxpage+1);
            $("#"+_ctrlid+"pagerdisplay").html(_disp);
        });
        
        $("#"+_ctrlid+"pager .prev").unbind("click").bind("click", function() {
            var _curpage = parseInt($("#"+_ctrlid+"pager").attr("curpage"));
            var _maxpage = parseInt($("#"+_ctrlid+"pager").attr("maxpage"));
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "none"); 
            _curpage = (_curpage-1<0)? 0 : _curpage-1;
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "");
            $("#"+_ctrlid+"pager").attr("curpage", _curpage);
            var _disp = parseInt(_curpage+1) + " / " + parseInt(_maxpage+1);
            $("#"+_ctrlid+"pagerdisplay").html(_disp);
        });

        $("#"+_ctrlid+"pager .next").unbind("click").bind("click", function() {
            var _curpage = parseInt($("#"+_ctrlid+"pager").attr("curpage"));
            var _maxpage = parseInt($("#"+_ctrlid+"pager").attr("maxpage"));
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "none"); 
            _curpage = (_curpage+1) > _maxpage ? _page : _curpage+1;
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "");
            $("#"+_ctrlid+"pager").attr("curpage", _curpage);
            var _disp = parseInt(_curpage+1) + " / " + parseInt(_maxpage+1);
            $("#"+_ctrlid+"pagerdisplay").html(_disp);
        });
        

        $("#"+_ctrlid+"pager .last").unbind("click").bind("click", function() {
            var _curpage = parseInt($("#"+_ctrlid+"pager").attr("curpage"));
            var _maxpage = parseInt($("#"+_ctrlid+"pager").attr("maxpage"));
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "none"); _curpage = _maxpage;
            $("#"+_ctrlid+"_pagerpage"+_curpage).css("display", "");
            $("#"+_ctrlid+"pager").attr("curpage", _curpage);
            var _disp = parseInt(_curpage+1) + " / " + parseInt(_maxpage+1);
            $("#"+_ctrlid+"pagerdisplay").html(_disp);
        });

        // now put back in any search params
        var _servalues = _cdiFNGetElementData(pThis, cdiVAR_ElementLastParams);
        if (_servalues!=null) {
            $.each(_servalues.split(/&/), function(val, item) {$("#"+_ctrlid+item.split("=")[0].replace("_","")).val(  cdiFNUrlDecode(item.split("=")[1]) );  });}
        
        // now set the value of any select items
        $('#'+ _ctrlid + "search .cdiui-select").each(function(i,_obj) { $(_obj).val($(_obj).attr("selvalue")); });
        _cdiFNApplyHoverStyling(".cdiui-link", "cdiui-state-hover");
        
        // set result
        _cdiFNSetResult(_ctrlid, true);
        cdiFNDrawTemplateEffects(pThis);

        //TODO: second function (synchronous)
        if (pOptions.secondfunction!=null && pOptions.secondfunction!="" && pOptions.secondfunction!="undefined") {pOptions.secondfunction();}
    }
    function cdiFNNewResult(pThis, pOptions, pData) {
        var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId);
        // set result
        _cdiFNSetResult(_ctrlid, pData);
        if ($("#"+_ctrlid+"new")!="undefined" && $("#"+_ctrlid+"new")!=null) {cdiFNNew(_ctrlid);}
        cdiFNDrawTemplateEffects(pThis);
        if (pOptions.secondfunction!=null && pOptions.secondfunction!="" && pOptions.secondfunction!="undefined") {
            _cdiFNJSONDone(pThis, null)
            pOptions.secondfunction();
        }
    }
    function cdiFNActionResult(pThis, pOptions, pData) {
        var    _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId);
        // set result
        _cdiFNSetResult(_ctrlid, pData); 
        $("#"+_ctrlid+"hiddensuccess").val(pData);
        var _ctrlidfield = "#"+_ctrlid+"id";
        if ($(_ctrlidfield) != "undefined" && $(_ctrlidfield) != null) {
            if ($(_ctrlidfield).val()=="!data.id" || $(_ctrlidfield).val()=="" ) {
                $(_ctrlidfield).val(pData);
            }
        }
        cdiFNDrawTemplateEffects(pThis);
        if (pOptions.secondfunction!=null && pOptions.secondfunction!="" && pOptions.secondfunction!="undefined") {
            _cdiFNJSONDone(_ctrlid, null)
            pOptions.secondfunction();
        }
    }
    function cdiFNSelectResult(pThis, pOptions, pData) {cdiFNGetResult(pThis, pOptions, pData);}
    function cdiFNGetResult(pThis, pOptions, pData) {
        var _template = _cdiFNGetElementData(pThis, cdiVAR_ElementDigestedTemplate);
        var _ctrlid = _cdiFNGetElementData(pThis, cdiVAR_ElementId);
        // get the list of data elements
        var _plist = _cdiFNGetTemplateParams(_template);
        // process the template against the data elements
        var _content = cdiFNGeneralParser(pData, _template, _plist).item;
        // populate target with completed template
        $(pThis).empty().append(_content);
        
        // now set the value of any select items
        $('#'+ _ctrlid + "data .cdiui-select").each(function(i,_obj) { $(_obj).val($(_obj).attr("selvalue")); });
        _cdiFNApplyHoverStyling(".cdiui-link", "cdiui-state-hover");

        $('#'+ _ctrlid + "data :input").each(function(i,_obj) { 
            if ($(_obj).val().substring(0,4)=="eval") {
                $(_obj).val(eval($(_obj).val().substring(5)));
            }
        });
        $('#'+ _ctrlid + "data .cdiui-decode").each(function(i,_obj) { 
            $(_obj).html(cdiFNUrlDecode($(_obj).html()));
        });
        

        
        // set result
        _cdiFNSetResult(_ctrlid, true);
        cdiFNDrawTemplateEffects(pThis);
        //TODO: second function (synchronous)
        if (pOptions.secondfunction!=null && pOptions.secondfunction!="" && pOptions.secondfunction!="undefined") {pOptions.secondfunction();}
    }

    function cdiFNGeneralParser(rslt, template, plist, pCnt) {
        var _origTemplate = template;
        // process data
        //TODO: allow for # and $ functions on replacement.
        jQuery.each(plist, function(i, val) {
            var _trimval = jQuery.trim(val);
            var _rgx = new RegExp(_trimval, "g");
            var _val = eval(rslt)[jQuery.trim(val.split(".")[1])];
            _origTemplate = _origTemplate.replace(_rgx, _val);            
        });
        _origTemplate = _origTemplate.replace(/!cdicounter_1/g, pCnt);
        this.item = _origTemplate;
        return this;
    }

    function cdiFNGetValidationRegEx(pValidator) {
        switch(pValidator) {
            case "ssn":
                return /^\d{3}-?\d{2}-?\d{4}$/;
                break;
            case "email":
                return /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$/;
                break;
            case "phone":
                return /^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/;
                break;
            case "password":    // min 1 lower, 1 upper, 1 number, length=6
                return /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}/;
                break;
            case "money":
                return /^[-+]?\$?[1-9]\d{0,2}(,\d{3})*(\.\d{0,2})?$/;
                break;
            case "decimal":
                return /^[-+]?\d+(\.\d+)?$/;
                break;
            default:
                return pValidator;
                break;
             
        }
        
    }
    function cdiFNValidate(pThis) {
        var _validator = $(pThis).attr("validator");
        if (_validator==null || _validator=="undefined") {return;}
        // validator can be a regex expression OR a built-in value (from cdiFNGetValidationRegEx)
        var _curval = $(pThis).val();
        var _rslt= false;
        var _param = "";
        if (_validator.substring(0,6)=="length") {_param=_validator.substring(6); _validator="length";}
        switch(_validator) {
            case "emptyphone":
                if (cdiFNIsNullOrEmpty(_curval)) {_rslt=true;}
                else {
                    var _rgx = new RegExp(cdiFNGetValidationRegEx("phone"));
                    _rslt = _rgx.test(_curval);
                }
                break;
            case "non-empty":
                _rslt = !cdiFNIsNullOrEmpty(_curval);
                break;
            case "length":
                if ( cdiFNIsNullOrEmpty(_curval)) {_rslt = false;}
                else {
                    var _minlen = _param.split("-")[0]; var _maxlen = _param.split("-")[1];
                    _rslt = (_curval.length >= _minlen) && (_curval.length <= _maxlen);
                }
                break;
            default:
                var _rgx = new RegExp(cdiFNGetValidationRegEx(_validator));
                _rslt = _rgx.test(_curval);
                break;
        }
        if (_rslt) {$(pThis).removeClass("cdiui-warning").addClass("cdiui-ok");}
        else {$(pThis).removeClass("cdiui-ok").addClass("cdiui-warning"); }
        return _rslt;
    }
    
    function cdiFNValidationOkForAction(pSelector, callback) { // tests each item in the selector selection for validation failure.
        // we are using a for loop because the $.each loop DOES loop BUT the line immediately following it...
        //  return _result;   is called immediately.
        var _result = true; var _done = false;
        var _ary = $("#"+pSelector+ "data .cdiui-validate");
        for (_i = 0; _i<_ary.length; _i++) {
            if (!cdiFNValidate(_ary[_i])) {_result = false;}
        }
        return _result;
    }
    
    
    function cdiFNNew(pCtrl) {
        pCtrl = jQuery.trim(pCtrl);
        if (pCtrl.substring(0,1)!="#") {pCtrl = "#" + pCtrl;}
        $(pCtrl).each(
            function (i, obj) {
                var _defval = ($(obj).attr("defaultvalue") || "");
                if (_defval.substring(0,1)=="#") {
                    var _found = false;
                    if (_defval.substring(1,4)=="src") {
                        $(obj).val(_defval.substring(5)); _found=true; 
                        var _id = $(obj).attr("id").substring(0,$(obj).attr("id").length-4);
                        var _cursrcpos = $("#"+_id).attr("src").indexOf("/")+1;
                        var _cursrcpath = $("#"+_id).attr("src").substring(0,_cursrcpos);
                        $("#"+_id).attr("src", _cursrcpath+ _defval.substring(5));
                    }
                    if (_defval.substring(1)=="userid") {$(obj).val(cdiFNGetUserId()); _found=true; }
                    if (_defval.substring(1)=="customerid") {$(obj).val(cdiFNGetCustomerId()); _found=true; }
                    if (_defval.substring(1)=="today" || _defval.substring(1)=="now") { $(obj).val(cdiFNGetDate("today")); _found=true;}
                    if (_defval.substring(1,5)=="date") { $(obj).val(cdiFNGetDate(_defval.substring(6))); _found=true; }
                    if (!_found) {$(obj).val(eval(_defval.substring(1)));}
                }
                else {$(obj).val(_defval); }
        });
        $(pCtrl + 'data .cdiui-firstinput').focus();
    }
