var SUCCESS = 0;
var ERR_REQUIRED = 10;
var ERR_MASK = 20;
var ERR_DATE = 30;
var ERR_NUMBER = 40;
var ERR_JUMIN = 50;
var ERR_MAIL = 60;
var ERR_CORP = 70;
var ERR_TEL = 80;
var ERR_HPTEL = 81;
var ERR_MAXLENGTH = 90;

var MSG_REQUIRED;
var MSG_MASK;
var MSG_DATE;
var MSG_NUMBER;
var MSG_JUMIN;
var MSG_MAIL;
var MSG_CORP;
var MSG_TEL;
var MSG_HPTEL;
var MSG_MAXLENGTH;

  MSG_REQUIRED = "필수 입력 입니다";
  MSG_MASK = "잘못된 입력 입니다.";
  MSG_DATE = "날짜 입력이 잘못되었습니다.";
  MSG_NUMBER = "숫자 입력이 잘못되었습니다.";
  MSG_JUMIN = "올바른 주민등록번호가 아닙니다.";
  MSG_MAIL = "올바른 메일 주소가 아닙니다.";
  MSG_CORP = "올바른 사업자 등록번호가 아닙니다.";
  MSG_TEL = "올바른 전화번호가 아닙니다.";
  MSG_HPTEL = "올바른 휴대전화번호가 아닙니다.";
  MSG_MAXLENGTH = "최대 입력 자리수를 초과했습니다.";

var TYPE_NONE = 0;
var TYPE_MONEY = 10;
var TYPE_DATE = 20;
var TYPE_MASK = 30;
var TYPE_NUMBER = 40;
var TYPE_JUMIN = 50;
var TYPE_MAIL = 60;
var TYPE_CORP = 70;
var TYPE_TEL = 80;
var TYPE_HPTEL = 81;

function f_validate() {
    if(this.getAttribute("required") != null && isEmpty(this) )
        return ERR_REQUIRED;

    switch(this.iType){
        case TYPE_MONEY :
            if(!isMoney(this)) return ERR_NUMBER;
            break;
        case TYPE_DATE :
            if(!isDate(this)) return ERR_DATE;
            break;
        case TYPE_MASK :
            if(!isMask(this)) return ERR_MASK;
            break;
        case TYPE_NUMBER :
            if(!isNumber(this)) return ERR_NUMBER;
            break;
        case TYPE_JUMIN :
            if(!isJumin(this)) return ERR_JUMIN;
            break;
        case TYPE_CORP :
            if(!isCorp(this)) return ERR_CORP;
            break;
        case TYPE_MAIL :
            if(!isMail(this)) return ERR_MAIL;
            break;
        case TYPE_TEL :
            if(!isTel(this)) return ERR_TEL;
            break;
        case TYPE_HPTEL :
            if(!isHpTel(this)) return ERR_HPTEL;
            break;
        case TYPE_NONE :
            if(!isLength(this)) return ERR_MAXLENGTH;
            break;
    }

    return SUCCESS;
}

function f_validate_display() {
    var ret = this.validate();
    var msg = "";
    this.style.backgroundColor = "";

    switch(ret){
        case SUCCESS :
                    return true;
        case ERR_REQUIRED :
                    msg = MSG_REQUIRED;
                    break;
        case ERR_DATE :
                    msg = MSG_DATE;
                    break;
        case ERR_JUMIN :
                    msg = MSG_JUMIN;
                    break;
        case ERR_CORP :
                    msg = MSG_CORP;
                    break;
        case ERR_MAIL :
                    msg = MSG_MAIL;
                    break;
        case ERR_TEL :
                    msg = MSG_TEL;
                    break;
        case ERR_HPTEL :
                    msg = MSG_HPTEL;
                    break;
        case ERR_MASK :
                    msg = MSG_MASK;
                    if(this.getAttribute("mask"))
                        msg += "[format:"+this.getAttribute("mask")+"]";
                    break;
        case ERR_NUMBER :
                    msg = MSG_NUMBER;
                    if(this.getAttribute("number"))
                        msg += "[format:"+this.getAttribute("number")+"]";
                    break;
        case ERR_MAXLENGTH :
                    msg = MSG_MAXLENGTH + "[max length:"+this.getAttribute("maxlength")+"]";
                    break;
    }


    if(this.getAttribute("field"))
        msg += " - " + this.getAttribute("field");
    if(this.getAttribute("msg"))
        msg = this.getAttribute("msg");

    //this.style.backgroundColor = "#f2f2f2";
    alert(msg);
    if(this.focus && !this.disabled && this.type != "hidden")
        this.focus();

    return false;
}

