본문 바로가기

NICE/X-Platform

x-platform 유용한 스크립트

//------------------------------------------------------------------
//마이플렛폼 스크립트 공백일때 0 처리
//------------------------------------------------------------------
isNil(absncDiseDds) ? "0" : absncDiseDds




//------------------------------------------------------------------
// grd_cnsgnStdntAtteList02_ontextchange() : 그리드 날짜 범위체크
//------------------------------------------------------------------
function grd_cnsgnStdntAtteList02_ontextchange(obj:Grid, e:GridEditTextChangeEventInfo)
{
 if(e.cell == 3){//수업일수
     if(e.chartext == "-") return false;//-입력금지
  if(toNumber(e.posttext) > 31) return false; //수업일수는 31을 넘지 않는다.
 } 
}


//----------------------------------------------------------
// lfn_ValueChangeCheck() : 체크처리
//----------------------------------------------------------
function lfn_ValueChangeCheck(obj:Dataset, e:DSColChangeEventInfo)

 if(e.columnid == "_chk") return;
 ds_cnsgnStdntAtteList02.setColumn(ds_cnsgnStdntAtteList02.rowposition,"_chk","1");

}


<<공통스크립트>>-------------------------------------------------------------------

/**
 * @fileoverview 공통유틸리티 함수
 * @author
 * @version 1.0   버전
 */

/**
 * Resize 처리 xjs Include.
 * @param 없음
 * @return 없음
 */
include "LIB::rsz_script.xjs"

/**
 * 변수 선언부
 * @param 없음
 * @return 없음
 */
var utlv_AscMark  =" ▲";  // Asc Mark
var utlv_DescMark =" ▼";  // Desc Mark

//첨부파일 관련 변수 선언
var vFile;     //VirtualFile
var FileDialog0;   //FileDialog
var HttpObject0;   //HttpObject
var strFileDir   = ""; //file directory
var strAddFilenm  = ""; //add file name

//FusionChart 관련 변수 선언

var gv_chartPath = gv_ServerUrl + "/deploy/fusionchart/";

/**
* Form Load 시 공통 기능 처리.
* Form의 onload Event에 필히 기술.
* @param : obj - Object(Form)
* @return : N/A
* @example : utlf_frmLoadsetEnv(obj);
*/
function utlf_frmLoadsetEnv(obj, nX, nY) {

 this.btn_help.onclick.setHandler(utlf_callHelp);
 this.btn_reply.onclick.setHandler(utlf_callReply);
 this.btn_qna.onclick.setHandler(utlf_callQna);
 this.btn_pal.onclick.setHandler(utlf_callPal);
 //Object 선언
 vFile   = new VirtualFile;
 FileDialog0 = new FileDialog;

// //  utlf_tranGetMessage(); // Message 처리
// //  utlf_tranLogin(); // Log-in 처리

 if (gv_mdiFlag == "false") {

  var uExtObj = new ExtCommon();

  gv_ServerUrl = "localhost:8080";
  // 김동학 파트장님 IP 임  Explorer 9 버젼에서 IP를 가지 가지 못함
  if(uExtObj.getIPAddress() == "80.2.23.186"){
   gv_ServerUrl = "112.136.170.16:5102";
  }
  trace("local gv_ServerUrl : === > " + gv_ServerUrl);

  utlf_tranGetMessage(); // Message 처리
  utlf_tranLogin(); // Log-in 처리

  nX = 831;
  nY = 553;

 } else {
  if(utlf_IsNull(nX)) nX = gv_initWidth;
  if(utlf_IsNull(nY)) nY = gv_initHeight;
 }

 //LIB::rsz_script.xjs 용 리사이즈 함수
 lf_SetResize(obj, nX, nY);
}

/**
* Div URL 링크돈 Form Load 시 공통 기능 처리.
* Div URL 링크돈 Form의 onload Event에 필히 기술.
* @param : obj - Object(Form)
* @return : N/A
* @example : utlf_divLoadsetEnv(obj);
*/
function utlf_divLoadsetEnv(obj, nX, nY) {

 //trace(obj.position.width + " ::: " + obj.position.height);

 if(obj instanceof Tabpage) {
  nX = obj.parent.position.width;
  nY = obj.parent.position.height - 26; // 26 : Tab Button Height
 } else {
  nX = obj.position.width;
  nY = obj.position.height;
 }

// //  if (gv_mdiFlag == "false") {
// //
// //   if(utlf_IsNull(nX)) nX = obj.position.width;
// //   if(utlf_IsNull(nY)) nY = obj.position.height;
// // //   nX = 831;
// // //   nY = 553;
// //
// //  } else {
// //   if(utlf_IsNull(nX)) nX = gv_initWidth;
// //   if(utlf_IsNull(nY)) nY = gv_initHeight;
// //  }

 //LIB::rsz_script.xjs 용 리사이즈 함수
 lf_SetResize(obj, nX, nY);
}

/**
* transaction 메세지
* @param : 없음
* @return : N/A
* @example : utlf_tranGetMessage();
*/
function utlf_tranGetMessage() {
 transaction("getMessage",
 "svc_neis::"+gv_ServerUrl+"/initialMessageProperties.xp?locale=ko",
 "",
 "gds_message=dsMergedProperties_mergedPropertiesList",
 "",
 "lfn_trans_callback");
}

/**
* 임시 Log-in 처리
* @param : 없음
* @return : N/A
* @example : utlf_tranLogin();
*/
function utlf_tranLogin() {
 transaction("login",
 "svc_neis::"+gv_ServerUrl+"/login.jsp",
 "",
 "",
 "",
 "lfn_trans_callback", false);

 //trace("call Transaction >>>>> " + JSESSIONID);
}

/**
* transaction Callback
* @param : 없음
* @return : N/A
* @example : lfn_trans_callbackmsg()
*/
function lfn_trans_callback(svcid, errcd, errmsg) {
//  trace("OnLoad>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//  trace(gds_message.saveXML());

 //if (svcid == "login") {
 // trace("callBack :::  Transaction >>>>> " + JSESSIONID);
 //}
}

/**
* Popup Load 시 공통 기능 처리.
* Form의 onload Event에 필히 기술.
* @param : obj - Object(Form)
* @return : N/A
* @example : utlf_PopupLoadsetEnv(obj);
*/
function utlf_PopupLoadsetEnv(obj, nX, nY) {
 if (gv_mdiFlag == "false") return;

 if (opener.pv_frmAuth == 1) {
  //trace(" opener auth:: "+opener.pv_frmAuth);
  //dialog WebSafer 적용
  //trace(" dialog handle::: "+opener.getOwnerFrame().Popup_Dialog.getHandle());
  opener.MaWebSAFER.LoadImageSafer(opener.getOwnerFrame().Popup_Dialog.getHandle(), false);
 }
}

/**
* 초등학교의 단위화면의 Main
* @param : winKey - Window ID
* @return : N/A
* @example : utlf_elsFrmClose(winKey);
*/
function utlf_elsFrmClose(winKey) {
 if (gv_mdiFlag != "false") {
  gv_AppBottomPath.form.lfn_deleteTabpage(winKey);
  var iRow = gds_openwininfo.findRow("winid", winKey);
  gds_openwininfo.deleteRow(iRow);
 }
}

/**
* 초등학교의 단위화면의 Main의 Title, Path, 의견달기, 도움말 비활성화
* @param : N/A
* @return : N/A
* @example : utlf_elsFrmClose(winKey);
*/
function utlf_elsFrmEnv() {
 btn_help.visible = false;
 main_title.visible = false;
 btn_reply.visible = false;
 btn_qna.visible = false;
 btn_pal.visible = false;
}

/**
* Popup 화면의 도움말 공통 처리.
* @param : popID - Popup Window ID
* @return : N/A
* @example : utlf_helpPopup(winID);
*/
function utlf_helpPopup(popID) {
 alert(popID);
}

/**
* Alert(공통 Message) 처리
* @param : msgId - Message ID (gds_message:Global Dataset)
* @param : args  - 치환문자열(Array)
* @return : N/A
* @example : utlf_alert("err.slc.cm.0002")
*/
function utlf_alert(msgid, args) {

 //alert(msgid);

 var msgTemp;
 var charChk = utlf_Pos(msgid, "^");

 if (charChk > 0) {
  msgTemp = msgid.split("^");
  alert(msgTemp[0] + "\n" + msgTemp[1]);

 } else {

  var findRow = gds_message.findRow( "msgId", msgid );

  if (findRow < 0) {
   return false;
  }

  if (utlf_IsNull(args)) {
   alert(gds_message.getColumn(findRow, "msg"));
  } else {
   var arglen = args.length;
   var strmsg = gds_message.getColumn(findRow, "msg");
   var arrmsg = strmsg.split("{");

   msgTemp = arrmsg[0];

   for (var i=0; i<arglen; i++) {
    msgTemp += utlf_Replace(arrmsg[i+1], i+"}", args[i]);
   }

   alert(msgTemp);
  }
 }
}


/**
* Confirm(공통 Message) 처리
* @param : msgId - Message ID (gds_message:Global Dataset)
* @param : args  - 치환문자열(Array)
* @return : true/false
* @example : utlf_confirm("err.slc.cm.0002")
*/
function utlf_confirm(msgid, args) {

 //return confirm(msgid);

 var rtnVal;
 var findRow = gds_message.findRow( "msgId", msgid );

 if (findRow < 0) {
  return false;
 }

 if (utlf_IsNull(args)) {
  return confirm(gds_message.getColumn(findRow, "msg"));
 } else {
  var arglen = args.length;
  var strmsg = gds_message.getColumn(findRow, "msg");
  var arrmsg = strmsg.split("{");

  var msgTemp = arrmsg[0];

  for (var i=0; i<arglen; i++) {
   msgTemp += utlf_Replace(arrmsg[i+1], i+"}", args[i]);
  }

  return confirm(msgTemp);
 }
}


/**
* Dataset의 Message Id에 대한 Text를 가져옴
* @param : msgId - Message ID (gds_message:Global Dataset)
* @param : args  - 치환문자열(Array)
* @return : string(Message), Not Exist : false
* @example : utlf_getMessage("err.slc.cm.0002")
*/
function utlf_getMessage(msgid, args) {

 var findRow = gds_message.findRow( "msgId", msgid );

 if (findRow < 0) {
  alert("해당 메세지가 없습니다!");
  return false;
 }

 if (utlf_IsNull(args)) {
  return gds_message.getColumn(findRow, "msg");
 } else {
  var arglen = args.length;
  var strmsg = gds_message.getColumn(findRow, "msg");
  var arrmsg = strmsg.split("{");

  var msgTemp = arrmsg[0];

  for (var i=0; i<arglen; i++) {
   msgTemp += utlf_Replace(arrmsg[i+1], i+"}", args[i]);
  }

  return msgTemp;
 }
}

/**
* 페이지 처리 기능.
* @param : objPage    - Object(Page 처리Composite Component)
* @param : totRowCnt  - 전체 건수
* @param : strFn    - 페이지 선택 시 호출 함수 정의
* @param : displayPage - 페이지당 보여줄 Data 건수
* @param : pgViewSize  - 보여줄 페이지 수(default:10)
* @return : N/A
* @example : utlf_setPageProc(div_PG, 10, 10, 145, "fn_search");
*/
function utlf_setPageProc(objPage, totRowCnt, strFn, displayPage, pgViewSize) {
 objPage.lfn_Init(totRowCnt, strFn, displayPage, pgViewSize);
}

/**
* Modal Dialog 처리
* @param : sID   - Dialog의 ID
* @param : sURL   - Popup 화면 URL
* @param : sArg   - Dialog Form으로 전달될 Argument
* @param : nLeft   - Dialog의 Left Position
* @param : nTop   - Dialog의 Top Position
* @param : nWidth  - Dialog 창의 Width
* @param : nHeight - Dialog 창의 Height
* @param : sStyle  - Dialog 기본 유형
* @param : sProp   - Chile Frame의 모든 Property를 설정
* @return : Child Frame Object
* @example : utlf_Dialog("test", "TEST::frm_type01_popup.xfdl", "");
*/
function utlf_Dialog(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle, sProp)
{
 var rtn=null;
 var newChild;
 var MyFrame = this.getOwnerFrame();

 newChild = _utlf_NewChildFrame(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle, sProp);
 rtn = newChild.showModal(sID, MyFrame, sArg);
 this.removeChild(newChild.name);
 newChild.destroy();
 newChild = null;

 if( rtn == "" || rtn == "undefined" ) rtn = "";

 return rtn;
}

/**
* Modeless Open 처리
* @param : sID   - Modeless의 ID
* @param : sURL   - Popup 화면 URL
* @param : sArg   - Modeless Form으로 전달될 Argument
* @param : nLeft   - Modeless의 Left Position
* @param : nTop   - Modeless의 Top Position
* @param : nWidth  - Modeless 창의 Width
* @param : nHeight - Modeless 창의 Height
* @param : sStyle  - Modeless 기본 유형
* @param : sProp   - Chile Frame의 모든 Property를 설정
* @return : Child Frame Object
* @example : utlf_Open("test", "TEST::frm_type01_popup.xfdl", "");
*/
function utlf_Open(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle, sProp)
{
 var rtn;
 var newChild;
 var MyFrame = this.getOwnerFrame();

 newChild = _utlf_NewChildFrame(sID, sURL, sArg, nLeft, nTop, nWidth, nHeight, sStyle, sProp);

 return newChild.showModeless(sID, MyFrame, sArg);
}

