﻿/*#################################################################################################
   + go_ParameterElement
   - 가상으로 객체를 생성해서 Submit을 하고 객체를 제거할때 사용하기 위한 객체
#################################################################################################*/
   var go_ParameterElements = new Object();
       go_ParameterElements.ItemName  = new String();
       go_ParameterElements.ItemValue = new String();
   var gs_ListDataNormalColor  = "#FFFFFF";
   var gs_ListDataReverseColor = "#F3F3F3";
   var gs_ListDataActiveColor  = "#B4E6BE";
   var gs_AutoCreateComment    = "AUTO";
   var gs_AjaxVirPath          = "/_ajax";
   var gs_IncludeVirPath       = "/_include";
   var gs_ImageVirPath         = "/_images";

   // 컬럼/로우 구분자
   var gs_ColSep    = String.fromCharCode(11);                    
   var gs_RowSep    = String.fromCharCode(12);

   var gs_ColSepSub = String.fromCharCode(7);                    
   var gs_RowSepSub = String.fromCharCode(8);

   var gs_CR        = "\r\n";
   var gs_Key09     = String.fromCharCode(9);   // TAB
   var gs_Key10     = String.fromCharCode(10);  // Line Feed
   var gs_Key13     = String.fromCharCode(13);  // Carriage Return

   var gs_BrowserType = gfnGetBrowser();


/*#################################################################################################
   + 팝업 공지
#################################################################################################*/
  var gs_PopupNoticeYn  = "Y"                   // 공지사항 존재여부
//  var gs_PopupLangCd    = "KOR/ENG/CNG"         // 언어별 적용 사이트
  var gs_PopupLangCd    = "KOR"					// 언어별 적용 사이트
  var gs_PopupSdt       = "20120113"            // 공지 시작일자
  var gs_PopupEdt       = "20120113"            // 공지 종료일자
  var gs_PopupCookieNm  = "DO_NOT_OPEN_POPUP"   // 공지안띄움 쿠키명
  var gs_PopupCkExpire  = 1                     // 공지안띄움 쿠키 적용기간 (일수)
  var gs_PopupWidth     = 480                   // 팝업창사이즈 - 가로
  var gs_PopupHeight    = 380                   // 팝업창사이즈 - 세로


/*#################################################################################################
   + gfnMsg(oError, sFunctionName)
   - Arguments  : 2 (Error Object, Function Name Or Message String)
   - Return     :
   - Usage      : catch(e){
                     gfnMsg(e, "sFunctionName")
                  }
   - Content    : JavaScript Handle시 Error가 발생했을때 Error Message를 보여주기위한 함수.
#################################################################################################*/
   function gfnMsg(oError, sFunctionName){
      try{
         alert("JavaScript handle Or Object Access Error!\n"+
               "\nFunction Name     : " + sFunctionName +
               "\nError Number      : " + oError.number +
               "\nError Description : " + (gs_BrowserType == "M"? oError.description : oError));
      }catch(e){
         return;
      }
   }

/*#################################################################################################
   + gfnGetBrowser()
   - Arguments  : 
   - Return     :
   - Usage      : 
   - Content    : 브라우저 종류구별.
#################################################################################################*/
    function gfnGetBrowser(){
      try{
        var clintAgent = navigator['userAgent'];
        var verName = ["MSIE", "Firefox", "Opera", "Chrome", "Safari"];
        var sRtnValue = "";
        
        for (var i=0; i<verName.length; i++){
          if (clintAgent.indexOf(verName[i]) > -1) {
            sRtnValue = verName[i].substr(0,1);
            break;
          }
        }
        return sRtnValue;
      }catch(e){
         gfnMsg(e, "gfnGetBrowser");
      }
    }

/*#################################################################################################
   + registerEvent()
   - Arguments  : 
   - Return     :
   - Usage      : 
   - Content    : 이벤트 등록.
#################################################################################################*/
    function registerEvent(obj, ev, handler) { 
      try{
        if (!(obj && ev && handler)) return; 
        if (obj.addEventListener) 
          obj.addEventListener(ev, handler, false); 
        else if (obj.attachEvent) 
          obj.attachEvent('on'+ev, handler); 
      }catch(e){
         gfnMsg(e, "registerEvent");
      }
    } 

/*#################################################################################################
   + unregisterEvent()
   - Arguments  : 
   - Return     :
   - Usage      : 
   - Content    : 이벤트 등록 해제.
#################################################################################################*/
    function unregisterEvent(obj, ev, handler) { 
      try{
        if (!(obj && ev && handler)) return; 
        if (obj.removeEventListener)
          obj.removeEventListener(ev, handler, false); 
        else if (obj.detachEvent)
          obj.detachEvent('on'+ev, handler); 
      }catch(e){
         gfnMsg(e, "unregisterEvent");
      }
    } 

/*#################################################################################################
   + gfnGetElementsById()
   - Arguments  : 
   - Return     :
   - Usage      : 
   - Content    : ID 배열의 Elements 리턴
#################################################################################################*/
    function gfnGetElementsById(searchId, node, tag) { 
      try{
        var classElements = new Array(); 
        if ( node == null ) 
            node = document; 
        if ( tag == null ) 
            tag = '*'; 
        var els = node.getElementsByTagName(tag); 
        var elsLen = els.length; 
        var pattern = new RegExp("(^|s)"+searchId+"(s|$)"); 
        for (i = 0, j = 0; i < elsLen; i++) { 
            if ( pattern.test(els[i].id) ) { 
                classElements[j] = els[i]; 
                j++; 
            } 
        } 
        return classElements; 
      }catch(e){
         gfnMsg(e, "gfnGetElementsById");
      }
    } 

/*#################################################################################################
   + gfnLTrim(sString)
   - Arguments      : 1 (String)
   - Return         : String
   - Usage          :
   - Content        :
          LTrim     : Returns a String containing a copy of a specified string without leading spaces
          Parameters:
                      String = The required string argument is any valid string expression.
                      If string contains null, false is returned
#################################################################################################*/
   function gfnLTrim(sString){
      try{
         var i = 0;
         var j = sString.length - 1;
         if(sString == null || sString == ""){
            return ("");
         }
         for(i = 0; i < sString.length; i++){
            var sChr = sString.substr(i, 1);
            if (sChr != " " && sChr != gs_Key09 && sChr != gs_Key10 && sChr != gs_Key13) break;
//            if(sString.substr(i, 1) != " " && sString.substr(i, 1) != "\t") break;
         }

         if(i <= j){
            return (sString.substr(i, (j+1)-i));
         }else{
            return ("");
         }
      }catch(e){
         gfnMsg(e, "gfnLTrim");
      }
   }
/*#################################################################################################
   + gfnRTrim(sString)
   - Arguments      : 1 (String)
   - Return         : String
   - Usage          :
   - Content        :
         RTrim      : Returns a String containing a copy of a specified string without trailing spaces
         Parameters :
                      String = The required string argument is any valid string expression.
                      If string contains null, false is returned
#################################################################################################*/
   function gfnRTrim(sString){
      try{
         var i = 0;
         var j = sString.length - 1;
         if(sString == null || sString == ""){
            return ("");
         }
         for(j = sString.length - 1; j >= 0; j--){
            var sChr = sString.substr(j, 1);
            if (sChr != " " && sChr != gs_Key09 && sChr != gs_Key10 && sChr != gs_Key13) break;
//            if (sString.substr(j, 1) != " " && sString.substr(j, 1) != "\t") break;
         }
         if(i <= j){
            return (sString.substr(i, (j+1)-i));
         }else{
            return ("");
         }
      }catch(e){
         gfnMsg(e, "gfnRTrim");
      }
   }
/*#################################################################################################
   + gfnTrim(sString)
   - Arguments      : 1 (String)
   - Return         : String
   - Usage          :
   - Content        :
         RTrim      : Returns a String containing a copy of a specified string without both leading and trailing spaces
         Parameters :
                      String = The required string argument is any valid string expression.
                      If string contains null, false is returned
#################################################################################################*/
   function gfnTrim(sString){
      try{
         if(sString == null || sString == ""){
            return ("");
         }
         return gfnRTrim(gfnLTrim(sString));
      }catch(e){
         gfnMsg(e, "gfnTrim");
      }
   }

/*#################################################################################################
   + gfnLeft(sString, iLength)
   - Arguments      : 2 (sString, iLength)
   - Return         : String
   - Usage          :
   - Content        :
         Left       : Returns a String containing a specified number of characters from the left side of a string.
         Parameters :
                      String = String expression from which the leftmost characters are returned.
                               If string contains null, false is returned.
                      Length = Numeric expression indicating how many characters to return.
                               If 0, a zero-length string ("") is returned.
                               If greater than or equal to the number of characters in string, the entire string is returned.
#################################################################################################*/
   function gfnLeft(sString, iLength){
      try{
         if(sString == null || sString == ""){
            return ("");
         }
         return sString.substr(0, iLength);
      }catch(e){
         gfnMsg(e, "gfnLeft");
      }
   }
/*#################################################################################################
   + gfnRight(sString, iLength)
   - Arguments      : 2 (sString, iLength)
   - Return         : String
   - Usage          :
   - Content        :
         Right      : Returns a String containing a specified number of
                     characters from the right side of a string.
         Parameters :
                     String = String expression from which the leftmost characters are returned.
                              If string contains null, false is returned.
                     Length = Numeric expression indicating how many characters to return.
                              If 0, a zero-length string ("") is returned.
                              If greater than or equal to the number of characters in string, the entire string is returned.
#################################################################################################*/
   function gfnRight(sString, iLength){
      try{
         if(sString == null || sString == ""){
            return ("");
         }
         var sdest = "";
         for (var i = (sString.length - 1); i >= 0; i--){
            sdest = sdest + sString.charAt(i);
         }
         sString = sdest;
         sString = sString.substr(0, iLength);
         sdest   = "";
         for (var i = (sString.length - 1); i >= 0; i--){
            sdest = sdest + sString.charAt(i);
         }
         return sdest;
      }catch(e){
         gfnMsg(e, "gfnRight");
      }
   }
/*#################################################################################################
   + gfnMid(sString, iStart, iLength)
   - Arguments      : 3 (sString, iStart, iLength)
   - Return         : String
   - Usage          :
   - Content        :
         Mid        : Returns a String containing a specified number of characters from a string
         Parameters :
                     String = String expression from which characters are returned.
                              If string contains null, false is returned.
                     Start  = Number. Character position in string at which the part to be taken begins.
                              If Start is greater than the number of characters in
                              string, Mid returns a zero-length string ("").
                     Length = Number of characters to return. If omitted false is returned.
#################################################################################################*/
   function gfnMid(sString, iStart, iLength){
      try{
         if(sString == null || sString == ""){
            return ("");
         }
         if (iStart > sString.length)
            return ("");
         if (arguments.length == 2)
            return sString.substr((iStart - 1), sString.length - (iStart - 1));
         if (iLength == null || iLength.length == 0)
            return (false);
         return sString.substr((iStart - 1), iLength);
      }catch(e){
         gfnMsg(e, "gfnMid");
      }
   }
/*#################################################################################################
   + gfnReplace(sString, sFind, sReplace)
   - Arguments      : 3 (sString, sFind, sReplace)
   - Return         : String
   - Usage          :
   - Content        :
            Replace : Returns a string in which a specified substring has been replaced
                      with another substring a specified number of times.
            Parameters:
                     Expression = String expression containing substring to
            replace
            Find       = Substring being searched for.
            Replace    = Replacement substring.
#################################################################################################*/
   function gfnReplace(sString, sFind, sReplace){
      try{
         if (sString == null) return "";
         var stemp = sString;
         var a = 0;
         for (var i = 0; i < sString.length; i++) {
         a = stemp.indexOf(sFind);
         if (a == -1)
            break;
         else
            stemp = stemp.substring(0, a) + sReplace + stemp.substring((a + sFind.length));
         }
         return stemp;
      }catch(e){
         gfnMsg(e, "gfnReplace");
      }
   }
/*#################################################################################################
   + gfnChr(sCharCode)
   - Arguments      : 1 (sCharCode Characte)
   - Return         : String
   - Usage          :
   - Content        :
            Chr     : Returns a String containing the character associated with the specified character code.
            Parameters:
               CharCode = Long that identifies a character.
#################################################################################################*/
   function gfnChr(sCharCode){
      try{
         return String.fromCharCode(sCharCode);
      }catch(e){
         gfnMsg(e, "gfnChr");
      }
   }
/*#################################################################################################
   + gfnAsc(sString)
   - Arguments      : 1 (sString String)
   - Return         : CharCode
   - Usage          :
   - Content        :
     Asc: Returns an Integer representing the character code
          corresponding to the first letter in a string
     Parameters:
         String = The required string argument is any valid
                  string expression. If the string if not in
                  the range 32-126, the function return ZERO
#################################################################################################*/
   function gfnAsc(sString){
      try{
         var sSymbols = " !\"#$%&'()*+'-./0123456789:;<=>?@";
         var loAZ = "abcdefghijklmnopqrstuvwxyz";
         sSymbols += loAZ.toUpperCase();
         sSymbols += "[\\]^_`";
         sSymbols += loAZ;
         sSymbols += "{|}~";
         var loc;
         loc = sSymbols.indexOf(sString);
         if (loc > -1){
            Ascii_Decimal = 32 + loc;
            return (32 + loc);
         }
         return (0);
      }catch(e){
         gfnMsg(e, "gfnAsc");
      }
   }
/*#################################################################################################
   + gfnSpace()
   - Arguments  : Number = Number of spaces you want in the string.
   - Return     : String
   - Usage      :
   - Content    : Returns a String consisting of the specified number of spaces
#################################################################################################*/
   function gfnSpace(iNumber){
      try{
         var sStr = "";
         if(iNumber < 1){
            return "";
         }
         for(var i = 0; i < iNumber; i++){
            sStr = sStr + " ";
         }
         return sStr;
      }catch(e){
         gfnMsg(e, "gfnSpace");
      }
   }
