/**
 * @author Lee Yeong Cheon
 * @version 1.01, 07/12/13
 * @since javascript 1.5
 */

  // object 에 명시된 객체를 반환한다. 단, object 자신이 객체일 경우는 object 자신을 반환한다.
  // object 값이 id 속성의 값 또는 name 속성의 값 과 동일한 객체를 반환하며 우선순위는 id, name 순이다.
  // 반환되는 객체가 name 속성을 참조하여 얻어 낸 것이면 index+1 번째 객체를 반환한하며 index 가 생략되면 Array 타입 객체를 반환한다.
  // 일치하는 객체가 없는 경우 null을 반환한다.
  function getObject(object, index) {
    var retObj = null;
    if(typeof object == "string") {
      retObj = document.getElementById(object);
      if(Validate.isEmpty(retObj.id)) {
        retObj = document.getElementsByName(object);
        if(!Validate.isEmpty(index)) retObj = retObj[index];
      }      
    } else {
      retObj = object;
    }
    return retObj;
  }

  // object 에 명시된 객체(id 속성이 object 이거나  object 가 객체 자신일 경우 object 객체)를 반환한다.
  // 일치하는 객체가 없는 경우 null을 반환한다.
  function getObjectById(object) {
    if(typeof object == "string") return document.getElementById(object);
    else return object;
  }

  // object 에 명시된 객체(name 속성이 object 이거나  object 가 객체 자신일 경우 object 객체)를 반환한다.
  // object의 타입이 String 인 경우 반환하는 객체의 타입은 Array 이다.
  // 일치하는 객체가 없는 경우 null을 반환한다.
  function getObjectByName(object) {
    if(typeof object == "string") return document.getElementsByName(object);
    else return object;
  }

  // object 에 명시된 객체(tag 이름이 object 이거나  object 가 객체 자신일 경우 object 객체)를 반환한다.
  // object의 타입이 String 인 경우 반환하는 객체의 타입은 Array 이다.
  // 일치하는 객체가 없는 경우 null을 반환한다.
  function getObjectByTagName(object) {
    if(typeof object == "string") return document.getElementsByTagName(object);
    else return object;
  }

  // 명시된 객체(object)의 투명도를 opacity(0.0~1.0)값으로 설정한다.
  function setOpacity(object, opacity) {
    object = getObject(object);
    if(Browser.isMsie) {
      object.style.filter = "alpha(opacity=0)";
      object.filters.alpha.Opacity = opacity * 100;
    } else if(Browser.isMozes) {
      object.style.MozOpacity = opacity;
    } else if(Browser.isOpera || Browser.isSafari || Browser.isKhtml) {
      object.style.opacity = opacity;
    }
    return opacity;
  }

  // 명시된 객체(object)의 투명도(0.0~1.0)를 반환한다. 속성값이 정의되어 있지 않은 경우 반환될 값을 두번째 인자에 선택적으로 반환값을 지정한다.
  function getOpacity(object) {
    object = getObject(object);
    var nvl = arguments.length > 1 ? arguments[1] : 1;
    var retValue;
    if(Browser.isMsie) {
      object.style.filter = "alpha(opacity=0)";
      retValue = object.filters.alpha.Opacity ? object.filters.alpha.Opacity / 100 : nvl;
    } else if(Browser.isMozes) {
      retValue = object.style.MozOpacity ? parseFloat(object.style.MozOpacity) : nvl;
    } else if(Browser.isOpera || Browser.isSafari || Browser.isKhtml) {
      retValue = object.style.opacity ? parseFloat(object.style.opacity) : nvl;
    }
    return retValue;
  }

  // 명시된 객체(object)의 style attribute 에 해당하는  값을 가져온다.
  function getStyle(object, attribute) {
    object = getObject(object);
    if(Validate.isNull(object.style[attribute])) {
      object.style[attribute] = object.currentStyle ? object.currentStyle[attribute] : document.defaultView.getComputedStyle(object,null).getPropertyValue(attribute);
//      if("width".equalsIgnoreCase(attribute) || "height".equalsIgnoreCase(attribute)) {
//        if(arguments.length > 2 &&  object.style[attribute] == "auto") object.style[attribute] = arguments[2];
//      }
    }
    return object.style[attribute];
  }

  // plain text(key1=value1&key2=value2...)형식으로 작성된 param 의 이름 및 값을 인코딩하여 반환한다.
  function encode(param) {
    var retValue = "";
    var index = param.indexOf("?");
    if(index >= 0) {
      retValue = param.substring(0,index+1)
      param = param.slice(index+1);
    }
    if(!Validate.isEmpty(param)) {
      param = param.replace(/&(([^&=]+)=)/gi,Char.US+"$1");
      var params = param.split(Char.US);
      for(i = 0; i < params.length; i++) {
        var index = params[i].indexOf("=");
        if(index >= 0) {
          var name = params[i].substring(0,index);
          var value = params[i].slice(index+1);
          if(i != 0) retValue += "&";
          retValue += encodeURIComponent(name)+"="+encodeURIComponent(value);
        } else {
          retValue += encodeURIComponent(params[i]);
        }
      }
    }
    return retValue;
  }

  // encode 함수를 사용해서 인코딩 된 값을 디코딩한다.
  function decode(param) {
    var retValue = "";
    var index = param.indexOf("?");
    if(index >= 0) {
      retValue = param.substring(0,index+1);
      param = param.slice(index+1);
    }
    if(!Validate.isEmpty(param)) {
      var params = param.split("&");
      for(i = 0; i < params.length; i++) {
        var index = params[i].indexOf("=");
        if(index >= 0) {
          var name = params[i].substring(0,index);
          var value = params[i].slice(index+1);
          if(i != 0) retValue += "&";
          retValue += decodeURIComponent(name)+"="+decodeURIComponent(value);
        } else {
          retValue += decodeURIComponent(params[i]);
        }
      }
    }
    return retValue;
  }

  // form 객체를 통해 서비스 요청을 한다.
  // mothod   : 전송방식으로 "get" 또는 "post"을 사용 할 수 있으며, form 객체의 method 속성과 동일하게 동작한다.
  //            주의. post, get 방식을 제외한 어떠한 전송방식도 지원하지 않으며, 지원형식이 아닐 경우 기본 값으로 설정된다. 기본 값은 get 방식이다.
  // url      : 서비스 요청 주소 파라미터이다.
  //            일반적인 http 주소형식을 사용하며, 복수의 값을 전송할 경우 "key1=value1&key2=value2..."와 같이  & 문자로 연결해 준다.
  //            단, value 값에 & 문자를 사용할 경우 %26으로 대체 사용하여야 한다.
  // target   : 서비스 요청에 대한 응답 페이지를 출력할 목적지를 설정하며, form 객체의 target 속성과 동일하게 동작한다.
  // onSubmit : 서비스 요청 즉시(페이지 분기 전) 실행할 handler 함수를 정의한다. form 객체의 onSubmit 이벤트와 동일하게 동작한다.
  //            단, handler함수는 return 값을 가져야 하고 항상 boolean 타입 이어야 한다.
  function forward(method,url,target,onSubmit) {
    var inputCnt = 0;

    // input 객체를 생성한다.
    var createInput = function(type, name, value) {
      var input = document.createElement("input");
      input.setAttribute("id", "tmp_"+inputCnt++);
      input.setAttribute("type", type);
      input.setAttribute("name", name);
      input.setAttribute("value", value);
      return input;
    }

    // form 객체를 생성한다.
    var createForm = function(method,action,target,onSubmit) {
      method = Validate.isEmpty(method.match(/^(get|post)$/gi)) ? "get" : method.match(/^(get|post)$/gi).toString().toLowerCase();
      var form = document.createElement("form");
      form.setAttribute("method", method);
      form.setAttribute("action", action);
      if(!Validate.isEmpty(target)) form.setAttribute("target", target);
      if(!Validate.isEmpty(onSubmit)) form.setAttribute("onSubmit", onSubmit);
      return form;
    }

    var index = url.indexOf("?");
    var action = ""
    var param = "";
    if(index >= 0) {
      action = url.substring(0,index);
      param = url.slice(index+1).replace(/&amp;(amp;)*/gi,"&");
    }
    var form = createForm(method,action,target);
    if(!Validate.isEmpty(param)) {
      param = param.replace(/&(([^&=]+)=)/gi,Char.US+"$1");
      var params = param.split(Char.US);
      for(var i = 0; i < params.length; i++) {
        index = params[i].indexOf("=");
        form.appendChild(createInput("hidden",params[i].substring(0,index),params[i].slice(index+1).replace(/%26/gi,"&").replace(/%25/gi,"%")));
      }
    }
    document.body.appendChild(form);
    if(Validate.isEmpty(onSubmit)) form.submit();
    else if(typeof onSubmit == "function" && onSubmit()) form.submit();
    else if(typeof onSubmit == "string") {
      var isSubmit = eval(onSubmit);
      if( typeof isSubmit == "boolean" && isSubmit) form.submit();
    }
  }

  // arguments[0] 에서 %S 문자열을 순차적으로 arguments[]의 index 값이 1보다 큰 요소 값으로 치환한다.
  function printf() {
    for(var i = 1; i < arguments.length; i++) {
      arguments[0] = arguments[0].replace(/%S/m,arguments[i]);
    }
    return arguments[0];
  }

  // flash movie 를 출력한다.
  function swfWriter(movie,width,height,vars){

    var createParam = function(name,value) {
      var param = document.createElement("param");
      param.setAttribute("name", name);
      param.setAttribute("value", value);
      return param;
    }

    var codeWrapper = document.createElement("div");
    if(Browser.isMsie) {
      var object = document.createElement("object");;
      if(!Validate.isEmpty(width)) object.setAttribute("width", width);
      if(!Validate.isEmpty(height)) object.setAttribute("height", height);
      object.setAttribute("type", "application/x-shockwave-flash");
      object.setAttribute("classid", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000");
      //object.setAttribute("codebase", "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0");
      object.setAttribute("codebase", "http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0");
      object.appendChild(createParam("movie", movie));
      object.appendChild(createParam("flashvars", vars));
      object.appendChild(createParam("menu", "false"));
      object.appendChild(createParam("quality", "high"));
      object.appendChild(createParam("wmode", "transparent"));
      object.appendChild(createParam("allowScriptAccess", "always"));
      object.appendChild(createParam("swliveconnect", "true"));
      codeWrapper.appendChild(object);
    } else {
      var object = document.createElement("embed");
      if(!Validate.isEmpty(width)) object.setAttribute("width", width);
      if(!Validate.isEmpty(height)) object.setAttribute("height", height);
      object.setAttribute("src", movie);
      object.setAttribute("flashvars", vars);
      object.setAttribute("menu", "false");
      object.setAttribute("quality", "high");
      object.setAttribute("wmode", "transparent");
      object.setAttribute("type", "application/x-shockwave-flash");
      object.setAttribute("pluginspage", "http://www.macromedia.com/go/getflashplayer");
      codeWrapper.appendChild(object);
    }
    document.write(codeWrapper.innerHTML);
  }

  // 숫자로 이루어진 문자을 통화표기법으로 치환
  function setCurrencyFormat(target) {
    var object = arguments.length == 1 ? getObject(target) : event.srcElement;
    if(event.keyCode >= 37 && event.keyCode <= 40) return true;
    object.value = object.value.replace(/\D*/gi,"");
    var mod = object.value.length % 3;
    var grpCnt = object.value.length/3 + (mod > 0 ? 1 : 0);
    var regExp = "(\\d{"+(mod == 0 ? 3 : mod)+"})";
    var regExpOut = "$1";
    for(var i = 2; i <= grpCnt; i++) {
      regExp += "(\\d{3})";
      regExpOut += ",$"+i;
    }
    regExp = new RegExp(regExp+"$","gi");
    object.value = object.value.replace(regExp,regExpOut);
  }

  // 숫자로 이루어진 문자을 전화번호 표기법으로 치환
  function setTelFormat(target) {
    if(event.keyCode != Key.BACKSPACE && 
       event.keyCode != Key.TAB && 
       event.keyCode != Key.ENTER && 
       event.keyCode != Key.SHIFT && 
       event.keyCode != Key.LCTRL && 
       event.keyCode != Key.LALT && 
       event.keyCode != Key.RALT && 
       event.keyCode != Key.RCTRL && 
       event.keyCode != Key.ESC && 
       event.keyCode != Key.PAGEUP && 
       event.keyCode != Key.PAGEDOWN && 
       event.keyCode != Key.END && 
       event.keyCode != Key.HOME && 
       event.keyCode != Key.LEFT && 
       event.keyCode != Key.UP && 
       event.keyCode != Key.RIGHT && 
       event.keyCode != Key.DOWN && 
       event.keyCode != Key.INSERT && 
       event.keyCode != Key.DELETE
    ) {
      var object = arguments.length == 1 ? getObject(target) : event.srcElement;
      object.value = object.value.replace(/\D*/gi,"");
      switch(object.value.length) {
      case 1 : case 2 : case 4 : case 5 :
        regExpOut = "$1-$2";
        regExp = new RegExp("(\\d{3})(\\d*)","gi");
        object.value = object.value.replace(regExp,regExpOut);
        break;
      case 6 : case 7 : case 8 : case 9 : case 10 :
        regExpOut = "$1-$2-$3";
        regExp = new RegExp("(\\d{3})(\\d{3})(\\d*)","gi");
        object.value = object.value.replace(regExp,regExpOut);
        break;
      case 11 :
        regExpOut = "$1-$2-$3";
        regExp = new RegExp("(\\d{3})(\\d{4})(\\d{4})","gi");
        object.value = object.value.replace(regExp,regExpOut);
        break;
      }
    }
  }

  // 숫자로 이루어진 문자을 날짜 표기법으로 치환
  function setCalendarFormat(target) {
    if(event.keyCode != Key.BACKSPACE && 
       event.keyCode != Key.TAB && 
       event.keyCode != Key.ENTER && 
       event.keyCode != Key.SHIFT && 
       event.keyCode != Key.LCTRL && 
       event.keyCode != Key.LALT && 
       event.keyCode != Key.RALT && 
       event.keyCode != Key.RCTRL && 
       event.keyCode != Key.ESC && 
       event.keyCode != Key.PAGEUP && 
       event.keyCode != Key.PAGEDOWN && 
       event.keyCode != Key.END && 
       event.keyCode != Key.HOME && 
       event.keyCode != Key.LEFT && 
       event.keyCode != Key.UP && 
       event.keyCode != Key.RIGHT && 
       event.keyCode != Key.DOWN && 
       event.keyCode != Key.INSERT && 
       event.keyCode != Key.DELETE
    ) {
      var object = arguments.length == 1 ? getObject(target) : event.srcElement;
      object.value = object.value.replace(/\D*/gi,"");
      switch(object.value.length) {
      case 1 : case 2 : case 3 : case 4 : case 5 : 
        regExpOut = "$1-$2";
        regExp = new RegExp("(\\d{4})(\\d*)","gi");
        object.value = object.value.replace(regExp,regExpOut);
        break;
      case 6 : case 7 : 
        regExpOut = "$1-$2-$3";
        regExp = new RegExp("(\\d{4})(\\d{2})(\\d*)","gi");
        object.value = object.value.replace(regExp,regExpOut);
        break;
      case 8 :
        regExpOut = "$1-$2-$3";
        regExp = new RegExp("(\\d{4})(\\d{2})(\\d{2})","gi");
        object.value = object.value.replace(regExp,regExpOut);
        break;
      }
    }
  }

  // 날짜 선택기
  function dateChooser(year,month,date,hours,minutes,seconds,ms) {
  	var closeEnable = true;
    var target = null;
    var calendar = null;
    var instance = null;
    switch(arguments.length) {
      case 0 :
        target = event.srcElement;
        calendar = new Date();
        instance = document.getElementById("_datepicker");
        break;
      case 1 :
        target = getObjectById(arguments[0]);
        calendar = new Date();
        instance = document.getElementById("_datepicker");
        break;
      case 3 : case 4 : case 5 : case 6 : case 7 :
        target = event.srcElement;
        calendar = new Date(year,month-1,date,hours,minutes,seconds,ms);
        instance = document.getElementById("_datepicker");
        break;
      default :
        throw Exception("Error", "지원하지 않는 기능입니다.", "Usage \nDatePicker([object]|[year,month,date[,hours[,minutes[,seconds[,ms]]]]])");
    }
    if(!Validate.isNull(instance)) { 
      if(closeEnable) {
        document.body.removeChild(instance);
      } else { 
        closeEnable = true; 
      }
    }

    var getController = function(newYear, newMonth) {
      if(!Validate.isNull(newYear) && !Validate.isNull(newMonth)) {
        calendar.setDate(1);
        calendar.setMonth(newMonth);
        calendar.setFullYear(newYear);
      }
      var year = calendar.getFullYear();
      var month = calendar.getMonth();
      var table = document.createElement("table");
      var tbody = document.createElement("tbody");
      var tr = document.createElement("tr");
      var td = document.createElement("td");
      var img_left = document.createElement("img");
      var img_right = document.createElement("img");
      table.style.borderCollapse = "collapse";
      table.style.border = "solid #DBDBDB 1px";
      table.setAttribute("border", "1px");
      table.setAttribute("width", "100%");
      table.setAttribute("height", "20px");
      table.setAttribute("cellpadding", "0px");
      table.setAttribute("cellspacing", "0px");
      td.style.color = "#0066CC";
      td.style.fontSize = "12px";
      td.style.fontWeight = "bold";
      td.style.backgroundColor = "#FFFFFF";
      td.setAttribute("align", "center");
      img_left.style.cursor = "pointer";
      img_left.style.marginRight = "5px";
      img_left.setAttribute("align","absmiddle");
      img_left.setAttribute("src","/common/js/_images/datepicker/btn_arrow_left.gif");
      img_right.style.cursor = "pointer";
      img_right.style.marginLeft = "5px";
      img_right.setAttribute("align","absmiddle");
      img_right.setAttribute("src","/common/js/_images/datepicker/btn_arrow_right.gif");
      img_left.onclick = function() {
      	if(Browser.isOpera) closeEnable = false;
        if(--month == -1) {
          month = 11;
          --year;
        }
        var _new_controller = getController(year, month);
        var _new_calendar = getCalendar(year, month);
        div.replaceChild(_new_controller,_controller);
        div.replaceChild(_new_calendar,_calendar);
        _controller = _new_controller;
        _calendar = _new_calendar;
      };
      img_right.onclick = function() {
      	if(Browser.isOpera) closeEnable = false;
        if(++month == 12) {
          month = 0;
          ++year;
        }
        var _new_controller = getController(year, month);
        var _new_calendar = getCalendar(year, month);
        div.replaceChild(_new_controller,_controller);
        div.replaceChild(_new_calendar,_calendar);
        _controller = _new_controller;
        _calendar = _new_calendar;
      };
      td.appendChild(img_left);
      td.appendChild(document.createTextNode(year + "년 " + (month < 9 ? "0" : "") + (month + 1) + " 월"));
      td.appendChild(img_right);
      tr.appendChild(td);
      tbody.appendChild(tr);
      table.appendChild(tbody);
      return table;
    };

    var getCalendar = function(newYear, newMonth) {
      var holiday = null; // 공휴일 리스트
      var day = new Array(
                  new Array("일","#CC0000"), 
                  new Array("월","#666666"), 
                  new Array("화","#666666"), 
                  new Array("수","#666666"), 
                  new Array("목","#666666"), 
                  new Array("금","#666666"), 
                  new Array("토","#3399CC"));
      if(!Validate.isNull(newYear) && !Validate.isNull(newMonth)) {
        calendar.setDate(1);
        calendar.setMonth(newMonth);
        calendar.setFullYear(newYear);
      }
      var year = calendar.getFullYear();
      var month = calendar.getMonth();
      var weeks = calendar.getWeeks();
      var firstDay = calendar.getFirstDay();
      var lastDate = calendar.getLastDate();
      var lastPosition = firstDay + lastDate;
      var table = document.createElement("table");
      table.style.borderCollapse = "collapse";
      table.style.border = "solid #DBDBDB 1px";
      table.setAttribute("border", "1px");
      table.setAttribute("width", "100%");
      table.setAttribute("cellpadding", "0px");
      table.setAttribute("cellspacing", "0px");
      var tbody = document.createElement("tbody");
      var tr_day = document.createElement("tr");
      for(var idx_td = 0; idx_td < 7; idx_td++) {
        var td = document.createElement("td");
        td.appendChild(document.createTextNode(day[idx_td][0]));
        td.style.width = "20px";
        td.style.color = day[idx_td][1];
        td.style.fontSize = "11px";
        td.style.backgroundColor = "#FFFFFF";
        td.setAttribute("align", "center");
        tr_day.appendChild(td);
      }
      tbody.appendChild(tr_day);
      for(var idx_tr = 0; idx_tr < weeks; idx_tr++) {
        var tr = document.createElement("tr");
        for(var idx_td = 0; idx_td < 7; idx_td++) {
          var td = document.createElement("td");
          var currentPosition = (idx_tr) * 7 + idx_td + 1;
          var currentDate = currentPosition - firstDay;
          td.style.color = day[idx_td][1];
          td.style.fontSize = "11px";
          td.style.backgroundColor = "#FFFFFF";
          td.setAttribute("align", "center");
          if(currentPosition > firstDay && currentPosition <= lastPosition) {
            var today = new Date();
            if(today.getFullYear() == year && today.getMonth() == month && today.getDate() == currentDate) td.style.fontWeight = "bold";
            td.appendChild(document.createTextNode(currentDate));
            td.onclick = function() {
              var date = this.firstChild.nodeValue;
              target.value = year + "-" + (month < 9 ? "0" : "") + (month + 1) + "-" + (date <= 9 ? "0" : "") + date;
            };
            td.onmouseover = function() {
              this.style.backgroundColor = "yellow";
            };
            td.onmouseout = function() {
              this.style.backgroundColor = "#FFFFFF";
            };
          }
          tr.appendChild(td);
        }
        tbody.appendChild(tr);
      }
      table.appendChild(tbody);
      return table;
    };

    var weeks = calendar.getWeeks();
    var div = document.createElement("div");
    var offset = 10;
    var width = Browser.isMozes ? 147 : 148;
    var height = new Array(116, 135, 154);
    var top = event.y + (Browser.isMozes ? -document.documentElement.scrollTop: document.documentElement.scrollTop);
    var left = event.x + (Browser.isMozes ? -document.documentElement.scrollLeft: document.documentElement.scrollLeft);
    
    var innerWidth = window.innerWidth ? window.innerWidth : document.body.clientWidth;
    var innerHeight = window.innerHeight ? window.innerHeight : document.body.clientHeight;
    div.style.top =  ((innerHeight > top + height[weeks-4] + offset) ? top : (innerHeight - height[weeks-4] - offset)) + (Browser.isMsie ? 0 : (Browser.isMozes ? window.pageYOffset : 0)) + "px";
    div.style.left = ((innerWidth > left + width + offset) ? left : (innerWidth - width - offset)) + (Browser.isMsie ? 0 : (Browser.isMozes ? window.pageXOffset : 0)) + "px";
    div.style.width = width + "px";
    div.style.height = height[weeks-4] + "px";
    div.style.cursor = "pointer";
    div.style.position = "absolute";
    div.style.backgroundColor = "white";
    div.style.zIndex = "6";
        
    //div.style.border = "solid 1px red";
    div.style.display = "block";
    //div.style.visibility = Browser.isMozes?"show":"visible";
    
    div.setAttribute("align", "center");
    div.setAttribute("id", "_datepicker");
    div.onclick = function() {
    	if(closeEnable) {
    		document.body.removeChild(document.getElementById("_datepicker"));
    	}	else { 
    		closeEnable = true; 
      }
    };

    var _controller = getController();
    var _calendar = getCalendar();
    div.appendChild(_controller);
    div.appendChild(_calendar);
    document.body.appendChild(div);
  }

  // 팝업윈도우를 생성하며, 팝업차단기능이 설정되어 있는 경우는 경고메시지를 출력한다.
  function openWindow(contextURL,name,option) {
    var object = null;
    if(!contextURL.isEmpty()) {
      object = window.open(contextURL,name,option);
      if(Validate.isNull(object)) {
        alert(Message.deniedWinOpen);
      } else {
        object.focus();
      }
    }
    return object;
  }

  // siren24 실명인증 페이지 호출 후 인증 결과를 포함하여 retUrl페이지로  forward 한다.
  function openCBAWindow1(id,retUrl) {
    var reqNum = (new Date).getTime(); // 요청고유번호 - 보완필요(고유한 번호가 아니다.)
    if(Validate.isEmpty(id)) throw Exception("Error", "회원사아이디가 없습니다.", "siren24 실명인증시 필수 항목인 회원사아이디(id)가 없습니다.");
    if(Validate.isEmpty(reqNum)) throw Exception("Error", "요청고유번호가 없습니다.", "siren24 실명인증시 필수 항목인 요청고유번호(reqNum)가 없습니다.");
    if(Validate.isEmpty(retUrl)) throw Exception("Error", "리턴페이지가 없습니다.", "siren24 실명인증시 필수 항목인 리턴페이지(retUrl)가 없습니다.");
    if(!Validate.isEmpty(openWindow("about:blank", "_CbaWindow", "width=410,height=450,resizable=0,scrollbars=no,status=0,titlebar=0,toolbar=0,left=300,top=200"))) {
      if(retUrl.isRegexp(/^[^\?=]*\?.*/gi)) {
        if(retUrl.isRegexp(/^[^\?=]*\?[^(&amp;)]*&amp;.*/gi)) retUrl += "&amp;";
      } else {
        retUrl += "?"
      }
      retUrl += "reqNum=" + reqNum;
      forward("post","https://name.siren24.com/vname/jsp/vname_j10.jsp","id="+id+"&reqNum="+reqNum+"&retUrl="+retUrl,"_CbaWindow","");
    }
  }

  // iframe 내용 크기에 맞게 크기를 변경한다.
  // <iframe src="URL" onload="resizeFrame(this)" scrolling="no" frameborder="0"></iframe>  
  function resizeFrame(iframe) {
    var innerBody = iframe.contentWindow.document.body;
    var innerHeight = innerBody.scrollHeight + (innerBody.offsetHeight - innerBody.clientHeight);
    var innerWidth = innerBody.scrollWidth + (innerBody.offsetWidth - innerBody.clientWidth);
    iframe.style.height = innerHeight;
    iframe.style.width = innerWidth;
  }

  // body 내용 크기에 맞게 윈도우 크기를 변경한다.
  function resizeWindow(documentObj) {
    var innerBody = documentObj.body;
    var innerWidth = 0;
    var innerHeight = 0;
    if(Browser.isMsie) {
      innerWidth = innerBody.scrollWidth - innerBody.clientWidth;
      innerHeight = innerBody.scrollHeight - innerBody.clientHeight;
    } else {
      innerWidth = innerBody.scrollWidth - window.innerWidth;
      innerHeight = innerBody.scrollHeight - window.innerHeight;
    }
    top.resizeBy(innerWidth,innerHeight);
  }

  // siren24 실명인증 페이지 호출 후 인증 결과를 포함하여 retUrl페이지로  forward 한다.
  function openCBAWindow(id, host, retUrl) {
    var inputCnt = 0;
    
    // hidden 타입의 input 객체를 생성한다.    
    var createInput = function(type, name, value) {
      var input = document.createElement("input");
      input.setAttribute("id", "tmp_"+inputCnt++);
      input.setAttribute("type", type);
      input.setAttribute("name", name);
      input.setAttribute("value", value);
      return input;
    }

    // form 객체를 생성한다.
    var createForm = function(method,action,target,onSubmit) {
      method = Validate.isNull(method.match(/^(get|post)$/gi)) ? "get" : method.match(/^(get|post)$/gi).toString().toLowerCase();
      var form = document.createElement("form");
      form.setAttribute("method", method);
      form.setAttribute("action", action);
      if(!Validate.isNull(target)) form.setAttribute("target", target);
      if(!Validate.isNull(onSubmit)) form.setAttribute("onSubmit", onSubmit);
      return form;
    }
    
    var reqNum = id+"_"+(new Date).getTime();
    window.open("", "_CbaWindow", "width=410, height=450, resizable=0, scrollbars=no, status=0, titlebar=0, toolbar=0, left=300, top=200" );
    var form = createForm("post","https://name.siren24.com/vname/jsp/vname_j10.jsp","_CbaWindow");
    form.appendChild(createInput("hidden","id",id));
    form.appendChild(createInput("hidden","reqNum",reqNum));
    form.appendChild(createInput("hidden","retUrl",host+retUrl));
    document.body.appendChild(form);
    form.submit();
  }