(function ($) {

$.fn.upload = function (options) {
	var contents, elements, element, iframe, action;

	elements = $(this);
	options = $.extend({}, {
		iframeID : 'uploader',
		label : {
			button : 'nahrát',
			loading : 'nahrávám...'
		},
		start : function () {},
		complete : function (response, input) {}
	}, options);

	if (!$('#' + options.iframeID).length) {
		var el;
		try {
			el = $(document.createElement('<iframe name="' + options.iframeID + '">'));
		} catch (ex) {
			el = $(document.createElement('iframe'));
		}

		el.attr('id', options.iframeID);
		el.attr('name', options.iframeID);
		el.attr('style', 'display: none');
		$('body').append(el);
	}

	return elements.each(function () {
		element = $(this);

		action = element.attr('action');

		element.find('input[type=file][data-uploader]').each(function () {
			(function (file, element) {
				var uploader = file.parents('.uploader');
				file.siblings('input[type=submit]').remove();
				$('<input>', {
					type  : 'submit',
					value : options.label.button,
					click : function (e) {
						var callback = arguments.callee;
						var button = $(this);

						e.preventDefault();

						element.attr('action', file.data('uploader'));
						element.attr('target', options.iframeID);

						element.one('submit.upload', function (e) {
							e.stopImmediatePropagation();

							button.attr({ value : options.label.loading, disabled : true });
							options.start.apply(this);

							iframe = $('#' + options.iframeID);
							iframe.one('load', function () {
								button.attr({ value : options.label.button, disabled : false });
								contents = iframe.contents().find('body');
								options.complete.apply(this, [contents.html(), file]);
								setTimeout(function () { contents.html(''); }, 1);

								uploader.html(uploader.html());
								uploader.find('input[type=submit]').click(callback)
									.val(options.label.button); // IE9
							});

						}).trigger('submit.upload');

						element.attr('action', action);
						element.removeAttr('target');
					}
				}).insertAfter(file);
			})($(this), element);
		});
	});
};

})(jQuery);

