
var Validator = {
   check: function(field, reg, extra) {
      var response;
      var rule = this.rule;
      rule.field = field;
      rule.value = field.value;
      rule.extra = extra;

      if(!reg || !reg.match(/^!/))
         response = rule.input();

      if(reg && !response && rule.value != '') {
         reg = reg.replace(/^!/, '');

         var mode = reg.split(/\s+/);
         for(var i = 0, m; m = mode[i]; i++) {
            m = m.replace(/([\d\-]+)?$/, '');
            response = rule[m](RegExp.$1);
            if(response) break;
         }
      }

      if(response)
         this.baloon.open(field, response);
   },

   submit: function(form) {
      this.allclose(form);
      var btns = new Array;

      for(var i = 0, f; f = form[i]; i++) {
         if(f.onblur)
            f.onblur();
         if(f.type == 'submit')
            btns.push(f);
      }

      for(var i = 0, f, z; f = form[i]; i++) {
         if(f._validbaloon && f._validbaloon.visible()) {
            while(z = btns.shift())
               this.baloon.open(z, this.rule.submit());
            return false;
         }
      }
	//return confirm('\u5165\u529B\u9805\u76EE\u3092\u518D\u5EA6\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002\n\n\u3053\u306E\u5185\u5BB9\u3067\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F')
      //return true;
   },

   allclose: function(form) {
      for(var i = 0, f; f = form[i]; i++)
         if(f._validbaloon) f._validbaloon.close();
   }
};

Validator.baloon = {
   index: 0,

   open: function(field, msg) {
      if(!field._validbaloon) {
         var obj = new this.element(field);
         obj.create();
         field._validbaloon = obj;
         if(field.type == 'radio' || field.type == 'checkbox') {
            for(var i = 0, e; e = field.form[field.name][i]; i++)
               addEvent(e, 'focus', function() { obj.close(); });
         }
      }

      field._validbaloon.show(msg);
   },

   element: function() {
      this.initialize.apply(this, arguments);
   }
};

Validator.baloon.element.prototype = {
   initialize: function(field) {
      this.parent = Validator.baloon;
      this.field = field;
   },

   create: function() {
      var field  = this.field;

      var box = document.createElement('div');
      box.className = 'baloon';

      var offset = Position.offset(field);
      var top  = offset.y - 30;
      var left = offset.x - 13 + field.offsetWidth;
      box.style.top  = top +'px';
      box.style.left = left+'px';

      var self = this;
      addEvent(box, 'click', function() { self.toTop(); });

      var bindClose = function() { self.close(); };
      var link = document.createElement('a');
      link.appendChild(document.createTextNode('X'));
      link.setAttribute('href', 'javascript:void(0);');
      addEvent(link, 'click', bindClose);
      addEvent(field, 'focus', bindClose);

      var msg = document.createElement('span');
      var div = document.createElement('div');
      div.appendChild(link);
      div.appendChild(msg);
      box.appendChild(div);
      document.body.appendChild(box);

      this.box = box;
      this.msg = msg;
   },

   show: function(msg) {
      var field = this.field;
      this.msg.innerHTML  = msg;

      this.box.style.display = '';
      this.toTop();

      if(field.type != 'radio' && field.type != 'checkbox') {
         var colors = new Array('#FF6666', '#FFAAAA', '#FF6666', '#FFAAAA');
         window.setTimeout(function() {
            if(colors.length > 0) {
               field.style.backgroundColor = colors.shift();
               window.setTimeout(arguments.callee, 70);
            }
         }, 10);
      }
   },

   close: function() {
      this.box.style.display = 'none';
      this.field.style.backgroundColor = '';
   },

   visible: function() {
      return (this.box.style.display == '');
   },

   toTop: function() {
      this.box.style.zIndex = ++ this.parent.index;
   }
};

