HEX
Server: LiteSpeed
System: Linux melbournecleaninggroup 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: www-data (33)
PHP: 7.3.33-1+focal
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: /var/www/html/wp-content/plugins/acf-extended/includes/core/helpers.php
<?php

if(!defined('ABSPATH'))
    exit;

/**
 * Get Flexible
 */
if(!function_exists('get_flexible')){
    
function get_flexible($selector, $post_id = false){
    
    if(!have_rows($selector, $post_id))
        return false;
    
    // Vars
    $flexible = acf_get_field_type('flexible_content');
    
    ob_start();
        
        while(have_rows($selector, $post_id)): the_row();
        
            // Vars
            $loop = acf_get_loop('active');
            $field = $loop['field'];
            
            // Bail early if not Flexible Content
            if($field['type'] !== 'flexible_content')
                break;
    
            $loop_i = acf_get_loop('active', 'i');
            $layout = $flexible->get_layout(get_row_layout(), $field);
            
            // First row
            if($loop_i === 0){
                
                // Global
                global $is_preview;
                
                // Vars
                if(!isset($is_preview))
                    $is_preview = false;
                
                $name = $field['_name'];
                $key = $field['key'];
    
                // Actions
                do_action("acfe/flexible/enqueue",              $field, $is_preview);
                do_action("acfe/flexible/enqueue/name={$name}", $field, $is_preview);
                do_action("acfe/flexible/enqueue/key={$key}",   $field, $is_preview);
            
            }
            
            // Render: HTML Comment
            echo "\n" . '<!-- ' . $layout['label'] . ' -->' . "\n";
            
            // Render: Enqueue
            acfe_flexible_render_layout_enqueue($layout, $field);
            
            // Render: Template
            acfe_flexible_render_layout_template($layout, $field);

        endwhile;
    
    return ob_get_clean();
    
}

}

/**
 * The Flexible
 */
if(!function_exists('the_flexible')){
    
function the_flexible($selector, $post_id = false){
    
    echo get_flexible($selector, $post_id);
    
}

}

/**
 * Has Flexible
 */
if(!function_exists('has_flexible')){
    
function has_flexible($selector, $post_id = false){
    
    return have_rows($selector, $post_id);
    
}

}

/**
 * Flexible: have_settings()
 */
if(!function_exists('have_settings')){
    
function have_settings(){
    
    return have_rows('layout_settings');
    
}

}

/**
 * Flexible: the_settings()
 */
if(!function_exists('the_setting')){
    
function the_setting(){
    
    return the_row();
    
}

}

/**
 * have_archive()
 */
if(!function_exists('have_archive')){

function have_archive($_post_type = false){
    
    global $acfe_archive_i, $acfe_archive_post_type;
    
    $acfe_archive_post_type = false;
    
    if(!isset($acfe_archive_i) || $acfe_archive_i === 0){
    
        $acfe_archive_i = 0;
    
        $post_type = get_post_type();
        
        if(!empty($_post_type))
            $post_type = $_post_type;
        
        if(!post_type_exists($post_type))
            return false;
            
        $post_type_object = get_post_type_object($post_type);
        
        if(empty($post_type_object))
            return false;
        
        if(!isset($post_type_object->acfe_admin_archive) || empty($post_type_object->acfe_admin_archive))
            return false;

        $acfe_archive_post_type = $post_type;
        
        return true;
        
    }
    
    remove_filter('acf/pre_load_post_id', 'acfe_the_archive_post_id');
    
    return false;
    
}

}

/**
 * the_archive()
 */
if(!function_exists('the_archive')){
    
function the_archive(){
    
    global $acfe_archive_i;
    
    add_filter('acf/pre_load_post_id', 'acfe_the_archive_post_id', 10, 2);
    
    $acfe_archive_i++;
    
}

}

function acfe_the_archive_post_id($null, $post_id){
    
    if($post_id !== false)
        return $null;
    
    global $acfe_archive_post_type;
    
    if(empty($acfe_archive_post_type))
        return $null;
    
    $return = acf_get_valid_post_id($acfe_archive_post_type . '_archive');
    
    return $return;
    
}

/**
 * ACFE Flexible: Render Template
 */