/*#################################################################################################
   + gfnInStr()
   - Arguments  : (sString String, sString String)
   - Return     : Integer
   - Usage      :
   - Content    : Returns a Long specifying the position of the first occurrence of one string within another.
                  Is sString1 or sString2 are null, false is returned.
#################################################################################################*/
   function gfnInStr(sString1, sString2){
      try{
         var index = 0;

         if(sString1 == null || sString2 == null){
            return -1;
         }

         sString1 = sString1.toLowerCase();
         sString2 = sString2.toLowerCase();

         index = sString1.indexOf(sString2);
         if(index == -1){
            return (0);
         }else{
            return (index + 1);
         }
      }catch(e){
         gfnMsg(e, "gfnInStr");
      }
   }
/*#################################################################################################
   + gfnInStrRev()
   - Arguments  : (sString String, sString String)
   - Return     : Integer
   - Usage      :
   - Content    : Returns a Long specifying the position of the first occurrence of one string within another.
                  Is sString1 or sString2 are null, false is returned.
#################################################################################################*/
   function gfnInStrRev(sString1, sString2){
      try{
         var index = 0;

         if(sString1 == null || sString2 == null){
            return -1;
         }

         sString1 = sString1.toLowerCase();
         sString2 = sString2.toLowerCase();

         index = sString1.lastIndexOf(sString2);
         if(index == -1){
            return (0);
         }else{
            return (index + 1);
         }
      }catch(e){
         gfnMsg(e, "gfnInStrRev");
      }
   }
/*#################################################################################################
   + gfnCharLength()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
   function gfnCharLength(sCharString){
      try{
         var iCharLen = 0;
         var sCharStr = (typeof(sCharString) == "string") ? sCharString : "";
         iCharLen = sCharStr.length+(escape(sCharStr)+"%u").match(/%u/g).length-1;

         return iCharLen;
         /*
         var sChar;
         var iCharLen = 0;
         for(var i=0;i<sCharString.length;i++){
            sChar = sCharString.charAt(i);
            if(escape(sChar).length > 4){iCharLen += 2;
            }else{iCharLen++;}
         }
         */
      }catch(e){
         return sCharString.length;
         gfnMsg(e, "gfnCharLength");
      }
   }

/*#################################################################################################
   + gfnSetWinSize()
   - Arguments      :
   - Return         :
   - Usage          :
   - Content        :
#################################################################################################*/
   function gfnSetWinSize(iWidth, iHeight, iLeft, iTop){
      try{
         var iScreenWidth  = self.window.screen.availWidth;
         var iScreenHeight = self.window.screen.availHeight;
         var iWinWidth     = (typeof(iWidth)  == "undefined")?iScreenWidth:iWidth;
         var iWinHeight    = (typeof(iHeight) == "undefined")?iScreenHeight:iHeight;
         var iWinPositionX = (typeof(iLeft)   == "undefined")?0:iLeft;
         var iWinPositionY = (typeof(iTop)    == "undefined")?0:iTop;
         //alert("self : "+self.window.name + "\rtop : " + top.window.name);
         if(iWinWidth >= iScreenWidth){
            iWinWidth     = iScreenWidth;
            iWinPositionX = 0;
         }else{
            if(iWinPositionX + iWinWidth >= iScreenWidth){
               iWinWidth     = iScreenWidth - iWinPositionX;
               iWinPositionX = 0;
            }else{
               iWinPositionX = parseInt((iScreenWidth - iWinWidth)/2);
            }
         }
         if(iWinHeight >= iScreenHeight){
            iWinHeight    = iScreenHeight;
            iWinPositionY = 0;
         }else{
            if(iWinPositionY + iWinHeight >= iScreenHeight){
               iWinHeight     = iScreenHeight - iWinPositionY;
               iWinPositionY = 0;
            }else{
               iWinPositionY = parseInt((iScreenHeight - iWinHeight)/2);
            }
         }

         self.window.focus();
         if(typeof(self.window.dialogHeight) == "undefined"){
            self.window.resizeTo(iWinWidth, iWinHeight);
            self.window.moveTo(iWinPositionX,iWinPositionY);
         }else{
            self.window.dialogWidth  = iWinWidth  + "px";
            self.window.dialogHeight = iWinHeight + "px";
            self.window.dialogLeft   = iWinPositionX + "px";
            self.window.dialogTop    = iWinPositionY + "px";
         }
      }catch(e){
         //gfnMsg(e, "gfnSetWinSize");
      }
   }
/*#################################################################################################
   + gfnCheckDate(sDate)
   - Arguments  : 1 (Date String)
   - Return     : Boolean(true, false)
   - Usage      : gfnCheckDate('2002.01.01')
   - Content    : 인자로 넘겨준 문자열이 날짜 형식이 가능한 Format이 맞는지를 Check해서 (True/False)
                  를 Return한다.
#################################################################################################*/
   function gfnCheckDate(sDate){
      try{
         var sChrCode = "";
         sDate = sDate.replace(".","").replace(".","").replace("-","").replace("-","");
         for(var i=0;i<sDate.length;i++){
            sChrCode = sDate.charAt(i);
            if(!(sChrCode>="0" && sChrCode<="9")){
               return false;
               break;
            }
         }
         if(sDate.length != 8){
            return false;
         }else{
            var sYear  = sDate.substring(0, 4);
            var sMonth = sDate.substring(4, 6);
            var sDay   = sDate.substring(6, 8);
            if(sMonth < 1 || sMonth > 12)
               return false;
            if(sDay < 1 || sDay > 31)
               return false;
            if(sYear < 0 || sYear > 9999)
               return false;
            if(sMonth == 4 || sMonth == 6 || sMonth == 9 || sMonth == 11){
               if(sDay == 31)
                  return false;
            }
            if(sMonth == 2){
               if(isNaN(parseInt(sYear/4)))
                  return false;
               if(sDay > 29)
                  return false;
               if (sDay == 29 && ((sYear/4) != parseInt(sYear/4)))
                  return false;
            }
         }
         return true;
      }catch(e){
         gfnMsg(e, "gfnCheckDate");
         return false;
      }
   }
/*#################################################################################################
   + gfnFormatDateTime(sString, )
   - Arguments      : 1
   - Return         : String
   - Usage          :
   - Content        :
#################################################################################################*/
   function gfnFormatDateTime(sString){
      try{
         if (sString == null || sString <= "") return "";
         var stemp = sString;
         var sDateDigit = ".";
         var sTimeDigit = ":";
         stemp = gfnReplace(stemp,".","");
         stemp = gfnReplace(stemp,",","");
         stemp = gfnReplace(stemp,"-","");
         stemp = gfnReplace(stemp,"/","");
         stemp = gfnReplace(stemp,":","");
         stemp = gfnReplace(stemp,";","");
         stemp = gfnReplace(stemp," ","");
         var sDateStr = "";
         var sTimeStr = "";
         var sDateTimeString = "";
         if(stemp.length == 14){
            sDateStr = gfnLeft(stemp,4)  + sDateDigit + gfnMid(stemp,5,2)  + sDateDigit + gfnMid(stemp,7,2);
            sTimeStr = gfnMid(stemp,9,2) + sTimeDigit + gfnMid(stemp,11,2) + sTimeDigit + gfnMid(stemp,13,2);
            sDateTimeString = sDateStr + " " + sTimeStr;
         }else if(stemp.length == 13){
            var oDate    = new Date(new Number(stemp));
            var sYear    = new String(oDate.getFullYear());
            var sMonth   = new String(oDate.getMonth()+1);
            var sDate    = new String(oDate.getDate());
            var sHour    = new String(oDate.getHours());
            var sMinute  = new String(oDate.getMinutes());
            var sSecound = new String(oDate.getSeconds());

            sMonth   = (sMonth.length   == 2) ? sMonth   : "0"+sMonth  ;
            sDate    = (sDate.length    == 2) ? sDate    : "0"+sDate   ;
            sHour    = (sHour.length    == 2) ? sHour    : "0"+sHour   ;
            sMinute  = (sMinute.length  == 2) ? sMinute  : "0"+sMinute ;
            sSecound = (sSecound.length == 2) ? sSecound : "0"+sSecound;

            sDateStr = sYear + sDateDigit + sMonth  + sDateDigit + sDate;
            sTimeStr = sHour + sTimeDigit + sMinute + sTimeDigit + sSecound;
            sDateTimeString = sDateStr + " " + sTimeStr;
         }else{
            sDateTimeString = sString;
         }

         return sDateTimeString;
      }catch(e){
         gfnMsg(e, "gfnFormatDateTime");
      }
   }

/*#################################################################################################
   + gfnSetFormatDate()
   - Arguments      : sString ('YYYYMMDD')
   - Return         : String  ('YYYY.MM.DD')
   - Usage          :
   - Content        :
#################################################################################################*/
   function gfnSetFormatDate(sString){
      try{
         if (sString == null || sString <= "") return "";
         var stemp = sString;
         var sDateDigit = ".";
         var sTimeDigit = ":";
         stemp = gfnReplace(stemp,".","");
         stemp = gfnReplace(stemp,",","");
         stemp = gfnReplace(stemp,"-","");
         stemp = gfnReplace(stemp,"/","");
         stemp = gfnReplace(stemp,":","");
         stemp = gfnReplace(stemp,";","");
         stemp = gfnReplace(stemp," ","");
         var sDateStr = "";
         if(stemp.length == 8){
            sDateStr = gfnLeft(stemp,4)  + sDateDigit + gfnMid(stemp,5,2)  + sDateDigit + gfnMid(stemp,7,2);
         }

         return sDateStr;
      }catch(e){
         gfnMsg(e, "gfnSetFormatDate");
      }
   }

/*#################################################################################################
   + gfnFormatDate(sChrDigit)
   - Arguments  : 1 (Character String)
   - Return     :
   - Usage      : gfnFormatDate('.')
   - Content    : Input Type의 Element의 KeyUp Event에 함수를 적용하면 해당 Element에 KeyIn을 하면
                  자동으로 'YYYY.MM.DD'의 날짜 Format에 맞는 Mask를 적용할 수 있다.
#################################################################################################*/
   function gfnFormatDate(sChrDigit){
      try{
         if ((event.keyCode==9)||(event.keyCode==16)){
            //event.srcElement.select();
         }else{
            if(!(((event.keyCode>=35)&&(event.keyCode<=40))||(event.keyCode==8))){
               var oEventElement = event.srcElement;
               var sValue  = oEventElement.value ;
               var aValue  = sValue.split(sChrDigit);
               var sValue  = aValue.join("");
               switch(sValue.length){
                  case 4:
                     oEventElement.value = sValue + sChrDigit;
                     break;
                  case 6:
                     sValue = sValue.substring(0,4) + sChrDigit + sValue.substring(4,6) + sChrDigit;
                     oEventElement.value = sValue;
                     break;
                  case 8: case 9: case 10:
                     sValue = sValue.substring(0,4) + sChrDigit + sValue.substring(4,6) + sChrDigit + sValue.substring(6,8);
                     oEventElement.value = sValue;
                     //추가(2003.09.03, 허진규)
                     oEventElement.fireEvent("onchange");
                     break;
               }
            }
         }
      }catch(e){
         gfnMsg(e, "gfnFormatDate");
      }
   }

/*#################################################################################################
   + gfnFormatNumber(sNum, nDigit)
   - Arguments  : 2 (Character String)
   - Return     :
   - Usage      : gfnFormatNumber("123456.22", "0")
   - Content    : 숫자포맷 세팅
#################################################################################################*/
   function gfnFormatNumber(sNum, nDigit){
      try{
         if (nDigit == null){ nDigit = 0;}
         var dec_point     = ".";
         var thousands_sep = ",";

         var nRoundNum = Number(sNum.toString().replace(/[^-\.\+\d]/g,'')).toFixed(nDigit);
         var arr = nRoundNum.toString().split(dec_point);
         arr[0] = arr[0].replace(/(\d)(?=(?:\d{3})+(?!\d))/g,'$1'+thousands_sep);
         if (arr.length == 1) {
            return arr[0];
         }
         else {
            return arr[0] + dec_point + arr[1];
         }
      }catch(e){
         gfnMsg(e, "gfnFormatNumber");
      }
   }
/*#################################################################################################
   + gfnFormatUCost(sNum, nDigit)
   - Arguments  : 2 (Character String)
   - Return     :
   - Usage      : gfnFormatUCost("123456.22", "0")
   - Content    : 단가포맷 세팅
#################################################################################################*/
   function gfnFormatUCost(sNum, nDigit){
      try{
         if (nDigit == null){ nDigit = 0;}
         var dec_point     = ".";
         var thousands_sep = ",";

         var nRoundNum = Number(sNum.toString().replace(/[^-\.\+\d]/g,'')).toFixed(4);
         var arr = nRoundNum.toString().split(dec_point);
         arr[0] = arr[0].replace(/(\d)(?=(?:\d{3})+(?!\d))/g,'$1'+thousands_sep);

         for (var i=arr[1].length; i > nDigit; i--){
             if (arr[1].substring(i-1, i) == "0") {
                 arr[1] = gfnLeft(arr[1], i-1);
             }
             else 
               break;
         }

         if (nDigit == 0 && arr[1].length == 0) {
            return arr[0];
         }
         else {
            return arr[0] + dec_point + arr[1];
         }
      }catch(e){
         gfnMsg(e, "gfnFormatUCost");
      }
   }
/*#################################################################################################
   + gfnOpenCalendar(sFormElement, sChrDigit)
   - Arguments  : 2 (Element Object String, Division Character String)
   - Return     :
   - Usage      : gfnOpenCalendar('tform.t_date_from', '.')
   - Content    : Input Type의 Element의 doubleclick Event에 함수를 적용하면 Calendar Window가 Open
                  되고 해당 날짜를 선택하면 doubleclick한 Element에 날짜가 입력된다.
#################################################################################################*/
   function gfnOpenCalendar(sFormElement, sChrDigit, sExeFnNm, event){
      try{
         if (sExeFnNm == null)  sExeFnNm  = "";

		 var evt           = (window.event ? window.event : event);
         var iXposition    = evt.screenX - 70;
         var iYposition    = evt.screenY + 17;
         var oEventElement = eval(sFormElement);
         var sDateValue    = oEventElement.value;
         var sStrurl       = gs_IncludeVirPath + "/sys_calendar.asp?dtloc=" + sFormElement + "&gb=" + sChrDigit + "&c_dt=" + sDateValue + "&fn=" + sExeFnNm;
         if (gs_BrowserType == "M") {
           var sFeatures     = "dialogWidth:300px;dialogHeight:200px;dialogTop:"+iYposition+";dialogLeft:"+iXposition+";dialogscrollbars:no;status:no;resizable: Yes;help:no;";
           var sFormatDate   = window.showModalDialog(sStrurl, self.window, sFeatures);
         }
         else {
           var sStatus = "scrollbars=no, status=no, historycopy=no, resizable=yes, width=300, height=200, left=" + iXposition + ", top=" + iYposition;
           var hWin    = window.open(sStrurl, "Calendar", sStatus);
         }
      }catch(e){
         gfnMsg(e, "gfnOpenCalendar");
      }
   }

