/*
 * AbCore SimpleForm JQuery Plugin
 * version: 0.0.3 (25-SEP-2009)
 * @requires jQuery v1.3.2 or later
 */

/*
 * History:
 * 
 * 0.0.1	First version
 * 0.0.2	Added support to tinymce editor
 * 0.0.3	Added support to DL-tags.
 */
function SimpleForm(element, options)
{
    this.defaults = {
		successMessage : 'Form submitted!',
		errorMessage : 'An error occurred!',
		beforeFunction : function()
		{},
		beforeMessagesFunction : function ()
		{},
		successFunction : function(isError)
		{},
		onclickResetFunction : function()
		{},
		resetObject : '.resetbutton',
		loadingObject : '.loading',
		blockElement : null,
		growlTimeout : 2000,
		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);
    $.multiLanguageOrganizeTabs(false);
    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()
	    {
			if (settings.blockElement) {
				$(settings.blockElement).block({ 
					message: $(settings.loadingObject),
					forceIframe: true,
			        overlayCSS: {
			            'z-index': '10000'
			        },
					css: { 
				        'z-index': '10001',
						padding: '15px', 
						'-webkit-border-radius': '10px', 
						'-moz-border-radius': '10px', 
						opacity: .5 
						} 
				});
			} else {
				$.blockUI({ 
					message: $(settings.loadingObject),
					forceIframe: true,
					css: { 
				        'z-index': '10000',
						padding: '15px', 
						'-webkit-border-radius': '10px', 
						'-moz-border-radius': '10px', 
						opacity: .5 
						} 
				});
			}
			settings.beforeFunction();
	    },
	    success : function(json)
	    {
	    	if (settings.blockElement) {
	    		$(settings.blockElement).unblock();
	    	} else {
	    		$.unblockUI();
	    	}
	    	settings.beforeMessagesFunction((json.error != 0));
			//$(settings.loadingObject).hide();
			if (json.error == 0) {
				var called = 0;
			    //alert(settings.successMessage);
			    $.jGrowl(settings.successMessage, {
			    	theme: 'OKMessage',
			    	life: settings.growlTimeout, 
			    	close:  function() {
			    		if (called < 1)
			    			settings.successFunction();
			    		called++;
			    	}
			    });
			    //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);
				}
				$('html, body').animate( {
				    scrollTop : obj.offset().top
				}, 1000, 'linear');
			    } catch (e) {}
			} else {
				$.jGrowl(json.messages, { 
					theme: 'ErrorMessage',
					header: settings.errorMessage, 
					sticky: true 
				});
			}
	    },
	    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');
	    elem.parent().children('dt').children('label').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;
}
