// custom method

Object.extend(Validation, {
  test : function(name, elm, useTitle) {
    var v = Validation.get(name);
    var prop = '__advice'+name.camelize();
    try {
    if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {

      var advice = Validation.getAdvice(name, elm, true);

      if (advice != null) {
        var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
        advice.innerHTML = errorMsg;
        advice.addClassName('');
        advice.show();
      }

      var icon = Validation.getIcon(name, elm, true);
      if (icon != null) icon.show();

      elm[prop] = true;
      elm.removeClassName('validation-passed');
      elm.addClassName('validation-failed');
      return false;
    } else {
      var advice = Validation.getAdvice(name, elm, false);
      if(advice != null) {
        advice.hide();
        advice.innerHTML = '';
        advice.removeClassName('');
      }

      var icon = Validation.getIcon(name, elm, false);
      if (icon != null) icon.hide();

      elm[prop] = '';
      elm.removeClassName('validation-failed');
      elm.addClassName('validation-passed');
      return true;
    }
    } catch(e) {
      throw(e)
    }
  },
  getAdvice : function(name, elm, useAlt) {
    if (elm == null) return null;
    if (useAlt == undefined) useAlt = false;
    var o = $('error_for_' + name + '-' + Validation.getElmID(elm)) || $('error_for_' + Validation.getElmID(elm)) || $('error_for_'  + elm.name);
    if (o == null && useAlt) {
      var alt = $(Validation.getElmID(elm) + '-Altid');
      if (alt != null) {
        o = Validation.getAdvice(name, $(alt.innerHTML), false);
      }
    }
    return o;
  },
  getIcon : function(name, elm, useAlt) {
    if (elm == null) return null;
    if (useAlt == undefined) useAlt = false;
    var o = $(name + '-' + Validation.getElmID(elm) + 'Icon') || $(Validation.getElmID(elm) + 'Icon') || $(elm.name + 'Icon');
    if (o == null && useAlt) {
      var alt = $(Validation.getElmID(elm) + '-Altid');
      if (alt != null) {
        o = Validation.getIcon(name, $(alt.innerHTML), false);
      }
    }
    return o;
  },
  reset : function(elm) {
    elm = $(elm);
    var cn = elm.classNames();
    cn.each(function(value) {
      var prop = '__advice'+value.camelize();
      if(elm[prop]) {
        var advice = Validation.getAdvice(value, elm);
        if (advice != null) {
          advice.hide();
          advice.innerHTML = '';
          advice.removeClassName('');
        }
        elm[prop] = '';

        var icon = Validation.getIcon(name, elm);
        if (icon != null) icon.hide();
      }
      elm.removeClassName('validation-failed');
      elm.removeClassName('validation-passed');
    });
  }
});


// エラーテキスト
Validator.errText = {
  'required': '入力して下さい。',
  'validate-zen'        : '全角文字で入力して下さい。',
  'validate-kata'       : '全角カタカナで入力して下さい。',
  'validate-hira'       :'ひらがなで入力して下さい。',
  'validate-not-han'      :'半角カナを含めないで入力して下さい。',
  'validate-number'     :'半角数字を入力して下さい。',
  'validate-digits'     :'スペースや記号を含めずに半角数字を入力して下さい。',
  'validate-alpha'      :'スペースや記号を含めずに半角アルファベットを入力して下さい。',
  'validate-alphanum'     :'スペースや記号を含めずに半角のアルファベットか数字を入力して下さい。',
  'validate-date'       :'日付を入力して下さい。',
  'validate-email'      :'xxx@yyy.jpのような形式で入力して下さい。',
  'validate-equal-email'    :'メールアドレスが一致しません。',
  'validate-url'        :'URL形式で入力して下さい。',
  'validate-date-au'      :'yyyy/mm/dd の形式で日付を入力して下さい。 例）2000/03/28',
  'validate-selection'    :'選択して下さい。',
  'validate-one-required'   :'選択して下さい。',
  'validate-length-min'   :'{0}桁以上で入力して下さい。',
  'validate-length-max'   :'{1}桁以下で入力して下さい。',
  'validate-length-minmax'  :'{0}桁以上{1}桁以下で入力して下さい。'
};

Validation.add('IsEmptyTrim', '', function(v) {
  var r = ((v == null) || (v.length == 0)); // || /^\s+$/.test(v));
  if (!r) {
    v = v.replace(/^[\s　]+|[\s ]+$/g, "");
    r = (v.length == 0);
  }
  return r;
});


