///*********************************************************
//  Written By  : SeungJoon Lee (newbie79@gmail.com)
//  Created At  : 2004.05.13
//  Version   : 1.0
//  Html Form 체크용 함수
//
//  $Id: form.js,v 1.1 2006/12/06 02:12:23 newbie79 Exp $
//**********************************************************/

/*
  [ Html Element Attribute 설정 ]

  fm_name='이름'      : 오류 메시지 출력시 보여질 이름   예)회원번호, 주소
  fm_required         : value attribute의 값을 입력하였는지 검사한다.
                        select일 경우, 데이터가 있는지 검사한다.
                        checkbox일 경우, 선택되어 있는지 검사한다.
                        radio일 경우, 선택되어 있는지 검사한다.
  fm_trim             : value attribute의 좌우 공백을 제거한다.
  fm_minlength='값'   : value attribute의 byte 길이의 최소값을 지정한다.
  fm_maxlength='값'   : value attribute의 byte 길이의 최대값을 지정한다.
  fm_errmsg='오류메시지'  : 오류 발생시 출력할 메시지 재정의 (재정의 하지 않을 경우, 기본 오류 메시지 출력)

  fm_type='종류'      : value attribute의 형식을 정의한다. (value attribute에 값이 존재할 경우만 검사한다.)
                        date: 날짜, time: 날짜,   email: 이메일주소
                        uint: 자연수  int: 정수 float: 실수
                        alpha: 영문자 ualpha: 영대문자  lalpha: 영소문자
                        alnum: 자연수 및 영문자
  fm_minvalue='값'    : fm_type이 숫자일때 value attribute의 최소값을 지정한다.
  fm_maxvalue='값'    : fm_type이 숫자일때 value attribute의 최대값을 지정한다.


  [ 사용 예 ]

  <form name="form1" method="get" action="" onSubmit="return Frm_CheckForm(this);">
    <input type="text" name="title" fm_name="제목" fm_required fm_minlength="4" fm_maxlength="200">
    <input type="text" name="name" fm_name="이름" fm_required>
    <input type="text" name="email" fm_name="이메일" fm_required fm_type="email">
    <input type="text" name="cnt" fm_name="구입갯수" fm_required fm_type="uint" fm_minvalue="1" fm_maxvalue="100">
  </form>
*/


// 공용 변수 //
var GS_ERROR_MSG = "";    // 폼검사시 오류메시지 //


// 이메일형식 유효 검사 //
function Frm_IsEmail( EmailAddress )
{
  var str = EmailAddress;
  var pattern = /^[a-zA-Z0-9][-_a-zA-Z0-9.]+@[a-zA-Z0-9][-_a-zA-Z0-9.]+\.[a-zA-Z]{2,3}$/

  if( pattern.test(str) )
    return true;
  else
    return false;
}

// 유효한 날짜인지 검사 //
function Frm_IsDate( year, month, day )
{
  try
  {
    year = parseInt( year, 10 );
    month = parseInt( month, 10 );
    day = parseInt( day, 10 );

    d = new Date( year, month-1, day, 0 , 0, 0, 0 );

    if( year != d.getFullYear() || month != (d.getMonth()+1) || day != d.getDate() )
      return false;
    else
      return true;
  }
  catch(e)
  {
    return false;
  }
}

// 유효한 시간인지 검사 //
function Frm_IsTime( hour, minute )
{
  try
  {
    hour = parseInt( hour, 10 );
    minute = parseInt( minute, 10 );

    d = new Date( 2008, 8, 8, hour, minute, 0, 0 );

    if( hour != d.getHours() || minute != (d.getMinutes()) )
      return false;
    else
      return true;
  }
  catch(e)
  {
    return false;
  }
}

// Trim //
function Frm_Trim( str )
{
  var strTemp = "" + str;
  return strTemp.replace(/^\s*/ ,"").replace(/\s*$/ ,"");
}

// 길이를 반환한다. //
function Frm_GetBytes( str )
{
  if( null == str || "" == str )
    return 0;

  var len = 0, j;

  for (i=0, j=str.length; i<j; i++, len++)
  {
    // 기본 Ascii code가 아니면 2 Byte 문자로 판단한다.
    if ( 0 > str.charCodeAt(i) || 127 < str.charCodeAt(i) )
      len++;
  }

  return len;
}

