;(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);
			
			_container.sleep({'shroud_css':{'z-index':200}});
			
			$.ajax({
				type: _options.method,
				url: _options.url,
				data: _data,
				complete: function(){ _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);
