	// параметры AJAX запроса
	var options = {
		dataType: 'xml',
		beforeSubmit: request,
		success: response,
		timeout: 25000
	};

	// формы сайта будут отправлять данные через AJAX запросы
	$(document).ready(function() {
		$('form').submit(function() {
			if (!$(this).hasClass("no-ajax")) {
				$(this).ajaxSubmit(options);
				return false;
			}
		});
	});

	// включение и отключение кнопок формы
	function button(form, action)
	{
		(action == 'on') ? form.find('button').removeAttr('disabled') : form.find('button').attr('disabled', 'disabled');
	}

	// перед тем как отправить запрос на сервер
	function request(data, form, options)
	{
		button(form, 'off');
		form.find('.preloader').show();
		form.find('.response').html(null).hide();
		form.timer = setTimeout(function () { timeout(form); }, options['timeout'] + 1000);
		return true;
	}

	// обрабатываем ответ сервера
	function response(response, status, xhr, form)
	{
		clearTimeout(form.timer);
		inform(form, $('status', response).text(), $('message', response).text(), $('redirect', response).text());
	}

	// не получили ответ от сервера
	function timeout(form)
	{
		inform(form, 'error', 'К сожалению сервер не отвечает, попробуйте повторить запрос.')
	}

	// сообщаем о результатах обработки запроса
	function inform(form, status, message, url)
	{
		form.find('.preloader').hide();
		form.find('.response').html('<div class="' + status + '">' + message + '</div>').slideDown();
		if (status == 'ok')
		{
			// скрываем форму
			form.find('.form').slideUp();
			if (url)
			{
				// перенаправляем пользователя
				redirect(url);
			}
		}
		else
		{
			button(form, 'on');
		}
	}

	// перенаправляет пользователя на указанную страницу
	function redirect(url)
	{
		setTimeout(function () { location.href = url; }, 1000);
	}

	// генерирует новую картинку антибота
	function refresh(captcha, field)
	{
		$(captcha).find('img').attr('src', '/captcha.php?field=' + field + '&rnd=' + Math.random());
		return false;
	}

	// меняет заголовок поля в зависимости от значения ключевого поля
	function caption(id, key, list)
	{
		$('#' + id).text(list[$(key).val()]);
	}

	function generate_password(element) {
		var passwd = random_password(8);
		$(element).closest("table").find("input[name^='passwd']").val(passwd);
		$("#generated").text(passwd);
	}

	// генерирует случайный пароль
	function random_password(length) {
		var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; // допустимые символы
		var passwd = "";
		var index;
		for (var i = 1; i <= length; i++) {
			index = Math.floor(Math.random() * chars.length);
			passwd += chars.charAt(index);
		}
		return passwd;
	}
