
function blockUI(opt) {
    $.blockUI(opt);
}

function unblockUI(opt) {
    $.unblockUI(opt);
}

// returns list of YJControls supported input elements
function getControls(scope) {
    return $vf(null,scope);
}

function chkIsReqFor(fname,scope){

    var elements = getControls(scope);
    var attKey;

    switch (fname.toUpperCase()) {
        case 'SAVE':
            attKey = 'ReqForSave';
            break;
        case 'DELETE':
            attKey = 'ReqForDelete';
            break;
        case 'SEARCH':
            attKey = 'ReqForSearch';
            break;
        case 'RETRIEVE':
            attKey = 'ReqForRetrieve';
            break;
        default:
            attKey = '';
            break;
    }
    if (attKey==''){
        return true;
    }

    for(var i=0;i<elements.length;i++){
        if (elements[i].attributes.getNamedItem(attKey) != null){
            if (elements[i].tagName.toUpperCase() == 'INPUT' && elements[i].type.toUpperCase() == 'CHECKBOX') {
                if (trim(elements[i].checked)==false) {
		            alert(elements[i].title + ' is required!');
		            setFocus(elements[i]);
		            return false;
		        }
            } else {
                if (trim(elements[i].value)=='') {
		            alert(elements[i].title + ' is required!');
		            setFocus(elements[i]);
		            return false;
		        }
		    }
		    
		 }
		 
		 if (elements[i].tagName.toUpperCase() == 'OBJECT' && elements[i].id.substr(0,2).toUpperCase() == 'WG' && fname.toUpperCase()=='SAVE') {
		    if (!wgChkGridEmpty(elements[i])) {
		        for (var j=1;j<elements[i].rows; j++) {
		            if (wgGridRowCheck(elements[i].name.toUpperCase(), j) == false) return false;
		        }
		    }
		 }
		 
    }
    //Also, check required field for Dgrid
    if (typeof(dGrid) != 'undefined') {
        for (var dgName in dGrid.xInstances) {
            var dg = dGrid.xInstances[dgName];
            for (var i = 0; i < dg.xRows() - 1; i++) {      //Loop through rows
                if (dg.xGetInsFlag(i) == "Q") { continue; }
                for (j = 0; j < dg.xCols() - 1; j++) {
                    if ((dg.xColData(j)['R'] == true) && dg.xValue(i,j) == ""){
                        alert('Required field!');
                        dg.xMoveTo(i,j);
                        return false;
                    }
                }
            }
        }
    }
    
    return true;
}

function getCondFor(cname,scope){

    var elements = getControls(scope);
    var attKey;
    var vFrmKey = '';

    switch (cname.toUpperCase()) {
        case 'SEARCH':
            attKey = 'CondForSearch';
            break;
        case 'RETRIEVE':
            attKey = 'CondForRetrieve';
            break;
        default:
            attKey = '';
            break;
    }
    
    if (attKey==''){ alert('No condition fields selected!'); return null;}

    for(var i=0;i<elements.length;i++){
		if (elements[i].attributes.getNamedItem(attKey) != null){
		    if (vFrmKey.length>0) { vFrmKey += ','; }
			vFrmKey += elements[i].name;
    	}
    }

    if (vFrmKey==''){ alert('No condition fields found!'); return null;}

    return vFrmKey;

}

function clearForm(scope){

    var elements = getControls(scope);
    if (!elements) { return };
    for(var i=0;i<elements.length;i++){
        if(elements[i]) {
            switch (elements[i].tagName.toUpperCase()) {
                case 'INPUT':
                    switch (elements[i].type.toUpperCase()) {
                        case 'BUTTON':
                            break;
                        case 'CHECKBOX','RADIO':
                            elements[i].checked = false;
                            break;
                        default:
                            elements[i].value = '';
                            break;
                    }
                    break;
                case 'TEXTAREA':
                    elements[i].value = '';
                    break;
                case 'SELECT':
                    elements[i].selectedIndex = 0;
                    break;
                case 'OBJECT':
                    if(elements[i].name.toUpperCase().substr(0,2)=='WG') {
	                    elements[i].Rows = elements[i].FixedRows;
                    }
                default:
                    break;
            }
            gDocModified = true;
        }
    }
}