/*#################################################################################################
   + gfnSetDate()
   - Arguments  : (Object)
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
   var ls_CalendarWinOpenYn = "N";
   function gfnSetDate(oObject, bNotNull){
      try{
         var iRowsIndex = gfnGetIndex(oObject);
         var sDate      = "document.all." + oObject.name;
         var oDate      = eval(sDate);

         if(iRowsIndex != null){
            oDate     = oDate[iRowsIndex];
            sDate     = sDate+"[" + iRowsIndex + "]";
         }

         var sEventType = event.type;
         var iEventCode = event.keyCode;

         switch (sEventType.toLowerCase()) {
            case "focus" :
               oDate.select();
               break;
            case "keypress" :
            if(iEventCode>=48 && iEventCode<=57 ){return;}
               event.returnValue=false;
               break;
            case "keyup" :
               if(!((event.keyCode==8  || event.keyCode==46) ||
                    (event.keyCode>=48 && event.keyCode<=57) ||
                    (event.keyCode>=65 && event.keyCode<=90) ||
                    (event.keyCode>=96 && event.keyCode<=105))){return;}
               gfnFormatDate('.');
               break;
            case "dblclick" :
               ls_CalendarWinOpenYn = "Y";
               gfnOpenCalendar(sDate,'.');
               ls_CalendarWinOpenYn = "N";
               break;
            case "blur" :
               if(oDate.value != oDate.defaultValue  && bNotNull){
                  if(ls_CalendarWinOpenYn != "Y"){
                     if(!gfnCheckDate(oDate.value)){
                        alert("※ Date Type[0000.00.00] 날짜 형식에 맞지않습니다.");
//                        oDate.value = oDate.defaultValue;
                        oDate.select();
                        return;
                     }
                  }
               }
               break;
            default :
               break;
         }
      }catch(e){
         gfnMsg(e, "gfnSetDate");
      }
   }

/*#################################################################################################
   + gfnChkValidDate()
   - Arguments  : (Object)
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
   function gfnChkValidDate(obj, bNotNull){
      try{
         if (bNotNull == null) bNotNull = false;
         var fn = function(){
             gfnSetDate(obj, bNotNull);
             }
         obj.onclick     = fn;
//         obj.ondblclick  = fn;
         obj.onblur      = fn;
         obj.onkeydown   = fn;
         obj.onkeypress  = fn;
         obj.onkeyup     = fn;
         obj.onchange    = fn;
//         obj.onmouseover = fn;
//         obj.onmousemove = fn;
         obj.onfocus     = null;
         obj.onfocus     = fn;
//alert(obj.value);
      }catch(e){
         gfnMsg(e, "gfnChkValidDate");
      }
   }

/*#################################################################################################
   + gfnAddDate()
   - Arguments  : sDate("YYYY" + sGbn + "MM" + sGbn + "DD" 형태), nDayCnt
   - Return     :
   - Usage      :
   - Content    : 날짜 더하기
#################################################################################################*/
  function gfnAddDate(sDate, nDayCnt, sGbn){
    try{
      var arrDate = sDate.split(sGbn);
      var yyyy  = arrDate[0]; 
      var mm    = arrDate[1]; 
      var dd    = arrDate[2]; 

      var oDate;                      // 날짜 객체 선언
      dd = dd * 1 + nDayCnt * 1;      // 날짜 계산
      mm--;                           // 월은 0~11 이므로 하나 빼준다
      oDate = new Date(yyyy, mm, dd)  // 계산된 날짜 객체 생성 (객체에서 자동 계산)

      yyyy  = oDate.getFullYear();
      mm    = oDate.getMonth() + 1;
      dd    = oDate.getDate();

      return yyyy + sGbn + gfnRight("0" + mm, 2) + sGbn + gfnRight("0" + dd, 2);

    }catch(e){
      gfnMsg(e, "gfnAddDate");
    }
  }

/*#################################################################################################
   + gfnAddMonth()
   - Arguments  : sDate("YYYY-MM-DD" 형태), nDayCnt
   - Return     :
   - Usage      :
   - Content    : 날짜 더하기
#################################################################################################*/
  function gfnAddMonth(sDate, nMonthCnt, sGbn){
    try{
      var arrDate = sDate.split(sGbn);
      var yyyy  = arrDate[0]; 
      var mm    = arrDate[1]; 
      var dd    = arrDate[2]; 

      var cDate;                    // 계산에 사용할 날짜 객체 선언
      var oDate;                    // 리턴할 날짜 객체 선언
      var cYear, cMonth, cDay       // 계산된 날짜값이 할당될 변수

      mm = mm * 1 + ((nMonthCnt * 1) - 1);           // 월은 0~11 이므로 하나 빼준다
      cDate = new Date(yyyy, mm, dd)              // 계산된 날짜 객체 생성 (객체에서 자동 계산)

      cYear   = cDate.getFullYear(); // 계산된 년도 할당
      cMonth  = cDate.getMonth(); // 계산된 월 할당
      cDay    = cDate.getDate(); // 계산된 일자 할당
      oDate   = (dd == cDay) ? cDate : new Date(cYear, cMonth, 0); // 넘어간 월의 첫쨋날 에서 하루를 뺀 날짜 객체를 생성한다.

      yyyy  = oDate.getFullYear();
      mm    = oDate.getMonth() + 1;
      dd    = oDate.getDate();

      return yyyy + sGbn + gfnRight("0" + mm, 2) + sGbn + gfnRight("0" + dd, 2);

    }catch(e){
      gfnMsg(e, "gfnAddMonth");
    }
  }

