﻿function jqfy(selector) {
    return "#" + selector.toUpperCase().split(",").join(",#");
}

function dataExport(data, fnm, format) {
    if (!data) { return false; }
    var fileName = (fnm) ? fnm : 'DataExport';
    
    // currently only excel format supported
    var expType = (format) ? format : 'EXCEL';
    if (expType == 'EXCEL') { fileName += '.xls'; }
    
    var pb = new PostBox("POST_CALL");
    pb.AddCalls('Export_Main');
    pb.AddDataTable('EXPDATA', data);
    pb.Add('EXPFILENAME', fileName);
    pb.Post('/common/fileexport.aspx');
    //pb.PostTo('/common/fileexport.aspx');

}

function isArray(o) {
    if (typeof o) {
        if (o.constructor.toString().match(/array/i) != null) { return true; }
    }
    return false;
}

function isFunction(o) {
    return typeof(o) == 'function' && (!Function.prototype.call ||
    typeof(o.call) == 'function');
}

function isEmpty(o) {
    if (!o) { return true; }
    if (typeof o == 'string') {
        if (o.length==0) { return true; }
        else { return false; }
    }
    if (isArray(o)==true) {
        if (o.length==0) { return true; }
        else {
            for (var i=0; i<o.length; i++) {
                if (!isEmpty(o[i])) { return false; }
            }
            return true; 
        }
    }
}

function isReadonly(o) {

    if (o.readOnly) {
        if ($(o).attr("readonly")==true || $(o).attr("disabled")==true) {
            return true;
        }
    }
    return false;
}

function session(key) {
    if (!key) return null;
    if (!server.session) return null;
    return (server.session[key]) ? server.session[key] : null;
}

function setReadOnly(selector,scope) {

    if (selector) {
        $vf(jqfy(selector),scope).each(function(){
            if (this.nodeName=='SELECT') {
                $(this).attr("disabled",true);
            } else {
                $(this).attr("readonly",true);
            }
        });
    } else {
        $vf(SEL_ALL_ELEMENTS+"[CondForRetrieve!='Y'][CondForSearch!='Y']",scope).attr("readonly",true);
        $vf("select[CondForRetrieve!='Y'][CondForSearch!='Y']",scope).attr("disabled",true);
    }

}

function clearReadOnly(selector,scope) {

    if (selector) {
        $vf(jqfy(selector)+"[isReadOnly!='True']",scope).each(function(){
            if (this.nodeName=='SELECT') {
                $(this).attr("disabled",false);
            } else {
                $(this).attr("readonly",false);
            }
        });
    } else {
        $vf(SEL_ALL_ELEMENTS+"[isReadOnly!='True']",scope).attr("readonly",false);
        $vf("select[isReadOnly!='True']",scope).attr("disabled",false);
    }
}

function setReadOnlyFixed(selector,scope) {

    if (selector) {
        $vf(jqfy(selector),scope).each(function(){
            if (this.nodeName=='SELECT') {
                $(this).attr("disabled",true);
            } else {
                $(this).attr("readonly",true);
            }
            $(this).attr("isReadOnly","True");
        });
    } else {
        $vf(SEL_ALL_ELEMENTS,scope).attr("readonly",true).attr("isReadOnly","True");
        $vf("select",scope).attr("disabled",true).attr("isReadOnly","True");
    }

}

function clearReadOnlyFixed(selector,scope) {

    if (selector) {
        $vf(jqfy(selector),scope).each(function(){
            if (this.nodeName=='SELECT') {
                $(this).attr("disabled",false);
            } else {
                $(this).attr("readonly",false);
            }
            $(this).attr("isReadOnly","False");
        });
    } else {
        $vf(SEL_ALL_ELEMENTS,scope).attr("readonly",false).attr("isReadOnly","False");
        $vf("select",scope).attr("disabled",false).attr("isReadOnly","False");
    }
}

