(function($) {
	$.fn.completoForm = function(options) {
		// default options
		options = $.extend({
			"code": "",
			"timeout": "10",
			"delay": "2",
			"onSuccess": function() {},
			"onValidation": function(errors) {},
			"onError": function(message) {},
			"onSend": function() {},
			"onComplete": function() {}
		}, options);
		// timeout control
		window.timeoutCompletoForm = {};
		// submit form handler
		$(this).submit(function() {
			options.onSend();
			// delay
			var form = $(this);
			setTimeout(function() {
				var callbackFunctionName = 'getCompletoFormData_' + (new Date() * 1);
				var scriptElement = document.createElement('script');
				var headSection = document.getElementsByTagName('head')[0];
				// define response holder
				window.lastCompletoFormData = false;
				// define JSONP handler
				window[callbackFunctionName] = function(response, name) {
					clearTimeout(window.timeoutCompletoForm[name]);
					if ('success' == response.status) {
						options.onSuccess();
					}
					else if ('validation' == response.status) {
						options.onValidation(response.errors);
					}
					else {
						options.onError('Unknown response status');
					}
					options.onComplete();
				};
				// run script
				scriptElement.type = 'text/javascript';
				scriptElement.src = 'http://form.completo.ru/process/' + options.code + '/?call=' + callbackFunctionName + '&' + form.serialize();
				headSection.insertBefore(scriptElement, headSection.firstChild);
				window.timeoutCompletoForm[callbackFunctionName] = setTimeout(function() {
					// remove callback function
					delete window[callbackFunctionName];
					// error callback
					options.onError('Timeout error');
					options.onComplete();
				}, options.timeout * 1000);
			}, options.delay * 1000);
			return false;
		});
		return $(this);
	};
})(jQuery);