function chkFieldEmpty(obj) {
    if (!obj) { return false; }
    if (obj.tagName.toUpperCase() == 'INPUT' && obj.type.toUpperCase() == 'CHECKBOX') {
        if (trim(obj.checked) == false) {
            return true;
        }
    } else {
        if (trim(obj.value) == '') {
            return true;
        }
    }
    return false;
}

function clearField(obj) {

    if (!obj) {return;}
    
    if (obj.tagName.toUpperCase() == 'INPUT' && obj.type.toUpperCase() == 'CHECKBOX') {
        obj.checked = false;

    } else if (obj.tagName.toUpperCase() == 'SELECT') {
        CmbClear(obj,false);

    } else {
        obj.value = '';

    }

    gDocModified = true;
    return;        
}

function defValidateForm(fname,frm) {

    var elements = getControls(frm);

    switch (fname.toUpperCase()) {
        case 'SAVE':
            for(var i=0;i<elements.length;i++) {
                if(elements[i]) {
                    switch (elements[i].tagName.toUpperCase()) {
                        case 'INPUT':
                            switch (elements[i].type.toUpperCase()) {
                                case 'TEXT':
                                    if (!defValidate(elements[i],true)) {
                                        setFocus(elements[i]);
                                        return false;
                                    }
                                    break;
                                default:
                                    break;
                            }
                            break;
                        case 'TEXTAREA':
                            if (!defValidate(elements[i])) {
                                setFocus(elements[i]);
                                return false;
                            }
                            break;
                        case 'SELECT':
                            break;
                        case 'OBJECT':
                            break;
                        default:
                            break;
                    }
                }
            }
            break;
        case 'DELETE':
            attKey = 'ReqForDelete';
            break;
        case 'SEARCH':
            attKey = 'ReqForSearch';
            break;
        case 'RETRIEVE':
            attKey = 'ReqForRetrieve';
            break;
        default:
            attKey = '';
            break;
    }
        

    // TODO: provide validate event for form
    //if (self.docValidate) { if (!self.docValidate(fname.toUpperCase(), elements)) {return false;} }
    
    return true;
}

function defValidate(obj,batch) {

    var isValid = true;
    var objVal, objTestVal;
    var objValArr;
    var isBatch;

    // check object exists
    if (!obj) { return isValid;}
    isBatch = (batch) ? batch : false;
    
    // gather object information
    // datatype, maxcols, maxrows
    var dataType, maxCols, maxRows, mask, objType, codeinfo;
    // obj type
    objType    = obj.tagName.toUpperCase();
    // mask
    mask       = (obj.attributes.getNamedItem("mask") == null) ? '' : obj.attributes.getNamedItem("mask").value;
    // max dimensions (for textarea)
    maxCols    = parseInt((obj.attributes.getNamedItem("maxcols") == null) ? '' : obj.attributes.getNamedItem("maxcols").value);
    maxRows    = parseInt((obj.attributes.getNamedItem("maxrows") == null) ? '' : obj.attributes.getNamedItem("maxrows").value);
    
    // get code information
    codeinfo   = eval('(' + $(obj).attr("codeinfo") + ')');
    
    // get object value
    objVal = obj.value;
    objTestVal = objVal.split(/\n|\f|\r/).join('\\n');
    
    // determin data type and validate function arguments
    dataType = (obj.attributes.getNamedItem("datatype") == null) ? '' : obj.attributes.getNamedItem("datatype").value;

    // validate against format
    switch (dataType) {
        case 'text':
            objTestVal = objVal;
            if (mask!='') {
            // to do : mask implementation
            }
            break;
        case 'numint':
            objTestVal = parseInt(objVal);
            if (isNaN(objTestVal)) {
                alert('Invalid Integer!');
                setFocus(obj);
                isValid = false;
            } else {
                obj.value = objTestVal.toString();
            }
            break;

        case 'numdbl':
            objTestVal = parseFloat(objVal);
            if (isNaN(objTestVal)) {
                alert('Invalid Number!');
                setFocus(obj);
                isValid = false;
            } else {
                obj.value = objTestVal.toString();
            }
            break;
            
        case 'code':
            if (!isBatch) {
                objTestVal = objVal;
                window.setTimeout('validate_code("'+obj.id+'");',0);
//                if (validate_code(codeinfo) == false) {
//                    isValid = false;
//                }
            }
            break;
            
        case '':
            break;
                
        default:
            obj.value = FormatVal(obj.value,dataType);
            objTestVal = obj.value;
            if (ValidateVal(objTestVal, dataType) == false) {
                setFocus(obj);
                isValid = false;
            }
            break;
    }
    
    // validate dimensions for textarea
    if (objType == 'TEXTAREA') {
        // todo : 
        // get value into temp variable
        // loop each line and check no. of cols (if maxcols is specified)
        // loop each line and check no. of rols (if maxrows is specified)
        objValArr = objVal.split('\n');
        
        for (var i=0;i<objValArr.length;i++) {
            if (maxRows > 0) {
                if (i+1 > maxRows) {
                    alert('Max. number of rows exceeded! Max. is ' + maxRows.toString());
                    isValid = false;
                    setFocus(obj);
                    return isValid;
                }
            }
            if (maxCols > 0) {
                for (var j=0;j<objValArr[i].length; j++) {
                    if (j+1 > maxCols) {
                        alert('Max. number of columns exceeded! Max. is ' + maxCols.toString());
                        isValid = false;
                        setFocus(obj);
                        return isValid;
                    }
                }
            }
        }
    }
    
    obj.isValid = isValid;
    return isValid;    
}