function clearFormFor(fname,scope){

    var filter = '';
    
    if (fname) {
        switch (fname.toUpperCase()) {
            case 'SEARCH':
//                filter = "[CondForSearch!='Y'][ReqForSearch!='Y'][type!=hidden]";
                filter = "[CondForSearch!='Y'][ReqForSearch!='Y']:not([id^='__'])";
                break;
            case 'NEW':
            case 'RETRIEVE':
            case 'DELETE':
//                filter = "[CondForRetrieve!='Y'][ReqForRetrieve!='Y'][type!=hidden]";
                filter = "[CondForRetrieve!='Y'][ReqForRetrieve!='Y']:not([id^='__'])";
                break;
            default:
                filter = '';
                break;
        }
    }

    $vf(SEL_ALL_ELEMENTS+filter,scope).each(function(){
        if (this.className=='yjwebgrid') {
            this.clearRows();
        } else {
            if (this.tagName.toUpperCase() == 'INPUT') {
                if (this.type.toUpperCase() == 'RADIO' || this.type.toUpperCase() == 'CHECKBOX') {
                    this.checked = false;
                } else {
                    $(this).val('');
                }
            } else {
                if (isDGrid(this.id)) {
                    eval(this.id).clearAll();
                } else {
                    $(this).val('');
                }
            }
        }
    });
    
}

function convertResponse(rb) {
    var raw = rb.RAW;
    var result = {};
    result.obj = {};
    result.instr = [];
    var icnt = 0;
    var tmp = {};
    
    for (var i=0; i<raw.length; i++) {
        switch (raw[i].TYPE) {
            case 'OBJ':
                if (eval('result.obj.'+raw[i].NAME)) { alert('Duplicate objects returned from server. Object will be overwritten.'); return; }
                eval('result.obj.'+raw[i].NAME+'=raw[i].VALUE');
                break;
                
            case 'ATTR':
                eval('result.'+raw[i].NAME+'='+raw[i].VALUE);
                break;
                
            case 'INSTR':
                tmp = {};
                tmp.type = raw[i].NAME;
                tmp.data = raw[i].VALUE;
                result.instr[(icnt++)] = tmp;
                break;
        
            default:
                break;
        }
    }
    
    return result;
}

function getReqObj(rb) {
    var result = convertResponse(rb);
    if (!result.obj) { return null; }
    return result.obj;
}

function buttonClick(btnName,delay) {
    delay = delay||0;
    
    if (document.all(btnName)) {
        setTimeout('document.all("'+btnName+'").fireEvent("onclick");', delay); 
    }
}
    
function openPgm(pgmID, vals) {
    var sName, sUrl, sParam;
    var valsArr;
    var objArr;
    var objList = '';
    var delimiter = '^';
    
    var mdiWindow;  //This function may be called in mdi parent or child
    if (window.mdi) {mdiWindow = window; } else { mdiWindow = window.top; }
    if (!mdiWindow.menu) { return; }
    
    if (arguments.length==3) {
        delimiter = arguments[2];
    }

    var pgmInfo = mdiWindow.menu.findMenuInfo(pgmID);
    if (!pgmInfo) { alert('Invalid program ID. Cannot open program.'); return; }
    
    sUrl = pgmInfo.url;
    sName = pgmInfo.title;
    sParam = '';

    if (vals) {
        valsArr = vals.split(delimiter);
        
        if (vals.length > 0) {
            var pb = new mdiWindow.PostBox("POST_PARAM");
            
            for (var i=0;i<valsArr.length; i++) {
                var tmpArr = valsArr[i].split('=');
                objArr = [];
                objArr[0] = tmpArr.shift();
                objArr[1] = tmpArr.join('%3D');
                pb.Add(objArr[0], objArr[1]);
            }

            var target = {};
            target.type = "IFRAME";
            target.name = mdiWindow.mdi.openWindow(sName, sUrl, { mode: 'FORMTARGET' });
            pb.Post(sUrl, null, null, target);
            
        } else {
            for (var i=0;i<valsArr.length; i++) {
                sParam += '&' + valsArr[i];
                objArr = valsArr[i].split('=');
                if (objList.length > 0) {objList += ' ';}
                objList += objArr[0];
            }

            sParam += '&FLAG=POST_PARAM&OBJ_LIST=' + objList;
            sUrl += encodeURIComponent(sParam);
            mdiWindow.mdi.openWindow(sName, sUrl);
        }
    } else {
        mdiWindow.mdi.openWindow(sName, sUrl);
    }
        
}

function openUrl(url, title) {
    
    sUrl = url;
    sName = title;

    window.top.mdi.openWindow(sName, sUrl);
       
}

