String.prototype.trim = function(str) { 
  str = this != window ? this : str; 
  return str.replace(/^\s+/g,'').replace(/\s+$/g,''); 
}

/// 에러메시지 포멧 정의 ///
var NoBlank     = "{name+은는} 필수항목입니다.";
var NotValid    = "{name+이가} 올바르지 않습니다.";
var TooLong     = "{name+이가} 지정된 길이를 초과했습니다. (최대 {max}바이트).";
var TooShort    = "{name}의 길이가 부족합니다. (최소 {min}바이트)";
var TooMuch     = "{name}의 선택 갯수가 초과되었습니다. (최대 {max}개)";
var TooLittle   = "{name}의 선택 갯수가 부족합니다. (최소 {min}개)";
var Unchecked   = "{name+이가} 선택되지 않았습니다.";

String.prototype.hasFinalConsonant = function(str) {
  str = this != window ? this : str; 
  var strTemp = str.substr(str.length-1);
  return ((strTemp.charCodeAt(0)-16)%28!=0);
}
function josa(str,tail) {
  return (str.hasFinalConsonant()) ? tail.substring(0,1) : tail.substring(1,2);
}

function doError(el,type,action) {
  var pattern = /{([a-zA-Z0-9_]+)\+?([가-힣]{2})?}/;
  var name = (hname = el.getAttribute("HNAME")) ? hname : el.getAttribute("NAME");
  var max = el.getAttribute("Max");
  var min = el.getAttribute("Min");
  var errmsg = el.getAttribute("ErrMsg");
  if (errmsg == null) {
    pattern.exec(type);
    type = type.replace("{max}",max);
    type = type.replace("{min}",min);
    var tail = (RegExp.$2) ? josa(eval(RegExp.$1),RegExp.$2) : "";
    alert(type.replace(pattern,eval(RegExp.$1) + tail));
  } else {
    alert(errmsg);
  }
  if (action == "sel") {
    try {
    	el.select();
    } catch (e) { }
  } else if (action == "del")  {
    el.value = "";
  }
  if (el.getAttribute("type") != "hidden") {
    try {
    	el.focus();
    } catch (e) { }
  }
  return false;
}

/// Form Validating 함수 ///
/// 각 항목에는 hname이라고 한글로 각 항목의 이름을 넣어두면 에러 메세지에 그 이름이 '---을 넣어주세요'와 같이 나오게됩니다.///
/// 그리고 에러메세지를 넣을 경우에는 errmsg라는 항목으로 에러메세지를 넣어주시면됩니다. ///



