var SA_AJAX = {
   init: function() {
      SA_AJAX.form = YAHOO.util.Dom.get('SA_AJAX_form');
      // This will be used to show the results of a form submission.
      SA_AJAX.results_div = YAHOO.util.Dom.get('SA_AJAX_results');
      
      // This is so we can fade it in later.
      YAHOO.util.Dom.setStyle(SA_AJAX.results_div, 'opacity', 0);
      
      // Attach submit_func to the forms submit action.
      YAHOO.util.Event.addListener(SA_AJAX.form, 'submit', SA_AJAX.submit_func);
   },
   
    submit_func: function(e) {
        // Disable the regular submit process for the form.
        YAHOO.util.Event.preventDefault(e);
     
        // Remove error_msg class from the results div.
        YAHOO.util.Dom.removeClass(SA_AJAX.results_div, 'error_heading');

        // Remove divs that are displaying error messages.
        var form_fields = YAHOO.util.Dom.getElementsByClassName('form_err_message','span',SA_AJAX.form);
        for(var i=0; i<form_fields.length; i++) {
            form_fields[i].parentNode.removeChild(form_fields[i]);
        }

        // Remove error_field class from any fields that have it.
        var form_fields = YAHOO.util.Dom.getElementsByClassName('form_line_wrap_err','div',SA_AJAX.form);
        for(var i=0; i<form_fields.length; i++) {
            YAHOO.util.Dom.removeClass(form_fields[i], 'form_line_wrap_err');
        }
        YAHOO.util.Connect.setForm(SA_AJAX.form);
      
        // Disable the form while it is being processed.
        for(var i=0; i<SA_AJAX.form.elements.length; i++) {
            SA_AJAX.form.elements[i].disabled = true;
        }
        var cObj = YAHOO.util.Connect.asyncRequest('POST', '.', SA_AJAX.ajax_callback);
    },
   
    ajax_callback: {
        success: function(o) {
            // This turns the JSON string into a JavaScript object.
            var response_obj = eval('(' + o.responseText + ')');
     
            // Set up the animation on the results div.
            var result_fade_out = new YAHOO.util.Anim(SA_AJAX.results_div, {
                opacity: { to: 0 }
            }, 0.25, YAHOO.util.Easing.easeOut);

            if(response_obj.errors) { // The form had errors.
                var error_message = document.createElement('p');
                if(response_obj.error_message) {
                    error_message.innerHTML = response_obj.error_message;
                } else {
                    error_message.innerHTML = 'Please correct the errors shown below.';
                }

                var result_fade_in = new YAHOO.util.Anim(SA_AJAX.results_div, {
                    opacity: { to: 1 }
                    }, 0.25, YAHOO.util.Easing.easeIn);

                result_fade_out.onComplete.subscribe(function() {
                    SA_AJAX.results_div.innerHTML = '';
                    YAHOO.util.Dom.setStyle(SA_AJAX.results_div, 'display', 'block');
                    YAHOO.util.Dom.addClass(SA_AJAX.results_div, 'error_heading');
                    SA_AJAX.display_errors(response_obj.errors);
                    SA_AJAX.results_div.appendChild(error_message);
                    window.location.href='#top';
                    result_fade_in.animate();
                });

            } else if(response_obj.success) { // The form went through successfully.
                if(response_obj.redirect) {
                    var redirect=response_obj.redirect;
                    result_fade_out.onComplete.subscribe(function() {
                        window.location.href=redirect;
                    });
                } else {
                    var success_message = document.createElement('p');
                    // Display a custom message returned by the view, or a default one.
                    if(response_obj.success_message) {
                        success_message.innerHTML = response_obj.success_message;
                    } else {
                        success_message.innerHTML = 'Form submitted successfully!';
                    }
                    var result_fade_in = new YAHOO.util.Anim(SA_AJAX.results_div, {
                        opacity: { to: 1 }
                    }, 0.25, YAHOO.util.Easing.easeIn);
                    result_fade_out.onComplete.subscribe(function() {
                        SA_AJAX.results_div.innerHTML = '';
                        SA_AJAX.results_div.appendChild(success_message);
                        YAHOO.util.Dom.setStyle(SA_AJAX.results_div, 'display', 'block');
                        result_fade_in.animate();
                    });
                }
            }
            result_fade_out.onComplete.subscribe(function() {
                //Re -enable the form.
                for(var i=0; i<SA_AJAX.form.elements.length; i++) {
                    SA_AJAX.form.elements[i].disabled = false;
                }});
            result_fade_out.animate();
        },
      
        failure: function(o) {
            alert('An error has occurred, please try your request again or send a contact us message.');
        }
    },
   
    display_errors: function(error_obj) {
        for(var err in error_obj) {
            var field_wrap = document.getElementById('form_line_wrap_' + err);
            YAHOO.util.Dom.addClass(field_wrap, 'form_line_wrap_err');

            var error_span = document.createElement('span');
            YAHOO.util.Dom.addClass(error_span, 'form_err_message');
            YAHOO.util.Dom.setStyle(error_span, 'opacity', 0);
            error_span.innerHTML = error_obj[err];

            var field_title = document.getElementById('form_title_' + err);
            field_title.appendChild(error_span);
            
            var error_fade_in = new YAHOO.util.Anim(error_span, {
                opacity: { to: 1 }
                }, 0.25, YAHOO.util.Easing.easeIn);
            error_fade_in.animate();
        }
    }
};

YAHOO.util.Event.addListener(window, 'load', SA_AJAX.init);