/**
* Modal/Modeless Popuu 처리
* @param : sID   - Popup Form의 ID
* @param : sURL   - Popup Form  URL
* @param : sArg   - Popup Form으로 전달될 Argument
* @param : nLeft   - Popup Form Left Position
* @param : nTop   - Popup Form Top Position
* @param : nWidth  - Popup Form Width
* @param : nHeight - Popup Form Height
* @param : sStyle  - Popup Form 기본 유형
* @param : sProp   - Chile Frame의 모든 Property를 설정
* @return : Child Frame Object
* @example : _utlf_NewChildFrame("test", "TEST::frm_type01_popup.xfdl", "");
*/
function _utlf_NewChildFrame( sID, sURL, Arg, nLeft, nTop, nWidth, nHeight, sStyle, sProp)
{
 var newChild = null;
 var MyFrame = this.getOwnerFrame();

 var bTitle = true;
 var bStatus = true;
 var bClose = true;
 var bMin = true;
 var bMax = true;
 var bAutoSize = true;
 var flag;
 var aProp = new Array();
 var bLayer = false; //layer속성(2010.10.30)

 if( utlf_IsNull(sID) || utlf_IsNull(sURL) ) return null;

 newChild = new ChildFrame;

 if( utlf_IsNull(nLeft) || nLeft < 0 )
  newChild.openalign.halign = "center";
 if( utlf_IsNull(nTop) || nTop < 0 )
  newChild.openalign.valign = "center";
 if( utlf_IsNull(nWidth) || nWidth < 0 ||
     utlf_IsNull(nHeight) || nHeight < 0 )
 {
  nWidth = 0;
  nHeight = 0;
  bAutoSize = true;
 }
 else
  bAutoSize = false;

 if( utlf_IsNull(sStyle) == false )
 {
  var i, arr, arr1;
  arr = sStyle.split(",");
  for( i = 0 ; i < arr.length ; i++ )
  {
   arr1 = arr[i].split("=");
   arr1[0] = utlf_RTrim(utlf_LTrim(arr1[0]));
   arr1[1] = utlf_RTrim(utlf_LTrim(arr1[1]));
   if( arr1[1].toLowerCase() == "true" )  flag = true;
   else          flag = false;

   if( arr1[0].toLowerCase() == "title" )   bTitle = flag;
   if( arr1[0].toLowerCase() == "status" )  bStatus = flag;
   if( arr1[0].toLowerCase() == "close" )   bClose = flag;
   if( arr1[0].toLowerCase() == "min" )   bMin = flag;
   if( arr1[0].toLowerCase() == "max" )   bMax = flag;
   if( arr1[0].toLowerCase() == "layer" )   bLayer = flag;
  }
 }

 if( utlf_IsNull(sProp) == false )
 {
  var i;
  aProp = sProp.split(",");
  for( i = 0 ; i < aProp.length ; i++ )
  {
   aProp[i] = aProp[i].split("=");
   aProp[i][0] = utlf_RTrim(utlf_LTrim(aProp[i][0]));
   aProp[i][1] = utlf_RTrim(utlf_LTrim(aProp[i][1]));
  }
 }

 newChild.formurl = sURL;

 ////// sStyle내용 적용( 이부분은 init()호출전에 사용해야 함 )
 newChild.showtitlebar  = bTitle;
 newChild.showstatusbar  = bStatus;
 newChild.autosize   = bAutoSize;
 newChild.layered   = bLayer;//layer속성(2010.10.30)

 newChild.init(sID, nLeft, nTop, nLeft + nWidth, nTop + nHeight);

 ////// sStyle내용 적용( 이부분은 init()호출후에 사용해야 함 )
 newChild.titlebar.minbutton.enable   = bMin;
 newChild.titlebar.maxbutton.enable   = bMax;
 newChild.titlebar.closebutton.enable  = bClose;

 if (bLayer) {
  newChild.style.background   = "URL('theme://images/topmenu_openBg.png') stretch 15,15";
  newChild.style.align    = "left top";
  newChild.style.bordertype.type  = "round 4 4 4 4";
  newChild.style.border    = "0 none";
  newChild.dragmovetype    = "none";
  newChild.resizable     = false;
 } else {
  newChild.style.border    = "1 solid #777777" ;
  newChild.resizable     = false;
  newChild.scrollbars    = "none";
 }
 //newChild.style.margin = "0 5 5 0"; // <-----------------셰도우 처리를 위한 margin 설정 필요
 //newChild.style.shadow = "outer 4,4 5 #00000070" ;
 //newChild.layered   = true; //--> 무조건 투명하게 ...

 MyFrame.addChild(sID, newChild); // 이거 꼭 해야 함
 ////// sProp내용 적용
 for( i = 0 ; i < aProp.length ; i++ )
 {
  SetProp( "this.getOwnerFrame()."+sID, aProp[i][0], aProp[i][1] );
 }
 MyFrame.removeChild(sID);   // 이거 꼭 해야 함

 return newChild;
}

/**
* 조건에 따른 Value 처리
* @param : 함수의 Arguments에서 확인
* @return : value
* @example : decode(strVal, "test", true, false);
*/
function decode()
{
 var varRtnValue = null;

 var arrArgument = decode.arguments;
 var varValue = arrArgument[0];
 var bIsDefault = false;
 var nCount = 0;

 if((arrArgument.length % 2) == 0) {
  nCount = arrArgument.length - 1;
  bIsDefault = true;
 } else {
  nCount = arrArgument.length;
  bIsDefault = false;
 }

 for(var i = 1; i < nCount; i+=2) {
  if(varValue == arrArgument[i]) {
   varRtnValue = arrArgument[i+1];
   i = nCount;
  }
 }

 if(varRtnValue == null && bIsDefault) {
  varRtnValue = arrArgument[arrArgument.length-1];
 }

 return varRtnValue;
}

/**
* 조건에 따른 Value 처리
* @param : 함수의 Arguments에서 확인
* @return : value
* @example : iif(strVal=="test", true, false);
*/
function iif()
{
 var varRtnValue = null;
 var arrArgument = iif.arguments;

 if(arrArgument[0]) {
  return arrArgument[1];
 } else {
  return arrArgument[2];
 }
}

/**
* Null에 해당하는 값 체크.
* @param : sValue - Null 확인 밗
* @return : true/false
* @example : utlf_IsNull(sValue);
*/
function utlf_IsNull(sValue)
{
 if( new String(sValue).valueOf() == "undefined")
  return true;
 if( sValue == null )
  return true;
 if( ("x"+sValue == "xNaN") && ( new String(sValue.length).valueOf() == "undefined" ) )
  return true;
 if( sValue.length == 0 )
  return true;
 return false;
}

/**
* 문자열에서 주어진 부분 문자열의 위치를 검색
* @param : sOrg   - 검색대상 문자열
* @param : sFind   - 검색할 문자열
* @param : nStart  - 검색 시작 위치
* @return : Integer(문자열의 위치)
* @example : utlf_Pos(strText, "Find", [0]);  []는 Optional을 표현.
*/
function utlf_Pos(sOrg, sFind, nStart)
{
 if( utlf_IsNull(sOrg) || utlf_IsNull(sFind) )  return -1;
 if( utlf_IsNull(nStart) )  nStart = 0;

 return sOrg.indexOf(sFind, nStart);
}

/**
* 문자열에서 주어진 부분 문자열의 위치를 검색
* @param : sOrg  - 가운데 부문을 얻어올 원본 문자열
* @param : sStart - 얻어올 문자열의 첫 Index
* @param : sEnd  - 얻어올 문자열의 마지막 Idnex
* @param : nStart - 검색 시작 위치
* @return : string
* @example : utlf_Mid(strText, 2, 4, [nStart]);
*/
function utlf_Mid(sOrg, sStart, sEnd, nStart)
{
 var pos_start, pos_end, ret_str;

 if( utlf_IsNull(sOrg) )  return "";
 if( utlf_IsNull(sStart) ) sStart = "";
 if( utlf_IsNull(sEnd) )  sEnd = "";
 if( utlf_IsNull(nStart) ) nStart = 0;

 if( sStart == "" )
  pos_start = nStart;
 else
 {
  pos_start = utlf_Pos(sOrg, sStart, nStart);
  if( pos_start < 0 ) return "";
 }
 if( sEnd == "" )
  pos_end = sOrg.length;
 else
 {
  pos_end = utlf_Pos(sOrg, sEnd, pos_start+sStart.length, nStart);
  if( pos_end < 0 ) return "";
 }

 return sOrg.substring(pos_start+sStart.length, pos_end);
}

/**
* 문자열의 일부분을 다른 문자열로 치환
* @param : sOrg  - 가운데 부문을 얻어올 원본 문자열
* @param : sRepFrom - 치환대상 문자열
* @param : sRepTo  - 치환될 문자열
* @return : string
* @example : utlf_Replace( sOrg, " ", "" );
*/
function utlf_Replace( sOrg, sRepFrom, sRepTo )
{
 var pos, nStart=0, sRet="";

 sOrg = utlf_Str(sOrg);

 if( utlf_IsNull(sOrg) )   return "";
 if( utlf_IsNull(sRepFrom) )  return sOrg;
 //if( utlf_IsNull(sRepTo) )  return sOrg;

 while(1)
 {
  pos = utlf_Pos( sOrg, sRepFrom, nStart );
  if( pos < 0 )
  {
   sRet += sOrg.substr( nStart );
   break;
  }
  else
  {
   sRet += sOrg.substr( nStart, pos - nStart);
   sRet += sRepTo;
   nStart = pos+sRepFrom.length;
  }
 }
 return sRet;
}

/**
* 문자열의 좌측 공백을 제거
* @param : sOrg   - 좌측 공백문자 제거 대상 문자열
* @param : [sTrim]  - 제거대상 문자열(default:" ")
* @return : string
* @example : utlf_LTrim( sOrg, " ");
*/
function utlf_LTrim(sOrg, sTrim)
{
 var chk, pos;

 sOrg = utlf_Str(sOrg);

 if( utlf_IsNull(sOrg) )  return "";
 if( utlf_IsNull(sTrim) )  sTrim = " ";

 for( pos = 0 ; pos < sOrg.length ; pos+=sTrim.length )
 {
  if( sOrg.substr( pos, sTrim.length ) != sTrim )
   break;
 }

 return sOrg.substr(pos);
}

/**
* 문자열의 우측 공백을 제거
* @param : sOrg   - 우측 공백문자 제거 대상 문자열
* @param : [sTrim]  - 치환대상 문자열
* @return : string
* @example : utlf_RTrim( sOrg, " ");
*/
function utlf_RTrim(sOrg, sTrim)
{
 var pos, nStart;

 sOrg = utlf_Str(sOrg);

 if( utlf_IsNull(sOrg) )  return "";
 if( utlf_IsNull(sTrim) )  sTrim = " ";

 for( pos = sOrg.length-sTrim.length ; pos >= 0 ; pos -= sTrim.length )
 {
  if( sOrg.substr( pos, sTrim.length ) != sTrim )
   break;
 }

 return sOrg.substr(0, pos+sTrim.length);
}

/**
* 문자열의 좌우측 공백을 제거
* @param : sOrg   - 좌측 공백문자 제거 대상 문자열
* @param : [sTrim]  - 제거대상 문자열(default:" ")
* @return : string
* @example : utlf_Trim( sOrg, " ");
*/
function utlf_Trim(sOrg, sTrim) {
 var rtnVal = "";
 if (utlf_IsNull(sTrim)) sTrim = " ";
 rtnVal = utlf_RTrim(sOrg, sTrim);
 rtnVal = utlf_LTrim(rtnVal, sTrim);

 return rtnVal;
}

/**
* 문자열이 지정된 길이가 되도록 왼쪽을 채우는 함수
* @param : sOrg  - 원본 문자열
* @param : sPad  - 왼쪽에 채울 문자
* @param : nCnt  - 출력될 문자열의 길이
* @return : string
* @example : utlf_LPad("2", "0", 2);
*/
function utlf_LPad(sOrg, sPad, nCnt)
{
 var i, sRet="";

 if( utlf_IsNull(sOrg) )  return "";
 if( utlf_IsNull(sPad) )  sPad = " ";
 if( utlf_IsNull(nCnt) )  nCnt = 1;

 for( i = 0 ; i < nCnt ; i++ )
  sRet += sPad;
 sRet += sOrg;

 return sRet;
}

/**
* 문자열이 지정된 길이가 되도록 오른쪽을 채우는 함수
* @param : sOrg  - 원본 문자열
* @param : sPad  - 오늘쪽에 채울 문자
* @param : nCnt  - 출력될 문자열의 길이
* @return : string
* @example : utlf_RPad("2", "0", 2);
*/
function utlf_RPad(sOrg, sPad, nCnt)
{
 var i, sRet="";

 if( utlf_IsNull(sOrg) )  return "";
 if( utlf_IsNull(sPad) )  sPad = " ";
 if( utlf_IsNull(nCnt) )  nCnt = 1;

 sRet += sOrg;
 for( i = 0 ; i < nCnt ; i++ )
  sRet += sPad;

 return sRet;
}

/**
* 문자열의 오른쪼 부분을 지정한 길이만큼 가져오는 함수
* @param : sOrg  - 원본 문자열
* @param : nSize  - 얻어올 크기
* @return : string
* @example : utlf_Right(sOrg, 2);
*/
function utlf_Right(sOrg, nSize)
{
 if( utlf_IsNull(sOrg) || utlf_IsNull(nSize) )  return "";

 if( sOrg.length < nSize )
  return sOrg;
 else
  return sOrg.substr(sOrg.length-nSize, nSize);
}

/**
* 문자열의 문자 개수 가져옴
* @param : sOrg  - 원본 문자열
* @param : sCnt  - Count 대상 문자
* @return : Integer
* @example : utlf_Count(sOrg, 2);
*/
function utlf_Count(sOrg, sCnt)
{
 var i, sRet="";
 var nCnt = 0;

 if( utlf_IsNull(sOrg) || utlf_IsNull(sCnt) )  return -1;

 for( i = 0 ; i < sOrg.length ; i += sCnt.length )
 {
  if( sOrg.substr(i, sCnt.length) == sCnt )
   nCnt++;
 }

 return nCnt;
}

/**
* 문자열의 전체 길이 계산(한글,한자:2 / 나머지 1)
* @param : sVal  - 입력받은 문자열
* @return : Integer
* @example : utlf_LenB(sVal);
*/
function utlf_LenB(sVal)
{
 var len = 0;

 if( utlf_IsNull(sVal) )  return -1;

    for (i=0; i<sVal.length; i++)
    {
   if (sVal.charCodeAt(i) > 127)
    len += 3;
   else
    len += 1;
    }
 return len;
}

/**
* 숫자형식 여부 확인
* @param : sNum  - 숫자형식 확인 대상 문자열
* @return : true/false
* @example : utlf_IsNum(sNum);
*/
function utlf_IsNum(sNum)
{
 var c;
 var point_cnt=0;
 var ret=true;

 if( utlf_IsNull(sNum) )  return false;

 for( i = 0 ; i < sNum.length ; i++ )
 {
  c = sNum.charAt(i);
  if( i == 0 && ( c == "+" || c == "-" ) );
  else if( c >= "0" && c <= "9" );
  else if( c == "." )
  {
   point_cnt++;
   if( point_cnt > 1 )
   {
    ret = false;
    break;
   }
  }
  else
  {
   ret = false;
   break;
  }
 }

 return ret;
}

/**
* 숫자에 천단위 "," 적용
* @param : sNum  - 숫자형식 확인 대상 문자열
* @return : string
* @example : utlf_SetComma(sNum);
*/
function utlf_SetComma(sNum)
{
 var ppos, sDigit, nEnd, nStart=0, sRet="";

 if( utlf_IsNull(sNum) ) return "";

 if( sNum.charAt(0) == "+" || sNum.charAt(0) == "-" )
 {
  sRet += sNum.charAt(0);
  nStart = 1;
 }

 ppos = utlf_Pos(sNum, ".", nStart);
 if( ppos < 0 )
  nEnd = sNum.length;
 else
  nEnd = ppos;
 sDigit = sNum.substr(nStart, nEnd-nStart);
 for( pos = 0 ; pos < sDigit.length ; pos ++ )
 {
  if( pos != 0 && (sDigit.length-pos)%3 == 0 )
   sRet += ",";
  sRet += sDigit.charAt(pos);
 }
 sRet += sNum.substr(nEnd);

 return sRet;
}