function ValidateVal(val, dataType) {

    val = val.replace(/'/g,'.').replace(/"/g,'.');  //make sure no special char
    var dataTypeFormat = /^(\w+)\((.*)\)$/;
    var dataTyeFn;
    var dataTypeArgs = [];
    dataTypeParsed = dataType.match(dataTypeFormat);

    if (dataTypeParsed) {
        dataTypeFn = dataTypeParsed[1];
        dataTypeArgs = dataTypeParsed[2].split(',');
        if (isEmpty(dataTypeArgs)) { dataTypeArgs[0] = "'"+val+"'"; dataTypeArgs[1] = true; }
        else { dataTypeArgs.splice(0, 0, "'"+val+"'", true); }

        if (dataTypeFn) {
            dataTypeArgs[0] = dataTypeArgs[0].replace(new RegExp("\\r\\n", "g"), ".");
            if (eval(dataTypeFn+"("+dataTypeArgs.join(",")+")")==false) {
                return false;
            } else {
                return true;
            }
        }
    }

}

function FormatVal(val, dataType) {

    var dataTypeFormat = /^(\w+)\((.*)\)$/;
    var dataTypeFn;
    var dataTypeArgs = [];
    dataTypeParsed = dataType.match(dataTypeFormat);

    if (dataTypeParsed) {
        dataTypeFn = dataTypeParsed[1];
        dataTypeArgs = dataTypeParsed[2].split(',');
        if (isEmpty(dataTypeArgs)) { dataTypeArgs[0] = "'" + val + "'"; dataTypeArgs[1] = false; }
        else { dataTypeArgs.splice(0, 0, "'" + val + "'", false); }

        if (dataTypeFn == 'N' || dataTypeFn == 'DT' || dataTypeFn == 'TM' || dataTypeFn == 'DTM') {
            if (dataTypeFn == 'DT' && val.length == 4) {
                //If user input mmdd -> auto insert current year at the beginning
                var dNow = new Date();
                val = dNow.getFullYear() + '' + val;
                dataTypeArgs[0] = val;
            }
            if (dataTypeFn) {
                return eval("to" + dataTypeFn + "(" + dataTypeArgs.join(",") + ")");
            } else {
                return val;
            }
        } else {
            return val;
        }
    } else {
        return val;
    }


}

//*********************************************************//
//    Validation & Formatting Functions
//*********************************************************//
// usage: N(val, (bool)showAlert [, (int)numNo, (int)decNo, (bool)signed])
function N() {

    var num = (arguments[0]) ?  ('' + arguments[0]).replace(/,/g,'') : '';
    // empty string considered valid
    if (isEmpty(num)) { return true; }
    var showAlert = arguments[1];
    // check if to allow - sign
    var isSigned = (typeof arguments[arguments.length-1] == 'boolean') ? arguments[arguments.length-1] : false ;

    // determine if there is a decimal part
    // determine if there is a decimal part
    var intLen = 0;
    if (arguments.length >= 3) {
        intLen = (isNaN(arguments[2])) ? 0 : parseInt(arguments[2]);
//        if (typeof arguments[2] == 'number') {
//            intLen = arguments[2];
//        }
    }
    var decLen = 0;
    if (arguments.length >= 4) {
        decLen = (isNaN(arguments[3])) ? 0 : parseInt(arguments[3]);
//        if (typeof arguments[3] == 'number') {
//            decLen = arguments[3];
//            intLen -= decLen;
//        }
    }

    var strNumFormat = '\\d+';
    if (intLen > 0) { strNumFormat = '\\d{0,'+intLen.toString()+'}'; }
    if (decLen > 0) { strNumFormat += '(\\.\\d{0,'+decLen.toString()+'})?'; }
    if (isSigned)   { strNumFormat = '-?' + strNumFormat; }
    
    var numFormat = eval('/^'+strNumFormat+'$/');  // example  /^-?\d+(\.\d+)?$/;

    if (!num.match(numFormat)) { if (showAlert) {alert('Invalid Number'); } return false; } else { return true; }
}

// usage: N(val, (bool)showAlert [, (int)numNo, (int)decNo, (bool)signed])
function toN() {

    var num = (arguments[0]) ?  parseFloat(arguments[0].replace(/,/g,'')) : 0;
    // empty string
    if (isEmpty(num.toString())) { return ''; }
    var showAlert = arguments[1];
    // check if to allow - sign
    var isSigned = (typeof arguments[arguments.length-1] == 'boolean') ? arguments[arguments.length-1] : false ;

    // determine if there is a decimal part
    // determine if there is a decimal part
    var intLen = 0;
    if (arguments.length >= 3) {
        if (typeof arguments[2] == 'number') {
            intLen = arguments[2];
        }
    }
    var decLen = 0;
    if (arguments.length >= 4) {
        if (typeof arguments[3] == 'number') {
            decLen = arguments[3];
            intLen -= decLen;
        }
    }
    
    num = num.toFixed(decLen);
    
    var tmpNum = num.split('.');
    if (tmpNum[0].length > intLen) {
        var intPart = tmpNum[0];
        intPart = intPart.substring(intPart.length-intLen-1, intPart.length-1);
        tmpNum[0] = intPart;
    }
    num = tmpNum.join('.');
    
    // add thousand separators
    num = addCommas(num);
    return num;

}

function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

// usage: VC(val, (bool)showAlert [, (int)maxLen])
function VC() {
    
    var str = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(str)) { return true; }
    var showAlert = arguments[1];

    var maxLen = (arguments[2]) ? arguments[2] : 0;

    // strip line CRLF for multiline
    // TODO: doesn't seem to work ==> str.replace(/(\s*(\r?\n|\r))+$/, '');
    str = str.split(/\n|\f|\r/).join('');
    
    if (maxLen > 0) { if(str.length > maxLen) { if (showAlert) {alert('Exceeded maximum ('+maxLen.toString()+') length!');} return false; } }
    
    return true;
}