function validate(form) {
  //if (!BrowserVersionCheck()) return false;

  for (var i = 0; i < form.elements.length; i++ ) {
    var el = form.elements[i];
    if (!el.name || el.disabled) continue;
    var eltype = el.getAttribute("type");
    var elvalue = el.value.trim();
    var elreq = el.getAttribute("Required");

    switch (typeof elreq) {
      case "number":
        elreq = elreq == 0 ? false : true;
        break;
      case "string":
        elreq = elreq.toLowerCase() == "false" || elreq.toLowerCase() == "no" || elreq.toLowerCase() == "0" ? false : true;
        break;
      case "boolean":
        elreq = elreq;
        break;
      case "object":
        elreq = elreq == null ? false : true;
        break;
      default:
        elreq = false;
    }

    /// 다른것과 함께 체크해야 할 것이 있는지 확인하는 부분 ///
    if (el.getAttribute("checkwith") != null) {
      checkwith = el.getAttribute("checkwith");      
      var mustin = el.getAttribute("filled");
      if (!multicheck(form, checkwith, mustin)) return false;
    }
    
    /// 체크 박스의 경우에 체크된 갯수를 체크하기 위한 부분입니다. ///
    /// html에서는 input 제일 처음 checkbox에 Max값과 Min값을 넣어주면 됩니다. (둘중하나도 무방)///
    /// 체크박스가 연속으로 있으면 마지막 체크박스까지는 그룹으로 인식하여 갯수를 체크하게 됩니다.///
    if (eltype == "checkbox"){    
      /*
      var checkmax = parseInt(el.getAttribute("Max"));
      var checkmin = parseInt(el.getAttribute("Min"));
      var nexttype = "checkbox";
      var j = 0;
      var num = 0;
      while(eltype == "checkbox"){
        j++;
        if (el.checked) {
           num++;
        }
        el = form.elements[i+j];
        eltype = el.getAttribute("type");
      }
      i = i + j-1;
      if (checkmin>0) {
        if (num<checkmin) {
          el = form.elements[i-j+1];
          doError(el,TooLittle);
          return false;
          }
      }
      if (checkmax>0){
        if (num>checkmax) {
          el = form.elements[i-j+1];
          doError(el,TooMuch);
          return false;
          }
      }
      */
    }
    /// 라디오 버튼 체크 루틴입니다. Checked와 UnChecked를 확인합니다. ///
    /// 역시 체크가 필요할때 input 테크 안에 required라고 입력하면 됩니다. ///
    
    if (eltype == "radio") {
      if (elreq) {
        if (getRadioIndex(form.elements[el.name]) == null) {
          doError(el,Unchecked);
          return false;
        }
      }
    }
    
    /// TextArea를 체크하는 루틴입니다. textarea테그 안에 Required라고만 넣어 놓으면 null인지만 체크하고 ///
    /// Max를 넣어두면 한글도 체크하여 최대 byte수를 체크합니다.///
    
    if (eltype == "textarea") {
      var maxbyte = parseInt(el.getAttribute("Max"));
      if (elreq) {
        var tmpstring = new String(el.value);
        tmpstring = tmpstring.trim();
        if (tmpstring.length == 0){
          doError(el,NoBlank);
          return false;
        }        
      }
      if (maxbyte>0) {    
        var tmpstring;
        var tmplength=0;
        var onechar;
        var tcount = 0;
        tmpstring = new String(el.value);
        tmpstring = tmpstring.trim();
        tmplength = tmpstring.length;
        
        for (k=0;k<tmplength;k++)
        {
          onechar = tmpstring.charAt(k);
            if (escape(onechar).length > 4) {
              tcount += 2;
            }
            else if (onechar!='\r') {
              tcount++;
            }            
        }
        if (tcount > maxbyte) {
          doError(el,TooLong);
          return false;
        }
        
      }
    }
    
    /// HIDDEN TYPE: added by achadol (2004-03-12)

    if (eltype == "hidden") {
      if (elreq) {
        if (!elvalue) {
          doError(el,NoBlank);
          return false;
        }
      }
    }

    
    /// Select를 체크하는 루틴입니다. required되어 있을때 Null만 체크합니다.///
    
    if (eltype == "select-one") {      
      if (elreq) {
        if (elvalue.length == 0) {
          doError(el,Unchecked);
          return false;
        }
      }
    }
    
    /// File을 체크하는 루틴(added by hdhong, 2003-12-05)

    if (eltype == "file") {
      if (elreq) {
        if (elvalue.length == 0) {
          doError(el,NoBlank);
          return false;
        }
      }
    }
    
    /// Text를 체크하는 루틴입니다. Required, Min, Max는 동일합니다. ///
    /// 그리고 Option에 아래 패턴검사 매핑에 해당하는 키워드를 input안에 넣으면 해당 검사를 수행합니다.///
    
    if (eltype == "text" || eltype == "password") {
      var checkmore = el.getAttribute("Option");      
      if (elreq) {
        if (elvalue.length == 0) {
          doError(el,NoBlank);
          return false;
        }
      }
      if (el.getAttribute("Min") != null) {
        if (elvalue.length < parseInt(el.getAttribute("Min"))) {
          doError(el,TooShort);
          return false;
        }
      }
      if (el.getAttribute("Max") != null) {
        if (elvalue.length > parseInt(el.getAttribute("Max"))) {
          doError(el,TooLong);
          return false;
        }
      }
      
      if (checkmore != null && elvalue) {
        if (!funcs[checkmore](elvalue, el)) return false;
      }/// CheckMore END ///      
      
    }/// Check Text Type End///  
    
  }/// For END///

  if (window.CheckSpecialForm && !CheckSpecialForm(form)) {
    return false;
  }

  // popup upload progress bar window
  uploadProgressBar(form);

  return true;
}/// Func Validate END///

/// 특수 패턴 검사 함수 매핑 ///
var funcs = new Array();
funcs['email'] = isValidEmail;
funcs['emailex'] = isValidEmailEx;
funcs['phone'] = isValidPhone;
funcs['simplephone'] = isValidSimplePhone;
funcs['userid'] = isValidUserid;
funcs['hangul'] = haveHangul;
funcs['number'] = isNumeric;
funcs['engonly'] = alphaOnly;
funcs['jumin'] = isValidJumin;
funcs['bizno'] = isValidBizNo;
funcs['fornno'] = isValidFornNo;
funcs['jumfor'] = isValidJuminForn;

/// 패턴 검사 함수들 ///
function isValidEmail(elvalue, el) {
  var email_pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
  return (email_pattern.test(el.value)) ? true : doError(el,NotValid);
}

function isValidEmailEx(elvalue, el) {
  var email_pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
  var email_pattern_ex = /<\s*([@\w-\.]+)\s*>/;

  if (email_pattern_ex.test(elvalue)) { // in case "Your name < email@domain.com >"
    var matches = elvalue.match(email_pattern_ex);
    return isValidEmailEx(matches[1], el); // callback function with email address part
  } else {
    return (email_pattern.test(elvalue)) ? true : doError(el,NotValid);
  }
}

