﻿Type.registerNamespace('Linksoft');
Type.registerNamespace('Linksoft.Web');

Linksoft.Web.SuccessHandlers = new Array();
Linksoft.Web.FailureHandlers = new Array();
Linksoft.Web.SuccessHandlersPerItem = new Array();

Linksoft.Web.OnAjax = function (successHandler, failHandler) {
	if ($.isFunction(successHandler)) {
		Linksoft.Web.SuccessHandlers.push(successHandler);
	}
	if ($.isFunction(failHandler)) {
		Linksoft.Web.FailureHandlers.push(failHandler);
	}
}
Linksoft.Web.OnAjaxFailure = function (failHandler) {
	if ($.isFunction(failHandler)) {
		Linksoft.Web.FailureHandlers.push(failHandler);
	}
}

Linksoft.Web.OnAjaxPerItem = function (successHandler) {
	if ($.isFunction(successHandler)) {
		Linksoft.Web.SuccessHandlersPerItem.push(successHandler);
	}
}

Linksoft.Web.SaveChange = function (fun, box) {
	$(box).addClass("save_pending");
	if (box.type == 'checkbox') {
		Linksoft.Web.ActionAjax(fun(box.checked), function () { $(box).removeClass("save_pending") });
	} else {
		Linksoft.Web.ActionAjax(fun(box.value), function () { $(box).removeClass("save_pending") });
	}
}

Linksoft.Web.ActionAjax = function (url_and_data, successHandler, failHandler, renamings, logToHistory) {
	return Linksoft.Web.DoAjax(url_and_data.url, url_and_data.params, successHandler, failHandler, renamings, logToHistory);
}

Linksoft.Web.AjaxInProgress = false;
if (window.History.enabled) {
	History.Adapter.bind(window, 'statechange', function (event) { // Note: We are using statechange instead of popstate
		var State = window.History.getState(false, false); // Note: We are using History.getState() instead of event.state
		if (State != null && !Linksoft.Web.AjaxInProgress) {
			if (State.data.url != null) {
				Linksoft.Web.DoAjax(State.data);
			} else if (!window.History.emulated.pushState || window.location.href != State.url) {
				Linksoft.Web.DoAjax(State.url.replace(/\/hledani\/strana/, '/hledani'));
			}
			//			}
		}
		Linksoft.Web.AjaxInProgress = false;
	});
}

Linksoft.Web.HandleMvcAjax = function (content) { Linksoft.Web.HandleReplacements()(content.get_response().get_object()) }

Linksoft.Web.HandleReplacements = function (settings, logToHistory) {
	if (typeof (settings) != "object") {
		settings = { successHandler: null, failHandler: null, renamings: null };
	};
	return function (a, b) {
		if (a.IsSuccess) {
			for (var key in a.Replacements) {
				if (key == 'javascript_to_execute') continue;
				var target = key.replace(/^\+/, '');
				if (settings.renamings) {
					for (var i = 0; i < settings.renamings.length; i++) {
						var renaming = settings.renamings[i];
						if (renaming.from == target) {
							target = renaming.to;
							break;
						}
					}
				}
				if (!target.startsWith('.') && !target.startsWith('#')) {
					target = '#' + target;
				}

				var item = $(target);

				/*
				ADDED: 2011-08-01
				AUTHOR: MATOUS HAVLENA (matous@havlena.net)
				DESC: REPLACE WHOLE PAGE WHEN DOCTYPE IS IN THE START OF REPLACING DATA
				*/
				if (a.Replacements[key].substring(0, 50).indexOf("DOCTYPE html PUBLIC") >= 0) item = $("html");
				
				if (key.startsWith('+')) {
					item.html(item.html() + a.Replacements[key]);
				} else {
					item.html(a.Replacements[key]);
				}
				for (var id = 0; id < Linksoft.Web.SuccessHandlersPerItem.length; id++) { Linksoft.Web.SuccessHandlersPerItem[id](item); }
			}
			if (a.Replacements["javascript_to_execute"] != null) {
				eval(a.Replacements["javascript_to_execute"]);
			}
			if ($.isFunction(settings.successHandler)) settings.successHandler(a);
			for (var id = 0; id < Linksoft.Web.SuccessHandlers.length; id++) { Linksoft.Web.SuccessHandlers[id](); }

			if (logToHistory && window.History.enabled) {

				var url = $.param.querystring(settings.url, settings.data);
				var state = { url: ((logToHistory == true || logToHistory == 1) ? settings.url : logToHistory), data: settings.data, successHandler: settings.successHandler, failHandler: settings.failHandler, renamings: settings.renamings, full_url: url };
				Linksoft.Web.AjaxInProgress = true;
				window.History.pushState(state, document.title, url);
			}
		} else {
			if ($.isFunction(settings.failHandler)) settings.failHandler();
			if (a.Replacements["error_message"] != null) {
				Linksoft.Web.ShowModalDialog(a.Replacements["error_message"]);
			}
			for (var id = 0; id < Linksoft.Web.FailureHandlers.length; id++) { Linksoft.Web.FailureHandlers[id](); }
		}
		$('#jquery-blanket').fadeOut(50);
	};
};

