
function initRegSpy(){
    logObj = {actions: []};
    logObj.push({time: Date(), object: 'window', action: 'load'});
    var elems_to_spy = [
        'nickname',
        'surname',
        'middlename',
        'gender_m',
        'gender_w',
        'region',
        'submit_button',
        'password1',
        'password2',
        'pname',
        'email',
        'birthyear'
    ];
    for(var i=0; i<elems_to_spy.length; i++){
        var elem = ge(elems_to_spy[i]);
        fAttachEvent(elem, 'focus', function(){logObj.actions.push({time: Date(), object: this.id, action: 'focus'});}, false);
        fAttachEvent(elem, 'blur', function(){logObj.actions.push({time: Date(), object: this.id, action: 'blur', value: (this.type == 'text' ? this.value:'')});}, false);
    }
}

function sendSpyDataClb(data){}

function sendSpyData(){
    logObj.push({time: Date(), object: 'window', action: 'unload'});
    var ajxObj = new Ajax();
    ajxObj.request('/ajax/', {callback: sendSpyDataClb, onerror: function(d){}}, {context: 'regform', action: 'logActions', data: logObj});
}

window.onload = initRegSpy;
window.onunload = sendSpyData;


var oForm = document.getElementById('oRegForm');
var errors = [];

var inputs = oForm.getElementsByTagName('input');
for(var i=0; i<inputs.length; i++)
{
	if(inputs[i].type == 'text' || inputs[i].type == 'password')
		inputs[i].onchange = checkField;
}

function checkFieldCallback(data)
{
	function haveFocus(o)
	{
		try
		{
			return !!(o.hasFocus || o.name == document.activeElement.name);
		}
		catch(ex) {}
		try
		{ // Opera
			return !!(o.selectionStart||o.selectionEnd);
		}
		catch (ex) {}
		return false;
	}

	for(var i=0; i<data.errors.length; i++)
		errors.push(data.errors[i]);
//	if(inputs[data['field']] && !haveFocus(oForm.nickname) && !haveFocus(oForm.email))
	showErrors();
	if(data['field'])
		oForm[data['field']].focus();
}

function checkField()
{
	errors = [];
	if(!checkValue(this.name, this.value, errors))
	{
		showErrors();
		this.focus();
		if(this.name == 'password1' || this.name == 'password2')
			this.select();
	}
	else if(this.value != '' && this.name == 'email' || this.name == 'nickname')
	{
		var a = new Ajax();
		var d = {field: this.name, value: this.value, ondubl: true};
		a.request('/ajax/', {callback: checkFieldCallback, onerror: function(d){}}, {context: 'regform', action: 'check_field', data: d});
	}
}

function checkValue(iname, value, errors)
{
	var n = errors.length;
	switch(iname)
	{
		case 'nickname':
			if(value.length > 32 || value.length < 2)
				errors.push("Никнейм не может содержать больше 32 или меньше 2 символов");
			else if(!/[a-zA-Zа-яА-Я]{1}/.test(value))
				errors.push("Никнейм должен начинаться с буквы русского или латинского алфавита");
			else if(/[^0-9a-zA-Zа-яА-Я\%\$\_\.\,\-\@\(\)\` ]/.test(value))
				errors.push("Никнейм содержит некорректные символы");
			break;
		case 'email':
			if(!(/^[a-zA-Z\d\._\-]+@[a-zA-Z\d\.\-]+\.[a-zA-Z]{2,5}$/.test(value)))
				errors.push("Необходимо ввести корректный адрес электронной почты.<br/>Пример: «medvedev@sportforecast.ru»");
			break;
		case 'pname':
			if(!(/^[а-яА-Яa-zA-Z\`\- ]{3,32}$/.test(value)))
				errors.push("Необходимо ввести корректное настоящее имя.<br/>Примеры: «Владимир», «Дмитрий», D'Artangan, Vladimir");
			break;
		case 'middlename':
			if(value && !(/^[а-яА-Яa-zA-Z\`\- ]{3,32}$/.test(value)))
				errors.push("Необходимо ввести корректное имя отчество.<br/>Примеры: «Владимирович», «Анатольевич», Artur");
			break;
		case 'surname':
			if(value && !(/^[а-яА-Яa-zA-Z\`\- ]{3,32}$/.test(value)))
				errors.push("Необходимо ввести корректную настоящую фамилию.<br/>Примеры: «Медведев», «Складовская-Кюри», Hiddink, de Balzac");
			break;
		case 'birthyear':
			if(/^\d{4}$/.test(value))
				var dmY = value;
			else
				errors.push("Введите корректный год рождения в формате ГГГГ.<br/>Пример: «1986»");
			var d = new Date();
			if(dmY < 1900 || dmY >= d.getFullYear())
				errors.push("Год рождения не соответствует нашим представлениям о посетителях сайта ;-)");
			break;
		case 'phone':
			if(value && !(/[0-9]+[^0-9]*[0-9]+[^0-9]*[0-9]+[^0-9]*[0-9]+[^0-9]*[0-9]+/.test(value)))
				errors.push("Необходимо ввести корректный настоящий номер телефона.<br/>Примеры: «(910) 987-65-43», «+12345678 (Skype)»");
			break;
		case 'password1':
			if(value.length > 32 || value.length < 5 || (/[^0-9a-zа-я\%\$\_\.\,\-\@\#\(\) ]/.test(value)))
				errors.push("Необходимо ввести корректный пароль.<br/>Пароль не должен содержать меньше 5 или больше 32 символов.<br/>Пример: «nenavizhu galkina», «велоnhtyf;th»");
			var fakes = ['12345', '54321', '98765', 'asdfg', 'фывап', 'qwert', 'qwerty', 'йцуке', 'йцукен', 'zxcvb', 'ячсми', 'любовь', 'сцуко', 'креведко', 'бабруйск', 'вротмненоги', 'dhjnvytyjub'];
			for(var i=0; i<fakes.length; i++)
			{
				if(oForm.password1.value == fakes[i])
				{
					errors.push("Великодушно извините за навязчивость, но, если мы угадали такой слабый пароль, не стоит ли Вам использовать что-то посложнее?");
					break;
				}
			}
			break;
		case 'password2':
			if(oForm.password1.value != value)
				errors.push("Повторный пароль не совпадает с первым. Для Вашей пользы необходимо повторно ввести оба.");
			break;
		default:
			break;
	}
	if(n < errors.length)
		return false;
	else
		return true;
}

function checkForm()
{
	document.getElementById('msgarea').innerHTML = '';
	errors = [];
	var fields_o = ['pname', 'nickname', 'email', 'birthyear', 'gender', 'password1', 'password2'];
	for(var i=0; i<fields_o.length; i++)
	{
		if(oForm[fields_o[i]].value == '')
		{
			errors.push("Необходимо заполнить все обязательные поля");
			showErrors();
			return false;
		}
	}
	if(!oForm['confirm_quotation'].checked)
	{
		errors.push("Регистрация возможна только на условиях принятия Пользовательского соглашения.");
		showErrors();
		return false;
	}
	return true;
}

function showErrors(msg)
{
	var msg = '';
	for(var i=0; i<errors.length; i++)
		msg += errors[i] +"<br/>";
	document.getElementById('msgarea').innerHTML = msg;
}