/**
* 해당월의 마지막 날짜
* @param : sDate  - yyyyMMdd 형태의 날짜
* @return : integer
* @example : utlf_LastDateNum("20100501");
*/
function utlf_LastDateNum(sDate)
{
 var nMonth, nLastDate;

 if( utlf_IsNull(sDate) )  return -1;

 nMonth = parseInt(sDate.substr(4,2), 10);
 if( nMonth == 1 || nMonth == 3 || nMonth == 5 || nMonth == 7  || nMonth == 8 || nMonth == 10 || nMonth == 12 )
  nLastDate = 31;
 else if( nMonth == 2 )
 {
  if( utlf_IsLeapYear(sDate) == true )
   nLastDate = 29;
  else
   nLastDate = 28;
 }
 else
  nLastDate = 30;

 return nLastDate;
}

/**
* 윤년여부 확인
* @param : sDate  - yyyyMMdd형태의 날짜
* @return : true/false
* @example : utlf_IsLeapYear("20100501");
*/
function utlf_IsLeapYear(sDate)
{
 var ret;
 var nY;

 if( utlf_IsNull(sDate) )  return false;

 nY = parseInt(sDate.substring(0,4), 10);

 if ((nY % 4) == 0)
 {
  if ((nY % 100) != 0 || (nY % 400) == 0)
   ret = true;
  else
  ret = false;
 }
 else
  ret = false;

 return ret;
}

/**
* 해당월의 마지막 날짜를 yyyyMMdd 형태로 출력
* @param : sDate  - yyyyMMdd형태의 날짜
* @return : string(date:yyyyMMdd)
* @example : utlf_LastDateNum("20100501");
*/
function utlf_LastDate(sDate)
{
 if( utlf_IsNull(sDate) )  return "";

 var nLastDate = utlf_LastDateNum(sDate);

 return sDate.substr(0,6) + nLastDate.toString();
}

/**
* 날짜 형시 여부 체크
* @param : sDate  - yyyyMMdd형태의 날짜
* @return : true/false
* @example : utlf_LastDateNum("20100501");
*/
function utlf_IsDate(sDate)
{
 if( utlf_IsNull(sDate) )  return false;

 if( sDate.length != 8 )
  return false;

 if( utlf_IsNum(sDate) != true )
  return false;

 var nMonth  = parseInt(sDate.substring(4,6), 10);
 var nDate  = parseInt(sDate.substring(6,8), 10);

 if( nMonth < 1 || nMonth > 12 )
  return false;

 if( nDate < 1 || nDate > utlf_LastDateNum(sDate) )
  return false;

 return true;
}

/**
* 입력된 날짜에 지정된 인수 만큼의 날짜를 증감
* @param : sDate   - yyyyMMdd형태의 날짜
*      nOffset  - 일 증감
* @return : string(date)
* @example : utlf_AddDate("20100501", 5);
*/
function utlf_AddDate(sDate, nOffset)
{
 if( utlf_IsNull(sDate) || utlf_IsNull(nOffset) ) return "";

    var nYear = parseInt(sDate.substr(0, 4));
    var nMonth = parseInt(sDate.substr(4, 2));
    var nDate = parseInt(sDate.substr(6, 2)) + nOffset;

    return utlf_MakeDate(nYear, nMonth, nDate);
}

/**
* 입력된 날짜에 지정된 인수 만큼의 월 증감
* @param : sDate   - yyyyMMdd형태의 날짜
* @param : nOffset  - 월 증감
* @return : string(date)
* @example : utlf_AddMonth("20100501", 5);
*/
function utlf_AddMonth(sDate, nOffset)
{
 if( utlf_IsNull(sDate) || utlf_IsNull(nOffset) )  return "";

 var nYear = parseInt(sDate.substr(0, 4));
 var nMonth = parseInt(sDate.substr(4, 2))+nOffset;
 var nDate = parseInt(sDate.substr(6, 2));
 var nLastDate, sRet;

 sRet = utlf_MakeDate(nYear, nMonth, 1);
 nLastDate = utlf_LastDateNum(sRet);
 sRet = sRet.substr(0,6);

 if( nDate > nLastDate )
  sRet += utlf_Right("00" + nLastDate.toString(), 2);
 else
  sRet += utlf_Right("00" + nDate.toString(), 2);

 return sRet;
}

/**
* yyyyMMdd 형태의 문자열 날짜 출력
* @param : nYear  - Year : 년도
* @param : nYear  - Month : 월
* @param : nYear  - Date : 일
* @return : string(date)
* @example : utlf_MakeDate("2010", "05", "01");
*/
function utlf_MakeDate(nYear, nMonth, nDate)
{
 if( utlf_IsNull(nYear) || utlf_IsNull(nMonth) || utlf_IsNull(nDate) ) return "";

 var objDate = new Date(nYear, nMonth-1, nDate);

 var sYear   = objDate.getFullYear().toString();
 var sMonth  = utlf_Right("0" + (objDate.getMonth() + 1), 2);
 var sDate   = utlf_Right("0" + objDate.getDate(), 2);

 return sYear + sMonth + sDate;
}

/**
* 현재 날짜 출력(Local)
* @param : N/A
* @return : string(date)
* @example : utlf_Today();
*/
function utlf_Today()
{
 var sToday = "";
 var objDate = new Date();
 var sToday  = objDate.getFullYear().toString();
 sToday += utlf_Right("0" + (objDate.getMonth() + 1), 2);
 sToday += utlf_Right("0" + objDate.getDate(), 2);

 return sToday;
}

/**
* 현재 날짜 + 시간 출력(Local)
* @param : N/A
* @return : string(date:yyyyMMddhhmiss)
* @example : utlf_TodayTime("2010", "05", "01");
*/
function utlf_TodayTime(bMode)
{
 var strToday = "";
 var objDate = new Date();
 var sToday  = objDate.getFullYear().toString();
 sToday += utlf_Right("0" + (objDate.getMonth() + 1), 2);
 sToday += utlf_Right("0" + objDate.getDate(), 2);
 sToday += utlf_Right("0" + objDate.getHours(), 2);
 sToday += utlf_Right("0" + objDate.getMinutes(), 2);
 sToday += utlf_Right("0" + objDate.getSeconds(), 2);
 if (bMode == "S") {
  strToday += objDate.getMilliseconds();
 }
 return sToday;
}

/**
* 두 일자간의 날짜 계산
* @param : sStartDate - yyyyMMdd 형태의 From 일자
*      sEndDate  - yyyyMMdd 형태의 To 일자
* @return : integer
* @example : utlf_TodayTime("20091002", "2010051");
*/
function utlf_DiffDate(sStartDate, sEndDate)
{
 if( utlf_IsNull(sStartDate) || utlf_IsNull(sEndDate) ) return NaN;

 var vFromDate = new Date(parseInt(sEndDate.substring(0,4), 10), parseInt(sEndDate.substring(4,6)-1,  10), parseInt(sEndDate.substring(6,8), 10));
 var vToDate = new Date(parseInt(sStartDate.substring(0,4), 10), parseInt(sStartDate.substring(4,6)-1,  10), parseInt(sStartDate.substring(6,8), 10));

 return parseInt((vFromDate - vToDate)/(1000*60*60*24));
}

/**
* 두 월간의 월 계산
* @param : sStartDate - yyyyMMdd 형태의 From 일자
* @param : sEndDate  - yyyyMMdd 형태의 To 일자
* @return : integer
* @example : utlf_DiffMonth("20091002", "2010051");
*/
function utlf_DiffMonth(sStartDate, sEndDate)
{
 var nStartMon, nEndMon;

 if( utlf_IsNull(sStartDate) || utlf_IsNull(sEndDate) ) return NaN;

 nStartMon = parseInt(sStartDate.substr(0,4), 10)*12 + parseInt(sStartDate.substr(4,2), 10);
 nEndMon = parseInt(sEndDate.substr(0,4), 10)*12 + parseInt(sEndDate.substr(4,2), 10);

 return (nEndMon - nStartMon);
}

/**
* 주민번호 확인
* @param : sValue  - 입력된 주민등록번호
* @return : true/false
* @example : utlf_IsRsrNo(sValue);
*/
function utlf_IsRsrNo(sValue)
{
 if( utlf_IsNull(sValue) ) return false;

 var v_JuminNo = utlf_Replace(sValue, "-", "");
 var v_JuminChkDgt = [2,3,4,5,6,7,8,9,2,3,4,5];
 var v_FNum = new Number();
 var v_LNum = new Number();
 var v_iSum = new Number();
 var v_RtnVal;
 var v_YY;

 if(v_JuminNo.length != 13)
  return false;

 v_FNum = v_JuminNo.substr(0, 6).toString();
 v_LNum = v_JuminNo.substr(6).toString();

 if (v_LNum.substr(0,1) == '1' ||  v_LNum.substr(0,1) == '2')
   v_YY  = '19';
 else if (v_LNum.substr(0,1) == '3' ||  v_LNum.substr(0,1) == '4')
   v_YY  = '20';
 else
 return false;

 if(utlf_IsDate(v_YY + v_FNum) == false)
 return false;

 if (utlf_IsNum(v_JuminNo) == false)
 return false;

 for ( ix = 0; ix < 12 ; ix++)
  v_iSum += (parseInt(v_JuminNo.substr(ix, 1)) * v_JuminChkDgt[ix]);

 v_iSum = 11 - (v_iSum%11);
 v_iSum = v_iSum % 10;
 if (v_iSum != (parseInt(v_JuminNo.substr(12, 1))))
  return false;

 return true;
}

/**
* 외국인번호 확인
* @param : sValue  - 입력된 외국인등록번호
* @return : true/false
* @example : utlf_IsForeignNo(sValue);
*/
function utlf_IsForeignNo(sValue)
{
 var sum = 0;
    var odd = 0;

    buf = Array(13);
    for (i = 0; i < 13; i++) buf[i] = parseInt(sValue.charAt(i));

    odd = buf[7]*10 + buf[8];

    if (odd%2 != 0) {
      return false;
    }

    if ((buf[11] != 6)&&(buf[11] != 7)&&(buf[11] != 8)&&(buf[11] != 9)) {
      return false;
    }

    multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
    for (i = 0, sum = 0; i < 12; i++) {
     buf[i] = buf[i] * multipliers[i];
     sum = sum + buf[i];
    }


    sum=11-(sum%11);

    if (sum>=10) sum-=10;

    sum += 2;

    if (sum>=10) sum-=10;

    if ( sum != buf[12]) {
        return false;
    }
    else {
        return true;
    }
}

/**
* Grid Data를 Excel Export 처리
* @param : obj:Grid       - Object(Grid)
* @param : ExpObj:ExportObject - Object(Export Object)
* @param : sSheetName      - Sheet 명(default:"Sheet1")
* @return : Child Frame Object
* @example : utlf_GridExportExcel(objGrd, expObj, sSheet);
*/
function utlf_GridExportExcel(obj:Grid, ExpObj:ExportObject, sSheetName)
{
 if( utlf_IsNull(obj) ) return false;

 if( utlf_IsNull(ExpObj) == true )
  var ExpObj = new ExportObject;
 if( utlf_IsNull(sSheetName) == true )
  sSheetName = "Sheet1";

 ExpObj.exportfilename = Grid.name+".xls";  // 꼭 줘야됨
 ExpObj.exporttype     = ExportTypes.EXCEL; // 현재 Excel만 가능합니다.
 ExpObj.activepagename = sSheetName;

 ExpObj.addExportItem(ExportItemTypes.GRID, obj, sSheetName+"!A1");
 ExpObj.export(); // Excel로 Export실행

 return true;
}

/**
* Control에 들어가는 Text에 대해 Control의 width를 구하는 처리
* @param : obj    - text가 표시되는 해당 컴포넌트
* @param  sText   - 표시될 text
* @param  nFontSize - 폰트 크기
* @return : Control의 width
* @example : var objControl.position.width = utlf_getTextSize(objControl, sText, 9);
*/
function utlf_getTextSize(obj, sText, nFontSize)
{
 var objPainter = obj.canvas.getPainter();
 var objFont = new Font;
 objFont.size = nFontSize;
 var objSize = objPainter.getTextSize(sText, objFont);
 return objSize.cx;
}

/**
* 선택된 Grid Column에 대한 Sort 처리
* @param : grdObj     - Sorting 처리 Grid Object
* @param nCell     - Sort 적용 Column
* @param [resetCol]  - Sort 해제 시 기준 Column 정보
* @param [strAscMark] - Asc Mark(표현문자:Default-▲)
* @param [strDescMark] - Desc Mark(표현문자:Default-▼)
* @return : N/A
* @example : utlf_procGrdSort(grdObj, nCell, "col1,col2", "↑", "↓");
*/
function utlf_procGrdSort(grdObj, nCell, resetCol, strAscMark, strDescMark) {

 var curObj = grdObj.id;

 if (! utlf_IsNull(strAscMark)) utlv_AscMark  =" " + strAscMark;   // Asc Mark
 if (! utlf_IsNull(strDescMark)) utlv_DescMark = " " + strDescMark; // Desc Mark

 // 단일 Column Sort 처리 시
 _utlf_GridDataSort(grdObj, nCell, resetCol);

}