function isValidUserid(elvalue, el) {
  var pattern = /^[a-zA-Z]{1}[a-zA-Z0-9_]{4,11}$/;
  return (pattern.test(el.value)) ? true : doError(el,"{name+은는} 5자이상 12자 미만이어야 하고,\n 영문,숫자, _ 문자만 사용할 수 있습니다");
}

function haveHangul(elvalue, el) {
  var pattern = /[가-힣]/;
  return (pattern.test(el.value)) ? true : doError(el,"{name+은는} 반드시 한글을 포함해야 합니다");
}

function alphaOnly(elvalue, el) {
  var pattern = /^[a-zA-Z]+$/;
  return (pattern.test(el.value)) ? true : doError(el,NotValid);
}

function isNumeric(elvalue, el) {
  var pattern = /^[0-9]+$/;
  return (pattern.test(el.value)) ? true : doError(el,"{name+은는} 반드시 숫자로만 입력해야 합니다");
}

function isValidJumin(elvalue, el) {
  var pattern = /^([0-9]{6})-?([0-9]{7})$/; 
  var num = elvalue;
  if (!pattern.test(num)) return doError(el,NotValid); 
  num = RegExp.$1 + RegExp.$2;  
  if (num.charAt(6) < 5) {
  var sum = 0;
  var last = num.charCodeAt(12) - 0x30;
  var bases = "234567892345";
  for (i=0; i<12; i++) {
    if (isNaN(num.substring(i,i+1))) return doError(el,NotValid);
    sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
  }
  var mod = sum % 11;
  return ((11 - mod) % 10 == last) ? true : doError(el,NotValid);
  } else {
    el.hname = "외국인등록번호(Forneiger Registration No)";    
    if (!isValidFornNo(elvalue,el))
    { return false; }
    else {
      return true;
    }
  }
}

function isValidBizNo(elvalue, el) { 
    var pattern = /([0-9]{3})-?([0-9]{2})-?([0-9]{5})/; 
  var num = elvalue;
    if (!pattern.test(num)) return doError(el,NotValid); 
    num = RegExp.$1 + RegExp.$2 + RegExp.$3;
    var cVal = 0; 
    for (var i=0; i<8; i++) { 
        var cKeyNum = parseInt(((_tmp = i % 3) == 0) ? 1 : ( _tmp == 1 ) ? 3 : 7); 
        cVal += (parseFloat(num.substring(i,i+1)) * cKeyNum) % 10; 
    } 
    var li_temp = parseFloat(num.substring(i,i+1)) * 5 + '0'; 
    cVal += parseFloat(li_temp.substring(0,1)) + parseFloat(li_temp.substring(1,2)); 
    return (parseInt(num.substring(9,10)) == 10-(cVal % 10)%10) ? true : doError(el,NotValid); 
}

function isValidPhone(elvalue, el) {
  var pattern = /^([0]{1}[0-9]{1,2})-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
  if (pattern.exec(elvalue)) {
    if(RegExp.$1 == "011" || RegExp.$1 == "016" || RegExp.$1 == "017" || RegExp.$1 == "018" || RegExp.$1 == "019") {
      elvalue = RegExp.$1 + "-" + RegExp.$2 + "-" + RegExp.$3;
    }
    return true;
  } else {
    return doError(el,NotValid);
  }
}

function isValidSimplePhone(elvalue, el) {
  var pattern = /^[0-9\-\+ \(\)]+$/;
  return (pattern.test(el.value)) ? true : doError(el,NotValid);
}

function isValidFornNo(elvalue, el) {      
  var pattern = /^([0-9]{6})-?([0-9]{7})$/; 
  var num = elvalue;
  if (!pattern.test(num)) return doError(el,NotValid); 
  var fgn_reg_no= RegExp.$1 + RegExp.$2;  
  if (fgn_reg_no.length != 13) {
          doError(el,"{name}의 자리수가 맞지 않습니다.");
          return false;
  }
  if ((fgn_reg_no.charAt(6) == "5") || (fgn_reg_no.charAt(6) == "6"))
  {
     birthYear = "19";
  }
  else if ((fgn_reg_no.charAt(6) == "7") || (fgn_reg_no.charAt(6) == "8"))
  {
     birthYear = "20";
  }
  else if ((fgn_reg_no.charAt(6) == "9") || (fgn_reg_no.charAt(6) == "0"))
  {
     birthYear = "18";
  }
  else
  {
    el.hname = "주민등록번호";
    if (!isValidJumin(elvalue,el))
    { return false; }
    else {return true;}
  } 

  birthYear += fgn_reg_no.substr(0, 2);
  birthMonth = fgn_reg_no.substr(2, 2) - 1;
  birthDate = fgn_reg_no.substr(4, 2);
  birth = new Date(birthYear, birthMonth, birthDate);
  
  if ( birth.getYear() % 100 != fgn_reg_no.substr(0, 2) ||
       birth.getMonth() != birthMonth ||
       birth.getDate() != birthDate) {
       doError(el,"{name}의 생년월일이 맞지 않습니다.");
       return false;
  }
  
  if (!fgn_no_chksum(fgn_reg_no)){
     doError(el,"{name}에 오류가 있습니다.");
     return false;
  }
   return true;  
}

