// formcheck をアワード用に改造
// 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 uriKey = /Uri/;
var uriFormat = /^http(|s):\/\//;
alertMsgs = new Array(
"を入力してください。",
"の書式が不正です。",
"をチェックしてください。",
"を選択してください。",
"をいずれか1つ以上選択してください。",
""
);
var normalColor = "#fff";
var warningColor = "#fcc";
var errorColor = "#ffc";
var magidFormat = /^[0-9]{10}$/;

$(function(){
	$( obj ).submit( function(){
		return formCheck( obj );
	});
});

function formCheck( obj ) {
	alertObj = new Array();
	alertSortObj = new Array();
	alertDetailObj = new Array();
	checkboxObj = new Array();
	radioObj = new Array();

	// <input type="text"> チェック
	$( '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( uriKey ) ) && ( this.value.search( uriFormat ) ) ) {
				alertType = 1;
				alertObj.push( this.id + ":" + alertType );
			} else if ( this.id == "RequiredNumericMagid" ) {
				if ( !this.value.match( magidFormat ) ) {
					alertType = 1;
					alertObj.push( this.id + ":" + alertType );
				}
			}
		}
	});

	// <input type="checkbox"> チェック
	$( '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"> チェック
	$( '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> チェック
	$( 'select' ).each( function(){
		if ( this.id.match( prefix ) ){
			resetStyle( this );
			if ( this.value == "" ) {
				alertType = 3;
				alertObj.push( this.id + ":" + alertType );
			}
		}
	});

	// <textarea> チェック
	$( '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 );
	var objId = $( obj ).attr( "id" );
	obj = objId.replace(/#/,"");
	$( "#alert-" + objId ).removeClass( "alert" );
}

// スタイルのセット
function setStyle( obj, type ){
	var setColor = ( type == 1 ) ? errorColor : warningColor;
	$( obj ).css( "background-color", setColor );
	var objId = $( obj ).attr( "id" );
	obj = objId.replace(/#/,"");
	$( "#alert-" + objId ).addClass( "alert" );
}


// アラート表示
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;
}
