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

	  var needed = false;


	  if(!reg || !reg.match(/^!/)){
		 response = rule.input();
		 needed = true;
	  }

	  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,needed);

   },

   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 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,needed) {
	  if(!field._validbaloon) {
		 var obj = new this.element(field);
		 obj.create(needed);
		 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(needed) {
	  var field  = this.field;

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

	  var offset = Position.offset(field);
	  var top  = offset.y - 25;
	  var left = offset.x - 20 + 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(needed); };
	  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(needed) {
	  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.form[this.field.name].checked){
			this.field.style.backgroundColor = '#FFBBBB';
			if(this.field.name == 'check1'){
				co1td.style.backgroundColor  = '#FFBBBB';
			} else 
			if(this.field.name == 'check2'){
				co2td.style.backgroundColor  = '#FFBBBB';
			} else 
			if(this.field.name == 'check3'){
				co3td.style.backgroundColor  = '#FFBBBB';
			} else 
			if(this.field.name == 'check4'){
				co4td.style.backgroundColor  = '#FFBBBB';
			} else 
			if(this.field.name == 'check5'){
				co5td.style.backgroundColor  = '#FFBBBB';
			} else 
			if(this.field.name == 'check6'){
				co6td.style.backgroundColor  = '#FFBBBB';
			} else 
			if(this.field.name == 'check7'){
				co7td.style.backgroundColor  = '#FFBBBB';
			}
			return this.msg.noselect;
		} else {
			this.field.style.backgroundColor = '#FF9900';
			if(this.field.name == 'check1'){
				co1td.style.backgroundColor  = '#FF9900';
			} else 
			if(this.field.name == 'check2'){
				co2td.style.backgroundColor  = '#FF9900';
			} else 
			if(this.field.name == 'check3'){
				co3td.style.backgroundColor  = '#FF9900';
			} else 
			if(this.field.name == 'check4'){
				co4td.style.backgroundColor  = '#FF9900';
			} else 
			if(this.field.name == 'check5'){
				co5td.style.backgroundColor  = '#FF9900';
			} else 
			if(this.field.name == 'check6'){
				co6td.style.backgroundColor  = '#FF9900';
			} else 
			if(this.field.name == 'check7'){
				co7td.style.backgroundColor  = '#FF9900';
			}
		}
   },

   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;
   },

   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;
   },

   kana: function() {
	  for(var i = 0;i < this.value.length;i++) {
		 if(this.value.charAt(i) == ' ' || 
			this.value.charAt(i) == '\u3000' || 
			this.value.charAt(i) == ')' || 
			this.value.charAt(i) == '(' ||
			this.value.charAt(i) == 'j'||
			this.value.charAt(i) == 'i' ||
			this.value.charAt(i) == '[' ||
			this.value.charAt(i) == '|' ||
			this.value.charAt(i) == '‚P' ||
			this.value.charAt(i) == '‚Q' ||
			this.value.charAt(i) == '‚R' ||
			this.value.charAt(i) == '‚S' ||
			this.value.charAt(i) == '‚T' ||
			this.value.charAt(i) == '‚U' ||
			this.value.charAt(i) == '‚V' ||
			this.value.charAt(i) == '‚W' ||
			this.value.charAt(i) == '‚X' ||
			this.value.charAt(i) == '‚O' 
		  ) continue;
		 if(this.value.charAt(i) < '\u30A1' || this.value.charAt(i) > '\u30F6')
			return this.msg.kana;
	  }
   },

   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);
   }
};

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:	  '\u5165\u529B\u30A8\u30E9\u30FC\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',
	  alphabet:   '\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8\u3001\u6570\u5B57\u3001' +
					 '- \u4EE5\u5916\u306F\u5165\u529B\u51FA\u6765\u307E\u305B\u3093\u3002',
	  kana: 	  '\u5168\u89D2\u30AB\u30BF\u30AB\u30CA\u3067\u5165\u529B\u3057\u3066\u4E0B\u3055\u3044\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;