Validator.rule = {
   msg: null,

   submit: function() {
      return this.msg.submit;
   },

   input: function() {
      if(this.field.type == 'radio' || this.field.type == 'checkbox') {
         for(var i = 0, e; e = this.field.form[this.field.name][i]; i++)
            if(e.checked) return;
         return this.msg.noselect;
      } else if(this.value == '')
         return (this.field.type == 'select-one') ? this.msg.noselect : this.msg.noinput;
   },

   mail: function() {
      if(!this.value.match(/^[\x01-\x7F]+@((([-a-z0-9]+\.)*[a-z]+)|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))$/))
         return this.msg.mail;
      else if(this.value.match(/^[\x01-\x7F]+@docomo.ne.jp$/))
         return this.msg.mail_DOCOMO;
      else if(this.value.match(/^[\x01-\x7F]+@ezweb.ne.jp$/))
         return this.msg.mail_AU;
      else if(this.value.match(/^[\x01-\x7F]+@softbank.ne.jp$/))
         return this.msg.mail_SOFTBANK;
      else if(this.value.match(/^[\x01-\x7F]+@*.vodafone.ne.jp$/))
         return this.msg.mail_VODAFONE;
      else if(this.value.match(/^[\x01-\x7F]+@*.ac.jp$/))
         return this.msg.mail_ACJP;
   },

   mailKEITAI: function() {
      if(!this.value.match(/^[\x01-\x7F]+@((([-a-z0-9]+\.)*[a-z]+)|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}))$/))
         return this.msg.mail;
      else if(!this.value.match(/^[\x01-\x7F]+@(docomo.ne.jp)|(ezweb.ne.jp)|(softbank.ne.jp)|(vodafone.ne.jp)$/))
         return this.msg.mail_NonPC;
   },

   equal: function() {
      if(this.field.form[this.extra].value && this.value != this.field.form[this.extra].value)
         return this.msg.unequal;
   },

   alphabet: function() {
      if(!this.value.match(/^[a-zA-Z\-\d]+$/))
         return this.msg.alphabet;
   },

   katakana: function() {
      for(var i = 0;i < this.value.length;i++) {
         if(this.value.charAt(i) == ' ' || this.value.charAt(i) == '\u3000') continue;
         if(this.value.charAt(i) < '\u30A1' || this.value.charAt(i) > '\u30fc')
            return this.msg.katakana;
      }
   },
   hirakana: function() {
      for(var i = 0;i < this.value.length;i++) {
         if(this.value.charAt(i) == ' ' || this.value.charAt(i) == '\u3000') continue;
         if(this.value.charAt(i) < '\u3042' || this.value.charAt(i) > '\u3093')
            return this.msg.hirakana;
      }
   },

   yuubin: function() {
      if(!this.value.match(/^[\-\d]+$/))
         return this.msg.yuubin;
   },

   count: function(arg) {
      return this._range(arg, this.value.length, this.msg.count);
   },

   num: function(arg) {
      if(!this.value.match(/^[\d]+$/))
         return this.msg.num.nonumber;

      return this._range(arg, parseInt(this.value), this.msg.num);
   },

   check: function(arg) {
      var value = 0;
      for(var i = 0, e; e = this.field.form[this.field.name][i]; i++)
         if(e.checked) value += 1;
      return this._range(arg, value, this.msg.check);
   },

   _range: function(range, value, msg) {
      if(!range) return;

      var result = '';
      var c = (" "+range).split(/\-/);
      var min = parseInt(c[0]) || 0;
      var max = parseInt(c[1]) || 0;

      if(value != min && /^\d+$/.test(range))
         result = msg.unequal;
      else if(min == 0 && value > max)
         result = msg.too_big;
      else if(max == 0 && value < min)
         result = msg.too_small;
      else if(min > 0 && max > 0 && (value < min || value > max))
         result = msg.outofrange;

      return result.replace(/%1/g, min).replace(/%2/g, max);
   },

   usertelallow: function() {
      var cnt = 0;
      if(this.field.form['user_tel_allow_1'].checked) cnt++;
      if(this.field.form['user_tel_allow_2'].checked) cnt++;
      if(this.field.form['user_tel_allow_3'].checked) cnt++;
      if(this.field.form['user_tel_allow_4'].checked) cnt++;
      if(cnt == 0) return '\u9023\u7D61\u53EF\u80FD\u306A\u96FB\u8A71\u756A\u53F7\u3092\u4E00\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044';
   },

   moneyhope: function() {
      var cnt = 0;
      if(this.field.form['money_hope_1'].checked) cnt++;
      if(this.field.form['money_hope_2'].checked) cnt++;
      if(this.field.form['money_hope_3'].checked) cnt++;
      if(this.field.form['money_hope_4'].checked) cnt++;
      if(this.field.form['money_hope_5'].checked) cnt++;
      if(this.field.form['money_hope_6'].checked) cnt++;
      if(this.field.form['money_hope_7'].checked) cnt++;
      if(this.field.form['money_hope_8'].checked) cnt++;
      if(this.field.form['money_hope_9'].checked) cnt++;
      if(cnt == 0) return '\u5E0C\u671B\u5E74\u53CE\u3092\u4E00\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044';
   },

   bunyajiken: function() {
      var cnt = 0;
      if(this.field.form['case_civil'].checked) cnt++;
      if(this.field.form['case_company_legal'].checked) cnt++;
      if(this.field.form['case_working'].checked) cnt++;
      if(this.field.form['case_intellectual'].checked) cnt++;
      if(this.field.form['case_smash'].checked) cnt++;
      if(this.field.form['case_government'].checked) cnt++;
      if(this.field.form['case_external_affairs'].checked) cnt++;
      if(this.field.form['case_deek'].checked) cnt++;
      if(this.field.form['case_audience'].checked) cnt++;
      if(this.field.form['case_domestic'].checked) cnt++;
      if(this.field.form['case_malpractice'].checked) cnt++;
      if(this.field.form['case_other'].checked) cnt++;
      if(cnt == 0) return '\u53D6\u308A\u6271\u3044\u5206\u91CE\u30FB\u4E8B\u4EF6\u3092\u4E00\u3064\u4EE5\u4E0A\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044';
   }

};

