/**
 * 	Функции AJAX-проверки формы регистрации
 * 
 *  @since	06.06.2009 15:56 MSK
 */



$j = jQuery.noConflict();



/** шаблон URL запроса */
var AJAXURL	= '/account.php?do=docheck';



/**
 * 	правила проверки формы
 */
var rules		= {
		  'username'		: 	{}
		, 'password'		: 	{}
		, 'passwordconfirm'	:	{}
		, 'email'			: 	{}
		, 'vb_agree'		:	{}
		, 'vb_reuse'		:	{
			'ok'	:	true
		}
		, 'game_login'		:	{}
		, 'game_pwd1'		:	{}
		, 'game_pwd2'		:	{}
		, 'humanverify'		:	{}
};



username_error = false;



/**
 * 	trim
 * 	убирает пробелы в начале и конце строки
 * 
 *  @return			string		обработанная строка
 */
String.prototype.trim = function() 
{
	return( this.replace( /^\s\s*/, '' ).replace( /\s\s*$j/, '' ) );
};



cancel					= false;
duplicate_error_parent	= null;
duplicate_error_object	= null;
duplicate_error_once	= null;



/**
 * 	setDuplicateError
 * 	устанавливает DOM-объект, для которого нужно продублировать ошибку
 * 
 * 	@param obj		object		элемент DOM
 * 	@param for_obj	object		элемент DOM, при проверке которого повторять ошибку
 * 	@param once		bool		дублировать один раз
 */
function setDuplicateError( obj, for_obj, once )
{
	duplicate_error_parent	= for_obj;
	duplicate_error_object 	= obj;
	duplicate_error_once	= once;
}



/**
 * 	showDuplicateError
 * 	показывает дублированное сообщение об ошибке
 * 
 * 	@param obj		object		элемент DOM
 * 	@param msg		string		сообщение об ошибке
 */
function showDuplicateError( obj, msg )
{
	showMessage( obj, msg, false );
	cancel = true;
//	if( duplicate_error_once ) {
//		setDuplicateError( null, null, false );
//	}
}



/**
 * 	showMessage
 * 	показывает сообщение об ошибке под элементом
 * 
 * 	@param	obj		object		элемент DOM
 * 	@param	msg		string		сообщение об ошибке
 */
function showMessage( obj, msg, error )
{
//	if( duplicate_error_object && cancel ) {
//		cancel = false;
//		setDuplicateError( null, null, false );
//	}
	
	var color = error ? 'ff0000' : '00a000';
	
	id = obj.id ? obj.id : obj;
	obj = obj.id ? obj : $j( '#' + obj );
	obj = obj.length ? obj[0] : obj;
	
//	alert( 'show ' + id + "\nerror = " + error );
	
	if( username_error && id == 'username' ) {
		username_error = false;
//		alert( 'return' );
		return;
	}
	 
	if( !error )
	{
		switch( id )
		{
			case 'email':
				msg = 'Данный e-mail можно использовать.';
			break;
			case 'username':
				msg = 'Данное имя свободно';
			break;
			case 'passwordconfirm':
				msg = 'Введенные пароли совпадают.';
			break;
			case 'game_login':
				msg = 'Данный логин свободен';
			break;
			case 'game_pwd2':
				msg = 'Введенные пароли совпадают.';
			break;
			case 'humanverify':
				msg = 'Введенный текст и текст на изображении совпадают.';
			break;
			default:
				msg = '';
			break;
		}
	}
		 
	var id 	= obj.id + '_error';
	
	var p 	= $j( obj ).parents( 'tr' );
	p = p.length ? p[0] : p;
	
	var t 	= $j( 'tr#' + id );
	if( t.length ) {
		removeError( obj );
	}
	
	var cs = $j( p ).children( 'td' ).length - 1;
	
	if( msg ) {
		$j( p ).after( '<tr id="' + id + '">' + ( cs > 1 ? '<td></td>' : '' ) + '<td colspan="' + cs + '"><font color="#' + color + '">' + msg + '</font></td></tr>' );
	}
	
	setOk( obj, !error );
	
//	if( obj.id == duplicate_error_parent && duplicate_error_object ) {
//		showDuplicateError( duplicate_error_object, msg );
//	}
}



