/*
 * AbCore SimpleForm JQuery Plugin
 * version: 0.0.2 (03-FEB-2009)
 * @requires jQuery v1.2.2 or later
 */

/*
 * History:
 * 
 * 0.0.1	First version
 * 0.0.2	Added support to tinymce editor
 */
function SimpleForm(element, options)
{
    this.defaults = {
	successMessage : 'Form submitted!',
	errorMessage : 'An error occurred!',
	beforeFunction : function()
	{},
	successFunction : function()
	{},
	onclickResetFunction : function()
	{},
	resetObject : '.resetbutton',
	loadingObject : '.loading',
	clearForm : false,
	resetForm : false,
	isUpload : false,
	noAjax : false
    };
    var settings = $.extend( {}, this.defaults, options);
    var obj = $(element);
    $(settings.loadingObject).hide();
    $(settings.resetObject).click(settings.onclickResetFunction);
    this.start = function()
    {
	if (settings.noAjax)
	    return true;
	try {
	    if (tinyMCE != null) {
		$(obj).bind('form-pre-serialize', function(e)
		{
		    tinyMCE.triggerSave();
		});
	    }
	} catch (ignore) {
	    //ignore
	}
	obj.ajaxForm( {
	    beforeSubmit : function()
	    {
		$(settings.loadingObject).show();
		settings.beforeFunction();
	    },
	    success : function(json)
	    {
		$(settings.loadingObject).hide();
		if (json.error == 0) {
		    alert(settings.successMessage);
		    settings.successFunction();
		} else if (json.error == 1) {
		    try {
			revertChildsStatus(obj);
			var messages = json.messages;
			for ( var x in messages) {
			    var frm = messages[x];
			    parseErrors(frm, x);
			    /*
			     * for ( var y in frm) { var msgs = frm[y]; var id =
			     * x + "-" + y; if (isset(msgs[0]))
			     * alert("Interno"); else alert("Esterno"); var elem =
			     * $('#' + id).parent();
			     * elem.children("ul.errors").remove();
			     * elem.children("input, select,
			     * textarea").addClass('error'); var html = "<ul class=\"errors\">";
			     * for ( var i = 0; i < msgs.length; i++) { html += "<li>" +
			     * msgs[i] + "</li>"; } html += "</ul>";
			     * elem.append(html); }
			     */
			}
			$('html, body').animate( {
			    scrollTop : obj.offset().top
			}, 1000, 'linear');
		    } catch (e) {}
		} else {
		    alert(settings.errorMessage + "\n\n" + json.messages);
		}
	    },
	    dataType : 'json',
	    clearForm : settings.clearForm,
	    resetForm : settings.resetForm,
	    iframe : settings.isUpload
	});
    };
}
function parseErrors(objects, startObject)
{
    for ( var y in objects) {
	var msgs = objects[y];
	var id = startObject + "-" + y;
	if (isset(msgs[0])) {
	    var cut = false;
	    var t = 0;
	    var elem = null;
	    while (elem == null || elem.length == 0) {
		if (t == 0) {
		    elem = $('#' + id).parent();
		} else if (t == 1) {
		    elem = $('#' + id + '-input').parent();
		} else if (t == 2) {
		    elem = $(':input[id^=' + id + ']').parent().parent();
		} else if (t == 3) {
		    elem = $(':file[name=' + y + ']').parent();
		} else {
		    cut = true;
		    break;
		}
		t++;
	    }
	    if (cut)
		continue;
	    elem.children("ul.errors").remove();
	    elem.children("input, select, textarea").addClass('error');
	    var html = "<ul class=\"errors\">";
	    for ( var i = 0; i < msgs.length; i++) {
		html += "<li>" + msgs[i] + "</li>";
	    }
	    html += "</ul>";
	    elem.append(html);
	} else {
	    parseErrors(msgs, id);
	}
    }
}
function revertChildsStatus(obj)
{
    var childs = $(obj).children();
    for ( var i = 0; i < childs.length; i++) {
	var child = $(childs[i]);
	if (child.hasClass('errors')) {
	    child.remove();
	    continue;
	}
	if (child.hasClass('error'))
	    child.removeClass('error');
	revertChildsStatus(child);
    }
}
function isset()
{
    var a = arguments;
    var l = a.length;
    var i = 0;
    if (l == 0) {
	throw new Error('Empty isset');
    }
    while (i != l) {
	if (typeof (a[i]) == 'undefined' || a[i] === null) {
	    return false;
	} else {
	    i++;
	}
    }
    return true;
}