function loadDefaultVal(selector,scope) {

    if (selector) {
        $vf(jqfy(selector),scope).each(function(){
            if (this.DefaultValue) {
                if (this.datatype) {
                    var defVal = FormatVal(this.DefaultValue, this.datatype);
                    $(this).val(defVal);
                } else {
                    if (this.tagName.toUpperCase() == 'INPUT') {
                        if (this.type.toUpperCase() == 'RADIO' || this.type.toUpperCase() == 'CHECKBOX') {
                            this.checked = true;
                        } else {
                            $(this).val(this.DefaultValue);
                        }
                    } else {
                        $(this).val(this.DefaultValue);
                    }
                }
            }
        });
    } else {
        $vf(SEL_FORM_ELEMENTS,scope).each(function(){
            if (this.DefaultValue) {
                if (this.datatype) {
                    var defVal = FormatVal(this.DefaultValue, this.datatype);
                    $(this).val(defVal);
                } else {
                    if (this.tagName.toUpperCase() == 'INPUT') {
                        if (this.type.toUpperCase() == 'RADIO' || this.type.toUpperCase() == 'CHECKBOX') {
                            if (this.DefaultValue == true.toString()) {
                                this.checked = true;
                            } else {
                                this.checked = false;
                            }
                        } else {
                            $(this).val(this.DefaultValue);
                        }
                    } else {
                        $(this).val(this.DefaultValue);
                    }
                }
            }
        });
    }
   
}

var server = {};

// usage: server.call(functionName [, arg0, arg1 ... argn, callbackFunction])
//        - functionName may contain url (e.g. testFunction@/common/test.aspx)
server.call = function() {

    var destArr; 
    var serverFn = '';
    var serverLocation = '';
    var callBackFn = null;
    var callArgs = [];
    var argCnt = 0;

    var hasCallBack, callBackFn;

    if (arguments.length == 0) { 
        alert('Missing arguments');
        return; 
    }
    
    // parse server function name and location
    destArr = arguments[0].split('@');
    serverFn = destArr[0];
    serverLocation = null || destArr[1];

    // parse arguments and retrieve callback function and arguments
    if (arguments.length == 1) { 
    } else {
        var arg;
        for (var i=1; i<arguments.length; i++) {
            arg = arguments[i];
            if (isFunction(arg)) {
                callBackFn = arg;  // by this logic, the last function specified in argument will be treated as the callback function
                
            } else if (isArray(arg)) {
                callArgs = callArgs.concat(arg);
                argCnt += arg.length;
                
            } else {
                callArgs[argCnt++] = arg;
            }
        }
    }
    
    // call server function
    var pb = new PostBox("POST_CALL");
    
    pb.location = serverLocation;
    
    if (callArgs.length > 0) {
        pb.AddCallsArgArray(serverFn, callArgs);
    } else {
        pb.AddCalls(serverFn);
    }
    
    if (callBackFn) {
        pb.PostBackFn(callBackFn)
    } else {
        pb.PostBackFn()
    }
    
};

// usage: server.call(functionName [, arg0, arg1 ... argn, callbackFunction])
server.callSync = function() {

    var serverFn = '';
    var callBackFn = null;
    var callArgs = [];
    var argCnt = 0;

    var hasCallBack, callBackFn;

    if (arguments.length == 0) { 
        alert('Missing arguments');
        return;
    }
    
    // parse server function name
    serverFn = arguments[0];

    // parse arguments and retrieve callback function and arguments
    if (arguments.length == 1) { 
    } else {
        var arg;
        for (var i=1; i<arguments.length; i++) {
            arg = arguments[i];
            if (isFunction(arg)) {
                callBackFn = arg;  // by this logic, the last function specified in argument will be treated as the callback function
                
            } else if (isArray(arg)) {
                callArgs = callArgs.concat(arg);
                argCnt += arg.length;
                
            } else {
                callArgs[argCnt++] = arg;
            }
        }
    }
    
    // call server function
    var pb = new PostBox("POST_CALL");
    
    if (callArgs.length > 0) {
        pb.AddCallsArgArray(serverFn, callArgs);
    } else {
        pb.AddCalls(serverFn);
    }
    
    //document.s
    
    return pb.SPostBackFn();
    
};