/**
 * 	removeError
 * 	убирает сообщение об ошибке
 * 
 * 	@param 	obj		object		элемент DOM
 */
function removeError( obj )
{
//	if( obj.id == duplicate_error_object ) {
//		return;
//	}
	 
	var id 	= obj.id + '_error';
	var p 	= $j( 'tr#' + id );
	
	if( p.length ) {
		p.remove();
	}
	
	setOk( obj, true );
}



/**
 * 	getErrorString
 * 	формирует строку сообщения об ошибке
 * 
 * 	@param errors	array		массив соощений об ошибках
 * 	@return			string		строка сообщения об ошибках
 */
function getErrorString( errors )
{
	var s = '';
	
	for( var i = 0; i < errors.length; i++ ) {
		s += errors[i] + '<br />';
	}
	
	return( s );
}



/**
 * 	throwError
 * 	показывает сообщение об ошибке
 * 
 * 	@param obj		DOMElement	DOM-объект проверяемого поля формы
 * 	@param msg		string		сообщение об ошибке
 */
function throwError( obj, msg )
{
//	if( error && obj.id == 'game_login' ) {
//		error = false;
//		return;
//	}
	 
	showMessage( obj, msg, true );
	setOk( obj, false );
	
//	alert( 'throw ' + obj.id );

	if( obj.id == 'username' ) {
//		alert( 'set error true' );
		username_error = true;
	}
}

 

/**
* 	checkAJAXResult
* 	проверяет результат AJAX-запроса
* 
* 	@param data		JSON		результат AJAX-запроса
* 	@param obj		DOMElement	DOM-объект проверяемого поля формы
*/
function checkAJAXResult( data, obj, fields )
{
//	if( cancel ) {
//		cancel = false;
//		return;
//	}

	if( fields.error_field ) {
		obj = fields.error_field;
	}
	
	if( data.errors.length ) {
		throwError( obj, getErrorString( data.errors ) );
	} else {
		showMessage( obj, null, false );
		//removeMessage( obj );
	}
}



/**
 * 	AJAXPost
 * 	посылает AJAX-запрос
 * 
 * 	@param url		string		URL
 * 	@param fields	object		поля запроса
 * 	@param obj		DOMElement	DOM-объект проверяемого поля формы
 */
function AJAXPost( url, fields, obj )
{
	$j.post( 
		  url
		, fields
		, function( data ) {
			  if( fields.error_field ) {
				  data.error_field = fields.error_field;  
			  }
			  
			  checkAJAXResult( data, obj, fields );
			  
			  if( fields.callback ) {
				  var ps = new Array();
				  for( var i = 0; i < fields.callback_strings.length; i++ ) {
					  ps[i] = '"' + fields.callback_strings[i] + '"';
				  }
				  ps = ps.join( ', ' );
				  eval( fields.callback + '(' + ps + ');' );
			  }
		}
		, 'json'
	);
}


 
/**
 *	setOk
 *	устанавливает состояния полей
 * 
 * 	@param name		string		идентификатор чекбокса
 * 	@param state	bool		состояние чекбокса
 */
function setOk( obj, state )
{
	 id = obj.id ? obj.id : obj;
	 rules[id].ok = state;
	 
	 var f = $j( 'form[name="regform"]' );
	 f = f.length ? f[0] : f;
	 checkForm( f );
}


 
/**
 *	checkUsername
 *	проверяет имя пользователя
 * 
 * 	@param 	obj		DOMElement	DOM-объект проверяемого поля формы	
 */
function checkUsername( obj )
{
	if( ( field = obj.value.trim() ).length ) {
//		if( rules.vb_reuse.ok ) {
//			setDuplicateError( obj, 'game_login', true );
//		}
//		
		data = {username: field};
		if( rules.vb_reuse.ok ) {
			data.callback = 'checkGameLogin';
			data.callback_strings = ['game_login', field];
		}
		
		AJAXPost( AJAXURL + obj.id, data, obj );
		
//		if( rules.vb_reuse.ok ) {
//			checkGameLogin( document.getElementById( 'game_login' ), field );
//		}
	} else {
		throwError( obj, 'Введите имя пользователя' );
	}
}