/**
* Column Sort 처리
* @param : grdObj    - Sorting 처리 Grid Object
* @param nCell    - Sort 적용 Column
* @param [resetCol] - Sort 해제 시 기준 Column 정보
* @return : N/A
* @example : _utlf_GridDataSort(grdObj, nCell, resetCol);
*/
function _utlf_GridDataSort(grdObj, nCell, resetCol) {
 // Grid Bind Dataset 추출
 var dsObj = new Object();
 dsObj = objects(grdObj.binddataset);

 var strHeadText;    // Head Text + SortMark
 var sortCol;        // 선택된 Head의 Column Index
 var sortSpan;        // 선택된 Head의 ColSpan 정보
 var splitCol;      // Grid body Column의 text의 colid 추출 : ex)bind:Col1 - split처리(":")
 var sortColumns = "";   // Grid Sort 대상 Column
 var rowDepth;

 var headCnt = grdObj.getCellCount("head");    // Grid Head Cell Count
 var bodyCnt = grdObj.getCellCount("body");    // Grid Body Cell Count

 var sortRow = grdObj.getCellProperty("head",nCell,"row");

 for (var iHead=0; iHead<headCnt; iHead++) {
  rowDepth = grdObj.getCellProperty("head", iHead, "row");
  if ( (nCell == iHead) && (sortRow == rowDepth) ) break;
 }

 sortCol = grdObj.getCellProperty("head", iHead, "col");

 var bodyRow = _utlf_grdBodyDepth(grdObj);

 for (var iBody=0; iBody<bodyCnt; iBody++) {
  if (bodyRow > 0) {
   if ( (sortCol == grdObj.getCellProperty("body", iBody, "col")) &&
     (sortRow == grdObj.getCellProperty("body", iBody, "row")) ) break;
  } else {
   if (sortCol == grdObj.getCellProperty("body", iBody, "col")) break;
  }
 }

 //checkbox 일경우 제외
   if (grdObj.getCellProperty("head",nCell,"displaytype") == "checkbox" ||
     grdObj.getCellProperty("head",nCell,"edittype") == "checkbox") return;

  //expr일 경우 sort제외
  splitCol = grdObj.getCellProperty("body", iBody, "text").split(":");
   if (splitCol[0] == "expr") return;
   splitCol ="";

 // Grid Head의 해당 Column이 Asc(▲) 인 경우
 if (grdObj.getCellProperty("head", nCell, "text").indexOf(utlv_AscMark) > -1) {
  if (grdObj.getCellProperty("head", nCell, "colspan") > 1) {
   sortSpan = grdObj.getCellProperty("head", iHead, "colspan");

   for (var ii=0; ii<bodyCnt; ii++) {
    if ( (grdObj.getCellProperty("body", ii, "col") >= sortCol) &&
     grdObj.getCellProperty("body", ii, "col") < (Math.abs(sortCol) + Math.abs(sortSpan) ) ) {

     if (grdObj.getCellProperty("body", ii, "text").length > 0) {
      splitCol = grdObj.getCellProperty("body", ii, "text").split(":");
      sortColumns += "-" + splitCol[1];
     }
    }
   }
  } else {
   splitCol = grdObj.getCellProperty("body", iBody, "text").split(":");
   sortColumns += "-" + splitCol[1];
  }

  strHeadText = grdObj.getCellProperty("head",nCell,"text");
  strHeadText = strHeadText.replace(utlv_AscMark, utlv_DescMark);

 // Grid Head의 해당 Column이 Desc(▼) 인 경우
 } else if (grdObj.getCellProperty("head", nCell, "text").indexOf(utlv_DescMark) > -1) {
  var sortIdx = 0;

  // Sort Mark 제거 시 해당 Grid의 Column Index에 대해서 Sort 처리(Max 3 Column)
  if (resetCol == null || resetCol == "") {
   for (var ii=0; ii<bodyCnt; ii++) {
    if (grdObj.getCellProperty("body", ii, "text").length > 1) {
     splitCol = grdObj.getCellProperty("body", ii, "text").split(":");
     if(splitCol[0] != "expr"){
        sortColumns += "+" + splitCol[1];
        sortIdx++;
     }

    }
    if (sortIdx == 3) break;
   }

  // Reset Column이 정의된 경우
  } else {
   sortColumns = _utlf_defaultSortCols(resetCol); // Sort Column이 정의된 경우(매개변수)
  }

  strHeadText = grdObj.getCellProperty("head", nCell, "text");
  strHeadText = strHeadText.replace(utlv_DescMark, "");

 // 초기값인 경우(Sort 미 적용) 시
 } else {
  if (grdObj.getCellProperty("head",nCell,"colspan") > 1) {
   sortSpan = grdObj.getCellProperty("head", iHead, "colspan");

   for (var ii=0; ii<bodyCnt; ii++) {
    if ( (grdObj.getCellProperty("body", ii, "col") >= sortCol) &&
     grdObj.getCellProperty("body", ii, "col") < (Math.abs(sortCol) + Math.abs(sortSpan) ) ){

     if (grdObj.getCellProperty("body", ii, "text").length > 0) {
      splitCol = grdObj.getCellProperty("body", ii, "text").split(":");
      sortColumns += "+" + splitCol[1];
     }
    }
   }

  } else {
   splitCol = grdObj.getCellProperty("body", iBody, "text").split(":");
   sortColumns += "+" + splitCol[1];
  }

  strHeadText = grdObj.getCellProperty("head", nCell, "text");
  strHeadText = strHeadText + utlv_AscMark;
 }

 // 해당 Column에 대한 Sort 처리
 if (sortColumns == "reset") dsObj.reset();
 else dsObj.keystring = "S:" + sortColumns;

 // Grid의 Row Position 설정(Sort 처리 시 Row Position 변경)
 dsObj.rowposition = 0;

 // 선택 Head의 Text 변경 (Sort Mark 적용)
 grdObj.setCellProperty("head", nCell, "text", strHeadText);

 // Selected Column을 제외한 Sort Mark 제거
 _utlf_clearSortMark(grdObj, nCell);
}

/**
* Seleted Column을 제외한 Sort Mark 제거
* @param : grdObj - Sorting 처리 Grid Object
* @param nCell - Sort 적용 Column
* @return : N/A
* @example : _utlf_clearSortMark(grdObj, nCell)
*/
function _utlf_clearSortMark(grdObj, nCell) {
 var nColCnt = grdObj.getCellCount("head");
 var sRepText;

 for(var ii=0; ii<nColCnt; ii++) {
  if (nCell != null && nCell == ii) continue; // 선택한 Cell을 제외하고 처리
  if (grdObj.getCellProperty("head",ii,"displaytype") == "checkbox" ||
         grdObj.getCellProperty("head",ii,"edittype") == "checkbox") continue;

  sRepText = grdObj.getCellProperty("head",ii,"text").replace(utlv_AscMark,"").replace(utlv_DescMark, "");
  grdObj.setCellProperty("head",ii,"text", sRepText);
 }

 //var dsObj = grdObj.binddataset;
 //eval(dsObj).keystring = "";
}

/**
* Sort Mark 제거 시 기본 Sort Column 정의(ResetColumn)
* @param : ResetColumn - Sorting 처리 Grid Object
* @return : Sort Column(String)
* @example : _utlf_defaultSortCols(resetCol)
*/
function _utlf_defaultSortCols(resetCol) {
 var rtnVal = "";
 var arrSortCol = resetCol.split(",");
 var sortLen = arrSortCol.length;

 for (i=0; i<sortLen; i++) {
  if (arrSortCol[i].length < 1) continue;
  rtnVal += "+" + arrSortCol[i];
 }

 return rtnVal;
}

/**
* Grid Head(band)의 Row Depth 계산
* @param : GridObject - Sorting 처리 Grid Object
* @return : Head(band) Row Depth(Number)
* @example : _utlf_grdBodyDepth(grdObj)
*/
function _utlf_grdBodyDepth(grdObj) {
 var rtnVal = 0;
 var rowDepth = 0;

 var bodyCnt = grdObj.getCellCount("body");    // Grid Body Cell Count

 for (var i=0; i<bodyCnt; i++) {
  rowDepth = grdObj.getCellProperty("body",i,"row");
  if (rowDepth > rtnVal) rtnVal = rowDepth;
 }

 return rtnVal;
}

/**
* Sort Mark 제거(초기화상태로 되돌리고자 할때)
* @param : grdObj - Sorting 처리 Grid Object
* @return : N/A
* @example : utlf_clearSort(grdObj)
*/
function utlf_clearSort(grdObj) {
 var nColCnt = grdObj.getCellCount("head");
 var sRepText;

 for(var ii=0; ii<nColCnt; ii++) {
  sRepText = grdObj.getCellProperty("head",ii,"text").replace(utlv_AscMark,"").replace(utlv_DescMark, "");
  grdObj.setCellProperty("head",ii,"text", sRepText);
 }

 var dsObj = grdObj.binddataset;
 eval(dsObj).keystring = "";
}

/**
* Grid의 내용을 Excel로 실행
* @param : objGrd - Excel Export 대상 Grid Object
* @return : N/A
* @example : utlf_XlstoExe(objGrd)
*/
function utlf_exeXls(objGrd, bMode) {
 if (bMode) {
  //utlf_ImgProc(true);
 }
 var objExport      = new ExportObject();
 objExport.onexport.setHandler(utlf_onexport);
 objExport.exporttype    = ExportTypes.EXCEL;
 objExport.activepagename   = "Sheet0";
 objExport.addExportItem(ExportItemTypes.GRID, objGrd, "Sheet0!A0" );
 objExport.exportuitype    = "exportprogress";
 objExport.exportmessageprocess  = "%d Recrod, %d Total";
 //objExport.exportvalue = "onlyvalue";
  var rtnVal = objExport.export();
 //objExport = null;
 //end image
 if (bMode) {
  //utlf_ImgProc(false)
 }

}

function utlf_onexport(obj:ExportObject,e:ExportEventInfo) {
 //trace(e.recordindex);
}


/**
* Grid의 내용을 Excel 파일로 저장
* @param : objGrd  - Excel Export 대상 Grid Object
* @param : strXlsNm  - 저장할 Excel 파일명
* @param : strSheetNm - 저장할 Excel sheet명
* @param : strRunYn  - 저장후 실행할지 여부
* @return : N/A
* @example : utlf_exportExcel(grd_export,"sample_xls.xls","메뉴");
*/
function utlf_exportExcel(objGrd, strXlsNm, strSheetNm, strRunYn) {
 var objExport     = new ExportObject();
 var fdlg = new FileDialog;

 if (utlf_IsNull(strXlsNm)) {
  strXlsNm = "";
 }
 if (utlf_IsNull(strSheetNm)) {
  strSheetNm = "sheet1!A0";
 } else {
  strSheetNm += "!A0";
 }
 if (utlf_IsNull(strRunYn)) {
  strRunYn = "noactive";
 } else {
  strRunYn = "active";
 }
 fdlg.filter = "Worksheet Files (*.xls;*.xlsx)|*.xls;*.xlsx";
 var vFile      = fdlg.open("FileSave", FileDialog.SAVE, "%MYDOCUMENT%", strXlsNm);
 if (utlf_IsNull(vFile)) return false;
 if (vFile == -1) return false;

 objExport.exporttype   = ExportTypes.EXCEL;
 objExport.exportfilename  = vFile.fullpath;
 objExport.exportactivemode  = strRunYn;
 objExport.exportsavemode  = "save";
 objExport.addExportItem(ExportItemTypes.GRID, objGrd, strSheetNm );
  var ExportCnt     = objExport.export();
 objExport      = null;
 return true;
}

/**
* Excel File을 Dataset Import
* @param : objGrd - Excel File의 표현할 Grid Object
* @return : N/A
* @example : utlf_importExcel(objGrd,intUseColInfo, intExp,intDecimal,intStartRow,numcheck,skipcol)
*/
function utlf_importExcel(objGrd,intUseColInfo, intExp,intDecimal,intStartRow,numcheck,skipcol) {
 if (utlf_IsNull(intUseColInfo)) intUseColInfo = 1;
 if (utlf_IsNull(intExp)) intExp = null;
 if (utlf_IsNull(intDecimal)) intDecimal = 0;
 if (utlf_IsNull(intStartRow)) intStartRow = 1;
 if (utlf_IsNull(numcheck)) numcheck = 0;
 if (utlf_IsNull(skipcol)) skipcol = null;


 var strDs = objGrd.binddataset;
 var fdlg  = new FileDialog;
 //trace("[ 폴더경로 ]" + system.convertRealPath("%MYDOCUMENT%"));
 var vFile    = fdlg.open("FileSave", FileDialog.LOAD);
 if (utlf_IsNull(vFile)) return false;
 if (vFile == -1) return false;
 //trace("path :: " + vFile.fullpath);
 var extComapi    = new ExtCommon();
 //excelImportByIndex(strExcelFilename, intSheetIndex, strTargetDatasetID, [intUseColInfo, intExp,intDecimal,intStartRow,numcheck,skiprow])
 var strExcelFilename  = vFile.fullpath;//system.convertRealPath("%MYDOCUMENT%")+"excel_import001.xls";
 var intSheetIndex   = 0;
 var strTargetDatasetID  = strDs;//"dsXls";
 //trace(strExcelFilename);
 utlf_ImgProc(true, "업로드처리중입니다. 잠시 기다려주세요!");
//  if (strExcelFilename.indexOf("csv")>0) {
//   trace("csv file일 경우");  
//   extComapi.csv2Ds(strExcelFilename,strTargetDatasetID,true,"Column0,Column1,Column2,Column3,Column4,Column5");
//  } else {
  extComapi.excelImportByIndex(strExcelFilename, intSheetIndex, strTargetDatasetID,intUseColInfo, intExp,intDecimal,intStartRow,numcheck,skipcol);// , 1, 1, 1, 2, 1, 2
/* }*/
 utlf_ImgProc(false);
 return true;
}

/**
* Dataset을 RD 출력 CSV로 전환
* @param : argDs - CSV 전환 Dataset Object
*      arg1 - Master, Detail간의 Key
* @return : String(RD용 CSV Format)
* @example : utlf_DstoCsv("dsMast,dsDtl1,dsDtl2", "EmployeeID:EmpID,OrderDate:ordDate");
*/
function utlf_DstoCsv(argDs, arg1) {
 var arrDs   = argDs.split(",");
 var arrArg1;

 if (utlf_IsNull(arg1)) {
  arrArg1 = "";
 } else {
  arrArg1  = arg1.split(",");
 }
 var strDsCont  = "";

 if (arrArg1.length > 1) {
  var nRowCnt = eval(arrDs[0]).getRowCount();
  var nColCnt = eval(arrDs[0]).getColCount();

  for (var j = 0;j<nRowCnt;j++) {
   for (var k = 0;k<nColCnt;k++) {
    strDsCont +=  eval(arrDs[0]).getColumn(j,k);
    strDsCont += "^";
   }
   strDsCont += "\r\n";

   for (var i=1;i<arrDs.length;i++) {
    var arrArg2  = arrArg1[i-1].split(":");
    var strFnm   = eval(arrDs[0]).getColumn(j,arrArg2[0]);
    var nSubRowCnt  = eval(arrDs[i]).getRowCount();
    var nSubColCnt  = eval(arrDs[i]).getColCount();

    for (var m=0;m<nSubRowCnt;m++) {
     //두번째 Detail Dataset 맨처음일 경우(EOR문자 삽입)
     if (i > 1 && m== 0) {
      strDsCont += "//EOR//";
      strDsCont += "\r\n";
     }
     if (strFnm == eval(arrDs[i]).getColumn(m,arrArg2[1])) {
      for (var n=0;n<nSubColCnt;n++) {
       strDsCont +=  eval(arrDs[i]).getColumn(m,n);
       strDsCont += "^";
       //행마다 개행문자 삽입
       if (n == (nSubColCnt-1)) {
        strDsCont += "\r\n";
       }//end if
      }//end for
     }//end if
    }//end for
   }//end for

   strDsCont += "//EOR//";
   strDsCont += "\r\n";
  }

 } else {
  for (var i=0;i<arrDs.length;i++) {
   var nRowCnt = eval(arrDs[i]).getRowCount();
   var nColCnt =  eval(arrDs[i]).getColCount();

   for (var j = 0;j<nRowCnt;j++) {
    for (var k = 0;k<nColCnt;k++) {
     strDsCont +=  eval(arrDs[i]).getColumn(j,k);
     strDsCont += "^";
    }
    strDsCont += "\r\n";
   }
   //데이타셋이 여러개일경우 구분자추가
   if (arrDs.length > 1) {
    strDsCont += "//EOR//";
    strDsCont += "\r\n";
   }
  }
 }
 //trace(strDsCont);
 return strDsCont;
}