// 같은 이름의 Radio 중에 선택된 Radio객체를 반환한다. //
function Frm_GetCheckedRadioObject( radioObject )
{
  if( "undefined" == typeof(radioObject) )
    return null;

  if( 1 < radioObject.length )
  {
    for(i=0; i<radioObject.length; i++)
    {
      if( true == radioObject[i].checked )
        return radioObject[i];
    }
  }
  else
  {
    if( true == radioObject.checked )
      return radioObject;
  }

  return null;
}

// Element의 Trim 처리를 한다.
function Frm_TrimElement( elementObject )
{
  if( null != elementObject.getAttribute("fm_trim") )
    elementObject.value = Frm_Trim( elementObject.value );
}

// Element의 최대길이를 제한한다.
function Frm_CheckMaxLength( elementObject )
{
  var fmMaxLength = elementObject.getAttribute("fm_maxlength");

  if( null != fmMaxLength && "" != fmMaxLength )
  {
    var iMaxBytes = parseInt( fmMaxLength, 10 );
    var iMaxLen = parseInt( iMaxBytes/2, 10 );
    var len = Frm_GetBytes( elementObject.value );

    if( len > iMaxBytes && 0 < iMaxBytes )
    {
      GS_ERROR_MSG = iMaxLen + "자(한글 기준)까지 입력하실 수 있습니다.";
      var fm_element = elementObject.getAttribute("fm_name");
      if ( null != fm_element && "" != fm_element )
        GS_ERROR_MSG = fm_element + "은(는) " + GS_ERROR_MSG;
    }
  }
}

// Element의 최소길이를 제한한다.
function Frm_CheckMinLength( elementObject )
{
  var fmMinLength = elementObject.getAttribute("fm_minlength");

  if( null != fmMinLength && "" != fmMinLength )
  {
    var iMinBytes = parseInt( fmMinLength, 10 );
    var iMinLen = parseInt( iMinBytes/2, 10 );
    var len = Frm_GetBytes( elementObject.value );

    if( len < iMinBytes )
    {
      GS_ERROR_MSG = iMinLen + "자(한글 기준) 이상 입력하셔야 합니다.";
      var fm_element = elementObject.getAttribute("fm_name");
      if ( null != fm_element && "" != fm_element )
        GS_ERROR_MSG = fm_element + "은(는) " + GS_ERROR_MSG;
    }
  }
}

// Element의 최대값을 제한한다.
function Frm_CheckMaxValue( elementObject )
{
  var fmMaxLength = elementObject.getAttribute("fm_maxvalue");

  if( null != fmMaxLength && "" != fmMaxLength && !isNaN( fmMaxLength )  )
  {
    if( null != elementObject.value && "" != elementObject.value )
    {
      var iMaxValue = parseInt( fmMaxLength, 10 );
      var iValue = parseInt( elementObject.value, 10 );

      if( iValue > iMaxValue )
      {
        GS_ERROR_MSG = "최대 " + iMaxValue + "까지 입력할 수 있습니다.";
        var fm_element = elementObject.getAttribute("fm_name");
        if ( null != fm_element && "" != fm_element )
          GS_ERROR_MSG = fm_element + "은(는) " + GS_ERROR_MSG;
      }
    }
  }
}

// Element의 최소값을 제한한다.
function Frm_CheckMinValue( elementObject )
{
  var fmMinLength = elementObject.getAttribute("fm_minvalue");

  if( null != fmMinLength && "" != fmMinLength && !isNaN( fmMinLength )  )
  {
    if( null != elementObject.value && "" != elementObject.value )
    {
      var iMinValue = parseInt( fmMinLength, 10 );
      var iValue = parseInt( elementObject.value, 10 );

      if( iValue < iMinValue )
      {
        GS_ERROR_MSG = "최소 " + iMinValue + " 이상 입력하셔야 합니다.";
        var fm_element = elementObject.getAttribute("fm_name");
        if ( null != fm_element && "" != fm_element )
          GS_ERROR_MSG = fm_element + "은(는) " + GS_ERROR_MSG;
      }
    }
  }
}

