function mf_process_form($dbh, $input)
{
    global $mf_lang;
    $form_id = (int) trim($input['form_id']);
    $edit_id = (int) trim($input['edit_id']);
    if (empty($input['page_number'])) {
        $page_number = 1;
    } else {
        $page_number = (int) $input['page_number'];
    }
    $is_committed = false;
    $mf_settings = mf_get_settings($dbh);
    //this function handle password submission and general form submission
    //check for password requirement
    $query = "select \r\n\t\t\t\t\t\tform_password,\r\n\t\t\t\t\t\tform_language,\r\n\t\t\t\t\t\tform_review,\r\n\t\t\t\t\t\tform_page_total,\r\n\t\t\t\t\t\tlogic_field_enable,\r\n\t\t\t\t\t\tlogic_page_enable \r\n\t\t\t\t\tfrom \r\n\t\t\t\t\t\t`" . MF_TABLE_PREFIX . "forms` where form_id=?";
    $params = array($form_id);
    $sth = mf_do_query($query, $params, $dbh);
    $row = mf_do_fetch_result($sth);
    $form_review = $row['form_review'];
    $form_page_total = (int) $row['form_page_total'];
    $logic_field_enable = (int) $row['logic_field_enable'];
    $logic_page_enable = (int) $row['logic_page_enable'];
    if (!empty($row['form_password'])) {
        $require_password = true;
    } else {
        $require_password = false;
    }
    if (!empty($row['form_language'])) {
        mf_set_language($row['form_language']);
    }
    //if this form require password and no session has been set
    if ($require_password && (empty($_SESSION['user_authenticated']) || $_SESSION['user_authenticated'] != $form_id)) {
        $query = "select count(form_id) valid_password from `" . MF_TABLE_PREFIX . "forms` where form_id=? and form_password=?";
        $params = array($form_id, $input['password']);
        $sth = mf_do_query($query, $params, $dbh);
        $row = mf_do_fetch_result($sth);
        if (!empty($row['valid_password'])) {
            $process_result['status'] = true;
            $_SESSION['user_authenticated'] = $form_id;
        } else {
            $process_result['status'] = false;
            $process_result['custom_error'] = $mf_lang['form_pass_invalid'];
        }
        return $process_result;
    }
    $delay_notifications = false;
    $form_properties = array();
    $form_properties = mf_get_form_properties($dbh, $form_id, array('payment_enable_merchant', 'payment_delay_notifications', 'payment_merchant_type'));
    //at this moment, delay notification only available for stripe
    if ($form_properties['payment_enable_merchant'] == 1 && !empty($form_properties['payment_delay_notifications']) && in_array($form_properties['payment_merchant_type'], array('stripe'))) {
        $delay_notifications = true;
    }
    $element_child_lookup['address'] = 5;
    $element_child_lookup['simple_name'] = 1;
    $element_child_lookup['simple_name_wmiddle'] = 2;
    $element_child_lookup['name'] = 3;
    $element_child_lookup['name_wmiddle'] = 4;
    $element_child_lookup['phone'] = 2;
    $element_child_lookup['date'] = 2;
    $element_child_lookup['europe_date'] = 2;
    $element_child_lookup['time'] = 3;
    $element_child_lookup['money'] = 1;
    //this applies to dollar,euro and pound. yen don't have child
    $element_child_lookup['checkbox'] = 1;
    //this is just a dumb value
    $element_child_lookup['matrix'] = 1;
    //this is just a dumb value
    //never trust user input, get a list of input fields based on info stored on table
    //element has real child -> address, simple_name, name, simple_name_wmiddle, name_wmiddle
    //element has virtual child -> phone, date, europe_date, time, money
    $is_edit_page = false;
    if (!empty($edit_id) && $_SESSION['mf_logged_in'] === true) {
        //if this is edit_entry page, process all elements on all pages at once
        $page_number_clause = '';
        $params = array($form_id);
        $is_edit_page = true;
    } else {
        $page_number_clause = 'and element_page_number =?';
        $params = array($form_id, $page_number);
    }
    $query = "SELECT \r\n\t\t\t\t\t\telement_id,\r\n       \t\t\t\t\telement_title,\r\n       \t\t\t\t\telement_is_required,\r\n       \t\t\t\t\telement_is_unique,\r\n       \t\t\t\t\telement_is_private,\r\n       \t\t\t\t\telement_type, \r\n       \t\t\t\t\telement_constraint,\r\n       \t\t\t\t\telement_total_child,\r\n       \t\t\t\t\telement_file_enable_multi_upload,\r\n       \t\t\t\t\telement_file_max_selection,\r\n       \t\t\t\t\telement_file_enable_type_limit,\r\n       \t\t\t\t\telement_file_block_or_allow,\r\n       \t\t\t\t\telement_file_type_list,\r\n       \t\t\t\t\telement_range_max,\r\n       \t\t\t\t\telement_range_min,\r\n       \t\t\t\t\telement_range_limit_by,\r\n       \t\t\t\t\telement_choice_has_other,\r\n       \t\t\t\t\telement_time_showsecond,\r\n       \t\t\t\t\telement_time_24hour,\r\n       \t\t\t\t\telement_matrix_parent_id,\r\n       \t\t\t\t\telement_matrix_allow_multiselect,\r\n       \t\t\t\t\telement_date_enable_range,\r\n       \t\t\t\t\telement_date_range_min,\r\n       \t\t\t\t\telement_date_range_max,\r\n       \t\t\t\t\telement_date_past_future,\r\n       \t\t\t\t\telement_date_disable_past_future,\r\n       \t\t\t\t\telement_date_enable_selection_limit,\r\n\t\t\t\t\t\telement_date_selection_max,\r\n\t\t\t\t\t\telement_date_disable_weekend,\r\n\t\t\t\t\t\telement_date_disable_specific,\r\n\t\t\t\t\t\telement_date_disabled_list\r\n\t\t\t\t\tFROM \r\n\t\t\t\t\t\t" . MF_TABLE_PREFIX . "form_elements \r\n\t\t\t\t   WHERE \r\n\t\t\t\t   \t\tform_id=? and element_status = '1' {$page_number_clause} and element_type <> 'page_break' and element_type <> 'section'\r\n\t\t\t\tORDER BY \r\n\t\t\t\t\t\telement_id asc";
    $sth = mf_do_query($query, $params, $dbh);
    $element_to_get = array();
    $private_elements = array();
    //admin-only fields
    $matrix_childs_array = array();
    while ($row = mf_do_fetch_result($sth)) {
        if ($row['element_type'] == 'section') {
            continue;
        }
        //store element info
        $element_info[$row['element_id']]['title'] = $row['element_title'];
        $element_info[$row['element_id']]['type'] = $row['element_type'];
        $element_info[$row['element_id']]['is_required'] = $row['element_is_required'];
        $element_info[$row['element_id']]['is_unique'] = $row['element_is_unique'];
        $element_info[$row['element_id']]['is_private'] = $row['element_is_private'];
        $element_info[$row['element_id']]['constraint'] = $row['element_constraint'];
        $element_info[$row['element_id']]['file_enable_multi_upload'] = $row['element_file_enable_multi_upload'];
        $element_info[$row['element_id']]['file_max_selection'] = $row['element_file_max_selection'];
        $element_info[$row['element_id']]['file_enable_type_limit'] = $row['element_file_enable_type_limit'];
        $element_info[$row['element_id']]['file_block_or_allow'] = $row['element_file_block_or_allow'];
        $element_info[$row['element_id']]['file_type_list'] = $row['element_file_type_list'];
        $element_info[$row['element_id']]['range_min'] = $row['element_range_min'];
        $element_info[$row['element_id']]['range_max'] = $row['element_range_max'];
        $element_info[$row['element_id']]['range_limit_by'] = $row['element_range_limit_by'];
        $element_info[$row['element_id']]['choice_has_other'] = $row['element_choice_has_other'];
        $element_info[$row['element_id']]['time_showsecond'] = (int) $row['element_time_showsecond'];
        $element_info[$row['element_id']]['time_24hour'] = (int) $row['element_time_24hour'];
        $element_info[$row['element_id']]['matrix_parent_id'] = (int) $row['element_matrix_parent_id'];
        $element_info[$row['element_id']]['matrix_allow_multiselect'] = (int) $row['element_matrix_allow_multiselect'];
        $element_info[$row['element_id']]['date_enable_range'] = (int) $row['element_date_enable_range'];
        $element_info[$row['element_id']]['date_range_max'] = $row['element_date_range_max'];
        $element_info[$row['element_id']]['date_range_min'] = $row['element_date_range_min'];
        $element_info[$row['element_id']]['date_past_future'] = $row['element_date_past_future'];
        $element_info[$row['element_id']]['date_disable_past_future'] = (int) $row['element_date_disable_past_future'];
        $element_info[$row['element_id']]['date_enable_selection_limit'] = (int) $row['element_date_enable_selection_limit'];
        $element_info[$row['element_id']]['date_selection_max'] = (int) $row['element_date_selection_max'];
        $element_info[$row['element_id']]['date_disable_weekend'] = (int) $row['element_date_disable_weekend'];
        $element_info[$row['element_id']]['date_disable_specific'] = (int) $row['element_date_disable_specific'];
        $element_info[$row['element_id']]['date_disabled_list'] = $row['element_date_disabled_list'];
        //get element form name, complete with the childs
        if (empty($element_child_lookup[$row['element_type']]) || $row['element_constraint'] == 'yen') {
            //elements with no child
            $element_to_get[] = 'element_' . $row['element_id'];
        } else {
            //elements with child
            if ($row['element_type'] == 'checkbox' || $row['element_type'] == 'matrix' && !empty($row['element_matrix_allow_multiselect'])) {
                //for checkbox, get childs elements from ap_element_options table
                $sub_query = "select \r\n\t\t\t\t\t\t\t\t\t\toption_id \r\n\t\t\t\t\t\t\t\t\tfrom \r\n\t\t\t\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "element_options \r\n\t\t\t\t\t\t\t\t   where \r\n\t\t\t\t\t\t\t\t   \t\tform_id=? and element_id=? and live=1 \r\n\t\t\t\t\t\t\t\torder by \r\n\t\t\t\t\t\t\t\t\t\t`position` asc";
                $params = array($form_id, $row['element_id']);
                $sub_sth = mf_do_query($sub_query, $params, $dbh);
                while ($sub_row = mf_do_fetch_result($sub_sth)) {
                    $element_to_get[] = "element_{$row['element_id']}_{$sub_row['option_id']}";
                    $checkbox_childs[$row['element_id']][] = $sub_row['option_id'];
                    //store the child into array for further reference
                }
                //if this is the parent of the matrix (checkbox matrix only), get the child as well
                if ($row['element_type'] == 'matrix' && !empty($row['element_matrix_allow_multiselect'])) {
                    $temp_matrix_child_element_id_array = explode(',', trim($row['element_constraint']));
                    foreach ($temp_matrix_child_element_id_array as $mc_element_id) {
                        $sub_query = "select \r\n\t\t\t\t\t\t\t\t\t\t\toption_id \r\n\t\t\t\t\t\t\t\t\t\tfrom \r\n\t\t\t\t\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "element_options \r\n\t\t\t\t\t\t\t\t\t   where \r\n\t\t\t\t\t\t\t\t\t   \t\tform_id=? and element_id=? and live=1 \r\n\t\t\t\t\t\t\t\t\torder by \r\n\t\t\t\t\t\t\t\t\t\t\t`position` asc";
                        $params = array($form_id, $mc_element_id);
                        $sub_sth = mf_do_query($sub_query, $params, $dbh);
                        while ($sub_row = mf_do_fetch_result($sub_sth)) {
                            $element_to_get[] = "element_{$mc_element_id}_{$sub_row['option_id']}";
                            $checkbox_childs[$mc_element_id][] = $sub_row['option_id'];
                            //store the child into array for further reference
                        }
                    }
                }
            } else {
                if ($row['element_type'] == 'matrix' && empty($row['element_matrix_allow_multiselect'])) {
                    //radio button matrix, each row doesn't have childs
                    $element_to_get[] = 'element_' . $row['element_id'];
                } else {
                    $max = $element_child_lookup[$row['element_type']] + 1;
                    for ($j = 1; $j <= $max; $j++) {
                        $element_to_get[] = "element_{$row['element_id']}_{$j}";
                    }
                }
            }
        }
        //if the back button pressed after review page, or this is multipage form, we need to store the file info
        if (!empty($_SESSION['review_id']) && !empty($form_review) || $form_page_total > 1 || $is_edit_page === true) {
            if ($row['element_type'] == 'file') {
                $existing_file_id[] = $row['element_id'];
            }
        }
        //if this is matrix field, particularly the child rows, we need to store the id into temporary array
        //we need to loop through it later, to set the "required" property based on the matrix parent value
        if ($row['element_type'] == 'matrix' && !empty($row['element_matrix_parent_id'])) {
            $matrix_childs_array[$row['element_id']] = $row['element_matrix_parent_id'];
        }
        //extra security measure for file upload
        //even though the user disabled 'file type limit', we need to enforce it here and block dangerous files
        if ($row['element_type'] == 'file') {
            //if the 'Limit File Upload Type' disabled by user, enable it here and check for dangerous files
            if (empty($row['element_file_enable_type_limit'])) {
                $element_info[$row['element_id']]['file_enable_type_limit'] = 1;
                $element_info[$row['element_id']]['file_block_or_allow'] = 'b';
                //block
                $element_info[$row['element_id']]['file_type_list'] = 'php,php3,php4,php5,phtml,exe,pl,cgi,html,htm,js';
            } else {
                //if the limit being enabled but the list type is empty
                if (empty($element_info[$row['element_id']]['file_type_list'])) {
                    $element_info[$row['element_id']]['file_block_or_allow'] = 'b';
                    //block
                    $element_info[$row['element_id']]['file_type_list'] = 'php,php3,php4,php5,phtml,exe,pl,cgi,html,htm,js';
                } else {
                    //if the list is not empty, and it set to block files, make sure to add dangerous file types into the list
                    if ($element_info[$row['element_id']]['file_block_or_allow'] == 'b') {
                        $element_info[$row['element_id']]['file_type_list'] .= ',php,php3,php4,php5,phtml,exe,pl,cgi,html,htm,js';
                    }
                }
            }
        }
    }
    //loop through each matrix childs array
    //if the parent matrix has required=1, the child need to be set the same
    //if the parent matrix allow multi select, the child need to be set the same
    if (!empty($matrix_childs_array)) {
        foreach ($matrix_childs_array as $matrix_child_element_id => $matrix_parent_element_id) {
            if (!empty($element_info[$matrix_parent_element_id]['is_required'])) {
                $element_info[$matrix_child_element_id]['is_required'] = 1;
            }
            if (!empty($element_info[$matrix_parent_element_id]['matrix_allow_multiselect'])) {
                $element_info[$matrix_child_element_id]['matrix_allow_multiselect'] = 1;
            }
        }
    }
    if (!empty($existing_file_id)) {
        $existing_file_id_list = '';
        foreach ($existing_file_id as $value) {
            $existing_file_id_list .= 'element_' . $value . ',';
        }
        $existing_file_id_list = rtrim($existing_file_id_list, ',');
        if (!empty($_SESSION['review_id'])) {
            $current_session_id = $_SESSION['review_id'];
            $query = "select {$existing_file_id_list} from " . MF_TABLE_PREFIX . "form_{$form_id}_review where `id`=?";
        } else {
            if ($is_edit_page === true) {
                //if this is edit_entry.php page
                $current_session_id = $edit_id;
                $query = "select {$existing_file_id_list} from " . MF_TABLE_PREFIX . "form_{$form_id} where `id`=?";
            } else {
                $current_session_id = session_id();
                $query = "select {$existing_file_id_list} from " . MF_TABLE_PREFIX . "form_{$form_id}_review where `session_id`=?";
            }
        }
        $params = array($current_session_id);
        $sth = mf_do_query($query, $params, $dbh);
        $row = mf_do_fetch_result($sth);
        foreach ($existing_file_id as $value) {
            if (!empty($row['element_' . $value])) {
                $element_info[$value]['existing_file'] = $row['element_' . $value];
            }
        }
    }
    //pick user input
    $user_input = array();
    foreach ($element_to_get as $element_name) {
        $user_input[$element_name] = @$input[$element_name];
    }
    //if conditional logic for field is being enabled, and this is not edit entry page
    //we need to check the status of all elements which has "required" property
    //the "required" status might be disabled, depend on the condition
    if (!empty($logic_field_enable) && $is_edit_page === false) {
        $required_elements_status = array();
        $required_elements_status = mf_get_required_elements_status($dbh, $form_id, $page_number, $input);
        if (!empty($required_elements_status)) {
            foreach ($required_elements_status as $element_id => $required_status) {
                $element_info[$element_id]['is_required'] = $required_status;
            }
        }
    } else {
        if (!empty($logic_field_enable) && $is_edit_page === true) {
            //if this edit entry page and has logic enabled, disable all "required" fields
            foreach ($element_info as $element_id => $value) {
                $element_info[$element_id]['is_required'] = 0;
            }
        }
    }
    $error_elements = array();
    $table_data = array();
    //validate input based on rules specified for each field
    foreach ($user_input as $element_name => $element_data) {
        //get element_id from element_name
        $exploded = array();
        $exploded = explode('_', $element_name);
        $element_id = $exploded[1];
        $rules = array();
        $target_input = array();
        $element_type = $element_info[$element_id]['type'];
        //if this is private fields and not logged-in as admin, bypass operation below, just supply the default value if any
        if ($element_info[$element_id]['is_private'] == 1 && empty($_SESSION['mf_logged_in'])) {
            if (!empty($element_info[$element_id]['default_value'])) {
                $table_data['element_' . $element_id] = $element_info[$element_id]['default_value'];
            }
            continue;
        }
        //if this is matrix field, we need to convert the field type into radio button or checkbox
        if ('matrix' == $element_type) {
            $is_matrix_field = true;
            if (!empty($element_info[$element_id]['matrix_allow_multiselect'])) {
                $element_type = 'checkbox';
            } else {
                $element_type = 'radio';
            }
        } else {
            $is_matrix_field = false;
        }
        if ('text' == $element_type) {
            //Single Line Text
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            if (!empty($user_input[$element_name]) || is_numeric($user_input[$element_name])) {
                if (!empty($element_info[$element_id]['range_max']) && !empty($element_info[$element_id]['range_min'])) {
                    $rules[$element_name]['range_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_min'] . '#' . $element_info[$element_id]['range_max'];
                } else {
                    if (!empty($element_info[$element_id]['range_max'])) {
                        $rules[$element_name]['max_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_max'];
                    } else {
                        if (!empty($element_info[$element_id]['range_min'])) {
                            $rules[$element_name]['min_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_min'];
                        }
                    }
                }
            }
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($element_data);
            //prepare data for table column
            $table_data[$element_name] = $element_data;
        } elseif ('textarea' == $element_type) {
            //Paragraph
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            if (!empty($user_input[$element_name]) || is_numeric($user_input[$element_name])) {
                if (!empty($element_info[$element_id]['range_max']) && !empty($element_info[$element_id]['range_min'])) {
                    $rules[$element_name]['range_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_min'] . '#' . $element_info[$element_id]['range_max'];
                } else {
                    if (!empty($element_info[$element_id]['range_max'])) {
                        $rules[$element_name]['max_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_max'];
                    } else {
                        if (!empty($element_info[$element_id]['range_min'])) {
                            $rules[$element_name]['min_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_min'];
                        }
                    }
                }
            }
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($element_data);
            //prepare data for table column
            $table_data[$element_name] = $element_data;
        } elseif ('signature' == $element_type) {
            //Signature
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            $target_input[$element_name] = $element_data;
            if ($target_input[$element_name] == '[]') {
                //this is considered as empty signature
                $target_input[$element_name] = '';
            }
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($element_data, ENT_NOQUOTES);
            //prepare data for table column
            $table_data[$element_name] = $element_data;
        } elseif ('radio' == $element_type) {
            //Multiple Choice
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            //if this field has 'other' label
            if (!empty($element_info[$element_id]['choice_has_other'])) {
                if (empty($element_data) && !empty($input[$element_name . '_other'])) {
                    $element_data = $input[$element_name . '_other'];
                    //save old data into array, for form redisplay in case errors occured
                    $form_data[$element_name . '_other']['default_value'] = $element_data;
                    $table_data[$element_name . '_other'] = $element_data;
                    //make sure to set the main element value to 0
                    $form_data[$element_name]['default_value'] = 0;
                    $table_data[$element_name] = 0;
                }
            }
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                if ($is_matrix_field && !empty($matrix_childs_array[$element_id])) {
                    $error_elements[$matrix_childs_array[$element_id]] = $validation_result;
                } else {
                    $error_elements[$element_id] = $validation_result;
                }
            }
            //save old data into array, for form redisplay in case errors occured
            if (empty($form_data[$element_name . '_other']['default_value'])) {
                $form_data[$element_name]['default_value'] = $element_data;
            }
            //prepare data for table column
            if (empty($table_data[$element_name . '_other'])) {
                $table_data[$element_name] = $element_data;
            }
        } elseif ('number' == $element_type) {
            //Number
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            //check for numeric if not empty
            if (!empty($user_input[$element_name])) {
                $rules[$element_name]['numeric'] = true;
            }
            if ((!empty($user_input[$element_name]) || is_numeric($user_input[$element_name])) && $element_info[$element_id]['range_limit_by'] == 'd') {
                if (!empty($element_info[$element_id]['range_max']) && !empty($element_info[$element_id]['range_min'])) {
                    $rules[$element_name]['range_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_min'] . '#' . $element_info[$element_id]['range_max'];
                } else {
                    if (!empty($element_info[$element_id]['range_max'])) {
                        $rules[$element_name]['max_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_max'];
                    } else {
                        if (!empty($element_info[$element_id]['range_min'])) {
                            $rules[$element_name]['min_length'] = $element_info[$element_id]['range_limit_by'] . '#' . $element_info[$element_id]['range_min'];
                        }
                    }
                }
            } else {
                if ((!empty($user_input[$element_name]) || is_numeric($user_input[$element_name])) && $element_info[$element_id]['range_limit_by'] == 'v') {
                    if (!empty($element_info[$element_id]['range_max']) && !empty($element_info[$element_id]['range_min'])) {
                        $rules[$element_name]['range_value'] = $element_info[$element_id]['range_min'] . '#' . $element_info[$element_id]['range_max'];
                    } else {
                        if (!empty($element_info[$element_id]['range_max'])) {
                            $rules[$element_name]['max_value'] = $element_info[$element_id]['range_max'];
                        } else {
                            if (!empty($element_info[$element_id]['range_min'])) {
                                $rules[$element_name]['min_value'] = $element_info[$element_id]['range_min'];
                            }
                        }
                    }
                }
            }
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($element_data);
            //prepare data for table column
            $table_data[$element_name] = $element_data;
            //if the user removed the number, set the value to null
            if ($table_data[$element_name] == "") {
                $table_data[$element_name] = null;
            }
        } elseif ('url' == $element_type) {
            //Website
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            $rules[$element_name]['website'] = true;
            if ($element_data == 'http://') {
                $element_data = '';
            }
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($element_data);
            //prepare data for table column
            $table_data[$element_name] = $element_data;
        } elseif ('email' == $element_type) {
            //Email
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            $rules[$element_name]['email'] = true;
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($element_data);
            //prepare data for table column
            $table_data[$element_name] = $element_data;
        } elseif ('simple_name' == $element_type) {
            //Simple Name
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 2 elements total
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed on next loop
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
                $rules[$element_name_2]['required'] = true;
            }
            $target_input[$element_name] = $user_input[$element_name];
            $target_input[$element_name_2] = $user_input[$element_name_2];
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
            $table_data[$element_name_2] = $user_input[$element_name_2];
        } elseif ('simple_name_wmiddle' == $element_type) {
            //Simple Name with Middle
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other elements, 3 elements total
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $element_name_3 = substr($element_name, 0, -1) . '3';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed on next loop
            $processed_elements[] = $element_name_3;
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
                $rules[$element_name_3]['required'] = true;
            }
            $target_input[$element_name] = $user_input[$element_name];
            $target_input[$element_name_3] = $user_input[$element_name_3];
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            $form_data[$element_name_3]['default_value'] = htmlspecialchars($user_input[$element_name_3]);
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
            $table_data[$element_name_2] = $user_input[$element_name_2];
            $table_data[$element_name_3] = $user_input[$element_name_3];
        } elseif ('name' == $element_type) {
            //Name -  Extended
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 4 elements total
            //only element no 2&3 matters (first and last name)
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $element_name_3 = substr($element_name, 0, -1) . '3';
            $element_name_4 = substr($element_name, 0, -1) . '4';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed next
            $processed_elements[] = $element_name_3;
            $processed_elements[] = $element_name_4;
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name_2]['required'] = true;
                $rules[$element_name_3]['required'] = true;
            }
            $target_input[$element_name_2] = $user_input[$element_name_2];
            $target_input[$element_name_3] = $user_input[$element_name_3];
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            $form_data[$element_name_3]['default_value'] = htmlspecialchars($user_input[$element_name_3]);
            $form_data[$element_name_4]['default_value'] = htmlspecialchars($user_input[$element_name_4]);
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
            $table_data[$element_name_2] = $user_input[$element_name_2];
            $table_data[$element_name_3] = $user_input[$element_name_3];
            $table_data[$element_name_4] = $user_input[$element_name_4];
        } elseif ('name_wmiddle' == $element_type) {
            //Name -  Extended, with Middle
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 5 elements total
            //only element no 2,3,4 matters (first, middle, last name)
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $element_name_3 = substr($element_name, 0, -1) . '3';
            $element_name_4 = substr($element_name, 0, -1) . '4';
            $element_name_5 = substr($element_name, 0, -1) . '5';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed next
            $processed_elements[] = $element_name_3;
            $processed_elements[] = $element_name_4;
            $processed_elements[] = $element_name_5;
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name_2]['required'] = true;
                $rules[$element_name_4]['required'] = true;
            }
            $target_input[$element_name_2] = $user_input[$element_name_2];
            $target_input[$element_name_4] = $user_input[$element_name_4];
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            $form_data[$element_name_3]['default_value'] = htmlspecialchars($user_input[$element_name_3]);
            $form_data[$element_name_4]['default_value'] = htmlspecialchars($user_input[$element_name_4]);
            $form_data[$element_name_5]['default_value'] = htmlspecialchars($user_input[$element_name_5]);
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
            $table_data[$element_name_2] = $user_input[$element_name_2];
            $table_data[$element_name_3] = $user_input[$element_name_3];
            $table_data[$element_name_4] = $user_input[$element_name_4];
            $table_data[$element_name_5] = $user_input[$element_name_5];
        } elseif ('time' == $element_type) {
            //Time
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 4 elements total
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $element_name_3 = substr($element_name, 0, -1) . '3';
            $element_name_4 = substr($element_name, 0, -1) . '4';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed next
            $processed_elements[] = $element_name_3;
            $processed_elements[] = $element_name_4;
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name_2]['required'] = true;
                $rules[$element_name_3]['required'] = true;
                if (empty($element_info[$element_id]['time_24hour'])) {
                    $rules[$element_name_4]['required'] = true;
                }
            }
            //check time validity if any of the compound field entered
            $time_entry_exist = false;
            if (!empty($user_input[$element_name]) || !empty($user_input[$element_name_2]) || !empty($user_input[$element_name_3])) {
                $rules['element_time']['time'] = true;
                $time_entry_exist = true;
            }
            //for backward compatibility with machform v2 and beyond
            if ($element_info[$element_id]['constraint'] == 'show_seconds') {
                $element_info[$element_id]['time_showsecond'] = 1;
            }
            if ($time_entry_exist && empty($element_info[$element_id]['time_showsecond'])) {
                $user_input[$element_name_3] = '00';
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules['element_time_no_meridiem']['unique'] = $form_id . '#' . substr($element_name, 0, -2);
                //to check uniquenes we need to use 24 hours HH:MM:SS format
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            $target_input[$element_name_2] = $user_input[$element_name_2];
            $target_input[$element_name_3] = $user_input[$element_name_3];
            $target_input[$element_name_4] = $user_input[$element_name_4];
            if ($time_entry_exist) {
                $target_input['element_time'] = trim($user_input[$element_name] . ':' . $user_input[$element_name_2] . ':' . $user_input[$element_name_3] . ' ' . $user_input[$element_name_4]);
                $target_input['element_time_no_meridiem'] = @date("G:i:s", strtotime($target_input['element_time']));
            }
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            $form_data[$element_name_3]['default_value'] = htmlspecialchars($user_input[$element_name_3]);
            $form_data[$element_name_4]['default_value'] = htmlspecialchars($user_input[$element_name_4]);
            //prepare data for table column
            $table_data[substr($element_name, 0, -2)] = @$target_input['element_time_no_meridiem'];
        } elseif ('address' == $element_type) {
            //Address
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 6 elements total, element #2 (address line 2) is optional
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $element_name_3 = substr($element_name, 0, -1) . '3';
            $element_name_4 = substr($element_name, 0, -1) . '4';
            $element_name_5 = substr($element_name, 0, -1) . '5';
            $element_name_6 = substr($element_name, 0, -1) . '6';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed next
            $processed_elements[] = $element_name_3;
            $processed_elements[] = $element_name_4;
            $processed_elements[] = $element_name_5;
            $processed_elements[] = $element_name_6;
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
                $rules[$element_name_3]['required'] = true;
                $rules[$element_name_4]['required'] = true;
                $rules[$element_name_5]['required'] = true;
                $rules[$element_name_6]['required'] = true;
            }
            $target_input[$element_name] = $user_input[$element_name];
            $target_input[$element_name_3] = $user_input[$element_name_3];
            $target_input[$element_name_4] = $user_input[$element_name_4];
            $target_input[$element_name_5] = $user_input[$element_name_5];
            $target_input[$element_name_6] = $user_input[$element_name_6];
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            $form_data[$element_name_3]['default_value'] = htmlspecialchars($user_input[$element_name_3]);
            $form_data[$element_name_4]['default_value'] = htmlspecialchars($user_input[$element_name_4]);
            $form_data[$element_name_5]['default_value'] = htmlspecialchars($user_input[$element_name_5]);
            $form_data[$element_name_6]['default_value'] = htmlspecialchars($user_input[$element_name_6]);
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
            $table_data[$element_name_2] = $user_input[$element_name_2];
            $table_data[$element_name_3] = $user_input[$element_name_3];
            $table_data[$element_name_4] = $user_input[$element_name_4];
            $table_data[$element_name_5] = $user_input[$element_name_5];
            $table_data[$element_name_6] = $user_input[$element_name_6];
        } elseif ('money' == $element_type) {
            //Price
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 2 elements total (for currency other than yen)
            if ($element_info[$element_id]['constraint'] != 'yen') {
                //if other than yen
                $base_element_name = substr($element_name, 0, -1);
                $element_name_2 = $base_element_name . '2';
                $processed_elements[] = $element_name_2;
                if ($element_info[$element_id]['is_required']) {
                    $rules[$base_element_name]['required'] = true;
                }
                //check for numeric if not empty
                if (!empty($user_input[$element_name]) || !empty($user_input[$element_name_2])) {
                    $rules[$base_element_name]['numeric'] = true;
                }
                if ($element_info[$element_id]['is_unique']) {
                    $rules[$base_element_name]['unique'] = $form_id . '#' . substr($element_name, 0, -2);
                    $target_input['dbh'] = $dbh;
                    //we need to pass the $dbh for this 'unique' rule
                }
                $target_input[$base_element_name] = $user_input[$element_name] . '.' . $user_input[$element_name_2];
                //join dollar+cent
                if ($target_input[$base_element_name] == '.') {
                    $target_input[$base_element_name] = '';
                }
                //save old data into array, for form redisplay in case errors occured
                $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
                $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
                //prepare data for table column
                if (!empty($user_input[$element_name]) || !empty($user_input[$element_name_2]) || $user_input[$element_name] === '0' || $user_input[$element_name_2] === '0') {
                    $table_data[substr($element_name, 0, -2)] = $user_input[$element_name] . '.' . $user_input[$element_name_2];
                }
                //if the user removed the number, set the value to null
                if ($user_input[$element_name] == "" && $user_input[$element_name_2] == "") {
                    $table_data[substr($element_name, 0, -2)] = null;
                }
            } else {
                if ($element_info[$element_id]['is_required']) {
                    $rules[$element_name]['required'] = true;
                }
                //check for numeric if not empty
                if (!empty($user_input[$element_name])) {
                    $rules[$element_name]['numeric'] = true;
                }
                if ($element_info[$element_id]['is_unique']) {
                    $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                    $target_input['dbh'] = $dbh;
                    //we need to pass the $dbh for this 'unique' rule
                }
                $target_input[$element_name] = $user_input[$element_name];
                //save old data into array, for form redisplay in case errors occured
                $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
                //prepare data for table column
                $table_data[$element_name] = $user_input[$element_name];
                //if the user removed the number, set the value to null
                if ($table_data[$element_name] == "") {
                    $table_data[$element_name] = null;
                }
            }
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
        } elseif ('checkbox' == $element_type) {
            //Checkboxes
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            $all_child_array = array();
            $all_child_array = $checkbox_childs[$element_id];
            $base_element_name = 'element_' . $element_id . '_';
            if (!empty($element_info[$element_id]['choice_has_other'])) {
                $all_checkbox_value = $input[$base_element_name . 'other'];
                //save old data into array, for form redisplay in case errors occured
                $form_data[$base_element_name . 'other']['default_value'] = $input[$base_element_name . 'other'];
                $table_data[$base_element_name . 'other'] = $input[$base_element_name . 'other'];
            } else {
                $all_checkbox_value = '';
            }
            if ($element_info[$element_id]['is_required']) {
                //checking 'required' for checkboxes is more complex
                //we need to get total child, and join it into one element
                //only one element is required to be checked
                foreach ($all_child_array as $i) {
                    $all_checkbox_value .= $user_input[$base_element_name . $i];
                    $processed_elements[] = $base_element_name . $i;
                    //save old data into array, for form redisplay in case errors occured
                    $form_data[$base_element_name . $i]['default_value'] = $user_input[$base_element_name . $i];
                    //prepare data for table column
                    $table_data[$base_element_name . $i] = $user_input[$base_element_name . $i];
                }
                $rules[$base_element_name]['required'] = true;
                $target_input[$base_element_name] = $all_checkbox_value;
                $validation_result = mf_validate_element($target_input, $rules);
                if ($validation_result !== true) {
                    if ($is_matrix_field && !empty($matrix_childs_array[$element_id])) {
                        $error_elements[$matrix_childs_array[$element_id]] = $validation_result;
                    } else {
                        $error_elements[$element_id] = $validation_result;
                    }
                }
            } else {
                //if not required, we only need to capture all data
                foreach ($all_child_array as $i) {
                    //save old data into array, for form redisplay in case errors occured
                    $form_data[$base_element_name . $i]['default_value'] = $user_input[$base_element_name . $i];
                    //prepare data for table column
                    $table_data[$base_element_name . $i] = $user_input[$base_element_name . $i];
                }
            }
        } elseif ('select' == $element_type) {
            //Drop Down
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = $user_input[$element_name];
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
        } elseif ('date' == $element_type || 'europe_date' == $element_type) {
            //Date
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 3 elements total
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $element_name_3 = substr($element_name, 0, -1) . '3';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed next
            $processed_elements[] = $element_name_3;
            if (!empty($element_info[$element_id]['is_required'])) {
                $rules[$element_name]['required'] = true;
                $rules[$element_name_2]['required'] = true;
                $rules[$element_name_3]['required'] = true;
            }
            $rules['element_date']['date'] = 'yyyy/mm/dd';
            if (!empty($element_info[$element_id]['is_unique'])) {
                $rules['element_date']['unique'] = $form_id . '#' . substr($element_name, 0, -2);
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            if (!empty($element_info[$element_id]['date_enable_range'])) {
                if (!empty($element_info[$element_id]['date_range_max']) || !empty($element_info[$element_id]['date_range_min'])) {
                    $rules['element_date']['date_range'] = $element_info[$element_id]['date_range_min'] . '#' . $element_info[$element_id]['date_range_max'];
                }
            }
            //disable past/future dates, if enabled. this rule override the date range rule being set above
            if (!empty($element_info[$element_id]['date_disable_past_future'])) {
                $today_date = date('Y-m-d', time());
                if ($element_info[$element_id]['date_past_future'] == 'p') {
                    //disable past dates
                    $rules['element_date']['date_range'] = $today_date . '#0000-00-00';
                } else {
                    if ($element_info[$element_id]['date_past_future'] == 'f') {
                        //disable future dates
                        $rules['element_date']['date_range'] = '0000-00-00#' . $today_date;
                    }
                }
            }
            //check for weekend dates rule
            if (!empty($element_info[$element_id]['date_disable_weekend'])) {
                $rules['element_date']['date_weekend'] = true;
            }
            //get disabled dates (either coming from 'date selection limit' or 'disable specific dates' rules)
            $disabled_dates = array();
            //get disabled dates from 'date selection limit' rule
            if (!empty($element_info[$element_id]['date_enable_selection_limit']) && !empty($element_info[$element_id]['date_selection_max'])) {
                $sub_query = "select \r\n\t\t\t\t\t\t\t\t\t\tselected_date \r\n\t\t\t\t\t\t\t\t\tfrom (\r\n\t\t\t\t\t\t\t\t\t\t\tselect \r\n\t\t\t\t\t\t\t\t\t\t\t\t  date_format(element_{$element_id},'%Y-%c-%e') as selected_date,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  count(element_{$element_id}) as total_selection \r\n\t\t\t\t\t\t\t\t\t\t      from \r\n\t\t\t\t\t\t\t\t\t\t      \t  " . MF_TABLE_PREFIX . "form_{$form_id} \r\n\t\t\t\t\t\t\t\t\t\t     where \r\n\t\t\t\t\t\t\t\t\t\t     \t  status=1 and element_{$element_id} is not null \r\n\t\t\t\t\t\t\t\t\t\t  group by \r\n\t\t\t\t\t\t\t\t\t\t  \t\t  element_{$element_id}\r\n\t\t\t\t\t\t\t\t\t\t ) as A\r\n\t\t\t\t\t\t\t\t   where \r\n\t\t\t\t\t\t\t\t\t\t A.total_selection >= ?";
                $params = array($element_info[$element_id]['date_selection_max']);
                $sub_sth = mf_do_query($sub_query, $params, $dbh);
                while ($sub_row = mf_do_fetch_result($sub_sth)) {
                    $disabled_dates[] = $sub_row['selected_date'];
                }
            }
            //get disabled dates from 'disable specific dates' rules
            if (!empty($element_info[$element_id]['date_disable_specific']) && !empty($element_info[$element_id]['date_disabled_list'])) {
                $exploded = array();
                $exploded = explode(',', $element_info[$element_id]['date_disabled_list']);
                foreach ($exploded as $date_value) {
                    $disabled_dates[] = date('Y-n-j', strtotime(trim($date_value)));
                }
            }
            if (!empty($disabled_dates)) {
                $rules['element_date']['disabled_dates'] = $disabled_dates;
            }
            $target_input[$element_name] = $user_input[$element_name];
            $target_input[$element_name_2] = $user_input[$element_name_2];
            $target_input[$element_name_3] = $user_input[$element_name_3];
            $base_element_name = substr($element_name, 0, -2);
            if ('date' == $element_type) {
                //MM/DD/YYYY
                $target_input['element_date'] = $user_input[$element_name_3] . '-' . $user_input[$element_name] . '-' . $user_input[$element_name_2];
                //prepare data for table column
                $table_data[$base_element_name] = $user_input[$element_name_3] . '-' . $user_input[$element_name] . '-' . $user_input[$element_name_2];
            } else {
                //DD/MM/YYYY
                $target_input['element_date'] = $user_input[$element_name_3] . '-' . $user_input[$element_name_2] . '-' . $user_input[$element_name];
                //prepare data for table column
                $table_data[$base_element_name] = $user_input[$element_name_3] . '-' . $user_input[$element_name_2] . '-' . $user_input[$element_name];
            }
            $test_empty = str_replace('-', '', $target_input['element_date']);
            //if user not submitting any entry, remove the dashes
            if (empty($test_empty)) {
                unset($target_input['element_date']);
                $table_data[$base_element_name] = '';
            }
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            $form_data[$element_name_3]['default_value'] = htmlspecialchars($user_input[$element_name_3]);
        } elseif ('simple_phone' == $element_type) {
            //Simple Phone
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            if (!empty($user_input[$element_name])) {
                $rules[$element_name]['simple_phone'] = true;
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            $target_input[$element_name] = $user_input[$element_name];
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
        } elseif ('phone' == $element_type) {
            //Phone - US format
            if (!empty($processed_elements) && is_array($processed_elements) && in_array($element_name, $processed_elements)) {
                continue;
            }
            //compound element, grab the other element, 3 elements total
            $element_name_2 = substr($element_name, 0, -1) . '2';
            $element_name_3 = substr($element_name, 0, -1) . '3';
            $processed_elements[] = $element_name_2;
            //put this element into array so that it won't be processed next
            $processed_elements[] = $element_name_3;
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
                $rules[$element_name_2]['required'] = true;
                $rules[$element_name_3]['required'] = true;
            }
            $rules['element_phone']['phone'] = true;
            if ($element_info[$element_id]['is_unique']) {
                $rules['element_phone']['unique'] = $form_id . '#' . substr($element_name, 0, -2);
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            $target_input[$element_name] = $user_input[$element_name];
            $target_input[$element_name_2] = $user_input[$element_name_2];
            $target_input[$element_name_3] = $user_input[$element_name_3];
            $target_input['element_phone'] = $user_input[$element_name] . $user_input[$element_name_2] . $user_input[$element_name_3];
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            $form_data[$element_name_2]['default_value'] = htmlspecialchars($user_input[$element_name_2]);
            $form_data[$element_name_3]['default_value'] = htmlspecialchars($user_input[$element_name_3]);
            //prepare data for table column
            $table_data[substr($element_name, 0, -2)] = $user_input[$element_name] . $user_input[$element_name_2] . $user_input[$element_name_3];
        } elseif ('email' == $element_type) {
            //Email
            if ($element_info[$element_id]['is_required']) {
                $rules[$element_name]['required'] = true;
            }
            if ($element_info[$element_id]['is_unique']) {
                $rules[$element_name]['unique'] = $form_id . '#' . $element_name;
                $target_input['dbh'] = $dbh;
                //we need to pass the $dbh for this 'unique' rule
            }
            $rules[$element_name]['email'] = true;
            $target_input[$element_name] = $element_data;
            $validation_result = mf_validate_element($target_input, $rules);
            if ($validation_result !== true) {
                $error_elements[$element_id] = $validation_result;
            }
            //save old data into array, for form redisplay in case errors occured
            $form_data[$element_name]['default_value'] = htmlspecialchars($user_input[$element_name]);
            //prepare data for table column
            $table_data[$element_name] = $user_input[$element_name];
        } elseif ('file' == $element_type) {
            //File
            $listfile_name = $input['machform_data_path'] . $mf_settings['upload_dir'] . "/form_{$form_id}/files/listfile_{$input[$element_name . '_token']}.php";
            if (!file_exists($listfile_name)) {
                $check_filetype = false;
                if ($element_info[$element_id]['is_required']) {
                    $rules[$element_name]['required_file'] = true;
                    $rules[$element_name]['filetype'] = true;
                    $check_filetype = true;
                    //if form review enabled, and user pressed back button after going to review page
                    //or if this is multipage form
                    //disable the required file checking if file already uploaded
                    if (!empty($_SESSION['review_id']) || $form_page_total > 1 || $is_edit_page === true) {
                        if (!empty($element_info[$element_id]['existing_file'])) {
                            unset($rules[$element_name]['required_file']);
                            unset($rules[$element_name]['filetype']);
                            $check_filetype = false;
                        }
                    }
                } else {
                    if ($_FILES[$element_name]['size'] > 0) {
                        $rules[$element_name]['filetype'] = true;
                        $check_filetype = true;
                    }
                }
                if ($check_filetype == true && !empty($element_info[$element_id]['file_enable_type_limit'])) {
                    if ($element_info[$element_id]['file_block_or_allow'] == 'b') {
                        //block file type
                        $target_input['file_block_or_allow'] = 'b';
                    } elseif ($element_info[$element_id]['file_block_or_allow'] == 'a') {
                        $target_input['file_block_or_allow'] = 'a';
                    }
                    $target_input['file_type_list'] = $element_info[$element_id]['file_type_list'];
                }
                $target_input[$element_name] = $element_name;
                //special for file, only need to pass input name
                $validation_result = mf_validate_element($target_input, $rules);
                if ($validation_result !== true) {
                    $error_elements[$element_id] = $validation_result;
                } else {
                    //if validation passed, store uploaded file info into array
                    if ($_FILES[$element_name]['size'] > 0) {
                        $uploaded_files[] = $element_name;
                    }
                }
            } else {
                //if files were uploaded using advance uploader
                //file type validation already done in upload.php, so we don't need to do validation again here
                //store uploaded file list into array
                $current_element_uploaded_files_advance = array();
                $current_element_uploaded_files_advance = file($listfile_name, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
                array_shift($current_element_uploaded_files_advance);
                //remove the first index of the array
                array_pop($current_element_uploaded_files_advance);
                //remove the last index of the array
                $uploaded_files_advance[$element_id]['listfile_name'] = $listfile_name;
                $uploaded_files_advance[$element_id]['listfile_content'] = $current_element_uploaded_files_advance;
                //save old token into array, for form redisplay in case errors occured
                $form_data[$element_name]['file_token'] = $input[$element_name . '_token'];
            }
        }
    }
    //get form redirect info, if any
    //get form properties data
    $query = "select \r\n\t\t\t\t\t\t form_redirect,\r\n\t\t\t\t\t\t form_redirect_enable,\r\n\t\t\t\t\t\t form_email,\r\n\t\t\t\t\t\t form_unique_ip,\r\n\t\t\t\t\t\t form_captcha,\r\n\t\t\t\t\t\t form_captcha_type,\r\n\t\t\t\t\t\t form_review,\r\n\t\t\t\t\t\t form_page_total,\r\n\t\t\t\t\t\t form_resume_enable,\r\n\t\t\t\t\t\t form_name,\r\n\t\t\t\t\t\t esl_enable,\r\n\t\t\t\t\t\t esl_from_name,\r\n\t\t\t\t\t\t esl_from_email_address,\r\n\t\t\t\t\t\t esl_subject,\r\n\t\t\t\t\t\t esl_content,\r\n\t\t\t\t\t\t esl_plain_text,\r\n\t\t\t\t\t\t esr_enable,\r\n\t\t\t\t\t\t esr_email_address,\r\n\t\t\t\t\t\t esr_from_name,\r\n\t\t\t\t\t\t esr_from_email_address,\r\n\t\t\t\t\t\t esr_subject,\r\n\t\t\t\t\t\t esr_content,\r\n\t\t\t\t\t\t esr_plain_text,\r\n\t\t\t\t\t\t payment_enable_merchant,\r\n\t\t\t\t\t\t payment_merchant_type,\r\n\t\t\t\t\t\t ifnull(payment_paypal_email,'') payment_paypal_email,\r\n\t\t\t\t\t\t payment_paypal_language,\r\n\t\t\t\t\t\t payment_currency,\r\n\t\t\t\t\t\t payment_show_total,\r\n\t\t\t\t\t\t payment_total_location,\r\n\t\t\t\t\t\t payment_enable_recurring,\r\n\t\t\t\t\t\t payment_recurring_cycle,\r\n\t\t\t\t\t\t payment_recurring_unit,\r\n\t\t\t\t\t\t payment_price_type,\r\n\t\t\t\t\t\t payment_price_amount,\r\n\t\t\t\t\t\t payment_price_name\r\n\t\t\t\t     from \r\n\t\t\t\t     \t `" . MF_TABLE_PREFIX . "forms` \r\n\t\t\t\t    where \r\n\t\t\t\t    \t form_id=?";
    $params = array($form_id);
    $sth = mf_do_query($query, $params, $dbh);
    $row = mf_do_fetch_result($sth);
    if (!empty($row['form_redirect_enable'])) {
        $form_redirect = $row['form_redirect'];
    }
    $form_unique_ip = $row['form_unique_ip'];
    $form_email = $row['form_email'];
    $form_captcha = $row['form_captcha'];
    $form_captcha_type = $row['form_captcha_type'];
    $form_review = $row['form_review'];
    $form_page_total = $row['form_page_total'];
    $form_name = $row['form_name'];
    $user_ip_address = $_SERVER['REMOTE_ADDR'];
    $esl_enable = $row['esl_enable'];
    $esl_from_name = $row['esl_from_name'];
    $esl_from_email_address = $row['esl_from_email_address'];
    $esl_subject = $row['esl_subject'];
    $esl_content = $row['esl_content'];
    $esl_plain_text = $row['esl_plain_text'];
    $esr_enable = $row['esr_enable'];
    $esr_email_address = $row['esr_email_address'];
    $esr_from_name = $row['esr_from_name'];
    $esr_from_email_address = $row['esr_from_email_address'];
    $esr_subject = $row['esr_subject'];
    $esr_content = $row['esr_content'];
    $esr_plain_text = $row['esr_plain_text'];
    $payment_enable_merchant = (int) $row['payment_enable_merchant'];
    if ($payment_enable_merchant < 1) {
        $payment_enable_merchant = 0;
    }
    $payment_merchant_type = $row['payment_merchant_type'];
    $payment_paypal_email = $row['payment_paypal_email'];
    $payment_paypal_language = $row['payment_paypal_language'];
    $payment_currency = $row['payment_currency'];
    $payment_show_total = (int) $row['payment_show_total'];
    $payment_total_location = $row['payment_total_location'];
    $payment_enable_recurring = (int) $row['payment_enable_recurring'];
    $payment_recurring_cycle = (int) $row['payment_recurring_cycle'];
    $payment_recurring_unit = $row['payment_recurring_unit'];
    $payment_price_type = $row['payment_price_type'];
    $payment_price_amount = (double) $row['payment_price_amount'];
    $payment_price_name = $row['payment_price_name'];
    //if the user is saving a form to resume later, we need to discard all validation errors
    if (!empty($input['generate_resume_url']) && !empty($row['form_resume_enable']) && $form_page_total > 1) {
        $is_saving_form_resume = true;
        $error_elements = array();
    } else {
        $is_saving_form_resume = false;
    }
    $process_result['form_redirect'] = $form_redirect;
    $process_result['old_values'] = $form_data;
    $process_result['error_elements'] = $error_elements;
    //if this is edit_entry page, unique ip address validation should be bypassed
    $check_unique_ip = false;
    if (!empty($edit_id) && $_SESSION['mf_logged_in'] === true) {
        $check_unique_ip = false;
    } else {
        if (!empty($form_unique_ip)) {
            $check_unique_ip = true;
        }
    }
    //check for ip address
    if ($check_unique_ip === true) {
        //if ip address checking enabled, compare user ip address with value in db
        $query = "select count(id) total_ip from `" . MF_TABLE_PREFIX . "form_{$form_id}` where ip_address=?";
        $params = array($user_ip_address);
        $sth = mf_do_query($query, $params, $dbh);
        $row = mf_do_fetch_result($sth);
        if (!empty($row['total_ip'])) {
            $process_result['custom_error'] = 'Sorry, but this form is limited to one submission per user.';
        }
    }
    if (!empty($_SESSION['edit_entry']['form_id']) && $_SESSION['edit_entry']['form_id'] === $form_id) {
        //when editing an entry, the captcha shouldn't be checked
        $is_bypass_captcha = true;
    } else {
        if (!empty($_SESSION['captcha_passed'][$form_id]) && $_SESSION['captcha_passed'][$form_id] === true) {
            //if the user already validated the captcha once for that session (e.g. on multi-page form), no need to check it again
            $is_bypass_captcha = true;
        } else {
            $is_bypass_captcha = false;
        }
    }
    //check for captcha if enabled and there is no errors from previous fields
    //on multipage form, captcha should be validated on the last page only
    if (!empty($form_captcha) && empty($error_elements) && $is_bypass_captcha !== true) {
        if ($form_page_total == 1 || $form_page_total == $page_number) {
            if ($form_captcha_type == 'i') {
                //if simple image captcha is being used
                if (!empty($_POST['captcha_response_field'])) {
                    $captcha_response_field = trim($_POST['captcha_response_field']);
                    if (PhpCaptcha::Validate($captcha_response_field) !== true) {
                        $error_elements['element_captcha'] = 'incorrect-captcha-sol';
                        $process_result['error_elements'] = $error_elements;
                    } else {
                        //captcha succesfully validated
                        //set a session variable, so that the user won't need to fill it again, if this is a multi-page form
                        $_SESSION['captcha_passed'][$form_id] = true;
                    }
                } else {
                    //user not entered the words at all
                    $error_elements['element_captcha'] = 'el-required';
                    $process_result['error_elements'] = $error_elements;
                }
            } else {
                if ($form_captcha_type == 't') {
                    //if simple text captcha is being used
                    if (!empty($_POST['captcha_response_field'])) {
                        $captcha_response_field = strtolower(trim($_POST['captcha_response_field']));
                        if ($captcha_response_field != strtolower($_SESSION['MF_TEXT_CAPTCHA_ANSWER'])) {
                            $error_elements['element_captcha'] = 'incorrect-text-captcha-sol';
                            $process_result['error_elements'] = $error_elements;
                        } else {
                            unset($_SESSION['MF_TEXT_CAPTCHA_ANSWER']);
                            //captcha succesfully validated
                            //set a session variable, so that the user won't need to fill it again, if this is a multi-page form
                            $_SESSION['captcha_passed'][$form_id] = true;
                        }
                    } else {
                        //user not entered the words at all
                        $error_elements['element_captcha'] = 'el-text-required';
                        $process_result['error_elements'] = $error_elements;
                    }
                } else {
                    if ($form_captcha_type == 'r') {
                        //otherwise reCaptcha is being used
                        if (!empty($_POST['recaptcha_response_field'])) {
                            $recaptcha_response = recaptcha_check_answer(RECAPTCHA_PRIVATE_KEY, $user_ip_address, $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
                            if ($recaptcha_response !== false) {
                                //if false, then we can't connect to captcha server, bypass captcha checking
                                if ($recaptcha_response->is_valid === false) {
                                    $error_elements['element_captcha'] = $recaptcha_response->error;
                                    $process_result['error_elements'] = $error_elements;
                                } else {
                                    //captcha succesfully validated
                                    //set a session variable, so that the user won't need to fill it again, if this is a multi-page form
                                    $_SESSION['captcha_passed'][$form_id] = true;
                                }
                            }
                        } else {
                            //user not entered the words at all
                            $error_elements['element_captcha'] = 'el-required';
                            $process_result['error_elements'] = $error_elements;
                        }
                    }
                }
            }
        }
    }
    //if the 'previous' button being clicked, we need to discard any validation errors
    if (!empty($input['submit_secondary']) || !empty($input['submit_secondary_x'])) {
        $process_result['error_elements'] = '';
        $process_result['custom_error'] = '';
        $error_elements = array();
    }
    //insert ip address and date created
    $table_data['ip_address'] = $user_ip_address;
    $table_data['date_created'] = date("Y-m-d H:i:s");
    $is_inserted = false;
    //start insert data into table ----------------------
    //dynamically create the field list and field values, based on the input given
    if (!empty($table_data) && empty($error_elements) && empty($process_result['custom_error'])) {
        $has_value = false;
        $field_list = '';
        $field_values = '';
        foreach ($table_data as $key => $value) {
            if ($value == '') {
                //don't insert blank entry
                continue;
            }
            $field_list .= "`{$key}`,";
            $field_values .= ":{$key},";
            $params_table_data[':' . $key] = $value;
            if (!empty($value)) {
                $has_value = true;
            }
        }
        //add session_id to query if 'form review' enabled or this is multipage forms
        if (!empty($form_review) || $form_page_total > 1) {
            //save previously uploaded file list, so users don't need to reupload files
            //get all file uploads elements first
            $session_id = session_id();
            $file_uploads_array = array();
            $query = "SELECT \r\n\t\t\t\t\t\t\t\t\telement_id \r\n\t\t\t\t\t\t\t\tFROM \r\n\t\t\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "form_elements \r\n\t\t\t\t\t\t\t   WHERE \r\n\t\t\t\t\t\t\t   \t\tform_id=? AND \r\n\t\t\t\t\t\t\t   \t\telement_type='file' AND \r\n\t\t\t\t\t\t\t   \t\telement_is_private=0";
            $params = array($form_id);
            $sth = mf_do_query($query, $params, $dbh);
            while ($row = mf_do_fetch_result($sth)) {
                $file_uploads_array[] = 'element_' . $row['element_id'];
            }
            $file_uploads_column = implode('`,`', $file_uploads_array);
            $file_uploads_column = '`' . $file_uploads_column . '`';
            if (!empty($file_uploads_array)) {
                if (!empty($_SESSION['review_id'])) {
                    //if this is single page form and has review enabled
                    $query = "SELECT {$file_uploads_column} FROM `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where id=?";
                    $params = array($_SESSION['review_id']);
                } elseif ($form_page_total > 1) {
                    //if this is multi page form
                    $query = "SELECT {$file_uploads_column} FROM `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where session_id=?";
                    $params = array($session_id);
                }
                $sth = mf_do_query($query, $params, $dbh);
                $row = mf_do_fetch_result($sth);
                foreach ($file_uploads_array as $element_name) {
                    if (!empty($row[$element_name])) {
                        $uploaded_file_lookup[$element_name] = $row[$element_name];
                    }
                }
            }
            //add session_id to query if 'form review' enabled
            $field_list .= "`session_id`,";
            $field_values .= ":session_id,";
            $params_table_data[':session_id'] = $session_id;
        }
        if ($has_value) {
            //if blank form submitted, dont insert anything
            //start insert query ----------------------------------------
            $field_list = substr($field_list, 0, -1);
            $field_values = substr($field_values, 0, -1);
            if (!empty($edit_id) && $_SESSION['mf_logged_in'] === true) {
                //if this is edit_entry page submission, update the table
                $update_values = '';
                $params_update = array();
                unset($table_data['date_created']);
                $table_data['date_updated'] = date("Y-m-d H:i:s");
                foreach ($table_data as $key => $value) {
                    $update_values .= "`{$key}`=:{$key},";
                    $params_update[':' . $key] = $value;
                }
                $params_update[':id'] = $edit_id;
                $update_values = substr($update_values, 0, -1);
                $query = "UPDATE `" . MF_TABLE_PREFIX . "form_{$form_id}` set \r\n\t\t\t\t\t\t\t\t\t\t\t\t{$update_values}\r\n\t\t\t\t\t\t\t\t\t\t  where \r\n\t\t\t\t\t\t\t\t\t  \t  \t\t`id`=:id;";
                mf_do_query($query, $params_update, $dbh);
                $record_insert_id = $edit_id;
            } else {
                //insert to temporary table, if form review is enabled or this is multipage form
                if (!empty($form_review) || $form_page_total > 1) {
                    if ($form_page_total > 1) {
                        //if this is the first page and the first time being submitted, do insert table
                        //otherwise, do update table
                        $do_review_insert = false;
                        if ($input['page_number'] == 1) {
                            $session_id = session_id();
                            $query = "SELECT count(`id`) as total_row from " . MF_TABLE_PREFIX . "form_{$form_id}_review where session_id=?";
                            $params = array($session_id);
                            $sth = mf_do_query($query, $params, $dbh);
                            $row = mf_do_fetch_result($sth);
                            if ($row['total_row'] == 0) {
                                $do_review_insert = true;
                            }
                        }
                        //if this is the first page, do insert
                        if ($do_review_insert) {
                            $query = "INSERT INTO `" . MF_TABLE_PREFIX . "form_{$form_id}_review` ({$field_list}) VALUES ({$field_values});";
                            mf_do_query($query, $params_table_data, $dbh);
                            $record_insert_id = (int) $dbh->lastInsertId();
                        } else {
                            //otherwise, do update
                            //dynamically create the sql update string, based on the input given
                            $update_values = '';
                            $params_update = array();
                            foreach ($table_data as $key => $value) {
                                $update_values .= "`{$key}`=:{$key},";
                                $params_update[':' . $key] = $value;
                            }
                            $update_values = substr($update_values, 0, -1);
                            $params_update[':session_id'] = $session_id;
                            $query = "UPDATE `" . MF_TABLE_PREFIX . "form_{$form_id}_review` set \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{$update_values}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  where \r\n\t\t\t\t\t\t\t\t\t\t\t\t  \t  \t\tsession_id=:session_id;";
                            mf_do_query($query, $params_update, $dbh);
                            $query = "SELECT `id` from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where session_id=?";
                            $params = array($session_id);
                            $sth = mf_do_query($query, $params, $dbh);
                            $row = mf_do_fetch_result($sth);
                            $record_insert_id = $row['id'];
                            //if this is the last page of the form, check if form review enabled or not
                            //if enabled, simply get the record_insert_id and send it as review_id
                            //otherwise, commit form review
                            if ($input['page_number'] == $form_page_total && (!empty($input['submit_primary']) || !empty($input['submit_primary_x'])) && !$is_saving_form_resume) {
                                if (!empty($form_review)) {
                                    //pass the current page number, so the user could go back from the preview page
                                    $process_result['origin_page_number'] = $input['page_number'];
                                } else {
                                    $query = "SELECT `id` from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where session_id=?";
                                    $params = array($session_id);
                                    $sth = mf_do_query($query, $params, $dbh);
                                    $row = mf_do_fetch_result($sth);
                                    $commit_options = array();
                                    $commit_options['send_notification'] = false;
                                    $commit_result = mf_commit_form_review($dbh, $form_id, $row['id'], $commit_options);
                                    $record_insert_id = $commit_result['record_insert_id'];
                                    $is_committed = true;
                                    $process_result['entry_id'] = $record_insert_id;
                                    $_SESSION['mf_form_completed'][$form_id] = true;
                                }
                            }
                        }
                    } else {
                        $query = "SELECT `id` from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where session_id=?";
                        $params = array($session_id);
                        $sth = mf_do_query($query, $params, $dbh);
                        $row = mf_do_fetch_result($sth);
                        $record_insert_id = $row['id'];
                        if (empty($record_insert_id)) {
                            $query = "INSERT INTO `" . MF_TABLE_PREFIX . "form_{$form_id}_review` ({$field_list}) VALUES ({$field_values});";
                            mf_do_query($query, $params_table_data, $dbh);
                            $record_insert_id = (int) $dbh->lastInsertId();
                        } else {
                            $update_values = '';
                            $params_update = array();
                            foreach ($table_data as $key => $value) {
                                $update_values .= "`{$key}`=:{$key},";
                                $params_update[':' . $key] = $value;
                            }
                            $params_update[':id'] = $record_insert_id;
                            $update_values = substr($update_values, 0, -1);
                            $query = "UPDATE `" . MF_TABLE_PREFIX . "form_{$form_id}_review` set \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{$update_values}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  where \r\n\t\t\t\t\t\t\t\t\t\t\t\t  \t  \t\t`id`=:id;";
                            mf_do_query($query, $params_update, $dbh);
                        }
                    }
                } else {
                    $query = "INSERT INTO `" . MF_TABLE_PREFIX . "form_{$form_id}` ({$field_list}) VALUES ({$field_values});";
                    mf_do_query($query, $params_table_data, $dbh);
                    $record_insert_id = (int) $dbh->lastInsertId();
                }
            }
            //end insert query ------------------------------------------
            $is_inserted = true;
        }
    }
    //end insert data into table -------------------------
    //upload the files
    $write_to_permanent_file = false;
    $write_to_temporary_file = false;
    if ($is_inserted) {
        if (!empty($edit_id) && $_SESSION['mf_logged_in'] === true) {
            //if this ie edit_entry page, always write to permanent file
            $write_to_permanent_file = true;
        } else {
            if ($form_page_total <= 1) {
                //if this is single page form
                if (empty($form_review)) {
                    //if review disabled, upload the files into permanent filename
                    $write_to_permanent_file = true;
                } else {
                    //if this single form has review enabled
                    $write_to_temporary_file = true;
                }
            } else {
                //if this is multipage form
                if ($input['page_number'] == $form_page_total && (!empty($input['submit_primary']) || !empty($input['submit_primary_x'])) && $is_committed) {
                    $write_to_permanent_file = true;
                } else {
                    $write_to_temporary_file = true;
                }
            }
        }
    }
    if ($write_to_permanent_file === true) {
        //START writing into permanent file ------------------------
        //within one form, it is possible to use a mix of standard file upload field and the advanced/ajax uploader
        //we need to be able processing both at the same time
        //if files were uploaded using standard file upload fields
        if (!empty($uploaded_files)) {
            foreach ($uploaded_files as $element_name) {
                $file_token = md5(uniqid(rand(), true));
                //add random token to uploaded filename, to increase security
                //move file and check for invalid file
                $destination_file = $input['machform_data_path'] . $mf_settings['upload_dir'] . "/form_{$form_id}/files/{$element_name}_{$file_token}-{$record_insert_id}-{$_FILES[$element_name]['name']}";
                $destination_file = mf_sanitize($destination_file);
                if (move_uploaded_file($_FILES[$element_name]['tmp_name'], $destination_file)) {
                    $query = "update " . MF_TABLE_PREFIX . "form_{$form_id} set {$element_name}=? where id=?";
                    $file_element = "{$element_name}_{$file_token}-{$record_insert_id}-{$_FILES[$element_name]['name']}";
                    $file_element = mf_sanitize($file_element);
                    $params = array($file_element, $record_insert_id);
                    mf_do_query($query, $params, $dbh);
                }
            }
        }
        //if files were uploaded using advance uploader
        if (!empty($uploaded_files_advance)) {
            if (!empty($edit_id) && $_SESSION['mf_logged_in'] === true) {
                //if this is edit_entry, we need to get existing file records and merge the data with the new uploaded files
                $uploaded_element_names = array();
                $uploaded_element_ids = array_keys($uploaded_files_advance);
                foreach ($uploaded_element_ids as $element_id) {
                    $uploaded_element_names[] = 'element_' . $element_id;
                }
                $uploaded_element_names_joined = implode(',', $uploaded_element_names);
                $query = "SELECT {$uploaded_element_names_joined} from `" . MF_TABLE_PREFIX . "form_{$form_id}` where `id`=?";
                $params = array($edit_id);
                $sth = mf_do_query($query, $params, $dbh);
                $row = mf_do_fetch_result($sth);
                $existing_files_data = array();
                $multi_upload_info = array();
                foreach ($uploaded_element_names as $element_name) {
                    $existing_files_data[$element_name] = trim($row[$element_name]);
                    $element_name_exploded = explode('_', $element_name);
                    $multi_upload_info[$element_name] = $element_info[$element_name_exploded[1]]['file_enable_multi_upload'];
                }
            }
            //loop through each list
            foreach ($uploaded_files_advance as $element_id => $values) {
                $current_listfile_name = $values['listfile_name'];
                $current_listfile_content = $values['listfile_content'];
                $file_list_array = array();
                foreach ($current_listfile_content as $tmp_filename_path) {
                    $tmp_filename_only = basename($tmp_filename_path);
                    $filename_value = substr($tmp_filename_only, strpos($tmp_filename_only, '-') + 1);
                    $filename_value = str_replace('|', '', str_replace('.tmp', '', $filename_value));
                    $new_file_token = md5(uniqid(rand(), true));
                    //add random token to uploaded filename, to increase security
                    $new_filename = "element_{$element_id}_{$new_file_token}-{$record_insert_id}-{$filename_value}";
                    $destination_filename = $input['machform_data_path'] . $mf_settings['upload_dir'] . "/form_{$form_id}/files/" . $new_filename;
                    //remove tmp name and change it into permanent name
                    //store all the permanent name into a variable
                    if (file_exists($tmp_filename_path)) {
                        rename($tmp_filename_path, $destination_filename);
                    }
                    $file_list_array[] = $new_filename;
                }
                //delete the listfile for the current element_id
                unlink($current_listfile_name);
                //update the table with the file name list
                if (!empty($edit_id) && $_SESSION['mf_logged_in'] === true) {
                    //if this is edit_entry, we need to get existing file records and merge the data with the new uploaded files
                    //which depends on the multi upload setting for each file upload field
                    //if multi upload enabled, we need to merge the data. otherwise, replace the old data
                    if (!empty($multi_upload_info['element_' . $element_id])) {
                        //if multi upload enabled, merge the data
                        $new_files_array = $file_list_array;
                        if (!empty($existing_files_data['element_' . $element_id])) {
                            $old_files_array = explode('|', $existing_files_data['element_' . $element_id]);
                            $merged_files_array = array_merge($new_files_array, $old_files_array);
                            $merged_files_array = array_unique($merged_files_array);
                        } else {
                            $merged_files_array = $new_files_array;
                        }
                        $file_list_joined[$element_id] = implode('|', $merged_files_array);
                    } else {
                        //replace the old data with the new file
                        $file_list_joined[$element_id] = implode('|', $file_list_array);
                    }
                } else {
                    $file_list_joined[$element_id] = implode('|', $file_list_array);
                }
            }
            //update the table with the file name list
            $update_values = '';
            $params_update = array();
            foreach ($file_list_joined as $element_id => $file_joined) {
                $file_joined = mf_sanitize($file_joined);
                $update_values .= "element_{$element_id}=:element_{$element_id},";
                $params_update[':element_' . $element_id] = $file_joined;
            }
            $update_values = rtrim($update_values, ',');
            $params_update[':id'] = $record_insert_id;
            $query = "update " . MF_TABLE_PREFIX . "form_{$form_id} set {$update_values} where id=:id";
            mf_do_query($query, $params_update, $dbh);
        }
        //END writing into permanent file ------------------------
    } else {
        if ($write_to_temporary_file === true) {
            //START writing into temporary file ------------------------
            //if files were uploaded using standard file upload fields
            if (!empty($uploaded_files)) {
                $record_review_id = session_id();
                foreach ($uploaded_files as $element_name) {
                    $file_token = md5(uniqid(rand(), true));
                    //add random token to uploaded filename, to increase security
                    //move file and check for invalid file
                    $destination_file = $input['machform_data_path'] . $mf_settings['upload_dir'] . "/form_{$form_id}/files/{$element_name}_{$file_token}-{$record_insert_id}-{$_FILES[$element_name]['name']}.tmp";
                    $destination_file = mf_sanitize($destination_file);
                    if (move_uploaded_file($_FILES[$element_name]['tmp_name'], $destination_file)) {
                        $query = "update " . MF_TABLE_PREFIX . "form_{$form_id}_review set {$element_name}=? where session_id=?";
                        $file_element = "{$element_name}_{$file_token}-{$record_insert_id}-{$_FILES[$element_name]['name']}";
                        $file_element = mf_sanitize($file_element);
                        $params = array($file_element, $record_review_id);
                        mf_do_query($query, $params, $dbh);
                    }
                    if (!empty($uploaded_file_lookup[$element_name])) {
                        unset($uploaded_file_lookup[$element_name]);
                    }
                }
            }
            //if files were uploaded using advance uploader
            if (!empty($uploaded_files_advance)) {
                //loop through each list
                foreach ($uploaded_files_advance as $element_id => $values) {
                    $current_listfile_name = $values['listfile_name'];
                    $current_listfile_content = $values['listfile_content'];
                    $file_list_array = array();
                    foreach ($current_listfile_content as $tmp_filename_path) {
                        $tmp_filename_only = basename($tmp_filename_path);
                        $filename_value = substr($tmp_filename_only, strpos($tmp_filename_only, '-') + 1);
                        $filename_value = str_replace('|', '', str_replace('.tmp', '', $filename_value));
                        $new_file_token = md5(uniqid(rand(), true));
                        //add random token to uploaded filename, to increase security
                        $new_filename = "element_{$element_id}_{$new_file_token}-{$record_insert_id}-{$filename_value}";
                        $destination_filename = $input['machform_data_path'] . $mf_settings['upload_dir'] . "/form_{$form_id}/files/" . $new_filename . ".tmp";
                        //assign new temporary name, using new token and record id
                        //store all the temporary name into a variable
                        if (file_exists($tmp_filename_path)) {
                            rename($tmp_filename_path, $destination_filename);
                        }
                        $file_list_array[] = $new_filename;
                    }
                    //delete the listfile for the current element_id
                    unlink($current_listfile_name);
                    //update the table with the file name list
                    $file_list_joined[$element_id] = implode('|', $file_list_array);
                }
                //update the table with the file name list
                $update_values = '';
                $params_update = array();
                foreach ($file_list_joined as $element_id => $file_joined) {
                    $file_joined = mf_sanitize($file_joined);
                    $update_values .= "element_{$element_id}=:element_{$element_id},";
                    $params_update[':element_' . $element_id] = $file_joined;
                }
                $update_values = rtrim($update_values, ',');
                $params_update[':id'] = $record_insert_id;
                $query = "update " . MF_TABLE_PREFIX . "form_{$form_id}_review set {$update_values} where id=:id";
                mf_do_query($query, $params_update, $dbh);
            }
            //if the user goes to review page and then go back to the form page or navigate within multipage form, $uploaded_file_lookup will contain the list of the previously submitted files
            //if the multi upload option enabled, make sure to update the previouly uploaded file to the current record during form submit
            //when updating the table, make sure to MERGE existing data within the table and the new one
            //otherwise, if the multi upload is not enabled, we need to delete previous files and don't update the table with the old files data
            if (!empty($uploaded_file_lookup)) {
                //get the existing data within the table
                $uploaded_element_names = array_keys($uploaded_file_lookup);
                $uploaded_element_names_joined = implode(',', $uploaded_element_names);
                $query = "SELECT {$uploaded_element_names_joined} from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where `id`=?";
                $params = array($record_insert_id);
                $sth = mf_do_query($query, $params, $dbh);
                $row = mf_do_fetch_result($sth);
                $existing_files_data = array();
                $multi_upload_info = array();
                foreach ($uploaded_element_names as $element_name) {
                    $existing_files_data[$element_name] = $row[$element_name];
                    $element_name_exploded = explode('_', $element_name);
                    $multi_upload_info[$element_name] = $element_info[$element_name_exploded[1]]['file_enable_multi_upload'];
                }
                //merge the data
                foreach ($uploaded_file_lookup as $element_name => $filename) {
                    $new_files_array = array();
                    $old_files_array = array();
                    $new_files_array = explode('|', $filename);
                    $old_files_array = explode('|', $existing_files_data[$element_name]);
                    if (!empty($multi_upload_info[$element_name])) {
                        //if multi upload enabled, merge the data
                        $merged_files_array = array_merge($new_files_array, $old_files_array);
                        $merged_files_array = array_unique($merged_files_array);
                    } else {
                        //otherwise, just use the new one
                        $merged_files_array = $old_files_array;
                        //delete the old files as well, if the files aren't the same with the new one
                        if ($filename != $existing_files_data[$element_name]) {
                            foreach ($new_files_array as $filename) {
                                $filename = $input['machform_data_path'] . $mf_settings['upload_dir'] . "/form_{$form_id}/files/{$filename}.tmp";
                                if (file_exists($filename)) {
                                    unlink($filename);
                                }
                            }
                        }
                    }
                    $merged_files_joined = implode('|', $merged_files_array);
                    $merged_files_data[$element_name] = $merged_files_joined;
                }
                $update_clause = '';
                foreach ($merged_files_data as $element_name => $filename) {
                    $filename = addslashes(mf_sanitize($filename));
                    $update_clause .= "`{$element_name}`='{$filename}',";
                }
                $update_clause = rtrim($update_clause, ",");
                $query = "UPDATE `" . MF_TABLE_PREFIX . "form_{$form_id}_review` SET {$update_clause} WHERE id=?";
                $params = array($record_insert_id);
                mf_do_query($query, $params, $dbh);
            }
            //END writing into temporary file ------------------------
        }
    }
    //process any rules to skip pages, if this functionality is being enabled
    $process_result['logic_page_enable'] = false;
    if ($is_inserted === true && $is_edit_page === false && $is_saving_form_resume === false && !empty($logic_page_enable)) {
        //if the back button being clicked, don't evaluate the logic conditions
        //simply get the previous page from the array
        if (!empty($input['submit_secondary']) || !empty($input['submit_secondary_x'])) {
            $pages_history = array();
            $pages_history = $_SESSION['mf_pages_history'][$form_id];
            $page_number_array_index = array_search($page_number, $pages_history);
            $previous_page_number = $pages_history[$page_number_array_index - 1];
            $process_result['logic_page_enable'] = true;
            $process_result['target_page_id'] = $previous_page_number;
        } else {
            //submit/continue button being clicked
            //get all the destination pages from ap_page_logic
            //only get pages with larger page number. the skip page logic can't move backward
            $query = "SELECT \r\n\t\t\t\t\t\t\t\tpage_id,\r\n\t\t\t\t\t\t\t\trule_all_any \r\n\t\t\t\t\t\t\tFROM \r\n\t\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "page_logic \r\n\t\t\t\t\t\t   WHERE \r\n\t\t\t\t\t\t\t\tform_id = ? and (page_id > ? or page_id in('payment','review','success'))  \r\n\t\t\t\t\t\tORDER BY \r\n\t\t\t\t\t\t\t\tpage_id asc";
            $params = array($form_id, $page_number);
            $sth = mf_do_query($query, $params, $dbh);
            $page_logic_array = array();
            $i = 0;
            while ($row = mf_do_fetch_result($sth)) {
                $page_logic_array[$i]['page_id'] = $row['page_id'];
                $page_logic_array[$i]['rule_all_any'] = $row['rule_all_any'];
                $i++;
            }
            //evaluate the condition for each destination page
            //once a condition results true, break the loop and send the result
            if (!empty($page_logic_array)) {
                foreach ($page_logic_array as $value) {
                    $target_page_id = $value['page_id'];
                    $rule_all_any = $value['rule_all_any'];
                    $current_page_conditions_status = array();
                    $query = "SELECT \r\n\t\t\t\t\t\t\t\t\t\telement_name,\r\n\t\t\t\t\t\t\t\t\t\trule_condition,\r\n\t\t\t\t\t\t\t\t\t\trule_keyword \r\n\t\t\t\t\t\t\t\t\tFROM \r\n\t\t\t\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "page_logic_conditions \r\n\t\t\t\t\t\t\t\t   WHERE \r\n\t\t\t\t\t\t\t\t   \t\tform_id = ? AND target_page_id = ?";
                    $params = array($form_id, $target_page_id);
                    $sth = mf_do_query($query, $params, $dbh);
                    while ($row = mf_do_fetch_result($sth)) {
                        $condition_params = array();
                        $condition_params['form_id'] = $form_id;
                        $condition_params['element_name'] = $row['element_name'];
                        $condition_params['rule_condition'] = $row['rule_condition'];
                        $condition_params['rule_keyword'] = $row['rule_keyword'];
                        $current_page_conditions_status[] = mf_get_condition_status_from_table($dbh, $condition_params);
                    }
                    if ($rule_all_any == 'all') {
                        if (in_array(false, $current_page_conditions_status)) {
                            $all_conditions_status = false;
                        } else {
                            $all_conditions_status = true;
                        }
                    } else {
                        if ($rule_all_any == 'any') {
                            if (in_array(true, $current_page_conditions_status)) {
                                $all_conditions_status = true;
                            } else {
                                $all_conditions_status = false;
                            }
                        }
                    }
                    if ($all_conditions_status === true) {
                        //all conditions for this target page has been met, break the loop and send it to $process_result
                        $process_result['logic_page_enable'] = true;
                        $process_result['target_page_id'] = $target_page_id;
                        //allow access to the next destination page
                        if (is_numeric($target_page_id)) {
                            $_SESSION['mf_form_access'][$form_id][$target_page_id] = true;
                        } else {
                            if ($target_page_id == 'review') {
                                $process_result['review_id'] = $record_insert_id;
                                $process_result['origin_page_number'] = $input['page_number'];
                            } else {
                                if ($target_page_id == 'payment' || $target_page_id == 'success') {
                                    //if the destination is payment page or success page, we need to commit the data first
                                    $commit_options = array();
                                    if ($delay_notifications) {
                                        $commit_options['send_notification'] = false;
                                    }
                                    $session_id = session_id();
                                    $query = "SELECT `id` from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where session_id=?";
                                    $params = array($session_id);
                                    $sth = mf_do_query($query, $params, $dbh);
                                    $row = mf_do_fetch_result($sth);
                                    $commit_result = mf_commit_form_review($dbh, $form_id, $row['id'], $commit_options);
                                    $process_result['entry_id'] = $commit_result['record_insert_id'];
                                    if ($target_page_id == 'success') {
                                        $_SESSION['mf_form_completed'][$form_id] = true;
                                        $bypass_merchant_redirect_url = true;
                                    }
                                }
                            }
                        }
                        break;
                    }
                }
                //end foreach page_logic_array
            }
        }
    }
    //start sending notification email to admin ------------------------------------------
    if ($is_inserted && !empty($esl_enable) && !empty($form_email) && empty($form_review) && $form_page_total == 1 && empty($edit_id) && $delay_notifications === false || $is_inserted && !empty($esl_enable) && !empty($form_email) && $is_committed && empty($edit_id) && $delay_notifications === false) {
        //get parameters for the email
        //from name
        if (!empty($esl_from_name)) {
            if (is_numeric($esl_from_name)) {
                $admin_email_param['from_name'] = '{element_' . $esl_from_name . '}';
            } else {
                $admin_email_param['from_name'] = $esl_from_name;
            }
        } else {
            $admin_email_param['from_name'] = 'MachForm';
        }
        //from email address
        if (!empty($esl_from_email_address)) {
            if (is_numeric($esl_from_email_address)) {
                $admin_email_param['from_email'] = '{element_' . $esl_from_email_address . '}';
            } else {
                $admin_email_param['from_email'] = $esl_from_email_address;
            }
        } else {
            $domain = str_replace('www.', '', $_SERVER['SERVER_NAME']);
            $admin_email_param['from_email'] = "no-reply@{$domain}";
        }
        //subject
        if (!empty($esl_subject)) {
            $admin_email_param['subject'] = $esl_subject;
        } else {
            $admin_email_param['subject'] = '{form_name} [#{entry_no}]';
        }
        //content
        if (!empty($esl_content)) {
            $admin_email_param['content'] = $esl_content;
        } else {
            $admin_email_param['content'] = '{entry_data}';
        }
        $admin_email_param['as_plain_text'] = $esl_plain_text;
        $admin_email_param['target_is_admin'] = true;
        $admin_email_param['machform_base_path'] = $input['machform_base_path'];
        $admin_email_param['check_hook_file'] = true;
        mf_send_notification($dbh, $form_id, $record_insert_id, $form_email, $admin_email_param);
    }
    //end emailing notifications to admin ----------------------------------------------
    //start sending notification email to user ------------------------------------------
    if ($is_inserted && !empty($esr_enable) && !empty($esr_email_address) && empty($form_review) && $form_page_total == 1 && empty($edit_id) && $delay_notifications === false || $is_inserted && !empty($esr_enable) && !empty($esr_email_address) && $is_committed && empty($edit_id) && $delay_notifications === false) {
        //get parameters for the email
        //to email
        if (is_numeric($esr_email_address)) {
            $esr_email_address = '{element_' . $esr_email_address . '}';
        }
        //from name
        if (!empty($esr_from_name)) {
            if (is_numeric($esr_from_name)) {
                $user_email_param['from_name'] = '{element_' . $esr_from_name . '}';
            } else {
                $user_email_param['from_name'] = $esr_from_name;
            }
        } else {
            $user_email_param['from_name'] = 'MachForm';
        }
        //from email address
        if (!empty($esr_from_email_address)) {
            if (is_numeric($esr_from_email_address)) {
                $user_email_param['from_email'] = '{element_' . $esr_from_email_address . '}';
            } else {
                $user_email_param['from_email'] = $esr_from_email_address;
            }
        } else {
            $domain = str_replace('www.', '', $_SERVER['SERVER_NAME']);
            $user_email_param['from_email'] = "no-reply@{$domain}";
        }
        //subject
        if (!empty($esr_subject)) {
            $user_email_param['subject'] = $esr_subject;
        } else {
            $user_email_param['subject'] = '{form_name} - Receipt';
        }
        //content
        if (!empty($esr_content)) {
            $user_email_param['content'] = $esr_content;
        } else {
            $user_email_param['content'] = '{entry_data}';
        }
        $user_email_param['as_plain_text'] = $esr_plain_text;
        $user_email_param['target_is_admin'] = false;
        $user_email_param['machform_base_path'] = $input['machform_base_path'];
        mf_send_notification($dbh, $form_id, $record_insert_id, $esr_email_address, $user_email_param);
    }
    //end emailing notifications to user ---------------------------------------------
    //if there is no error message or elements, send true as status
    if (empty($error_elements) && empty($process_result['custom_error'])) {
        $process_result['status'] = true;
        if ($form_page_total > 1) {
            //if this is multipage form
            $_SESSION['mf_form_loaded'][$form_id][$page_number] = true;
            if ($is_saving_form_resume) {
                //if the user is saving his progress instead of submitting the form
                //copy the record from review table into main form table and set the status to incomplete (status=2)
                //also generate resume url
                $has_invalid_resume_email = false;
                //validate the email address first, if the user entered invalid email address, display error message
                if (!empty($input['element_resume_email'])) {
                    $regex = '/^[A-z0-9][\\w.-]*@[A-z0-9][\\w\\-\\.]+\\.[A-z0-9]{2,6}$/';
                    $resume_email = trim($input['element_resume_email']);
                    $preg_result = preg_match($regex, $resume_email);
                    if (empty($preg_result)) {
                        $has_invalid_resume_email = true;
                        $error_elements['element_resume_email'] = $mf_lang['val_email'];
                        $process_result['status'] = false;
                        $process_result['error_elements'] = $error_elements;
                        $process_result['old_values']['element_resume_email'] = $input['element_resume_email'];
                    }
                }
                if (!$has_invalid_resume_email) {
                    //get all column name except session_id and id
                    $query = "SELECT * FROM `" . MF_TABLE_PREFIX . "form_{$form_id}_review` WHERE session_id=?";
                    $params = array($session_id);
                    $sth = mf_do_query($query, $params, $dbh);
                    $row = mf_do_fetch_result($sth);
                    $columns = array();
                    foreach ($row as $column_name => $column_data) {
                        if ($column_name != 'id' && $column_name != 'session_id') {
                            $columns[] = $column_name;
                        }
                    }
                    $columns_joined = implode("`,`", $columns);
                    $columns_joined = '`' . $columns_joined . '`';
                    //if there is no resume key, generate new one
                    if (empty($row['resume_key'])) {
                        $form_resume_key = substr(strtolower(md5(uniqid(rand(), true))), 0, 10);
                    } else {
                        $form_resume_key = $row['resume_key'];
                    }
                    //delete previous entry on ap_form_x table
                    $query = "DELETE from `" . MF_TABLE_PREFIX . "form_{$form_id}` WHERE resume_key=? and status=2";
                    $params = array($form_resume_key);
                    mf_do_query($query, $params, $dbh);
                    //copy from ap_form_x_review to ap_form_x
                    $query = "INSERT INTO `" . MF_TABLE_PREFIX . "form_{$form_id}`({$columns_joined}) SELECT {$columns_joined} from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` WHERE session_id=?";
                    $params = array($session_id);
                    mf_do_query($query, $params, $dbh);
                    $new_record_id = (int) $dbh->lastInsertId();
                    $query = "UPDATE `" . MF_TABLE_PREFIX . "form_{$form_id}` set `status`=2,resume_key='{$form_resume_key}' where `id`=?";
                    $params = array($new_record_id);
                    mf_do_query($query, $params, $dbh);
                    //delete from ap_form_x_review table
                    $query = "DELETE from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` WHERE session_id=?";
                    $params = array($session_id);
                    mf_do_query($query, $params, $dbh);
                    //pass form resume key
                    $process_result['form_resume_key'] = $form_resume_key;
                    //pass form resume url
                    $form_resume_url = $mf_settings['base_url'] . "view.php?id={$form_id}&mf_resume={$form_resume_key}";
                    $process_result['form_resume_url'] = $form_resume_url;
                    if (!empty($resume_email)) {
                        //send the resume link to the provided email
                        mf_send_resume_link($dbh, $form_name, $form_resume_url, $resume_email);
                    }
                }
            } else {
                //get the next page number and send it
                //don't send page number if this is already the last page, unless back button being clicked
                if ($input['page_number'] < $form_page_total) {
                    if (!empty($input['submit_primary']) || !empty($input['submit_primary_x'])) {
                        $process_result['next_page_number'] = $page_number + 1;
                    } elseif (!empty($input['submit_secondary']) || !empty($input['submit_secondary_x'])) {
                        $process_result['next_page_number'] = $page_number - 1;
                    } else {
                        $process_result['next_page_number'] = $page_number + 1;
                    }
                } else {
                    //if this is the last page
                    if (!empty($input['submit_primary']) || !empty($input['submit_primary_x'])) {
                        if (!empty($form_review)) {
                            $process_result['review_id'] = $record_insert_id;
                        }
                    } elseif (!empty($input['submit_secondary']) || !empty($input['submit_secondary_x'])) {
                        $process_result['next_page_number'] = $page_number - 1;
                    } else {
                        if (!empty($form_review)) {
                            $process_result['review_id'] = $record_insert_id;
                        }
                    }
                }
            }
        } else {
            //if this is single page form
            //if 'form review' enabled, send review_id
            if (!empty($form_review)) {
                $process_result['review_id'] = $record_insert_id;
            } else {
                //form submitted successfully, set the session to display success page
                $_SESSION['mf_form_completed'][$form_id] = true;
                $process_result['entry_id'] = $record_insert_id;
            }
        }
    } else {
        $process_result['status'] = false;
    }
    //get payment processor URL, if applicable for this form
    if ($process_result['status'] === true) {
        $merchant_redirect_url = mf_get_merchant_redirect_url($dbh, $form_id, $record_insert_id);
        if (!empty($merchant_redirect_url) && $bypass_merchant_redirect_url !== true) {
            $process_result['form_redirect'] = $merchant_redirect_url;
        }
    }
    return $process_result;
}
示例#2
0
$mf_settings = mf_get_settings($dbh);
//check permission, is the user allowed to access this page?
if (empty($_SESSION['mf_user_privileges']['priv_administer'])) {
    $user_perms = mf_get_user_permissions($dbh, $form_id, $_SESSION['mf_user_id']);
    //this page need edit_entries or view_entries permission
    if (empty($user_perms['edit_entries']) && empty($user_perms['view_entries'])) {
        die("Access Denied. You don't have permission to access this page.");
    }
}
//get form properties data
$query = "select \r\n\t\t\t\t\t form_redirect,\r\n\t\t\t\t\t form_language,\r\n\t\t\t\t\t form_redirect_enable,\r\n\t\t\t\t\t form_email,\r\n\t\t\t\t\t esl_enable,\r\n\t\t\t\t\t esl_from_name,\r\n\t\t\t\t\t esl_from_email_address,\r\n\t\t\t\t\t esl_subject,\r\n\t\t\t\t\t esl_content,\r\n\t\t\t\t\t esl_plain_text,\r\n\t\t\t\t\t esr_enable,\r\n\t\t\t\t\t esr_email_address,\r\n\t\t\t\t\t esr_from_name,\r\n\t\t\t\t\t esr_from_email_address,\r\n\t\t\t\t\t esr_subject,\r\n\t\t\t\t\t esr_content,\r\n\t\t\t\t\t esr_plain_text\r\n\t\t\t     from \r\n\t\t\t     \t `" . MF_TABLE_PREFIX . "forms` \r\n\t\t\t    where \r\n\t\t\t    \t form_id=?";
$params = array($form_id);
$sth = mf_do_query($query, $params, $dbh);
$row = mf_do_fetch_result($sth);
if (!empty($row['form_language'])) {
    mf_set_language($row['form_language']);
}
$esl_from_name = $row['esl_from_name'];
$esl_from_email_address = $row['esl_from_email_address'];
$esl_subject = $row['esl_subject'];
$esl_content = $row['esl_content'];
$esl_plain_text = $row['esl_plain_text'];
$esl_enable = $row['esl_enable'];
$esr_email_address = $row['esr_email_address'];
$esr_from_name = $row['esr_from_name'];
$esr_from_email_address = $row['esr_from_email_address'];
$esr_subject = $row['esr_subject'];
$esr_content = $row['esr_content'];
$esr_plain_text = $row['esr_plain_text'];
$esr_enable = $row['esr_enable'];
//get parameters for the email
示例#3
0
function mf_display_form($dbh, $form_id, $form_params = array())
{
    global $mf_lang;
    //parameters mapping
    if (isset($form_params['page_number'])) {
        $page_number = $form_params['page_number'];
    } else {
        $page_number = 1;
    }
    if (isset($form_params['populated_values'])) {
        $populated_values = $form_params['populated_values'];
    } else {
        $populated_values = array();
    }
    if (isset($form_params['error_elements'])) {
        $error_elements = $form_params['error_elements'];
    } else {
        $error_elements = array();
    }
    if (isset($form_params['custom_error'])) {
        $custom_error = $form_params['custom_error'];
    } else {
        $custom_error = '';
    }
    if (isset($form_params['edit_id'])) {
        $edit_id = (int) $form_params['edit_id'];
    } else {
        $edit_id = 0;
    }
    if (isset($form_params['integration_method'])) {
        //valid values are empty string, 'iframe' or 'php'
        $integration_method = $form_params['integration_method'];
    } else {
        $integration_method = '';
    }
    if (!empty($form_params['machform_path'])) {
        $machform_path = $form_params['machform_path'];
    } else {
        $machform_path = '';
    }
    if (!empty($form_params['machform_data_path'])) {
        $machform_data_path = $form_params['machform_data_path'];
    } else {
        $machform_data_path = '';
    }
    $mf_settings = mf_get_settings($dbh);
    //if there is custom error, don't show other errors
    if (!empty($custom_error)) {
        $error_elements = array();
    }
    //get form properties data
    $query = "SELECT \r\n\t\t\t\t\t\t form_name,\r\n\t\t\t\t\t\t form_description,\r\n\t\t\t\t\t\t form_redirect,\r\n\t\t\t\t\t\t form_success_message,\r\n\t\t\t\t\t\t form_password,\r\n\t\t\t\t\t\t form_unique_ip,\r\n\t\t\t\t\t\t form_frame_height,\r\n\t\t\t\t\t\t form_has_css,\r\n\t\t\t\t\t\t form_active,\r\n\t\t\t\t\t\t form_captcha,\r\n\t\t\t\t\t\t form_captcha_type,\r\n\t\t\t\t\t\t form_review,\r\n\t\t\t\t\t\t form_label_alignment,\r\n\t\t\t\t\t\t form_language,\r\n\t\t\t\t\t\t form_page_total,\r\n\t\t\t\t\t\t form_lastpage_title,\r\n\t\t\t\t\t\t form_submit_primary_text,\r\n\t\t\t\t\t\t form_submit_secondary_text,\r\n\t\t\t\t\t\t form_submit_primary_img,\r\n\t\t\t\t\t\t form_submit_secondary_img,\r\n\t\t\t\t\t\t form_submit_use_image,\r\n\t\t\t\t\t\t form_pagination_type,\r\n\t\t\t\t\t\t form_review_primary_text,\r\n\t\t\t\t\t\t form_review_secondary_text,\r\n\t\t\t\t\t\t form_review_primary_img,\r\n\t\t\t\t\t\t form_review_secondary_img,\r\n\t\t\t\t\t\t form_review_use_image,\r\n\t\t\t\t\t\t form_review_title,\r\n\t\t\t\t\t\t form_review_description,\r\n\t\t\t\t\t\t form_resume_enable,\r\n\t\t\t\t\t\t form_theme_id,\r\n\t\t\t\t\t\t payment_show_total,\r\n\t\t\t\t\t\t payment_total_location,\r\n\t\t\t\t\t\t payment_enable_merchant,\r\n\t\t\t\t\t\t payment_currency,\r\n\t\t\t\t\t\t payment_price_type,\r\n\t\t\t\t\t\t payment_price_amount,\r\n\t\t\t\t\t\t form_limit_enable,\r\n\t\t\t\t\t\t form_limit,\r\n\t\t\t\t\t\t form_schedule_enable,\r\n\t\t\t\t\t\t form_schedule_start_date,\r\n\t\t\t\t\t\t form_schedule_end_date,\r\n\t\t\t\t\t\t form_schedule_start_hour,\r\n\t\t\t\t\t\t form_schedule_end_hour\r\n\t\t\t\t     FROM \r\n\t\t\t\t     \t " . MF_TABLE_PREFIX . "forms \r\n\t\t\t\t    WHERE \r\n\t\t\t\t    \t form_id = ?";
    $params = array($form_id);
    $sth = mf_do_query($query, $params, $dbh);
    $row = mf_do_fetch_result($sth);
    //check for non-existent or currently drafted forms
    if (empty($row) || $row['form_active'] != 1) {
        die('This is not valid form URL.');
    }
    $form = new stdClass();
    $form->id = $form_id;
    $form->name = $row['form_name'];
    $form->description = $row['form_description'];
    $form->redirect = $row['form_redirect'];
    $form->success_message = $row['form_success_message'];
    $form->password = $row['form_password'];
    $form->frame_height = $row['form_frame_height'];
    $form->unique_ip = $row['form_unique_ip'];
    $form->has_css = $row['form_has_css'];
    $form->active = $row['form_active'];
    $form->captcha = $row['form_captcha'];
    $form->captcha_type = $row['form_captcha_type'];
    $form->review = $row['form_review'];
    $form->label_alignment = $row['form_label_alignment'];
    $form->page_total = $row['form_page_total'];
    $form->lastpage_title = $row['form_lastpage_title'];
    $form->submit_primary_text = $row['form_submit_primary_text'];
    $form->submit_secondary_text = $row['form_submit_secondary_text'];
    $form->submit_primary_img = $row['form_submit_primary_img'];
    $form->submit_secondary_img = $row['form_submit_secondary_img'];
    $form->submit_use_image = (int) $row['form_submit_use_image'];
    $form->pagination_type = $row['form_pagination_type'];
    $form->review_primary_text = $row['form_review_primary_text'];
    $form->review_secondary_text = $row['form_review_secondary_text'];
    $form->review_primary_img = $row['form_review_primary_img'];
    $form->review_secondary_img = $row['form_review_secondary_img'];
    $form->review_use_image = (int) $row['form_review_use_image'];
    $form->review_title = $row['form_review_title'];
    $form->review_description = $row['form_review_description'];
    $form->resume_enable = $row['form_resume_enable'];
    $form->theme_id = (int) $row['form_theme_id'];
    $form->payment_show_total = (int) $row['payment_show_total'];
    $form->payment_total_location = $row['payment_total_location'];
    $form->payment_enable_merchant = (int) $row['payment_enable_merchant'];
    if ($form->payment_enable_merchant < 1) {
        $form->payment_enable_merchant = 0;
    }
    $form->payment_currency = $row['payment_currency'];
    $form->payment_price_type = $row['payment_price_type'];
    $form->payment_price_amount = $row['payment_price_amount'];
    $form->limit_enable = (int) $row['form_limit_enable'];
    $form->limit = (int) $row['form_limit'];
    $form->schedule_enable = (int) $row['form_schedule_enable'];
    $form->schedule_start_date = $row['form_schedule_start_date'];
    $form->schedule_end_date = $row['form_schedule_end_date'];
    $form->schedule_start_hour = $row['form_schedule_start_hour'];
    $form->schedule_end_hour = $row['form_schedule_end_hour'];
    $form->language = trim($row['form_language']);
    if (!empty($form->language)) {
        mf_set_language($form->language);
    }
    if (empty($error_elements)) {
        $form->is_error = 0;
    } else {
        $form->is_error = 1;
    }
    if (!empty($edit_id)) {
        $form->active = 1;
    }
    if ($form->page_total == 1) {
        //if this form has review enabled and user are having $_SESSION['review_id'], then populate the form with that values
        if (!empty($form->review) && !empty($_SESSION['review_id']) && empty($populated_values)) {
            $entry_params = array();
            $entry_params['machform_data_path'] = $machform_data_path;
            $populated_values = mf_get_entry_values($dbh, $form_id, $_SESSION['review_id'], true, $entry_params);
        } elseif (!empty($form->review) && !empty($_SESSION['review_id']) && !empty($populated_values)) {
            //if form review enabled and there is some validation error, the uploaded files needs to be displayed
            $entry_params = array();
            $entry_params['machform_data_path'] = $machform_data_path;
            $populated_file_values = mf_get_entry_values($dbh, $form_id, $_SESSION['review_id'], true, $entry_params);
        }
    } else {
        //if this is multipage form, always populate the fields
        $session_id = session_id();
        //if there is form resume key, load the record from ap_form_x table to ap_form_x_review table
        if (!empty($_SESSION['mf_form_resume_key'][$form_id])) {
            $resume_key = $_SESSION['mf_form_resume_key'][$form_id];
            //first delete existing record within review table
            $query = "DELETE from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where session_id=? or resume_key=?";
            $params = array($session_id, $resume_key);
            mf_do_query($query, $params, $dbh);
            //copy data from ap_form_x table to ap_form_x_review table
            $query = "SELECT * FROM `" . MF_TABLE_PREFIX . "form_{$form_id}` WHERE resume_key=?";
            $params = array($resume_key);
            $sth = mf_do_query($query, $params, $dbh);
            $row = mf_do_fetch_result($sth);
            $columns = array();
            foreach ($row as $column_name => $column_data) {
                if ($column_name != 'id') {
                    $columns[] = $column_name;
                }
            }
            if (empty($columns)) {
                //invalid resume_key given, display error message
                $custom_error = 'Invalid Link! <br/>Please open the complete URL to resume your saved progress.';
            } else {
                $columns_joined = implode("`,`", $columns);
                $columns_joined = '`' . $columns_joined . '`';
                //copy data from main table
                $query = "INSERT INTO `" . MF_TABLE_PREFIX . "form_{$form_id}_review`({$columns_joined}) SELECT {$columns_joined} from `" . MF_TABLE_PREFIX . "form_{$form_id}` WHERE resume_key=?";
                $params = array($resume_key);
                mf_do_query($query, $params, $dbh);
                $query = "UPDATE `" . MF_TABLE_PREFIX . "form_{$form_id}_review` set session_id=? WHERE resume_key=?";
                $params = array($session_id, $resume_key);
                mf_do_query($query, $params, $dbh);
                for ($i = 1; $i <= $form->page_total; $i++) {
                    $_SESSION['mf_form_loaded'][$form_id][$i] = true;
                }
                unset($_SESSION['mf_form_resume_key'][$form_id]);
            }
        }
        $query = "SELECT `id` from `" . MF_TABLE_PREFIX . "form_{$form_id}_review` where session_id=?";
        $params = array($session_id);
        $sth = mf_do_query($query, $params, $dbh);
        $row = mf_do_fetch_result($sth);
        //we need to check mf_form_loaded to make sure default values of fields are being loaded on the first view of the form
        if (empty($populated_values) && !empty($_SESSION['mf_form_loaded'][$form_id][$page_number])) {
            $entry_params = array();
            $entry_params['machform_data_path'] = $machform_data_path;
            $populated_values = mf_get_entry_values($dbh, $form_id, $row['id'], true, $entry_params);
        } else {
            //if there is some validation error, the uploaded files needs to be displayed
            $entry_params = array();
            $entry_params['machform_data_path'] = $machform_data_path;
            $populated_file_values = mf_get_entry_values($dbh, $form_id, $row['id'], true, $entry_params);
        }
    }
    //get price definitions for fields, if the merchant feature is enabled
    if (!empty($form->payment_enable_merchant)) {
        $query = "select \r\n\t\t\t\t\t\t\telement_id,\r\n\t\t\t\t\t\t\toption_id,\r\n\t\t\t\t\t\t\t`price` \r\n\t\t\t\t\t   from \r\n\t\t\t\t\t   \t\t`" . MF_TABLE_PREFIX . "element_prices` \r\n\t\t\t\t\t   where \r\n\t\t\t\t\t   \t\tform_id=? \r\n\t\t\t\t   order by \r\n\t\t\t\t   \t\t\telement_id,option_id asc";
        $params = array($form_id);
        $sth = mf_do_query($query, $params, $dbh);
        while ($row = mf_do_fetch_result($sth)) {
            $element_prices_array[$row['element_id']][$row['option_id']] = $row['price'];
        }
    }
    //get elements data
    //get element options first and store it into array
    $query = "SELECT \r\n\t\t\t\t\t\telement_id,\r\n\t\t\t\t\t\toption_id,\r\n\t\t\t\t\t\t`position`,\r\n\t\t\t\t\t\t`option`,\r\n\t\t\t\t\t\toption_is_default \r\n\t\t\t\t    FROM \r\n\t\t\t\t    \t" . MF_TABLE_PREFIX . "element_options \r\n\t\t\t\t   where \r\n\t\t\t\t   \t\tform_id = ? and live=1 \r\n\t\t\t\torder by \r\n\t\t\t\t\t\telement_id asc,`position` asc";
    $params = array($form_id);
    $sth = mf_do_query($query, $params, $dbh);
    while ($row = mf_do_fetch_result($sth)) {
        $element_id = $row['element_id'];
        $option_id = $row['option_id'];
        $options_lookup[$element_id][$option_id]['position'] = $row['position'];
        $options_lookup[$element_id][$option_id]['option'] = $row['option'];
        $options_lookup[$element_id][$option_id]['option_is_default'] = $row['option_is_default'];
        if (isset($element_prices_array[$element_id][$option_id])) {
            $options_lookup[$element_id][$option_id]['price_definition'] = $element_prices_array[$element_id][$option_id];
        }
    }
    $matrix_elements = array();
    //get elements data
    $element = array();
    if ($page_number === 0) {
        //if page_number is 0, display all pages (this is being used on edit_entry page)
        $page_number_clause = '';
        $params = array($form_id);
    } else {
        $page_number_clause = 'and element_page_number = ?';
        $params = array($form_id, $page_number);
    }
    $query = "SELECT \r\n\t\t\t\t\t\telement_id,\r\n\t\t\t\t\t\telement_title,\r\n\t\t\t\t\t\telement_guidelines,\r\n\t\t\t\t\t\telement_size,\r\n\t\t\t\t\t\telement_is_required,\r\n\t\t\t\t\t\telement_is_unique,\r\n\t\t\t\t\t\telement_is_private,\r\n\t\t\t\t\t\telement_type,\r\n\t\t\t\t\t\telement_position,\r\n\t\t\t\t\t\telement_default_value,\r\n\t\t\t\t\t\telement_constraint,\r\n\t\t\t\t\t\telement_choice_has_other,\r\n\t\t\t\t\t\telement_choice_other_label,\r\n\t\t\t\t\t\telement_choice_columns,\r\n\t\t\t\t\t\telement_time_showsecond, \r\n\t\t\t\t\t\telement_time_24hour,\r\n\t\t\t\t\t\telement_address_hideline2,\r\n\t\t\t\t\t\telement_address_us_only,\r\n\t\t\t\t\t\telement_date_enable_range,\r\n\t\t\t\t\t\telement_date_range_min,\r\n\t\t\t\t\t\telement_date_range_max,\r\n\t\t\t\t\t\telement_date_enable_selection_limit,\r\n\t\t\t\t\t\telement_date_selection_max,\r\n\t\t\t\t\t\telement_date_disable_past_future,\r\n\t\t\t\t\t\telement_date_past_future,\r\n\t\t\t\t\t\telement_date_disable_weekend,\r\n\t\t\t\t\t\telement_date_disable_specific,\r\n\t\t\t\t\t\telement_date_disabled_list,\r\n\t\t\t\t\t\telement_file_enable_type_limit,\r\n\t\t\t\t\t\telement_file_block_or_allow,\r\n\t\t\t\t\t\telement_file_type_list,\r\n\t\t\t\t\t\telement_file_as_attachment,\r\n\t\t\t\t\t\telement_file_enable_advance,\r\n\t\t\t\t\t\telement_file_auto_upload,\r\n\t\t\t\t\t\telement_file_enable_multi_upload,\r\n\t\t\t\t\t\telement_file_max_selection,\r\n\t\t\t\t\t\telement_file_enable_size_limit,\r\n\t\t\t\t\t\telement_file_size_max,\r\n\t\t\t\t\t\telement_matrix_allow_multiselect,\r\n\t\t\t\t\t\telement_matrix_parent_id,\r\n\t\t\t\t\t\telement_range_min,\r\n\t\t\t\t\t\telement_range_max,\r\n\t\t\t\t\t\telement_range_limit_by,\r\n\t\t\t\t\t\telement_css_class\r\n\t\t\t\t\tFROM \r\n\t\t\t\t\t\t" . MF_TABLE_PREFIX . "form_elements \r\n\t\t\t\t   WHERE \r\n\t\t\t\t   \t\tform_id = ? and element_status='1' {$page_number_clause} and element_type <> 'page_break'\r\n\t\t\t\tORDER BY \r\n\t\t\t\t\t\telement_position asc";
    $sth = mf_do_query($query, $params, $dbh);
    $j = 0;
    $has_calendar = false;
    //assume the form doesn't have calendar, so it won't load calendar.js
    $has_advance_uploader = false;
    $has_guidelines = false;
    while ($row = mf_do_fetch_result($sth)) {
        $element[$j] = new stdClass();
        $element_id = $row['element_id'];
        //lookup element options first
        if (!empty($options_lookup[$element_id])) {
            $element_options = array();
            $i = 0;
            foreach ($options_lookup[$element_id] as $option_id => $data) {
                $element_options[$i] = new stdClass();
                $element_options[$i]->id = $option_id;
                $element_options[$i]->option = $data['option'];
                $element_options[$i]->is_default = $data['option_is_default'];
                $element_options[$i]->is_db_live = 1;
                if (isset($data['price_definition'])) {
                    $element_options[$i]->price_definition = $data['price_definition'];
                }
                $i++;
            }
        }
        //populate elements
        $element[$j]->title = nl2br($row['element_title']);
        $element[$j]->guidelines = $row['element_guidelines'];
        if (!empty($row['element_guidelines']) && $row['element_type'] != 'section' && $row['element_type'] != 'matrix') {
            $has_guidelines = true;
        }
        $element[$j]->size = $row['element_size'];
        $element[$j]->is_required = $row['element_is_required'];
        $element[$j]->is_unique = $row['element_is_unique'];
        $element[$j]->is_private = $row['element_is_private'];
        $element[$j]->type = $row['element_type'];
        $element[$j]->position = $row['element_position'];
        $element[$j]->id = $row['element_id'];
        $element[$j]->is_db_live = 1;
        $element[$j]->form_id = $form_id;
        $element[$j]->choice_has_other = (int) $row['element_choice_has_other'];
        $element[$j]->choice_other_label = $row['element_choice_other_label'];
        $element[$j]->choice_columns = (int) $row['element_choice_columns'];
        $element[$j]->time_showsecond = (int) $row['element_time_showsecond'];
        $element[$j]->time_24hour = (int) $row['element_time_24hour'];
        $element[$j]->address_hideline2 = (int) $row['element_address_hideline2'];
        $element[$j]->address_us_only = (int) $row['element_address_us_only'];
        $element[$j]->date_enable_range = (int) $row['element_date_enable_range'];
        $element[$j]->date_range_min = $row['element_date_range_min'];
        $element[$j]->date_range_max = $row['element_date_range_max'];
        $element[$j]->date_enable_selection_limit = (int) $row['element_date_enable_selection_limit'];
        $element[$j]->date_selection_max = (int) $row['element_date_selection_max'];
        $element[$j]->date_disable_past_future = (int) $row['element_date_disable_past_future'];
        $element[$j]->date_past_future = $row['element_date_past_future'];
        $element[$j]->date_disable_weekend = (int) $row['element_date_disable_weekend'];
        $element[$j]->date_disable_specific = (int) $row['element_date_disable_specific'];
        $element[$j]->date_disabled_list = $row['element_date_disabled_list'];
        $element[$j]->file_enable_type_limit = (int) $row['element_file_enable_type_limit'];
        $element[$j]->file_block_or_allow = $row['element_file_block_or_allow'];
        $element[$j]->file_type_list = $row['element_file_type_list'];
        $element[$j]->file_as_attachment = (int) $row['element_file_as_attachment'];
        $element[$j]->file_enable_advance = (int) $row['element_file_enable_advance'];
        if (!empty($element[$j]->file_enable_advance)) {
            $has_advance_uploader = true;
        }
        $element[$j]->file_auto_upload = (int) $row['element_file_auto_upload'];
        $element[$j]->file_enable_multi_upload = (int) $row['element_file_enable_multi_upload'];
        $element[$j]->file_max_selection = (int) $row['element_file_max_selection'];
        $element[$j]->file_enable_size_limit = (int) $row['element_file_enable_size_limit'];
        $element[$j]->file_size_max = (int) $row['element_file_size_max'];
        $element[$j]->matrix_allow_multiselect = (int) $row['element_matrix_allow_multiselect'];
        $element[$j]->matrix_parent_id = (int) $row['element_matrix_parent_id'];
        $element[$j]->upload_dir = $mf_settings['upload_dir'];
        $element[$j]->range_min = $row['element_range_min'];
        $element[$j]->range_max = $row['element_range_max'];
        $element[$j]->range_limit_by = $row['element_range_limit_by'];
        $element[$j]->css_class = $row['element_css_class'];
        $element[$j]->machform_path = $machform_path;
        $element[$j]->machform_data_path = $machform_data_path;
        //this data came from db or form submit
        //being used to display edit form or redisplay form with errors and previous inputs
        //this should be optimized in the future, only pass necessary data, not the whole array
        $element[$j]->populated_value = $populated_values;
        //set prices for price-enabled field
        if ($row['element_type'] == 'money' && isset($element_prices_array[$row['element_id']][0])) {
            $element[$j]->price_definition = 0;
        }
        //if there is file upload type, set form enctype to multipart
        if ($row['element_type'] == 'file') {
            $form_enc_type = 'enctype="multipart/form-data"';
            //if this is single page form with review enabled or multipage form
            if (!empty($form->review) && !empty($_SESSION['review_id']) && !empty($populated_file_values) || $form->page_total > 1 && !empty($populated_file_values)) {
                //populate the default value for uploaded files, when validation error occured
                //make sure to keep the file token if exist
                if (!empty($populated_values['element_' . $row['element_id']]['file_token'])) {
                    $populated_file_values['element_' . $row['element_id']]['file_token'] = $populated_values['element_' . $row['element_id']]['file_token'];
                }
                $element[$j]->populated_value = $populated_file_values;
            }
            if (!empty($edit_id) && $_SESSION['mf_logged_in'] === true) {
                //if this is edit_entry page
                $element[$j]->is_edit_entry = true;
            }
        }
        if (!empty($error_elements[$element[$j]->id])) {
            $element[$j]->is_error = 1;
            $element[$j]->error_message = $error_elements[$element[$j]->id];
        }
        $element[$j]->default_value = htmlspecialchars($row['element_default_value']);
        $element[$j]->constraint = $row['element_constraint'];
        if (!empty($element_options)) {
            $element[$j]->options = $element_options;
        } else {
            $element[$j]->options = '';
        }
        //check for calendar type
        if ($row['element_type'] == 'date' || $row['element_type'] == 'europe_date') {
            $has_calendar = true;
            //if the field has date selection limit, we need to do query to existing entries and disable all date which reached the limit
            if (!empty($row['element_date_enable_selection_limit']) && !empty($row['element_date_selection_max'])) {
                $sub_query = "select \r\n\t\t\t\t\t\t\t\t\t\tselected_date \r\n\t\t\t\t\t\t\t\t\tfrom (\r\n\t\t\t\t\t\t\t\t\t\t\tselect \r\n\t\t\t\t\t\t\t\t\t\t\t\t  date_format(element_{$row['element_id']},'%m/%d/%Y') as selected_date,\r\n\t\t\t\t\t\t\t\t\t\t\t\t  count(element_{$row['element_id']}) as total_selection \r\n\t\t\t\t\t\t\t\t\t\t      from \r\n\t\t\t\t\t\t\t\t\t\t      \t  " . MF_TABLE_PREFIX . "form_{$form_id} \r\n\t\t\t\t\t\t\t\t\t\t     where \r\n\t\t\t\t\t\t\t\t\t\t     \t  status=1 and element_{$row['element_id']} is not null \r\n\t\t\t\t\t\t\t\t\t\t  group by \r\n\t\t\t\t\t\t\t\t\t\t  \t\t  element_{$row['element_id']}\r\n\t\t\t\t\t\t\t\t\t\t ) as A\r\n\t\t\t\t\t\t\t\t   where \r\n\t\t\t\t\t\t\t\t\t\t A.total_selection >= ?";
                $params = array($row['element_date_selection_max']);
                $sub_sth = mf_do_query($sub_query, $params, $dbh);
                $current_date_disabled_list = array();
                $current_date_disabled_list_joined = '';
                while ($sub_row = mf_do_fetch_result($sub_sth)) {
                    $current_date_disabled_list[] = $sub_row['selected_date'];
                }
                $current_date_disabled_list_joined = implode(',', $current_date_disabled_list);
                if (!empty($element[$j]->date_disable_specific)) {
                    //add to existing disable date list
                    if (empty($element[$j]->date_disabled_list)) {
                        $element[$j]->date_disabled_list = $current_date_disabled_list_joined;
                    } else {
                        $element[$j]->date_disabled_list .= ',' . $current_date_disabled_list_joined;
                    }
                } else {
                    //'disable specific date' is not enabled, we need to override and enable it from here
                    $element[$j]->date_disable_specific = 1;
                    $element[$j]->date_disabled_list = $current_date_disabled_list_joined;
                }
            }
        }
        //if the element is a matrix field and not the parent, store the data into a lookup array for later use when rendering the markup
        if ($row['element_type'] == 'matrix' && !empty($row['element_matrix_parent_id'])) {
            $parent_id = $row['element_matrix_parent_id'];
            $el_position = $row['element_position'];
            $matrix_elements[$parent_id][$el_position]['title'] = $element[$j]->title;
            $matrix_elements[$parent_id][$el_position]['id'] = $element[$j]->id;
            $matrix_child_option_id = '';
            foreach ($element_options as $value) {
                $matrix_child_option_id .= $value->id . ',';
            }
            $matrix_child_option_id = rtrim($matrix_child_option_id, ',');
            $matrix_elements[$parent_id][$el_position]['children_option_id'] = $matrix_child_option_id;
            //remove it from the main element array
            $element[$j] = array();
            unset($element[$j]);
            $j--;
        }
        $j++;
    }
    //add captcha if enabled
    //on multipage form, captcha should be displayed on the last page only
    if (!empty($form->captcha) && empty($edit_id)) {
        if ($form->page_total == 1 || $form->page_total == $page_number) {
            $element[$j] = new stdClass();
            $element[$j]->type = 'captcha';
            $element[$j]->captcha_type = $form->captcha_type;
            $element[$j]->form_id = $form_id;
            $element[$j]->is_private = 0;
            if (!empty($error_elements['element_captcha'])) {
                $element[$j]->is_error = 1;
                $element[$j]->error_message = $error_elements['element_captcha'];
            }
        }
    }
    //generate html markup for each element
    $container_class = '';
    $all_element_markup = '';
    foreach ($element as $element_data) {
        if ($element_data->is_private && empty($edit_id)) {
            //don't show private element on live forms
            continue;
        }
        //if this is matrix field, build the children data from $matrix_elements array
        if ($element_data->type == 'matrix') {
            $element_data->matrix_children = $matrix_elements[$element_data->id];
        }
        $all_element_markup .= call_user_func('mf_display_' . $element_data->type, $element_data);
    }
    if (!empty($custom_error)) {
        $form->error_message = <<<EOT
\t\t\t<li id="error_message">
\t\t\t\t\t<h3 id="error_message_title">{$custom_error}</h3>
\t\t\t</li>\t
EOT;
    } elseif (!empty($error_elements)) {
        $form->error_message = <<<EOT
\t\t\t<li id="error_message">
\t\t\t\t\t<h3 id="error_message_title">{$mf_lang['error_title']}</h3>
\t\t\t\t\t<p id="error_message_desc">{$mf_lang['error_desc']}</p>
\t\t\t</li>\t
EOT;
    }
    //if this form is using custom theme and not on edit entry page
    if (!empty($form->theme_id) && empty($edit_id)) {
        //get the field highlight color for the particular theme
        $query = "SELECT \r\n\t\t\t\t\t\t\thighlight_bg_type,\r\n\t\t\t\t\t\t\thighlight_bg_color,\r\n\t\t\t\t\t\t\tform_shadow_style,\r\n\t\t\t\t\t\t\tform_shadow_size,\r\n\t\t\t\t\t\t\tform_shadow_brightness,\r\n\t\t\t\t\t\t\tform_button_type,\r\n\t\t\t\t\t\t\tform_button_text,\r\n\t\t\t\t\t\t\tform_button_image,\r\n\t\t\t\t\t\t\ttheme_has_css  \r\n\t\t\t\t\t\tFROM \r\n\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "form_themes \r\n\t\t\t\t\t   WHERE \r\n\t\t\t\t\t   \t\ttheme_id = ?";
        $params = array($form->theme_id);
        $sth = mf_do_query($query, $params, $dbh);
        $row = mf_do_fetch_result($sth);
        $form_shadow_style = $row['form_shadow_style'];
        $form_shadow_size = $row['form_shadow_size'];
        $form_shadow_brightness = $row['form_shadow_brightness'];
        $theme_has_css = (int) $row['theme_has_css'];
        //if the theme has css file, make sure to refer to that file
        //otherwise, generate the css dynamically
        if (!empty($theme_has_css)) {
            $theme_css_link = '<link rel="stylesheet" type="text/css" href="' . $machform_path . $mf_settings['data_dir'] . '/themes/theme_' . $form->theme_id . '.css" media="all" />';
        } else {
            $theme_css_link = '<link rel="stylesheet" type="text/css" href="' . $machform_path . 'css_theme.php?theme_id=' . $form->theme_id . '" media="all" />';
        }
        if ($row['highlight_bg_type'] == 'color') {
            $field_highlight_color = $row['highlight_bg_color'];
        } else {
            //if the field highlight is using pattern instead of color, set the color to empty string
            $field_highlight_color = '';
        }
        //get the css link for the fonts
        $font_css_markup = mf_theme_get_fonts_link($dbh, $form->theme_id);
        //get the form shadow classes
        if (!empty($form_shadow_style) && $form_shadow_style != 'disabled') {
            preg_match_all("/[A-Z]/", $form_shadow_style, $prefix_matches);
            //this regex simply get the capital characters of the shadow style name
            //example: RightPerspectiveShadow result to RPS and then being sliced to RP
            $form_shadow_prefix_code = substr(implode("", $prefix_matches[0]), 0, -1);
            $form_shadow_size_class = $form_shadow_prefix_code . ucfirst($form_shadow_size);
            $form_shadow_brightness_class = $form_shadow_prefix_code . ucfirst($form_shadow_brightness);
            if (empty($integration_method)) {
                //only display shadow if the form is not being embedded using any method
                $form_container_class = $form_shadow_style . ' ' . $form_shadow_size_class . ' ' . $form_shadow_brightness_class;
            }
        }
        //get the button text/image setting
        if (empty($form->review)) {
            if ($row['form_button_type'] == 'text') {
                $submit_button_markup = '<input id="submit_form" class="button_text" type="submit" name="submit_form" value="' . $row['form_button_text'] . '" />';
            } else {
                $submit_button_markup = '<input class="submit_img_primary" type="image" alt="Submit" id="submit_form" name="submit_form" src="' . $row['form_button_image'] . '" />';
            }
        } else {
            $submit_button_markup = '<input id="submit_form" class="button_text" type="submit" name="submit_form" value="' . $mf_lang['continue_button'] . '" />';
        }
    } else {
        //if the form doesn't have any theme being applied
        $field_highlight_color = '#FFF7C0';
        if (empty($integration_method)) {
            $form_container_class = 'WarpShadow WLarge WNormal';
            //default shadow
        } else {
            $form_container_class = '';
            //dont show any shadow when the form being embedded
        }
        if (empty($form->review)) {
            $submit_button_markup = '<input id="submit_form" class="button_text" type="submit" name="submit_form" value="' . $mf_lang['submit_button'] . '" />';
        } else {
            $submit_button_markup = '<input id="submit_form" class="button_text" type="submit" name="submit_form" value="' . $mf_lang['continue_button'] . '" />';
        }
    }
    //display edit_id if there is any, this is being called on edit_entry.php page
    if (!empty($edit_id)) {
        $edit_markup = "<input type=\"hidden\" name=\"edit_id\" value=\"{$edit_id}\" />\n";
        $submit_button_markup = '<input id="submit_form" class="button_text" type="submit" name="submit_form" value="Save Changes" />';
    } else {
        $edit_markup = '';
    }
    //check for specific form css, if any, use it instead
    if ($form->has_css) {
        $css_dir = $mf_settings['data_dir'] . "/form_{$form_id}/css/";
    }
    if (!empty($form->password) && empty($_SESSION['user_authenticated'])) {
        //if form require password and password hasn't set yet
        $show_password_form = true;
    } elseif (!empty($form->password) && !empty($_SESSION['user_authenticated']) && $_SESSION['user_authenticated'] != $form_id) {
        //if user authenticated but not for this form
        $show_password_form = true;
    } else {
        //user authenticated for this form, or no password required
        $show_password_form = false;
    }
    if ($show_password_form) {
        $submit_button_markup = '<input id="submit_form" class="button_text" type="submit" name="submit_form" value="' . $mf_lang['submit_button'] . '" />';
    }
    //default markup for single page form submit button
    $button_markup = <<<EOT
\t\t<li id="li_buttons" class="buttons">
\t\t\t    <input type="hidden" name="form_id" value="{$form->id}" />
\t\t\t    {$edit_markup}
\t\t\t    <input type="hidden" name="submit_form" value="1" />
\t\t\t    <input type="hidden" name="page_number" value="{$page_number}" />
\t\t\t\t{$submit_button_markup}
\t\t</li>
EOT;
    //check for form limit rule
    $form_has_maximum_entries = false;
    if (!empty($form->limit_enable)) {
        $query = "select count(*) total_row from " . MF_TABLE_PREFIX . "form_{$form_id} where `status`=1";
        $params = array();
        $sth = mf_do_query($query, $params, $dbh);
        $row = mf_do_fetch_result($sth);
        $total_entries = $row['total_row'];
        if ($total_entries >= $form->limit) {
            $form_has_maximum_entries = true;
        }
    }
    //check for automatic scheduling limit, if enabled
    if (!empty($form->schedule_enable)) {
        $schedule_start_time = strtotime($form->schedule_start_date . ' ' . $form->schedule_start_hour);
        $schedule_end_time = strtotime($form->schedule_end_date . ' ' . $form->schedule_end_hour);
        $current_time = strtotime(date("Y-m-d H:i:s"));
        if (!empty($schedule_start_time)) {
            if ($current_time < $schedule_start_time) {
                $form->active = 0;
            }
        }
        if (!empty($schedule_end_time)) {
            if ($current_time > $schedule_end_time) {
                $form->active = 0;
            }
        }
    }
    if (empty($form->active) || $form_has_maximum_entries) {
        //if form is not active, don't show the fields
        $form_desc_div = '';
        $all_element_markup = '';
        $button_markup = '';
        $ul_class = 'class="password"';
        if ($form_has_maximum_entries) {
            $inactive_message = $mf_lang['form_limited'];
        } else {
            $inactive_message = $mf_lang['form_inactive'];
        }
        $custom_element = <<<EOT
\t\t\t<li>
\t\t\t\t<h2>{$inactive_message}</h2>
\t\t\t</li>
EOT;
    } elseif ($show_password_form) {
        //don't show form description if this page is password protected and user not authenticated
        $form_desc_div = '';
        $all_element_markup = '';
        $custom_element = <<<EOT
\t\t\t<li>
\t\t\t\t<h2>{$mf_lang['form_pass_title']}</h2>
\t\t\t\t<div>
\t\t\t\t<input type="password" value="" class="text" name="password" id="password" />
\t\t\t\t<label for="password" class="desc">{$mf_lang['form_pass_desc']}</label>
\t\t\t\t</div>
\t\t\t</li>
EOT;
        $ul_class = 'class="password"';
    } else {
        if (!empty($form->name) || !empty($form->description)) {
            $form->description = nl2br($form->description);
            $form_desc_div = <<<EOT
\t\t<div class="form_description">
\t\t\t<h2>{$form->name}</h2>
\t\t\t<p>{$form->description}</p>
\t\t</div>
EOT;
        }
    }
    if (!$has_guidelines) {
        $container_class .= " no_guidelines";
    }
    if ($integration_method == 'iframe') {
        $html_class_tag = 'class="embed"';
    }
    if ($has_calendar) {
        $calendar_init = '<script type="text/javascript" src="' . $machform_path . 'js/datepick/jquery.datepick.js"></script>' . "\n" . '<script type="text/javascript" src="' . $machform_path . 'js/datepick/jquery.datepick.ext.js"></script>' . "\n" . '<link type="text/css" href="' . $machform_path . 'js/datepick/smoothness.datepick.css" rel="stylesheet" />';
    } else {
        $calendar_init = '';
    }
    //if the form has multiple pages
    //display the pagination header
    if ($form->page_total > 1 && $show_password_form === false) {
        //build pagination header based on the selected type. possible values:
        //steps - display multi steps progress
        //percentage - display progress bar with percentage
        //disabled - disabled
        $page_breaks_data = array();
        $page_title_array = array();
        //get page titles
        $query = "SELECT \r\n\t\t\t\t\t\t\telement_page_title,\r\n\t\t\t\t\t\t\telement_page_number,\r\n\t\t\t\t\t\t\telement_submit_use_image,\r\n\t\t\t\t\t\t    element_submit_primary_text,\r\n\t\t\t\t\t\t\telement_submit_secondary_text,\r\n\t\t\t\t\t\t\telement_submit_primary_img,\r\n\t\t\t\t\t\t\telement_submit_secondary_img \r\n\t\t\t\t\t\tFROM \r\n\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "form_elements\r\n\t\t\t\t\t   WHERE\r\n\t\t\t\t\t\t\tform_id = ? and element_status = 1 and element_type = 'page_break'\r\n\t\t\t\t\tORDER BY \r\n\t\t\t\t\t   \t\telement_page_number asc";
        $params = array($form_id);
        $sth = mf_do_query($query, $params, $dbh);
        while ($row = mf_do_fetch_result($sth)) {
            $temp_page_number = $row['element_page_number'];
            $page_breaks_data[$temp_page_number]['use_image'] = $row['element_submit_use_image'];
            $page_breaks_data[$temp_page_number]['primary_text'] = $row['element_submit_primary_text'];
            $page_breaks_data[$temp_page_number]['secondary_text'] = $row['element_submit_secondary_text'];
            $page_breaks_data[$temp_page_number]['primary_img'] = $row['element_submit_primary_img'];
            $page_breaks_data[$temp_page_number]['secondary_img'] = $row['element_submit_secondary_img'];
            $page_title_array[] = $row['element_page_title'];
        }
        //add the last page buttons info into the array for easy lookup
        $page_breaks_data[$form->page_total]['use_image'] = $form->submit_use_image;
        $page_breaks_data[$form->page_total]['primary_text'] = $form->submit_primary_text;
        $page_breaks_data[$form->page_total]['secondary_text'] = $form->submit_secondary_text;
        $page_breaks_data[$form->page_total]['primary_img'] = $form->submit_primary_img;
        $page_breaks_data[$form->page_total]['secondary_img'] = $form->submit_secondary_img;
        if ($form->pagination_type == 'steps') {
            $page_titles_markup = '';
            $i = 1;
            foreach ($page_title_array as $page_title) {
                if ($i == $page_number) {
                    $ap_tp_num_active = ' ap_tp_num_active';
                    $ap_tp_text_active = ' ap_tp_text_active';
                } else {
                    $ap_tp_num_active = '';
                    $ap_tp_text_active = '';
                }
                $page_titles_markup .= '<td align="center"><span id="page_num_' . $i . '" class="ap_tp_num' . $ap_tp_num_active . '">' . $i . '</span><span id="page_title_' . $i . '" class="ap_tp_text' . $ap_tp_text_active . '">' . $page_title . '</span></td><td align="center" class="ap_tp_arrow">&gt;</td>' . "\n";
                $i++;
            }
            //add the last page title into the pagination header markup
            if ($i == $page_number) {
                $ap_tp_num_active = ' ap_tp_num_active';
                $ap_tp_text_active = ' ap_tp_text_active';
            } else {
                $ap_tp_num_active = '';
                $ap_tp_text_active = '';
            }
            $page_titles_markup .= '<td align="center"><span id="page_num_' . $i . '" class="ap_tp_num' . $ap_tp_num_active . '">' . $i . '</span><span id="page_title_' . $i . '" class="ap_tp_text' . $ap_tp_text_active . '">' . $form->lastpage_title . '</span></td>';
            //if form review enabled, we need to add the pagination header
            if (!empty($form->review)) {
                $i++;
                $page_titles_markup .= '<td align="center" class="ap_tp_arrow">&gt;</td><td align="center"><span id="page_num_' . $i . '" class="ap_tp_num">' . $i . '</span><span id="page_title_' . $i . '" class="ap_tp_text">' . $form->review_title . '</span></td>';
            }
            $pagination_header = <<<EOT
\t\t\t<li id="pagination_header" class="li_pagination">
\t\t\t <table class="ap_table_pagination" width="100%" border="0" cellspacing="0" cellpadding="0">
\t\t\t  <tr> 
\t\t\t  \t{$page_titles_markup}
\t\t\t  </tr>
\t\t\t</table>
\t\t\t</li>
EOT;
        } else {
            if ($form->pagination_type == 'percentage') {
                $page_total = count($page_title_array) + 1;
                if (!empty($form->review)) {
                    $page_total++;
                }
                $percent_value = round($page_number / $page_total * 100);
                if ($percent_value == 100) {
                    //it's not make sense to display 100% when the form is not really submitted yet
                    $percent_value = 99;
                }
                if (!empty($form->review)) {
                    if ($page_total - 1 == $page_number) {
                        //if this is last page of the form
                        $current_page_title = $form->lastpage_title;
                    } else {
                        $current_page_title = $page_title_array[$page_number - 1];
                    }
                } else {
                    if ($page_total == $page_number) {
                        //if this is last page of the form
                        $current_page_title = $form->lastpage_title;
                    } else {
                        $current_page_title = $page_title_array[$page_number - 1];
                    }
                }
                $page_number_title = sprintf($mf_lang['page_title'], $page_number, $page_total);
                $pagination_header = <<<EOT
\t\t\t<li id="pagination_header" class="li_pagination" title="Click to edit">
\t\t\t    <h3 id="page_title_{$page_number}">{$page_number_title} - {$current_page_title}</h3>
\t\t\t\t<div class="mf_progress_container">          
\t\t\t    \t<div id="mf_progress_percentage" class="mf_progress_value" style="width: {$percent_value}%"><span>{$percent_value}%</span></div>
\t\t\t\t</div>
\t\t\t</li>
EOT;
            } else {
                $pagination_header = '';
            }
        }
        //build the submit buttons markup
        if (empty($edit_id)) {
            if (empty($page_breaks_data[$page_number]['use_image'])) {
                //if using text buttons as submit
                if ($page_number > 1) {
                    $button_secondary_markup = '<input class="button_text btn_secondary" type="submit" id="submit_secondary" name="submit_secondary" value="' . $page_breaks_data[$page_number]['secondary_text'] . '" />';
                }
                $button_markup = <<<EOT
\t\t\t<li id="li_buttons" class="buttons">
\t\t\t\t    <input type="hidden" name="form_id" value="{$form->id}" />
\t\t\t\t    {$edit_markup}
\t\t\t\t    <input type="hidden" name="submit_form" value="1" />
\t\t\t\t    <input type="hidden" name="page_number" value="{$page_number}" />
\t\t\t\t\t<input class="button_text btn_primary" type="submit" id="submit_primary" name="submit_primary" value="{$page_breaks_data[$page_number]['primary_text']}" />
\t\t\t\t\t{$button_secondary_markup}
\t\t\t</li>
EOT;
            } else {
                //if using images as submit
                if ($page_number > 1) {
                    $button_secondary_markup = '<input class="submit_img_secondary" type="image" alt="Previous" id="submit_secondary" name="submit_secondary" src="' . $page_breaks_data[$page_number]['secondary_img'] . '" />';
                }
                $button_markup = <<<EOT
\t\t\t<li id="li_buttons" class="buttons">
\t\t\t\t    <input type="hidden" name="form_id" value="{$form->id}" />
\t\t\t\t    {$edit_markup}
\t\t\t\t    <input type="hidden" name="submit_form" value="1" />
\t\t\t\t    <input type="hidden" name="page_number" value="{$page_number}" />
\t\t\t\t \t<input class="submit_img_primary" type="image" alt="Continue" id="submit_primary" name="submit_primary" src="{$page_breaks_data[$page_number]['primary_img']}" />
\t\t\t\t\t{$button_secondary_markup}
\t\t\t</li>
EOT;
            }
        } else {
            //if there is edit_id, then this is edit_entry page, display a standard button
            $button_markup = <<<EOT
\t\t\t<li id="li_buttons" class="buttons">
\t\t\t\t    <input type="hidden" name="form_id" value="{$form->id}" />
\t\t\t\t    {$edit_markup}
\t\t\t\t    <input type="hidden" name="submit_form" value="1" />
\t\t\t\t    <input type="hidden" name="page_number" value="{$page_number}" />
\t\t\t\t\t<input class="button_text btn_primary" type="submit" id="submit_primary" name="submit_primary" value="Save Changes" />
\t\t\t</li>
EOT;
        }
    }
    if ($has_advance_uploader) {
        if (!empty($machform_path)) {
            $mf_path_script = <<<EOT
<script type="text/javascript">
var __machform_path = '{$machform_path}';
</script>
EOT;
        }
        $advance_uploader_js = <<<EOT
<script type="text/javascript" src="{$machform_path}js/uploadify/swfobject.js"></script>
<script type="text/javascript" src="{$machform_path}js/uploadify/jquery.uploadify.js"></script>
<script type="text/javascript" src="{$machform_path}js/jquery.jqplugin.min.js"></script>
{$mf_path_script}
EOT;
    }
    if ($integration_method == 'iframe') {
        $auto_height_js = <<<EOT
<script type="text/javascript" src="{$machform_path}js/jquery.ba-postmessage.min.js"></script>
<script type="text/javascript">
    \$(function(){
    \t\$.postMessage({mf_iframe_height: \$('body').outerHeight(true)}, '*', parent );
    });
</script>
EOT;
    }
    //if the form has resume enabled and this is multi page form (single page form doesn't have resume option)
    if (!empty($form->resume_enable) && $form->page_total > 1) {
        if (!empty($error_elements['element_resume_email'])) {
            $li_resume_email_style = '';
            $li_resume_error_message = "<p class=\"error\">{$error_elements['element_resume_email']}</p>";
            $li_resume_class = 'class="error"';
            $li_resume_checked = 'checked="checked"';
            $li_resume_button_status = 1;
        } else {
            $li_resume_email_style = 'style="display: none"';
            $li_resume_error_message = '';
            $li_resume_class = '';
            $li_resume_checked = '';
            $li_resume_button_status = 0;
        }
        $form_resume_markup = <<<EOT
\t\t\t<li id="li_resume_checkbox">
\t\t\t<div>
\t\t\t\t<span><input type="checkbox" value="1" class="element checkbox" name="element_resume_checkbox" id="element_resume_checkbox" {$li_resume_checked}>
\t\t\t\t\t<label for="element_resume_checkbox" class="choice">{$mf_lang['resume_checkbox_title']}</label>
\t\t\t\t</span>
\t\t\t</div> 
\t\t\t</li>
\t\t\t<li id="li_resume_email" {$li_resume_class} {$li_resume_email_style} data-resumebutton="{$li_resume_button_status}" data-resumelabel="{$mf_lang['resume_submit_button_text']}">
\t\t\t\t<label for="element_resume_email" class="description">{$mf_lang['resume_email_input_label']}</label>
\t\t\t\t<div>
\t\t\t\t\t<input type="text" value="{$populated_values['element_resume_email']}" class="element text medium" name="element_resume_email" id="element_resume_email"> 
\t\t\t\t</div><p id="guide_resume_email" class="guidelines"><small>{$mf_lang['resume_guideline']}</small></p> {$li_resume_error_message}
\t\t\t</li>
EOT;
    }
    //if the form has enabled merchant support and set the total payment to be displayed
    if (!empty($form->payment_enable_merchant) && !empty($form->payment_show_total)) {
        $currency_symbol = '&#36;';
        switch ($form->payment_currency) {
            case 'USD':
                $currency_symbol = '&#36;';
                break;
            case 'EUR':
                $currency_symbol = '&#8364;';
                break;
            case 'GBP':
                $currency_symbol = '&#163;';
                break;
            case 'AUD':
                $currency_symbol = 'A&#36;';
                break;
            case 'CAD':
                $currency_symbol = 'C&#36;';
                break;
            case 'JPY':
                $currency_symbol = '&#165;';
                break;
            case 'THB':
                $currency_symbol = '&#3647;';
                break;
            case 'HUF':
                $currency_symbol = '&#70;&#116;';
                break;
            case 'CHF':
                $currency_symbol = 'CHF';
                break;
            case 'CZK':
                $currency_symbol = '&#75;&#269;';
                break;
            case 'SEK':
                $currency_symbol = 'kr';
                break;
            case 'DKK':
                $currency_symbol = 'kr';
                break;
            case 'PHP':
                $currency_symbol = '&#36;';
                break;
            case 'MYR':
                $currency_symbol = 'RM';
                break;
            case 'PLN':
                $currency_symbol = '&#122;&#322;';
                break;
            case 'BRL':
                $currency_symbol = 'R&#36;';
                break;
            case 'HKD':
                $currency_symbol = 'HK&#36;';
                break;
            case 'MXN':
                $currency_symbol = 'Mex&#36;';
                break;
            case 'TWD':
                $currency_symbol = 'NT&#36;';
                break;
            case 'TRY':
                $currency_symbol = 'TL';
                break;
        }
        if ($form->payment_price_type == 'variable') {
            //if this is multipage form, we need to get the total selected price from other pages
            if ($form->page_total > 1) {
                $other_page_total_payment = (double) mf_get_payment_total($dbh, $form_id, $session_id, $page_number);
                $other_page_total_data_tag = 'data-basetotal="' . $other_page_total_payment . '"';
            } else {
                $other_page_total_data_tag = 'data-basetotal="0"';
            }
        } elseif ($form->payment_price_type == 'fixed') {
            $other_page_total_data_tag = 'data-basetotal="' . $form->payment_price_amount . '"';
        }
        $payment_total_markup = <<<EOT
\t\t\t<li class="total_payment" {$other_page_total_data_tag}>
\t\t\t\t<span>
\t\t\t\t\t<h3>{$currency_symbol}<var>0</var></h3>
\t\t\t\t\t<h5>{$mf_lang['payment_total']}</h5>
\t\t\t\t</span>
\t\t\t</li>
EOT;
        if ($form->payment_total_location == 'top') {
            $payment_total_markup_top = $payment_total_markup;
        } else {
            if ($form->payment_total_location == 'bottom') {
                $payment_total_markup_bottom = $payment_total_markup;
            } else {
                if ($form->payment_total_location == 'top-bottom' || $form->payment_total_location == 'all') {
                    $payment_total_markup_top = $payment_total_markup;
                    $payment_total_markup_bottom = $payment_total_markup;
                }
            }
        }
    }
    if (empty($mf_settings['disable_machform_link'])) {
        $powered_by_markup = 'Powered by MachForm';
    } else {
        $powered_by_markup = '';
    }
    //if advanced form code being used, display the form without body container
    if ($integration_method == 'php') {
        $container_class .= " integrated";
        if (!empty($edit_id)) {
            $view_css_markup = '<link rel="stylesheet" type="text/css" href="css/edit_entry.css" media="all" />';
        } else {
            $view_css_markup = "<link rel=\"stylesheet\" type=\"text/css\" href=\"{$machform_path}{$css_dir}view.css\" media=\"all\" />";
        }
        $form_markup = <<<EOT
{$view_css_markup}
{$theme_css_link}
{$font_css_markup}
<style>
html{
\tbackground: none repeat scroll 0 0 transparent;
\tbackground-color: transparent;
}
</style>
<script type="text/javascript" src="{$machform_path}js/jquery.min.js"></script>
<script type="text/javascript" src="{$machform_path}js/jquery-ui/ui/jquery.effects.core.js"></script>
<script type="text/javascript" src="{$machform_path}view.js"></script>
{$advance_uploader_js}
{$calendar_init}

<div id="main_body" class="{$container_class}">

\t<div id="form_container">
\t
\t\t<h1><a>{$form->name}</a></h1>
\t\t<form id="form_{$form->id}" class="appnitro {$form->label_alignment}" {$form_enc_type} method="post" data-highlightcolor="{$field_highlight_color}" action="#main_body">
\t\t\t{$form_desc_div}\t\t\t\t\t\t
\t\t\t<ul {$ul_class}>
\t\t\t{$pagination_header}
\t\t\t{$payment_total_markup_top}
\t\t\t{$form->error_message}
\t\t\t{$all_element_markup}
\t\t\t{$custom_element}
\t\t\t{$payment_total_markup_bottom}
\t\t\t{$form_resume_markup}
\t\t\t{$button_markup}
\t\t\t</ul>
\t\t</form>\t
\t\t<div id="footer">
\t\t\t{$powered_by_markup}
\t\t</div>
\t</div>\t
</div>

EOT;
    } else {
        $form_markup = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html {$html_class_tag} xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>{$form->name}</title>
<link rel="stylesheet" type="text/css" href="data/form_default/css/view.css" media="all" />
{$theme_css_link}
{$font_css_markup}
<script type="text/javascript" src="{$machform_path}js/jquery.min.js"></script>
<script type="text/javascript" src="{$machform_path}js/jquery-ui/ui/jquery.effects.core.js"></script>
<script type="text/javascript" src="{$machform_path}view.js"></script>
{$advance_uploader_js}
{$calendar_init}
{$auto_height_js}
</head>
<body id="main_body" class="{$container_class}">
\t
\t<div id="form_container" class="{$form_container_class}">
\t
\t\t<h1><a>{$form->name}</a></h1>
\t\t<form id="form_{$form->id}" class="appnitro {$form->label_alignment}" {$form_enc_type} method="post" data-highlightcolor="{$field_highlight_color}" action="#main_body">
\t\t\t{$form_desc_div}\t\t\t\t\t\t
\t\t\t<ul {$ul_class}>
\t\t\t{$pagination_header}
\t\t\t{$payment_total_markup_top}
\t\t\t{$form->error_message}
\t\t\t{$all_element_markup}
\t\t\t{$custom_element}
\t\t\t{$payment_total_markup_bottom}
\t\t\t{$form_resume_markup}
\t\t\t{$button_markup}
\t\t\t</ul>
\t\t</form>\t
\t\t<div id="footer">
\t\t\t{$powered_by_markup}
\t\t</div>
\t</div>
\t
\t</body>
</html>
EOT;
    }
    return $form_markup;
}
function mf_display_form_payment($dbh, $form_id, $record_id, $form_params = array())
{
    global $mf_lang;
    if (!empty($form_params['integration_method'])) {
        $integration_method = $form_params['integration_method'];
    } else {
        $integration_method = '';
    }
    if (!empty($form_params['machform_path'])) {
        $machform_path = $form_params['machform_path'];
    } else {
        $machform_path = '';
    }
    if (!empty($form_params['machform_data_path'])) {
        $machform_data_path = $form_params['machform_data_path'];
    } else {
        $machform_data_path = '';
    }
    //check permission to access this page
    if ($_SESSION['mf_form_payment_access'][$form_id] !== true) {
        return "Your session has been expired. Please <a href='view.php?id={$form_id}'>click here</a> to start again.";
    }
    $mf_settings = mf_get_settings($dbh);
    //get form properties data
    $query = "select \r\n\t\t\t\t\t\t  form_name,\r\n\t\t\t\t\t\t  form_has_css,\r\n\t\t\t\t\t\t  form_redirect,\r\n\t\t\t\t\t\t  form_language,\r\n\t\t\t\t\t\t  form_review,\r\n\t\t\t\t\t\t  form_review_primary_text,\r\n\t\t\t\t\t\t  form_review_secondary_text,\r\n\t\t\t\t\t\t  form_review_primary_img,\r\n\t\t\t\t\t\t  form_review_secondary_img,\r\n\t\t\t\t\t\t  form_review_use_image,\r\n\t\t\t\t\t\t  form_review_title,\r\n\t\t\t\t\t\t  form_review_description,\r\n\t\t\t\t\t\t  form_resume_enable,\r\n\t\t\t\t\t\t  form_page_total,\r\n\t\t\t\t\t\t  form_lastpage_title,\r\n\t\t\t\t\t\t  form_pagination_type,\r\n\t\t\t\t\t\t  form_theme_id,\r\n\t\t\t\t\t\t  payment_show_total,\r\n\t\t\t\t\t\t  payment_total_location,\r\n\t\t\t\t\t\t  payment_enable_merchant,\r\n\t\t\t\t\t\t  payment_merchant_type,\r\n\t\t\t\t\t\t  payment_currency,\r\n\t\t\t\t\t\t  payment_price_type,\r\n\t\t\t\t\t\t  payment_price_name,\r\n\t\t\t\t\t\t  payment_price_amount,\r\n\t\t\t\t\t\t  payment_ask_billing,\r\n\t\t\t\t\t\t  payment_ask_shipping,\r\n\t\t\t\t\t\t  payment_stripe_live_public_key,\r\n\t\t\t\t\t\t  payment_stripe_test_public_key,\r\n\t\t\t\t\t\t  payment_stripe_enable_test_mode,\r\n\t\t\t\t\t\t  payment_enable_recurring,\r\n\t\t\t\t\t\t  payment_recurring_cycle,\r\n\t\t\t\t\t\t  payment_recurring_unit,\r\n\t\t\t\t\t\t  payment_enable_trial,\r\n\t\t\t\t\t\t  payment_trial_period,\r\n\t\t\t\t\t\t  payment_trial_unit,\r\n\t\t\t\t\t\t  payment_trial_amount,\r\n\t\t\t\t\t\t  payment_delay_notifications\r\n\t\t\t\t     from \r\n\t\t\t\t     \t " . MF_TABLE_PREFIX . "forms \r\n\t\t\t\t    where \r\n\t\t\t\t    \t form_id=?";
    $params = array($form_id);
    $sth = mf_do_query($query, $params, $dbh);
    $row = mf_do_fetch_result($sth);
    $form_language = $row['form_language'];
    if (!empty($form_language)) {
        mf_set_language($form_language);
    }
    $form_payment_title = $mf_lang['form_payment_title'];
    $form_payment_description = $mf_lang['form_payment_description'];
    $form_has_css = $row['form_has_css'];
    $form_redirect = $row['form_redirect'];
    $form_review = (int) $row['form_review'];
    $form_review_primary_text = $row['form_review_primary_text'];
    $form_review_secondary_text = $row['form_review_secondary_text'];
    $form_review_primary_img = $row['form_review_primary_img'];
    $form_review_secondary_img = $row['form_review_secondary_img'];
    $form_review_use_image = (int) $row['form_review_use_image'];
    $form_review_title = $row['form_review_title'];
    $form_review_description = $row['form_review_description'];
    $form_page_total = (int) $row['form_page_total'];
    $form_lastpage_title = $row['form_lastpage_title'];
    $form_pagination_type = $row['form_pagination_type'];
    $form_name = htmlspecialchars($row['form_name'], ENT_QUOTES);
    $form_theme_id = $row['form_theme_id'];
    $form_resume_enable = (int) $row['form_resume_enable'];
    $payment_show_total = (int) $row['payment_show_total'];
    $payment_total_location = $row['payment_total_location'];
    $payment_enable_merchant = (int) $row['payment_enable_merchant'];
    if ($payment_enable_merchant < 1) {
        $payment_enable_merchant = 0;
    }
    $payment_currency = $row['payment_currency'];
    $payment_price_type = $row['payment_price_type'];
    $payment_price_amount = $row['payment_price_amount'];
    $payment_price_name = htmlspecialchars($row['payment_price_name'], ENT_QUOTES);
    $payment_ask_billing = (int) $row['payment_ask_billing'];
    $payment_ask_shipping = (int) $row['payment_ask_shipping'];
    $payment_merchant_type = $row['payment_merchant_type'];
    $payment_stripe_enable_test_mode = (int) $row['payment_stripe_enable_test_mode'];
    $payment_stripe_live_public_key = trim($row['payment_stripe_live_public_key']);
    $payment_stripe_test_public_key = trim($row['payment_stripe_test_public_key']);
    $payment_enable_recurring = (int) $row['payment_enable_recurring'];
    $payment_recurring_cycle = (int) $row['payment_recurring_cycle'];
    $payment_recurring_unit = $row['payment_recurring_unit'];
    $payment_enable_trial = (int) $row['payment_enable_trial'];
    $payment_trial_period = (int) $row['payment_trial_period'];
    $payment_trial_unit = $row['payment_trial_unit'];
    $payment_trial_amount = (double) $row['payment_trial_amount'];
    $payment_delay_notifications = (int) $row['payment_delay_notifications'];
    //check for specific form css, if any, use it instead
    if ($form_has_css) {
        $css_dir = $mf_settings['data_dir'] . "/form_{$form_id}/css/";
    }
    if ($integration_method == 'iframe') {
        $embed_class = 'class="embed"';
    }
    //get total payment
    $currency_symbol = '&#36;';
    if ($payment_price_type == 'variable') {
        $total_payment_amount = (double) mf_get_payment_total($dbh, $form_id, $record_id, 0, 'live');
        $payment_items = mf_get_payment_items($dbh, $form_id, $record_id, 'live');
        //build the payment list markup
        $payment_list_items_markup = '';
        if (!empty($payment_items)) {
            foreach ($payment_items as $item) {
                if ($item['type'] == 'money') {
                    $payment_list_items_markup .= "<li>{$item['title']} <span>{$currency_symbol}{$item['amount']}</span></li>" . "\n";
                } else {
                    if ($item['type'] == 'checkbox') {
                        $payment_list_items_markup .= "<li>{$item['sub_title']} <span>{$currency_symbol}{$item['amount']}</span></li>" . "\n";
                    } else {
                        if ($item['type'] == 'select' || $item['type'] == 'radio') {
                            $payment_list_items_markup .= "<li>{$item['title']} <em>({$item['sub_title']})</em> <span>{$currency_symbol}{$item['amount']}</span></li>" . "\n";
                        }
                    }
                }
            }
        }
    } else {
        if ($payment_price_type == 'fixed') {
            $total_payment_amount = $payment_price_amount;
            $payment_list_items_markup = "<li>{$payment_price_name}</li>";
        }
    }
    //construct payment terms
    if (!empty($payment_enable_recurring)) {
        $payment_plurals = '';
        if ($payment_recurring_cycle > 1) {
            $payment_plurals = 's';
            $payment_recurring_cycle_markup = $payment_recurring_cycle . ' ';
        }
        if (!empty($payment_enable_trial)) {
            //recurring with trial period
            $payment_trial_price = $currency_symbol . $payment_trial_amount;
            if (empty($payment_trial_amount)) {
                $payment_trial_price = 'free';
            }
            $payment_trial_plurals = '';
            if ($payment_trial_period > 1) {
                $payment_trial_plurals = 's';
            }
            $payment_term_markup = <<<EOT
\t\t\t\t\t<li class="payment_summary_term">
\t\t\t\t\t\t<em>Trial period: {$payment_trial_period} {$payment_trial_unit}{$payment_trial_plurals} ({$payment_trial_price})</em><br>
\t\t\t\t\t\t<em>Then you will be charged {$currency_symbol}{$total_payment_amount} every {$payment_recurring_cycle_markup}{$payment_recurring_unit}{$payment_plurals}</em>
\t\t\t\t\t</li>
EOT;
        } else {
            $payment_term_markup = "<li class=\"payment_summary_term\"><em>You will be charged {$currency_symbol}{$total_payment_amount} every {$payment_recurring_cycle_markup}{$payment_recurring_unit}{$payment_plurals}</em></li>";
        }
    }
    //if the form has multiple pages
    //display the pagination header
    if ($form_page_total > 1) {
        //build pagination header based on the selected type. possible values:
        //steps - display multi steps progress
        //percentage - display progress bar with percentage
        //disabled - disabled
        $page_breaks_data = array();
        $page_title_array = array();
        //get page titles
        $query = "SELECT \r\n\t\t\t\t\t\t\telement_page_title\r\n\t\t\t\t\t\tFROM \r\n\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "form_elements\r\n\t\t\t\t\t   WHERE\r\n\t\t\t\t\t\t\tform_id = ? and element_status = 1 and element_type = 'page_break'\r\n\t\t\t\t\tORDER BY \r\n\t\t\t\t\t   \t\telement_page_number asc";
        $params = array($form_id);
        $sth = mf_do_query($query, $params, $dbh);
        while ($row = mf_do_fetch_result($sth)) {
            $page_title_array[] = $row['element_page_title'];
        }
        if ($form_pagination_type == 'steps') {
            $page_titles_markup = '';
            $i = 1;
            foreach ($page_title_array as $page_title) {
                $page_titles_markup .= '<td align="center"><span id="page_num_' . $i . '" class="ap_tp_num">' . $i . '</span><span id="page_title_' . $i . '" class="ap_tp_text">' . $page_title . '</span></td><td align="center" class="ap_tp_arrow">&gt;</td>' . "\n";
                $i++;
            }
            //add the last page title into the pagination header markup
            $page_titles_markup .= '<td align="center"><span id="page_num_' . $i . '" class="ap_tp_num">' . $i . '</span><span id="page_title_' . $i . '" class="ap_tp_text">' . $form_lastpage_title . '</span></td>';
            if (!empty($form_review)) {
                $i++;
                $page_titles_markup .= '<td align="center" class="ap_tp_arrow">&gt;</td><td align="center"><span id="page_num_' . $i . '" class="ap_tp_num">' . $i . '</span><span id="page_title_' . $i . '" class="ap_tp_text">' . $form_review_title . '</span></td>';
            }
            $i++;
            $page_titles_markup .= '<td align="center" class="ap_tp_arrow">&gt;</td><td align="center"><span id="page_num_' . $i . '" class="ap_tp_num ap_tp_num_active">' . $i . '</span><span id="page_title_' . $i . '" class="ap_tp_text ap_tp_text_active">' . $mf_lang['form_payment_header_title'] . '</span></td>';
            $pagination_header = <<<EOT
\t\t\t<ul>
\t\t\t<li id="pagination_header" class="li_pagination">
\t\t\t <table class="ap_table_pagination" width="100%" border="0" cellspacing="0" cellpadding="0">
\t\t\t  <tr> 
\t\t\t  \t{$page_titles_markup}
\t\t\t  </tr>
\t\t\t</table>
\t\t\t</li>
\t\t\t</ul>
EOT;
        } else {
            if ($form_pagination_type == 'percentage') {
                $page_total = count($page_title_array) + 2;
                if (!empty($form_review)) {
                    $page_total++;
                }
                $percent_value = 99;
                $page_number_title = sprintf($mf_lang['page_title'], $page_total, $page_total);
                $pagination_header = <<<EOT
\t\t\t<ul>
\t\t\t\t<li id="pagination_header" class="li_pagination" title="Click to edit">
\t\t\t    <h3 id="page_title_{$page_total}">{$page_number_title}</h3>
\t\t\t\t<div class="mf_progress_container">          
\t\t\t    \t<div id="mf_progress_percentage" class="mf_progress_value" style="width: {$percent_value}%"><span>{$percent_value}%</span></div>
\t\t\t\t</div>
\t\t\t\t</li>
\t\t\t</ul>
EOT;
            } else {
                $pagination_header = '';
            }
        }
    }
    //build the button markup
    $button_markup = <<<EOT
<input id="btn_submit_payment" class="button_text btn_primary" type="submit" data-originallabel="{$mf_lang['payment_submit_button']}" value="{$mf_lang['payment_submit_button']}" />
EOT;
    //if this form is using custom theme
    if (!empty($form_theme_id)) {
        //get the field highlight color for the particular theme
        $query = "SELECT \r\n\t\t\t\t\t\t\thighlight_bg_type,\r\n\t\t\t\t\t\t\thighlight_bg_color,\r\n\t\t\t\t\t\t\tform_shadow_style,\r\n\t\t\t\t\t\t\tform_shadow_size,\r\n\t\t\t\t\t\t\tform_shadow_brightness,\r\n\t\t\t\t\t\t\tform_button_type,\r\n\t\t\t\t\t\t\tform_button_text,\r\n\t\t\t\t\t\t\tform_button_image,\r\n\t\t\t\t\t\t\ttheme_has_css  \r\n\t\t\t\t\t\tFROM \r\n\t\t\t\t\t\t\t" . MF_TABLE_PREFIX . "form_themes \r\n\t\t\t\t\t   WHERE \r\n\t\t\t\t\t   \t\ttheme_id = ?";
        $params = array($form_theme_id);
        $sth = mf_do_query($query, $params, $dbh);
        $row = mf_do_fetch_result($sth);
        $form_shadow_style = $row['form_shadow_style'];
        $form_shadow_size = $row['form_shadow_size'];
        $form_shadow_brightness = $row['form_shadow_brightness'];
        $theme_has_css = (int) $row['theme_has_css'];
        //if the theme has css file, make sure to refer to that file
        //otherwise, generate the css dynamically
        if (!empty($theme_has_css)) {
            $theme_css_link = '<link rel="stylesheet" type="text/css" href="' . $machform_path . $mf_settings['data_dir'] . '/themes/theme_' . $form_theme_id . '.css" media="all" />';
        } else {
            $theme_css_link = '<link rel="stylesheet" type="text/css" href="' . $machform_path . 'css_theme.php?theme_id=' . $form_theme_id . '" media="all" />';
        }
        if ($row['highlight_bg_type'] == 'color') {
            $field_highlight_color = $row['highlight_bg_color'];
        } else {
            //if the field highlight is using pattern instead of color, set the color to empty string
            $field_highlight_color = '';
        }
        //get the css link for the fonts
        $font_css_markup = mf_theme_get_fonts_link($dbh, $form_theme_id);
        //get the form shadow classes
        if (!empty($form_shadow_style) && $form_shadow_style != 'disabled') {
            preg_match_all("/[A-Z]/", $form_shadow_style, $prefix_matches);
            //this regex simply get the capital characters of the shadow style name
            //example: RightPerspectiveShadow result to RPS and then being sliced to RP
            $form_shadow_prefix_code = substr(implode("", $prefix_matches[0]), 0, -1);
            $form_shadow_size_class = $form_shadow_prefix_code . ucfirst($form_shadow_size);
            $form_shadow_brightness_class = $form_shadow_prefix_code . ucfirst($form_shadow_brightness);
            if (empty($integration_method)) {
                //only display shadow if the form is not being embedded using any method
                $form_container_class = $form_shadow_style . ' ' . $form_shadow_size_class . ' ' . $form_shadow_brightness_class;
            }
        }
    } else {
        //if the form doesn't have any theme being applied
        $field_highlight_color = '#FFF7C0';
        if (empty($integration_method)) {
            $form_container_class = 'WarpShadow WLarge WNormal';
            //default shadow
        } else {
            $form_container_class = '';
            //dont show any shadow when the form being embedded
        }
    }
    if (empty($mf_settings['disable_machform_link'])) {
        $powered_by_markup = 'Powered by <a href="http://www.appnitro.com" target="_blank">MachForm</a>';
    } else {
        $powered_by_markup = '';
    }
    $self_address = htmlentities($_SERVER['PHP_SELF']);
    //prevent XSS
    $country = mf_get_country_list();
    $country_markup = '<option value="" selected="selected"></option>' . "\n";
    foreach ($country as $data) {
        $country_markup .= "<option value=\"{$data['value']}\">{$data['label']}</option>\n";
    }
    $billing_address_markup = '';
    if (!empty($payment_ask_billing)) {
        $billing_address_markup = <<<EOT
\t\t\t\t<li id="li_billing_address" class="address">
\t\t\t\t\t<label class="description">Billing Address <span class="required">*</span></label>
\t\t\t\t\t<div>
\t\t\t\t\t\t<span id="li_billing_span_1">
\t\t\t\t\t\t\t<input id="billing_street" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="billing_street">{$mf_lang['address_street']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_billing_span_2" class="left state_list">
\t\t\t\t\t\t\t<input id="billing_city" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="billing_city">{$mf_lang['address_city']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_billing_span_3" class="right state_list">
\t\t\t\t\t\t\t<input id="billing_state" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="billing_state">{$mf_lang['address_state']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_billing_span_4" class="left">
\t\t\t\t\t\t\t<input id="billing_zipcode" class="element text large" maxlength="15" value="{$default_value_5}" type="text" />
\t\t\t\t\t\t\t<label for="billing_zipcode">{$mf_lang['address_zip']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t\t
\t\t\t\t\t\t<span id="li_billing_span_5" class="right">
\t\t\t\t\t\t\t<select class="element select large" id="billing_country"> 
\t\t\t\t\t\t\t\t{$country_markup}\t
\t\t\t\t\t\t\t</select>
\t\t\t\t\t\t<label for="billing_country">{$mf_lang['address_country']}</label>
\t\t\t\t\t    </span>
\t\t\t\t    </div><p id="billing_error_message" class="error" style="display: none"></p>
\t\t\t\t</li>
EOT;
    }
    $shipping_address_markup = '';
    if (!empty($payment_ask_shipping)) {
        $shipping_address_markup = <<<EOT
\t\t\t\t<li id="li_shipping_address" class="address">
\t\t\t\t\t<label class="description shipping_address_detail" style="display: none">Shipping Address <span class="required">*</span></label>
\t\t\t\t\t<div class="shipping_address_detail" style="display: none">
\t\t\t\t\t\t<span id="li_shipping_span_1">
\t\t\t\t\t\t\t<input id="shipping_street" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="shipping_street">{$mf_lang['address_street']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_shipping_span_2" class="left state_list">
\t\t\t\t\t\t\t<input id="shipping_city" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="shipping_city">{$mf_lang['address_city']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_shipping_span_3" class="right state_list">
\t\t\t\t\t\t\t<input id="shipping_state" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="shipping_state">{$mf_lang['address_state']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_shipping_span_4" class="left">
\t\t\t\t\t\t\t<input id="shipping_zipcode" class="element text large" maxlength="15" value="{$default_value_5}" type="text" />
\t\t\t\t\t\t\t<label for="shipping_zipcode">{$mf_lang['address_zip']}</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t\t
\t\t\t\t\t\t<span id="li_shipping_span_5" class="right">
\t\t\t\t\t\t\t<select class="element select large" id="shipping_country"> 
\t\t\t\t\t\t\t\t{$country_markup}\t
\t\t\t\t\t\t\t</select>
\t\t\t\t\t\t<label for="shipping_country">{$mf_lang['address_country']}</label>
\t\t\t\t\t    </span>
\t\t\t\t\t    <p id="shipping_error_message" class="error" style="display: none"></p>
\t\t\t\t    </div>
\t\t\t\t    <div>
\t\t\t\t\t    <input type="checkbox" value="1" checked="checked" class="checkbox" id="mf_same_shipping_address">
\t\t\t\t\t\t<label for="mf_same_shipping_address" class="choice">My shipping address is the same as my billing address</label>
\t\t\t\t\t</div>
\t\t\t\t</li>
EOT;
    }
    if ($payment_merchant_type == 'stripe') {
        if (!empty($payment_stripe_enable_test_mode)) {
            $stripe_public_key = $payment_stripe_test_public_key;
        } else {
            $stripe_public_key = $payment_stripe_live_public_key;
        }
        $stripe_js = <<<EOT
<script type="text/javascript" src="https://js.stripe.com/v1/"></script>
<script type="text/javascript">
\tStripe.setPublishableKey('{$stripe_public_key}');
</script>
<script type="text/javascript" src="{$machform_path}js/payment_stripe.js"></script>
EOT;
    }
    $ssl_suffix = mf_get_ssl_suffix();
    $jquery_url = 'http' . $ssl_suffix . '://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js';
    $current_year = date("Y");
    $year_dropdown_markup = '';
    foreach (range($current_year, $current_year + 15) as $year) {
        $year_dropdown_markup .= "<option value=\"{$year}\">{$year}</option>" . "\n";
    }
    if ($integration_method == 'php') {
        $form_markup = <<<EOT
<link rel="stylesheet" type="text/css" href="{$machform_path}{$css_dir}view.css" media="all" />
<link rel="stylesheet" type="text/css" href="{$machform_path}view.mobile.css" media="all" />
{$theme_css_link}
{$font_css_markup}
<script type="text/javascript" src="{$jquery_url}"></script>
<script type="text/javascript" src="{$machform_path}js/jquery-ui/ui/jquery.effects.core.js"></script>
<script type="text/javascript" src="{$machform_path}view.js"></script>
{$stripe_js}
<style>
html{
\tbackground: none repeat scroll 0 0 transparent;
}
</style>

<div id="main_body" class="integrated no_guidelines" data-machformpath="{$machform_path}">
\t<div id="form_container">
\t\t<form id="form_{$form_id}" class="appnitro" method="post" action="javascript:" data-highlightcolor="{$field_highlight_color}">
\t\t    <div class="form_description">
\t\t\t\t<h2>{$form_payment_title}</h2>
\t\t\t\t<p>{$form_payment_description}</p>
\t\t\t</div>
\t\t\t{$pagination_header}
\t\t\t
\t\t\t<ul class="payment_summary">
\t\t\t\t<li class="payment_summary_amount total_payment" data-basetotal="{$total_payment_amount}">
\t\t\t\t\t<span>
\t\t\t\t\t\t<h3>{$currency_symbol}<var>0</var></h3>
\t\t\t\t\t\t<h5>{$mf_lang['payment_total']}</h5>
\t\t\t\t\t</span>
\t\t\t\t</li>
\t\t\t\t<li class="payment_summary_list">
\t\t\t\t\t<ul class="payment_list_items">
\t\t\t\t\t\t{$payment_list_items_markup}
\t\t\t\t\t</ul>
\t\t\t\t</li>
\t\t\t\t{$payment_term_markup}
\t\t\t</ul>
\t\t\t<ul class="payment_detail_form">
\t\t\t\t<li id="error_message" style="display: none">
\t\t\t\t\t\t<h3 id="error_message_title">{$mf_lang['error_title']}</h3>
\t\t\t\t\t\t<p id="error_message_desc">{$mf_lang['error_desc']}</p>
\t\t\t\t</li>\t
\t\t\t\t<li id="li_accepted_cards">
\t\t\t\t\t<img src="{$machform_path}images/cards/visa.png" alt="Visa" title="Visa" />
\t\t\t\t\t<img src="{$machform_path}images/cards/mastercard.png" alt="MasterCard" title="MasterCard" />
\t\t\t\t\t<img src="{$machform_path}images/cards/amex.png" alt="American Express" title="American Express" />
\t\t\t\t\t<img src="{$machform_path}images/cards/jcb.png" alt="JCB" title="JCB" />
\t\t\t\t\t<img src="{$machform_path}images/cards/discover.png" alt="Discover" title="Discover" />
\t\t\t\t\t<img src="{$machform_path}images/cards/diners.png" alt="Diners Club" title="Diners Club" />
\t\t\t\t</li>
\t\t\t\t<li id="li_credit_card" class="credit_card">
\t\t\t\t\t<label class="description">Credit Card <span class="required">*</span></label>
\t\t\t\t\t<div>
\t\t\t\t\t\t<span id="li_cc_span_1" class="left">
\t\t\t\t\t\t\t<input id="cc_first_name" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_first_name">First Name</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_cc_span_2" class="right">
\t\t\t\t\t\t\t<input id="cc_last_name" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_last_name">Last Name</label>
\t\t\t\t\t\t</span>

\t\t\t\t\t\t<span id="li_cc_span_3" class="left">
\t\t\t\t\t\t\t<input id="cc_number" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_number">Credit Card Number</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_cc_span_4" class="right">
\t\t\t\t\t\t\t<input id="cc_cvv" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_cvv">CVV</label>
\t\t\t\t\t\t</span>

\t\t\t\t\t\t<span id="li_cc_span_5" style="text-align: right">
\t\t\t\t\t\t\t<img id="cc_secure_icon" src="{$machform_path}images/icons/lock.png" alt="Secure" title="Secure" /> 
\t\t\t\t\t\t\t<label for="cc_expiry_month" style="display: inline">Expiration: </label>
\t\t\t\t\t\t\t<select class="element select" id="cc_expiry_month">
\t\t\t\t\t\t\t\t<option value="01">01 - January</option>
\t\t\t\t\t\t\t\t<option value="02">02 - February</option>
\t\t\t\t\t\t\t\t<option value="03">03 - March</option>
\t\t\t\t\t\t\t\t<option value="04">04 - April</option>
\t\t\t\t\t\t\t\t<option value="05">05 - May</option>
\t\t\t\t\t\t\t\t<option value="06">06 - June</option>
\t\t\t\t\t\t\t\t<option value="07">07 - July</option>
\t\t\t\t\t\t\t\t<option value="08">08 - August</option>
\t\t\t\t\t\t\t\t<option value="09">09 - September</option>
\t\t\t\t\t\t\t\t<option value="10">10 - October</option>
\t\t\t\t\t\t\t\t<option value="11">11 - November</option>
\t\t\t\t\t\t\t\t<option value="12">12 - December</option>
\t\t\t\t\t\t\t</select>
\t\t\t\t\t\t\t<select class="element select" id="cc_expiry_year">
\t\t\t\t\t\t\t\t{$year_dropdown_markup}
\t\t\t\t\t\t\t</select>
\t\t\t\t\t\t</span>
\t\t\t\t\t</div><p id="credit_card_error_message" class="error" style="display: none"></p>
\t\t\t\t</li>
\t\t\t\t<li id="li_2" class="section_break">
\t\t\t\t</li>
\t\t\t\t{$billing_address_markup}
\t\t\t\t{$shipping_address_markup}
\t\t\t\t<li id="li_buttons" class="buttons">
\t\t\t\t\t<input type="hidden" id="form_id" value="{$form_id}" />
\t\t\t\t    {$button_markup}
\t\t\t\t    <img id="mf_payment_loader_img" style="display: none" src="{$machform_path}images/loader_small_grey.gif" />
\t\t\t\t</li>
\t\t\t</ul>
\t\t</form>\t\t
\t\t<form id="form_payment_redirect" method="post" action="{$self_address}">
\t\t\t<input type="hidden" id="form_id_redirect" name="form_id_redirect" value="{$form_id}" />
\t\t</form>\t\t
\t</div>
</div>
EOT;
    } else {
        if ($integration_method == 'iframe') {
            $auto_height_js = <<<EOT
<script type="text/javascript" src="{$machform_path}js/jquery.ba-postmessage.min.js"></script>
<script type="text/javascript">
    \$(function(){
    \t\$.postMessage({mf_iframe_height: \$('body').outerHeight(true)}, '*', parent );
    });
</script>
EOT;
        }
        $form_markup = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html {$embed_class} xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>{$form_name}</title>
<link rel="stylesheet" type="text/css" href="{$machform_path}{$css_dir}view.css" media="all" />
<link rel="stylesheet" type="text/css" href="{$machform_path}view.mobile.css" media="all" />
{$theme_css_link}
{$font_css_markup}
<script type="text/javascript" src="{$jquery_url}"></script>
<script type="text/javascript" src="{$machform_path}js/jquery-ui/ui/jquery.effects.core.js"></script>
<script type="text/javascript" src="{$machform_path}view.js"></script>
{$stripe_js}
{$auto_height_js}
</head>
<body id="main_body" class="no_guidelines" data-machformpath="{$machform_path}">
\t
\t<img id="top" src="{$machform_path}images/top.png" alt="" />
\t<div id="form_container" class="{$form_container_class}">
\t
\t\t<h1><a>MachForm</a></h1>
\t\t<form id="form_{$form_id}" class="appnitro" method="post" action="javascript:" data-highlightcolor="{$field_highlight_color}">
\t\t    <div class="form_description">
\t\t\t\t<h2>{$form_payment_title}</h2>
\t\t\t\t<p>{$form_payment_description}</p>
\t\t\t</div>
\t\t\t{$pagination_header}
\t\t\t
\t\t\t<ul class="payment_summary">
\t\t\t\t<li class="payment_summary_amount total_payment" data-basetotal="{$total_payment_amount}">
\t\t\t\t\t<span>
\t\t\t\t\t\t<h3>{$currency_symbol}<var>0</var></h3>
\t\t\t\t\t\t<h5>{$mf_lang['payment_total']}</h5>
\t\t\t\t\t</span>
\t\t\t\t</li>
\t\t\t\t<li class="payment_summary_list">
\t\t\t\t\t<ul class="payment_list_items">
\t\t\t\t\t\t{$payment_list_items_markup}
\t\t\t\t\t</ul>
\t\t\t\t</li>
\t\t\t\t{$payment_term_markup}
\t\t\t</ul>
\t\t\t<ul class="payment_detail_form">
\t\t\t\t<li id="error_message" style="display: none">
\t\t\t\t\t\t<h3 id="error_message_title">{$mf_lang['error_title']}</h3>
\t\t\t\t\t\t<p id="error_message_desc">{$mf_lang['error_desc']}</p>
\t\t\t\t</li>\t
\t\t\t\t<li id="li_accepted_cards">
\t\t\t\t\t<img src="{$machform_path}images/cards/visa.png" alt="Visa" title="Visa" />
\t\t\t\t\t<img src="{$machform_path}images/cards/mastercard.png" alt="MasterCard" title="MasterCard" />
\t\t\t\t\t<img src="{$machform_path}images/cards/amex.png" alt="American Express" title="American Express" />
\t\t\t\t\t<img src="{$machform_path}images/cards/jcb.png" alt="JCB" title="JCB" />
\t\t\t\t\t<img src="{$machform_path}images/cards/discover.png" alt="Discover" title="Discover" />
\t\t\t\t\t<img src="{$machform_path}images/cards/diners.png" alt="Diners Club" title="Diners Club" />
\t\t\t\t</li>
\t\t\t\t<li id="li_credit_card" class="credit_card">
\t\t\t\t\t<label class="description">Credit Card <span class="required">*</span></label>
\t\t\t\t\t<div>
\t\t\t\t\t\t<span id="li_cc_span_1" class="left">
\t\t\t\t\t\t\t<input id="cc_first_name" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_first_name">First Name</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_cc_span_2" class="right">
\t\t\t\t\t\t\t<input id="cc_last_name" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_last_name">Last Name</label>
\t\t\t\t\t\t</span>

\t\t\t\t\t\t<span id="li_cc_span_3" class="left">
\t\t\t\t\t\t\t<input id="cc_number" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_number">Credit Card Number</label>
\t\t\t\t\t\t</span>
\t\t\t\t\t
\t\t\t\t\t\t<span id="li_cc_span_4" class="right">
\t\t\t\t\t\t\t<input id="cc_cvv" class="element text large" value="" type="text" />
\t\t\t\t\t\t\t<label for="cc_cvv">CVV</label>
\t\t\t\t\t\t</span>

\t\t\t\t\t\t<span id="li_cc_span_5" style="text-align: right">
\t\t\t\t\t\t\t<img id="cc_secure_icon" src="{$machform_path}images/icons/lock.png" alt="Secure" title="Secure" /> 
\t\t\t\t\t\t\t<label for="cc_expiry_month" style="display: inline">Expiration: </label>
\t\t\t\t\t\t\t<select class="element select" id="cc_expiry_month">
\t\t\t\t\t\t\t\t<option value="01">01 - January</option>
\t\t\t\t\t\t\t\t<option value="02">02 - February</option>
\t\t\t\t\t\t\t\t<option value="03">03 - March</option>
\t\t\t\t\t\t\t\t<option value="04">04 - April</option>
\t\t\t\t\t\t\t\t<option value="05">05 - May</option>
\t\t\t\t\t\t\t\t<option value="06">06 - June</option>
\t\t\t\t\t\t\t\t<option value="07">07 - July</option>
\t\t\t\t\t\t\t\t<option value="08">08 - August</option>
\t\t\t\t\t\t\t\t<option value="09">09 - September</option>
\t\t\t\t\t\t\t\t<option value="10">10 - October</option>
\t\t\t\t\t\t\t\t<option value="11">11 - November</option>
\t\t\t\t\t\t\t\t<option value="12">12 - December</option>
\t\t\t\t\t\t\t</select>
\t\t\t\t\t\t\t<select class="element select" id="cc_expiry_year">
\t\t\t\t\t\t\t\t{$year_dropdown_markup}
\t\t\t\t\t\t\t</select>
\t\t\t\t\t\t</span>
\t\t\t\t\t</div><p id="credit_card_error_message" class="error" style="display: none"></p>
\t\t\t\t</li>
\t\t\t\t<li id="li_2" class="section_break">
\t\t\t\t</li>
\t\t\t\t{$billing_address_markup}
\t\t\t\t{$shipping_address_markup}
\t\t\t\t<li id="li_buttons" class="buttons">
\t\t\t\t\t<input type="hidden" id="form_id" value="{$form_id}" />
\t\t\t\t    {$button_markup}
\t\t\t\t    <img id="mf_payment_loader_img" style="display: none" src="{$machform_path}images/loader_small_grey.gif" />
\t\t\t\t</li>
\t\t\t</ul>
\t\t</form>\t\t
\t\t<form id="form_payment_redirect" method="post" action="{$self_address}">
\t\t\t<input type="hidden" id="form_id_redirect" name="form_id_redirect" value="{$form_id}" />
\t\t</form>\t
\t</div>
\t<img id="bottom" src="{$machform_path}images/bottom.png" alt="" />
\t</body>
</html>
EOT;
    }
    return $form_markup;
}