/*#################################################################################################
   + gfnHtmlToText()
   - Arguments  : HtmlValue String
   - Return     : TextValue String
   - Usage      : gfnHtmlToText(oNamoWec.BodyValue)
   - Content    : Namo 편집기의 Body Html을 Text만 추출한다.
   - Writer     : 김양수      ==>>
   - Date       : 2003.06.20  ==>>
#################################################################################################*/
   function gfnHtmlToText(sHtmlValue){
      try{
         var sStrip = new RegExp();

         sStrip = /[\r][\n]/gi;
         var sStripString =  sHtmlValue.replace(sStrip, "");
         sStrip = /[<][b][r][>]/gi;
         sStripString =  sStripString.replace(sStrip, "\r\n");
         //sStrip = /[<][p][>]/gi;
         sStrip = new RegExp("[<][p][>]", "gi");
         sStripString =  sStripString.replace(sStrip, "\r\n");
         //sStrip = /[<][/][p][>]/gi;
         sStrip = new RegExp("[<][/][p][>]", "gi");
         sStripString =  sStripString.replace(sStrip, "");
         sStrip = /[<][^>]*[>]/gi;
         var sStripString =  sStripString.replace(sStrip, "");
         sStrip = /[&][a][m][p][;]/gi;
         sStripString =  sStripString.replace(sStrip, "&");
         sStrip = /[&][l][t][;]/gi;
         sStripString =  sStripString.replace(sStrip, "<");
         sStrip = /[&][g][t][;]/gi;
         sStripString =  sStripString.replace(sStrip, ">");
         sStrip = /[&][q][u][o][t][;]/gi;
         sStripString =  sStripString.replace(sStrip, '"');
         sStrip = /[&][#][0][3][9][;]/gi;
         sStripString =  sStripString.replace(sStrip, "'");
         sStrip = /[&][n][b][s][p][;]/gi;
         sStripString =  sStripString.replace(sStrip, " ");
         return sStripString;
      }catch(e){
         gfnMsg(e, "gfnHtmlToText");
      }
   }
/*#################################################################################################
   + gfnTextToHtml()
   - Arguments  : TextValue String
   - Return     : HtmlValue String
   - Usage      : gfnTextToHtml(Textarea.value)
   - Content    : TextArea의 값을 Html로 추출한다.
   - Writer     : 김양수      ==>>
   - Date       : 2003.06.20  ==>>
#################################################################################################*/
   function gfnTextToHtml(sTextValue){
      try{
         var sStrip = new RegExp();
         var sStripString = "";

         //sStrip = /[\r][\n][<][b][r][>]/gi;
         //sStripString =  sTextValue.replace(sStrip, "\r\n");
         //sStrip = /[<][b][r][>][\r][\n]/gi;
         //sStripString =  sStripString.replace(sStrip, "\r\n");
         //sStrip = /[<][b][r][>]/gi;
         //sStripString =  sStripString.replace(sStrip, "\r\n");

         sStrip = /[&]/gi;
         sStripString =  sTextValue.replace(sStrip, "&amp;");
         sStrip = /[<]/gi;
         sStripString =  sStripString.replace(sStrip, "&lt;");
         sStrip = /[>]/gi;
         sStripString =  sStripString.replace(sStrip, "&gt;");

         sStrip = /[\r][\n]/gi;
         sStripString =  sStripString.replace(sStrip, "<br>\r\n");
         //sStripString =  sStripString.replace(sStrip, "<br>");
         sStrip = /["]/gi;
         sStripString =  sStripString.replace(sStrip, '&quot;');
         sStrip = /[']/gi;
         sStripString =  sStripString.replace(sStrip, "'");
         sStrip = /[ ]/gi;
         sStripString =  sStripString.replace(sStrip, "&nbsp;");
         return sStripString;
      }catch(e){
         gfnMsg(e, "gfnTextToHtml");
      }
   }

/*#################################################################################################
   + gfnTextToHtmlForChat()
   - Arguments  : TextValue String
   - Return     : HtmlValue String
   - Usage      : gfnTextToHtml(Textarea.value)
   - Content    : TextArea의 값을 Html로 추출한다.
#################################################################################################*/
   function gfnTextToHtmlForChat(sTextValue){
      try{
         var sStrip = new RegExp();
         var sStripString = "";

         sStrip = /[&]/gi;
         sStripString =  sTextValue.replace(sStrip, "&amp;");

         sStrip = /[\r][\n]/gi;
         sStripString =  sStripString.replace(sStrip, "<br>\r\n");
         sStrip = /["]/gi;
         sStripString =  sStripString.replace(sStrip, '&quot;');
         sStrip = /[']/gi;
         sStripString =  sStripString.replace(sStrip, "'");
         return sStripString;
      }catch(e){
         gfnMsg(e, "gfnTextToHtmlForChat");
      }
   }
/*#################################################################################################
   + gfnTextToHtml()
   - Arguments  : TextValue String
   - Return     : HtmlValue String
   - Usage      : gfnTextToHtml(Textarea.value)
   - Content    : TextArea의 값을 Html로 추출한다.
   - Writer     : 김양수      ==>>
   - Date       : 2003.06.20  ==>>
#################################################################################################*/
   function gfnTextToXML(sTextValue){
      try{
         var sStrip = new RegExp();
         var sStripString = "";

         sStrip = /[&]/gi;
         sStripString =  sTextValue.replace(sStrip, "&amp;");
         sStrip = /[<]/gi;
         sStripString =  sStripString.replace(sStrip, "&lt;");
         sStrip = /[>]/gi;
         sStripString =  sStripString.replace(sStrip, "&gt;");
         sStrip = /["]/gi;
         sStripString =  sStripString.replace(sStrip, '&quot;');
         sStrip = /[']/gi;
         sStripString =  sStripString.replace(sStrip, "&apos;");
         return sStripString;
      }catch(e){
         gfnMsg(e, "gfnTextToHtml");
      }
   }
/*#################################################################################################
   + gfnCreateContent()
   - Arguments  : Form [Object], TextArea Name [String], MIME Value [String]
   - Return     :
   - Usage      : gfnCreateContent(ofrmdocumentsend, "t_msgbody", oNamoWec.MimeValue);
   - Content    : 첫번째 인자인 Form객체에 두번째 인자의 Textarea Name을 가진 객체를 동적으로 생성.
                  세번째 인자의 NamoWec의 Mime값을 102400으로 나누어 객체를 생성
                  MimeValue의 값의 문자 길이가 102400보다 적으면 객체는 하나만 만들어진다.
                  MimeValue의 값의 문자 길이가 102400보다 많으면 객체는 여러개[배열]로 만들어진다.
   - Writer     : 김양수      ==>>
   - Date       : 2003.06.20  ==>>
#################################################################################################*/
function gfnCreateContent(oForm, sElementName, sHTMMIMELValue){
   try{
      if(gfnCreateContent.length == arguments.length){
         var sHtmlValue = sHTMMIMELValue;
         var iArrayLength = 0, aTextAreaElement = new Array();
         while(sHtmlValue.length > 0){
            aTextAreaElement[iArrayLength] = document.createElement("TEXTAREA");
            aTextAreaElement[iArrayLength].style.display    = "none";
            aTextAreaElement[iArrayLength].style.visibility = "hidden";
            aTextAreaElement[iArrayLength].name   = sElementName;
            aTextAreaElement[iArrayLength].value  = sHtmlValue.substr(0, 102400);
            aTextAreaElement[iArrayLength].width  = "100%";
            aTextAreaElement[iArrayLength].height = "300px";
         oForm.appendChild(aTextAreaElement[iArrayLength]);
            sHtmlValue = sHtmlValue.substr(102400);
            ++iArrayLength;
         }
         return (aTextAreaElement);
      }else{
         alert("[Waring Argument Error!!] Argument Length Is " + gfnCreateContent.length + " !               ");
      }
   }catch(e){
      gfnMsg(e, "gfnCreateContent");
   }
}
/*#################################################################################################
   + gfnRemoveContent()
   - Arguments  : Form [Object], TextArea Name [String]
   - Return     :
   - Usage      : gfnRemoveContent(ofrmdocumentsend, "t_msgbody");
   - Content    : [gfnCreateContent] 함수로 생성한 객체를 Form에서 제거하는 함수
   - Writer     : 김양수      ==>>
   - Date       : 2003.06.20  ==>>
#################################################################################################*/
function gfnRemoveContent(oForm, aElementName){
   try{
      if(gfnRemoveContent.length == arguments.length){
         if(aElementName.length > 0){
            for(var i=aElementName.length-1;i>=0;i--){
               oForm.removeChild(aElementName[i]);
            aElementName.splice(i,1);
            }
         }
      }else{
         alert("[Waring Argument Error!!] Argument Length Is " + gfnRemoveContent.length + " !               ");
      }
   }catch(e){
      gfnMsg(e, "gfnRemoveContent");
   }
}
/*#################################################################################################
   + gfnSetProgressClockTimer()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
   function gfnSetProgressClockTimer(){
      try{
         //xyz = 0;
         //window.status = window.status + " " + ++xyz;
         var oDate     = new Date();
         var lTimeGap = oDate.getTime() - go_ProgressPopup.oTime;
         var bNegaTive = false, sTimeString = "";
         if(lTimeGap < 0){
            bNegaTive = true;
            lTimeGap = Math.abs(lTimeGap);
         }else{
            bNegaTive = false;
         }

         var lTimeMinMilliSecond = 1000 * 60;
         var lTimeHorMilliSecond  = lTimeMinMilliSecond * 60;
         var lTimeDayMilliSecond  = lTimeHorMilliSecond * 24;

         var fDays  = (lTimeGap / lTimeDayMilliSecond);
         var sDays  = Math.floor(fDays);
         var tmptime= (lTimeGap % lTimeDayMilliSecond);
         var fTimes = (tmptime / lTimeHorMilliSecond);
         var sTimes = Math.floor(fTimes);
         var tmptime= (tmptime % lTimeHorMilliSecond);
         var fMinute= (tmptime / lTimeMinMilliSecond);
         var sMinute= Math.floor(fMinute);
         var tmptime= (tmptime % lTimeMinMilliSecond);
         var fSecond= Math.floor(tmptime/1000);

         if(sDays == 0){
            sDays = "";
            sDays = (bNegaTive==false)?"":"-";
         }else{
            sDays = (bNegaTive==false)?sDays + "Day ":"-"+sDays+"Day ";
         }
         if (sTimes == 0) {
            sTimes = "00:";
         } else if (sTimes < 12) {
            sTimes = (sTimes < 10)?"0" + sTimes +":":sTimes+":";
         } else if (sTimes >= 12) {
            sTimes = sTimes + ":";
         } else {
            sTimes = sTimes + ":";
         }

         if (sMinute < 10) {
            sMinute = "0"+sMinute+":";
         } else {
            sMinute = sMinute+":";
         }

         if (fSecond < 10) {
            fSecond = "0"+fSecond+" ";
         } else {
            fSecond = fSecond;
         }

         sTimeString = sDays+sTimes+sMinute+fSecond;
         go_ProgressPopup.oClockContainer.innerText = sTimeString;
         go_ProgressPopup.oClockTimer = window.setTimeout("gfnSetProgressClockTimer();", 1000);
      }catch(e){
         go_ProgressPopup.oClockContainer.innerText = sTimeString;
      }
   }
/*#################################################################################################
   + gfnKeyCodeCharNumLimit()
   - Arguments  :
   - Return     :
   - Usage      : onkeypress="gfnKeyCodeCharNumLimit();"
   - Content    : 영문자와 숫자만 입력하기위한 함수.
#################################################################################################*/
   function gfnKeyCodeCharNumLimit(){
      try{
         var iEventCode = event.keyCode;
         if(iEventCode>=48 && iEventCode<=57 ){return;}
         if(iEventCode>=65 && iEventCode<=90 ){return;}
         if(iEventCode==36){return;}
         if(iEventCode>=97 && iEventCode<=122){event.keyCode = event.keyCode - 32;return;}
         event.returnValue=false;
      }catch(e){
         gfnMsg(e, "gfnKeyCodeCharNumLimit");
      }
   }
/*#################################################################################################
   + gfnKeyCodeNumLimit()
   - Arguments  :
   - Return     :
   - Usage      : onkeypress="gfnKeyCodeNumLimit();"
   - Content    :  숫자만 입력하기위한 함수.
#################################################################################################*/
   function gfnKeyCodeNumLimit(e){
      try{
         var event = window.event || e;
         var iEventCode = event.which || event.keyCode;

         if(iEventCode>=48 && iEventCode<=57 || iEventCode == 8){return;}

         if (window.netscape)
           event.preventDefault();
         else 
           event.returnValue=false;
      }catch(e){
         gfnMsg(e, "gfnKeyCodeNumLimit");
      }
   }
/*#################################################################################################
   + gfnKeyCodeNumCommaLimit()
   - Arguments  :
   - Return     :
   - Usage      : onkeypress="gfnKeyCodeNumCommaLimit();"
   - Content    :  숫자&콤마 만 입력하기위한 함수.
#################################################################################################*/
   function gfnKeyCodeNumCommaLimit(e){
      try{
         var event = window.event || e;
         var iEventCode = event.which || event.keyCode;

         if(iEventCode>=48 && iEventCode<=57 || iEventCode == 8 || iEventCode == 46){return;}
//         if(iEventCode>=48 && iEventCode<=57 || iEventCode == 8 || iEventCode == 37 || iEventCode == 39 || iEventCode == 46){return;}

         if (window.netscape)
           event.preventDefault();
         else 
           event.returnValue=false;
      }catch(e){
         gfnMsg(e, "gfnKeyCodeNumCommaLimit");
      }
   }
/*#################################################################################################
   + gfnKeyCodeCharLimit()
   - Arguments  :
   - Return     :
   - Usage      : onkeypress="gfnKeyCodeCharLimit();"
   - Content    : 영문자(대문자)만 입력하기위한 함수.
#################################################################################################*/
   function gfnKeyCodeCharLimit(e){
      try{
         var event = window.event || e;

         var iEventCode = event.keyCode;
         if(iEventCode==36){return;}
         if(iEventCode>=65 && iEventCode<=90 ){return;}
         if(iEventCode>=97 && iEventCode<=122){event.keyCode = event.keyCode - 32;return;}
         event.returnValue=false;
      }catch(e){
         gfnMsg(e, "gfnKeyCodeCharLimit");
      }
   }
/*#################################################################################################
   + gfnGetIndex()
   - Arguments      :
   - Return         :
   - Usage          :
   - Content        :
#################################################################################################*/
   function gfnGetIndex(oObject){
      try{
         if(oObject.name > ''){
            var oDocElement = document.getElementsByName(oObject.name); //eval("document.all." + oObject.name);
         }else if(oObject.id > ''){
            var oDocElement = gfnGetElementsById(oObject.id);   //eval("document.all." + oObject.id);
         }else{
            return null;
         }
/*
         if(!(oDocElement.length) || oDocElement.length == null){
            return null;
         }else 
*/
         if(oDocElement.length > 1){
            for(var i=0;i<oDocElement.length;i++){
               if(oDocElement[i] == oObject){return (i);break;}
            }
         }
         else 
            return null;

      }catch(e){
         gfnMsg(e, "gfnGetIndex");
      }
   }

/*#################################################################################################
   + gfnGetIndexByValue()
   - Arguments      :
   - Return         :
   - Usage          :
   - Content        :
#################################################################################################*/
   function gfnGetIndexByValue(oObject, sValue){
      try{
         for(var i=0;i<oObject.length;i++){
            if(oObject[i].value == sValue){return (i);break;}
         }
      }catch(e){
         gfnMsg(e, "gfnGetIndexByValue");
      }
   }
/*#################################################################################################
   + gfnSetColor(oObjCode, oObjLov, oObjDesc, sDefaultColor)
   - Arguments  : 4 (oObjCode String, oObjLov String, oObjDesc String, sDefaultColor String)
   - Return     :
   - Usage      : gfnSetColor(oObjCode, oObjLov, oObjDesc, sDefaultColor);
                  gfnSetColor(oObjCode, oObjLov, oObjDesc, sDefaultColor)
                  gfnSetColor(oObjCode, oObjLov, oObjDesc, sDefaultColor)
                  gfnSetColor(oObjCode, oObjLov, oObjDesc, sDefaultColor)
   - Content    : 코드검색하는 Element(Code, Lov, Description)의 Value가 변경되었을때 Color를 변경
                  하는 함수.
#################################################################################################*/
   function gfnSetColor(oObjCode, oObjLov, oObjDesc, sDefaultColor){
      try{
         var bchangeValue = false;
         var schangeColor = "#FFCC99";
         var soldColor    = "transparent";
         var stagName     = oObjCode.tagName.toLowerCase();
         if(sDefaultColor != null && sDefaultColor != ""){
            soldColor = sDefaultColor;
         }
         if(arguments.length >= 1){
            if(stagName == "input"){
               var stagType = oObjCode.type.toLowerCase();
               if(stagType == "text"){
                  if(oObjCode.value != oObjCode.defaultValue){
                     bchangeValue = true;
                  }
               }else if(stagType == "radio" || stagType == "checkbox"){
                  if(oObjCode.checked != oObjCode.defaultChecked){
                     bchangeValue = true;
                  }
               }
            }else if(stagName == "select"){
               if(oObjCode.options[oObjCode.selectedIndex].defaultSelected != true){
                  bchangeValue = true;
               }
            }else if(stagName == "textarea"){
               if(oObjCode.value != oObjCode.defaultValue){
                  bchangeValue = true;
               }
            }
         }

         if(arguments.length >= 1){
            if(bchangeValue == true){
               oObjCode.style.backgroundColor = schangeColor;
               if(arguments.length >= 2 && typeof(oObjLov) == "object"){
                  oObjLov.style.backgroundColor  = schangeColor;
                  if(arguments.length >= 3 && typeof(oObjDesc) == "object"){
                     oObjDesc.style.backgroundColor  = schangeColor;
                  }
               }
            }else{
               if(stagName == "textarea"){
                  oObjCode.style.backgroundColor = "#FFFFFF";
               }else{
                  oObjCode.style.backgroundColor = soldColor;
               }
               if(arguments.length >= 2 && typeof(oObjLov) == "object"){
                  oObjLov.style.backgroundColor  = soldColor;
                  if(arguments.length >= 3 && typeof(oObjDesc) == "object"){
                     oObjDesc.style.backgroundColor  = soldColor;
                  }
               }
            }
         }
      }catch(e){
         gfnMsg(e, "gfnSetColor");
      }
   }
/*#################################################################################################
   + gfnSetTextColor(oObjCode, sDefaultColor)
   - Arguments  : 4 (oObjCode String, sDefaultColor String)
   - Return     :
   - Usage      : gfnSetTextColor(oObjCode, sDefaultColor);
                  gfnSetTextColor(oObjCode, sDefaultColor)
                  gfnSetTextColor(oObjCode, sDefaultColor)
                  gfnSetTextColor(oObjCode, sDefaultColor)
   - Content    : 코드검색하는 Element(Code)의 Value가 변경되었을때 Text Color를 변경
                  하는 함수.
#################################################################################################*/
   function gfnSetTextColor(oObjCode, sDefaultColor){
      try{
         var stagType;
         var bchangeValue = false;
         var schangeColor = "#0000FF";
         var soldColor    = "#000000";
         var stagName     = oObjCode.tagName.toLowerCase();
         if(!(sDefaultColor != null || sDefaultColor != "")){
            soldColor = sDefaultColor;
         }

         if(arguments.length >= 1){
            if(stagName == "input"){
               stagType = oObjCode.type.toLowerCase();
               if(stagType == "text"){
                  if(oObjCode.value != oObjCode.defaultValue){
                     bchangeValue = true;
                  }
               }else if(stagType == "radio" || stagType == "checkbox"){
                  if(oObjCode.checked != oObjCode.defaultChecked){
                     bchangeValue = true;
                  }
               }
            }else if(stagName == "select"){
               stagType = oObjCode.type.toLowerCase();
               if(stagType == "select-one"){
                  if(oObjCode.options[oObjCode.selectedIndex].defaultSelected != true){
                     bchangeValue = true;
                  }
               }else if(stagType == "select-multiple"){
                  if(oObjCode.options.length > 0){
                     for(var i=0;i<oObjCode.options.length;i++){
                        if(oObjCode.options[i].defaultSelected != true){
                           bchangeValue = true;
                           break;
                        }
                     }
                  }
               }
            }else if(stagName == "textarea"){
               if(oObjCode.value != oObjCode.defaultValue){
                  bchangeValue = true;
               }
            }
         }

         if(arguments.length >= 1){
            if(bchangeValue == true){
               if(stagName == "select"){
                  if(stagType == "select-one"){
                     oObjCode.options[oObjCode.selectedIndex].style.color = schangeColor;
                  }else{
                     if(oObjCode.options.length > 0){
                        for(var i=0;i<oObjCode.options.length;i++){
                           if(oObjCode.options[i].defaultSelected != true){
                              oObjCode.options[i].style.color = schangeColor;
                           }
                        }
                     }
                  }
               }else{
                  oObjCode.style.color = schangeColor;
               }
            }else{
               if(stagName == "select"){
                  if(stagType == "select-one"){
                     oObjCode.options[oObjCode.selectedIndex].style.color = soldColor;
                  }else{
                     if(oObjCode.options.length > 0){
                        for(var i=0;i<oObjCode.options.length;i++){
                           if(oObjCode.options[i].defaultSelected == true){
                              oObjCode.options[i].style.color = soldColor;
                           }
                        }
                     }
                  }
               }else{
                  oObjCode.style.color = soldColor;
               }
            }
         }
      }catch(e){
         gfnMsg(e, "gfnSetTextColor");
      }
   }
/*#################################################################################################
   + gfnSetRowColor(oTrRow, sColor)
   - Arguments      : 2 (TR Object, Color String)
   - Return         :
   - Usage          :
   - Content        : 선택한 Record의 색생을 인자로 받은 Color로 변경하는 함수
#################################################################################################*/
   function gfnSetRowColor(oTrRow, sColor){
      try{
         var oTable, oCells, oTr, sTagName;
         var oCells = oTrRow.children;
         oTrRow.style.backgroundColor = sColor;
         if(oCells.length == 1){
            oTable   = oCells[0].children[0];
            if(oTable.tagName.toLowerCase() == "table"){
               sTagName = oTable.children[0].tagName.toLowerCase();
               if(sTagName == "tbody"){
                  oTr = oTable.children[0].rows;
                }else if(sTagName == "tr"){
                  oTr = oTable.children;
               }
                for(var i=0;i<oTr.length;i++){
                   gfnSetRowColor(oTr[i], sColor);
               }
            }
         }
      }catch(e){
         gfnMsg(e, "gfnSetRowColor");
      }
   }
/*#################################################################################################
   + gfnSetPageInfoList(oPageContainer)
   - Argument :
   - Return   :
   - Usage    : gfnSetPageInfoList(oPageContainer);
   - Content  : 화면 하단에 페이지의 정보를 나타낸다.
                var oPageContainer = new Object();
                    oPageContainer.sPageInfo   = "oPageInfo1";
                    oPageContainer.sPageList   = "oPageList1";
                    oPageContainer.sWinName    = ls_WindowName;
                    oPageContainer.sFunction   = "lfnPageMove";
                    oPageContainer.iTotalCount = parseInt(lo_ListForm.h_record_count.value);
                    oPageContainer.iPageCount  = parseInt(lo_ListForm.h_page_count.value);
                    oPageContainer.iPageSize   = parseInt(lo_ListForm.h_page_size.value);
                    oPageContainer.iCurPage    = parseInt(lo_ListForm.h_current_page.value);
                lo_Parent.gfnPageControl(oPageContainer);
#################################################################################################*/
   function gfnSetPageInfoList(oPageContainer){
      try{
         if(gfnSetPageInfoList.length != arguments.length){
            alert("Not Exists [Object] of oPageContainer Type!!.");
            return;
         }
         var sPageList  = "";
         var sPageInfo  = "";
         var sPagePre   = "[Pre 10]";
         var sPageNext  = "[Next 10]";
         var sImagePath = gs_ImageVirPath;

         var iTotCount  = oPageContainer.iTotalCount;
         var iPageCount = oPageContainer.iPageCount;
         var iCurPage   = oPageContainer.iCurPage;
         var iPageSize  = oPageContainer.iPageSize;

         var sGetStrYn  = oPageContainer.sGetStrYn;
         if (sGetStrYn == null) sGetStrYn = "N";

         if(iPageCount >= 1){
            var lStartPage = parseInt((iCurPage - 1)/10)*10 + 1;

            if(lStartPage > 1){
               sPagePre   = "<IMG border=\"0\" src=\"" + sImagePath + "/page_rew_1.gif\"   onmouseover=\"this.src='" + sImagePath + "/page_rew_2.gif';\"   onmouseout=\"this.src='" + sImagePath + "/page_rew_1.gif';\"   align=\"absmiddle\" alt=\"[Pre 10 Page]\">";

               sPageList = sPageList + " <a href=\"JavaScript:" + oPageContainer.sFunction +"(" + (lStartPage - 1) + ");\">" + sPagePre + "</a> ";
            }else{
               sPagePre   = "<IMG border=\"0\" src=\"" + sImagePath + "/page_rew_0.gif\"   align=\"absmiddle\" alt=\"[Pre 10 Page]\">";

               sPageList = sPageList + " " + sPagePre   + " ";
            }

            var j = 1;
            while(j <= 10 && lStartPage <= iPageCount){
               if(lStartPage == iCurPage){
                  sPageList = sPageList + " <font class=\"CurrentPageNo\">[" + lStartPage + "]</font> ";
               }else{
                  sPageList = sPageList + " <a href=\"JavaScript:" + oPageContainer.sFunction +"(" + lStartPage + ");\">[" + lStartPage + "]</a> ";
               }
               ++j;
               ++lStartPage;
            }

            if(lStartPage <= iPageCount){
               sPageNext  = "<IMG border=\"0\" src=\"" + sImagePath + "/page_ff_1.gif\"  onmouseover=\"this.src='" + sImagePath + "/page_ff_2.gif';\"  onmouseout=\"this.src='" + sImagePath + "/page_ff_1.gif';\"  align=\"absmiddle\" alt=\"[Next 10 Page]\">";

               sPageList = sPageList + " <a href=\"JavaScript:" + oPageContainer.sFunction +"(" + (lStartPage) + ");\">" + sPageNext + "</a> ";
            }else{
               sPageNext  = "<IMG border=\"0\" src=\"" + sImagePath + "/page_ff_0.gif\"  align=\"absmiddle\" alt=\"[Next 10 Page]\">";

               sPageList = sPageList + " " + sPageNext + " ";
            }
         }

         if (sGetStrYn == "Y") {
           return sPageList;
         }
         else {
           var oPageList = eval("document.all." + oPageContainer.sPageList);
           oPageList.innerHTML = sPageList;
         }
      }catch(e){
         gfnMsg(e, "gfnSetPageInfoList");
      }
   }

/*#################################################################################################
   + gfnSetPageInfoList2(oPageContainer)
   - Argument :
   - Return   :
   - Usage    : gfnSetPageInfoList2(oPageContainer);
   - Content  : 화면 하단에 페이지의 정보를 나타낸다.
                var oPageContainer = new Object();
                    oPageContainer.sPageInfo   = "oPageInfo1";
                    oPageContainer.sPageList   = "oPageList1";
                    oPageContainer.sWinName    = ls_WindowName;
                    oPageContainer.sFunction   = "lfnPageMove";
                     oPageContainer.sBlockGbn   = lo_ListForm.h_block_gbn.value;
                     oPageContainer.iBlockNum   = lo_ListForm.h_block_num.value;
                     oPageContainer.iMaxKeyVal  = lo_ListForm.h_max_key_val.value;
                     oPageContainer.iMinKeyVal  = lo_ListForm.h_min_key_val.value;
                     oPageContainer.iTotalCount = parseInt(lo_ListForm.h_record_count.value);
                     oPageContainer.iPageCount  = parseInt(lo_ListForm.h_page_count.value);
                     oPageContainer.iPageSize   = parseInt(lo_ListForm.h_page_size.value);
                     oPageContainer.iCurPage    = parseInt(lo_ListForm.h_cur_page.value);
                lo_Parent.gfnPageControl(oPageContainer);
#################################################################################################*/
   function gfnSetPageInfoList2(oPageContainer){
      try{
         if(gfnSetPageInfoList2.length != arguments.length){
            alert("Not Exists [Object] of oPageContainer Type!!.");
            return;
         }
         var sPageList  = "";
         var sPageInfo  = "";
         var sPagePre   = "[Pre 10]";
         var sPageNext  = "[Next 10]";
         var sImagePath = gs_ImageVirPath;

         var iBlockNum  = oPageContainer.iBlockNum;

         var iTotCount  = oPageContainer.iTotalCount;
         var iPageCount = oPageContainer.iPageCount;
         var iCurPage   = oPageContainer.iCurPage;
         var iPageSize  = oPageContainer.iPageSize;

         var sGetStrYn  = oPageContainer.sGetStrYn;
         if (sGetStrYn == null) sGetStrYn = "N";

         if(iPageCount >= 1){
            var lStartPage = parseInt((iCurPage - 1)/10)*10 + 1;

            if(iBlockNum > 1){
               sPagePre   = "<IMG border=\"0\" src=\"" + sImagePath + "/page_rew_1.gif\"   onmouseover=\"this.src='" + sImagePath + "/page_rew_2.gif';\"   onmouseout=\"this.src='" + sImagePath + "/page_rew_1.gif';\"   align=\"absmiddle\" alt=\"[Pre 10 Page]\">";

               sPageList = sPageList + " <a href=\"JavaScript:" + oPageContainer.sFunction +"(10, 'P');\">" + sPagePre + "</a> ";
            }else{
               sPagePre   = "<IMG border=\"0\" src=\"" + sImagePath + "/page_rew_0.gif\"   align=\"absmiddle\" alt=\"[Pre 10 Page]\">";

               sPageList = sPageList + " " + sPagePre   + " ";
            }

            var j = 1;
            while(j <= 10 && lStartPage <= iPageCount){
               if(lStartPage == iCurPage){
                  sPageList = sPageList + " <font class=\"CurrentPageNo\">[" + ((iBlockNum - 1) * 10 + lStartPage) + "]</font> ";
               }else{
                  sPageList = sPageList + " <a href=\"JavaScript:" + oPageContainer.sFunction +"(" + lStartPage + ");\">[" + ((iBlockNum - 1) * 10 + lStartPage) + "]</a> ";
               }
               ++j;
               ++lStartPage;
            }

            if(lStartPage <= iPageCount){
               sPageNext  = "<IMG border=\"0\" src=\"" + sImagePath + "/page_ff_1.gif\"  onmouseover=\"this.src='" + sImagePath + "/page_ff_2.gif';\"  onmouseout=\"this.src='" + sImagePath + "/page_ff_1.gif';\"  align=\"absmiddle\" alt=\"[Next 10 Page]\">";

               sPageList = sPageList + " <a href=\"JavaScript:" + oPageContainer.sFunction +"(1, 'N');\">" + sPageNext + "</a> ";
            }else{
               sPageNext  = "<IMG border=\"0\" src=\"" + sImagePath + "/page_ff_0.gif\"  align=\"absmiddle\" alt=\"[Next 10 Page]\">";

               sPageList = sPageList + " " + sPageNext + " ";
            }
         }

         if (sGetStrYn == "Y") {
           return sPageList;
         }
         else {
           var oPageList = eval("document.all." + oPageContainer.sPageList);
           oPageList.innerHTML = sPageList;
         }

//alert(sPageList);
      }catch(e){
         gfnMsg(e, "gfnSetPageInfoList2");
      }
   }
/*#################################################################################################
   + gfnParameterSubmit(oItemLists, sTarget, sAction)
   - Arguments : (Object, String, String)
   - Return Value   :
   - BY Called
       Objects Name :
   - Action         :
   - Can permit character :
###################################################################################################*/
   function gfnParameterSubmit(oItemLists, sTarget, sAction, sMethod){
      try{
         var oItems, sMethodType;
         var oElementLists = new Array();
         var oParametar    = document.createElement("<div style=\"position:absolute;visibility: hidden;height:0px;width:0px;\"></div>");
         var oFormTag      = document.createElement("<form method='post'></form>");
         oParametar.appendChild(oFormTag);
         if(typeof(sMethod) == "string" && sMethod.toLowerCase() == "get"){
            sMethodType = "get";
         }else{
            sMethodType = "post";
         }
         for(var i=0;i<oItemLists.length;i++){
            if(oItemLists[i].length > 0 ){
               oElementLists[i] = document.createElement("<input type='hidden' name='" + oItemLists[i].ItemName + "'>");
               oElementLists[i].value = oItemLists[i].ItemValue;
               oFormTag.appendChild(oElementLists[i]);
            }
         }
         document.body.appendChild(oParametar);
         oFormTag.target = sTarget;
         oFormTag.action = sAction;
         oFormTag.method = sMethodType;
         oFormTag.submit();
         for(var i=0;i<oElementLists.length;i++){
            oFormTag.removeChild(oElementLists[i]);
         }
         oParametar.removeChild(oFormTag);
         document.body.removeChild(oParametar);
      }catch(e){
         gfnMsg(e, "gfnParameterSubmit");
      }
   }
/*#################################################################################################
   + gfnOpenParameterSubmit()
   - Arguments      :
   - Return Value   :
   - BY Called
       Objects Name :
   - Action         :
   - Can permit character :
#################################################################################################*/
   function gfnOpenParameterSubmit(oItemLists, sTarget, sAction, sProperty, sMethod){
      try{
         var oItems, sMethodType;
         var oElementLists = new Array();
         var oParametar    = document.createElement("<div style=\"position:absolute;visibility: hidden;height:0px;width:0px;\"></div>");
         var oFormTag      = document.createElement("<form method='post'></form>");
         oParametar.appendChild(oFormTag);
         if(typeof(sMethod) == "string" && sMethod.toLowerCase() == "get"){
            sMethodType = "get";
         }else{
            sMethodType = "post";
         }
         for(var i=0;i<oItemLists.length;i++){
            if(oItemLists[i].length > 0 ){
               oElementLists[i] = document.createElement("<input type='hidden' name='" + oItemLists[i].ItemName + "'>");
               oElementLists[i].value = oItemLists[i].ItemValue;
               oFormTag.appendChild(oElementLists[i]);
            }
         }

         document.body.appendChild(oParametar);
         var sWinProperty = (typeof(sProperty) == "undefined")?"status=no,toolbar=no,scrollbars=yes,menubar=no,location=no, titlebar=no, resizable=yes":sProperty;
         var Window = window.open("", ""+sTarget+"" ,sWinProperty);
         
         oFormTag.target = Window.name;
         oFormTag.action = sAction;
         oFormTag.method = sMethodType;
         oFormTag.submit();
         
         for(var i=0;i<oElementLists.length;i++){
            oFormTag.removeChild(oElementLists[i]);
         }
         oParametar.removeChild(oFormTag);
         document.body.removeChild(oParametar);
      }catch(e){
         gfnMsg(e,"gfnOpenParameterSubmit");
      }
   }
/*#################################################################################################
   + gfnAddSelectOption()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Select Tag에 Option을 추가하는 함수.....
#################################################################################################*/
   function gfnAddSelectOption(oSelect, sValue, sText, sTextColor, sBgColor){
      try{
         var bExists = new Boolean(false);
         if(oSelect.options.length > 0){
            for(var i=0;i<oSelect.options.length;i++){
               if(oSelect.options[i].value == sValue){
                  bExists = true;
                  break;
               }
            }
         }

         if (bExists != true){
            var oOption = document.createElement("OPTION");
            oOption.value = sValue;
            oOption.text  = sText;
            oSelect.options.add(oOption);
            if(typeof(sTextColor) == "string"){
               oOption.style.color = sTextColor;
            }
            if(typeof(sBgColor) == "string"){
               oOption.style.backgroundColor = sBgColor;
            }
         }
      }catch(e){
         gfnMsg(e, "gfnAddSelectOption");
      }
   }
/*#################################################################################################
   + gfnRemoveSelectOption()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Select Tag에 Option을 제거하는 함수.....
                  sAllYn = "Y" 이면 전체 제거 그렇지 않으면 선택된놈만......
#################################################################################################*/
   function gfnRemoveSelectOption(oSelect, sAllYn){
      try{
         var sRemoveAll = new Boolean(false);
         if(arguments.length == gfnRemoveSelectOption.length){
            sRemoveAll = (sAllYn.toUpperCase() == "Y")?true:false;
         }
         if(oSelect.options.length > 0 ){
            if(sRemoveAll == true){
               for(var i=oSelect.options.length-1;i>=0;i--){
                //oSelect.options[i] = null;
                  oSelect.options.remove(i);
               }
            }else{
               for(var i=oSelect.options.length-1;i>=0;i--){
                  if(oSelect.options[i].selected == true){
                   //oSelect.options[i] = null;
                     oSelect.options.remove(i);
                  }
               }
            }
         }
      }catch(e){
         gfnMsg(e, "gfnRemoveSelectOption");
      }
   }
/*#################################################################################################
   + gfnSelectOptionWithValue()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Select 목록의 값으로 선택
#################################################################################################*/
   function gfnSelectOptionWithValue(oSelect, sValue){
      try{
         if(oSelect.options.length > 0){
            for(var i=0;i<oSelect.options.length;i++){
               if (oSelect.options[i].value == sValue) {
                  oSelect.options[i].selected = true;
                  break;
               }
            }
         }
      }catch(e){
         gfnMsg(e, "gfnSelectOptionWithValue");
      }
   }
/*#################################################################################################
   + gfnSelectOptionWithText()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Select 목록의 값으로 선택
#################################################################################################*/
   function gfnSelectOptionWithText(oSelect, sText){
      try{
         if(oSelect.options.length > 0){
            for(var i=0;i<oSelect.options.length;i++){
               if (oSelect.options[i].text == sText) {
                  oSelect.options[i].selected = true;
                  break;
               }
            }
         }
      }catch(e){
         gfnMsg(e, "gfnSelectOptionWithText");
      }
   }
/*#################################################################################################
   + gfnAllSelectOption()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Select Tag에 Option을 모두 선택하거나 모두 선택취소하는 함수
#################################################################################################*/
   function gfnAllSelectOption(oSelect, sAllYn){
      try{
         if(oSelect.options.length > 0){
            for(var i=0;i<oSelect.options.length;i++){
               oSelect.options[i].selected = (sAllYn == "Y")?true:false;
            }
         }
      }catch(e){
         gfnMsg(e, "gfnAllSelectOption");
      }
   }
/*#################################################################################################
   + gfnIsValidEmail
   - Arguments  :
   - 작성자     : 허진규
   - 작성일자   : 2003.07.18
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
   function gfnIsValidEmail(emailStr) {
      try{
         var emailPat      = /^(.+)@(.+)$/;
         var specialChars  = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
         var validChars    = "\[^\\s" + specialChars + "\]";
         var quotedUser    = "(\"[^\"]*\")";
         var ipDomainPat   = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
         var atom          = validChars + '+';
         var word          = "(" + atom + "|" + quotedUser + ")";
         var userPat       = new RegExp("^" + word + "(\\." + word + ")*$");
         var domainPat     = new RegExp("^" + atom + "(\\." + atom +")*$");

         var matchArray = emailStr.match(emailPat);
         if (matchArray == null) {
            alert("이메일 주소가 부적절하여 추가할 수 없습니다.");
            return false;
         }

         var user   = matchArray[1];
         var domain = matchArray[2];

         if (user.match(userPat) == null) {
            alert("이메일주소의 ID가 잘못 입력되었습니다.");
            return false;
         }

         var IPArray = domain.match(ipDomainPat);
         if (IPArray != null) {
            for (var i=1; i<=4; i++) {
               if (IPArray[i] > 255) {
                  alert("IP주소가 부적절합니다.");
                  return false;
               }
            }
            return true;
         }

         var domainArray = domain.match(domainPat);
         if (domainArray == null) {
            alert("도메인이름이 부적절합니다.");
            return false;
         }

         var atomPat = new RegExp(atom,"g");
         var domArr = domain.match(atomPat);
         var len = domArr.length;
         if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) {
            alert("주소의 마지막 구분은 두자리(국가) 또는 세자리(도메인)로 끝나야합니다.");
            return false;
         }

         if (len<2) {
            var errStr = "주소에 호스트명이 없습니다.";
            alert(errStr);
            return false;
         }

         return true;
      }
      catch(e){
         gfnMsg(e, "gfnIsValidEmail");
      }
   }
/*#################################################################################################
   + gfnObjGetLeftPos
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Object의 Left position
#################################################################################################*/
   function gfnObjGetLeftPos(obj) {
      try {
         var oBndRct = obj.getBoundingClientRect();
         //left = obj의 left
         return oBndRct.left;
      }
      catch (e){
         gfnMsg(e, "gfnObjGetLeftPos");
      }
   }
/*#################################################################################################
   + gfnObjGetRightPos
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Object의 Left position
#################################################################################################*/
   function gfnObjGetRightPos(obj) {
      try {
         var oBndRct = obj.getBoundingClientRect();
         //right = obj의 right
         return oBndRct.right;
      }
      catch (e){
         gfnMsg(e, "gfnObjGetRightPos");
      }
   }
/*#################################################################################################
   + gfnObjGetTopPos
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Object의 Top position
#################################################################################################*/
   function gfnObjGetTopPos(obj) {
      try {
         var oBndRct = obj.getBoundingClientRect();
         //top = obj의 top
         return oBndRct.top;
      }
      catch (e){
         gfnMsg(e, "gfnObjGetTopPos");
      }
   }
/*#################################################################################################
   + gfnObjGetBottomPos
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : Object의 Top position
#################################################################################################*/
   function gfnObjGetBottomPos(obj) {
      try {
         var oBndRct = obj.getBoundingClientRect();
         //bottom = obj의 bottom
         return oBndRct.bottom;
      }
      catch (e){
         gfnMsg(e, "gfnObjGetBottomPos");
      }
   }
/*#################################################################################################
   + gfnIsNull()
   - Arguments  :
   - Return     : true/false [Boolean]
   - Usage      :
   - Content    : 인자로 넘겨온 변수가 스트링이 존재하는지 검사
#################################################################################################*/
   function gfnIsNull(sString){
      try{
         return ((sString==null || sString=="" || sString=="undefined" || typeof(sString) == "undefined") ? true:false);
      }catch(e){
         gfnMsg(e, "gfnIsNull");
      }
   }
/*#################################################################################################
   + gfnIsNumber()
   - Arguments  :
   - Return     : true/false [Boolean]
   - Usage      :
   - Content    : 인자로 넘겨온 변수가 스트링이 존재하는지 검사
#################################################################################################*/
   function gfnIsNumber(sString){
      try{
         var iCharLen = sString.length;
         for(var i = 0; i < iCharLen; i++) {
             if(!("0" <= sString.charAt(i) && sString.charAt(i) <= "9"))
               return false;
         }
         return true;
       }catch(e){
          gfnMsg(e, "gfnIsNumber");
       }
   }
/*#################################################################################################
   + gfnIsWildCard()
   - Arguments  :
   - Return     : true/false [Boolean]
   - Usage      :
   - Content    : 문자열중 와일드카드(*)문자가 존재하는지 검사
#################################################################################################*/
   function gfnIsWildCard(sString){
      try{
         if(typeof(sString) == "string" && sString.length > 0){
            for(var i=0; i< sString.length; i++){
               if (sString.charAt(i) == "*"){
                  return true;
               }
            }
         }
         return false;
      }catch(e){
         gfnMsg(e, "gfnIsWildCard");
      }
   }
/*#################################################################################################
   + gfnEscapeTrim()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
   function gfnEscapeTrim(sString){
      try{
         var sTmpString = sString;
         for(var i = 0; i < sTmpString.length;){
            if(sTmpString.substring(i,i+1) == " " || sTmpString.substring(i,i+1) == "/" || sTmpString.substring(i,i+1) == "*"){
               sTmpString = sTmpString.substring(0, i) + sTmpString.substring(i+1, sTmpString.length);
            }else{
               i++;
            }
         }
         return sTmpString;
      }catch(e){
         gfnMsg(e, "gfnEscapeTrim");
      }
   }
/*#################################################################################################
   + gfnIsEscape()
   - Arguments  :
   - Return     : true/false [Boolean]
   - Usage      :
   - Content    : [~,`,!,@,#,$,%,^,&,(,),+,=,{,},[,],|,?,>,<,:,',",\]해당 특수문자가 존재하는지 검사
#################################################################################################*/
   function gfnIsEscape(sString){
      try{
         if(typeof(sString) == "string" && sString.length > 0){
            var sTmpString = new String(sString);
          //var sEscString = new String("~`@!#$%^&()+={}[]|?><:'\"\\");
            var sEscString = new String("~`!#$%^&()+={}[]|?><:'\"\\");
            var sChar      = new String("");
            for(var i=0;i<sTmpString.length;i++){
               sChar = sTmpString.substring(i,i+1);
               if (sEscString.indexOf(sChar) >= 0){
                 return true;
               }
            }
         }
         return false;
      }catch(e){
         gfnMsg(e, "gfnIsEscape");
      }
   }
/*#################################################################################################
   + gfnLockHistoryBack()
   - Arguments  :
   - Return     :
   - Usage      : document.onkeydown      = gfnLockHistoryBack();
                  document.body.onkeydown = gfnLockHistoryBack();
   - Content    : 현재 Open되어 있는 Window, Frame, IFrame에서 Backspace Key를 눌러도 이전페이지로
                  이동을 하지 않게 하기위한 함수.
                  document의 onload event에 함수를 적용한다.
#################################################################################################*/
   function gfnLockHistoryBack(evt){
      try{
         var oEvent = window.event || evt;
         var oEventSrc = (window.event ? oEvent.srcElement: oEvent.target);

         var sEventTagName = oEventSrc.tagName.toLowerCase();
         var iEventKeyCode = oEvent.keyCode;

         if(iEventKeyCode == 8){
            if(sEventTagName == "input"){
               if(oEventSrc.readOnly == true || oEventSrc.disabled == true){
                  oEvent.returnValue = false;
               }
            }else if(sEventTagName == "img" || sEventTagName == "button" || sEventTagName == "textarea"){
               return;
            }else{
               oEvent.returnValue = false;
            }
         }

      }catch(e){
         gfnMsg(e, "gfnLockHistoryBack");
      }
   }

/*#################################################################################################
   + gfnLockPopupMenu()
   - Arguments  :
   - Return     :
   - Usage      : document.body.attachEvent("oncontextmenu",gfnLockPopupMenu)
   - Content    : 현재 Open되어 있는 Window, Frame, IFrame에서 마우스 오른쪽 버튼을 클릭했을때
                  Input, img, button, textarea외에는 마우스 오른쪽 버튼을 사용못하게 처리
                  document의 onload event에 함수를 적용한다.
#################################################################################################*/
   function gfnLockPopupMenu(evt){
      try{
         var oEvent = window.event || evt;
         var oEventSrc = (window.event ? oEvent.srcElement: oEvent.target);

         var sEventTagName = oEventSrc.tagName.toLowerCase();
       //var oEventItem    = eval("document.all." + event.srcElement.uniqueID);
         if(sEventTagName == "input" || sEventTagName == "img" || sEventTagName == "button" || sEventTagName == "textarea"){
            return;
         }else{
            oEvent.returnValue = false;
         }
      }catch(e){
         gfnMsg(e, "gfnLockPopupMenu");
      }
   }
/*#################################################################################################
   + gfnIsEnglish()
   - Arguments  :
   - Return     : true/false [Boolean]
   - Usage      :
   - Content    : 문자열이 영문만으로 이루어진 것인지에 대한 검사
#################################################################################################*/
   function gfnIsEnglish(sString){
      try{
         var sEngString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/ -*,.'~";
         var sEngGb     = "";
         var sChar      = "";
         for(var i=0; i< sString.length; i++){
            sChar = sString.charAt(i);
            for(var j=0; j< sEngString.length; j++){
               if(sChar == sEngString.charAt(j)) // 영문이면
                  break;
            }

            if(j == sEngString.length){          // 영문이 아니면{
               sEngGb = "F";
               break;
            }
         }
         return ((sEngGb == "F") ? false: true);
      }catch(e){
         gfnMsg(e, "gfnIsEnglish");
      }
   }
/*#################################################################################################
   + gfnNoAction
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : No Action
#################################################################################################*/
   function gfnNoAction() {
      return true;
   }

/*#################################################################################################
   + gfnAllCheck()
   - Arguments  : oCheckBox
   - Return     :
   - Usage      :
   - Content    : List 항목을 모두 선택하거나 모두 선택취소하는 함수
#################################################################################################*/
   var lb_AllCheck = true;
   function gfnAllCheck(oCheckBox){
      try{
         for(var i=1;i<oCheckBox.length;i++){
            if (!oCheckBox[i].disabled)   
               oCheckBox[i].checked = lb_AllCheck;
         }
         lb_AllCheck = !lb_AllCheck;
      }catch(e){
         gfnMsg(e, "gfnAllCheck");
      }
   }

/*#################################################################################################
   + gfnGetStrChecked()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
  function gfnGetStrChecked(oCheckBox){
    try{
      var sRtnStr = "";
      for (var i=1; i < oCheckBox.length; i++) {
        if (oCheckBox[i].checked) {
          sRtnStr += gs_RowSep + oCheckBox[i].value;
        }
      }
      return sRtnStr;
    }catch(e){
       gfnMsg(e, "gfnGetStrChecked");
    }
  }

/*#################################################################################################
   + gfnGetSelectedValueRadio(oRadio)
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
  function gfnGetSelectedValueRadio(oRadio){
    try{
      var sRtnStr = "";
      for (var i=0; i < oRadio.length; i++) {
        if (oRadio[i].checked) {
          sRtnStr = oRadio[i].value;
          break;
        }
      }
      return sRtnStr;
    }catch(e){
       gfnMsg(e, "gfnGetSelectedValueRadio");
    }
  }

/*#################################################################################################
   + gfnSetInputMode(obj, sMode)
   - Arguments  : 
                    obj : 입력항목, sMode : 'K' 한글, 'E' 영문
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
  function gfnSetInputMode(obj, sMode){
    try{
//       obj.blur();
       obj.style.imeMode = (sMode == "E"? "inactive": "active");
//       obj.focus(); 
    }catch(e){
       gfnMsg(e, "gfnSetInputMode");
    }
  }

/*#################################################################################################
   + gfnGetValueRadioInput(obj, sMode)
   - Arguments  : 
                    obj : 입력항목
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
  function gfnGetValueRadioInput(obj){
    try{
       var rtnValue = "";
       for(var i=0; i<obj.length; i++){ 
          if(obj[i].checked == true) {
             rtnValue = obj[i].value; 
             break;
          }
       } 
       return rtnValue;
    }catch(e){
       gfnMsg(e, "gfnGetValueRadioInput");
    }
  }

/*#################################################################################################
   + gfnSetInputEnable(objInput, sClassNm)
   - Arguments  : 
                    objInput : 입력항목, sClassNm : Class명
   - Return     :
   - Usage      :
   - Content    : 입력항목 비활성화
#################################################################################################*/
  function gfnSetInputEnable(objInput, sClassNm){
    try{
       objInput.className  = sClassNm; 
       objInput.readOnly   = false; 
       objInput.tabIndex   = "0";
    }catch(e){
       gfnMsg(e, "gfnSetInputEnable");
    }
  }

/*#################################################################################################
   + gfnSetInputDisable(objInput, sClassNm, bClearValue)
   - Arguments  : 
                    objInput : 입력항목, sClassNm : Class명, bClear : Clear Value 
   - Return     :
   - Usage      :
   - Content    : 입력항목 비활성화
#################################################################################################*/
  function gfnSetInputDisable(objInput, sClassNm, bClearValue){
    try{
       if (bClearValue == null) bClearValue = true;

       if (bClearValue) objInput.value = "";
       objInput.className  = sClassNm; 
       objInput.readOnly   = true; 
       objInput.tabIndex   = "-1";
    }catch(e){
       gfnMsg(e, "gfnSetInputDisable");
    }
  }

/*#################################################################################################
   + gfnSetInputNmBtnEnable(objInputNm, objButton, sClassNm)
   - Arguments  : 
                    objInputNm : 입력항목(명), objButton : 버튼, sClassNm : Class명
   - Return     :
   - Usage      :
   - Content    : 입력항목 활성화
#################################################################################################*/
  function gfnSetInputNmBtnEnable(objInputNm, objButton, sClassNm){
    try{
       objInputNm.className  = sClassNm; 
       objButton.style.display = "block";
    }catch(e){
       gfnMsg(e, "gfnSetInputNmBtnEnable");
    }
  }

/*#################################################################################################
   + gfnSetInputNmBtnDisable(objInputNm, objButton, sClassNm, bClearValue)
   - Arguments  : 
                    objInputNm : 입력항목(명), objButton : 버튼, sClassNm : Class명, bClear : Clear Value 
   - Return     :
   - Usage      :
   - Content    : 입력항목 비활성화
#################################################################################################*/
  function gfnSetInputNmBtnDisable(objInputNm, objButton, sClassNm, bClearValue){
    try{
       if (bClearValue == null) bClearValue = true;

       if (bClearValue) {
         objInputNm.value = "";
       }
       objInputNm.className  = sClassNm; 
       objButton.style.display = "none";
    }catch(e){
       gfnMsg(e, "gfnSetInputNmBtnDisable");
    }
  }

/*#################################################################################################
   + gfnSetInputCdNmBtnDisable(objInputCd, objInputNm, objButton, sClassNm, bClearValue)
   - Arguments  : 
                    objInputCd : 입력항목(코드), objInputNm : 입력항목(명), objButton : 버튼, sClassNm : Class명, bClear : Clear Value 
   - Return     :
   - Usage      :
   - Content    : 입력항목 비활성화
#################################################################################################*/
  function gfnSetInputCdNmBtnDisable(objInputCd, objInputNm, objButton, sClassNm, bClearValue){
    try{
       if (bClearValue == null) bClearValue = true;

       if (bClearValue) {
         objInputCd.value = "";
         objInputNm.value = "";
       }
       objInputNm.className  = sClassNm; 
       objButton.style.display = "none";
    }catch(e){
       gfnMsg(e, "gfnSetInputCdNmBtnDisable");
    }
  }

/*#################################################################################################
   + gfnSetInputBtnEnable(objInput, sImageId, sClassNm)
   - Arguments  : 
                    objInputNm : 입력항목(명), objButton : 버튼, sClassNm : Class명
   - Return     :
   - Usage      :
   - Content    : 입력항목 비활성화
#################################################################################################*/
  function gfnSetInputBtnEnable(objInput, objButton, sClassNm){
    try{
       gfnSetInputEnable(objInput, sClassNm);
       objButton.style.display = "block";
    }catch(e){
       gfnMsg(e, "gfnSetInputBtnEnable");
    }
  }

/*#################################################################################################
   + gfnSetInputBtnDisable(objInput, sImageId, sClassNm, bClearValue)
   - Arguments  : 
                    objInput : 입력항목, objButton : 버튼, sClassNm : Class명, bClear : Clear Value 
   - Return     :
   - Usage      :
   - Content    : 입력항목 비활성화
#################################################################################################*/
  function gfnSetInputBtnDisable(objInput, objButton, sClassNm, bClearValue){
    try{
        gfnSetInputDisable(objInput, sClassNm, bClearValue);
       objButton.style.display = "none";
    }catch(e){
       gfnMsg(e, "gfnSetInputBtnDisable");
    }
  }

/*#################################################################################################
   + gfnGetSessionByAjax(sSSNm)
   - Arguments  : 
                    sSSNm : 세션이름
   - Return     :
   - Usage      :
   - Content    : 함수실행 AJAX
#################################################################################################*/
  function gfnGetSessionByAjax(sSSNm){
    try{
      var rtnValue = "";
      var url = gs_AjaxVirPath + "/ajax_fn.asp?gbn=GET_SESSION_VALUE&ss_nm=" + sSSNm;

      var aObj = new AjaxObject;
      rtnValue = aObj.getHttpRequest(url);

      return rtnValue;
    }catch(e){
       gfnMsg(e, "gfnGetSessionByAjax");
    }
  }


/*#################################################################################################
   + gfnAjaxFnExe(sGbn, sParam)
   - Arguments  : 
                    sGbn : 실행구분, sParam : 파라메터
   - Return     :
   - Usage      :
   - Content    : 함수실행 AJAX
#################################################################################################*/
  function gfnAjaxFnExe(sGbn, sParam){
    try{
      var rtnValue = "";
      var url = gs_AjaxVirPath + "/ajax_fn.asp?gbn=" + sGbn;

      var aObj = new AjaxObject;
      rtnValue = aObj.getHttpRequest(url + sParam);

      return rtnValue;
    }catch(e){
       gfnMsg(e, "gfnAjaxFnExe");
    }
  }

/*#################################################################################################
   + gfnAjaxGetValue(sGbn, sParam)
   - Arguments  : 
                    sGbn : 실행구분, sParam : 파라메터
   - Return     :
   - Usage      :
   - Content    : 조회용 AJAX
#################################################################################################*/
  function gfnAjaxGetValue(sGbn, sParam, oFunction){
    try{
      var rtnValue = "";
      var url = gs_AjaxVirPath + "/ajax_db_read.asp";

      var aObj = new AjaxObject;
      rtnValue = aObj.getHttpRequest(url, oFunction, null, "gbn=" + sGbn + sParam);

      return rtnValue;
    }catch(e){
       gfnMsg(e, "gfnAjaxGetValue");
    }
  }

/*#################################################################################################
   + gfnAjaxExec(sGbn, sParam)
   - Arguments  : 
                    sGbn : 실행구분, sParam : 파라메터
   - Return     :
   - Usage      :
   - Content    : 처리용 AJAX
#################################################################################################*/
  function gfnAjaxExec(sGbn, sParam){
    try{
      var rtnValue = "";
      var url = gs_AjaxVirPath + "/ajax_db_exec.asp?gbn=" + sGbn + sParam;

      var aObj = new AjaxObject;
      rtnValue = aObj.getHttpRequest(url);

      return rtnValue;
    }catch(e){
       gfnMsg(e, "gfnAjaxExec");
    }
  }

/*#################################################################################################
   + gfnAjaxExecPost(sGbn, sParam)
   - Arguments  : 
                    sGbn : 실행구분, sParam : 파라메터
   - Return     :
   - Usage      :
   - Content    : 처리용 AJAX(Post)
#################################################################################################*/
  function gfnAjaxExecPost(sParam){
    try{
      var rtnValue = "";
      var url = gs_AjaxVirPath + "/ajax_db_exec.asp";

      var aObj = new AjaxObject;
      rtnValue = aObj.getHttpRequest(url, null, null, "ajax=Y" + sParam);

      return rtnValue;
    }catch(e){
       gfnMsg(e, "gfnAjaxExecPost");
    }
  }

/*#################################################################################################
   + gfnAjaxLogin(sUserId, sPswd)
   - Arguments  : 
                    sUserId, sPswd
   - Return     :
   - Usage      :
   - Content    : 로그인 처리 AJAX
#################################################################################################*/
  function gfnAjaxLogin(sUserId, sPswd, sNewYn){
    try{
      if (sNewYn == null) sNewYn = "N";
      var rtnValue = "";
      var url = gs_AjaxVirPath + "/ajax_login.asp?user_id=" + encodeURIComponent(sUserId) + "&pswd=" + encodeURIComponent(sPswd) + "&new_yn=" + sNewYn;

      var aObj = new AjaxObject;
      rtnValue = aObj.getHttpRequest(url);

      return rtnValue;
    }catch(e){
       gfnMsg(e, "gfnAjaxLogin");
    }
  }

/*#################################################################################################
   + gfnFixedLengthString(str, len, align, sChr)
   - Arguments  : 
                    str : 대상문자, oPeriNum : 숫자표시 Object, oPeriStr : 날짜구분 Object
   - Return     :
   - Usage      :
   - Content    : str 을 len 길이의 문자로 변환 (align 을 기준으로 sChr 을 채움)
#################################################################################################*/

  /* ------------------------------------------------- 
     - 글자를 앞에서부터 원하는 바이트만큼 잘라 리턴합니다. 
     - 한글의 경우 2바이트로 계산하며, 글자 중간에서 잘리지 않습니다. 
  ------------------------------------------------- */ 
  String.prototype.cut = function(len) { 
    var str = this; 
    var l = 0; 
    for (var i=0; i<str.length; i++) { 
      l += (str.charCodeAt(i) > 128) ? 2 : 1; 
    } 
    return str; 
  } 

  /* ------------------------------------------------- 
     - 해당스트링의 바이트단위 길이를 리턴합니다. 
     - (기존의 length 속성은 2바이트 문자를 한글자로 간주합니다) 
  ------------------------------------------------- */ 
  String.prototype.bytes = function() { 
    var str = this; 
    var l = 0; 
    for (var i=0; i<str.length; i++) l += (str.charCodeAt(i) > 128) ? 2 : 1; 
    return l; 
  } 
  
  function gfnFixedLengthString(str, len, align, sChr){
    try{
        if (sChr == null) sChr = " ";
        if (align == null) align = "L";

        var sRtnValue = str.cut(len);
        var iBytes    = sRtnValue.bytes();
        var sFillStr  = "";
        
        for (var i=0; i<len-iBytes; i++) {
          sFillStr += sChr;
        }
        
        sRtnValue = (align == "L"? sRtnValue + sFillStr: sFillStr + sRtnValue);
        return sRtnValue;

    }catch(e){
       gfnMsg(e, "gfnFixedLengthString");
    }
  }

/*#################################################################################################
   + gfnReadCookie(name)
   - Arguments  : 
   - Return     :
   - Usage      :
   - Content    : 쿠키 읽기
#################################################################################################*/
function gfnReadCookie(name) { 
  try{
    var label = name + "="; 
    var labelLen = label.length; 
    var cLen = document.cookie.length; 
    var i = 0; 

    while (i < cLen) { 
        var j = i + labelLen; 

        if (document.cookie.substring(i, j) == label) { 
            var cEnd = document.cookie.indexOf(";", j); 
            if (cEnd == -1) cEnd = document.cookie.length; 

            return unescape(document.cookie.substring(j, cEnd)); 
        } 

        i++; 
    } 
    return ""; 
  
  }catch(e){
     gfnMsg(e, "gfnReadCookie");
  }
} 

/*#################################################################################################
   + gfnSaveCookie(name, value, expire)
   - Arguments  : 
   - Return     :
   - Usage      :
   - Content    : 쿠키 저장
#################################################################################################*/
function gfnSaveCookie(name, value, expire)  { 
  try{
    if (expire == null) expire = 100;

    var eDate = new Date(); 
    eDate.setDate(eDate.getDate() + expire); 
    document.cookie = name + "=" + value + "; expires=" +  eDate.toGMTString()+ "; path=/"; 
  
  }catch(e){
     gfnMsg(e, "gfnSaveCookie");
  }
} 

/*#################################################################################################
   + gfnHideParentLangBox()
   - Arguments  : 
                    sUserId, sPswd
   - Return     :
   - Usage      :
   - Content    : 로그인 처리 AJAX
#################################################################################################*/
  function gfnHideParentLangBox(){
    try{
      parent.lfnHideLangBox();
    }catch(e){
       gfnMsg(e, "gfnHideParentLangBox");
    }
  }

/*#################################################################################################
   + gfnShowZipPopup
   - Arguments  :
                  sFrmNm   : 조회한 값을 리턴받을 Form 명
                  sCdObj   : 조회한 우편번호 값을 리턴받을 Object 명
                  sCdNmObj : 조회한 주소 값을 리턴받을 Object 명
   - Return     :
   - Usage      :
   - Content    : [Valid Check] 필수입력항목에 입력안한 경우
#################################################################################################*/
   function gfnShowZipPopup(sFrmNm, sPostObj, sAddrObj){
      try{
         var sUrl   = "/members/post.asp";
         var sParam = "?frm_nm="    + sFrmNm;
         sParam    += "&post_obj="  + sPostObj;
         sParam    += "&addr_obj="  + sAddrObj;

         var sWinProperty = "status=no,toolbar=no,scrollbars=auto,menubar=no,location=no, titlebar=no, resizable=no, width=480, height=440";
         var Window = window.open(sUrl + sParam, "winPost", sWinProperty);

//         var EditWin = window.showModalDialog(sUrl + sParam, self.window, "center:1; dialogHide:0; dialogWidth:480px; dialogHeight:470px; help:0; status:0; scroll:1; resizable:0;");
      }catch(e){
         gfnMsg(e, "gfnShowZipPopup");
      }
   }

/*#################################################################################################
   + gfnShowCompPopup()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
  function gfnShowCompPopup(sMemberId){
    try{
       var sUrl   = "/search/member_p.asp";
       var sParam = "";
       sParam    += "?member_id="  + sMemberId;

       var sWinProperty = "status=no,toolbar=no,scrollbars=yes,menubar=no,location=no, titlebar=no, resizable=no, width=700, height=600";
       gfnOpenPopupByPost(sUrl + sParam, "winCompPop", sWinProperty);
       // var Window = window.open(sUrl + sParam, "winCompPop", sWinProperty);

    }catch(e){
      gfnMsg(e, "gfnShowCompPopup");
    }
  }

/*#################################################################################################
   + gfnShowRfqPopup
   - Arguments  :
                  sRfqGbn : SR(부품검색), BU(삽니다), SA(팝니다)
                  sSearch : 검색어
                  sKeys   : RFQ 대상 항목에 대한 Key값 조합.(gs_RowSep 구분)
   - Return     :
   - Usage      :
   - Content    : Rfq 등록
#################################################################################################*/
   function gfnShowRfqPopup(sRfqGbn, sSearch, sKeys){
      try{
         var sUrl   = "/rfq/rfq_e.asp";
         var sParam = "?rfq_gbn="   + sRfqGbn;
/*
         sParam    += "&search="    + encodeURIComponent(sSearch);
         sParam    += "&keys="      + encodeURIComponent(sKeys);
*/
         sParam    += "&search="    + sSearch;
         sParam    += "&keys="      + sKeys;

         var sWinProperty = "status=no,toolbar=no,scrollbars=yes,menubar=no,location=no, titlebar=no, resizable=no, width=900, height=600";

         gfnOpenPopupByPost(sUrl + sParam, "winRfq", sWinProperty);
/*
         var Window = window.open(sUrl + sParam, "winRfq", sWinProperty);
         Window.focus();

         var EditWin = window.showModalDialog(sUrl + sParam, self.window, "center:1; dialogHide:0; dialogWidth:800px; dialogHeight:600px; help:0; status:0; scroll:1; resizable:0;");
*/
      }catch(e){
         gfnMsg(e, "gfnShowRfqPopup");
      }
   }

/*#################################################################################################
   + gfnShowRfqPopup99
   - Arguments  :
                  sRfqGbn : SR(부품검색), BU(삽니다), SA(팝니다)
                  sSearch : 검색어
                  sKeys   : RFQ 대상 항목에 대한 Key값 조합.(gs_RowSep 구분)
   - Return     :
   - Usage      :
   - Content    : Rfq 등록
#################################################################################################*/
   function gfnShowRfqPopup99(sRfqGbn, sSearch, sKeys){
      try{
         var sUrl   = "/rfq/rfq_e99.asp";
         var sParam = "?rfq_gbn="   + sRfqGbn;
/*
         sParam    += "&search="    + encodeURIComponent(sSearch);
         sParam    += "&keys="      + encodeURIComponent(sKeys);
*/
         sParam    += "&search="    + sSearch;
         sParam    += "&keys="      + sKeys;

         var sWinProperty = "status=no,toolbar=no,scrollbars=yes,menubar=no,location=no, titlebar=no, resizable=no, width=900, height=600";

         gfnOpenPopupByPost(sUrl + sParam, "winRfq", sWinProperty);
/*
         var Window = window.open(sUrl + sParam, "winRfq", sWinProperty);
         Window.focus();

         var EditWin = window.showModalDialog(sUrl + sParam, self.window, "center:1; dialogHide:0; dialogWidth:800px; dialogHeight:600px; help:0; status:0; scroll:1; resizable:0;");
*/
      }catch(e){
         gfnMsg(e, "gfnShowRfqPopup99");
      }
   }

/*#################################################################################################
   + gfnShowEscrow()
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    :
#################################################################################################*/
  function gfnShowEscrow(sGbn){
    try{
      var sUrl, sWinNm, sHeight;
      switch (sGbn) {
      case "AGREE":
           sUrl  = "/rfq/escrow_a.asp"; sHeight = "500"; sWinNm = "winEscrowA"; break;
      case "FEE":
           sUrl  = "/rfq/escrow_f.asp"; sHeight = "300"; sWinNm = "winEscrowF"; break;
      case "INFO":
           sUrl  = "/rfq/escrow_i.asp"; sHeight = "600"; sWinNm = "winEscrowI"; break;
      }
      
      var sWinProperty = "status=no,toolbar=no,scrollbars=yes,menubar=no,location=no, titlebar=no, resizable=no, width=600, height=" + sHeight;
      var Window = window.open(sUrl, sWinNm, sWinProperty);
    }catch(e){
      gfnMsg(e, "gfnShowEscrow");
    }
  }

/*#################################################################################################
   + gfnGoCategoryHome(sGbn)
   - Arguments  : sGbn
   - Return     :
   - Usage      :
   - Content    : 각 카테고리별 메인페이지 가기
#################################################################################################*/
  function gfnGoCategoryHome(sGbn, sParam){
    try{
      if (sParam == null) sParam = "";
      var sPage;
      
      switch (sGbn) {
      case "MEMBERS":   sPage = "/members/members.asp"; break;
      case "ONLINEUP":  sPage = "/upload/online.asp"; break;
      case "DUES":      sPage = "/dues/dues.asp"; break;
      }

      location.href = sPage + sParam;
    }catch(e){
       gfnMsg(e, "gfnGoCategoryHome");
    }
  }

/*#################################################################################################
   + gfnShowUploadProgress()
   - Arguments  : sGbn
   - Return     :
   - Usage      :
   - Content    : 각 카테고리별 메인페이지 가기
#################################################################################################*/
  function gfnShowUploadProgress(){
    try{

	    if (gs_BrowserType == "M") {
        winstyle = "dialogWidth=385px; dialogHeight:150px; center:yes";
        window.showModelessDialog("/_dext/show_progress.asp?nav=ie", null, winstyle);
      }
  		else {
        winpos      = "left=" + ((window.screen.width-380)/2) + ",top=" + ((window.screen.height-110)/2);
        winstyle    ="width=380,height=110,status=no,toolbar=no,menubar=no,location=no,resizable=no,scrollbars=no,copyhistory=no," + winpos;
        window.open("/_dext/show_progress.asp?nav=ns",null,winstyle);
		  }

    }catch(e){
       gfnMsg(e, "gfnShowUploadProgress");
    }
  }

/*#################################################################################################
   + gfnLimitPartNo()
   - Arguments  :
   - Return     :
   - Usage      : onkeypress="gfnLimitPartNo();"
   - Content    :  PartNo 입력 시 불필요한 문자 제한 함수.
#################################################################################################*/
  function gfnLimitPartNo(e){
    try{
      var event = window.event || e;
      var iEventCode = event.which || event.keyCode;

      switch (iEventCode) {
      //  "'",     " ",     "/",     "-",     "+",     ".",     ",",     "*",     "(",     ")",     "_",     "#"
      case 39: case 32: case 47: case 45: case 43: case 46: case 44: case 42: case 40: case 41: case 95: case 35:
        if (window.netscape)
          event.preventDefault();
        else 
          event.returnValue=false;
      }

    }catch(e){
       gfnMsg(e, "gfnLimitPartNo");
    }
  }

/*#################################################################################################
   + gfnGetGbnCodeValue()
   - Arguments  :
   - Return     :
   - Usage      : 
   - Content    : 언어파일의 코드/코드값 형태.
#################################################################################################*/
  function gfnGetGbnCodeValue(sCodeStr, sCode){
    try{
      var sRtnVal;
      var arrRows = sCodeStr.split("|");
      for (var i=1; i<=arrRows.length; i++) {
        var arrCode = arrRows[i].split(",");
        if (arrCode[0] == sCode) {
          sRtnVal = gfnTrim(gfnReplace(arrCode[1], gs_CR, ""));
          break;
        }
      }
      return sRtnVal;

    }catch(e){
       gfnMsg(e, "gfnGetGbnCodeValue");
    }
  }

    /*#################################################################################################
       + gfnFlash()
       - Arguments  :
       - Return     :
       - Usage      :
       - Content    : 플래쉬 배너 추가용 : 김재홍, 2008-08-13
    #################################################################################################*/
    function gfnFlash(id, width, height){
      try{
        document.write('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+width+'" height="'+height+'" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" id=ShockwaveFlash1>'
        +'<param name="movie" value="'+id+'">'
        +'<param name="quality" value="high">'
        +'<param name="wmode" value="transparent">'
        +'<embed src="'+id+'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" width="'+width+'" height="'+height+'" type="application/x-shockwave-flash"></embed>'
        +'</object>');
      }catch(e){
        gfnMsg(e, "gfnFlash");
      }
    }

/*#################################################################################################
   + gfnPrintInvoice
   - Arguments  :
                  sFeeNo : 회비번호
   - Return     :
   - Usage      :
   - Content    : 인보이스 출력
#################################################################################################*/
   function gfnPrintInvoice(sFeeNo){
      try{
         var sUrl   = "/dues/invc_p.asp";
         var sParam = "?fee_no="   + sFeeNo;

         var sWinProperty = "status=no,toolbar=no,scrollbars=yes,menubar=no,location=no, titlebar=no, resizable=no, width=750, height=800";
         var Window = window.open(sUrl + sParam, "winInvc", sWinProperty);
         Window.focus();

      }catch(e){
         gfnMsg(e, "gfnPrintInvoice");
      }
   }

/*#################################################################################################
   + gfnShowNoticePopup
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : 로그인 후 공지팝업 보기
#################################################################################################*/
  function gfnShowNoticePopup(sLangCd){
    try{
      if (gs_PopupNoticeYn  != "Y") return;
      if (gfnInStr(gs_PopupLangCd, sLangCd) == 0) return;

      var sToday = gfnGetToday();
      if (sToday < gs_PopupSdt || sToday > gs_PopupEdt) return;

      if (gfnReadCookie(gs_PopupCookieNm) == "Y") return;

      var sUrl    = "/popup.asp";
      var sParam  = "";

      var sWinProperty = "status=no,toolbar=no,scrollbars=yes,menubar=no,location=no, titlebar=no, resizable=no, width=" + gs_PopupWidth + ", height=" + gs_PopupHeight;
      var Window = window.open(sUrl + sParam, "winNP", sWinProperty);
//      Window.focus();

    }catch(e){
      gfnMsg(e, "gfnShowNoticePopup");
    }
  }

/*#################################################################################################
   + gfnGetToday
   - Arguments  :
   - Return     :
   - Usage      :
   - Content    : 로그인 후 공지팝업 보기
#################################################################################################*/
  function gfnGetToday(){
    try{
      var sDate = new Date(); 
      
      var sYear  = String(sDate.getFullYear()); 
      var sMonth = String(sDate.getMonth() + 1); // 1월=0,12월=11이므로 1 더함 
      var sDay   = String(sDate.getDate()); 
      
      if (("" + sMonth).length == 1) { sMonth = "0" + sMonth; } 
      if (("" + sDay).length  == 1) { sDay  = "0" + sDay;  } 

      return sYear + sMonth + sDay;

    }catch(e){
      gfnMsg(e, "gfnGetToday");
    }
  }


/*#################################################################################################
   + gfnOpenPopupByPost
   - Arguments  : sUrl, sTarget, sProperty
   - Return     :
   - Usage      :
   - Content    : POST 방식으로 팝업창을 띄움
#################################################################################################*/
  function gfnOpenPopupByPost(sUrl, sTarget, sProperty) {
    try{
      var oWin = window.open("", sTarget, sProperty);

      gfnGoPageByForm(sUrl, sTarget, "POST");
      oWin.focus();
    
    }catch(e){
      gfnMsg(e, "gfnOpenPopupByPost");
    }
  }

  //+++++++++++++++++++++++++++++++++++++++++++++++++++
  // gfnGoPageByForm
  //+++++++++++++++++++++++++++++++++++++++++++++++++++
  function gfnGoPageByForm(sURL, sTarget, sMethod) {
    try{
      var goURL = sURL.substring(0,sURL.indexOf("?"));
      var sQueryString = "";

      if (goURL)
          sQueryString = sURL.substring(sURL.indexOf("?") + 1);
      else
          goURL = sURL;

      var oFrm = gfnCreateForm("frmTmp", goURL, sTarget, sMethod);
      
      if(sQueryString) {
        
        var aParams = sQueryString.split("&");

        for(var i=0; i<aParams.length; i++) {
          var aValues = aParams[i].split("=");
          if(!aValues[1]) aValues[1] = "";
          oFrm = gfnAddHidden(oFrm, aValues[0], aValues[1]);
        }
      }

      document.body.appendChild(oFrm);
      oFrm.submit();
      oFrm.parentNode.removeChild(oFrm);

    }catch(e){
      gfnMsg(e, "gfnGoPageByForm");
    }
  }

  //+++++++++++++++++++++++++++++++++++++++++++++++++++
  // gfnCreateForm
  //+++++++++++++++++++++++++++++++++++++++++++++++++++
  function gfnCreateForm(sName, sAction, sTarget, sMethod) {
    try{
      var oFrm = document.createElement("form");

      oFrm.name    = sName;
      oFrm.action  = sAction;
      oFrm.target  = sTarget;
      oFrm.method  = sMethod;
      
      return oFrm;

    }catch(e){
      gfnMsg(e, "gfnCreateForm");
    }
  }

  //+++++++++++++++++++++++++++++++++++++++++++++++++++
  // gfnAddHidden
  //+++++++++++++++++++++++++++++++++++++++++++++++++++
  function gfnAddHidden(oFrm, sName, sValue) {
    try{
      var oInput = document.createElement("input");
      
      oInput.type   = "hidden";
      oInput.name   = sName;
      oInput.value  = sValue;
      oFrm.insertBefore(oInput);
      
      return oFrm;

    }catch(e){
      gfnMsg(e, "gfnAddHidden");
    }
 }

/*#################################################################################################
   + gfnClickBanner(sGbn)
   - Arguments  : 
                    sGbn : 실행구분
   - Return     :
   - Usage      :
   - Content    : 배너클릭로그기록
#################################################################################################*/
  function gfnClickBanner(sKeyVal){
    try{
      var sRtn = gfnAjaxExec("BANNER", "&key_val=" + sKeyVal);

    }catch(e){
       gfnMsg(e, "gfnClickBanner");
    }
  }