/**
* Grid/Excel간 Copy & Paste
* @param : obj - Grid Object
* @param e  - Event Info
* @return : N/A
* @example : utlf_grdCopy_Paste(obj, e)
*/
function utlf_grdCopy_Paste(obj, e) {

 if(e.ctrlKey){
  if(e.keycode == 67){
   //Grid Binddataset
   var strGrdDsNm = obj.binddataset;
   var v_clip = "";
   var strSeperate = " ";
   for (var i=obj.selectstartrow;i<=obj.selectendrow;i++) {
    for (var j=obj.selectstartcol;j<=obj.selectendcol;j++) {
     if (j < obj.selectendcol) {
      v_clip += obj.getCellValue(i,j) + strSeperate;
     } else {
      v_clip += obj.getCellValue(i,j);
     }
    }
    if (i < obj.selectendrow) {
     v_clip += "\r\n";
    }
   }
   v_clip += "\r\n";
   system.clearClipboard();
   system.setClipboard("CF_TEXT",v_clip);
  }else if(e.keycode == 86){
   var bAddrow = true;
   if (!utlf_IsNull(utlf_grdCopy_Paste.arguments[2])) {
    bAddrow = utlf_grdCopy_Paste.arguments[2];
   }
   //Grid Binddataset
   var strGrdDsNm = obj.binddataset;
   //cell count
   var nGrdCellCnt = obj.getCellCount("body");
   //cell position
   var nGrdCellPos = obj.getCellPos();
   //row position
   var nRowPos = eval(strGrdDsNm).rowposition;
   //arrText2 index
   var k = 0;
   //Dataset rowcount
   var nDsRowCnt = eval(strGrdDsNm).getRowCount();


   var t_clip = system.getClipboard("CF_UNICODETEXT");
   var strText = new String(t_clip);
   var arrText = new Array();
   var arrText2 = new Array();
   arrText = strText.split("\r\n");
   if (nDsRowCnt < (arrText.length + nRowPos -1)) {
    if (bAddrow) {

    } else {
     return false;
    }
   }
   //복사한 Row만큼
   for (var i=0;i<arrText.length;i++) {
    if (utlf_IsNull(arrText[i])) {
     return;
    }
    arrText2 = arrText[i].split(" ");

    //기존 dataset갯수보다 많은 경우
    if ( nDsRowCnt <= nRowPos) {
     var nAddrow = eval(strGrdDsNm).addRow();
    }

    var nLoopCnt = (nGrdCellPos + arrText2.length);
    if (nLoopCnt > nGrdCellCnt) {
     nLoopCnt = nGrdCellCnt;
    }
    //Dataset setcolumn
    for (var j=nGrdCellPos;j<nLoopCnt;j++) {
     obj.setCellPos(j);
     obj.showEditor(true);
     obj.setEditText(arrText2[k]);
     k++;
     obj.showEditor(false);
    }
    nRowPos++;
    eval(strGrdDsNm).rowposition = nRowPos;
    k = 0;
   }
   return true;
  }
 }
}

/**
* Grid 체크박스를 이용한 전체선택/해제
* @param : obj - Grid Object
* @param e  - Event Info
* @return : N/A
* @example : utlf_SetGridCheckAll(obj, e)
*/
function utlf_setGridCheckAll(obj, e)
{
 var celltype = obj.getCellProperty("head",e.cell,"displaytype");
 var utlv_IsGridCheckAll = obj.getCellText(-1,e.cell);

 if (celltype.toUpperCase() != "CHECKBOX") {
  return;
 }
 var dsObj = eval(obj.binddataset);
 var v_Colid = obj.getCellProperty("body", e.cell, "text").replace("bind:", "");

 if (utlv_IsGridCheckAll == 1) {
  utlv_IsGridCheckAll = 0;
 } else {
  utlv_IsGridCheckAll = 1;
 }
 dsObj.enableevent = false;
 for (var i=0; i<dsObj.getRowCount(); i++) {
  dsObj.setColumn(i, v_Colid, utlv_IsGridCheckAll);
 }
 obj.setCellProperty( "Head", e.cell, "expr", utlv_IsGridCheckAll);
 dsObj.enableevent = true;
}

/**
* Grid에서 선택한 Row를 지정한 데이타셋으로 복사
* @param : obj - Grid Object
* @param dsObj  - 복사할 대상 데이타셋 object
* @return : N/A
* @example : utlf_gridMultiSelectCopyRow(grd_leftList, dsRightList, "name")
*/
function utlf_gridMultiSelectCopyRow(obj:Grid, dsObj, strColNm) {
 var nCrow     = 0;
 var nCnt     = 0;
 //Grid Binddataset
 var strGrdDsNm    = obj.binddataset;
 var arrSelectedstartRow = obj.selectstartrow;
 var arrselectendrow  = obj.selectendrow;

 nCnt = arrSelectedstartRow.length;

 if (nCnt > 1) {
  for (var i=0;i<nCnt;i++) {
   nCrow = parseInt(arrSelectedstartRow[i]);
   var strFindKey = eval(strGrdDsNm).getColumn(nCrow,strColNm);
   //데이타 중복이 아닌경우
   if (dsObj.findRow(strColNm, strFindKey) == -1) {
    //왼쪽 리스트에 선택한 값을 오른쪽 리스트로 이동
    var nRow = dsObj.addRow();
    dsObj.copyRow(nRow,eval(strGrdDsNm),nCrow);
   }
  }
 } else {
  if (arrSelectedstartRow < 0) return;
  for (var i=arrSelectedstartRow;i<=arrselectendrow;i++) {
   var strFindKey = eval(strGrdDsNm).getColumn(i,strColNm);
   //데이타 중복이 아닌경우
   if (dsObj.findRow(strColNm, strFindKey) == -1) {
    //왼쪽 리스트에 선택한 값을 오른쪽 리스트로 이동
    var nRow = dsObj.addRow();
    dsObj.copyRow(nRow,eval(strGrdDsNm),i);
   }
  }
 }
}
/**
* Grid에서 선택한 Row를 삭제
* @param : obj - Grid Object
* @return : N/A
* @example : utlf_gridMultiSelectDelRow(grd_rightList)
*/
function utlf_gridMultiSelectDelRow(obj:Grid) {
 var nCrow     = 0;
 var nCnt     = 0;
 //Grid Binddataset
 var strGrdDsNm    = obj.binddataset;
 var arrSelectedstartRow = obj.selectstartrow;
 var arrselectendrow  = obj.selectendrow;

 nCnt = arrSelectedstartRow.length;

 if (nCnt > 1) {

  var arr1 = new Array(nCnt);
  for (var i=0;i<arr1.length;i++) {
   arr1[i] = arrSelectedstartRow[i];
  }
  arr1.sort();
  arr1.reverse();

  for (var i=0;i<nCnt;i++) {
   nCrow = parseInt(arr1[i]);
   //오른쪽 리스트에 선택한 값을 리스트에서 삭제
   eval(strGrdDsNm).deleteRow(nCrow);
  }
 } else {
  for (var i=arrselectendrow;i>=arrSelectedstartRow;i--) {
   //arrSelectedstartRow 값이 변하는 관계로 return 처리
   if (arrSelectedstartRow < 0) return;
   //오른쪽 리스트에 선택한 값을 리스트에서 삭제
   eval(strGrdDsNm).deleteRow(i);
  }
 }
 obj.selecttype = "row";
 obj.selecttype = "multiarea";
 for(var i=0; i<eval(strGrdDsNm).getRowCount(); i++){
  eval(strGrdDsNm).selectRow(i, false);
 }
}
/**
* 도움말 팝업창 호출
* @param : obj - Button Object
* @param   e - ClickEventInfo
* @return : N/A
* @example : utlf_callHelp()
*/
function utlf_callHelp(obj:Button,  e:ClickEventInfo)
{
 var strUrl = "http://"+gv_ServerUrl+"/popup_help.jsp?"+"pgeid="+pv_fileNm+"&SESSIONKEY1="+SESSIONKEY1+"&SESSIONVAL1="+SESSIONVAL1+"&SESSIONKEY2="+SESSIONKEY2+"&SESSIONVAL2="+SESSIONVAL2+"&SSO_IDP_ID="+SSO_IDP_ID;
 //var strHeader = "Content-Type: application/x-www-form-urlencoded\r\n";
     //strHeader += "Cookie : SP_SESSIONID="+gv_ssoSessionValue+" _KWE_PTL_IDP_session="+"qwer1234sdfg"+"; domain=112.136.170.16; \n";
 //var objBuffer = new Buffer;
 //objBuffer.appendText("pgeid="+pv_fileNm+"&SP_SESSIONID="+gv_ssoSessionValue+"&_KWE_PTL_IDP_session="+"qwer1234sdfg");  //값을 넘겨줘야 하는 경우
 //objBuffer.appendText("pgeid="+pv_fileNm+"&SESSIONKEY1="+SESSIONKEY1+"&SESSIONVAL1="+SESSIONVAL1+"&SESSIONKEY2="+SESSIONKEY2+"&SESSIONVAL2="+SESSIONVAL2+"&SSO_IDP_ID="+SSO_IDP_ID);
 //trace(pv_fileNm+"help popup:"+strUrl);
 //atx_cookie.Navigate2("about:blank","wikiViewerPopup");
 div_atx.atx_cookie.Navigate("about:blank");
 div_atx.atx_cookie.Navigate("javascript:window.open('"+strUrl+"','wikiViewerPopup','width=815,height=750,toolbar=no, directories=no, status=no, menubar=no')");
 //atx_cookie.Navigate2(strUrl,null,"_New",objBuffer.data,strHeader);
 //var rtn_val = utlf_Dialog("Popup_Help", "COMM::comp_helpFrm.xfdl", "");
    //alert(st_title.text + " 의 도움말 ");
}

/**
* QNA 팝업창 호출
* @param : obj - Button Object
* @param   e - ClickEventInfo
* @return : N/A
* @example : utlf_callQna()
*/
function utlf_callQna(obj:Button,  e:ClickEventInfo)
{
 //var rtn_val = utlf_Dialog("Popup_Qna", "COMM::comp_qna.xfdl", "");
 var strUrl = "http://"+gv_ServerUrl+"/popup_qna.jsp?pageUrl=http://112.136.170.16:5012/sqc_qur_qn00_006.do";
//  var strHeader = "Content-Type: application/x-www-form-urlencoded\r\n";
//  var objBuffer = new Buffer;
//  objBuffer.appendText("pageUrl=http://112.136.170.16:5012/sqc_qur_qn00_006.do");
 div_atx.atx_cookie.Navigate("about:blank");
 div_atx.atx_cookie.Navigate("javascript:window.open('"+strUrl+"','qnaPopup','width=1000,height=680,resizable=no,status=0,menubar=0,toolbar=no,location=no,scrollbars=yes')");

}

/**
* 절차서 팝업창 호출
* @param : obj - Button Object
* @param   e - ClickEventInfo
* @return : N/A
* @example : utlf_callPal()
*/
function utlf_callPal(obj:Button, e:ClickEventInfo) {
 var strSccd = gds_userinfo.getColumn(0,"conctAtptScCode");//PAGE_ID=pv_fileNm&SD_CODE=strSccd
 
 var strUrl = "http://112.136.170.16:5102/popup_pmm.jsp";
 //width=1000,height=680,resizable=no,status=0,menubar=0,toolbar=no,location=no,scrollbars=yes
 //atx_cookie.Navigate("about:blank");
 //atx_cookie.Navigate("javascript:window.open('"+strUrl+"','palPopup','width=1000,height=680,resizable=no,status=0,menubar=0,toolbar=no,location=no,scrollbars=yes')");

 var strHeader = "Content-Type: application/x-www-form-urlencoded\r\n";
 var objBuffer = new Buffer;
 objBuffer.appendText("PAGE_ID="+pv_fileNm+"&SD_CODE="+strSccd); 
 div_atx.atx_cookie.Navigate2(strUrl,"","_self",objBuffer.data,strHeader);
}

/**
* 댓글달기 팝업창 호출
* @param : obj - Button Object
* @param   e - ClickEventInfo
* @return : N/A
* @example : utlf_callReply()
*/
function utlf_callReply(obj:Button,  e:ClickEventInfo)
{
 var rtn_val = utlf_Dialog("Popup_Reply", "COMM::comp_reply.xfdl", "");
}

/**
* Grid에서 선택한 Row를 지정한 데이타셋으로 복사
* @param : obj - Grid Object
* @param dsObj  - 복사할 대상 데이타셋 object
* @return : N/A
* @example : utlf_gridCheckedMoveRow(grd_leftList, dsRightList, "name", "chk_col")
*/
function utlf_gridCheckedMoveRow(obj:Grid, dsObj, strColNm, strChkColNm) {
 var nCrow     = 0;
 var nCnt     = 0;
 //Grid Binddataset
 var strGrdDsNm    = obj.binddataset;
 nCnt = eval(strGrdDsNm).getRowCount();
 for (var i=0;i<nCnt;i++) {
  if (eval(strGrdDsNm).getColumn(i,strChkColNm) == "1") {
   nCrow = i;
   var strFindKey = eval(strGrdDsNm).getColumn(nCrow,strColNm);
   //데이타 중복이 아닌경우
   if (dsObj.findRow(strColNm, strFindKey) == -1) {
    //왼쪽 리스트에 선택한 값을 오른쪽 리스트로 이동
    var nRow = dsObj.addRow();
    dsObj.copyRow(nRow,eval(strGrdDsNm),nCrow);
   }
  }
 }
 // Dataset의 Row 삭제 시 해당 RowPosition을 위해 뒤에서 부터 삭제
 for (i=eval(strGrdDsNm).rowcount -1; i>=0; i--) {
  //trace(" *** " + eval(strGrdDsNm).getColumn(i, strChkColNm));
  if (eval(strGrdDsNm).getColumn(i, strChkColNm)=="1") eval(strGrdDsNm).deleteRow(i);
 }

}

/**
* Grid에서 선택한 Row를 제외한 Row들의 값을 원래의값으로 복구
* @param : dsObj - Grid BindDataset Object
* @param column - 체크컬럼명
* @return : N/A
* @example : utlf_dsSelUpdatedRow(ds_list, "chk_col")
*/
function utlf_dsSelUpdatedRow(dsobj,strColNm) {
 var nRowCnt = dsobj.getRowCount();
 var nColCnt = dsobj.getColCount();
 for (var i=0;i<nRowCnt;i++) {
  var strChk = dsobj.getColumn(i,strColNm);
  for (var j=0;j<nColCnt;j++) {
   if (strChk != "1") {
    if (dsobj.getOrgColumn(i,j) != dsobj.getColumn(i,j)) {
     dsobj.setColumn(i,j,dsobj.getOrgColumn(i,j));
    }
   }
  }
 }
 //추가된 Row삭제처리
 for (var i=nRowCnt;i>=0;i--) {
  if (dsobj.getRowType(i) == 2) {
   dsobj.deleteRow(i);
  }
 }
}

