
// Blank or Null check
function chk_empty(obj){
	if(	(rtrim(obj.value) == "") || (obj.value	== null) ){
		return false;
	}
	return true;
}

function chk_email(obj){
	strEmail = obj.value;
	if(strEmail	== "") return false;
	if ((strEmail.indexOf("@", 0) == -1) ||	(strEmail.indexOf(".", 0) == -1)) {
		(obj,'Email format error!');
		return false;
	}
	return true;
}

function chk_type(obj,flag) {
	var	chars;
	if(flag	== "E"){
		chars =	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
	}else if(flag == "LE"){
		chars =	"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	}else if(flag == "N"){
		chars =	"0123456789.";
		if(obj.value.length==0){obj.value="0";}
	}else if(flag == "NN"){
		chars =	"0123456789.";
	}else if(flag == "NC"){
		chars =	",.-0123456789";
	}else if(flag == "EN"){
		chars =	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.";
	}
	var	tf = false;
	for	(var inx = 0; inx <	obj.value.length; inx++) {
	   if (chars.indexOf(obj.value.charAt(inx))	== -1){
			//funcReturnWarn(obj,'Invalid Type !');
			if(flag=="E"|| flag=="EN"){
			    obj.value="";
			}
			else{
			    obj.value="0";
			}
			obj.focus();
			return false;
	   }
	}
	return true;
}


//check a date is valid or not
//obj: can be an object or string
//Support date formats: yyyymmdd, yyyy-mm-dd
function chk_date(obj){
    var sInput;
    if (typeof obj == 'string')
        sInput = obj;
    else
        sInput = obj.value;
    
	if(sInput == "") return true;
	sInput = sInput.replace(/-/g,'');   //convert format
	
	 if((sInput).length !=8) return false;
	var	yyyy = (sInput).substring(0,4);
	var	mm = (sInput).substring(4,6);
	if(!(parseInt(mm,10) <	1 && parseInt(mm,10) >	12)){}
    else{
	    return false;
	}
	var	dd = (sInput).substring(6,8);
	var	m =	parseInt(mm,10)	- 1;
	var	d =	parseInt(dd,10);

	var	end	= new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if ((yyyy %	4 == 0 && yyyy % 100 !=	0) || yyyy % 400 ==	0) {
		end[1] = 29;
	}
	if(!(d	>= 1 &&	d <= end[m])){
	    return false;
	}
	return true;
}


// check if date time is valid
function chk_datetime(vDateTime){
	if(vDateTime ==	"")	return true;
	if(vDateTime.length !=12) return	false;

	var	yyyy = vDateTime.substring(0,4);
	var	mm = vDateTime.substring(4,6);
	if(!(parseInt(mm,10) < 1 || parseInt(mm,10) > 12)){}
    else{
	    return false;
	}
	var	dd = vDateTime.substring(6,8);
	var	m =	parseInt(mm,10)	- 1;
	var	d =	parseInt(dd,10);

	var	end	= new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if ((yyyy %	4 == 0 && yyyy % 100 !=	0) || yyyy % 400 ==	0) {
		end[1] = 29;
	}
	if(!(d	>= 1 &&	d <= end[m])){
	    return false;
	}

	var	hh = vDateTime.substring(8,10);
	var	mi = vDateTime.substring(10,12);
	if(!(parseInt(hh,10) < 0 || parseInt(hh,10) > 23)){}
    else{
	    return false;
	}
	if(!(parseInt(mi,10) < 0 || parseInt(mi,10) > 59)){}
    else{
	    return false;
	}
	return true;
}

// checks if date is valid
function chk_time(vTime){
	if(vTime ==	"")	return true;
	if(vTime.length !=4) return	false;
	
	if(isNaN(parseInt(vTime)) == true) {return false;}
	
	
	var	hh = vTime.substring(0,2);
	var	mi = vTime.substring(2,2);
	if((parseInt(hh,10) < 0 || parseInt(hh,10) > 23)){
	    return false;
	}
	if((parseInt(mi,10) < 0 || parseInt(mi,10) > 59)){
	    return false;
	}
	return true;
}
function removeComma(obj) {
	return obj.value.replace(/,/gi,"");
}