function fgn_no_chksum(reg_no) {
  
  var sum = 0;
  var odd = 0;
  buf = new Array(13);
  for (i = 0; i < 13; i++) buf[i] = parseInt(reg_no.charAt(i));
  odd = buf[7]*10 + buf[8];
  if (odd%2 != 0) {
    return false;
  }  

  if ((buf[11] != 6)&&(buf[11] != 7)&&(buf[11] != 8)&&(buf[11] != 9)) {
    return false;
  }
		
  multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];

  for (i = 0, sum = 0; i < 12; i++) sum += (buf[i] *= multipliers[i]);
  sum=11-(sum%11);
  if (sum>=10) sum-=10;
  sum += 2;
  if (sum>=10) sum-=10;
  if ( sum != buf[12]) {
    return false;
  } else {
    return true;
  }
}

function isValidJuminForn(elvalue, el) {
  var pattern = /^([0-9]{2})([0-9]{2})([0-9]{2})-?([0-9]{7})$/; 
  var num = elvalue;
  if (!pattern.test(num)) return doError(el,NotValid); 
  
  num = RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4;

  /// 입력된 날짜의 유효성 판별 ///
  
  if (num.charAt(6) < 5) {
    birthYear = (num.charAt(6) <= "2") ? "19" : "20";
  } else {
    birthYear = (num.charAt(7) <= "6") ? "19" : "20";
  }
  
  birthYear += RegExp.$1;
  birthMonth = RegExp.$2 - 1;
  birthDate = RegExp.$3;
  birth = new Date(birthYear, birthMonth, birthDate);

  if ( birth.getYear() % 100 != num.substr(0, 2) ||
       birth.getMonth() != birthMonth ||
       birth.getDate() != birthDate) {
    doError(el,NotValid); 
    return false;
  }
  
  /// Check Sum 검사 ///
  
  if (num.charAt(6) < 5) {
  
    /// 주민등록번호 검사일때 CheckSum 검사 ///
    
    buf = new Array(13);
    for (i = 0; i < 13; i++) buf[i] = parseInt(num.charAt(i));
    multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
    for (i = 0, sum = 0; i < 12; i++) sum += (buf[i] *= multipliers[i]);

    if ((11 - (sum % 11)) % 10 != buf[12]) {
     doError(el,NotValid);
     return false;
    }
    return true;
    
  } else {
  
    /// 외국인 등록 번호 일때 CheckSum 검사 ///
    var sum = 0;
    var odd = 0;
    buf = new Array(13);
    for (i = 0; i < 13; i++) buf[i] = parseInt(num.charAt(i));
    odd = buf[7]*10 + buf[8];
    if (odd%2 != 0) {
      doError(el,NotValid);
      return false;
    }

    if ((buf[11] != 6)&&(buf[11] != 7)&&(buf[11] != 8)&&(buf[11] != 9)) {
      doError(el,NotValid);
      return false;
    }
		
    multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];

    for (i = 0, sum = 0; i < 12; i++) sum += (buf[i] *= multipliers[i]);
    sum=11-(sum%11);
    if (sum>=10) sum-=10;
    sum += 2;
    if (sum>=10) sum-=10;
    if ( sum != buf[12]) {
      doError(el,NotValid);
      return false;
    } else {
      return true;
    }
  }
}