/**
* Dataset의 변경(Update) 여부 확인
* @param : dsObj - Dataset Object
* @return : true/false
* @example : utlf_isUpdate(ds_list)
*/
function utlf_isUpdate(dsObj) {
 if (dsObj.getRowCount() < 1 ) return false;

 for (var i=0; i<dsObj.getRowCount(); i++) {
  //trace(i + " :: " + dsObj.getRowType());
  if (dsObj.getRowType(i) != 1) {
   return true;
   break;
  }
 }

 return false;
}

/**
* Grid에서 선택한 Row를 지정한 데이타셋으로 이동
* @param : obj - Grid Object
* @param dsObj  - 복사할 대상 데이타셋 object
* @return : N/A
* @example : utlf_gridMultiSelectMoveRow(grd_leftList, dsRightList, "name")
*/
function utlf_gridMultiSelectMoveRow(obj:Grid, dsObj, strColNm) {
 var nCrow     = 0;
 var nCnt     = 0;
 //Grid Binddataset
 var strGrdDsNm    = obj.binddataset;
 var arrSelectedstartRow = obj.selectstartrow;
 var arrselectendrow  = obj.selectendrow;

 nCnt = arrSelectedstartRow.length;
 if (nCnt > 1) {
  for (var i=0;i<nCnt;i++) {
   for (var j=parseInt(arrSelectedstartRow[i]);j<=parseInt(arrselectendrow[i]);j++) {
    nCrow = j;//parseInt(arrSelectedstartRow[i]);
    var strFindKey = eval(strGrdDsNm).getColumn(nCrow,strColNm);
    //데이타 중복이 아닌경우
    if (dsObj.findRow(strColNm, strFindKey) == -1) {
     //왼쪽 리스트에 선택한 값을 오른쪽 리스트로 이동
     var nRow = dsObj.addRow();
     dsObj.copyRow(nRow,eval(strGrdDsNm),nCrow);
    }
   }
  }
  //이동한 Row삭제
  var nTrow;
  for (var k=0;k<dsObj.getRowCount();k++) {
   nTrow = eval(strGrdDsNm).findRow(strColNm, dsObj.getColumn(k,strColNm));
   eval(strGrdDsNm).deleteRow(nTrow);
  }
 } else {
  if (arrSelectedstartRow < 0) return;

  for (var i=arrSelectedstartRow;i<=arrselectendrow;i++) {
   var strFindKey = eval(strGrdDsNm).getColumn(i,strColNm);
   //데이타 중복이 아닌경우
   if (dsObj.findRow(strColNm, strFindKey) == -1) {
    //왼쪽 리스트에 선택한 값을 오른쪽 리스트로 이동
    var nRow = dsObj.addRow();
    dsObj.copyRow(nRow,eval(strGrdDsNm),i);
   }
  }
  //이동한 Row삭제
  var nTrow;
  for (var k=0;k<dsObj.getRowCount();k++) {
   nTrow = eval(strGrdDsNm).findRow(strColNm, dsObj.getColumn(k,strColNm));
   eval(strGrdDsNm).deleteRow(nTrow);
  }

 }
 obj.selecttype = "row";
 obj.selecttype = "multirow";
 for(var i=0; i<eval(strGrdDsNm).getRowCount(); i++){
  eval(strGrdDsNm).selectRow(i, false);
 }


}


/**
* Object의 type을 문자열로 얻어온다.
* @param : oObj - type을 얻어올 Object
* @return : string
* @example : utlf_GetObjType(oObj)
*/
function utlf_GetObjType(oObj)
{
 var sType;

 if( utlf_IsNull(oObj) )  return "";

 sType = oObj.toString().valueOf().substr(1,6);
 if( sType.toLowerCase() == "object" )
  return utlf_Mid(oObj.toString().valueOf(), " ", "]");

 return "";
}

/**
* Check 대상 Value가 Null일 경우 지정된 값으로 대체
* @param : sVal - Null Check 대상 Value
* @param sRepVal - Null일 경우 대체 Value
* @return : N/A
* @example : utlf_nvl(sVal, sRepVal)
*/
function utlf_nvl(sVal, sRepVal)
{
    if (utlf_IsNull(sVal)) return sRepVal;
    else return sVal;
}

/**
* 파일을 추가한다. 대화상자를 통해 파일을 선택하고
* 리스트를 표시한다.
* @param : dsObj - 첨부파일 리스트 테이타셋
* @param sRepVal - Null일 경우 대체 Value
* @return : N/A
* @example : utlf_fileAttach(dsObj, strAtchFileNm, strFileCoursNm)
*/
function utlf_fileAttach(dsObj, strAtchFileNm, strFileCoursNm) {
 //file 관련 Object 선언
 vFile   = new VirtualFile;
 FileDialog0 = new FileDialog;
 HttpObject0 = new HttpObject;
 HttpObject0.timeout = 300;
 //HttpObject 이벤트 지정
 HttpObject0.onstatus.setHandler(utlf_httpObject_onstatus);
 HttpObject0.onload.setHandler(utlf_httpObject_onload);

 //lfn_addcolumn();//체크 컬럼 추가
 var vFileList = FileDialog0.open("FileOpen", FileDialog.MULTILOAD, "%MYDOCUMENT%");

 if(!vFileList) {
   return;   //선택된 file 없을경우 처리
 }

 var nRow;
 for (var i=0;i<vFileList.length;i++) {
  nRow = dsObj.addRow();
  dsObj.setColumn(nRow,strAtchFileNm,vFileList[i].filename);
  dsObj.setColumn(nRow,strFileCoursNm,vFileList[i].path);
 }

}

/**
* 파일을 서버에 업로드한다.(Sync방식)
* @param : dsObj - 첨부파일 리스트 테이타셋
* @return : N/A
* @example : utlf_fileUpload(dsObj, strUrl, strAtchFileNm, strFileCoursNm)
*/
function utlf_fileUpload(dsObj, strServerUrl, strAtchFileNm, strFileCoursNm) {

 if (dsObj.getRowCount() == 0) return true;
 var strUrl = strServerUrl + strFileDir;
 var strFilename = "";
 var bSuccess = "";
 var strFileUuid = "";
 var rtn;
 var nRow;
 var nTotCnt = dsObj.getRowCount();
 strAddFilenm = ""; //초기화
 for (var i=0;i<nTotCnt;i++) {
  //addfiles 골라내기
  isCompleted = false;
  if (dsObj.getRowType(i) == 2) {

   strFilename =  dsObj.getColumn(i,strFileCoursNm) + dsObj.getColumn(i,strAtchFileNm);
   bSuccess = vFile.open(strFilename, VirtualFile.openRead | VirtualFile.openText );
   //trace(strFilename + " open ::: " + bSuccess);
   //파일 업로드
   rtn = HttpObject0.upload(strUrl, FileDialog.LOAD, vFile, false);

   // 업로드 리렉토리 + 파일 UUID(36자리) 형태로 메시지를 넘겨 받음
   // 뒤의 36자리를 잘라내어 UUID로 저장함
   strFileUuid = utlf_Right(strFileDir, 36);
   strFileDir = utlf_Replace(strFileDir, strFileUuid, "");

   // strAddfilenm에 UUID,파일이름,... 형태로 저장한 후 화면에서 hiddenUploadedFiles 값에 담아
   // 서비스에 전달함
   strAddFilenm += strFileUuid;
   strAddFilenm += ",";
   strAddFilenm += dsObj.getColumn(i,strAtchFileNm);
   if (i < (nTotCnt-1)) {
    strAddFilenm += ",";
   }
   strUrl = strServerUrl + strFileDir;

  }

 }
 if (rtn == true) {
  return true;
 } else {
  return rtn;
 }

}

/**
* 서버에서 선택한 파일을 다운로드 한다.
* @param : obj - Grid Object
* @param e - event
* @param strServerUrl - 다운로드 url
* @param  strAtchFileNm - 첨부파일명 컬럼
* @return : N/A
* @example : utlf_fileDown(obj, e, strServerUrl, strAtchFileNm)
*/
function utlf_fileDown(obj, e, strServerUrl, strAtchFileNm) {
 //file 관련 Object 선언
 vFile   = new VirtualFile;
 FileDialog0 = new FileDialog;
 HttpObject0 = new HttpObject;
 HttpObject0.timeout = 300;
 //HttpObject 이벤트 지정
 HttpObject0.onstatus.setHandler(utlf_httpObject_onstatus);
 HttpObject0.onload.setHandler(utlf_httpObject_onload);

 var dsObj = obj.binddataset;
 var strDownFilenm = eval(dsObj).getColumn(e.row,strAtchFileNm);
 var strFileId = eval(dsObj).getColumn(e.row,"fileId");
 var strFileRefrnId = eval(dsObj).getColumn(e.row,"fileRefrnId");
 var vFile_down = FileDialog0.open("file download",FileDialog.SAVE,"%MYDOCUMENT%",strDownFilenm);

 var strUrl = strServerUrl + "?fileRefrnId="+strFileRefrnId+"&fileId="+strFileId;
 if (vFile_down)
 {
  var rtn = HttpObject0.download(strUrl , vFile_down, true);
 }

 vFile_down.close();
}


/**
* 파일을 삭제한다.
* @param : dsObj - 첨부파일 리스트 테이타셋
* @param chkColnm - 체크컬럼명
* @param dsDelObj - 삭제된 파일용 데이타셋
* @return : N/A
* @example : utlf_fileDel(dsObj, chkColnm, dsDelObj)
*/
function utlf_fileDel(dsObj, chkColnm, dsDelObj) {
 //체크되어있는 데이타만 처리
 dsDelObj.clearData();
 for (var i=dsObj.getRowCount();i>=0;i--) {
  if (dsObj.getColumn(i,chkColnm) == "1") {
   nRow = dsDelObj.addRow();
   dsDelObj.copyRow(nRow,dsObj,i);
   dsObj.deleteRow(i);
  }
 }

 //trace(dsDelObj.saveXML());

}


/**
* HTTPOBJECT 파일업로드/다운로드 onstatus 이벤트
* @param : obj - httpObject
* @param e - event
* @return : N/A
* @example :
*/
function utlf_httpObject_onstatus(obj:HttpObject, e:HttpObjStatusEventInfo)
{
 trace("status:: "+e.status);
}

/**
* HTTPOBJECT 파일업로드/다운로드 완료 이벤트
* @param : obj - httpObject
* @param e - event
* @return : N/A
* @example :
*/
function utlf_httpObject_onload(obj:HttpObject, e:HttpObjLoadEventInfo)
{
 trace("return code: "+e.errorcode+"    return folder::"+e.errormsg);
 if (e.errorcode == 0) {
  if (e.errormsg != "Success") {
   strFileDir = e.errormsg;
  }
 }
}

/**
* gds_userinfo(사용자 정보)의 정보 처리
* @param : strKey - User 정보 항목(string)
* @return : string(Value)
* @example :
*/
function utlf_getSession(strKey)
{
 var bInvalidKey = false;
 var sInvalidKeyId = "";
 var sValidKeyId = "";
 //임시 작업
 if(strKey == "userid"){
  bInvalidKey = true;
  sInvalidKeyId = strKey;
  sValidKeyId = "usrid";
  strKey = "usrid";
 }else if(strKey == "userName"){
  bInvalidKey = true;
  sInvalidKeyId = strKey;
  sValidKeyId = "userNm";
  strKey = "userNm";
 }


 if(bInvalidKey && (smf_IsLocalMode || smf_IsDevMode())){
//   var sMessage = format("세션값 {0}는 폐기됐습니다. 2010년 12월31일까지 utlf_getSession('{1}')로 변경하세요.\n"
//                        +"이 메시지는 검수서버에서는 나타나지 않습니다.", [sInvalidKeyId, sValidKeyId]);
//   alert(sMessage);
 }

 var findRow = gds_userinfo.findRow( "key", strKey );
 if (findRow == -1) {
  if(gds_userinfo.getColumn(0, strKey) == "undefined"){
   return false;
  }else{
   return gds_userinfo.getColumn(0, strKey);
  }
 } else {
  return gds_userinfo.getColumn(findRow, "value");
 }
}

/**
 * sText를 String으로 형변환
 * undefined   -> ""
 * null        -> ""
 * 1           -> "1"
 * ""          -> ""
 * 1.1         -> "1.1"
 * @param  sText
 * @return String
 * @see
 */
function utlf_Str(sText){
 if(sText == undefined) return "";
 if(sText == null) return "";
 if(sText instanceof String) return sText;

 return ""+sText;
}

/**
 * default_typedef.xml에 정의된 service url정보를 가져온다.
 * @param  argPrefix as String
 * @return String
 * @see
 */
function utlf_getSvcUrl(argPrefix)
{
    var arrServices = application.services;
    var bFindRtn = false;
    for (var i = 0; i < arrServices.length; i++) {
        if (arrServices[i].prefixid == argPrefix) {
            bFindRtn = true;
            break;
        }
    }
    if (bFindRtn) {
        return arrServices[i].url;
    } else {
        return undefined;
    }
}

/**
 * Global에 정의된 Cache항목의 Key 값 설정
 * @param  strBiz : 단위업무 코드
 * @param  strKey : Cache 처리 시 Key
 * @param  strVal : Key에 대한 Value
 * @return N/A
 * @see
 */
function utlf_setCache(strBiz, strKey, strVal) {
 if (utlf_IsNull(strBiz)) return false;
 if (utlf_IsNull(strKey)) return false;
 //if (utlf_IsNull(strVal)) return false;

 var fStr = "bizid=='" + strBiz + "' && key=='" + strKey + "' && type=='C'";
 var findRow = gds_cache.findRowExpr(fStr);

 if (findRow < 0) {
  iRowPos = gds_cache.addRow();
  gds_cache.setColumn(iRowPos, "bizid", strBiz);
  gds_cache.setColumn(iRowPos, "key", strKey);
  gds_cache.setColumn(iRowPos, "value", strVal);
  gds_cache.setColumn(iRowPos, "type", "C");
 } else {
  gds_cache.setColumn(findRow, "value", strVal);
 }
}

/**
 * Global에 정의된 Cache 항목의 Key을 가져옴
 * @param  strBiz : 단위업무 코드
 * @param  strKey : Cache 처리 시 Key
 * @return N/A
 * @see
 */
function utlf_getCache(strBiz, strKey) {
 if (utlf_IsNull(strBiz)) return false;
 if (utlf_IsNull(strKey)) return false;

 var fStr = "bizid=='" + strBiz + "' && key=='" + strKey + "' && type=='C'";
 var findRow = gds_cache.findRowExpr(fStr);

 if (findRow < 0) {
  return "";
 } else {
  return gds_cache.getColumn(findRow, "value");
 }
}

/**
 * 업무단의 Session 항목 정의
 * @param  dsObj : 단위업무 Session Dataset(Object)
 * @param  strBiz : 단위업무 코드
 * @param  strKey : Dataset의 Code Column 명(string)
 * @param  strVal : Dataset의 value Column 명(string)
 * @return N/A
 * @see
 */