function focusCol(obj, bg_color) {
	    obj.style.backgroundColor = bg_color;
}


// get date +(-) n day
// dt type : 20010101 or 2001-01-01 (not check date error)
function AddDate(dt, n) {
   var s = dt.replace(/-/g, "")
   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
}

// round function pos : dot position
function myRound(num, pos) {
	var posV = Math.pow(10, (pos ? pos : 2))
	return Math.round(num*posV)/posV
}


function chk_required(obj){

    for(var i=0;i<obj.all.length;i++){

    	if (obj.all(i).tagName == "INPUT" || obj.all(i).tagName == "SELECT"){
    		if (obj.all(i).value=="" && obj.all(i).attributes.getNamedItem("required") != null){
    			alert(obj.all(i).title + " 필수항목입니다!");
    			obj.all(i).focus();
    			return false;
    		}
    	}
    }

    return true;

}

// sets required attribute
function SetRequired(vObj) {
	var attRequired = document.createAttribute("required");
	if (vObj.tagName == "INPUT" || vObj.tagName == "SELECT"){
		if (vObj.attributes.getNamedItem("required") == null){
			vObj.attributes.setNamedItem(attRequired);
			return;
		}
	}
}

// clears required attribute
function RemoveRequired(vObj) {
	if (vObj.tagName == "INPUT" || vObj.tagName == "SELECT"){
		if (vObj.attributes.getNamedItem("required") != null){
			vObj.attributes.removeNamedItem("required");
			return;
		}
	}
}

// Recalculates number of valid rows and outputs to vObj
function recalcRows(vGrid,vObj) {

	var i;
	var rowCnt;

	rowCnt = 0;
	for (var i=vGrid.fixedRows; i<vGrid.Rows; i++) {
		if (vGrid.textMatrix(i, vGrid.fixedCols) != "D") {
			rowCnt++;
		}
	}

	vObj.value = rowCnt.toString();

}


// checks to see if form is empty
function chkFormEmpty(oForm) {

	var i;
	var isEmpty = true;

	for (var i=0; i<oForm.all.length; i++) {
		if (oForm.all(i).tagName == "INPUT" || oForm.all(i).tagName == "SELECT") {
			if (rtrim(oForm.all(i).value) != "") {
				isEmpty = false;
				break;
			}
		}
	}

	return isEmpty;
}

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;

}

// Attempted to implement masking of screen (for use while ajax call is processing at server side)
// Attempted using popup object, but at the moment cannot find a way to make it semi transparent
// popup object also has disadvantage, it disappears when user clicks on it

//function toggleMask(status)
//{
//	var divMask=document.getElementById("divMask");
//	if(!divMask)return;

//	if(!popMask) {
//	    var popMask=window.createPopup();
//	    popMask.document.body.innerHTML=divMask.outerHTML;
//	}
//	
//    document.all("form1").blur();
//	if(!status) {
//	    if (!popMask.isOpen()) {
//		    popMask.show(0, 0, 800, 600, document.body);
//		    popMask.document.body.filter = 'progid:DXImageTransform.Microsoft.Alpha( style=0,opacity=70)';
//            popMask.document.all("divMask").style.display = '';
//	    } else {
//		    popMask.hide();
//	    }
//	} else {
//	    if (status=='ON') {
//		    popMask.show(0, 0, 800, 600, document.body);
//		    popMask.document.body.filter = 'progid:DXImageTransform.Microsoft.Alpha( style=0,opacity=70)';
//            popMask.document.all("divMask").style.display = '';
//	    } else {
//		    popMask.hide();
//	    }
//	}
//}

// Attempted to implement mask using DIV
// problem : windowed controls such as grid and select will show through
function toggleMask(status)
{
	var mask=document.getElementById("divMask");
	if(!mask)return;
	var target = null;
	document.forms[0].blur();
	
	if(!status) {
	    if (mask.style.display=='') {
            hideMask(mask);
	    } else {
            showMask(mask,target);
	    }
	} else {
	    if (status=='ON') {
            showMask(mask,target);
	    } else {
            hideMask(mask);
	    }
	}
}