// parse file path and file name
function rxParseFileName(data){
    var m = data.match(/(.*)[\/\\]([^\/\\]+)\.\w+$/);
    return {path: m[1], file: m[2]}
}

// parse file path and file name (with extension)
function rxParseFileNameExt(data){
    var m = data.match(/(.*)[\/\\]([^\/\\]+\.\w+)$/);
    return {path: m[1], file: m[2]}
}


// set the culture
server.setCulture = function(strCulture,refresh) {
    // call server function
    var pb = new PostBox("POST_CALL");
    pb.Add("CULTURE",strCulture);
    if (refresh==true) { pb.Add("REFRESH","Y"); }
    pb.AddCalls("SetCulture");
    pb.PostBack();
};

// manage communication queue
server.q = {
    queue: [],
    readyList: []
};

server.q.enter = function(qID,ID) {
    var qInfo = {
        qID: '',
        itemID: ''
    };
    
    var q = this.queue;
    
    qInfo.qID = qID;
    qInfo.itemID = ID;
    
    if (!q[qInfo.qID]) {
        q[qInfo.qID] = [];
    }
    q[qInfo.qID].push(qInfo.itemID);
    
};

server.q.exit = function(qID,ID) {
    var q = (this.queue[qID]) ? this.queue[qID] : null ;
    if (!q) { return; }

    for (var i=q.length-1; i >= 0; i--) {
        if (q[i] == ID) {
            q.splice(i, 1);
            if (q.length==0) this.runReady(qID);
            return;
        }
    }
   
};

server.q.ready = function(qID,fn) {
    var q = this.queue;
    var readyList = this.readyList;

    if (!q[qID]) {
        fn();
    } else {
        if (!readyList[qID]) {
            readyList[qID] = [];
        }
        readyList[qID].splice(0,0,fn);
    }

};

server.q.runReady = function(qID) {
    var readyList = (this.readyList[qID]) ? this.readyList[qID] : null ;
    if (!readyList) { return; }    

    for (var i=readyList.length-1; i>=0; i--) {
        var fn = readyList[i];
        readyList.pop();
        fn();
    }
};

server.ready = function(fn) {
    server.q.ready('refresh',fn);
};

function isAllCaps(obj) {
    var defAllCaps = false;
    if (yjit.config.doc.AllCaps) {
        defAllCaps = yjit.config.doc.AllCaps;
    }
    
    var oAllCaps = 'inherit';
    if (obj.AllCaps) {
        oAllCaps = obj.AllCaps;
    }
    
    if (oAllCaps=='yes') {
        return true;
    } else if (oAllCaps=='no') {
        return false;
    } else {
        return defAllCaps;
    }
}

/*************************************************************************************

    Communication : Utilities Copied from Postbox.js
    TODO: separate and make into object
     
/**************************************************************************************/
//Note: duplicated defined in post_box.js, however, Jquery "upload file plugin" will call this
function ParseResponse(rb, fCallBack) {
    if (rb == null) {
        alert('Communicator returned from server with no reponse!');
        return;
    }

    if (ParseFormAuthenticationTimeout(rb)) { return; }

    // if server passes false then halt all processing
    if (ParseResult(rb) == false) {
        RestorePrevState();
        if (ParseSessionTimeOut(rb)) { return; }
        ParseAlert(rb);
        ParseFocus(rb);
        ParseDebug(rb);
        return;
    }

    var result = convertResponse(rb);

    // set values
    SetForm(rb);

    // display messages if any
    ParseAlert(rb);

    // display debug info if any
    // not necessary here because rb.RESULT will be false for unhandled exceptions
    // ParseDebug(rb);

    // display status if any
    ParseStatus(rb);

    // set focus if any
    ParseFocus(rb);

    // refresh screen if required
    ParseRefresh(rb);

    // execute client side script if specified
    ParseClientScript(rb);

    // forward to handler if custom handler exists
    if (fCallBack != null) {
        if (fCallBack(result.obj)) return;  //Forge stop default handling
    }
}