function utlf_setBizSession(dsObj, strBiz, strKey, strVal) {

 if (dsObj.getRowCount() < 1) return false;
 if (utlf_IsNull(strBiz)) return false;
 if (utlf_IsNull(strKey)) return false;
 if (utlf_IsNull(strVal)) return false;

 var iRow;

 for (var i=0; i<dsObj.getRowCount(); i++) {
  iRow = gds_cache.addRow();
  gds_cache.setColumn(iRow, "bizid", strBiz);
  gds_cache.setColumn(iRow, "key", dsObj.getColumn(i, strKey));
  gds_cache.setColumn(iRow, "value", dsObj.getColumn(i, strVal));
  gds_cache.setColumn(iRow, "type", "S");
 }

 return true;
}

/**
 * 업무단의 Session 항목 가져옴
 * @param  strBiz : 단위업무 코드
 * @param  strKey : Session Key
 * @return N/A
 * @see
 */
function utlf_getBizSession(strBiz, strKey) {
 if (utlf_IsNull(strBiz)) return false;
 if (utlf_IsNull(strKey)) return false;

 var fStr = "bizid=='" + strBiz + "' && key=='" + strKey + "' && type=='S'";
 var findRow = gds_cache.findRowExpr(fStr);

 if (findRow < 0) {
  return false;
 } else {
  return gds_cache.getColumn(findRow, "value");
 }
}


/**
 * FusionChart Object를 생성한다.
 * @param  chartNm  - Chart Object name
 * @return 없음
 * @example utlf_FusionChart(atx_chart1,cbo_type1.value,strXml)
 */
function utlf_FusionChart(objChart,nLeft,nTop,nRight,nBottom) {

 var _objAry = objChart.split(".");
 if(_objAry.length > 1){
  var _prefixObj = eval(objChart.substr(0,objChart.length - (_objAry[_objAry.length-1].length + 1)));

  if (!_prefixObj.isValidObject( _objAry[_objAry.length-1])) {
   alert("FusionChart object가 존재하지 않습니다.");
   return;
  }
 }else{

  if (!isValidObject(objChart)) {
   alert("FusionChart object가 존재하지 않습니다.");
   return;
  }
 }
 eval(objChart).progid   = "{D27CDB6E-AE6D-11CF-96B8-444553540000}";
 eval(objChart).codebase  = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab";
 eval(objChart).init(objChart);//,nLeft,nTop,nRight,nBottom
 eval(objChart).show();
}

/**
 * Form ID를 넘기면 MenuId를 return..
 * @param  strFormID
 * @return MenuId
 * @example utlf_mainFormIdOpen(this.name, "key1=abcd,key2=1234")
 */
function utlf_mainFormIdOpen(strFromId,strArg) {
 var sMenuId=gds_menuinfo.lookup("pgeid",strFromId,"menuId");
 if(utlf_IsNull(sMenuId)){
  alert("메뉴아이디가 존재하지않습니다.");
  return;
 }else{
  sysf_chkOpenMenu(sMenuId, strArg, true);
 } 
}

/**
 * 메인화면에서 다른 메인화면을 호출한다.
 * @param  strMenuId  - MenuID값
 * @return 없음
 * @example utlf_mainFormOpen("NA10010", "key1=abcd,key2=1234")
 */
function utlf_mainFormOpen(strMenuId, strArg) {
 sysf_chkOpenMenu(strMenuId, strArg, true);
}

/**
 * 메인화면을 닫는다.(화면에서 필요시 사용)
 * @param  obj  - 실행중인 화면Object
 *         obj  - 실행중인 화면menuid
 * @return 없음
 * @example utlf_mainFormClose(obj)
 * @example utlf_mainFormClose("NA10010")
 * @example utlf_mainFormClose("NA10010,NA10020")
 */
function utlf_mainFormClose(obj) {
 var sFrmID = obj.pv_winKey;
 if (gv_mdiFlag == false && sFrmID == undefined) {
  //quick view가 아니고 argument가 form object인 경우
  sysf_tabOnClose(sFrmID);
 } else {
  var arrStr = new Array();
  arrStr = obj.split(",");
  for (var i=0;i<arrStr.length;i++) {
   strMenuId = arrStr[i];
   //mdi form control key 찾기
   var winKey = gds_openwininfo.lookup("menuid", strMenuId,"winid");
   if (winKey == undefined) {
    alert("해당화면을 찾을 수 없습니다.");
    return;
   }
   //화면 닫기
   sysf_tabOnClose(winKey);
  }

 }
}

/**
 * PC의 날짜와 시각을 설정한다.
 * @param  strTime  - 년월일을 포함한 문자열(yyyyMMddhhmmss)
 * @return 없음
 * @example utlf_setTime("20100803100200")
 */
function utlf_setTime(strTime) {
 var extComapi = new ExtCommon();
 extComapi.setTime(strTime);
}

/**
 * 날짜,시간, 포멧을 넣으면 해당되는 포멧으로 반환한다(java의 SimpleDateFormat과 비슷함)
 * ex1) var date = '20100729090134';
 *     date.dateFormat("yyyy년MM월dd일 hh시mm분ss초"); => 2010년07월29일 09시01분34초
 * ex2) var date = '20100729';
 *     date.dateFormat("yyyy.MM.dd"); => 2010.07.29
 *
 * @param format 포멧( 'a' 옵션을 넣으면 오전,오후구분, 없으면 24시간표시)
 */
String.prototype.dateFormat = function(format) {

    if(this == '' || this.length < 8) return 'Error String for format';
    if(format == null || format == undefined) return 'Error Date format';

    var date = this.length == 8 || this.length > 8 ? this.substring(0, 8) : '';

    var time = this.length == 14 ? this.substring(8, 14) : '';

    if(date != null || date != undefined){
        date = date.replace(/[\s\-\/]/g, "");

        if(date.length == 8) {
            format = format.replace(/yyyy/g, date.substring(0, 4));
            format = format.replace(/MM/g, date.substring(4, 6));
            format = format.replace(/dd/g, date.substring(6, 8));
        }else if(date.length == 6) {
            format = format.replace(/yyyy/g, date.substring(0, 2));
            format = format.replace(/MM/g, date.substring(2, 4));
            format = format.replace(/dd/g, date.substring(4, 6));
        }
    }

    if(time != null || time != undefined) {
        time = time.replace(/[\s\-\/]/g, "");

        if(time.length >= 4) {

            //만약 오전,오후 format check( 'a' 옵션)
            var hour = Number(format.substring(0, 2));

            if(format.match(/a/g) != null) {
                if(hour > 12) {
                    format = format.replace(/a/g, "오후");
                    hour = hour - 12;
                } else {
                    format = format.replace(/a/g, "오전");
                }
                format = format.replace(/hh/g, hour+"");
            }else {
                format = format.replace(/hh/g, time.substring(0, 2));
            }
            format = format.replace(/mm/g, time.substring(2, 4));
        }

         if(time.length == 6) {
            format = format.replace(/ss/g, time.substring(4, 6));
        }
    }
    return format;
}

/**
 * form이 속해있는 시스템코드, 코드명을 구할때 사용한다.
 * @param  objNm : 파일명 또는 form ID
 * @param  gbn : 구분 ( NM / CD )
 * @return 시스템코드명 배열
 * @example utlf_sysGbnNm("mis_sdlca00_m00", "NM") -> 교무업무,중,학생생활,자격증및인증취득상황, mis_sdlca00_m00
 * @example utlf_sysGbnNm("mis_sdlca00_m00", "CD") -> SW,MIS,SDL,CA,mis_sdlca00_m00
 */
function utlf_sysGbnNm(objNm,gbn) {
    var arrSysNm = new Array();
    if(gbn == "NM"){
        arrSysNm[0]  = gdsSubSys.lookup("cd",objNm.substr(0,3).toUpperCase(),"upNm");
        arrSysNm[1]  = gdsSubSys.lookup("cd",objNm.substr(0,3).toUpperCase(),"nm");
        gdsBigGbn.filter("upCd=='"+objNm.substr(0,3).toUpperCase()+"'");
        arrSysNm[2]  = gdsBigGbn.lookup("cd",objNm.substr(4,3).toUpperCase(),"nm");
        gdsMidGbn.filter("subCd=='"+objNm.substr(0,3).toUpperCase()+"' && upCd=='"+objNm.substr(4,3).toUpperCase()+"'" );
        arrSysNm[3]  = gdsMidGbn.lookup("cd",objNm.substr(7,2).toUpperCase(),"nm");
        arrSysNm[4]  = objNm;
    }else if(gbn == "CD"){
        arrSysNm[0]  = gdsSubSys.lookup("cd",objNm.substr(0,3).toUpperCase(),"upCd");
        arrSysNm[1]  = objNm.substr(0,3).toUpperCase();
        arrSysNm[2]  = objNm.substr(4,3).toUpperCase();
        arrSysNm[3]  = objNm.substr(7,2).toUpperCase();
        arrSysNm[4]  = objNm;
    }

    return arrSysNm;
}
/**
 * 첨부파일의 사이즈를 구한다.
 * @param  filenm : 파일경로
 * @param  strUnit : 구분(K,M,G,B)
 * @return 파일사이즈
 * @example utlf_getFileSize("c:\Documents and Settings\neon\My Documents\1234.xls") -> Kbyte사이즈
 * @example utlf_getFileSize("c:\Documents and Settings\neon\My Documents\1234.xls", "M") -> Mbyte사이즈
 */
function utlf_getFileSize(filenm, strUnit) {
 if (utlf_IsNull(strUnit)) {
  strUnit = "K";
 }

 //Object 선언
 vFile   = new VirtualFile;

 bSuccess = vFile.open(filenm, VirtualFile.openRead | VirtualFile.openText );
 nFileSize =  vFile.getFileSize();
 switch (strUnit) {
  case "B": //byte
   nFileSize = nFileSize;
  break;
  case "K": //Kilo byte
   nFileSize = Math.round(nFileSize / 1024,1);
  break;
  case "M": //Mega byte
   nFileSize = Math.round((nFileSize / 1024)/1024,1);
  break;
  case "G": //Giga byte
   nFileSize = Math.round(((nFileSize / 1024)/1024)/1024,1);
  break;
  default: //Kilo byte
   nFileSize = Math.round(nFileSize / 1024,1);
  break;
 }
 return nFileSize;
}

/**
 * 년월달력 팝업디비젼을 동적으로 생성한다.
 * @param  oobj: Calendar
 * @param  e: MouseEventInfo
 * @return 년월로 구성된 문자열
 * @example utlf_makeCalMonthPopdiv -> 달력컴포넌트 이벤트에서 직접 호출
 */
function utlf_monthCalendar(obj:Calendar, e:MouseEventInfo) {
 if (e.fromreferenceobject == "[object Button]") {
   var nLeft    = system.clientToScreenX(obj,0);
   var nTop    = system.clientToScreenY(obj,0) + (obj.position.bottom - obj.position.top);
  var objParentForm  = this.getOwnerFrame();
  
  /////////////////////////////////////////////////
  var objL = obj.position.left;
  var objT = obj.position.bottom;
  //모니터 해상도
  var monitorX = system.screenwidth;
  var monitorY = system.screenheight;
  /////////////////////////////////////////////////
  
  // Create Object
  var objPopupDiv  = new PopupDiv();
  objPopupDiv.init("popdiv_calMonth", 0, 0, 194, 182);

  // Add Object to Parent Form
  this.addChild("popdiv_calMonth", objPopupDiv);
  objPopupDiv.url    = "COMM::comp_calMonth.xfdl";
  objPopupDiv.style.border  = "1 solid #d9dadcff";
     objPopupDiv.style.color  = "#d9dadcff";
  // Show Object
  objPopupDiv.show();
  if (!utlf_IsNull(obj.value)) {
   popdiv_calMonth.sta_year.text = obj.getYear();
   eval("popdiv_calMonth.img_month" + obj.getMonth()).image = "theme://images\\cal_num" + obj.getMonth() + "R.png";
  } else {
   //현재일자 가져와서 세팅
   var strToday  = utlf_Today();
   popdiv_calMonth.sta_year.text = strToday.substr(0,4);
   var nMonth = parseInt(strToday.substr(4,2));
   var strImgNm = "theme://images\\cal_num" + nMonth.toString() + "R.png";
   eval("popdiv_calMonth.img_month" + nMonth.toString()).image = strImgNm;
  }
  
  //팝업위치 조정(모니터 우측으로 넘어가지 않도록 처리)
  if ((nLeft+objPopupDiv.position.width) > monitorX) {
   nLeft = monitorX - objPopupDiv.position.width;
  }
  //팝업위치 조정(모니터 아래로 넘어가지 않도록 처리)
  if ((nTop+objPopupDiv.position.height) > monitorY) {
   nTop = nTop - objPopupDiv.position.height - (obj.position.bottom-obj.position.top);
  }
  
  var rtnvalue = popdiv_calMonth.trackPopup(nLeft-1, nTop-1, 194, 182);
  // Remove Object form Parent Form
  this.removeChild("popdiv_calMonth");

  // Destroy Object
  objPopupDiv.destroy();
  objPopupDiv = null;
  //value binding
  if (!utlf_IsNull(rtnvalue)) {
   obj.value = rtnvalue;
  }
  //calendar popwindow hide
  obj.dropdown();
 }


}

/////////////////////////////////////////////////////////////////////////////////////////////
// Batch File Upload / Download
// 최원 선임님 요청
/////////////////////////////////////////////////////////////////////////////////////////////
function utlf_batchFileUpload(dsObj, strAtchFileNm, strFileCoursNm){
 var strServerUrl = "http://" + gv_ServerUrl + "/alc_cor_fl01_004.xp?fileDir=";
 //var strServerUrl = "svc_neis::" + gv_ServerUrl + "/alc_cor_fl01_004.xp?fileDir=";
 return utlf_fileUpload(dsObj, strServerUrl, strAtchFileNm, strFileCoursNm);
}

/**
* CSV 파일업로드/다운로드 완료 이벤트
* @param : obj - httpObject
* @param e - event
* @return : N/A
* @example :
*/
function utlf_batchFileDown_complete(obj:HttpObject, e:HttpObjLoadEventInfo)
{
 trace("return code: "+e.errorcode+"    return folder::"+e.errormsg);
}