function toVC() {
    
    var str = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(str)) { return ''; }
    var showAlert = arguments[1];

    var maxLen = (arguments[2]) ? arguments[2] : 0;
    var strFormat = '';
    while (strFormat.length < maxLen) {
        strFormat += '*';
    }

    return $.mask.string(str, strFormat);
}


// usage: DT(val, (bool)showAlert])
function DT() {

    var dt = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(dt)) { return true; }

    var showAlert = arguments[1];

    var dtFormat = /^(\d{4})-(\d{2})-(\d{2})$/;
    var dtMatch = dt.match(dtFormat);

    if (!dtMatch) { if (showAlert) {alert("Invalid Date. (yyyy-mm-dd)");} return false; }

    var strYear  = dtMatch[1];
    var strMonth = dtMatch[2];
    var strDay   = dtMatch[3];

    var oDate = new Date(strYear, strMonth-1, strDay)

    // TODO: bug: cannot determine which part is incorrect using this method (test case: 2008/01/32)
    if (oDate.getFullYear() != strYear || oDate.getMonth()+1 != strMonth || oDate.getDate() != strDay)  { 
        if (showAlert) {alert("Invalid Day or Month or Year!"); } 
        return false;  
    }

    return true;

}

function toDT() {

    var dt = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(dt)) { return ''; }

    var showAlert = arguments[1];

    return $.mask.string(dt, 'yjdate');

}