//document.onreadystatechange=fnStartInit;
function fnStartInit()
{
//    if (document.readyState=="uninitialized") {
//        toggleProgress('ON');
//        setStatus('Initializing...');
//    } else if (document.readyState=="loading") {
//        toggleProgress('ON');
//        setStatus('Loading...');
//    } else if (document.readyState=="loaded") {
//        toggleProgress('ON');
//        setStatus('Loaded');
//    } else if (document.readyState=="interactive") {
//        toggleProgress('ON');
//        setStatus('Processing...');
//    } else if (document.readyState=="complete") {
//        toggleProgress('OFF');
//        setStatus('Ready');
//    }
    if (document.readyState=="uninitialized") {
        //document.all("BLOCK").style.display = '';
        //$.blockUI( {overlayCSS: {opacity: '1.0'} } );
    } else if (document.readyState=="complete") {
        //$.unblockUI();
        //document.all("BLOCK").style.display = 'none';
    }
}    

function showMask(mask,target)
{
	if(!mask)return;
	if(mask==null)return;
	var tobj;
	var pct;
	var offsetPadTop, offsetPadLeft;
	var offsetL, offsetT, offsetW, offsetH;
    
	tobj = (!target) ? document.body : target;

    // offset by percentage
//	pct =  0.8;
//	tobj = (!target) ? document.body : target;
//	offsetW = tobj.offsetWidth  * pct;
//	offsetH = tobj.offsetHeight * pct;
//	offsetL = tobj.offsetLeft   + ((tobj.offsetWidth  - offsetW) / 2)
//	offsetT = tobj.offsetTop    + ((tobj.offsetHeight - offsetH) / 2)

    // set offset values : offest by distance from top, left
	offsetPadTop  = 20;
	offsetPadLeft = 20;
	
	// if object is <body>, we need to base the dimensions on the document in the top window
	// otherwise if the current document is in a frame of iframe, the client height and width is not correct
	if (tobj.tagName.toUpperCase() == 'BODY') {
	    var oTop = window.top.document.body;
	    offsetW = oTop.clientWidth  + (offsetPadLeft * 2);
	    offsetH = oTop.clientHeight + (offsetPadTop  * 2);
//        alert(tobj.clientTop);
	} else {
	    offsetW = tobj.clientWidth  + (offsetPadLeft * 2);
	    offsetH = tobj.clientHeight + (offsetPadTop  * 2);
	}
	offsetL = tobj.offsetLeft   + offsetPadLeft;
	offsetT = tobj.offsetTop    + offsetPadTop;

    mask.style.position        = 'absolute';
    mask.style.left            = offsetL + 'px';
    mask.style.top             = offsetT + 'px';
    mask.style.width           = offsetW + 'px';
    mask.style.height          = offsetH + 'px';
    mask.style.backgroundColor = '#eeeeee';
    //mask.style.display         = '';
    
}


function hideMask(mask)
{
    mask.style.display = 'none';
}

function toggleProgress(status)
{

    // todo: need to work on progress display
    //return;
    
//	var pbar=window.top.document.getElementById("imgAjaxState");
    var pbar = true;
	if(!pbar)return;
	var target = null;
	
	if(!status) {
	    if (mask.style.display=='') {
            hideProgress(pbar);
	    } else {
            showProgress(pbar,target);
	    }
	} else {
	    if (status=='ON') {
            showProgress(pbar,target);
	    } else {
            hideProgress(pbar);
	    }
	}
}

function showProgress(pbar)
{
    $.blockUI();
    $(":grid").attr("MousePointer",11);
}

function hideProgress(pbar)
{
    $.unblockUI();
    $(":grid").attr("MousePointer",0);
}

function blockUI(opt) {
    $.blockUI(opt);
    $(":grid").attr("MousePointer",11);
}

function unblockUI(opt) {
    $.unblockUI(opt);
    $(":grid").attr("MousePointer",0);
}