function acfe_flexible_render_layout_template($layout, $field){
    
    // Global
    global $is_preview;
    
    // Vars
    $name = $field['_name'];
    $key = $field['key'];
    $l_name = $layout['name'];
    
    // File
    $file = acf_maybe_get($layout, 'acfe_flexible_render_template');
    
    // Filters
    $file = apply_filters("acfe/flexible/render/template",                                      $file, $field, $layout, $is_preview);
    $file = apply_filters("acfe/flexible/render/template/name={$name}",                         $file, $field, $layout, $is_preview);
    $file = apply_filters("acfe/flexible/render/template/key={$key}",                           $file, $field, $layout, $is_preview);
    $file = apply_filters("acfe/flexible/render/template/layout={$l_name}",                     $file, $field, $layout, $is_preview);
    $file = apply_filters("acfe/flexible/render/template/name={$name}&layout={$l_name}",        $file, $field, $layout, $is_preview);
    $file = apply_filters("acfe/flexible/render/template/key={$key}&layout={$l_name}",          $file, $field, $layout, $is_preview);
    
    // Deprecated
    $file = apply_filters_deprecated("acfe/flexible/layout/render/template/layout={$l_name}",              array($file, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/template/layout={$l_name}");
    $file = apply_filters_deprecated("acfe/flexible/layout/render/template/name={$name}&layout={$l_name}", array($file, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/template/name={$name}&layout={$l_name}");
    $file = apply_filters_deprecated("acfe/flexible/layout/render/template/key={$key}&layout={$l_name}",   array($file, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/template/key={$key}&layout={$l_name}");
    
    // Before Template
    do_action("acfe/flexible/render/before_template",                                       $field, $layout, $is_preview);
    do_action("acfe/flexible/render/before_template/name={$name}",                          $field, $layout, $is_preview);
    do_action("acfe/flexible/render/before_template/key={$key}",                            $field, $layout, $is_preview);
    do_action("acfe/flexible/render/before_template/layout={$l_name}",                      $field, $layout, $is_preview);
    do_action("acfe/flexible/render/before_template/name={$name}&layout={$l_name}",         $field, $layout, $is_preview);
    do_action("acfe/flexible/render/before_template/key={$key}&layout={$l_name}",           $field, $layout, $is_preview);
    
    // Deprecated
    do_action_deprecated("acfe/flexible/layout/render/before_template/layout={$l_name}",               array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/before_template/layout={$l_name}");
    do_action_deprecated("acfe/flexible/layout/render/before_template/name={$name}&layout={$l_name}",  array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/before_template/name={$name}&layout={$l_name}");
    do_action_deprecated("acfe/flexible/layout/render/before_template/key={$key}&layout={$l_name}",    array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/before_template/key={$key}&layout={$l_name}");
    
    // Check file
    if(!empty($file)){
    
        $file_found = acfe_locate_file_path($file);
        
        if(!empty($file_found)){
            
            // Front-end
            if(!$is_preview){
                
                // Include
                include($file_found);
                
            // Preview
            }else{
    
                $path = pathinfo($file);
                $extension = $path['extension'];
    
                $file_preview = substr($file,0, -strlen($extension)-1);
                $file_preview .= '-preview.' . $extension;
    
                $file_preview = acfe_locate_file_path($file_preview);
    
                // Include
                if(!empty($file_preview)){
    
                    include($file_preview);
                    
                }else{
    
                    include($file_found);
                    
                }
                
            }
            
        }
        
    }
    
    // After Template
    do_action("acfe/flexible/render/after_template",                                        $field, $layout, $is_preview);
    do_action("acfe/flexible/render/after_template/name={$name}",                           $field, $layout, $is_preview);
    do_action("acfe/flexible/render/after_template/key={$key}",                             $field, $layout, $is_preview);
    do_action("acfe/flexible/render/after_template/layout={$l_name}",                       $field, $layout, $is_preview);
    do_action("acfe/flexible/render/after_template/name={$name}&layout={$l_name}",          $field, $layout, $is_preview);
    do_action("acfe/flexible/render/after_template/key={$key}&layout={$l_name}",            $field, $layout, $is_preview);
    
    // Deprecated
    do_action_deprecated("acfe/flexible/layout/render/after_template/layout={$l_name}",                array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/after_template/layout={$l_name}");
    do_action_deprecated("acfe/flexible/layout/render/after_template/name={$name}&layout={$l_name}",   array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/after_template/name={$name}&layout={$l_name}");
    do_action_deprecated("acfe/flexible/layout/render/after_template/key={$key}&layout={$l_name}",     array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/after_template/key={$key}&layout={$l_name}");
    
}

/**
 * ACFE Flexible: Render Enqueue
 *
 * @param $layout
 * @param $field
 */
function acfe_flexible_render_layout_enqueue($layout, $field){
    
    // Global
    global $is_preview;
    
    // Vars
    $name = $field['_name'];
    $key = $field['key'];
    $l_name = $layout['name'];
    $handle = acf_slugify($name) . '-layout-' . acf_slugify($l_name);
    
    // Files
    $style = acf_maybe_get($layout, 'acfe_flexible_render_style');
    $script = acf_maybe_get($layout, 'acfe_flexible_render_script');
    
    /**
     * Actions
     */
    do_action("acfe/flexible/enqueue/layout={$l_name}",                                 $field, $layout, $is_preview);
    do_action("acfe/flexible/enqueue/name={$name}&layout={$l_name}",                    $field, $layout, $is_preview);
    do_action("acfe/flexible/enqueue/key={$key}&layout={$l_name}",                      $field, $layout, $is_preview);
    
    // Deprecated
    do_action_deprecated("acfe/flexible/layout/enqueue/layout={$l_name}",               array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/enqueue/layout={$l_name}");
    do_action_deprecated("acfe/flexible/layout/enqueue/name={$name}&layout={$l_name}",  array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/enqueue/name={$name}&layout={$l_name}");
    do_action_deprecated("acfe/flexible/layout/enqueue/key={$key}&layout={$l_name}",    array($field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/enqueue/key={$key}&layout={$l_name}");
    
    /**
     * Style
     */
    $style = apply_filters("acfe/flexible/render/style",                                        $style, $field, $layout, $is_preview);
    $style = apply_filters("acfe/flexible/render/style/name={$name}",                           $style, $field, $layout, $is_preview);
    $style = apply_filters("acfe/flexible/render/style/key={$key}",                             $style, $field, $layout, $is_preview);
    $style = apply_filters("acfe/flexible/render/style/layout={$l_name}",                       $style, $field, $layout, $is_preview);
    $style = apply_filters("acfe/flexible/render/style/name={$name}&layout={$l_name}",          $style, $field, $layout, $is_preview);
    $style = apply_filters("acfe/flexible/render/style/key={$key}&layout={$l_name}",            $style, $field, $layout, $is_preview);
    
    // Deprecated
    $style = apply_filters_deprecated("acfe/flexible/layout/render/style/layout={$l_name}",                array($style, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/style/layout={$l_name}");
    $style = apply_filters_deprecated("acfe/flexible/layout/render/style/name={$name}&layout={$l_name}",   array($style, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/style/name={$name}&layout={$l_name}");
    $style = apply_filters_deprecated("acfe/flexible/layout/render/style/key={$key}&layout={$l_name}",     array($style, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/style/key={$key}&layout={$l_name}");
    
    // Check
    if(!empty($style)){
        
        // URL starting with current domain
        if(stripos($style, home_url()) === 0){
            
            $style = str_replace(home_url(), '', $style);
            
        }
        
        // Locate
        $style_file = acfe_locate_file_url($style);
        
        // Front-end
        if(!empty($style_file)){
            
            wp_enqueue_style($handle, $style_file, array(), false, 'all');
            
        }
        
        // Preview
        if($is_preview && stripos($style, 'http://') !== 0 && stripos($style, 'https://') !== 0 && stripos($style, '//') !== 0){
            
            $path = pathinfo($style);
            $extension = $path['extension'];
            
            $style_preview = substr($style,0, -strlen($extension)-1);
            $style_preview .= '-preview.' . $extension;
            
            $style_preview = acfe_locate_file_url($style_preview);
            
            // Enqueue
            if(!empty($style_preview)){
                
                wp_enqueue_style($handle . '-preview', $style_preview, array(), false, 'all');
                
            }
            
        }
        
    }
    
    /**
     * Script
     */
    $script = apply_filters("acfe/flexible/render/script",                                      $script, $field, $layout, $is_preview);
    $script = apply_filters("acfe/flexible/render/script/name={$name}",                         $script, $field, $layout, $is_preview);
    $script = apply_filters("acfe/flexible/render/script/key={$key}",                           $script, $field, $layout, $is_preview);
    $script = apply_filters("acfe/flexible/render/script/layout={$l_name}",                     $script, $field, $layout, $is_preview);
    $script = apply_filters("acfe/flexible/render/script/name={$name}&layout={$l_name}",        $script, $field, $layout, $is_preview);
    $script = apply_filters("acfe/flexible/render/script/key={$key}&layout={$l_name}",          $script, $field, $layout, $is_preview);
    
    // Deprecated
    $script = apply_filters_deprecated("acfe/flexible/layout/render/script/layout={$l_name}",              array($script, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/script/layout={$l_name}");
    $script = apply_filters_deprecated("acfe/flexible/layout/render/script/name={$name}&layout={$l_name}", array($script, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/script/name={$name}&layout={$l_name}");
    $script = apply_filters_deprecated("acfe/flexible/layout/render/script/key={$key}&layout={$l_name}",   array($script, $field, $layout, $is_preview), '0.8.6.7', "acfe/flexible/render/script/key={$key}&layout={$l_name}");
    
    // Check
    if(!empty($script)){
    
        // URL starting with current domain
        if(stripos($script, home_url()) === 0){
    
            $script = str_replace(home_url(), '', $script);
        
        }
        
        // Locate
        $script_file = acfe_locate_file_url($script);
        
        // Front-end
        if(!$is_preview || (stripos($script, 'http://') === 0 || stripos($script, 'https://') === 0 || stripos($script, '//') === 0)){
    
            if(!empty($script_file)){
    
                wp_enqueue_script($handle, $script_file, array(), false, true);
                
            }
            
        }else{
    
            $path = pathinfo($script);
            $extension = $path['extension'];
    
            $script_preview = substr($script,0, -strlen($extension)-1);
            $script_preview .= '-preview.' . $extension;
    
            $script_preview = acfe_locate_file_url($script_preview);
    
            // Enqueue
            if(!empty($script_preview)){
        
                wp_enqueue_script($handle . '-preview', $script_preview, array(), false, true);
        
            }elseif(!empty($script_file)){
        
                wp_enqueue_script($handle, $script_file, array(), false, true);
        
            }
            
        }
        
    }
    
}

/**
 * Get Field Group from Field
 */
function acfe_get_field_group_from_field($field){
    
    if(!acf_maybe_get($field, 'parent'))
        return false;
    
    $field_parent = $field['parent'];
    
    if(!$field_ancestors = acf_get_field_ancestors($field))
        return acf_get_field_group($field_parent);
    
    // Reverse for DESC order (Top field first)
    $field_ancestors = array_reverse($field_ancestors);
    
    $field_top_ancestor = $field_ancestors[0];
    $field_top_ancestor = acf_get_field($field_top_ancestor);
    
    return acf_get_field_group($field_top_ancestor['parent']);
    
}

/**
 * Is Json
 * Source: https://stackoverflow.com/a/6041773
 */
function acfe_is_json($string){
    
    // in case string = 1
    if(is_numeric($string))
        return false;
    
    json_decode($string);
    
    return (json_last_error() == JSON_ERROR_NONE);
    
}

/*
 * Array Keys Recursive
 */
function acfe_array_keys_r($array){

    $keys = array_keys($array);

    foreach($array as $i){
        
        if(!is_array($i))
            continue;
        
        $keys = array_merge($keys, acfe_array_keys_r($i));
        
    }

    return $keys;
    
}

/*
 * Locate File URL
 * Check if file exists locally and return URL (supports parent/child theme)
 */
function acfe_locate_file_url($filenames){
    
    $located = '';
    
    foreach((array) $filenames as $filename){
        
        if(!$filename)
            continue;
        
        // Direct URL: https://www.domain.com/folder/file.js
        if(stripos($filename, 'http://') === 0 || stripos($filename, 'https://') === 0 || stripos($filename, '//') === 0){
    
            $located = $filename;
            break;
        
        }else{
    
            $_filename = ltrim($filename, '/\\');
            $abspath = untrailingslashit(ABSPATH);
    
            // Child Theme
            if(file_exists(STYLESHEETPATH . '/' . $_filename)){
        
                $located = get_stylesheet_directory_uri() . '/' . $_filename;
                break;
        
            }
        
            // Parent Theme
            elseif(file_exists(TEMPLATEPATH . '/' . $_filename)){
        
                $located = get_template_directory_uri() . '/' . $_filename;
                break;
        
            }

            // Direct file path
            elseif(file_exists($filename)){
    
                $located = acfe_get_abs_path_to_url($filename);
                break;
    
            }

            // ABSPATH file path
            elseif(file_exists($abspath . '/' . $_filename)){
    
                $located = acfe_get_abs_path_to_url($abspath . '/' . $_filename);
                break;
    
            }
        
            // WP Content Dir
            elseif(file_exists(WP_CONTENT_DIR . '/' . $_filename)){
        
                $located = WP_CONTENT_URL . '/' . $_filename;
                break;
        
            }
            
        }
        
    }
 
    return $located;
    
}

/*
 * Locate File Path
 * Based on wp-includes\template.php:653
 */
function acfe_locate_file_path($filenames){
    
    $located = '';
    
    foreach((array) $filenames as $filename){
        
        if(!$filename)
            continue;
        
        $_filename = ltrim($filename, '/\\');
        $abspath = untrailingslashit(ABSPATH);
        
        // Stylesheet file path
        if(file_exists(STYLESHEETPATH . '/' . $_filename)){
            
            $located = STYLESHEETPATH . '/' . $_filename;
            break;
            
        }

        // Template file path
        elseif(file_exists(TEMPLATEPATH . '/' . $_filename)){
            
            $located = TEMPLATEPATH . '/' . $_filename;
            break;
            
        }

        // Direct file path
        elseif(file_exists($filename)){
    
            $located = $filename;
            break;
    
        }

        // ABSPATH file path
        elseif(file_exists($abspath . '/' . $_filename)){
    
            $located = $abspath . '/' . $_filename;
            break;
    
        }

        // WP Content Dir
        elseif(file_exists(WP_CONTENT_DIR . '/' . $_filename)){
    
            $located = WP_CONTENT_DIR . '/' . $_filename;
            break;
    
        }
        
    }
    
    return $located;
    
}

/**
 * Convert ABSPATH . '/url' to https://www.domain.com/url
 */
function acfe_get_abs_path_to_url($path = ''){
    
    $abspath = untrailingslashit(ABSPATH);
    
    $url = str_replace($abspath, site_url(), $path);
    $url = wp_normalize_path($url);
    
    return esc_url_raw($url);
    
}

/**
 * Get Roles
 */
function acfe_get_roles($filtered_user_roles = array()){
    
    $list = array();
    
    global $wp_roles;
    
    if(is_multisite())
        $list['super_admin'] = __('Super Admin');
    
    foreach($wp_roles->roles as $role => $settings){
        
        $list[$role] = $settings['name'];
        
    }
    
    $user_roles = $list;
    
    if(!empty($filtered_user_roles)){
    
        $user_roles = array();
        
        foreach($list as $role => $role_label){
            
            if(!in_array($role, $filtered_user_roles))
                continue;
            
            $user_roles[$role] = $role_label;
            
        }
    
    }
    
    return $user_roles;
    
}

/**
 * Get Current Roles
 */
function acfe_get_current_user_roles(){
    
    global $current_user;
    
    if(!is_object($current_user) || !isset($current_user->roles))
        return false;
    
    $roles = $current_user->roles;
    
    if(is_multisite() && current_user_can('setup_network'))
        $roles[] = 'super_admin';
    
    return $roles;
    
}

/**
 * Get post types objects
 */
function acfe_get_post_type_objects($args = array()){
    
    // vars
    $return = array();
    
    // Post Types
    $posts_types = acf_get_post_types($args);
    
    // Choices
    if(!empty($posts_types)){
        
        foreach($posts_types as $post_type){
            
            $post_type_object = get_post_type_object($post_type);
            
            $return[$post_type_object->name] = $post_type_object;
            
        }
        
    }
    
    return $return;
    
}

/**
 * Get taxonomy objects
 */
function acfe_get_taxonomy_objects($args = array()){
    
    // vars
    $return = array();
    
    // Post Types
    $taxonomies = acf_get_taxonomies($args);
    
    // Choices
    if(!empty($taxonomies)){
        
        foreach($taxonomies as $taxonomy){
            
            $taxonomy_object = get_taxonomy($taxonomy);
            
            $return[$taxonomy_object->name] = $taxonomy_object;
            
        }
        
    }
    
    return $return;
    
}

/**
 * Get post statuses
 */
function acfe_get_pretty_post_statuses($posts_statuses = array()){
	
	if(empty($posts_statuses)){
		
		$posts_statuses = get_post_stati(array(), 'names');
		
	}
    
    $return = array();
    
    // Choices
    if(!empty($posts_statuses)){
        
        foreach($posts_statuses as $post_status){
            
            $post_status_object = get_post_status_object($post_status);
            
            $return[$post_status_object->name] = $post_status_object->label . ' (' . $post_status_object->name . ')';
            
        }
        
    }
    
    return $return;
	
}

/**
 * Get forms
 */
function acfe_get_pretty_forms($forms = array()){
	
	if(empty($forms)){
        
        $forms = get_posts(array(
            'post_type'         => 'acfe-form',
            'posts_per_page'    => -1,
            'fields'            => 'ids',
            'orderby'           => 'title',
            'order'             => 'ASC',
        ));
		
	}
    
    $return = array();
    
    // Choices
    if(!empty($forms)){
        
        foreach($forms as $form_id){
            
            $form_name = get_the_title($form_id);
            
            $return[$form_id] = $form_name;
            
        }
        
    }
    
    return $return;
	
}

/**
 * Starts with
 */
function acfe_starts_with($haystack, $needle){
        
    $length = strlen($needle);
    return (substr($haystack, 0, $length) === $needle);

}

/**
 * Ends with
 */
function acfe_ends_with($haystack, $needle){
        
    $length = strlen($needle);
    
    if($length == 0)
        return true;

    return (substr($haystack, -$length) === $needle);
    
}

function acfe_form_is_admin(){
    
    if((is_admin() && !wp_doing_ajax()) || (is_admin() && wp_doing_ajax() && acf_maybe_get_POST('_acf_screen') !== 'acfe_form' && acf_maybe_get_POST('_acf_screen') !== 'acf_form'))
        return true;
    
    return false;
    
}

function acfe_form_is_front(){
    
    if(!is_admin() || (is_admin() && wp_doing_ajax() && (acf_maybe_get_POST('_acf_screen') === 'acfe_form' || acf_maybe_get_POST('_acf_screen') === 'acf_form')))
        return true;
    
    return false;
    
}

function acfe_form_decrypt_args(){
    
    if(!acf_maybe_get_POST('_acf_form'))
        return false;
    
    $form = json_decode(acf_decrypt($_POST['_acf_form']), true);
    
    if(empty($form))
        return false;
    
    return $form;
    
}

function acfe_is_form_success($form_name = false){
    
    if(!acf_maybe_get_POST('_acf_form'))
        return false;
    
    $form = acfe_form_decrypt_args();
    
    if(empty($form))
        return false;
    
    if(!empty($form_name) && acf_maybe_get($form, 'name') !== $form_name)
        return false;
    
    return true;
    
}

function acfe_form_is_submitted($form_name = false){
    
    _deprecated_function('ACF Extended - Dynamic Forms: "acfe_form_is_submitted()" function', '0.8.7.5', "acfe_is_form_success()");
    
    return acfe_is_form_success($form_name);
    
}

function acfe_form_unique_action_id($form, $type){
    
    $name = $form['name'] . '-' . $type;
    
    global $acfe_form_uniqid;
    
    $acfe_form_uniqid = acf_get_array($acfe_form_uniqid);
    
    if(!isset($acfe_form_uniqid[$type])){
    
        $acfe_form_uniqid[$type] = 1;
        
    }
    
    if($acfe_form_uniqid[$type] > 1)
        $name = $name . '-' . $acfe_form_uniqid[$type];
    
    $acfe_form_uniqid[$type]++;
    
    return $name;
    
}

function acfe_form_get_actions(){
    
    return get_query_var('acfe_form_actions', array());
    
}

function acfe_form_get_action($name = false){
    
    $actions = acfe_form_get_actions();
    
    // No Action
    if(empty($actions))
        return false;
    
    // Last Action
    if(empty($name))
        return end($actions);
    
    if(isset($actions[$name]))
        return $actions[$name];
    
    return false;
    
}

function acfe_array_insert_before($key, array &$array, $new_key, $new_value){
    
    if(!array_key_exists($key, $array))
        return $array;
    
    $new = array();
    
    foreach($array as $k => $value){
        
        if($k === $key)
            $new[$new_key] = $new_value;
        
        $new[$k] = $value;
        
    }
    
    return $new;
    
}

function acfe_array_insert_after($key, array &$array, $new_key, $new_value){
    
    if(!array_key_exists($key, $array))
        return $array;
    
    $new = array();
    
    foreach($array as $k => $value){
        
        $new[$k] = $value;
        
        if($k === $key)
            $new[$new_key] = $new_value;
        
    }
    
    return $new;
    
}

function acfe_array_move(&$array, $a, $b){
    
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
    
}

function acfe_add_validation_error($selector = '', $message = ''){
    
    // General error
    if(empty($selector))
        return acf_add_validation_error('', $message);
    
    $row = acf_get_loop('active');
    
    if($row){
        
        $field = acf_get_sub_field($selector, $row['field']);
        
    }
    
    else{
        
        $field = acf_get_field($selector);
        
    }
    
    // Field not found: General error
    if(!$field)
        return acf_add_validation_error('', $message);
    
    // Specific field error
    add_filter('acf/validate_value/key=' . $field['key'], function($valid) use($message){
        
        return $message;
        
    });
    
}

/*
 * Similar to acf_get_taxonomy_terms() but returns array('256' => 'Category name') instead of array('category:category_name' => 'Category name')
 */
function acfe_get_taxonomy_terms_ids($taxonomies = array()){
	
	// force array
	$taxonomies = acf_get_array($taxonomies);
	
	// get pretty taxonomy names
	$taxonomies = acf_get_pretty_taxonomies( $taxonomies );
	
	// vars
	$r = array();
	
	// populate $r
	foreach( array_keys($taxonomies) as $taxonomy ) {
		
		// vars
		$label = $taxonomies[$taxonomy];
		$is_hierarchical = is_taxonomy_hierarchical( $taxonomy );
		
		$terms = acf_get_terms(array(
			'taxonomy'		=> $taxonomy,
			'hide_empty' 	=> false
		));
		
		// bail early if no terms
		if(empty($terms))
		    continue;
		
		// sort into hierachial order!
		if($is_hierarchical){
			
			$terms = _get_term_children( 0, $terms, $taxonomy );
			
		}
		
		// add placeholder		
		$r[ $label ] = array();
		
		// add choices
		foreach($terms as $term){
		
			$k = "{$term->term_id}"; 
			$r[$label][$k] = acf_get_term_title($term);
			
		}
		
	}
	
	// return
	return $r;
	
}

function acfe_get_term_level($term, $taxonomy){
    
    $ancestors = get_ancestors($term, $taxonomy);
    
    return count($ancestors) + 1;
    
}

function acfe_number_suffix($num){
    
    if(!in_array(($num % 100), array(11,12,13))){
        
        switch($num % 10){
            case 1:  return $num . 'st';
            case 2:  return $num . 'nd';
            case 3:  return $num . 'rd';
        }
        
    }
    
    return $num . 'th';
    
}

function acfe_array_to_string($array = array()){
	
	if(!is_array($array))
		return $array;
	
	if(empty($array))
		return false;
	
	if(acf_is_sequential_array($array)){
		
		foreach($array as $k => $v){
			
			if(!is_string($v))
				continue;
			
			return $v;
			
		}
		
	}elseif(acf_is_associative_array($array)){
		
		foreach($array as $k => $v){
			
			if(!is_string($v))
				continue;
			
			return $v;
			
		}
		
	}
	
	return false;
	
}

function acfe_get_acf_screen_id($page = ''){

    $prefix = sanitize_title( __("Custom Fields", 'acf') );
    
    if(empty($page))
        return $prefix;
    
    return $prefix . '_page_' . $page;
    
}

function acfe_is_admin_screen($modules = false){

    // bail early if not defined
    if(!function_exists('get_current_screen'))
        return false;

    // vars
    $screen = get_current_screen();

    // no screen
    if(!$screen)
        return false;
    
    $post_types = array(
        'acf-field-group',  // ACF
    );
    
    $field_group_category = false;
    
    // include ACF Extended Modules?
    if($modules){
        
        $post_types[] = 'acfe-dbt';     // Dynamic Block Type
        $post_types[] = 'acfe-dop';     // Dynamic Option Page
        $post_types[] = 'acfe-dpt';     // Dynamic Post Type
        $post_types[] = 'acfe-dt';      // Dynamic Taxonomy
        $post_types[] = 'acfe-form';    // Dynamic Form
        
        // Field Group Category
        $field_group_category = $screen->post_type === 'post' && $screen->taxonomy === 'acf-field-group-category';
        
    }
    
    if(in_array($screen->post_type, $post_types) || $field_group_category)
        return true;
    
    return false;
    
}

function acfe_is_dev(){
	
	return acf_get_setting('acfe/dev', false) || (defined('ACFE_dev') && ACFE_dev);
	
}

function acfe_is_super_dev(){
	
	return acf_get_setting('acfe/super_dev', false) || (defined('ACFE_super_dev') && ACFE_super_dev);
	
}

function acfe_update_setting($name, $value){
    
    return acf_update_setting("acfe/{$name}", $value);
    
}

function acfe_append_setting($name, $value){
    
    return acf_append_setting("acfe/{$name}", $value);
    
}

function acfe_get_setting($name, $value = null){
    
    return acf_get_setting("acfe/{$name}", $value);
    
}

function acfe_get_locations_array($locations){
    
    $return = array();
    $types = acf_get_location_rule_types();
    
    if(!$locations || !$types)
        return $return;
    
    $icon_default = 'admin-generic';
    
    $icons = array(
        'edit' => array(
            'post_type',
            'post_template',
            'post_status',
            'post_format',
            'post',
        ),
        'media-default' => array(
            'page_template',
            'page_type',
            'page_parent',
            'page',
        ),
        'admin-users' => array(
            'current_user',
            'user_form',
        ),
        'welcome-widgets-menus' => array(
            'widget',
            'nav_menu',
            'nav_menu_item',
        ),
        'category' => array(
            'taxonomy',
            'post_category',
            'post_taxonomy',
        ),
        'admin-comments' => array(
            'comment',
        ),
        'paperclip' => array(
            'attachment',
        ),
        'admin-settings' => array(
            'options_page',
        ),
        'businessman' => array(
            'current_user_role',
            'user_role',
        ),
        'admin-appearance' => array(
            'acfe_template'
        )
    );
    
    $rules = array();
    
    foreach($types as $key => $type){
        
        foreach($type as $slug => $name){
            
            $icon = $icon_default;
            
            foreach($icons as $_icon => $icon_slugs){
                
                if(!in_array($slug, $icon_slugs))
                    continue;
                
                $icon = $_icon;
                break;
                
            }
            
            $rules[$slug] = array(
                'name'  => $slug,
                'label' => $name,
                'icon'  => $icon
            );
            
        }
        
    }
    
    foreach($locations as $group){
        
        if(!acf_maybe_get($rules, $group['param']) || !acf_maybe_get($group, 'value'))
            continue;
        
        // init
        $rule = $rules[$group['param']];
        
        // vars
        $icon = $rule['icon'];
        $name = $rule['name'];
        $label = $rule['label'];
        $operator = $group['operator'] === '==' ? '=' : $group['operator'];
        $value = $group['value'];
        
        // Exception for Post/Page/page Parent ID
        if(in_array($group['param'], array('post', 'page', 'page_parent'))){
    
            $value = get_the_title((int) $value);
        
        }else{
    
            // Validate value
            $values = acf_get_location_rule_values($group);
    
            if(!empty($values) && is_array($values)){
        
                foreach($values as $value_slug => $value_name){
            
                    if($value != $value_slug)
                        continue;
            
                    $value = $value_name;
    
                    if(is_array($value_name) && isset($value_name[$value_slug])){
        
                        $value = $value_name[$value_slug];
        
                    }
            
                    break;
            
                }
        
            }
        
        }
        
        // html
        $title = $label . ' ' . $operator . ' ' . $value;
        
        $atts = array(
            'class' => 'acf-js-tooltip dashicons dashicons-' . $icon,
            'title' => $title
        );
        
        if($operator === '!='){
            
            $atts['style'] = 'color: #ccc;';
            
        }
        
        $html = '<span ' . acf_esc_attr($atts) . '></span>';
        
        $return[] = array(
            'html'              => $html,
            'icon'              => $icon,
            'title'             => $title,
            'name'              => $name,
            'label'             => $label,
            'operator'          => $operator,
            'value'             => $value,
        );
        
    }
    
    return $return;
    
}

function acfe_render_field_group_locations_html($field_group){
    
    foreach($field_group['location'] as $groups){
        
        $html = acfe_get_locations_array($groups);
        
        if($html){
            
            $array = array();
            
            foreach($html as $location){
                
                $array[] = $location['html'];
                
            }
            
            echo implode(' ', $array);
            
        }
        
    }
    
}

function acfe_unset(&$array, $key){

    if(isset($array[$key]))
        unset($array[$key]);

}

function acfe_unarray($val){
    
    if(is_array($val)){
        return reset($val);
    }
    
    return $val;
}

function acfe_get_post_id(){
    
    return acf_get_valid_post_id();
    
}

function acfe_highlight(){
    
    ini_set("highlight.comment", "#555");
    /*
    ini_set("highlight.keyword", "#0000BB"); // #4B2AFF
    ini_set("highlight.default", "#222222");
    ini_set("highlight.string", "#777777");
    */
    
    static $on = false;
    
    if ( !$on ) {
        ob_start();
    } else {
        $buffer = "<?php\n" . ob_get_contents();
        ob_end_clean();
        $code = highlight_string($buffer, true);
        
        $code = str_replace("&lt;?php<br />", '', $code);
        $code = str_replace("<code>", '', $code);
        $code = str_replace("</code>", '', $code);
        
        echo '<div class="acfe-pre-highlight">' . $code . '</div>';
    }
    
    $on = !$on;
    
}

/*
 * https://gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
 */
function acfe_remove_class_filter( $tag, $class_name = '', $method_name = '', $priority = 10 ) {
    
    global $wp_filter;
    
    // Check that filter actually exists first
    if ( ! isset( $wp_filter[ $tag ] ) ) {
        return FALSE;
    }
    
    /**
     * If filter config is an object, means we're using WordPress 4.7+ and the config is no longer
     * a simple array, rather it is an object that implements the ArrayAccess interface.
     *
     * To be backwards compatible, we set $callbacks equal to the correct array as a reference (so $wp_filter is updated)
     *
     * @see https://make.wordpress.org/core/2016/09/08/wp_hook-next-generation-actions-and-filters/
     */
    if ( is_object( $wp_filter[ $tag ] ) && isset( $wp_filter[ $tag ]->callbacks ) ) {
        // Create $fob object from filter tag, to use below
        $fob       = $wp_filter[ $tag ];
        $callbacks = &$wp_filter[ $tag ]->callbacks;
    } else {
        $callbacks = &$wp_filter[ $tag ];
    }
    
    // Exit if there aren't any callbacks for specified priority
    if ( ! isset( $callbacks[ $priority ] ) || empty( $callbacks[ $priority ] ) ) {
        return FALSE;
    }
    
    // Loop through each filter for the specified priority, looking for our class & method
    foreach ( (array) $callbacks[ $priority ] as $filter_id => $filter ) {
        
        // Filter should always be an array - array( $this, 'method' ), if not goto next
        if ( ! isset( $filter['function'] ) || ! is_array( $filter['function'] ) ) {
            continue;
        }
        
        // If first value in array is not an object, it can't be a class
        if ( ! is_object( $filter['function'][0] ) ) {
            continue;
        }
        
        // Method doesn't match the one we're looking for, goto next
        if ( $filter['function'][1] !== $method_name ) {
            continue;
        }
        
        // Method matched, now let's check the Class
        if ( get_class( $filter['function'][0] ) === $class_name ) {
            
            // WordPress 4.7+ use core remove_filter() since we found the class object
            if ( isset( $fob ) ) {
                // Handles removing filter, reseting callback priority keys mid-iteration, etc.
                $fob->remove_filter( $tag, $filter['function'], $priority );
                
            } else {
                // Use legacy removal process (pre 4.7)
                unset( $callbacks[ $priority ][ $filter_id ] );
                // and if it was the only filter in that priority, unset that priority
                if ( empty( $callbacks[ $priority ] ) ) {
                    unset( $callbacks[ $priority ] );
                }
                // and if the only filter for that tag, set the tag to an empty array
                if ( empty( $callbacks ) ) {
                    $callbacks = array();
                }
                // Remove this filter from merged_filters, which specifies if filters have been sorted
                unset( $GLOBALS['merged_filters'][ $tag ] );
            }
            
            return TRUE;
        }
    }
    
    return FALSE;
}

function acfe_remove_class_action( $tag, $class_name = '', $method_name = '', $priority = 10 ) {
    return acfe_remove_class_filter( $tag, $class_name, $method_name, $priority );
}

/*
 * Similar to get_fields() but with field keys
 */
function acfe_get_fields($post_id = false, $format_value = true){
    
    // vars
    $fields = get_field_objects($post_id, $format_value);
    $meta = array();
    
    // bail early
    if(!$fields)
        return false;
    
    // populate
    foreach($fields as $k => $field){
        
        $meta[ $field['key'] ] = $field['value'];
        
    }
    
    // return
    return $meta;

}