function f_onkeypress() {
    var filter = this.getAttribute("filter");

    if(filter && filter.indexOf("A-Z") > -1 && filter.indexOf("a-z") < 0) {
      if(event.keyCode >= 97 && event.keyCode <= 122)
        event.keyCode = event.keyCode - 32;
    }

    if(this.oldkeypress)
        this.oldkeypress();

    if(String.fromCharCode(event.keyCode) == "\r") {
        event.returnValue = false;
    } else if(filter){
        var chr = String.fromCharCode(event.keyCode);
        var re = new RegExp(filter);
        if(!re.test(chr))
            event.returnValue = false;
    }
}

function f_onfocus() {
    if(this.readOnly)
        return;

    toUnformat(this);
    if(this.select)
        this.select();
}

function f_onblur() {
    if(this.oldblur)
        this.oldblur();

    toFormat(this);
    if(this.validate && this.getAttribute("required") == null){
        this.validate_display();
    }
}

function f_onsubmit() {
    var elements = Form.getElements(this);
    for(var i = 0; i < elements.length; i++){
        if(elements[i].validate) {
            if(!elements[i].validate_display()){
                return false;
            }
        }
    }

    if(this.oldSubmit && !this.oldSubmit())
        return false;

    for(var i = 0; i < elements.length; i++) {
        toUnformat(elements[i]);
        if(elements[i].disabled)
            elements[i].disabled = false;
    }

    this.submit();

    for(var i = 0; i < elements.length; i++)
        toFormat(elements[i]);

    return true;
}