//Handling all Ajax requests that got FormAuthenticationTimeout
function ParseFormAuthenticationTimeout(rb) {
    if (rb.FormAuthenticationTimeout == 'true') {
        alert('Your authentication has been timeout! Please login again!');
        if (top.window.mdi != undefined) {
            //If this has MDI parent
            top.window.setTimeout(function() {
                top.window.open('/common/closewindow.html', '_self');
            }, 100);
            var pop = top.window.open("/Default.aspx", "_blank");
        }
        else {
            window.location = "/Default.aspx";
        }
        return true;
    }
    return false;
}

function ParseSessionTimeOut(rb) {
    var data = rb.RAW;
    if (data.length==0) {return false;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "ATTR":
                if (data[i].NAME == 'SESSIONTIMEOUT') {
                    if (data[i].VALUE == 'Y') {
                        if (top.window.OpenReLogin != undefined){
                            //If this has MDI parent
                            top.window.IsSessionTimeOut = true;
                            top.window.OpenReLogin();
                        }
                        else {
                            alert('Session has been expired. Please login again!');
                            window.location = "/";
                        }
                        return true;
                    } else {
                        return false;
                    }
                }
                break;
        }
    }
    return false;
}

function ParseAlert(rb) {
    var data = rb.RAW;
    if (data.length==0) {return;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "INSTR":
                if (data[i].NAME == 'ALERT') {
                    alert(data[i].VALUE);
                }
                break;
        }
    }
    return;
}

function ParseDebug(rb) {
    var data = rb.RAW;
    var debugMsg = '';
    var debugData = '';
    
    if (data.length==0) {return;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "INSTR":
                if (data[i].NAME == 'DEBUGMSG') {
                    debugMsg = data[i].VALUE;
                } else if (data[i].NAME == 'DEBUGDATA') {
                    debugData = data[i].VALUE;
                }
                break;
        }
    }
    
    if (debugMsg != '') {
        debug(debugMsg,debugData);
    }
    return;

}

function ParseStatus(rb) {
    var data = rb.RAW;
    if (data.length==0) {return;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "INSTR":
                if (data[i].NAME == 'STATUS') {
                    setStatus(data[i].VALUE);
                }
                break;
        }
    }
    return;
}

function ParseFocus(rb) {
    var data = rb.RAW;
    if (data.length==0) {return;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "INSTR":
                if (data[i].NAME == 'FOCUS') {
                    var fObj = document.all(data[i].VALUE);
                    if (fObj!=null) {setFocus(fObj);}
                }
                break;
        }
    }
    return;
}

function ParseRefresh(rb) {
    var data = rb.RAW;
    if (data.length==0) {return;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "INSTR":
                if (data[i].NAME == 'REFRESH') {
                    var sURL = unescape(window.location);
                    window.location.reload();
                }
                break;
        }
    }
    return;
}

function ParseClientScript(rb) {
    var data = rb.RAW;
    if (data.length==0) {return;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "INSTR":
                if (data[i].NAME == 'JSCALL') {
                    try{eval(data[i].VALUE)}
                    catch (Error) {setStatus('Failed to invoke server JSCall');}
                }
                break;
        }
    }
    return;

}

function ParseResult(rb) {
    var data = rb.RAW;
    if (data.length==0) {return true;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "ATTR":
            	  if (data[i].NAME == 'RESULT') {
            	  	  if (data[i].VALUE == 'false') {
            	  	      return false;
            	  	  }
            	  }
                break;
        }
    }
    return true;
}