// 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==''){
        // changed logic based on developer request
        // logic changed to: if no required fields specified,
        // framework will skip required field checking
        // alert('No required fields specified!');
        // return false;
        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 + ' 필수항목입니다!');
		            setFocus(elements[i]);
		            return false;
		        }
            } else {
                if (trim(elements[i].value)=='') {
		            alert(elements[i].title + ' 필수항목입니다!');
		            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;
		        }
		    }
		 }
    }

    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('유효하지 않은 항목이 선택되었습니다!'); 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('유효하지 않은 항목이 있습니다!'); return null;}

    return vFrmKey;

}

function clearForm(scope){

    var elements = getControls(scope);
    
    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':
                            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 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('숫자형식이 올바르지 않습니다!');
                setFocus(obj);
                isValid = false;
            } else {
                obj.value = objTestVal.toString();
            }
            break;

        case 'numdbl':
            objTestVal = parseFloat(objVal);
            if (isNaN(objTestVal)) {
                alert('숫자형식이 올바르지 않습니다!');
                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('최대 행값 오류입니다! 최대 행은 ' + 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('최대 열값 오류입니다! 최대 열은 ' + maxCols.toString()+'입니다.');
                        isValid = false;
                        setFocus(obj);
                        return isValid;
                    }
                }
            }
        }
    }
    
    obj.isValid = isValid;
    return isValid;    
}

function ValidateVal(val, dataType) {

    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) {
            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) {
                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) {
        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;
        }
    }

    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('숫자 형식이 올바르지 않습니다!'); } return false; }
}