function setField(element) {
  if(element.type) {
    var required = element.getAttribute("required");
    var number = element.getAttribute("number");
    var money = element.getAttribute("money");
    var date = element.getAttribute("date");
    var jumin = element.getAttribute("jumin");
    var corp = element.getAttribute("corp");
    var mail = element.getAttribute("mail");
    var mask = element.getAttribute("mask");
    var tel = element.getAttribute("tel");
    var hptel = element.getAttribute("hptel");
    var fcs = element.getAttribute("fcs");
    var filter = element.getAttribute("filter");
    var imemode = element.getAttribute("imemode");

    switch(element.type) {
      case "button":
        element.onmouseover = function(){this.style.backgroundColor = "#9999ff"};
        element.onmouseout = function(){this.style.backgroundColor = "#e0ebef"};
      case "file" :
        element.style.imeMode = "disabled";
      case "text" :
      case "password" :
        if(money != null) {
          element.iType = TYPE_MONEY;
          element.setAttribute("filter","[,0-9.]");
          element.style.imeMode = "disabled";
          element.style.textAlign = "right";
        } else if(date != null) {
          element.iType = TYPE_DATE;
          element.setAttribute("filter","[0-9]");
          if(!mask)
            element.setAttribute("mask","9999-99-99");
          element.style.imeMode = "disabled";
        } else if(number != null) {
          element.iType = TYPE_NUMBER;
          if(number)
            element.setAttribute("filter","[.0-9]");
          else
            element.setAttribute("filter","[0-9]");
          element.style.imeMode = "disabled";
          element.style.textAlign = "right";
        } else if(jumin != null) {
          element.iType = TYPE_JUMIN;
          element.style.imeMode = "disabled";
          element.setAttribute("filter","[0-9]");
          element.setAttribute("mask","999999-9999999");
        } else if(corp != null) {
          element.iType = TYPE_CORP;
          element.style.imeMode = "disabled";
          element.setAttribute("filter","[0-9]");
          element.setAttribute("mask","999-99-99999");
        } else if(mail != null) {
          element.iType = TYPE_MAIL;
          element.style.imeMode = "disabled";
          element.setAttribute("filter","[a-zA-Z0-9.@\\-_]");
        } else if(tel != null) {
          element.iType = TYPE_TEL;
          element.style.imeMode = "disabled";
          element.setAttribute("filter","[0-9-]");
        } else if(hptel != null) {
          element.iType = TYPE_HPTEL;
          element.style.imeMode = "disabled";
          element.setAttribute("filter","[0-9-]");
        } else if(mask) {
          element.iType = TYPE_MASK;
          element.style.imeMode = "disabled";
        } else if(filter) {
          element.style.imeMode = "disabled";
        } else {
          if(imemode)
            element.style.imeMode = imemode;
        }
        if(required != null ) {
          element.style.backgroundImage="url(../../img/admin/required.gif)";
          element.style.backgroundPosition="top right";
          element.style.backgroundRepeat="no-repeat";
        } else {
          element.style.backgroundImage = "";
        }
        if(element.getAttribute("left") != null )
          element.style.textAlign = "left";
        if(element.getAttribute("right") != null )
          element.style.textAlign = "right";
        if(element.getAttribute("center") != null )
          element.style.textAlign = "center";

        if(element.type != "hidden")
          toFormat(element);

        if(!element.oldkeypress) {
          element.oldkeypress = element.onkeypress;
          element.onkeypress = f_onkeypress;
          element.oldblur = element.onblur;
          element.onblur = f_onblur;
        }
        element.onfocus = f_onfocus;
      case "select-one":
      case "textarea" :
        if(!element.iType)
          element.iType = TYPE_NONE;
        if(element.getAttribute("readonly")) {
          //element.className = "input_readonly";
          element.tabIndex = -1;
        } else {
          //element.onmouseover = function(){this.style.backgroundColor = "#fdf9ea"};
          //element.onmouseout = function(){this.style.backgroundColor = "#f8f8f8"};
        }
      default :
        element.validate = f_validate;
        element.validate_display = f_validate_display;
    }
  }

  if(fcs != null)
    element.focus();
}

function f_isvalid() {
    var elements = Form.getElements(this);
    for(var i = 0; i < elements.length; i++){
        if(elements[i].validate) {
            if(!elements[i].validate_display()){
                return false;
            }
        }
    }
    return true;
}

function f_ondragstart() {
  return false;
}
function f_onselectstart() {
  return false;
}
function f_oncontextmenu() {
  return false;
}

function init() {
//    document.onselectstart = f_onselectstart;
//    document.ondragstart = f_ondragstart;
//    document.oncontextmenu = f_oncontextmenu;

    for(var f = 0; f < document.forms.length; f++){
        var mForm =  document.forms[f];
        var elements = Form.getElements(mForm);

        for(var i = 0; i < elements.length; i++)
            setField(elements[i]);

        mForm.isValid = f_isvalid;
        mForm.oldSubmit = mForm.onsubmit;
        mForm.onsubmit = f_onsubmit;
        mForm.format = f_format;
        mForm.unformat = f_unformat;
    }
}
///////////////////////////////////////////////////////////////////////////////
// 함수명 : f_format()
// 내  용 : Form에서 입력값 Submit후 포맷에 맞게
// Event : f_format
// Object : Form
///////////////////////////////////////////////////////////////////////////////
function f_format()
{
    for(var i = 0; i < this.elements.length; i++)
        toFormat(this.elements[i]);
}
///////////////////////////////////////////////////////////////////////////////
// 함수명 : f_unformat()
// 내  용 : Form에서 입력값 Submit전 포맷 제거
// Event : f_format
// Object : Form
///////////////////////////////////////////////////////////////////////////////
function f_unformat()
{
    for(var i = 0; i < this.elements.length; i++)
        toUnformat(this.elements[i]);
}