/**
 *	checkPassword
 *	проверяет пароль пользователя
 *
 * 	@param 	obj		DOMElement	DOM-объект проверяемого поля формы
 */
 function checkPassword( obj )
 {
	if( ( field = obj.value.trim() ).length >= 6 && field.length <= 20 )
	{
		var re = /^[0-9a-zA-Z\_\-]+$/;
		if( !re.test( field ) ) {
			throwError( obj, 'Недопустимые символы' );
			return;
		}
		
		AJAXPost( AJAXURL + obj.id, {password: field}, obj );
		var f =  $j( obj ).parents( 'form' );
		f = f.length ? f[0] : f;
		checkPasswordConfirm( f, true );
	} else {
		throwError( obj, 'Введите пароль от 6-и до 20-и символов' );
	}
}



/**
*	checkPasswordConfirm
*	проверяет пароль пользователя
*
* 	@param 	f		object		форма
* 	@param	match	bool		проверять только на совпадение паролей
*/
function checkPasswordConfirm( f, match )
{	
	var obj1	= f.elements['password'];
	var obj2	= f.elements['passwordconfirm'];
	
	if( ( field1 = obj1.value.trim() ).length < 6 && field1.length >= 20 && !match ) {
		throwError( obj1, 'Введите пароль от 6-и до 20-и символов' );
		return;
	} 
	
	if( ( field2 = obj2.value.trim() ).length < 6 && field2.length >= 20 && !match ) {
		throwError( obj2, 'Введите пароль от 6-и до 20-и символов' );
		return;
	} 
	
	var re = /^[0-9a-zA-Z\_\-]+$/;
	if( !re.test( obj2.value.trim() ) ) {
		throwError( obj2, 'Недопустимые символы' );
		return;
	}
	
	if( field1 && field2 ) {
		if( field1 != field2 ) {
			throwError( obj2, 'Введенные пароли не совпадают' );
			return;
		} else {
			showMessage( obj2, null, false );
			return;
		}
	}
	
	if( !match ) {
		AJAXPost( AJAXURL + obj2.id, {password: field2}, obj2 );
	}
}



/**
 *	checkEmail
 *	проверяет email пользователя
 *
 * 	@param 	obj		DOMElement	DOM-объект проверяемого поля формы
 */
 function checkEmail( obj )
 {
	if( ( field = obj.value.trim() ).length )
	{
		AJAXPost( AJAXURL + obj.id, {email: field}, obj );
	} else {
		throwError( obj, 'Введите E-mail' );
	}
}



/**
 *	checkGameLogin
 *	проверяет игровой логин
 * 
 * 	@param obj		DOMElement	DOM-объект проверяемого поля формы
 *	@param force	bool		проверять независимо от введенного значения
 */
function checkGameLogin( obj, force )
{
	if( ( field = force ) || ( field = obj.value.trim() ).length )
	{
		if( force ) {
			id = obj;
		} else {
			id = obj.id;
		}
		
		data = {game_login: field};
		if( force ) {
			data.error_field = 'username';
		}
		
		AJAXPost( AJAXURL + id, data, obj );
	} else {
		throwError( obj, 'Введите игровой логин' );
	}
}



/**
*	checkGamePassword
*	проверяет игровой пароль
* 
* 	@param obj		DOMElement	DOM-объект проверяемого поля формы
*/
function checkGamePassword( obj )
{
	if( ( field = obj.value.trim() ).length >= 6 )
	{
		AJAXPost( AJAXURL + obj.id, {game_pwd1: field}, obj );
		var f =  $j( obj ).parents( 'form' );
		f = f.length ? f[0] : f;
		checkGamePasswordConfirm( f, true );
	} else {
		throwError( obj, 'Введите пароль от 6-и до 20-и символов' );
	}
}