// usage: N(val, (bool)showAlert [, (int)numNo, (int)decNo, (bool)signed])
function toN() {

    var num = (arguments[0]) ?  parseFloat(arguments[0]) : 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('최대자리수는 ('+maxLen.toString()+') 입니다!');} 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("날짜형식이 올바르지 않습니다. (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("(일, 월, 년)형식이 올바르지 않습니다!"); } 
        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("시간형식이 올바르지 않습니다. (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("시간이 올바르지 않습니다! (0~23).");} return false; }
    } else {
        if (strHour <= 12)   { if (showAlert) {alert("시간이 올바르지 않습니다! (1~12).");} return false; }
        if (strAmPm == null) { if (showAlert) {alert("AM or PM을 지정하세요");} return false; }
    }
    if (strMinutes<0 || strMinutes > 59) { if (showAlert) {alert("분형식이 올바르지 않습니다! (0~59).");} return false; }
    if (strSeconds != null && (strSeconds < 0 || strSeconds > 59)) { if (showAlert) {alert("초형식이 올바르지 않습니다! (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("날짜형식이 올바르지 않습니다. (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("년(年)도가 잘못되었습니다!"); return false;  }
    if (oDate.getMonth()+1  != strMonth) { alert("월(月)이 잘못되었습니다!"); return false; }
    if (oDate.getDate()     != strDay)   { alert("일(日)이 잘못되었습니다!"); return false;   }

    if (!useAmPm) {
        if (strHour < 0  || strHour > 23) { if (showAlert) {alert("시간형식이 잘못되었습니다! (0~23).");} return false; }
    } else {
        if (strHour <= 12)   { if (showAlert) {alert("시간형식이 잘못되었습니다! (1~12).");} return false; }
        if (strAmPm == null) { if (showAlert) {alert("AM or PM을 지정하세요.");} return false; }
    }
    if (strMinutes<0 || strMinutes > 59) { if (showAlert) {alert("분형식이 잘못되었습니다! (0~59).");} return false; }
    if (strSeconds != null && (strSeconds < 0 || strSeconds > 59)) { if (showAlert) {alert("초형식이 잘못되었습니다! (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('ID가 잘못되었습니다!'); 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 + ' 필수항목입니다!');
                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('ID가 잘못되었습니다!'); 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 + ' 필수항목입니다!');

                // 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];

    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){
        document.all(codeinfo.keycond).value = retval[0];
        
        for (var i=0; i<codeinfo.othdesc.length; i++) {
            if (document.all(codeinfo.othdesc[i])) document.all(codeinfo.othdesc[i]).value = retval[i+1];
        }
        
        gDocModified = true;
                
//        if (self.onAfterCodeFound){
//            onAfterCodeFound(retval,codeinfo.keycond);
//        }
    }
    
    setFocus(document.all(codeinfo.keycond));
}

function wg_validate_code(codeinfo) {

    if (!codeinfo) { return true; }

    var wg = document.all(codeinfo.gridId);
    var row = codeinfo.gridRow;

    // clear description fields
    if (codeinfo.othdesc) {
        var descfield;
        for (var i=0; i< codeinfo.othdesc.length; i++) {
            descfield = codeinfo.othdesc[i];
            if (descfield!='') wg.setVal(row, descfield, '');
        }
    }

    if (wg.getVal(row, codeinfo.keycond) == '') {return true; }

    // check if pre conditions have been input
    if (codeinfo.precond) {
        var precond;
        for (var i=0; i< codeinfo.precond.length; i++) {
            precond = codeinfo.precond[i];
            if (precond!='' && wg.isEmpty(row, precond)==true) {
                alert(wg.colTitle(precond) + ' 필수항목입니다!');
                wg.setVal(row, codeinfo.keycond, '');
                wg.setFocus(row, precond);
                return false;
                break;
            }
        }
    }

    var pb = new PostBox('POST_CALL');
    
    var codedata = {
        keycond: '',
        precond: [],
        optcond: []
    };
    
    codedata.keycond = wg.getVal(row, codeinfo.keycond);
    
    for (var i=0; i<codeinfo.precond.length; i++) {
        codedata.precond[i] = wg.getVal(row, codeinfo.precond[i]);
    }
    for (var i=0; i<codeinfo.optcond.length; i++) {
        codedata.optcond[i] = wg.getVal(row, codeinfo.optcond[i]);
    }
    
    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);
    }

    pb.PostGridCodeValidate(codeinfo);

}

//CodeSearch client function
function wg_search_code(codeinfo){
    
    if (!codeinfo) { return true; }

    var codedata = {
        keycond: '',
        precond: [],
        optcond: [],
        desclist: []
    };
    
    var wg = document.all(codeinfo.gridId);
    var row = codeinfo.gridRow;

    // check if pre conditions have been input
    if (codeinfo.precond) {
        var precond;
        for (var i=0; i< codeinfo.precond.length; i++) {
            precond = codeinfo.precond[i];
            if (precond!='' && wg.isEmpty(row, precond)==true) {
                alert(wg.colTitle(precond) + ' 필수항목입니다!');

                // clear key field
                wg.setVal(row, codeinfo.keycond, '');

                // clear description fields
                if (codeinfo.othdesc) {
                    var descfield;
                    for (var i=0; i< codeinfo.othdesc.length; i++) {
                        descfield = codeinfo.othdesc[i];
                        if (descfield!='') wg.setVal(row, descfield, '');
                    }
                }

                wg.setFocus(row, precond);
                return false;
                break;
            }
        }
    }

    codedata.keycond = wg.getVal(row, codeinfo.keycond);
    
    for (var i=0; i<codeinfo.precond.length; i++) {
        codedata.precond[i] = wg.getVal(row, codeinfo.precond[i]);
    }
    for (var i=0; i<codeinfo.optcond.length; i++) {
        codedata.optcond[i] = wg.getVal(row, codeinfo.optcond[i]);
    }
    for (var i=0; i<codeinfo.othdesc.length; i++) {
        codedata.desclist[i] = wg.getVal(row, codeinfo.othdesc[i]);
    }

    var param = [codeinfo,codedata];

    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){
        wg.setVal(row, codeinfo.keycond, retval[0]);
        
        for (var i=0; i<codeinfo.othdesc.length; i++) {
            wg.setVal(row, codeinfo.othdesc[i], retval[i+1]);
        }
                
//        if (self.onAfterCodeFound){
//            onAfterCodeFound(retval,codeinfo.keycond);
//        }
    }
    
    wg.setFocus(row, codeinfo.keycond);

}

// ======================== ȣ START ==================================== //
// gridChecked
//GRID CHECK BOX  CHECK Ǿ  true, CHECK ȵǾ  false RETURNѴ.
function gridCheckedBox(wgname){
    var wg = document.all(wgname);
    var checked = true;
    var flagval = "F";
    for (i=wg.FixedRows;i < wg.Rows; i++) {
        
	    if (wg.Cell(5, i, gwgChkCol) != 2) { // CHECK Ǿ  -1(true)  0 (FALSE)
	        flagval = "T";
	    }	        
    }	
    if (flagval == "F") {
        //alert("Select Check!");
        checked = false;     
    }
    return checked;
}

//gridCheckBoxAll()
//GRID HEADER CHECK BOX ý üGRID CHECK,UNCHECKѴ.
function gridCheckBoxAll_temp(wgname){
    var wg = document.all(wgname);
	if (wg.MouseRow==0 && wg.MouseCol==1){
		//-- check Ǿ üüũ ƴϸ ü
	    if (wg.Cell(5, 0, gwgChkCol) == 2){ //-- unChecked
	        for (i=1;i < wg.rows ;i++){
	        	wg.Cell(5, i, gwgChkCol) = 2;
	        	if (wg.textMatrix(i, wg.ColIndex(wgname+"_INSFLAG")) != "I" ) {
	        	    wg.textMatrix(i, wg.ColIndex(wgname+"_INSFLAG")) = "Q";
	        	}
			}
	    } else {                                //-- Checked
			for (i=1;i < wg.rows ;i++){		
				wg.Cell(5, i, gwgChkCol) = 1;
				if (wg.textMatrix(i, wg.ColIndex(wgname+"_INSFLAG")) != "I" ) {
				    wg.textMatrix(i, wg.ColIndex(wgname+"_INSFLAG")) = "U";
				}
			}
	    }
	} else if (wg.MouseRow>0 && wg.MouseCol==1) {
	    if (wg.Cell(5, wg.row, gwgChkCol) == 2){ //-- unChecked
        	wg.Cell(5, wg.row, gwgChkCol) = 2;
        	if (wg.textMatrix(wg.row, wg.ColIndex(wgname+"_INSFLAG")) != "I" ) {
        	    wg.textMatrix(wg.row, wg.ColIndex(wgname+"_INSFLAG")) = "Q";
        	}
	    } else {                                //-- Checked	
			wg.Cell(5, wg.row, gwgChkCol) = 1;
			if (wg.textMatrix(wg.row, wg.ColIndex(wgname+"_INSFLAG")) != "I" ) {
			    wg.textMatrix(wg.row, wg.ColIndex(wgname+"_INSFLAG")) = "U";
			}
	    }	
	}
}		

// gridCheckBoxFlag()
// CHECK BOX  CHECK BOX  FLAG.
function gridCheckBoxFlag_temp(wgname){
    var wg = document.all(wgname);
	for (i=wg.FixedRows;i < wg.Rows; i++) {
	    if (wg.textMatrix(i,  gwgChkCol) == "True" ) {
	        if (wg.textMatrix(i,  gwgFlgCol) != "I" ) { //INSERT  I  ־ .
	            wg.textMatrix(i,  gwgFlgCol) = "U";
	        }
	    } else {
	        wg.textMatrix(i,  gwgFlgCol) = "Q";
	    }	        
	}
}	

// 糯¥
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;   
}	
//ADD DATE
function AddDate(dt, n) {
   // modified based on TPL project request
   // original 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;
   }

   // modified based on TPL project request
   // original nxtdate = y + m + d;
   nxtdate = y + "-" + m + "-" + d ;   
   return nxtdate
}
	