Validation.addAllThese([
[//必須、空白不可
  'required',
  Validator.errText['required'],
  function(v) {
    return !Validation.get('IsEmptyTrim').test(v);
  }
],
[//全角文字
  'validate-zenkaku',
  Validator.errText['validate-zenkaku'],
  function (v) {
    return Validation.get('IsEmpty').test(v) || !/[^ -~｡-ﾟ]*/.test(v);
  }
],
[//全角カタカナ
  'validate-zenkaku-katakana',
  Validator.errText['validate-zenkaku-katakana'],
  function (v) {
    return Validation.get('IsEmpty').test(v) || /^[ァ-ヶー]+$/.test(v);
  }
],
[//ひらがなで
  'validate-hira',
  Validator.errText['validate-hira'],
  function (v) {
    return Validation.get('IsEmpty').test(v) || /^[ぁ-ん]+$/.test(v);
  }
],
[//半角カナを含めない
  'validate-not-han',
  Validator.errText['validate-not-han'],
  function (v) {
    return Validation.get('IsEmpty').test(v) || !/[ｧ-ﾝﾞﾟ]+$/.test(v);
  }
],
[//数字
  'validate-number',
  Validator.errText['validate-number'],
  function(v) {
    return Validation.get('IsEmpty').test(v) || (!isNaN(v) && !/^\s+$/.test(v));
  }
],
[//数値
  'validate-digits',
  Validator.errText['validate-digits'],
  function(v) {
    return Validation.get('IsEmpty').test(v) || !/[^\d]/.test(v);
  }
],
[//アルファベット
  'validate-alpha',
  Validator.errText['validate-alpha'],
  function (v) {
    return Validation.get('IsEmpty').test(v) || /^[a-zA-Z]+$/.test(v);
  }
],
[//アルファベット数字
  'validate-alphanum',
  Validator.errText['validate-alphanum'],
  function(v) {
    return Validation.get('IsEmpty').test(v) || !/[^a-zA-Z0-9]/.test(v);
//    return Validation.get('IsEmpty').test(v) || !/\W/.test(v);   MEMO: \w \W は '_' を含むので変更した
  }
],
[//日付
  'validate-date',
  Validator.errText['validate-date'],
  function(v) {
    var test = new Date(v);
    return Validation.get('IsEmpty').test(v) || !isNaN(test);
  }
],
[//Eメール形式
  'validate-email',
  Validator.errText['validate-email'],
  function (v) {
    return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v);
  }
],
[//Eメール確認
  'validate-email-confirm',
  Validator.errText['validate-email-confirm'],
  function (v) {
    var nextId = "f" & (v.id.substr(1) + 1); // 要確認
    return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v);
  }
],
[//URL形式
  'validate-url',
  Validator.errText['validate-url'],
  function (v) {
    return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v);
  }
],
[//日付形式
  'validate-date-au',
  Validator.errText['validate-date-au'],
  function(v) {
    if(Validation.get('IsEmpty').test(v)) return true;
    var regex = /^(\d{4})\/(\d{1,2})\/(\d{1,2})$/;
    if(!regex.test(v)) return false;
    var d = new Date(v.replace(regex, '$1/$2/$3'));
    return (parseInt(RegExp.$1, 10) == d.getFullYear()) &&
        (parseInt(RegExp.$2, 10) == (1 + d.getMonth())) &&
        (parseInt(RegExp.$3, 10) == d.getDate());
  }
],
[//select
  'validate-selection',
  Validator.errText['validate-selection'],
  function(v,elm){
    return elm.options ? elm.selectedIndex > 0 : !Validation.get('IsEmpty').test(v);
  }
],
[//radio
  'validate-one-required',
  Validator.errText['validate-one-required'],
  function (v,elm) {
    var p = elm.parentNode;
    var options = p.getElementsByTagName('INPUT');
    return $A(options).any(function(elm) {
      return $F(elm);
    });
  }
],
[//length
  'validate-length',
  '',
  function (v,elm) {
    var param = $(Validation.getElmID(elm) + 'Length');
    if (param == null) return true;

    var params = param.innerHTML.split(':');
    var minLength = parseInt(params[0]);
    var maxLength = parseInt(params[1]);
    if (!isNaN(minLength) && !isNaN(maxLength)) {
      this.error = Validator.errText['validate-length-minmax'];
      this.error = this.error.replace('{0}',minLength);
      this.error = this.error.replace('{1}',maxLength);
      return (minLength <= v.length && v.length <= maxLength);
    } else if (!isNaN(minLength)) {
      this.error = Validator.errText['validate-length-min'];
      this.error = this.error.replace('{0}',minLength);
      return (minLength <= v.length);
    } else if (!isNaN(maxLength)) {
      this.error = Validator.errText['validate-length-max'];
      this.error = this.error.replace('{1}',maxLength);
      return (v.length <= maxLength);
    } else {
      return true;
    }
  }
]
]);

