﻿var CURTAIN_ID = 'curtain';

var default_options = {
	async: false,
	timeout: 10 * 1000,
	to_show_curtain: false,
	to_exec_callback: false,
	message_show_func: function( status ){ $.jGrowl( status.message ) }
};

var query_count = 0; //число AJAX-запросов, идущих в данный момент

$.jGrowl.defaults.closerTemplate = '<div>[закрыть все]</div>';


function curtainOn()
{
	var div;

	if( 0 == $( '#' + CURTAIN_ID ).length )
	{
		$( 'body' ).prepend( '<table id="' + CURTAIN_ID + '"><tr><td><span>Работаю...</span></td></tr></table>' );
	}

	$( '#' + CURTAIN_ID ).height( $(document).height() ).removeClass( 'hidden' );
};

function curtainOff()
{
	$( '#' + CURTAIN_ID ).addClass( 'hidden' );
};


function preQuery( is_curtain_show )
{
	query_count++;

	if( is_curtain_show )
		curtainOn();
};

function postQuery( is_curtain_show )
{
	query_count--;

	if( query_count < 1 )
	{
		curtainOff();
	}
};


function errorQuery( XMLHttpRequest, textStatus, errorThrown )
{
	$.jGrowl( textStatus );
};


function checkResponseData( txt, url, content, func, settings )
{
	var data;

	if( '' == txt )
	{
		func( null );
	}
	else
	{
		try
		{
			data = $.secureEvalJSON( txt );
		}
		catch( e )
		{
			$.jGrowl( 'Получен сбойный ответ от сервера\n----------------------------------\n' + txt );
			return;
		}

		if( 0 != data.status.code )
		{
			if( 1 == data.status.code )
			{
				$.fn.layerAuth.specExec( function(){ doQuery( url, content, func, settings ); } );
				$('.auth p.enter span').click();
			}
			else
				settings.message_show_func( data.status );
			
			if( settings.to_exec_callback )
				func( data );
		}
		else
		{
			if( data.status.message )
				settings.message_show_func( data.status );
				
			func( data );
		}
	}
};


function doQuery( url, content, func, options )
{
	var settings = $.extend( {}, default_options, options );

	$.ajax(
		{
			url:        url,
			data:       content,
			async:      settings.async,
			beforeSend: function(){ preQuery( settings.to_show_curtain ); },
			complete:   function(){ postQuery( settings.to_show_curtain ); },
			success:    function( txt ){ checkResponseData( txt, url, content, func, settings ) },
			error:      errorQuery,
			timeout:    settings.timeout,
			type:       'POST',
			dataType:   'text'
		}
	);
};


function restoreAuth( url, content, func, settings )
{
	var form = $( '#restoreAuthForm form' )[0];

	doQuery(
		'/login/',
		{
			action:   'restore',
			login:    form['login'].value,
			password: form['password'].value
		},
		function( data )
		{
			if( 0 == data.status.code )
			{
				$( '#restoreAuthForm' ).remove();
				doQuery( url, content, func, settings );
			}
		},
		{
			to_exec_callback: true,
			message_show_func: function( status ){ if( 0 != status.code ) $( '#restoreAuthForm .hint' ).text( status.message ); }
		}
	);
};
