﻿function Js_Makc2_UI_Control_Ajax_Default(js_Settings)
{
	var settings = jQuery.extend(
		{
			Name: null,
			ProgressBar: null,
			Targets: null,
			Request: null
		},
		js_Settings || {}
	);

	if (settings.Request == null)
	{
		settings.Request = new Js_Makc2_UI_Control_Ajax_Default_Request(null);
	}

	this.Js_Settings = settings;

	this.Js_Stop = function()
	{
		if (settings.Targets == null)
		{
			return;
		}

		for (var i = 0; i < settings.Targets.length; i++)
		{
			this.Js_StopGoingToTarget(i);
		}
	};

	this.Js_StopGoingToTarget = function(index)
	{
		var target = settings.Targets[index];

		target.IsGoing = false;
		target.IsError = false;

		if (!Js_Makc2_Variable_IsUndefinedOrNull(target.TimeoutId))
		{
			clearTimeout(target.TimeoutId);

			target.TimeoutId = null;
		}
	}
	
	this.Js_Go = function(js_IsShowProgressBar)
	{
		if (settings.Targets == null)
		{
			return;
		}

		settings.GoingCount = settings.Targets.length;

		for (var i = 0; i < settings.Targets.length; i++)
		{
			this.Js_GoToTarget(i, js_IsShowProgressBar);
		}
	};

	this.Js_GoToTarget = function(index, js_IsShowProgressBar)
	{
		var target = settings.Targets[index];

		target.IsGoing = true;
		target.IsError = false;

		if (!Js_Makc2_Variable_IsUndefinedOrNull(target.TimeoutId))
		{
			clearTimeout(target.TimeoutId);

			target.TimeoutId = null;
		}

		target.IsContainerExists = !Js_Makc2_Variable_IsUndefinedOrNull(target.Container);

		if (!target.IsContainerExists && !Js_Makc2_Variable_IsUndefinedOrNull(target.ParentContainer))
		{
			target.Container = target.ParentContainer + "_" + index;

			jQuery("#" + target.ParentContainer).append('<div id="' + target.Container + '" class="' + settings.Name + '"></div>');
		}

		if (js_IsShowProgressBar == true && !Js_Makc2_Variable_IsUndefinedOrNull(target.Container))
		{
			if (Js_Makc2_Variable_IsUndefinedOrNull(target.ProgressBar) && !Js_Makc2_Variable_IsUndefinedOrNull(settings.ProgressBar))
			{
				target.ProgressBar = settings.ProgressBar;
			}

			if (!Js_Makc2_Variable_IsUndefinedOrNull(target.ProgressBar))
			{
				var container = jQuery("#" + target.Container);

				container.html(target.ProgressBar + container.html());
			}
		}

		var request = target.Request;

		if (Js_Makc2_Variable_IsUndefinedOrNull(request))
		{
			request = settings.Request;
		}

		jQuery.ajax(
			{
				url: target.Url,
				type: request.Type,
				timeout: request.Timeout,
				targetType: request.DataType,
				async: request.Async,
				cache: request.Cache,
				success: function(js_Data, js_TextStatus)
				{
					var target = settings.Targets[index];

					if (target.IsGoing == true)
					{
						if (!Js_Makc2_Variable_IsUndefinedOrNull(target.Container))
						{
							var container = jQuery("#" + target.Container);

							container.html(js_Data);
						}
					}
				},
				error: function(js_Xhr, js_TextStatus, js_Exception)
				{
					var target = settings.Targets[index];					

					if (target.IsGoing == true)
					{
						target.IsError = true;
						
						if (!Js_Makc2_Variable_IsUndefinedOrNull(request) && !Js_Makc2_Variable_IsUndefinedOrNull(request.Error))
						{
							try
							{
								request.Error();
							}
							catch (e)
							{
							}
						}
						else if (!Js_Makc2_Variable_IsUndefinedOrNull(settings.Request.Error))
						{
							try
							{
								settings.Request.Error();
							}
							catch (e)
							{
							}
						}

						if (!Js_Makc2_Variable_IsUndefinedOrNull(target.Container))
						{
							var container = jQuery("#" + target.Container);

							if (!Js_Makc2_Variable_IsUndefinedOrNull(target.Error))
							{
								container.html(target.Error);
							}
							else
							{
								container.empty();
							}
						}
					}
				},
				complete: function(js_Xhr, js_TextStatus)
				{
					var target = settings.Targets[index];

					if (target.IsGoing == true)
					{
						target.IsGoing = false;

						if (!target.IsContainerExists)
						{
							target.Container = null;
						}

						if (!Js_Makc2_Variable_IsUndefinedOrNull(target.Request) && !Js_Makc2_Variable_IsUndefinedOrNull(target.Request.Complete))
						{
							try
							{
								target.Request.Complete();
							}
							catch (e)
							{
							}
						}

						if (!Js_Makc2_Variable_IsUndefinedOrNull(target.Timeout) && target.Timeout > 0 && !Js_Makc2_Variable_IsUndefinedOrNull(settings.Name))
						{
							target.TimeoutId = setTimeout(settings.Name + ".Js_GoToTarget(" + index + ", false)", target.Timeout);
						}

						if (settings.GoingCount > -1)
						{
							settings.GoingCount--;
						}

						if (settings.GoingCount == 0 && !Js_Makc2_Variable_IsUndefinedOrNull(settings.Request.Complete))
						{
							try
							{
								settings.Request.Complete();
							}
							catch (e)
							{
							}
						}
					}
				}
			}
		);
	};
}

function Js_Makc2_UI_Control_Ajax_Default_Request(js_Settings)
{
	var settings = jQuery.extend(
		{
			Error: null,
			Complete: null,
			Timeout: null,
			DataType: "html",
			Cache: true,
			Async: true,
			Type: "GET",
			Data: null
		},
		js_Settings || {}
	);
	
	this.Error = settings.Error;
	this.Complete = settings.Complete;
	this.Timeout = settings.Timeout;
	this.DataType = settings.DataType;
	this.Cache = settings.Cache;
	this.Type = settings.Type;
	this.Data = settings.Data;
}
