/*@cc_on @*/
/*@if (@_mac)   @else @*/
var fm;

Event.observe(window, 'load', function() {
	new Effect.Round( "div",'error',{compact:true} );
	fm = new formManager();
	fm.load();

}, false);

var formManager = Class.create();
formManager.prototype = {
	initialize:function(){
		this.validator = new mosValidator();
		this.converter = new mosConverter();
//		this.obj;
	},
	load:function(){
			new Ajax.Request('./', {
				method:     'post',
				parameters: 'action=json',
				onSuccess:this.onSuccess.bind(this)
			});
	},
	onSuccess:function(req){
		this.obj = eval("[" + req.responseText + "]");
		this.obj = this.obj[0];
//		$("form").onsubmit = this.post.bind(this);
		Event.observe($("form"), 'submit', this.post.bindAsEventListener(this), false);
	},
	post:function(event){
		this.firstElement="";
		this.message="";
		for(var id in this.obj){
			if(this.obj[id].type != "select"){
				if(this.obj[id].required == 1){
					if(fv(id)==""){
						this.message = "正しく入力してください";
						if(!this.firstElement) this.firstElement = fo(id);
						if(!Element.hasClassName(fo(id), "error")) Element.addClassName(fo(id), "error");
					}
					else{
						switch(this.obj[id].type){
							case "mail":
								fo(id).value = fo(id).value.replace(/ /g,"");
								fo(id).value = fo(id).value.replace(/　/g,"");
								fo(id).value = this.converter.z2hAscii(fv(id));
//								this.chError(this.validator.isMail(fv(id)),"正しく入力してください",fo(id));
								if(Element.hasClassName(fo(id), "error")) Element.removeClassName(fo(id), "error");

							break;
							case "hira":
								fo(id).value = fo(id).value.replace(/ /g,"");
								fo(id).value = fo(id).value.replace(/　/g,"");
								fo(id).value = this.converter.kata2hira(this.converter.h2zKana(fv(id)));
								this.chError(this.validator.isHiragana(fv(id)),"正しく入力してください",fo(id));
							break;
							case "kata":
								fo(id).value = fo(id).value.replace(/ /g,"");
								fo(id).value = fo(id).value.replace(/　/g,"");
								fo(id).value = this.converter.hira2kata(this.converter.h2zKana(fv(id)));
								this.chError(this.validator.isKatakana(fv(id)),"正しく入力してください",fo(id));
							break;
							case "han":
								fo(id).value = fo(id).value.replace(/ /g,"");
								fo(id).value = fo(id).value.replace(/　/g,"");
								fo(id).value = this.converter.z2hAscii((fv(id)));
								if(Element.hasClassName(fo(id), "error")) Element.removeClassName(fo(id), "error");
							break;
							case "number":
								fo(id).value = fo(id).value.replace(/ /g,"");
								fo(id).value = fo(id).value.replace(/　/g,"");
								fo(id).value = this.converter.z2hDigit((fv(id)));
								this.chError(this.validator.isNumber(fv(id)),"正しく入力してください",fo(id));
							break;
							default:
								if(Element.hasClassName(fo(id), "error")) Element.removeClassName(fo(id), "error");
							break;
						}
						if(this.obj[id].pattern){
//							this.chError(this.validator.valid(fv(id),this.obj[id].pattern),"正しく入力してください",fo(id));
						}
					}
				}
				else{
					if(Element.hasClassName(fo(id), "error")) Element.removeClassName(fo(id), "error");
				}
			}
			else{
				if(this.obj[id].required == 1){
					if(!fo(id) || fo(id).type == "radio"){//alert(fo(id));
						var found = false;
						for(var i=0;i<this.obj[id].data.length;i++){
							if(Form.Element.serialize(fo(id+(i+1)))) found = i+1;
						}
						if(!found){
							this.message = "正しく入力してください";
							if(!this.firstElement) this.firstElement = fo(id+"1");
							for(var i=0;i<this.obj[id].data.length;i++){
								if(!Element.hasClassName(fo(id+(i+1)), "error-radio"))
									Element.addClassName(fo(id+(i+1)), "error-radio");
							}
						}
						else{
							for(var i=0;i<this.obj[id].data.length;i++){
								if(Element.hasClassName(fo(id+(i+1)), "error-radio"))
									Element.removeClassName(fo(id+(i+1)), "error-radio");
							}
						}
					}
					else{
						if(!(fv(id)/1>0)){
							this.message = "正しく入力してください";
							if(!this.firstElement) this.firstElement = fo(id);
							if(!Element.hasClassName(fo(id), "error")) Element.addClassName(fo(id), "error");
						}
						else{
							if(Element.hasClassName(fo(id), "error")) Element.removeClassName(fo(id), "error");
						}
					}
				}
			}
		}
		if(this.firstElement){
			alert(this.message);
			this.firstElement.focus();
			Event.stop(event);
		}
		
	
//		Form.disable("form");
		
	},
	chError:function(bool,mes,elm){
		if(bool){
			this.message = mes;
			if(!this.firstElement) this.firstElement = elm;
			if(!Element.hasClassName(elm, "error")) Element.addClassName(elm, "error");
		}
		else{
			if(Element.hasClassName(elm, "error")) Element.removeClassName(elm, "error");
		}
	}
	
	
}


function f(id){
	return "form[" + id + "]";
}
function fv(id){
	return Try.these(
		function() {return $F(f(id));},
		function() {return $F(f(id+"1"));}
	);
//	return $F(f(id));
}
function fo(id){
//	return Try.these(
//		function() {return $(f(id));},
//		function() {return $(f(id+"1"));}
//	);
	return $(f(id));
}