Linksoft.Web.DoAjax = function (settings, data, successHandler, failHandler, renamings, logToHistory) {
	if (typeof (settings) != "object") {
		settings = { url: settings, data: data, successHandler: successHandler, failHandler: failHandler, renamings: renamings };
	};
	var complete_settings = $.extend(
	{
		type: 'POST',
		dataType: 'json',
		cache: false,
		success: Linksoft.Web.HandleReplacements(settings, logToHistory),
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			Linksoft.Web.ShowModalDialog(XMLHttpRequest.responseText); // TODO: we should show a modal dialog or something instead
			$('#jquery-blanket').fadeOut(50);
			if ($.isFunction(settings.failHandler)) settings.failHandler();
			for (var id = 0; id < Linksoft.Web.FailureHandlers.length; id++) { Linksoft.Web.FailureHandlers[id](); }
		}
	}, settings);
	$('#jquery-blanket').fadeIn(50);
	$.ajax(complete_settings);
	return false;
}

Linksoft.Web.DoSimpleAjax = function (settings, data, successHandler, failHandler, selector) {
	if (typeof (settings) != "object") {
		settings = { url: settings, data: data, successHandler: successHandler, failHandler: failHandler };
	};
	settings = $.extend(
	{
		type: 'POST',
		dataType: 'html',
		cache: false,
		success: function (a, b, c) {
			var ctype = c.getResponseHeader('Content-type');
			if (ctype.match(/^application\/json/)) {
				Linksoft.Web.HandleReplacements(settings, false)(jQuery.parseJSON(a), b, c);
			}
			var item = $('#' + selector);
			item.html(a);
			for (var id = 0; id < Linksoft.Web.SuccessHandlersPerItem.length; id++) { Linksoft.Web.SuccessHandlersPerItem[id](item); }
			for (var id = 0; id < Linksoft.Web.SuccessHandlers.length; id++) { Linksoft.Web.SuccessHandlers[id](); }

			if ($.isFunction(settings.successHandler)) settings.successHandler(a);
			$('#jquery-blanket').fadeOut(50);
		},
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			alert(XMLHttpRequest.responseText);
			$('#jquery-blanket').fadeOut(50);
			if ($.isFunction(settings.failHandler)) settings.failHandler();
			for (var id = 0; id < Linksoft.Web.FailureHandlers.length; id++) { Linksoft.Web.FailureHandlers[id](); }
		}
	}, settings);
	$('#jquery-blanket').fadeIn(50);
	$.ajax(settings);
	return false;
}

Linksoft.Web.ActionUrls = {};

Linksoft.Web.ShowTemporaryDialog_TimeoutId = null;
Linksoft.Web.ShowTemporaryDialog = function (message, delay) {
	if (!delay) delay = 10000; // 10 seconds by default
	if (message != null && typeof (message) == "string") {
		$('#modalDialog .popupInner:first').html("<div class='customMessage'>" + message + "</div>");
	}

	$('#modalDialog').addClass("ui-tooltip-shadow");
	$('#modalDialog').center().fadeIn(300);
	Linksoft.Web.CancelTemporaryDialogTimeout();
	Linksoft.Web.ShowTemporaryDialog_TimeoutId = setTimeout(function () {
		$("#modalDialog").fadeOut(300, function () {
			$('#modalDialog').removeClass("ui-tooltip-shadow");
		});
		Linksoft.Web.ShowTemporaryDialog_TimeoutId = null;
	}, delay);
}
Linksoft.Web.CancelTemporaryDialogTimeout = function () {
	if (Linksoft.Web.ShowTemporaryDialog_TimeoutId != null) {
		clearTimeout(Linksoft.Web.ShowTemporaryDialog_TimeoutId);
		Linksoft.Web.ShowTemporaryDialog_TimeoutId = null;
	}
}

