;(function($) {
	$.fn.silent_submit = function(_o) {

		var _form = $(this);

		var _options = {
			url: '', 
			method: 'POST',
			data: {},
			processingClass: '_processing_',
			getValue: {},
			submitToNowhere: false
		};

		var _o = $.extend(_options, _o);

		if (_o.submitToNowhere) {

			var _fr_id = 'form-silent-submit-nowhere-place',
			_fr_name = 'form_silent_submit_nowhere_place',
			_fr = $('<iframe style="width: 0; height: 0; display: none;" name="' + _fr_name + '" id="' + _fr_id + '"></iframe>');

			_form.attr('target', _fr_name).attr('action', '/');
			_fr.insertAfter(_form);
		}
		_form.submit(function(_ev) {
			if (!_o.submitToNowhere) {
				_ev.preventDefault();
				_ev.stopPropagation();
			}
			if (_form.hasClass(_o.processingClass))
			return false;
			_form.addClass(_o.processingClass);
			var _inputs = $(this).find('input, select, textarea');
			var _data = _options.data;

			$.each(_inputs, function(_i, _val) {
				_val = $(_val);
				if (_val.filter('input:checkbox').length && !_val.filter(':checked').length) {

					return;
				}
				if (typeof(_o.getValue[_val.attr('name')]) == 'function')
				_data[_val.attr('name')] = _o.getValue[_val.attr('name')].call(_val);
				else
				_data[_val.attr('name')] = _val.val();
			});

			var _container = (_o.container === undefined) ? _form.parent() : _o.container;
			_container = (_container instanceof jQuery) ? _container : $(_container);

			var _sleepContainer = (_o.sleepContainer === undefined) ? _container : _o.sleepContainer;
			_sleepContainer = (_sleepContainer instanceof jQuery) ? _sleepContainer : $(_sleepContainer);
			_sleepContainer.sleep({'shroud_css':{'z-index':200}});

			$.ajax({
				type: _options.method,
				url: _options.url,
				data: _data,
				complete: function(){ _sleepContainer.wakeup(); _form.removeClass(_o.processingClass) },
				success: function(_data) {
					_container.html(_data);
					_container.wakeup();
				}
			});
		});

		_form.keypress(function(_ev) { if (_ev.keyCode == 13) { $(this).submit() } });

		return _form;
	};
})(jQuery);

