/** Form Processing Functions **/
function submitForm(submitUrl, submitButton, submitForm)
{
    $.ajax({
        type: 'POST',
        dataType: 'json',
        url: submitUrl,
        //data: $(submitButton).parents('form').serializeArray(),
        data: $(submitForm).serializeArray(),
        success: function(jsonData){
            removeErrorMessages();
            if (processResult(jsonData) == true) {
                removeLoadingAnimation(submitButton);
            }
        },
        beforeSend: function(){
            addLoadingAnimation(submitButton);
        }
    });
}

function processResult(data)
{
    // Check to see if the form was valid
    if (data.formResult == false) {
        var fieldLabels = new Array();
        $.each(data, function(i,item){
            addErrorMessages(i, item);
            fieldLabels.push($('[for=' + i + ']').text());
            life: 5000;
        });

        var errorFields = fieldLabels.join(', ');
        errorFields = errorFields.substring(0, (errorFields.length-2));
    }

    if (data.redirect) {
    	redirect(data.redirect.location);
    }

    // Check to see if we are chaining requests
    if (data.chain) {
        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: data.chain.url,
            data: data.chain.data,
            success: function(jsonData){
                processResult(jsonData);
            }
        });
    }

    // Check to see if we need to load any content
    if (data.load) {
        var targets = data.load.target.split(',');
        $.each(targets, function(i, item) {
            $(item).html(data.load.content);
        })
    }

    if (data.notification) {
    	$('#notificationContainer').jGrowl(data.notification.content, data.notification.options);
    }

    if (data.callback) {
       eval(data.callback);
    }

    if (data.refresh) {
        window.location.reload();
    }
    
    if (data.removeItem) {
        $('#' + data.removeItem.item_id).fadeOut('normal', function(){$(this).remove();});
    }

    if (data.addItem) {
        $('#' + data.addItem.item).fadeIn('normal', function(){  });
    }

    if (data.highlight) {
        $('#' + data.highlight.item_id).effect('pulsate', {}, 500);
    }
    
    if (data.append) {
    	$(data.append.target).append(data.append.content);
    }

    return true;
}

function removeErrorMessages()
{
   $('ul.errors').remove();
}

function addLoadingAnimation(formButton)
{
    $(formButton).attr('disabled', 'disabled');
    $(formButton).after('<img class="formLoading" src="/images/loading.gif" alt="Loading..." />')
}

function removeLoadingAnimation(formButton)
{
    $(formButton).attr('disabled', '');
    $('.formLoading').remove();
}

function addInlineLoadingAnimation(element)
{
    $(element).parent().append('...');
    $(element).parents().each(function(i){
        if ($(this).is('form')) {
            $('#' + $(this).attr('id') + ' input').each(function(i){$(this).attr('disabled', 'disabled')});
        }
    });
}

function removeInlineLoadingAnimation(element)
{
    $('.formLoading').remove();
    $(element).parents().each(function(i){
        if ($(this).is('form')) {
            $('#' + $(this).attr('id') + ' input').each(function(i){$(this).attr('disabled', '')});
        }
    });
}

function redirect(location)
{
    window.location.href = location;
}

/** Error Handling Functions **/
function showErrors()
{
   $('#errorContainer').slideDown('slow');
}

function removeErrorMessages()
{
   $('ul.error').remove();
}

function addErrorMessages(element, messages)
{
   var errorMessages = '';
   $.each(messages, function(i, item){
      errorMessages += '<li>' + item + '</li>';
   });
   $('#' + element).after('<ul class="error">' + errorMessages + '</ul>');
}