var mosValidator = Class.create();
mosValidator.prototype = {
	initialize:function(){
		
	},
	isMail:function(s){
		return (s.match(/^[\w_-]+@[\w\.-]+\.\w{2,}$/) == false);
	},
	isNumber:function(s){
		for (var i = 0; i < s.length; i++) {
			if (!(48<=s.charCodeAt(i) && 57>=s.charCodeAt(i))) { 
				return true;
			}
		}
		return false;
	},
	isHiragana:function(s){
		for (var i = 0; i < s.length; i++) {
			var c = s.charCodeAt(i);
			if (!((c >= 12353 && c <= 12435) || c == 12445 || c == 12446)) { 
				return true;
			}
		}
		return false;
	},
	isKatakana:function(s){
		for (var i = 0; i < s.length; i++) {
			var c = s.charCodeAt(i);
			if (!((c >= 12449 && c <= 12531) || c == 12541 || c == 12542)) return true;
		}
		return false;
	},
	isHankaku:function(s){
		for (var i = 0; i < s.length; i++) {
			var ch = s.charCodeAt(i);
			if (!(ch >= 33 && ch <= 126)) return true;
		}
	},
	isLower:function(s){
		for (var i = 0; i < s.length; i++) {
			var ch = s.charCodeAt(i);
			if (!(ch >= 97 && ch <= 122)) { 
				return true;
			}
		}
		return false;
	},
	isUpper:function(s){
		for (var i = 0; i < s.length; i++) {
			var ch = s.charCodeAt(i);
			if (!(ch >= 65 && ch <= 90)) { 
				return true;
			}
		}
		return false;
	},
	valid:function(s,pattern){
		var re = new RegExp(pattern);
		var res = s.match(re);
		if(!res) return true;
		else return false;
	}
}
var mosConverter = Class.create();
mosConverter.prototype = {
	initialize:function(){
		this.table = [
    "。", "「", "」", "、", "・", "ヲ", "ァ", "ィ", "ゥ", "ェ",
    "ォ", "ャ", "ュ", "ョ", "ッ", "ー", "ア", "イ", "ウ", "エ",
    "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ",
    "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ",
    "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ",
    "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ",
    "ン", "゛", "゜"
		];
		
	},
	isKata:function(c){
		return ((c >= 12449 && c <= 12531) || c == 12541 || c == 12542); 
	},
	isHira:function(c) {
		 return ((c >= 12353 && c <= 12435) || c == 12445 || c == 12446);
	},
	isKana:function(c){
		 return (c >= 65377 && c <= 65439); 
	},
	isKT:function(c){
		return (c >= 65398 && c <= 65412); 
	},
	isHT:function(c){
		 return (c >= 65418 && c <= 65422); 
	},
	h2zKana:function(src){
	    var i, code, next;
	    var str = new String;
	    var len = src.length;
	    for (i = 0; i < len; i++) {
	        var c = src.charCodeAt(i);
	        if (this.isKana(c)) {
	            code = this.table[c - 65377];
	            if (i < len - 1) {
	                next = src.charCodeAt(i+1);
	                if (next == 65438 && c == 65395) {
	                    code = "ヴ";
	                    i++;
	                } else if (next == 65438 && (isKT(c) || isHT(c))) {
	                    code = String.fromCharCode(code.charCodeAt(0)+1);
	                    i++;
	                } else if (next == 65439 && isHT(c)) {
	                    code = String.fromCharCode(code.charCodeAt(0)+2);
	                    i++;
	                }
	            }
	            str += code;
	        } else {
	            str += src.charAt(i);
	        } 
	   }
	   return str;
	},
	z2hAscii:function(src){
	    var str = new String;
	    var len = src.length;
	    for (var i = 0; i < len; i++) {
	        var c = src.charCodeAt(i);
	        if (c >= 65281 && c <= 65374 && c != 65340) {
	            str += String.fromCharCode(c - 65248);
	        } else if (c == 8217) {
	            str += String.fromCharCode(39);
	        } else if (c == 8221) {
	            str += String.fromCharCode(34);
	        } else if (c == 12288) {
	            str += String.fromCharCode(32);
	        } else if (c == 65507) {
	            str += String.fromCharCode(126);
	        } else if (c == 65509) {
	            str += String.fromCharCode(92);
	        } else {
	            str += src.charAt(i);
	        } 
	    }
	    return str;
	},
	z2hDigit:function(src){
	    var str = new String;
	    var len = src.length;
	    for (var i = 0; i < len; i++) {
	        var c = src.charCodeAt(i);
	        if (c >= 65296 && c <= 65305) {
	            str += String.fromCharCode(c - 65248);
	        } else {
	            str += src.charAt(i);
	        } 
	    }
	    return str;
	},
	hira2kata:function(src){
	    var str = new String;
	    var len = src.length;
	    for (var i = 0; i < len; i++) {
	        var c = src.charCodeAt(i);
	        if (this.isHira(c)) { 
	            str += String.fromCharCode(c + 96);
	        } else {
	            str += src.charAt(i);
	        } 
	    }
	    return str;
	},
	kata2hira:function(src){
	    var str = new String;
	    var len = src.length;
	    for (var i = 0; i < len; i++) {
	        var c = src.charCodeAt(i);
	        if (this.isKata(c)) { 
	            str += String.fromCharCode(c - 96);
	        } else {
	            str += src.charAt(i);
	        } 
	    }
	    return str;
	}
}
/*@end @*/