// usage: TM(val, (bool)showAlert])
function TM() {

    var tm = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(tm)) { return true; }

    var showAlert = arguments[1];

    // var tmFormat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;  // sample format for HH:MM:SS AM/PM format.
    var useAmPm = false;
    var tmFormat = /^(\d{2}):(\d{2})$/;
    var tmMatch = tm.match(tmFormat);

    if (!tmMatch) { if (showAlert) {alert("Invalid Time. (HH:MM)");} return false; }

    var strHour    = tmMatch[1];
    var strMinutes = tmMatch[2];
    var strSeconds = null;
    var strAmPm    = null;

    if (!useAmPm) {
        if (strHour < 0  || strHour > 23) { if (showAlert) {alert("Invalid Hour! (0~23).");} return false; }
    } else {
        if (strHour <= 12)   { if (showAlert) {alert("Invalid Hour! (1~12).");} return false; }
        if (strAmPm == null) { if (showAlert) {alert("Please specify AM or PM.");} return false; }
    }
    if (strMinutes<0 || strMinutes > 59) { if (showAlert) {alert("Invalid Minute! (0~59).");} return false; }
    if (strSeconds != null && (strSeconds < 0 || strSeconds > 59)) { if (showAlert) {alert("Invalid Second! (0~59).");} return false; }

    return true;
}

function toTM() {

    var tm = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(tm)) { return ''; }

    var showAlert = arguments[1];

    return $.mask.string(tm, 'yjtime');

}


// usage: DTM(val, (bool)showAlert])
function DTM(){

    var dtm = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(dtm)) { return true; }

    var showAlert = arguments[1];

    // var dtmFormat = /^(\d{4})\/(\d{2})\/(\d{2})\s(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;  // sample format for yyyy/mm/dd HH:MM:SS AM/PM format.
    var useAmPm = false;
    var dtmFormat = /^(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2})$/;
    var dtmMatch = dtm.match(dtmFormat);

    if (!dtmMatch) { if (showAlert) {alert("Invalid Date/Time. (yyyy-mm-dd HH:MM)");} return false; }

    var strYear    = dtmMatch[1];
    var strMonth   = dtmMatch[2];
    var strDay     = dtmMatch[3];
    var strHour    = dtmMatch[4];
    var strMinutes = dtmMatch[5];
    var strSeconds = null;
    var strAmPm    = null;

    var oDate = new Date(strYear, strMonth-1, strDay)

    if (oDate.getFullYear() != strYear)  { alert("Invalid Year!"); return false;  }
    if (oDate.getMonth()+1  != strMonth) { alert("Invalid Month!"); return false; }
    if (oDate.getDate()     != strDay)   { alert("Invalid Day!"); return false;   }

    if (!useAmPm) {
        if (strHour < 0  || strHour > 23) { if (showAlert) {alert("Invalid Hour! (0~23).");} return false; }
    } else {
        if (strHour <= 12)   { if (showAlert) {alert("Invalid Hour! (1~12).");} return false; }
        if (strAmPm == null) { if (showAlert) {alert("Please specify AM or PM.");} return false; }
    }
    if (strMinutes<0 || strMinutes > 59) { if (showAlert) {alert("Invalid Minute! (0~59).");} return false; }
    if (strSeconds != null && (strSeconds < 0 || strSeconds > 59)) { if (showAlert) {alert("Invalid Second! (0~59).");} return false; }

    return true;

}

function toDTM() {

    var dtm = (arguments[0]) ? arguments[0] : '';
    // empty string considered valid
    if (isEmpty(dtm)) { return ''; }

    var showAlert = arguments[1];

    return $.mask.string(dtm, {mask : '9999-19-39 29:59', defaultValue: '000000000000'});

}

