/**
 * AJAX form plugin for jQuery
 *
 * @copyright  Copyright (c) 2009 Jan Marek
 * @license    MIT
 * @link       http://nettephp.com/cs/extras/ajax-form
 * @version    0.1
 */

jQuery.fn.extend({
	ajaxSubmit: function (callback,e) {
		var form;
		var sendValues = {};

		// submit button
		if (this.is(":submit")) {
			form = this.parents("form");
			sendValues[this.attr("name")] = this.val() || "";

		// form
		} else if (this.is("form")) {
			form = this;

		// invalid element, do nothing
		} else {
			return null;
		}

		// upload souboru / vypnout ajax
		var files = '';
		$(form).find(':file').each(function(){
			if ($(this).val() != '') files += $(this).val();
		});
		if (files != '') return null;

		e.preventDefault();

		// validation
		if (form.get(0).onsubmit && !form.get(0).onsubmit()) {
			e.stopImmediatePropagation();
			return null;
		}

		if (form.data("ajaxSubmitCalled")==true) return null;

		form.data("ajaxSubmitCalled",true);

		// Tím, že zaregistruji ajaxové odeslání až teď, tak se provede jako poslední. (až po všem)
		form.one("submit", function() {
			// get values
			var values = form.serializeArray();

			for (var i = 0; i < values.length; i++) {
				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 {
					if (name == 'text' && editor[form[0].text.id] != null) {
						values[i].value = editor[form[0].text.id].getValue();
					}
					sendValues[name] = values[i].value;
				}
			}

			// send ajax request
			var ajaxOptions = {
				url: form.attr("action"),
				data: sendValues,
				type: form.attr("method") || "get"
			};

			ajaxOptions.complete = function(){
				form.data("ajaxSubmitCalled",false);
			}

			if (callback) {
				ajaxOptions.success = callback;
			}
			return jQuery.ajax(ajaxOptions);
		})

		e.stopImmediatePropagation();
		form.submit();
		return null;
	},

	__submit: function(e) {
		$(this).ajaxSubmit(null,e);
	},

	enableAjaxSubmit: function() {
		this.bind("submit",this.__submit);
		$(":submit",this).bind("click",this.__submit);
	},
	disableAjaxSubmit: function() {
		this.unbind("submit",this.__submit);
		$(":submit",this).unbind("click",this.__submit);
	}
});

// po načtení stránky

$(function () {
	// odeslání na formulářích
	$("form.ajax").livequery(function(){
		$(this).enableAjaxSubmit();
	});
});