function checkJuminForn(num) {
  var pattern = /^([0-9]{2})([0-9]{2})([0-9]{2})-?([0-9]{7})$/; 
  if (!pattern.test(num)) return false; 
  
  num = RegExp.$1 + RegExp.$2 + RegExp.$3 + RegExp.$4;

  /// 입력된 날짜의 유효성 판별 ///
  
  if (num.charAt(6) < 5) {
    birthYear = (num.charAt(6) <= "2") ? "19" : "20";
  } else {
    birthYear = (num.charAt(7) <= "6") ? "19" : "20";
  }
  
  birthYear += RegExp.$1;
  birthMonth = RegExp.$2 - 1;
  birthDate = RegExp.$3;
  birth = new Date(birthYear, birthMonth, birthDate);

  if ( birth.getYear() % 100 != num.substr(0, 2) ||
       birth.getMonth() != birthMonth ||
       birth.getDate() != birthDate) {
    return false;
  }
  
  /// Check Sum 검사 ///
  
  if (num.charAt(6) < 5) {
  
    /// 주민등록번호 검사일때 CheckSum 검사 ///
    
    buf = new Array(13);
    for (i = 0; i < 13; i++) buf[i] = parseInt(num.charAt(i));
    multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
    for (i = 0, sum = 0; i < 12; i++) sum += (buf[i] *= multipliers[i]);

    if ((11 - (sum % 11)) % 10 != buf[12]) {
      return false;
    }
    return true;
    
  } else {
  
    /// 외국인 등록 번호 일때 CheckSum 검사 ///
    var sum = 0;
    var odd = 0;
    buf = new Array(13);
    for (i = 0; i < 13; i++) buf[i] = parseInt(num.charAt(i));
    odd = buf[7]*10 + buf[8];
    if (odd%2 != 0) {
      return false;
    }

    if ((buf[11] != 6)&&(buf[11] != 7)&&(buf[11] != 8)&&(buf[11] != 9)) {
      return false;
    }
		
    multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];

    for (i = 0, sum = 0; i < 12; i++) sum += (buf[i] *= multipliers[i]);
    sum=11-(sum%11);
    if (sum>=10) sum-=10;
    sum += 2;
    if (sum>=10) sum-=10;
    if ( sum != buf[12]) {
      return false;
    } else {
      return true;
    }
  }
}

function patterncheck(checkstr, check) {

  /// Find out check is in checkstr ///
  /// checkstr is seperated by comma(,) ///
    
    var chkeach = checkstr.split(",");
    
    for (j=0; j<chkeach.length; j++) {
      	if (check == chkeach[j]) return true;
    }
    return false;
}

/// MULTI TEXT BOX CHECK FUNCTION ///

function multicheck(form, checkstr, mustin) {
  multichk = new Array();
  mulidx = new Array();
  var checkwith = "";
  var k = 0;  
  for (ii = 0; ii < form.elements.length; ii++ ) {
    var el = form.elements[i];    
    var eltype = el.getAttribute("type");
    var elopt = el.getAttribute("additional");
    var elvalue = el.value.trim();
    
    /// 다른것과 함께 체크해야 할 것이 있는지 확인하는 부분 ///
    if (el.getAttribute("checkwith") != null) {
      checkwith = el.getAttribute("checkwith");      
      var mustin = el.getAttribute("filled");      
    }
    
    /// CheckWith가 존재할 경우 각 이름을 checkwith string과 비교하여 element index값을 ///
    /// mulidx에 배열로 입력 ///
    
    if (checkwith != null) {
      if (patterncheck(checkwith, el.name)) {
        mulidx[k] = ii;
      	k++;
      }
    }
  }
  /// Loop For Check Multiple Additional TextBox ///
  /// To Check required Field is filled.. ///
  
  var multichk = false;
  
  /// Checkwith에 해당하는 필드를 각각 체크해서 꼭 입력해야 하는 부분중 입력된 부분이 있는지 확인하는 루틴 ///
    
  for (ii=0; ii<mulidx.length; ii++) {
        
    var tmp = form.elements[mulidx[ii]];
    tmpvalue = tmp.value.trim();    
        
    if (patterncheck(mustin, tmp.name)){      
      if (tmpvalue != "") {
        /// 값이 들어있는경우 Validation Check ///
        if (tmp.getAttribute("option") != null) {            
              if (!funcs[tmp.getAttribute("option")](tmpvalue, tmp)) return false;                
            }
        multichk = true;
      }
    }
    
  } /// Any Optional Field filled Check....///
    
  if (multichk) {
    for (l=0; l < mulidx.length; l++) {
      tmp = form.elements[mulidx[l]];
      checkmore = tmp.getAttribute("option");
      tmpvalue = tmp.value.trim();
      if (patterncheck(mustin, tmp.name)){
        if (tmp.value == "") {
          doError(tmp,NoBlank);
          return false;
        } else {
          if (checkmore != null) {
            if (tmpvalue.length == 0) {
               doError(tmp,NoBlank);
               return false;
            } else {
              if (!funcs[checkmore](tmpvalue, tmp)) return false;                
            } /// Null Check and Valid Check End ///
          } /// CheckMore End ///            
        } /// Form Check END ///         
      } else { 
   /// 꼭 입력해야하는 부분이 아닌데 입력되어 있는 경우에 입력 양식에 맞는지 체크하는 부분 ///
        if (tmpvalue != "") {
          if (tmp.getAttribute("option") != null) {
            checkmore = tmp.getAttribute("option");
            if (checkmore != null) {
              if (tmpvalue.length == 0) {
                doError(tmp,NoBlank);
                return false;
              } else {  
                if (!funcs[checkmore](tmpvalue, tmp)) return false;
              } /// Null Check and Valid Check End ///
            } /// CheckMore End ///
          } /// Optional Field Validation Check if Filled... ///
        } /// Not Null Field Validation Check... ///
      } /// Internal Check ENd ///
    } /// Internal For END ///
  } /// Check Other Field End IF END ///
  return true;
}