// Sets value of controls on the form based on the list of controls and values stored in response
function SetForm(rb) {
    var data = rb.RAW;
    var objnm, objval;
    
    if (data.length==0) {return false;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "DGRID":
                objnm = data[i].NAME;
                objval = data[i].VALUE;
                
                var obj = eval(objnm);

                if (obj) {
                    obj.clearAll();
                    if (objval) obj.parse(objval,"json");
                }                    
                break;
            
            case "OBJ":
                objnm = data[i].NAME;
                objval = data[i].VALUE;

                if (document.all(objnm)) { 
                    if (objnm.substr(0,2)=="WG") {
                        wgLoadArray(objnm, objval);
                        // set grid row if available
                        //if (eval("rb."+ctls[i]+"_ROW")) {
                        //    eval('wgSetRow("'+objnm+'",'+eval('rb.'+ctls[i]+'_ROW')+');'); 
                        //}
                    } else {
                        element = document.all(objnm);
                        var eTag = (element.tagName||element[0].tagName).toUpperCase();
                        var eType = (element.type||element[0].type).toUpperCase();
                        switch (eTag) {
                            case 'INPUT':
                                switch (eType) {
                                    case 'BUTTON':
                                        break;
                                    case 'CHECKBOX':
                                        element.checked = (objval == 'Y') ? true : false;
                                        break;
                                    case 'RADIO':
                                        var eLength = element.length;
                                        if(eLength == undefined) {
                                            element.checked = (element.value == objval.toString());
                                        } else {
                                            for(var idx = 0; idx < eLength; idx++) {
                                                element[idx].checked = false;
                                                if(element[idx].value == objval.toString()) {
	                                                element[idx].checked = true;
                                                }
                                            }
                                        }
                                        break;
                                    default:
                                        if (element.datatype) {
                                            element.value = FormatVal(objval, element.datatype);
                                        } else {
                                            element.value = objval;
                                        }
                                        break;
                                }
                                break;
                            case 'TEXTAREA':
                                element.value = objval;
                                break;
                            case 'SELECT':
                                //element.selectedIndex = -1;
                                var selectedIndex = element.options(objval);
                                element.selectedIndex = selectedIndex;
                                element.value = objval;
                                break;
                            case 'OBJECT':
                                break;
                            default:
                                break;
                        }
                    }
                } else {
                    switch (objnm.toUpperCase()) {
                        // codesearch related
                        case 'PAGEVOLUME':
                        case 'PAGECOUNT':
                        case 'RESULTDATA':
                        case 'RESULTTOTAL':
                        case 'DESCLIST':
                        // codecheck related
                        case 'COUNT':
                        case 'DATA':
                        case 'RETVAL':
                        case 'WGNAME':
                            break;
                        default:
                            if (self.dCombo) {
                                // if there is dcombo on the page
                                // set value for combo
                                if (dCombo.xInstances[objnm]) {
                                    var combo = dCombo.xInstances[objnm];
                                    var cVal = objval;
                                    var cText = ParseByName(rb,objnm+"_DESC");
                                    cText = (cText=='null') ? objval : cText;
                                    // need to add option so that the displayed value is recognized as valid value
                                    if (trim(cVal)!='') combo.addOption(cVal,cText);
                                    combo.setComboValue(objval);
                                    //combo.setComboText(objval);
                                    break;
                                // for others
                                } else {
                                    if (objnm.length>5) {
                                        if (objnm.toUpperCase().substr(objnm.length-5,5)=='_DESC') {
                                            // need to skip because text value is processed with value
                                            if (dCombo.xInstances[objnm.substr(0,objnm.length-5)]) {
                                                break;
                                            }
                                        }
                                    }
                                }
                            }

                            alert("PostBox: SetForm: Cannot set value to invalid control: " + objnm);
                            break;
                    }
                }                    
                break;
        }
    }
    return false;
}


function ParseReturnValue(rb) {
    var data = rb.RAW;
    var objnm, objval;
    
    if (data.length==0) {return false;}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "OBJ":
                if (data[i].NAME == 'RETVAL') {
                    return data[i].VALUE;
                }
                break;
        }
    }
    return 'null';

}

// retrieves item by name
function ParseByName(rb, key) {
    var data = rb.RAW;
    var objnm, objval;
    
    if (data.length==0) {return 'null';}
    for (var i=0;i<data.length;i++)
    {
        switch (data[i].TYPE){
            case "OBJ":
                if (data[i].NAME == key.toUpperCase()) {
                    return data[i].VALUE;
                }
                break;
        }
    }
    return 'null';

}



function isDGrid(oName) {

    try {
        if (dGrid.xInstances[oName]) { return true; }
    }
    catch(e) {
    }
    
    return false;

}

function dComboCleanUp() {
    // clean up options in dcombo if it is autocomplete mode
    // because value,text was added temporarily as option when data is displayed from server
    if (self.dCombo) {
        if (dCombo.xInstances) {
            for (var comboID in dCombo.xInstances) {
                var combo = dCombo.xInstances[comboID];
                if (combo.xFilter) {
                    if (combo.xFilter!=combo.FilterMode.Simple) {
                        combo.clearAll();
                    }
                }
            }
        }
    }    

}
