(function($) {
	$.netteAjax = function () {
		var args = jQuery.makeArray(arguments);
		var url = args.shift();
		var type = "get";
		var params = null;
		var callback = null;

		// argumenty funkce
		for (var i = 0; i < args.length; i++) {
			// nastavit callback
			if (jQuery.isFunction(args[i])) {
				callback = args[i];
				continue;
			}
			// nastavit typ
			if (typeof args[i] == "string") {
				if (args[i].toLowerCase() == "post") {
					type = "post";
				}
				continue;
			}
			// nastavit parametry
			if (args[i] instanceof Object) {
				params = args[i];
			}
		}

		$('body').prepend('<div id="ajax-spinner">Načítavanie...</div>');
		return jQuery.ajax({
			type: type,
			url: url,
			data: params,
			dataType: 'json',
			cache: false
		});
	};


	$.fn.netteAjaxSubmit = function (callback) {
		var form;
		var sendValues = {};

		// odesláno na tlačítku
		if (this.is(":submit")) {
			form = this.parents("form");
			sendValues[this.attr("name")] = this.val() || "";

		// odesláno na formuláři
		} else if (this.is("form")) {
			form = this;

		// neplatný element, nic nedělat
		} else {
			return null;
		}

		// validace
		if (form.get(0).onsubmit && !form.get(0).onsubmit()) return;

		var values = form.serializeArray();

		for (var i = 0; i < values.length; i++) {
			//var newValue = {};
			var name = values[i].name;

			// multi
			if (name in sendValues) {
				var val = sendValues[name];

				if (!(val instanceof Array)) {
					val = [val];
				}

				val.push(values[i].value);
				sendValues[name] = val;
			} else {
				sendValues[name] = values[i].value;
			}
		}

		// odeslat ajaxový požadavek
		return jQuery.netteAjax(
			form.attr("action"),
			sendValues,
			callback || null,
			form.attr("method") || "get"
		);
	};


	$().ajaxComplete(function() {
		$('#ajax-spinner').remove();
	}).ajaxError(function(event, request, settings) {
		alert(request.responseText);
		alert(request['statusText']+'\n\nRequestet URL: '+settings.url+'\nMethod: '+settings.type+'\nData type: '+settings.dataType+'\nContent type: '+settings.contentType);
	}).ajaxSuccess(function(event, request, settings) {
		//alert(request.responseText);
		if (settings.dataType == 'json') {
			eval('var data='+request.responseText);
			// redirect
			if (data.redirect)
				if (data.newWindow) window.open(data.redirect, 'ajaxNewWindow');
				else window.location.href = data.redirect;
			// snipety
			if (data.snippets) {
				for (var i in data.snippets) {
					if ($.browser.msie) {
						$('#'+i).html(data.snippets[i]);
					} else {
						$('#'+i).fadeTo(200, 0.3, function() {
							$(this).html(data.snippets[$(this).attr('id')]).fadeTo(200, 1);
						});
					}
				}
			}
			// prikazy na vykonanie
			if (data.eval) {
				for (var i in data.eval) {
					eval(data.eval[i]);
				}
			}
		}
	});


	$('a.ajax').live('click', function (event) {
		event.preventDefault();
		$.netteAjax(this.href);
	});


	var noajax = false;
	$('form.ajaxform input:submit, form.datagrid input:submit').livequery('click', function (event) {
		if (noajax) {
			noajax = false;
			return true;
		}
		event.preventDefault();
		if ($(this).is('.noajax')) {
			noajax = true;
			$(this).trigger('click');
			return true;
		}
		$(this).netteAjaxSubmit();
	});


	$('form.ajaxform, form.datagrid').livequery('submit', function(event) {
		event.preventDefault();
		$(this).netteAjaxSubmit();
	});
})(jQuery);