// 필수입력 element를 검사한다.
function Frm_CheckRequiredValue( elementObject )
{
  // modified : 2007-08-23 이재진
  //if( null == elementObject.getAttribute("fm_required") )
  if( null == elementObject.getAttribute("fm_required") || true == elementObject.disabled )
    return;

  if( "hidden" == elementObject.type || "textarea" == elementObject.type ||
    "file" == elementObject.type || "password" == elementObject.type ||
    "text" == elementObject.type )
  {
    var strValue = Frm_Trim( elementObject.value );

    if( "" == strValue )
    {
      var fm_element = elementObject.getAttribute("fm_name");
      var fm_errmsg = elementObject.getAttribute("fm_errmsg");
      if( null != fm_errmsg && "" != fm_errmsg )
        GS_ERROR_MSG = fm_errmsg;
      else
        GS_ERROR_MSG = ( null == fm_element || "" == fm_element ) ? "빈 칸을 채워주세요." : fm_element + "을(를) 입력해 주세요.";
    }
  }
  else if( "select-one" == elementObject.type || "select" == elementObject.type )
  {
    // modified : 2007-07-16 이재진
    //if( 0 >= elementObject.options.length.value )
    if( 0 >= elementObject.value.length )
    {
      var fm_element = elementObject.getAttribute("fm_name");
      var fm_errmsg = elementObject.getAttribute("fm_errmsg");
      if( null != fm_errmsg && "" != fm_errmsg )
        GS_ERROR_MSG = fm_errmsg;
      else
        GS_ERROR_MSG = ( null == fm_element || "" == fm_element ) ? "선택해 주세요." : fm_element + "을(를) 선택해 주세요.";
    }
  }
  else if( "checkbox" == elementObject.type )
  {
    if( false == elementObject.checked )
    {
      var fm_element = elementObject.getAttribute("fm_name");
      var fm_errmsg = elementObject.getAttribute("fm_errmsg");
      if( null != fm_errmsg && "" != fm_errmsg )
        GS_ERROR_MSG = fm_errmsg;
      else
        GS_ERROR_MSG = ( null == fm_element || "" == fm_element ) ? "체크해 주세요." : fm_element+"을(를) 체크해 주세요.";
    }
  }
  else if( "radio" == elementObject.type )
  {
    var collectionObject = eval("elementObject.form." + elementObject.name);  // collection 객체를 구한다.

    var selectedObject = Frm_GetCheckedRadioObject( collectionObject );

    if( null == selectedObject )
    {
      var fm_element = elementObject.getAttribute("fm_name");
      var fm_errmsg = elementObject.getAttribute("fm_errmsg");
      if( null != fm_errmsg && "" != fm_errmsg )
        GS_ERROR_MSG = fm_errmsg;
      else
        GS_ERROR_MSG = ( null == fm_element || "" == fm_element ) ? "선택해 주세요." : fm_element+"을(를) 선택해 주세요.";
    }
  }
}