/**
* 배치 실행 로그를 조회하는 기능
* @param : jobId - batch Job ID
* @param : uuidParam - 배치 실행시 발생시키는 uuid
* @return : dsBatchResult - 배치 실행정보를 담고 있는 Dataset
* @example : utlf_srchBatchResiult("exampleFiletoFileBatch",
*/
function utlf_srchBatchResult(stringVal, jobName, callback){

 var dsInBatchMonitoring = "";
 var dsOutBatchMonitoring = "";

    //조회용 Dataset 생성
    if (sysf_IsNull(objects("_dsInBatchMonitoring"))) {
     trace("여긴 if");
  dsInBatchMonitoring = new Dataset;
  dsInBatchMonitoring.name = "_dsInBatchMonitoring";
  this.addChild(dsInBatchMonitoring.name, dsInBatchMonitoring);
    } else {
     trace("여긴 else");
  dsInBatchMonitoring = objects("_dsInBatchMonitoring");
  dsInBatchMonitoring.clear();
    }
 dsInBatchMonitoring.addColumn("stringVal", "STRING", 255);
 dsInBatchMonitoring.addColumn("jobName", "STRING", 255);
 dsInBatchMonitoring.addRow();

 dsInBatchMonitoring.setColumn(0, 0, stringVal);
 dsInBatchMonitoring.setColumn(0, 1, jobName);
 trace("stringVal = " + stringVal + " jobName = " + jobName);
 trace(dsInBatchMonitoring.getRowCount());
 //조회용 Dataset 생성 종료

 //배치 실행 상태 검색 결과 Dataset 생성 시작
    if (sysf_IsNull(objects("_dsOutBatchMonitoring"))) {
  dsOutBatchMonitoring = new Dataset;
  dsOutBatchMonitoring.name = "_dsOutBatchMonitoring";
  this.addChild(dsOutBatchMonitoring.name, dsOutBatchMonitoring);
    } else {
  dsOutBatchMonitoring = objects("_dsOutBatchMonitoring");
  dsOutBatchMonitoring.clear();
    }
 dsOutBatchMonitoring.addColumn("jobInstanceId", "BIGDECIMAL", 19);
 dsOutBatchMonitoring.addColumn("jobExecutionId", "BIGDECIMAL", 19);
 dsOutBatchMonitoring.addColumn("version", "BIGDECIMAL", 19);
 dsOutBatchMonitoring.addColumn("createTime", "STRING", 26);
 dsOutBatchMonitoring.addColumn("startTime", "STRING", 26);
 dsOutBatchMonitoring.addColumn("endTime", "STRING", 26);
 dsOutBatchMonitoring.addColumn("status", "STRING", 10);
 dsOutBatchMonitoring.addColumn("exitCode", "STRING", 100);
 dsOutBatchMonitoring.addColumn("exitMessage", "STRING", 6000);
 dsOutBatchMonitoring.addColumn("lastUpdated", "STRING", 26);

 transaction("srchBatchResult",
             "http://"+gv_ServerUrl+"/srch_batch_result.xp",
             //"svc_neis::"+gv_ServerUrl+"/srch_batch_result.xp",
             "dsBatchMonitoringSVO=_dsInBatchMonitoring",
             "_dsOutBatchMonitoring=dsBatchMonitoringSVO_batchStatus",
             "svcId='edusys.sc.alc.bat.mo.svc.BatchMonitoringSVC' voId='edusys.sc.alc.bat.mo.svc.BatchMonitoringSVO' method='selectBatchStatus'",
             callback);
}

/**
 * 배치 어플리케이션을 으로 생성된 CSV 파일을 다운로드 한다.
 * @param  fileId : 배치로 생성된 파일의 정보가 저장되어 있는 임시 테이블의 PK
 * @param  ext : 다운받을 파일의 기본 확장자, 입력되지 않을경우 .csv 로 저장한다.
 * @param  defLoc : 파일 Dialog가 실행되는 기본 위치
 * @param  defFileName : 파일 Dialog가 실행될때 저장파일명의 default로 뜰 이름
 * @return true/false(파일 다운 성공여부, 다이얼로그를 닫으면 false를 리턴)
 * @example utlf_batchDownload('down', 'CSV|*.csv|', 'c:\\', 'downFile.csv')
 */
function utlf_batchFileDownload(fileId, ext, defLoc, defFileName) {
 //파라미터 null 체크
 if(utlf_IsNull(fileId)){
  alert("fileId가 null 입니다.");
  return;
 }
 //업무에서 기본 디렉토리를 넣지 않은 경우 내문서 폴더를 기본으로 연다.
 if(utlf_IsNull(defLoc)){
  defLoc = "%MYDOCUMENT%";
 }

 //fileDialog에서 사용될 확장자가 입력되었는지 확인
 if(utlf_IsNull(ext)){
  ext = "CSV|*.csv|";
 }

 //fileDialog에서 사용될 defFileName이 입력되었는지 확인
 if(utlf_IsNull(defFileName)){
  defFileName = "";
 }

 FileDialog0 = new FileDialog();
 FileDialog0.filter = ext; //확장자 설정
 //var _vFile = FileDialog0.open("배치용 파일 다운로드", FileDialog.SAVE, defLoc, "");
 var _vFile = FileDialog0.open("배치용 파일 다운로드", FileDialog.SAVE, defLoc, defFileName);

 var _rtn = false;

 if(_vFile != null){ //Dialog에서 파일을 선택한 경우에만 다음 로직을 실행
  HttpObject0 = new HttpObject();
  HttpObject0.onload.setHandler(utlf_batchFileDown_complete);
  //_rtn = HttpObject0.download("svc_neis::" + gv_ServerUrl + "/alc_cor_fl01_003.xp?fileId="+ fileId, _vFile, true);
  _rtn = HttpObject0.download("http://" + gv_ServerUrl + "/alc_cor_fl01_003.xp?fileId="+ fileId, _vFile, true);

   _vFile.close();
  }
  return _rtn;
}

/**
* 파일을 추가한다. 대화상자를 통해 파일을 선택하고
* 리스트를 표시한다.
* @param : dsObj - 첨부파일 리스트 테이타셋
* @param sRepVal - Null일 경우 대체 Value
* @return : N/A
* @example : utlf_batchFileAttach(dsObj, strAtchFileNm, strFileCoursNm)
*/
function utlf_batchFileAttach(dsObj, strAtchFileNm, strFileCoursNm, ext) {
 //file 관련 Object 선언
 vFile   = new VirtualFile;
 FileDialog0 = new FileDialog;
 HttpObject0 = new HttpObject;
 HttpObject0.timeout = 300;
 //HttpObject 이벤트 지정
 HttpObject0.onstatus.setHandler(utlf_httpObject_onstatus);
 HttpObject0.onload.setHandler(utlf_httpObject_onload);

 //fileDialog에서 사용될 확장자가 입력되었는지 확인
 if(utlf_IsNull(ext)){
  ext = "CSV|*.csv|";
 }

 //lfn_addcolumn();//체크 컬럼 추가
 FileDialog0.filter = ext; //확장자 설정
 var vFileList = FileDialog0.open("FileOpen", FileDialog.LOAD, "%MYDOCUMENT%");

 if(!vFileList) {
   return;   //선택된 file 없을경우 처리
 }

 //기존에 들어가 있는 파일 정보를 Clear 처리
 dsObj.clearData();

 var nRow;
 nRow = dsObj.addRow();
 dsObj.setColumn(nRow,strAtchFileNm,vFileList.filename);
 dsObj.setColumn(nRow,strFileCoursNm,vFileList.path);
 return true;
}

/**
* 파일을 서버에 업로드한다.(Sync방식) - 배치에서 사용
* @param : dsObj - 첨부파일 리스트 테이타셋
* @return : N/A
* @example : utlf_fileUploadBatch(dsObj, strAtchFileNm, strFileCoursNm)
*/
function utlf_fileUploadBatch(dsObj,  strAtchFileNm, strFileCoursNm) {
 var strServerUrl = "http://" + gv_ServerUrl + "/alc_cor_fl01_004.xp?fileDir=";
 if (dsObj.getRowCount() == 0) return true;
 var strUrl = strServerUrl + strFileDir;
 var strFilename = "";
 var bSuccess = "";
 var rtn;
 var nRow;
 var nTotCnt = dsObj.getRowCount();
 strAddFilenm = ""; //초기화
 for (var i=0;i<nTotCnt;i++) {

  strFilename =  dsObj.getColumn(i,strFileCoursNm) + dsObj.getColumn(i,strAtchFileNm);
  bSuccess = vFile.open(strFilename, VirtualFile.openRead | VirtualFile.openText );
  strAddFilenm += dsObj.getColumn(i,strAtchFileNm);
  if (i < (nTotCnt-1)) {
   strAddFilenm += ",";
  }
  //파일 업로드
  rtn = HttpObject0.upload(strUrl, FileDialog.LOAD, vFile, false);
  // 업로드 리렉토리 + 파일 UUID(36자리) 형태로 메시지를 넘겨 받음
  // 뒤의 36자리를 잘라내어 UUID로 저장함
  strFileUuid = utlf_Right(strFileDir, 36);
  strFileDir = utlf_Replace(strFileDir, strFileUuid, "");

  // strAddfilenm에 UUID,파일이름,... 형태로 저장한 후 화면에서 hiddenUploadedFiles 값에 담아
  // 서비스에 전달함
  strAddFilenm += strFileUuid;
  strAddFilenm += ",";
  strAddFilenm += dsObj.getColumn(i,strAtchFileNm);
  if (i < (nTotCnt-1)) {
   strAddFilenm += ",";
  }
  strUrl = strServerUrl + strFileDir;

 }
 if (rtn == true) {
  return true;
 } else {
  return rtn;
 }

}

/**
* 사업자 등록번호를 체크하는 함수
* @param : strBizNo - 사업자번호 (10자리)
* @return : true/false
* @example : utlf_isBizno("1234567890");
*/
function utlf_isBizno(strBizNo){
 if (utlf_IsNull(strBizNo)) return false;

 var as_Biz_no = strBizNo;
 var isNum = true;
 var I_TEMP_SUM = 0 ;
 var I_TEMP = 0;
 var S_TEMP;
 var I_CHK_DIGIT = 0;

 as_Biz_no = as_Biz_no.replace("-","");

 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(0,1),10) ;
 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(1,2),10) * 3 ;
 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(2,3),10) * 7 ;
 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(3,4),10) ;
 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(4,5),10) * 3 ;
 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(5,6),10) * 7 ;
 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(6,7),10) ;
 I_TEMP_SUM = I_TEMP_SUM + parseInt(as_Biz_no.substring(7,8),10) * 3 ;
 I_TEMP = parseInt(as_Biz_no.substring(8,9),10)*5,'00';
 if (I_TEMP < 10) {
  S_TEMP = '0' + String(I_TEMP);
 } else {
  S_TEMP = String(I_TEMP);
 }

 I_TEMP_SUM = I_TEMP_SUM + parseInt(S_TEMP.substring(0,1)) + parseInt(S_TEMP.substring(1,2)) ;
 I_CHK_DIGIT= (10-(I_TEMP_SUM%10))%10 ;
 if (as_Biz_no.substring(9,10) != String(I_CHK_DIGIT)) return false;
 return true ;
}
/**
* 처리하는 동안 대기메세지 처리하는 함수
* @param : bFlag: Boolean, objForm: 해당 폼
* @return : 없음
* @example : utlf_waitImage(true,this);
*/
function utlf_waitImage(bFlag, objForm, strMsg) {
 var MyFrame = this.getOwnerFrame();
 if (bFlag) {
  var nLeft = (MyFrame.position.width / 2) - 200;
  var nTop = (MyFrame.position.height / 2) - 45;
  var nRight = nLeft + 400;
  var nBottom = nTop + 90;
  var objDiv;
  try {
   MyFrame.form.div_waitImage.visible;
   trace("check");
   objDiv = div_waitImage;
  } catch(e) {
   trace("not exist");
   objDiv = new Div("div_waitImage", nLeft, nTop, nRight, nBottom);
   MyFrame.form.addChild("div_waitImage", objDiv);
  }
//   if (!isValidObject("div_waitImage")) {
//    objDiv = new Div("div_waitImage", nLeft, nTop, nRight, nBottom);
//    MyFrame.form.addChild("div_waitImage", objDiv);
//   } else {
//    objDiv = div_waitImage;
//   }
  if (utlf_IsNull(strMsg)) {
   objDiv.text = "처리중입니다. 잠시 기다려주세요";
  } else {
   objDiv.text = strMsg;
  }
   objDiv.class     = "div_top_menuBG";
   objDiv.show();

  objDiv.visible = bFlag;
  MyFrame.form.setTimer(1001, 100);
 } else {
  MyFrame.form.div_waitImage.visible = bFlag;
  MyFrame.form.killTimer(1001);
 }
}

function utlf_ImgProc(bFlag, strMsg) {
 var MyFrame = this.getOwnerFrame();
 if (bFlag) {
  var nLeft = (MyFrame.position.width / 2) - 200;
  var nTop = (MyFrame.position.height / 2) - 45;
  var nRight = nLeft + 400;
  var nBottom = nTop + 90;
  var objDiv;
  if (!isValidObject("div_ImgProc")) {
   objDiv = new Div("div_ImgProc", nLeft, nTop, nRight, nBottom);
   MyFrame.form.addChild("div_ImgProc", objDiv);
  } else {
   objDiv = div_ImgProc;
  }
  if (utlf_IsNull(strMsg)) {
   objDiv.text = "처리중입니다. 잠시 기다려주세요";
  } else {
   objDiv.text = strMsg;
  }
   //objDiv.class     = "div_top_menuBG";
   objDiv.show();

  objDiv.visible = bFlag;

 } else {
  MyFrame.form.div_ImgProc.visible = bFlag;

 }
}

/**
* 기안문상신 화면 호출
* @param : strMenuId: 기안문상신 메뉴아이디, bMode: 팝업여부
* @return : 없음
* @example : utlf_sangsin("m_00000000");
*/
function utlf_sangsin(strMenuId, bMode) {
 if (utlf_IsNull(strMenuId)) {
  alert("파라메터(메뉴아이디)가 없습니다.");
  return;
 }
 var strPgeid = gds_menuinfo.lookup("menuId",strMenuId,"pgeid");
 //trace("page id : "+strPgeid);
 if (strPgeid == undefined) {
  alert("기안문상신 화면을 찾을 수 없습니다.");
  return;
 }

 
 if (bMode == true) {
  var strpgeCoursNm = gds_menuinfo.lookup("menuId",strMenuId,"pgeCoursNm");
  var strUrl = strpgeCoursNm +"::"+ strPgeid+".xfdl";
    
  var nPopLeft  = system.clientToScreenX(gv_AppTopPath.form.stc_usrInfo,-10);
  var nPopTop  = system.clientToScreenY(gv_AppTopPath.form.stc_usrInfo,60);
  var nWidth   = 831;
  var nHeight  = 553;

  utlf_Dialog(strPgeid, strUrl, "", nPopLeft, nPopTop, nWidth, nHeight, "");
 } else {
  sysf_chkOpenMenu(strMenuId);
 }
}
/**
* 상신 화면 조회함수 호출
* @param : strMenuId: 상신화면 메뉴아이디
* @return : 없음
* @example : utlf_sangsinRetrive("m_00000000");
*/
function utlf_sangsinRetrive(strMenuId) {
 if (utlf_IsNull(strMenuId)) {
  alert("파라메터(메뉴아이디)가 없습니다.");
  return;
 }
 
 var winKey = gds_openwininfo.lookup("menuid", strMenuId,"winid");
 if (winKey == undefined) {
  alert("해당화면을 찾을 수 없습니다.");
  return;
 }
 
 gv_AppFramePath.frames(winKey).form.lfn_Retrive();
}