// 汎用フォーム(f2m.cgi/post.cgi)用チェッカー
// jQuery.js 使用が前提

var obj = "form#myform";
var prefix = /^Required/;
var mailId = "rdemail";
var mailKey = /Email/;
var mailFormat = /^[\+\-_a-zA-Z0-9][a-zA-Z0-9\?\+\-\._\/]*\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$/;
var magidKey =/(MagazineId|Magid)/i;
var magidFormat = /^[0-9W][0-9]{9}$/;
var uriKey = /Uri/;
var uriFormat = /^http(|s):\/\//;
alertMsgs = new Array(
"を入力してください。",
"の書式が不正です。",
"をチェックしてください。",
"を選択してください。",
"をいずれか1つ以上選択してください。",
""
);
var normalColor = "#fff";
var warningColor = "#fcc";
var errorColor = "#ffc";

window.onload = function() {
	$( obj ).submit( function(){
		return formCheck( obj );
	});
	$( '#moe' ).click( function(){
		$( '#moe' ).toggle();
		return false;
	});
	$( '#reset' ).click( function(){
		$( '#moe' ).fadeIn();
	});
}

function formCheck( obj ) {
	alertObj = new Array();
	alertSortObj = new Array();
	alertDetailObj = new Array();
	checkboxObj = new Array();
	radioObj = new Array();

	// <input type="text"> チェック
	$( obj + ' input[@type="text"]' ).each( function(){
		if ( ( this.id.match( prefix ) ) || ( this.id == mailId ) ){
			resetStyle( this );
			if ( this.value == "" ) {
				alertType = 0;
				alertObj.push( this.id + ":" + alertType );
			} else if ( ( ( this.id == mailId ) || ( this.id.match( mailKey ) ) ) && ( this.value.search( mailFormat ) ) ) {
				alertType = 1;
				alertObj.push( this.id + ":" + alertType );
			} else if ( ( ( this.id.match( magidKey ) ) ) && ( this.value.search( magidFormat ) ) ) {
				alertType = 1;
				alertObj.push( this.id + ":" + alertType );
			} else if ( ( this.id.match( uriKey ) ) && ( this.value.search( uriFormat ) ) ) {
				alertType = 1;
				alertObj.push( this.id + ":" + alertType );
			}
		}
	});

	// <input type="checkbox"> チェック
	$( obj + ' input[@type="checkbox"]' ).each( function(){
		if ( this.id.match( prefix ) ){
			resetStyle( this );
			if ( this.checked == false ) {
				alertType = 2;
				alertObj.push( this.id + ":" + alertType );
			}
		} else if ( this.name.match( prefix ) ){
			resetStyle( this );
			checkboxObj.push( this.name );
		}
	});
	checkboxObj = only( checkboxObj );
	for ( var i = 0, imax = checkboxObj.length; i < imax; i++ ){
		checkboxArray = new Array();
		checkboxArray = document.getElementsByName( checkboxObj[i] );
		var checkboxFlag = 1;
		for ( var j = 0, max = checkboxArray.length; j < max; j++ ){
			if( checkboxArray[j].checked ){
				checkboxFlag = 0;
				break;
			}
		}
		if ( checkboxFlag ){
			alertType = 4;
			alertObj.push( checkboxArray[0].id + ":" + alertType );
		}
	}

	// <input type="radio"> チェック
	$( obj + ' input[@type="radio"]' ).each( function(){
		if ( this.name.match( prefix ) ){
			resetStyle( this );
			radioObj.push( this.name );
		}
	});
	radioObj = only( radioObj );
	for ( var i = 0, imax = radioObj.length; i < imax; i++ ){
		radioArray = new Array();
		radioArray = document.getElementsByName( radioObj[i] );
		var radioFlag = 1;
		for ( var j = 0, max = radioArray.length; j < max; j++ ){
			if( radioArray[j].checked ){
				radioFlag = 0;
				break;
			}
		}
		if ( radioFlag ){
			alertType = 3;
			alertObj.push( radioArray[0].id + ":" + alertType );
		}
	}

	// <select> チェック
	$( obj + ' select' ).each( function(){
		if ( this.id.match( prefix ) ){
			resetStyle( this );
			if ( this.value == "" ) {
				alertType = 3;
				alertObj.push( this.id + ":" + alertType );
			}
		}
	});

	// <textarea> チェック
	$( obj + ' textarea' ).each( function(){
		if ( this.id.match( prefix ) ){
			resetStyle( this );
			if ( this.value == "" ) {
				alertType = 0;
				alertObj.push( this.id + ":" + alertType );
			}
		}

	});

	// アラートチェック
	for ( var i = 0, max = alertObj.length; i < max; i++ ){
		var alertId = "#" + ( alertObj[i].split(":") )[0];
		var alertType = ( alertObj[i].split(":") )[1];
		var alertTitle = $( alertId ).attr( "title" );
		var alertTabindex = dig2( $( alertId ).attr( "tabindex" ) );
		alertDetailObj.push( alertTabindex + ":" + alertId + ":" + alertType );
	}

	alertSortObj = alertDetailObj.sort();

	var alertMsg = "";
	var focusId = "";
	for ( var i = 0, max = alertSortObj.length; i < max; i++ ){
		var alertId = ( alertSortObj[i].split(":") )[1];
		if ( i == 0 ){
			focusId = alertId;
		}
		var alertType = ( alertSortObj[i].split(":") )[2];
		var alertTitle = $( alertId ).attr( "title" );
		alertMsg += alertTitle + alertMsgs[alertType] + "\n";
		setStyle( alertId, alertType );
	}

	return viewAlert( alertMsg, focusId );
}

// スタイルのリセット
function resetStyle( obj ){
	$( obj ).css( "background-color", normalColor );
}

// スタイルのセット
function setStyle( obj, type ){
	var setColor = ( type == 1 ) ? errorColor : warningColor;
	$( obj ).css( "background-color", setColor );
}


// アラート表示
function viewAlert( alertMsg, focusId ){
	if ( alertMsg ){
		alert( alertMsg );
		$( focusId ).focus();
		$( focusId ).select();
		return false;
	} else {
		return true;
	}
}

// 桁数 2桁 に変換
function dig2( value ) {
	if ( value < 10){
		return '0' + String( value );
	} else {
		return value;
	}
}

// 配列の重複削除
function only( arr ){
	for ( var i = 0, len = arr.length, cnt = 0, list={}, end=[]; i < len; i++ ){
		if( !list[arr[i]] ){
			end[cnt++] = arr[i];
			list[arr[i]] = true;
		}
	}
	return end;
}