Linksoft.Web.ShowModalDialog = function (message) {
	if (message != null && typeof (message) == "string") {
		$('#modalDialog .popupInner:first').html("<div class='customMessage'>" + message + "</div>");
	}

	$('#qtip-blanket').fadeIn(300);
	$('#modalDialog').removeClass("ui-tooltip-shadow");
	Linksoft.Web.CancelTemporaryDialogTimeout();
	$('#modalDialog').center().fadeIn(300);
}

Linksoft.Web.HideModalDialog = function () {
	$("#modalDialog").fadeOut(300);
	$('#qtip-blanket').fadeOut(300);
	Linksoft.Web.CancelTemporaryDialogTimeout();
}

/*
Pokud chcete omezit pocet zobrazenych polozek v nejakem seznamu pridejte do tagu ktery ten seznam uzavira
	class="show_more" show_more_limit="xx"
a prebytecne polozky budou skryty a nahrazeny odkazem ktery je znovu ukaze. Pokud potrebujete ten odkaz nastylovat tak ho dejte dovnitr toho containeru
a pridejte mu class="show_more_link". On click handler je pridany automaticky.

	<ul class="show_more" show_more_limit="5">
	  <li>...</li>
	  <li>...</li>
	  <li>...</li>
	  ...
	</ul>

	<div class="show_more" show_more_limit="5">
	  <div>...</div>
	  <div>...</div>
	  <div>...</div>
	  ...
	  <div class="show_more_link some other classes">... show more</div>
	</div>
*/

Linksoft.Web.PrepareShowMore = function (context) {
	var containers = context == null ? $('.show_more') : $('.show_more', context);
	if (containers.length == 0) return;
	for (var id = 0; id < containers.length; id++) {
		var container = containers[id];
		var count = $(container).attr("show_more_limit") || 6;
		var link = $('.show_more_link', container);
		var children = $(container).children(':not(.show_more_link)');
		if (children.length > count) {
			for (var childId = 0; childId < children.length; childId++) {
				if (childId > count - 1 && children[childId] != null) {
					$(children[childId]).hide();
				}
			}
			if (link.length == 0) {
				$(container).append('<li class="show_more_link" onclick="Linksoft.Web.ShowMore(this)"><span class="filtr"><i>... ukaž více</i></span>&nbsp;<img alt="v" src="/Content/Layout/o/sipka-dolu-seda.png"/></li>');
			}
		} else {
			link.hide();
			link.click(function () { Linksoft.Web.ShowMore(link) });
		}
	}
}

Linksoft.Web.ShowMore = function (context) {
	var container = $(context).parents('.show_more');
	if (container.length == 0) {
		alert("Linksoft.Form.ShowMore(this) called from outside a tag with class show_more or without the 'this' parameter.");
		return;
	}
	container = $(container[0]);
	container.children(':not(.show_more_link)').show();
	container.children('.show_more_link').hide();
}

Linksoft.Web.OnAjaxPerItem(Linksoft.Web.PrepareShowMore);
$(function () { Linksoft.Web.PrepareShowMore() });

$(document).keydown(function (e) {
	if (e.keyCode == 27) {
		var dialog = $('#modalDialog');
		if (dialog.is(':visible')) dialog.fadeOut(50);

		var blanket = $('#qtip-blanket');
		if (blanket.is(':visible')) blanket.fadeOut(50);

		blanket = $('#jquery-blanket');
		if (blanket.is(':visible')) blanket.fadeOut(50);
	}
});

$(function () {
	if (window.History.emulated.pushState) { // handles back button from another page back an ajaxed page with history
		var id = window.History.extractId(window.location.href)
		if (id && !window.History.getStateById(id)) {
			var url = window.location.href
						.replace(/&_suid=([0-9]+)$/, '')
						.replace(/(http.*?\/\/.*?)\/.*#\//, '$1/')
						.replace(/[^\/]*\?.*#/, '');
			// location.href = url;
			url = url.replace(/\/hledani\/strana/, '/hledani');
			Linksoft.Web.DoAjax(url);
		}
	}
});


{
	var target_blank = function () {
		$('.target_blank a:not([target])').attr('target','_blank');
	};
	target_blank();
	Linksoft.Web.OnAjax(target_blank);
}