// fm_type attribute를 검사한다.
function Frm_CheckFmType( elementObject )
{
  if( "" == elementObject.value )
    return;

  var pattern = null;
  var msg = "";

  switch( elementObject.getAttribute("fm_type") )
  {
    case "date": // 날짜 //
      pattern = /^\d{4}-[0-1][0-9]-[0-3][0-9]$/
      msg = "YYYY-MM-DD 형식으로 날짜를 입력해 주세요. \n\n예)2004년 1월 23일 -> 2004-01-23";
      break;

    case "time": // 시간 //
      pattern = /^[0-2][0-9]:[0-5][0-9]$/
      msg = "HH:MM 형식으로 시간을 입력해 주세요. \n\n예)오후 3시 20분 -> 15:20";
      break;

    case "email": // 이메일주소 //
      pattern = /^[a-zA-Z0-9][-_a-zA-Z0-9.]+@[a-zA-Z0-9][-_a-zA-Z0-9.]+\.[a-zA-Z]{2,3}$/
      msg = "올바른 이메일주소가 아닙니다.";
      break;

    case "uint": // 자연수 //
      pattern = /^[0-9]+$/
      msg = "숫자만 입력해 주세요.";
      break;

    case "int": // 자연수 //
      pattern = /^[-+]?[0-9]+$/
      msg = "정수만 입력해 주세요.";
      break;

    case "float": // 실수 //
      pattern = /^[-+]?[0-9]+[.]?[0-9]*$/
      msg = "실수만 입력해 주세요.";
      break;

    case "alpha": // 영문자 //
      pattern = /^[A-Za-z]+$/
      msg = "영문자만 입력해 주세요.";
      break;

    case "ualpha": // 영대문자 //
      pattern = /^[A-Z]+$/
      msg = "영문 대문자만 입력해 주세요.";
      break;

    case "lalpha": // 영소문자 //
      pattern = /^[a-z]+$/
      msg = "영문 소문자만 입력해 주세요.";
      break;

    case "alnum": // 영문자 및 실수 //
      pattern = /^[0-9A-Za-z]+$/
      msg = "영문자와 숫자만 입력해 주세요.";
      break;
  }

  if( null != pattern )
  {
    if( !pattern.test( elementObject.value ) )
    {
      var fm_errmsg = elementObject.getAttribute("fm_errmsg");
      var fm_name = elementObject.getAttribute("fm_name");

      if( null != fm_errmsg && "" != fm_errmsg )
        GS_ERROR_MSG = fm_errmsg;
      else
        GS_ERROR_MSG = ( null == fm_name || "" == fm_name ) ? msg : fm_name + "은(는) " + msg;
    }
  }

  // 유효한 날짜형식일 경우, 올바른 날짜인지 검사한다.
  if( "date" == elementObject.getAttribute("fm_type") && "" == GS_ERROR_MSG )
  {
    var d = elementObject.value;

    if( false == Frm_IsDate( d.substr(0,4), d.substr(5,2), d.substr(8,2) ) )
      GS_ERROR_MSG = elementObject.value + "은(는) 올바른 날짜가 아닙니다.";
  }

  // 유효한 시간형식일 경우, 올바른 시간인지 검사한다.
  if( "time" == elementObject.getAttribute("fm_type") && "" == GS_ERROR_MSG )
  {
    var t = elementObject.value;

    if( false == Frm_IsTime( t.substr(0,2), t.substr(3,2) ) )
      GS_ERROR_MSG = elementObject.value + "은(는) 올바른 시간이 아닙니다.";
  }
}

//폼 검사
function Frm_CheckForm( formObject )
{
  var e;
  GS_ERROR_MSG = "";  // 오류 메시지 초기화

  for( var i=0 ; i<formObject.elements.length ; i++ )
  {
    e = formObject.elements[i];

    if( "hidden" == e.type || "textarea" == e.type || "file" == e.type ||
      "password" == e.type || "text" == e.type )
    {
      if( "" == GS_ERROR_MSG )  // value attribute의 좌우 공백을 제거한다.
        Frm_TrimElement( e );

      if( "" == GS_ERROR_MSG )  // value attribute에 값이 있는지 검사한다.
        Frm_CheckRequiredValue( e );

      if( "" == GS_ERROR_MSG )  // value attribute의 문자열 길이를 검사한다.
        Frm_CheckMinLength( e );

      if( "" == GS_ERROR_MSG )  // value attribute의 문자열 길이를 검사한다.
        Frm_CheckMaxLength( e );

      if( "" == GS_ERROR_MSG )  // fm_type를 검사한다.
        Frm_CheckFmType( e );

      if( "uint" == e.getAttribute("fm_type") )
      {
        if( "" == GS_ERROR_MSG )
          Frm_CheckMinValue(e);

        if( "" == GS_ERROR_MSG )
          Frm_CheckMaxValue(e);
      }
    }
    else if( "select-one" == e.type || "select" == e.type || "checkbox" == e.type || "radio" == e.type )
    {
      Frm_CheckRequiredValue(e);
    }

    // 오류 발생시 오류 메시지를 출력하고 빠져나간다.
    if( "" != GS_ERROR_MSG )
    {
      alert( GS_ERROR_MSG );

      if( "textarea" == e.type || "file" == e.type || "password" == e.type || "text" == e.type )
      {
        try { e.select(); } catch(e) {}
      }

      if ( "hidden" != e.type  )
      {
        try { e.focus(); } catch(e) {}
      }

      return false;
    }
  }

  return true;
}

// Submit
function Frm_Submit( formObject )
{
  if( true == Frm_CheckForm( formObject ) )
    formObject.submit();
}