//http://myako.net/java2/sourceenc.html

Validator.lang = {
   ja: {
      noselect:   '\u9078\u629E\u304C\u5FC5\u8981\u3067\u3059\u3002',
      noinput:    '\u5165\u529B\u304C\u5FC5\u8981\u3067\u3059\u3002',
      unequal:    '\u5165\u529B\u304C\u63C3\u3063\u3066\u3044\u307E\u305B\u3093\u3002',
      submit:     '\u5FC5\u9808\u306B\u6B8B\u308A\u304C\u3042\u308A\u307E\u3059\u3002',
      mail:       '\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306E\u5F62\u5F0F\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002',
      mail_NonPC:       'PC\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u767b\u9332\u3067\u304d\u307e\u305b\u3093\u3002',
      mail_OnlyKeitai:       '\u643a\u5e2f\u30a2\u30c9\u30ec\u30b9\u3057\u304b\u767b\u9332\u3067\u304d\u307e\u305b\u3093\u3002',
      mail_DOCOMO:       'DOCOMO\u306a\u3069\u306e\u643a\u5e2f\u96fb\u8a71\u306e\u30a2\u30c9\u30ec\u30b9\u306f\u767b\u9332\u3067\u304d\u307e\u305b\u3093\u3002',
      mail_AU:       'AU\u306a\u3069\u306e\u643a\u5e2f\u96fb\u8a71\u306e\u30a2\u30c9\u30ec\u30b9\u306f\u767b\u9332\u3067\u304d\u307e\u305b\u3093\u3002',
      mail_SOFTBANK:       'SOFTBANK\u306a\u3069\u306e\u643a\u5e2f\u96fb\u8a71\u306e\u30a2\u30c9\u30ec\u30b9\u306f\u767b\u9332\u3067\u304d\u307e\u305b\u3093\u3002',
      mail_VODAFONE:       'VODAFONE\u306a\u3069\u306e\u643a\u5e2f\u96fb\u8a71\u306e\u30a2\u30c9\u30ec\u30b9\u306f\u767b\u9332\u3067\u304d\u307e\u305b\u3093\u3002',
      mail_ACJP:       'ac.jp\u30c9\u30e1\u30a4\u30f3\u306ePC\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u767b\u9332\u3067\u304d\u307e\u305b\u3093\u3002',
      mailKEITAI_DOCOMO:       'DOCOMO-------------',
      mailKEITAI_AU:       'AU-------------',
      mailKEITAI_SOFTBANK:       'SOFTBANK-------------',
      mailKEITAI_VODAFONE:       'VODAFONE-------------',
      alphabet:   '\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8\u3001\u6570\u5B57\u3001' +
                     '- \u4EE5\u5916\u306F\u5165\u529B\u51FA\u6765\u307E\u305B\u3093\u3002',
      katakana:       '\u5168\u89D2\u30AB\u30BF\u30AB\u30CA\u3067\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
      hirakana:       '\u5168\u89d2\u3072\u3089\u304c\u306a\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002',
      yuubin:       '\u534A\u89D2\u6570\u5B57\u304B\u30CF\u30A4\u30D5\u30F3\uFF08-\uFF09\u306E\u307F\u3057\u304B\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002',

      count: {
         unequal:    '%1'+'\u6587\u5B57\u3067\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         too_big:    '%2'+'\u6587\u5B57\u4EE5\u5185\u3067\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         too_small:  '%1'+'\u6587\u5B57\u4EE5\u4E0A\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         outofrange: '%1'+'\u304B\u3089'+'%2'+'\u6587\u5B57\u306E\u9593\u3067\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002'
      },
   
      num: {
         nonumber:   '\u6570\u5024\u3067\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         unequal:    '%1'+'\u3068\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         too_big:    '%2'+'\u4EE5\u4E0B\u306E\u5024\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         too_small:  '%1'+'\u4EE5\u4E0A\u306E\u5024\u3092\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         outofrange: '%1'+'\u304B\u3089'+'%2'+'\u306E\u9593\u3067\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\u3002'
      },
   
      check: {
         unequal:    '\u30C1\u30A7\u30C3\u30AF\u306F'+'%1'+'\u500B\u3057\u3066\u4E0B\u3055\u3044\u3002',
         too_big:    '\u30C1\u30A7\u30C3\u30AF\u306F'+'%2'+'\u500B\u307E\u3067\u3067\u3059\u3002',
         too_small:  '\u30C1\u30A7\u30C3\u30AF\u306F'+'%1'+'\u500B\u4EE5\u4E0A\u3057\u3066\u4E0B\u3055\u3044\u3002',
         outofrange: '\u30C1\u30A7\u30C3\u30AF\u306F'+'%1'+'\u500B\u304B\u3089'+'%2'+'\u500B\u307E\u3067\u3067\u3059\u3002'
      }
   }
};

Validator.rule.msg = Validator.lang.ja;

