(function($) {
	/************************ ajax ext ***********************/
	$.ajaxext = function(options) {
		var success  = options.success;
		var complete = options.complete;
		var error    = options.error;
		
		$.extend(options, {
			success  : function (data) {
				if (success && (typeof success == 'function')) {										
					success(data);
				}
			},			
			complete : function () {
				options.block?$(options.block).unblock():$.unblockUI();
				if (complete && (typeof complete == 'function')) {
					complete();
				}
			},
			error    : 	function (xhr, desc, exception) {
				if (error && (typeof error == 'function')) {
					error(xhr, desc, exception);
				} else alert(xhr.responseText);
			}
		});
		
		/************************** block ***********************/
		if (options.block) {
			$(options.block).block({
				message: '<img src=\'../resources/images/public/loading.gif\' style=\'position: relative; top: 20px; margin-right: 20px;\'>'+options.message,
				css: {padding: '5px', fontSize: '12px'}
			});
		} 
		$.ajax(options);
	}
	
	/************************ ajax submit ***********************/
	$.fn.ajsubmit = function() {
		$(this).each(function() {
			$(this).bind('submit', function() {
				return false;
			});
		});
	};
	
	$.ajsubmit = function(el, options) {
		var validate = options.validate;
		var success  = options.success;
		$.extend(options, {
			url  : (($(el).attr('action') == undefined)||($(el).attr('action') == ''))?document.location.href:$(el).attr('action'),
			type : (($(el).attr('method') == undefined)||($(el).attr('method') == ''))?'post':$(el).attr('method'),
			
			dataType: 'json',
			data: $(el).serialize(),
			
			validate : function(el) {
				$('div[@id$=-error]').text('');
								
				if (validate && (typeof validate == 'function')) {
					return validate($(el));
				} else return true;
			},			
			success  : function(data) {
				if (data.failed && data.failes) {
					$.each(data.failes, function() {
						$('#'+this.name+'-error').text(this.txt);
					});					
				}
				if (data.message) {
					alert(data.message);
				}
				if (success && (typeof success == 'function')) {
					return success($(el), data);
				}
			}
		});	
		
		if (options.validate && (typeof options.validate == 'function')) {
			if (!options.validate($(el))) {
				return ;
			}
		} $.ajaxext(options);
	};	
})(jQuery);	
