var EFO = {
//------------------------------------------------------------
// EFO - EFO - Entry Form Optimization

	name: "EFO - Entry Form Optimization",
	since: "2008/05/01",
	update: "2008/07/02",
	version: "1.2",

//------------------------------------------------------------

//-INIT------------------------------------------------------
	init: function () {
		EFO.reInput(checkSheet);
			var formId = "check";
			var sheet = config[formId];
			for (var i in sheet){
				EFO.validate.status[i] = {value:""}
			}
			$("form")
				.find('label')
					.each(function(){
						if(!$(this).attr("for")) {$(this).attr("for",$(this).find("input,select,textarea")[0].id)};
					})
				.end()
			.end();
	},


//-FUNCTIONS--------------------------------------------------

/*	RE INPUT
--------------------------------------------------*/
	reInput: function (sheetName) {
		var inputArr = document.getElementsByTagName('INPUT');
		var textareaArr = document.getElementsByTagName('TEXTAREA');
		var selectArr = document.getElementsByTagName('SELECT');
		var inputObj = {};
		for(var i = 0; i < inputArr.length; i++) inputObj[inputArr[i].name] = inputArr[i];
		for(var i = 0; i < textareaArr.length; i++) inputObj[textareaArr[i].name] = textareaArr[i];
		for(var i = 0; i < selectArr.length; i++) inputObj[selectArr[i].name] = selectArr[i];
		for(var key in sheetName ) {
			if(inputObj[key]){
				var tagName = inputObj[key].tagName;
				switch (tagName) {
					case 'TEXTAREA':
						if(sheetName[key+'_html'] != undefined) inputObj[key].innerHTML= sheetName[key+'_html'];
						break;
					case 'SELECT':
						var optionArr = inputObj[key].getElementsByTagName('OPTION');
						if(inputObj[key].multiple){
							for( var i = 0; i<key.length; i++ ) {
								for(var j = 0; j < optionArr.length; j++ ) {
									if(optionArr[j].value == sheetName[key][i]) optionArr[j].selected = 'selected';
								}
							}
						}else{
							for( var i = 0; i < optionArr.length; i++ ) {
								if(optionArr[i].value == sheetName[key]) optionArr[i].selected = 'selected';
							}
						}
						break;
					default:
						var type = inputObj[key].type;
						switch (type){
							case 'radio':
								for(var i = 0; i < inputArr.length; i++) {
									if(inputArr[i].value == sheetName[key] && inputArr[i].name == key ) {
										inputArr[i].setAttribute('checked', 'checked');
									}
								}
								break;
							case 'checkbox':
								if(sheetName[key] != "") inputObj[key].setAttribute('checked', 'checked');
								break;
							default:
								if(sheetName[key]&& key!="formmode" && key!="submit") inputObj[key].value = sheetName[key];
								break;
						}
						break;
				}
			}
		}
	},


/*	GET BYTE LENGTH
--------------------------------------------------*/
	getByteLength: function (text) {
		var count = 0;
		for (i=0; i<text.length; i++) {
			n = escape(text.charAt(i));
			if (n.length < 4) count++;
			else count+=2;
		}
		return count;
	},


/*	CHANGE MESSAGE
--------------------------------------------------*/
	changeMess: {
		half : "0123456789"
			 + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
			 + "abcdefghijklmnopqrstuvwxyz"
			 + "/-+_@. "
			 + "ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｯｬｭｮｰ",
		halfArr : new Array(
					"ｳﾞ","ｶﾞ","ｷﾞ","ｸﾞ","ｹﾞ","ｺﾞ","ｻﾞ","ｼﾞ","ｽﾞ","ｾﾞ","ｿﾞ",
					"ﾀﾞ","ﾁﾞ","ﾂﾞ","ﾃﾞ","ﾄﾞ","ﾊﾞ","ﾋﾞ","ﾌﾞ","ﾍﾞ","ﾎﾞ","ﾊﾟ","ﾋﾟ","ﾌﾟ","ﾍﾟ","ﾎﾟ"
				),
		full : "０１２３４５６７８９"
			 + "ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ"
			 + "ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ"
			 + "／－＋＿＠．　"
			 + "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォッャュョー",
		fullArr : new Array(
					"ヴ","ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ",
					"ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ","パ","ピ","プ","ペ","ポ"
				),

		toHalf: function (str) {
			var retVal = "";
			for(i=0; i<this.halfArr.length; i++){
				reg = new RegExp(this.fullArr[i],"g"); 
				str = str.replace(reg, this.halfArr[i]);
			}
			for(i=0; i<str.length; i++){
				oneStr = str.charAt(i);
				num = this.full.indexOf(oneStr,0);
				oneStr = num >= 0 ? this.half.charAt(num) : oneStr;
				retVal += oneStr;
			}
			return retVal;
		},

		toFull: function (str) {
			var retVal = "";
			for(i=0; i < this.fullArr.length; i++){
				reg = new RegExp(this.halfArr[i],"g"); 
				str = str.replace(reg, this.fullArr[i]);
			}
			for(i=0; i < str.length; i++){
				oneStr = str.charAt(i);
				num = this.half.indexOf(oneStr,0);
				oneStr = num >= 0 ? this.full.charAt(num) : oneStr;
				retVal += oneStr;
			}
			return retVal;
		}
	},

/*	TRIM
--------------------------------------------------*/
	trim: function(obj){
		if(/^[\s　]+|[\s　]+$/g.test($(obj).val())){
			$(obj).val($(obj).val().replace(/^[\s　]+|[\s　]+$/g, ""));
		}
	},

/*	VALIDATE
--------------------------------------------------*/
	validate: {
		status: {},
		postValArr: {},
		exec: function(sheetId,tar) {
			var sheet = config[sheetId];
			var inputObj = ( tar ? $(tar) : $("input,select,textarea"));
			if(!tar){
				for (var i in config["check"]) {
					for( var j=0; j < config["check"][i].length; j++){
						EFO.validate.status[i][config["check"][i][j]] = false;
					}
				}
			};
			var switchFunc = function (statVal,statusName,statObj) {
				switch(statVal){
					case "confirm":
						statObj[statVal] = EFO.validate.confirm(statusName);
					break;
					case "required":
						if($("#"+statusName)[0]){
							if($("#"+statusName)[0].type == "checkbox"||$("#"+statusName)[0].type == "checkbox"){
								statObj[statVal] = $("#"+statusName)[0].checked;
								break;
							}
						}
					default:
						if(statVal.indexOf('%')!=-1){
							var lenArr = statVal.split("%");
							if(lenArr[0]=="checkdetail"){
								var myId = $("input[id^="+statusName+"][value="+lenArr[1]+"]")[0].id;
								statObj[statVal] = EFO.validate.detail(myId,lenArr[1],$('#'+myId)[0].checked);
								break;
							}else if(lenArr[0]=="radiodetail"){
								statObj[statVal] = EFO.validate.detail(statusName,lenArr[1],$('input[name='+statusName+'][value='+lenArr[1]+']')[0].checked);
								break;
							}
							statObj[statVal] = eval("EFO.validate."+lenArr[0]+"(lenArr[1],statObj.value);");
						}else{
							statObj[statVal] = eval("EFO.validate."+statVal+"(statObj.value);");
						}
					break;
				}
				if(EFO.validate.status[statusName]){
					EFO.validate.status[statusName][statVal] = statObj[statVal];
				}else{
					EFO.validate.status[statusName]={};
					EFO.validate.status[statusName][statVal] = statObj[statVal];
				}
			}
			inputObj.each(function(){
				EFO.trim(this);
				var statusName = $(this).attr('name');
				if(!sheet[statusName] && !(/detail/.test(this.id)) && !(/-[\d]/.test(this.id))){return;}
				if(/confirm$/.test(this.id)){
					var tarId = this.id.split('confirm')[0];
					$("#"+tarId).blur();
				}
				if(/detail/.test(this.id)){
					var tarId = this.id.split('detail')[0];
					$("input[name^="+tarId+"]"+"[value="+$(this).attr('rel')+"]").blur();
					return;
				}
				if(/-[\d]+$/.test(this.id)){
					var matchArr = this.id.match(/^(.+)-(.+)$/);
					if(matchArr){
						if(sheet[matchArr[1]]) {
							if(!EFO.validate.status[matchArr[1]]["value"]){
								EFO.validate.status[matchArr[1]] = {value:[]};
							}
							if(this.type == "checkbox"|| this.type == "radio"){
								if(this.checked){
									EFO.validate.status[matchArr[1]]["value"][matchArr[2]]= $(this).val();
								}else{
									EFO.validate.status[matchArr[1]]["value"][matchArr[2]]= "";
								}
							}else{
								EFO.validate.status[matchArr[1]]["value"][matchArr[2]]= $(this).val();
							}
							for (var i =0; i < sheet[matchArr[1]].length; i++){
								var val = "";
								var arr = EFO.validate.status[matchArr[1]]["value"];
								for(var j = 1; j < arr.length; j++){
									if(!arr[j]) arr[j] = "";
									val += arr[j];
								}
								var statObj = {value : (val == null ? "" : val)};
								switchFunc(sheet[matchArr[1]][i],matchArr[1],statObj);
							}
						}
					}
				}
				if(!sheet[statusName]) return;
				for (var i =0; i < sheet[statusName].length; i++){
					var checkName = sheet[statusName][i];
					if(this.type=="checkbox"){
						var statObj = {value : (this.checked ? $(this).val() : "")};
						switchFunc(sheet[statusName][i],statusName,statObj);
						continue;
					}else if(this.type=="radio"){
						if(EFO.validate.status[statusName]) return;
						var statObj = {value : (this.checked ? $(this).val() : "")};
					}else{
						var statObj = {value : ($(this).val() == null ? "" : $(this).val())};
					}
					switchFunc(sheet[statusName][i],statusName,statObj);
				}
			});
			this.checkStatus();
		},
		checkStatus: function () {
			$("div.errArea,span.errArea").html("");
			for (var i in EFO.validate.status){
				for (var j in EFO.validate.status[i]){
					
					if(j == "value"){
						$("#"+i).removeClass('err');
					}else if(!EFO.validate.status[i][j]){
						$("#"+i).addClass('err');
						var matchArr = i.match(/^(.+)-(.+)$/);
						function attachErr(tar){
							if(tar){tar=i};
							var elmName = config["name"][tar];
							var elmErr = "";
							var val = (j.indexOf('%')!=-1 ? j.split("%")[1] : "" );
							var patt = (j.indexOf('%')!=-1 ? j.split("%")[0] : j );
							if( config.errmsg[tar+"_"+patt] ){
								elmErr = config.errmsg[tar+"_"+patt];
							}else{
								switch(patt){
									case "required":
										if($("#"+tar+"[type^=checkbox]")[0]|| $("#"+tar+"[type^=radio]")[0]||$("select#"+tar)[0])
										{				elmErr = elmName+"を選択して下さい"; }
										else{			elmErr = elmName+"を入力して下さい"; }
										break;
									case "zenkaku":		elmErr = elmName+"は全角で入力して下さい";				break;
									case "hankaku":		elmErr = elmName+"は半角で入力して下さい";				break;
									case "zenhira":		elmErr = elmName+"は全角ひらがなで入力して下さい";			break;
									case "zenkana":		elmErr = elmName+"は全角カタカナで入力して下さい";			break;
									case "num":			elmErr = elmName+"は半角数字で入力して下さい";			break;
									case "numplus":		elmErr = elmName+"は半角数字で入力して下さい";			break;
									case "emailformat":	elmErr = elmName+"は正しいメール形式ではございません";		break;
									case "nomobile":	elmErr = elmName+"には携帯用アドレスをご使用いただけません";	break;
									case "confirm":		elmErr = elmName+"が確認用アドレスと違います";			break;
									case "zenkaku":		elmErr = elmName+"は全角で入力して下さい";				break;
									case "check":		elmErr = elmName+"を選択してください";					break;
									case "maxlen":		elmErr = elmName+"は"+val+"文字以下で入力して下さい";		break;
									case "minlen":		elmErr = elmName+"は"+val+"文字以上で入力して下さい";		break;
									default: 
										if(/detail/.test(patt))	{ elmErr = elmName+"の内容を入力して下さい"; }
										else					{ elmErr = "error"; }
										break;
								}
							}
							if($('div.errArea[rel*='+i+']')[0]){
								var elm = document.createElement("p");							
								elm.innerHTML = elmErr;
								$('div.errArea[rel*='+i+']').append(elm);
							}else if($('span.errArea[rel*='+i+']')[0]){
								var elm = document.createElement("span");
								elm.innerHTML = elmErr;
								$('span.errArea[rel*='+i+']').append(elm);
							}
						}
						if(matchArr){
							if(/checkdetail/.test(j)) {attachErr(i); continue;}
							if( EFO.validate.status[matchArr[1]][j]||EFO.validate.status[matchArr[1]][j]==undefined ){
								if(!(EFO.validate.status[matchArr[1]]["numplus"]!=undefined && j=="num")){
									attachErr(i);
								}
							}
						}else{ attachErr(i); }
					}
				}
			}
		},
		required: function (val) {
			return (val == "" ? false : true);
		},
		zenkaku: function (val) {
			var retVal = (val != undefined && val.length *2 != EFO.getByteLength(val) ? false: true);
			if(!retVal) {return false; }
			if(val.match(/[ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｯｬｭｮｰ]/)){
				return false;
			}else{
				return true;
			};
		},
		hankaku: function (val) {
			return (val != "" && val.length != EFO.getByteLength(val) ? false : true);
		},
		zenhira: function (val) {
			var str = "";
			str = "[^ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん、　 ？／＿！〜ー！”＃＄％＆’（）＝。・]";
			var reg = new RegExp(str,"g");
			return ( val != "" && val.match(reg) ? false : true);
		},
		zenkana: function (val) {
			var str = "";
			str = "[^ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ、　 ？／＿！〜ー！”＃＄％＆’（）＝。・]";
			var reg = new RegExp(str,"g");
			return ( val != "" && val.match(reg) ? false : true );
		},
		num: function (val) {
			return ( val != "" && val.match(/[^0-9]/g) ? false : true );
		},
		numplus: function (val) {
			return (val != "" && !val.match(/^[0-9\+\- \,\.\*\/\=]*?$/g) ? false : true );
		},
		maxlen : function (opt,val) {
			if(val.length >= 1){
				return (opt >= val.length);
			}else{
				return true;
			}
		},
		minlen : function (opt,val) {
			if(val.length >= 1){
				return (opt <= val.length);
			}else{
				return true;
			}
		},
		emailformat: function (val) {
			return (val != "" && !val.match(/^[a-z0-9_-]+([_\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)+)+$/i) ? false : true );
		},
		nomobile: function (val) {
			var regArr = [];
			regArr.push(/[@|\.]docomo\.ne\.jp$/);
			regArr.push(/[@|\.]ezweb\.ne\.jp$/);
			regArr.push(/[@|\.]vodafone\.ne\.jp$/);
			regArr.push(/[@|\.]softbank\.ne\.jp$/);
			regArr.push(/[@|\.]ido\.ne\.jp$/);
			regArr.push(/[@|\.]sky\.tkk\.ne\.jp$/);
			regArr.push(/[@|\.]sky\.tkc\.ne\.jp$/);
			regArr.push(/[@|\.]sky\.tu-ka\.ne\.jp$/);
			regArr.push(/[@|\.]pdx\.ne\.jp$/);
			regArr.push(/[@|\.]disney\.ne\.jp$/);
			regArr.push(/[@|\.]jp-d\.ne\.jp$/);
			regArr.push(/[@|\.]jp-h\.ne\.jp$/);
			regArr.push(/[@|\.]jp-t\.ne\.jp$/);
			regArr.push(/[@|\.]jp-c\.ne\.jp$/);
			regArr.push(/[@|\.]jp-r\.ne\.jp$/);
			regArr.push(/[@|\.]jp-k\.ne\.jp$/);
			regArr.push(/[@|\.]jp-n\.ne\.jp$/);
			regArr.push(/[@|\.]jp-s\.ne\.jp$/);
			regArr.push(/[@|\.]jp-q\.ne\.jp$/);
			regArr.push(/[@|\.]emnet\.ne\.jp$/);

			if(val != ""){
				for (var i = 0; i<regArr.length; i++){
					if(regArr[i].test(val)){
						return false;
					}
				}
				return true;
			}else{
				return true;
			}
		},
		confirm: function (id) {
			var val = $('#'+id).val();
			var altValue = $('#'+id+'confirm').val();
			return (altValue != "" && val!=altValue ? false : true );
		},
		detail: function (id,opt,val){
			if(val){
				return ($("#"+id+"detail[rel="+opt+"]").val() != "");
			}else{
				return true;
			}
		}
	},


/*	CONVERT INPUT VAL
--------------------------------------------------*/
	convertInputVal: function(obj,sheet){
		if(sheet[obj.id]){
			for(var i = 0; i < sheet[obj.id].length; i++){
				switch(sheet[obj.id][i]){
					case "num":			$(obj).val(EFO.changeMess.toHalf($(obj).val()));	break;
					case "numplus":		$(obj).val(EFO.changeMess.toHalf($(obj).val()));	break;
					case "emailformat":	$(obj).val(EFO.changeMess.toHalf($(obj).val()));	break;
					case "hankaku":		$(obj).val(EFO.changeMess.toHalf($(obj).val()));	break;
					case "zenkaku":		$(obj).val(EFO.changeMess.toFull($(obj).val()));	break;
					case "zenhira":		$(obj).val(EFO.changeMess.toFull($(obj).val()));	break;
					case "zenkana":		$(obj).val(EFO.changeMess.toFull($(obj).val()));	break;
				}
				EFO.trim(obj);
			}
		}
	},

/*	NEXT FOCUS
--------------------------------------------------*/
	nextFocus: function (obj, tarId, keyCode){
		if($(obj).val().length == $(obj).attr('maxlength')){
			if(keyCode!= 9 // tab
			&& keyCode!=13 // enter
			&& keyCode!=16 // shift
			&& keyCode!=32 // EN/JP
			&& keyCode!=37 // left
			&& keyCode!=38 // top
			&& keyCode!=39 // right
			&& keyCode!=40 // bottom
			&& keyCode!=undefined){
				document.getElementById(tarId).focus();
			}
		}
	},

/*	SUBMIT
--------------------------------------------------*/
	submit: function (id){
		EFO.validate.exec(id);
		var dummyArr = [];
		var cnt=0;
		for(var i in config[id]){
			for(var j = 0; j<config[id][i].length; j++){
				var errName = config[id][i][j];
				if(!EFO.validate.status[i][errName]){
					dummyArr.push(i);
					cnt++;
				}
			}
		}
		if(cnt > 0){
			return false;
		}else{
			$('#submit')[0].click();
			return true;
		}
	},

/*	CHANGE MODE
--------------------------------------------------*/
	changeMode: function(mode){
		document.getElementById('formmode').value = mode;
		$('#submit')[0].click();
	},


//-MISC------------------------------------------------------

//------------------------------------------------------------
	copyright: "FOURDIGIT Inc., All Rights Reserved.",
	url: "http://www.4digit.jp"
//------------------------------------------------------------
};
$(function(){EFO.init();});