function BrowserVersionCheck() {
  if ( navigator.appName != "Microsoft Internet Explorer" ) {
    alert ("이 브라우저는 필요한 기능을 지원하지 않습니다.");
    return false;
  }
  
  var ie5 = navigator.userAgent.indexOf("MSIE 5");
  var ie6 = navigator.userAgent.indexOf("MSIE 6");
  var ie7 = navigator.userAgent.indexOf("MSIE 7");

  if ( ie5 == -1 && ie6 == -1 && ie7 == -1) {
    alert ("현재 버전의 브라우저에서는 이 기능이 지원되지 않습니다.");
    return false;
  }
  return true;
}

function blockPaste(objEvent) {
  var iKeyCode, strKey;
  if (!isIE) {
    iKeyCode = objEvent.which;
    strKey = String.fromCharCode(iKeyCode);
    //alert("iKeyCode = " + iKeyCode + " & strKey = " + strKey);
    if ((reKeyboardChars.test(strKey) && reClipboardChars.test(iKeyCode))
          || checkClipboardCode(objEvent, strKey)) {
        //alert("PASTE operation was attempted");
      return false;
    }
  }
}

function checkClipboardCode(objEvent, strKey) {
    // Checks the clipboard to see if the paste shortcut key (Ctrl-V) was selected.
  if (isNS6) {
    if (objEvent.ctrlKey && reClipboardChars.test(strKey))
      return true;
    else
      return false;
  } // end if (isNS6)
  else
    return false;
}

function getValue(el) {
  if (!el) return "";

  if (typeof el.tagName != "undefined") {
    // input elements: radio, checkbox, text, password, hidden, file, image, button, submit, reset
    var eltype = el.type.toLowerCase();

    if (el.disabled) return "";

    // checkbox, radio
    if (eltype == "checkbox" || eltype == "radio") {
      return el.checked ? el.value : "";
    }
    // text, password, hidden, file, submit, reset, button
    else if (eltype == "text" || eltype == "password" || eltype == "hidden" || eltype == "submit" || eltype == "reset" || eltype == "button" || eltype == "file") {
      return el.value;
    }
    // image
    else if (eltype == "image") {
      return el.src;
    }
    // select-one
    else if (eltype == "select-one") {
      return (el.selectedIndex == -1) ? "" : el.options[el.selectedIndex].value;
    }
    // textarea
    else if (eltype == "textarea") {
      return el.value;
    }
    // default
    else {
      return "";
    }
  } else {
    for (var i = 0; i < el.length; i++) {
      if (el[i].checked && !el[i].disabled) return el[i].value;
    }
    return "";
  }
}

function setValue(el, val) {
  if (el.tagName) {
    // input elements: checkbox, text, password, hidden, file, image, button, submit, reset
    var eltype = el.type.toLowerCase();

    // checkbox
    if (eltype == "checkbox") {
      if (el.value == val) {
        el.checked = true;
        return true;
      } else {
        el.checked = false;
        return false;
      }
    }
    // text, password, hidden, file, submit, reset, button
    else if (eltype == "text" || eltype == "password" || eltype == "hidden" || eltype == "submit" || eltype == "reset" || eltype == "button") {
      el.value = val;
      return true;
    }
    // image
    else if (eltype == "image") {
      el.src = val;
      return true;
    }
    // select-one
    else if (eltype == "select-one") {
      for (var i = 0; i < el.options.length; i++) {
        if (el.options[i].value == val) {
          el.selectedIndex = i;
          return true;
        }
      }
      el.selectedIndex = -1;
      return false;
    }
    // textarea
    else if (eltype == "textarea") {
      el.value = val;
      return true;
    }
    // file, default
    else {
      return false;
    }
  } else {
    return setRadioValue(el, val);
  }
}

function getIndex(el) {
  if (el) {
    if (typeof el.tagName != "undefined") {
      if (el.type.toLowerCase() == "radio") {
        return el.checked && !el.disabled ? 0 : null;
      } else if (el.type.toLowerCase() == "select-one") {
        return el.selectedIndex == -1 ? null : el.selectedIndex;
      }
    } else {
      // radio
      for (var i = 0; i < el.length; i++) {
        if (el[i].checked && !el[i].disabled) return i;
      }
    }
  }
  return null;
}