function BOOL() {
    return true;
}

function validate_code(ID) {

    var codeinfo;
    var blockList = [];
    
    if (document.all(ID).codeinfo) {
        codeinfo = eval('(' + $('#'+ID).attr("codeinfo") + ')');
    } else {
        return;
    }
   
    if (!codeinfo) { return true; }
    
    if (codeinfo.codeid=='') { alert('Code ID is missing!'); return true; }

    // clear description fields
    if (codeinfo.integrity==true) {
        if (codeinfo.othdesc) {
            var descfield;
            for (var i=0; i< codeinfo.othdesc.length; i++) {
                descfield = document.all(codeinfo.othdesc[i]);
                clearField(descfield);
            }
        }
    }
    
    if (document.all(codeinfo.keycond).value == '') {return true; }

    blockList.push(codeinfo.keycond);
    if (codeinfo.othdesc) {
        blockList = blockList.concat(codeinfo.othdesc);
    }

    // check if pre conditions have been input
    if (codeinfo.precond) {
        blockList = blockList.concat(codeinfo.precond);
        var precond;
        for (var i=0; i< codeinfo.precond.length; i++) {
            precond = document.all(codeinfo.precond[i]);
            if (chkFieldEmpty(precond)==true) {
                alert(precond.title + ' is required!');
                clearField(document.all(codeinfo.keycond));
                setFocus(precond);
                return false;
                break;
            }
        }
    }
    
    if (codeinfo.optcond) {
        blockList = blockList.concat(codeinfo.optcond);
    }

    var pb = new PostBox('POST_CALL');
    
    var codedata = {
        keycond: '',
        precond: [],
        optcond: []
    };
    
    codedata.keycond = document.all(codeinfo.keycond).value;
    
    for (var i=0; i<codeinfo.precond.length; i++) {
        codedata.precond[i] = document.all(codeinfo.precond[i]) ? document.all(codeinfo.precond[i]).value : '';
    }
    for (var i=0; i<codeinfo.optcond.length; i++) {
        codedata.optcond[i] = document.all(codeinfo.optcond[i]) ? document.all(codeinfo.optcond[i]).value : '';
    }
    
    if (codeinfo.codeid == 'CustomDef') {
        pb.AddCalls(codeinfo.codeid + '_Check', codeinfo.dbFields, codeinfo.dbTables, codeinfo.dbWhere, codedata.keycond, codedata.precond, codedata.optcond);
    } else {
        pb.AddCalls(codeinfo.codeid + '_Check', codedata.keycond, codedata.precond, codedata.optcond);
    }
    
    //$(jqfy(RemoveHiddenInput(blockList.join(',')))).block( { message: '<img src="/App_Themes/Default/images/progress/ajax-loader-small-snake.gif">'} );

    pb.PostCodeValidate(codeinfo);

}

