(function($) {

$.fn.myajaxform = $.myajaxform = function(method) {

	var methods = {
		init: function(settings){
			var config = defaults;
			if (settings) $.extend(config, settings);
			return this.each(function(){
				var dom = $(this);
				if (dom.data('myajaxform')) return;
				dom.data('myajaxform', true);
				var obj = new myajaxform(dom,config);
				obj.init();
			});
		},
		dialog: function(settings){
			var config = defaults;
			if (settings) $.extend(config, settings);
			return this.each(function(){
				var dom = $(this);
				var obj = new myajaxform(dom,config);
				obj.dialog();
			});
		},
		expand: function(settings){
			var config = defaults;
			if (settings) $.extend(config, settings);
			return this.each(function(){
				var dom = $(this);
				var obj = new myajaxform(dom,config);
				obj.expand();
			});
		}
	}

	var defaults = {
		action_start:	null, //
		action_success:	null, //
		action_error:	null, //
		success: null,
		splash_log: false, 
		loading_class:	'ajax-loading',
		loading_text:	'Cargando',
		datatype:		'json',
		last:			'',
		state_error_class: 'ui-state-error',
		state_highlight_class: 'ui-state-highlight',
		states_classes: 'ui-state-error ui-state-highlight',
		width: 'auto',
		height: 'auto',
		position: 'auto',
		buttons: {
					"Aceptar": function() {
						$(this).find('form').submit();
					},
					Cancelar: function() {
						$(this).dialog("close");
					}
		}
	}

    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.myajaxform' );
    }
};

function myajaxform(dom,config) {
	var that = this;

	this.init = function() {
		var log = (config.log) ? (config.log) : dom.parent().children(".log");
		var textcallback = (config.textcallback) ? (config.textcallback) : dom.find(".textcallback");
		var action = (config.action) ? (config.action) : dom.attr("action");
		if(config.submit_button) dom.append('<input class="submit" type="submit" value="Enviar" />').find('input.submit').button({ icons: { primary: "ui-icon-grip-dotted-vertical" }});
		dom.find(".buttonset").buttonset();
		dom.submit(function() {
			log.empty().removeClass(config.states_classes).addClass(config.loading_class);
			if(typeof config.action_start == 'function') (config.action_start)();	
			$.ajax({
				cache: false,
				type: "POST",
				url: action,
				dataType: config.datatype,
				data: dom.serialize(),
				success: function(data){
					if((config.datatype) == 'json')
					{
						if(textcallback) textcallback.html(data.text).removeClass(config.loading_class);
						log.html(data.log).removeClass(config.loading_class).css('padding','.7em').css('margin','10px 0').addClass('ui-widget ui-corner-all');
						if (data.code != 0)
						{
							if(textcallback) textcallback.addClass(config.state_error_class);
							log.addClass(config.state_error_class).prepend('<span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>');
							if(typeof config.action_error== 'function') (config.action_error)(data);
						}
						else
						{
							if(textcallback) textcallback.addClass(config.state_highlight_class);
							log.addClass(config.state_highlight_class).prepend('<span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>');
							if(typeof config.action_success == 'function') (config.action_success)(data);
						}
					}
					else
					{
						if(textcallback) textcallback.html(data).removeClass(config.loading_class);
						log.html(data).removeClass(config.loading_class);
					}
					if(typeof config.success == 'function') (config.success)(data);
					
				}
			});
			return false;
		});
	}

	this.dialog = function() {
		if(dom.is('a')) var href = dom.attr("href");
		if(dom.is('button'||'input')) var href = dom.attr("value");
		var title = dom.attr("title");
		var action_success = config.action_success;
		dom.click(function() {
			var uid = uniqid();
			$('body').append('<div id="temp_dialog'+uid+'"></div>');	
			$('#temp_dialog'+uid+'').load(href,config.data,function() {
				$(this).dialog({
					bgiframe: true,
					width: config.width,
					height: config.height,
					position: config.position,
					modal: true,
					resizable: false,
					title: title,
					buttons: config.buttons,
					close: function() {
							$(this).remove();
					}
				});
				// $(this).find('form').prepend('<div id="temp_dialog_text'+uid+'" class="textcallback"></div>')
				$(this).prepend('<div id="temp_dialog_text'+uid+'" class="log"></div>');
				
				$(this).find('form').myajaxform(config);

			});

			return false;
		});
			
	}
	
	
	this.expand = function() {
		if(dom.is('a')) var href = dom.attr("href");
		if(dom.is('button'||'input')) var href = dom.attr("value");
		var title = dom.attr("title");
		var action_success = config.action_success;
		dom.click(function() {
			var uid = uniqid();
			config.where.empty().append('<div id="temp_expand'+uid+'" class="expand_form"></div>');
			$('#temp_expand'+uid+'').hide().html(config.loading_text).load(href,config.data,function() {
				var temp_container = $(this);
				$(this).prepend('<button id="temp_expand_close_button'+uid+'" class="close_button">Cerrar</button>');
				$(this).prepend('<div id="temp_expand_text'+uid+'" class="log"></div>');
				$(this).find('button.close_button').button({ icons: { primary: "ui-icon-close" }, text: false }).click(function(){
					temp_container.slideUp(function(){
						config.where.empty();
					});
				});
				$.extend(config, {submit_button: true});
				$(this).find('form').myajaxform(config);
				temp_container.slideDown();
			});
			return false;
		});
			
	}
	

}
	
	
	
function uniqid() {
	var newDate = new Date;
	return newDate.getTime();
}

function getHTML(url,data) {
	var result = "";
	$.ajax({
		url: url,
		dataType: 'html',
		async: false,
		data: data,
		cache: false,
		success: function(datareturned) {
			result = datareturned;
		}
	});
	return result;
}


function getJsonObject(url,data) {
	var result = new Object;
	$.ajax({
		url: url,
		dataType: 'json',
		async: false,
		data: data,
		cache: false,
		success: function(datareturned) {
			result = datareturned;
		}
	});
	return result;
}


})(jQuery);