function getRadioValue(el) {
  if (el) {
    if (el.length) {
      for (var i = 0; i < el.length; i++) {
        if (el[i].checked && !el[i].disabled) return el[i].value;
      }
    } else {
      return el.checked ? el.value : "";
    }
  }
  return "";
}

function getRadioIndex(el) {
  if (el) {
    if (el.length) {
      for (var i = 0; i < el.length; i++) {
        if (el[i].checked && !el[i].disabled) return i;
      }
    } else {
      return el.checked ? 0 : null;
    }
  }
  return null;
}

function setRadioValue(el, val) {
  var bSet = false;

  if (el.length) {
    if (val == null) {
      for (var i = 0; i < el.length; i++) {
        el[i].checked = false;
      }
    } else {
      for (var i = 0; i < el.length; i++) {
        if (el[i].value == val && !el[i].disabled) {
          el[i].checked = true; bSet = true;
        } else {
          el[i].checked = false;
        }
      }
    }
  } else {
    if (val == null) {
      el.checked = false;
    } else {
      if (el.value == val && !el.disabled) {
        el.checked = true; bSet = true;
      } else {
        el.checked = false;
      }
    }
  }
  return (bSet == true || val == null) ? true : false;
}

function setRadioIndex(el, idx) {
  var bSet = false;

  if (el.length) {
    if (idx != null && (idx < el.length || idx == -1)) {
      if (idx == -1) {
        for (var i = 0; i < el.length; i++) {
          el[i].checked = false;
        }
      } else {
        for (var i = 0; i < el.length; i++) {
          if (i == idx && !el[i].disabled) {
            el[i].checked = true; bSet = true;
          } else {
            el[i].checked = false;
          }
        }
      }
    }
  } else {
    if (idx == -1) {
      el.checked = false;
    } else if (idx == 0) {
      if (!el.disabled) {
        el.checked = true; bSet = true;
      } else {
        el.checked = false;
      }
    }
  }
  return (bSet == true || idx == -1) ? true : false;
}

function moveOptionUp(obj) {
  for (var i=0; i<obj.options.length; i++) {
    if (obj.options[i].selected) {
      if (i != 0 && !obj.options[i-1].selected) {
        swapOptions(obj,i,i-1);
        obj.options[i-1].selected = true;
      }
    }
  }
}

function moveOptionDown(obj) {
  for (var i=obj.options.length-1; i>=0; i--) {
    if (obj.options[i].selected) {
      if (i != (obj.options.length-1) && ! obj.options[i+1].selected) {
        swapOptions(obj,i,i+1);
        obj.options[i+1].selected = true;
      }
    }
  }
}

function swapOptions(obj,i,j) {
  var ni = obj.options[j].cloneNode(true);
  var nj = obj.options[i].cloneNode(true);
  obj.replaceChild(ni, obj.options[i]);
  obj.replaceChild(nj, obj.options[j]);
}

var oWindow;

function popup(sHTML, sTarget, sOption) {
  if (!sOption) sOption = "width=100,height=100";
  if (!sTarget) sTarget = "popupWin";

  if (self.oWindow && !oWindow.closed) {
    oWindow.close();
    oWindow = window.open(sHTML, sTarget, sOption);
  } else {
    oWindow = window.open(sHTML, sTarget, sOption);
  }

  if (oWindow == null) {
    // WinXP SP2 Block popup -> use DHTML Edit Control to make popup
    //createPopupControl();
    //setTimeout("oWindow = document.getElementById('popupControl').DOM.Script.execScript(\"window.open('"+sHTML+"','"+sTarget+"','"+sOption+"')\")", 100);
    alert("차단된 팝업창을 허용해 주십시오");
  }
  return oWindow;
}

function popModal(sHTML, arguments, sOption) {
  if (window.showModalDialog) {
    var response = window.showModalDialog(sHTML, arguments, sOption ? sOption : "resizable: no; help: no; status: no; scroll: no; ");
    return response;
  } else {
    return null;
  }
}

function popModeless(sHTML, arguments, sOption) {
  if (window.showModalDialog) {
    window.showModelessDialog(sHTML, arguments, sOption ? sOption : "resizable: no; help: no; status: no; scroll: no; ");
  }
}

function createPopupControl() {
  var pop = document.createElement("OBJECT");
  pop.setAttribute('id', 'popupControl');
  pop.setAttribute('classid', 'clsid:2D360201-FFF5-11d1-8D03-00A0C959BC0A');
  pop.setAttribute('width', '1');
  pop.setAttribute('height', '1');

  var param1 = document.createElement("PARAM");
  param1.name = 'ActivateApplets';
  param1.value = '1';
  pop.appendChild(param1);

  var param2 = document.createElement("PARAM");
  param2.name = 'ActivateActiveXControls';
  param2.value = '1';
  pop.appendChild(param2);

  document.body.appendChild(pop);
}