//CodeSearch client function
function search_code(codeinfo){
    
    if (!codeinfo) { return true; }

    if (codeinfo.codeid=='') { alert('Code ID is missing!'); return true; }
    
    if (isReadonly(document.all(codeinfo.keycond))) { return true; }

    var codedata = {
        keycond: '',
        precond: [],
        optcond: [],
        desclist: []
    };
    
    // check if pre conditions have been input
    if (codeinfo.precond) {
        var precond;
        for (var i=0; i< codeinfo.precond.length; i++) {
            precond = document.all(codeinfo.precond[i]);
            if (chkFieldEmpty(precond)==true) {
                alert(precond.title + ' is required!');

                // clear key field
                clearField(document.all(codeinfo.keycond));

                // clear description fields
                if (codeinfo.integrity==true) {
                    if (codeinfo.othdesc) {
                        var descfield;
                        for (var i=0; i< codeinfo.othdesc.length; i++) {
                            descfield = document.all(codeinfo.othdesc[i]);
                            clearField(descfield);
                        }
                    }
                }
                
                setFocus(precond);
                return false;
            }
        }
    }
    
    codedata.keycond = document.all(codeinfo.keycond).value;
    
    for (var i=0; i<codeinfo.precond.length; i++) {
        codedata.precond[i] = document.all(codeinfo.precond[i]) ? document.all(codeinfo.precond[i]).value : '';
    }
    for (var i=0; i<codeinfo.optcond.length; i++) {
        codedata.optcond[i] = document.all(codeinfo.optcond[i]) ? document.all(codeinfo.optcond[i]).value : '';
    }
    for (var i=0; i<codeinfo.othdesc.length; i++) {
        codedata.desclist[i] = document.all(codeinfo.othdesc[i]) ? document.all(codeinfo.othdesc[i]).value : '';
    }

    var param = [codeinfo,codedata,window];

    var codeFile = codeinfo.codefile || '/common/codemaster.aspx';
    
    var retval = window.showModalDialog(codeFile+"?CODEID="+codeinfo.codeid, param,"dialogWidth:340px;dialogHeight:400px;resizable:no;help:no;status:no;scroll:no;");
    if (retval != null){
        $("#" + codeinfo.keycond).attr("value", retval[0]);
        if ($("#" + codeinfo.keycond).attr("raise_change_on_popup_select") == true){
            $("#" + codeinfo.keycond).trigger('change');
        }
        for (var i = 0; i < codeinfo.othdesc.length; i++) {
            if (document.getElementById(codeinfo.othdesc[i])) {
                $('#' + codeinfo.othdesc[i]).attr("value", retval[i + 1]);
                if ($("#" + codeinfo.othdesc[i]).attr("raise_change_on_popup_select") == true) {
                    $("#" + codeinfo.othdesc[i]).trigger('change');
                }
            }
        }
        gDocModified = true;
                
    }
    
    setFocus(document.all(codeinfo.keycond));
}

function due_date2(){
    var value;
    var today = new Date();
    var y; 
    var m;
    var d;
    
    y = today.getYear();
    m = today.getMonth() + 1;
    d = today.getDate();
    
   if(d <1) {
      d = "0"+day;
   }
   y = (y < 1000) ? y + 1900 : y;
   if(m <10) {
      m = "0" + m;
   }
   if(d <10) {
      d = "0" + d;
   }
       
    // modified based on TPL project request
    // original value = y + m + d ;
    value = y + "-" + m  + "-" +d ;
    return value;
}	

function AddDate(dt, n) {
   // modified based on TPL project request
    var s = dt.replace(/-/g, "")
   //var s = dt.replace('-','');
   if(s.length != 8) return false;

   var	y = s.substring(0, 4) - 1900       // year
   var	m = s.substring(4, 6) - 1          // month
   var	d = s.substring(6, 8)              // day

   var tx = new Date(y,m,d)
   var cn  = n*24*60*60*1000; //day --> msec

   var ty = new Date(tx.getTime()+cn);
   y = ty.getYear()
   m = ty.getMonth() +1
   d = ty.getDate()

   var nxtdate = dt
   if(d <1) {
      d = "0"+day;
   }
   y = (y < 1000) ? y + 1900 : y;
   if(m <10) {
      m = "0" + m;
   }
   if(d <10) {
      d = "0" + d;
   }

   nxtdate = y + "-" + m + "-" + d ;   
   return nxtdate
}
	
// adds option item to combo list
function CmbAdd(vCombo, vValue, vText) {
	var oOption = document.createElement("OPTION");
	oOption.text = vText;
	oOption.value = vValue;
	oOption.id = vValue;
	vCombo.add(oOption);
	return;
}

// clears combo list
function CmbClear(vCombo,removeFirst) {
	var i;
	var remFirst = false;
	if (arguments.length==2) {
	    remFirst = arguments[1];
	}
	
	for (i=vCombo.options.length-1; i>=0; i--) {
	    if (i==0 && remFirst==false) {break;}
		vCombo.remove(i);
	}
	return;
}

function RemoveHiddenInput(InputStr) {
    var InputList = InputStr.split(",");
    var FilteredList = [];
    for (var i=0; i < InputList.length; i++) {
        if (document.all(InputList[i])) {
            if (document.all(InputList[i]).type!="hidden") {
                FilteredList.push(InputList[i]);
            }
        }
    }
    return FilteredList.join(",");
}

String.prototype.trim=function(str) {
    var i = 0;
    if (typeof str != "string") return str;
		str = str.replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}
