var FORM_PROCESS_FIELD_RESULT = 0;
var FORM_PROCESS_FIELD_DATA = 1;
var FORM_PROCESS_FIELD_MISSING_FIELDS = 2;

var FORM_MISSING_FIELD_ID = 0;
var FORM_MISSING_FIELD_LABEL = 1;
var FORM_MISSING_FIELD_STATUS = 2;

var FORM_FIELD_ID = 0;
var FORM_FIELD_TYPE = 1;
var FORM_FIELD_REQUIRED = 2;
var FORM_FIELD_LABEL = 3;
var FORM_FIELD_CRITERIA_TYPE = 4;
var FORM_FIELD_CRITERIA = 5;

var FORM_STATUS_FIELD_OK = 0;
var FORM_STATUS_FIELD_REQUIRED = 1;
var FORM_STATUS_FIELD_TOO_LARGE = 2;
var FORM_STATUS_FIELD_TOO_SMALL = 3;
var FORM_STATUS_FIELD_TOO_LONG = 4;
var FORM_STATUS_FIELD_TOO_SHORT = 5;
var FORM_STATUS_FIELD_INVALID_EMAIL = 6;

function Process_form( form_base_id, form_variables )
{
    var result = new Array( true, "", new Array() );
    var success = true;
    var data = "";
    var missing_fields = new Array();

    for( var i = 0; i < form_variables.length; i++ ) {
        var current_value = "";
        var variable = form_variables[i];
        var field_name = form_base_id + "_" + variable[FORM_FIELD_ID];
        var variable_criteria = variable[FORM_FIELD_CRITERIA];

        switch( variable[FORM_FIELD_TYPE] ) {
            case "bool":
                current_value = GE( field_name ).checked;
                break;
            case "tinymce":
                tinyMCE.triggerSave();
            case "hidden":
            case "text":
            case "password":
            case "textarea":
            default:
                current_value = GV( field_name );
                break;
        }
        
        switch( variable[FORM_FIELD_CRITERIA_TYPE] ) {
            case "unsigned":
                current_value = parseInt( current_value, 10 );
                if( variable_criteria != null ) {
                    if( variable_criteria[0] > current_value ) {
                        success = false;
                        missing_fields.push( new Array( variable[FORM_FIELD_ID],
                                                        variable[FORM_FIELD_LABEL],
                                                        FORM_STATUS_FIELD_TOO_SMALL ) );
                        continue;
                    } else if( variable_criteria[1] < current_value ) {
                        success = false;
                        missing_fields.push( new Array( variable[FORM_FIELD_ID],
                                                        variable[FORM_FIELD_LABEL],
                                                        FORM_STATUS_FIELD_TOO_LARGE ) );
                        continue;
                    }
                }
                break;
            case "string":
                if( variable_criteria[0] > 0 && current_value.length < variable_criteria[0] ) {
                    success = false;
                    missing_fields.push( new Array( variable[FORM_FIELD_ID],
                                                    variable[FORM_FIELD_LABEL],
                                                    FORM_STATUS_FIELD_TOO_SHORT ) );
                    continue;
                } else if( variable_criteria[1] >= variable_criteria[0]
                        && current_value.length > variable_criteria[1] )
                {
                    success = false;
                    missing_fields.push( new Array( variable[FORM_FIELD_ID],
                                                    variable[FORM_FIELD_LABEL],
                                                    FORM_STATUS_FIELD_TOO_LONG ) );
                    continue;
                }
                break;
            case "bool":
                current_value = current_value ? "1" : "0";
                break;
            case "email":
                if( !Is_valid_email_address( decodeURIComponent( current_value ) ) ) {
                    if( current_value.length > 0 || variable[FORM_FIELD_REQUIRED] ) {
                        success = false;
                        missing_fields.push( new Array( variable[FORM_FIELD_ID],
                                                        variable[FORM_FIELD_LABEL],
                                                        FORM_STATUS_FIELD_INVALID_EMAIL ) );
                        continue;
                    }
                }
                break;
            default:
                current_value = null;
                break;
        }

        if( current_value == null && variable[FORM_FIELD_REQUIRED] ) {
            success = false;
            missing_fields.push( new Array( variable[FORM_FIELD_ID],
                                            variable[FORM_FIELD_LABEL],
                                            FORM_STATUS_FIELD_REQUIRED ) );
            continue;
        } else if( !success ) {
            continue;
        }

        if( current_value != null ) {
            if( data.length > 0 ) {
                data += "&";
            }
            data += variable[FORM_FIELD_ID] + "=" + current_value;
        }
    }

    result[FORM_PROCESS_FIELD_RESULT] = success;
    result[FORM_PROCESS_FIELD_DATA] = data;
    result[FORM_PROCESS_FIELD_MISSING_FIELDS] = missing_fields;

    return result;
}

function Get_status_field_text( status )
{
    switch( status ) {
        case FORM_STATUS_FIELD_REQUIRED:
            return "is required";
        case FORM_STATUS_FIELD_TOO_LARGE:
            return "is too large";
        case FORM_STATUS_FIELD_TOO_SMALL:
            return "is too small";
        case FORM_STATUS_FIELD_TOO_LONG:
            return "is too long";
        case FORM_STATUS_FIELD_TOO_SHORT:
            return "is too short";
        case FORM_STATUS_FIELD_INVALID_EMAIL:
            return "is invalid";
        default:
            return "has an error";
    }
}