/**
*	checkGamePasswordConfirm
*	проверяет пароль пользователя
*
* 	@param 	f		object		форма
* 	@param	match	bool		проверять только на совпадение паролей
*/
function checkGamePasswordConfirm( f, match )
{
	var obj1	= f.elements['game_pwd1'];
	var obj2	= f.elements['game_pwd2'];
	
	if( ( field1 = obj1.value.trim() ).length < 6 && field.length >= 20 && !match ) {
		throwError( obj1, 'Введите пароль от 6-и до 20-и символов' );
		return;
	} 
	
	if( ( field2 = obj2.value.trim() ).length < 6 && field.length >= 20 && !match ) {
		throwError( obj2, 'Введите пароль от 6-и до 20-и символов' );
		return;
	} 
	
	if( field1 && field2 ) {
		if( field1 != field2 ) {
			throwError( obj2, 'Введенные пароли не совпадают' );
			return;
		} else {
			showMessage( obj2, null, false );
			return;
		}
	}
	
	if( !match ) {
		AJAXPost( AJAXURL + obj2.id, {game_pwd2: field2}, obj2 );
	}
}



/**
 * 	checkRegImage
 * 	проверка введенной капчи
 * 
 * 	@param obj		DOMElement	DOM-объект проверяемого поля формы
*/
function checkRegImage( obj )
{
	var hash = $j( '#hash' );
	hash = hash.length ? hash[0] : hash;
	hash = hash.value.trim();
	
	if( ( field = obj.value.trim() ).length >= 6 )
	{
		AJAXPost( AJAXURL + obj.id, {humanverify: field, hash: hash}, obj );
	} else {
		throwError( obj, 'Введите шесть букв и/или цифр' );
	}
}



/**
 *	checkRegImageTextLength
 *	проверяет длину введенной капчи и вызывает blur(), если введено 6 символов
 *  
 *	 @param obj		DOMElement	DOM-объект проверяемого поля формы
 */
function checkRegImageTextLength( obj )
{
	if( obj.value.trim().length >= 6 ) {
		obj.blur();
	}
}



/**
 *	setSubmit
 *	устанавливает состоянии кнопки submit формы
 * 
 * 	@param	f		object		форма
 * 	@param 	state	bool		состояние кнопки submit
 */
function setSubmit( f, state )
{
	var b_dsbl_color	= '#d4d0c8';
	var b_enbl_color	= '#118011';
	var f_dsbl_color	= '#464441';
	var f_enbl_color	= '#ffffff';
	 
	var fe = f.elements;
	var sb = fe['submit'];
	
	sb.disabled 				= state ? '' 			: 'disabled';
	sb.style.backgroundColor 	= state ? b_enbl_color 	: b_dsbl_color;
	sb.style.color 				= state ? f_enbl_color 	: f_dsbl_color;
}



/**
 * 	checkForm
 * 	проверка формы
 * 
 * 	@param f		object		форма
 * 	@return			bool		правильность заполнения полей
 */
function checkForm( f )
{
	var required	= false;
	var additional	= false;
	
	var testobj = document.getElementById('gauc_top_data_cont');
	
	if (user_id == undefined){
		var user_id;
	}
	
	if (test_user_id != undefined){
		user_id = test_user_id;
	}
	
	// проверим необходимые поля
	if( isNaN( parseInt( user_id, 10 ) ) ) {
		if(
			 !rules.email.ok
		  || !rules.username.ok
		  || !rules.password.ok
		  || !rules.passwordconfirm.ok
		  || !rules.vb_agree.ok
		  || !rules.humanverify.ok
		) {
//			alert( 'Some of required not ok 1' );
			required = false;
		} else {
//			alert( 'All required ok 1' );
			required = true;
		}
	} else {
		if( 
		     !rules.vb_agree.ok
		  || !rules.humanverify.ok
		) {
//			alert( 'Some of required not ok 2 ' );
			required = false;
		} else {
//			alert( 'All required ok 2' );
			required = true;
		}
	}
	
	// залогинен?
	if( !isNaN( parseInt( user_id, 10 ) ) ) {
		rules.vb_reuse.ok = false;
	} else {
		additional = true;
	}
	
	// проверим дополнительные поля
	if( !rules.vb_reuse.ok ) {
		if(
			   !rules.game_login.ok
			|| !rules.game_pwd1.ok
			|| !rules.game_pwd2.ok
		) {
//			alert( 'Some of additional not ok' );
			additional = false;
		} else {
//			alert( 'All additional ok' );
			additional = true;
		}
	}
	 
	// проверим всё вместе
	if (!testobj){
		if( required && additional ) {
			setSubmit( f, true );
		} else {
			setSubmit( f, false );
		}
	}
}