//help
function checkinputs() {

	var arCur;
	var objPopup = window.createPopup();
	//var objPopup = window.open("", 'src', 'width=850,height=600,scrollbars=0,resizable=yes,location=no');
    //var objPopup = window.open();
    var flagHeader = 0;
	var strOutput;
	var strHeader ="";
	var strBody="";
	var strTail="";
	var strTemp;
	var strTemp2;
	var strClear="";
	var Idx;
	var i;
	var strTab = "&nbsp;&nbsp;&nbsp;&nbsp;";
	var strCr  = "<br>";
	var strFld = ".Fields.Append ";
	var adBSTR = ",8";
	var strWith = "With ";
	var strOpen = ".Open";
	var strEnd = "End With";
    var addnew = ".AddNew";
    var update = ".Update";
    var strDim = "";
    var firstField = "";
    var HeaderItem =0;
    var GridCount =0;

	strOutput = "";


//	strHeader = strHeader + "<div style='font-family:courier;font-size:11px;overflow:auto;background-color:#EEEEEE;scrollbar-face-color:#FFFFFF;scrollbar-shadow-color:#888888;";
//	strHeader = strHeader + "scrollbar-highlight-color:#888888; scrollbar-3dlight-color:#FFFFFF;scrollbar-darkshadow-color:#FFFFFF;scrollbar-track-color:#FFFFFF;width:800px;height:500px'>";
  	// For Field Name
  	

  	strHeader = strHeader + "<table width=400 border=1 cellspacing=0 cellpadding=0>"
  	strHeader = strHeader + "<tr>";
  	
	var obj = document.all;
			
	var objArr;
	var oElement;
	var validYN = false;
	
	if (obj.length == null) {
		objArr = new Array(1);
		objArr[0] = obj;
	} else {
		objArr = obj;
	}

	for (var objArrIdx = 0; objArrIdx < objArr.length; objArrIdx++) {
		oElement = objArr[objArrIdx];
		
		switch (oElement.tagName.toUpperCase()) {
			case "CHECKBOX":		
			case "INPUT":
			case "SELECT":					
				var exp = oElement.tagName.split(":");
				strHeader = strHeader + "<td>"+oElement.name+"</td><td>"+oElement.title+"</td><td>"+exp[0]+"</td><td>"+oElement.type+"</td>"	
	 			strHeader = strHeader + "</tr>";
				strHeader = strHeader + "<tr>";						
				break;					
			case "TEXTAREA":
//				if(oElement.type!="button"){
//					if (oElement.validExp!=null) {
//						var columns = oElement.validExp.trim().advancedSplit(",", "it");
//						var exp = oElement.validExp.split(":");
//						strHeader = strHeader + "<td>&nbsp;</td><td>"+exp[0]+"</td><td>"+oElement.id+"</td>"
//						strHeader = strHeader + "</tr>";
//						strHeader = strHeader + "<tr>";
//					}else{
//						strHeader = strHeader + "<td>&nbsp;</td><td>"+exp[0]+"</td><td>"+oElement.id+"</td>"
//						strHeader = strHeader + "</tr>";
//						strHeader = strHeader + "<tr>";
//					}
//				}
//				break;
	
			case "OBJECT":					
				if (oElement.id.substr(0,2).toUpperCase() == "WG" ) {

				var wg = oElement.id.toUpperCase();
            		for (var i = 0; i < document.all[objArrIdx].cols; i++) {
                		var strColumnID = document.all[objArrIdx].ColKey(i);
						var DisplayName = document.all[objArrIdx].textMatrix(0,i);
						if (DisplayName!=""){
							strHeader = strHeader + "<td>"+strColumnID+"</td><td>"+DisplayName+"</td><td>"+oElement.id+"</td>"
							strHeader = strHeader + "</tr>";
							strHeader = strHeader + "<tr>";
						}
					}
				}			
				break;

			default:
				break;
		}
	}  
	
	strHeader = strHeader + "<td></td><td></td></tr></table>";  	
  	
    strOutput = strOutput +  strHeader
//	strOutput = strOutput + "</div>";
	//objPopup.document.body.innerHTML = strOutput
	//objPopup.show(document.body.offsetWidth/2-400, document.body.offsetHeight/2-250, 800, 500, document.body);
	newwin = window.open("", '_new', 'width=850,height=600,scrollbars=1,resizable=yes,menubar=yes,location=no');
	newwin.document.write (strOutput);
    newwin.focus();
	return;
}
	
// ======================== ȣ END ====================================== //	

// 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(",");
}
