$(document).ready(function(){
	var $dialog = $('<form id="recall_dialog"></form>')
		.html(	'<label for="recall_name">Ваше имя:</label>' +
				'<input type="text" name="recall[name]" id="recall_name" />' +
				'<p id="recall_name_error" class="error"></p>' +

				'<label for="recall_number">Телефон для звонка:</label>' +
				'<input type="text" name="recall[number]" id="recall_number" />' +
				'<p id="recall_number_error" class="error"></p>' +

				'<div class="recall_dialog__button_place"><p class="recall_dialog__button_place__text">Услуга бесплатна</p><button /></div>')
		.dialog({
			autoOpen: false,
			closeText: '',
			dialogClass: 'callback-dialog',
			resizable: false,
			draggable: false,
			modal: true,
			position: ['center', 'center'],
			title: "Заказ обратного звонка",
			create: function() {
				$("#recall_number").mask("(999) 999-99-99");
				$(this).find('button').click(function() {
					callbackMe();
					return false;
				});
			}
		})
		.data('in_process', false);

	$('.ui-widget-overlay').live('click', function() {
		if (!$dialog.data('in_process'))
			$dialog.dialog('close');
	});

	var setRecallButtonState = function(state) {
		if (state.length == 0)
			$('#recall').removeClass('succeed failed');
		else {
			$('#recall').removeClass('succeed failed').addClass(state);
		}
	}

	var enableLoadingState = function()
	{
		$('#recall_dialog button').attr('disabled', 'disabled').addClass('ui-state-disabled loading');

		$("#recall_dialog input").attr("disabled", "disabled").removeClass('error');
		$("#recall_dialog p.error").html('');
	}

	var disableLoadingState = function()
	{
		$('#recall_dialog button').removeAttr('disabled').removeClass('ui-state-disabled loading');
		$("#recall_dialog input").removeAttr("disabled");
	}

	var callbackMe = function()
	{
		$.ajax({
			type: "POST",
			url: "/recall.php",
			data: $('#recall_dialog').serialize(),
			cache: false,
			dataType: 'json',
			beforeSend: function() {
				$dialog.data('in_process', true);
				setRecallButtonState('');
				enableLoadingState();
				return true;
			},
			success: function(data) {
				setRecallButtonState('succeed');
				$dialog.dialog("close");
			},
			error: function(xhr, textStatus, errorThrown) {
				if (xhr.status == 400) {
					var $reply = xhr.responseText;
					if ($reply !== null)
					{
						$.each(jQuery.parseJSON($reply), function(index, value) {
							$('#recall_' + index).addClass('error');
							$('#recall_' + index + '_error').addClass('error').html(value);
						});
					}
				}
				else {
					setRecallButtonState('failed');
					$dialog.dialog("close");
				}
			},
			complete: function() {
				disableLoadingState();
				$dialog.data('in_process', false);
			}
		});
	}

	$("#recall").click(function() {
		if (!($(this).hasClass('succeed') || $(this).hasClass('failed')))
			$dialog.dialog('open');
		return false;
	})
});
