(function($) {

	//Глобальное переопределение параметров по умолчанию
	$.blockUI.defaults.css.cursor = 'default';
	$.blockUI.defaults.css.border = '0';


	var newWindow = '<div class="block" id="{%objectCount%}"><img class="close" src="/images/close.gif" /><div class="header">{%title%}</div><div class="content">{%content%}</div></div>';
	var newBlock = '<div id="{%objectCount%}"></div>';

	jQuery.fn.tcmfSetBlockControls = function()
	{
		return this.each(
			function()
			{
				$(this).bind("mousedown",
					function()
					{
						$(this).css('zIndex', ++jQuery.fn.tcmfSetBlockControls.zindex);
					});

				$(this).find('.close').bind("click",
					function()
					{
						$(this).parent(".block").slideUp("slow",
							function()
							{
								$(this).remove();
							});
					});

				$(this).find('.header').bind("dblclick",
					function()
					{
						$(this).siblings('.content').slideToggle("slow");
					});

				if ($(this).data('params') && $(this).data('params').window == 1)
				{
					$(this).draggable({ handle: '.header', containment: 'document' });
				}

			}
		);
	}

	jQuery.fn.tcmfSetBlockControls.zindex = 10000;


	CreateRawBlock = function()
	{
		var oc = 'oc' + Math.ceil(Math.random() * 10000000);
		$('#windows')
				.append(
					$(newBlock.replace(/{%objectCount%}/, oc))
						.data('params', { window: 1, nonUpdated: 1 })
						.css('zIndex', ++jQuery.fn.tcmfSetBlockControls.zindex)
		);

        return oc;
	}


	CreateWindow = function(title, content)
	{
   		var oc = 'oc' + Math.ceil(Math.random() * 10000000);
		$('#windows')
				.append(
					$(newWindow.replace(/{%objectCount%}/g, oc).replace(/{%title%}/g, title).replace(/{%content%}/g, content))
						.data('params', { window: 1, nonUpdated: 1 })
						.css('zIndex', ++jQuery.fn.tcmfSetBlockControls.zindex)
						.tcmfSetBlockControls()

		);
		$('#' + oc).center();

        return oc;
	}

	jQuery.fn.Request = function(options)
	{
		var defaults = {
    		url: '',
    		loader: 'global',
    		complete: null,
    		data: ''
  		};



  		var opts = $.extend(defaults, options);

		if (this.length == 0)
		{
			jQuery.log('Элемент не найден, запрос не возможен.');
			return false;
		}
		if (this.length > 1)
		{
			jQuery.log('В выборке больше 1 элемента, запрос не возможен.');
        	return false;
        }
       	opts['objectCount'] = this.attr('id');

		return Request(opts);
	}

	jQuery.Request = function(options)
	{
		var defaults = {
    		url: '',
    		loader: 'global',
    		complete: null,
    		data: ''
  		};

  		var opts = $.extend(defaults, options);
		opts['objectCount'] = CreateRawBlock();

		return Request(opts);
	}

	Request = function(opts)
	{
		jQuery('#' + opts['objectCount']).data('callbacks', { complete: opts['complete'] });

		opts['data'] += '&objectCount=' + opts['objectCount'] + '&datarequest=1';

		$.ajax({
 	      	type: "POST",
 			url: opts['url'],
 			data: opts['data'],
 			success: $.RequestComplete
 		});



		if (opts['loader'] == 'global')
			$.blockUI({message: "<img src='/images/ajax-loader.gif' />", baseZ: '100000', css: { border: '0px', background: 'none' } });

		else if (opts['loader'] == 'block')
			$('#' + opts['objectCount']).block({message: "<img src='/images/ajax-loader.gif' />", baseZ: '100000', css: { border: '0px', background: 'none' } });

		return false;
	}

	jQuery.RequestComplete = function(responce)
	{
		var jsonObj = new Array();
		try
		{
			jsonObj = eval('(' + responce + ')');
        }
        catch(ex)
        {
        	jsonObj = new Array();
        	jsonObj['error'] = 1;
        	jsonObj['message'] = responce;
        }

		try
		{
			$.unblockUI();
			if (jsonObj['error'] == 1)
			{
				CreateWindow('Сообщение системы', jsonObj['message']);
			}
			else
			{
				var block = '#' + jsonObj['objectCount'];

				if ($(block).data('params'))
				{
					var isWindow = ($(block).data('params').window == 1) ? true : false;
					var nonUpdated = ($(block).data('params').nonUpdated == 1) ? true : false;
					if (isWindow)
						var prevSettings = { position: 'absolute', top: $(block).css('top'), left: $(block).css('left') };
                }
                
                var complete = $(block).data('callbacks').complete;
                if(jsonObj['nonReplace']==1){
					$(block).html("");
				}else{
					$(block).replaceWith(jsonObj['content']);
                }
                
                if (isWindow)
                {
                	$(block).data('params', { window: 1 });
       				if (nonUpdated) $(block).center();
       				else $(block).css(prevSettings);
                }

                $(block).tcmfSetBlockControls();

				if (jsonObj['scripts'] !== undefined)
					eval(jsonObj['scripts']);

				if (complete)
					(complete)(jsonObj);

			}
		}
		catch (ex) { }
	}

	FilterNum = function(inputElement)
	{
		inputElement.value = inputElement.value.replace(/[^\d\.\,]+/, '');
		inputElement.value = inputElement.value.replace(/,|[\,\.]{2,}/, '.');
		inputElement.value = inputElement.value.replace(/^[\.\,]/, '');
	}

	FilterInt = function(inputElement)
	{
		inputElement.value = inputElement.value.replace(/[^\d]+/, '');
	}

	FilterStringLat = function(inputElement)
	{
		inputElement.value = inputElement.value.toLowerCase();
		inputElement.value = inputElement.value.replace(/[^a-z0-9_\-\.\@]+/, '');
	}


	jQuery.fn.center = function()
	{
		var w = $(window);
		this.css("position", "absolute");
		this.css("top", (w.height() - this.height()) / 2 + w.scrollTop() + "px");
		this.css("left", (w.width() - this.width()) / 2 + w.scrollLeft() + "px");

		return this;
	}

	jQuery.preloadImages = function()
	{
		for (var i = 0; i < arguments.length; i++)
			jQuery("<img>").attr("src", arguments[i]);
	}

})(jQuery);