function uploadProgressBar(form) {

  var charCode;
  var uniqID = "";
  var bFound = false;

  if (!document.createElement || !document.insertBefore) return false;

  // check if file elements is empty
  for (var i = 0; i < form.elements.length; i++) {
    var el = form.elements[i];
    if (el.type == "file" && el.value) {
      bFound = true;
      break;
    }
  }
  if (!bFound) return false;

	// generate uniq upload identifier
  for (i = 0; i < 30; i++) {
		var j = GetRandom(1, 2); // determine number(1) or alpha(2)
		
    if (j == 1) {
      charCode = GetRandom(0, 9) + 48; // generate random number (0-9, ascii code 48~57)
      uniqID = uniqID + String.fromCharCode(charCode);
    } else if (j == 2) {
      charCode = GetRandom(0, 25) + 65; // generate random alpha (A-Z, ascii code 65~90)
      uniqID = uniqID + String.fromCharCode(charCode);
		}
  }

  // add upload identifier element to the form and modify form action
  var IDENTIFIER = document.createElement("<INPUT type=hidden name=UPLOAD_IDENTIFIER value='"+uniqID+"'>");

  if (IDENTIFIER) {
    try {
    	var oRef = form.insertBefore(IDENTIFIER, form.childNodes(0));
    } catch (e) {
      alert("[Error in UploadProgressBar] " + e.description);
      return false;
    }

    if (typeof(oRef) == "object") {
      form.action = form.action + (form.action.indexOf("?") == -1 ? "?" : "&") + "UPLOAD_IDENTIFIER=" + uniqID;
      popup("/suite/common/UploadProgressBar.php?UPLOAD_IDENTIFIER="+uniqID, "UploadProgressBar", "width=370,height=115");
    } else
      return false;
  } else
    return false;

  return true;
}

function GetRandom(start, end) {
  var range = end - start + 1;
  var result = start + Math.floor(Math.random()*range);
  return result; 
}

function _CloseOnEsc() {
  if (event.keyCode == 27) {
    if (opener) opener.focus();
    window.close();
    return;
  }
}

function FormatNumberClean(num) {
  var sVal = "";
  var nVal = num.length;
  var sChar = "";
  var sign = 1;

  if (num.lastIndexOf("-") == 0) { sign = -1; }

  try {
    for(i=0;i<nVal;i++) {
      sChar = num.charAt(i);
      nChar = sChar.charCodeAt(0);
      if ((nChar >= 48) && (nChar <= 57))  { sVal += num.charAt(i); }
    }
  } catch (e) { AlertError("Format Number Clean",e); }
  
  return parseInt(sVal * sign);
}

function FormatNumber(num) {       
  var sVal = "";
  var minus = "";
  var CommaDelimiter = ",";

  // force to string
  num = num + '';

  try {
    if (num.lastIndexOf("-") == 0) { minus = "-"; }
    num = FormatNumberClean(num);
    var samount = new String(num);

    for (var i = 0; i < Math.floor((samount.length-(1+i))/3); i++) {
      samount = samount.substring(0, samount.length-(4*i+3)) + CommaDelimiter + samount.substring(samount.length-(4*i+3));
    }
  } catch (e) { AlertError("Format Number",e);  }
  
  return minus + samount;
}

function AlertError(MethodName,e) {
  if (e.description == null) { alert(MethodName + " Exception: " + e.message); }
  else {  alert(MethodName + " Exception: " + e.description); }
}

function el(id) {
  if (document.getElementById) {
    return document.getElementById(id);
  } else if (window[id]) {
    return window[id];
  }
  return null;
}

function addClassName(el, sClassName) {
	var s = el.className;
	var p = s.split(" ");
	var l = p.length;
	for (var i = 0; i < l; i++) {
		if (p[i] == sClassName)
			return;
	}
	p[p.length] = sClassName;
	el.className = p.join(" ").replace( /(^\s+)|(\s+$)/g, "" );
}

function removeClassName(el, sClassName) {
	var s = el.className;
	var p = s.split(" ");
	var np = [];
	var l = p.length;
	var j = 0;
	for (var i = 0; i < l; i++) {
		if (p[i] != sClassName)
			np[j++] = p[i];
	}
	el.className = np.join(" ").replace( /(^\s+)|(\s+$)/g, "" );
}

function urlencode( str ) {
  // http://kevin.vanzonneveld.net
  // +   original by: Philip Peterson
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // *     example 1: urlencode('Kevin van Zonneveld!');
  // *     returns 1: 'Kevin+van+Zonneveld%21'
                                   
  str = str.toString();
  str = encodeURIComponent(str);
  str = str.replace(/%20/g, '+');

  return str;
}
