/home/arranoyd/magicraft/wp-content/themes/massive-dynamic/lib/mbuilder/includes/ajax-actions.php
<?php
/**
 * mBuilder AJAX functions
 *
 * @author PixFlow
 */
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {


    /**
     * Load shortcodes file
     *
     * @since 2.0.0
     */
    function pixflow_require_shortcodes_files() {
        $shortcodesBootStrap = PixflowFramework::Pixflow_Shortcodes();
        PixflowFramework::Pixflow_Require_Files( PIXFLOW_THEME_LIB . '/shortcodes', $shortcodesBootStrap );
        do_action( 'mBuilder_shortcodes_init' );
        return true;
    }

    /**
     * Setting Panel Generator
     *
     * @since 1.0.0
     */
    function mBuilder_settingPanel() {
        global $mBuilderShortcodes;
        do_action( 'mBuilder_shortcodes_init' );
        $type = $_POST[ 'type' ];
        $content = $_POST[ 'content' ];
        MBuilder::load_shortcode_map( $type );
        $attrs = MBuilder::parseAttributes( $_POST[ 'attr' ] );
        if ( $content == '' && trim( $_POST[ 'attr' ] ) == '' ) {
            $content = $mBuilderShortcodes[ $type ][ 'default_content' ];
        }
        // Check Text shortcode and add multi title attr to it
        if ( 'md_text' == $type && ( isset( $attrs[ 'md_text_number' ] ) && $attrs[ 'md_text_number' ] > 1 ) && $md_text_use_title_slider == 'yes' ) {
            $attrs[] = 'md_text_use_title_slider="yes';
            $attrs[ 'md_text_use_title_slider' ] = 'yes';
        }
        echo '<form id="mBuilder-form" onsubmit="return false;">';
        MBuilder::buildForm( $mBuilderShortcodes[ $type ][ 'params' ], $attrs, $content );
        echo '</form>';
        wp_die();

    }



    add_action( 'wp_ajax_pixflow_clear_md_cache', 'pixflow_cleaar_md_cache' );
    add_action( 'wp_ajax_nopriv_pixflow_clear_md_cache', 'pixflow_cleaar_md_cache' );

    function pixflow_cleaar_md_cache(){
        $upload_dir   = wp_upload_dir();
        $dirname=$upload_dir['basedir'] . "/md_cache";

        if (is_dir($dirname))
            $dir_handle = opendir($dirname);
        if (!$dir_handle)
            return false;
        while($file = readdir($dir_handle)) {
            if ($file != "." && $file != "..") {
                if (!is_dir($dirname."/".$file))
                    unlink($dirname."/".$file);
                else
                    delete_directory($dirname.'/'.$file);
            }
        }
        closedir($dir_handle);
        rmdir($dirname);
        return true;
    }





    add_action( 'wp_ajax_mBuilder_settingPanel', 'mBuilder_settingPanel' );
    add_action( 'wp_ajax_nopriv_mBuilder_settingPanel', 'mBuilder_settingPanel' );

    /**
     * execute shortcode and build it then send it to the builder
     *
     * @since 1.0.0
     */
    // @Todo: Refactor
    function mBuilder_buildShortcode() {
        global $shortcode_tags, $mBuilderShortcodes, $in_mbuilder;
        $in_mbuilder = true;
        pixflow_require_shortcodes_files();
        $action = $_POST[ 'act' ];
        $shortcode = $_POST[ 'shortcode' ];
        $attrs = ( isset( $_POST[ 'attrs' ] ) ) ? $_POST[ 'attrs' ] : '{}';
        $attrs = MBuilder::parseAttributes( $attrs );
        MBuilder::load_shortcode_map( $shortcode );

        /*add Column size to mbuilder tag*/
        $el_classes = '';

        if ( $_POST[ 'shortcode' ] == 'vc_column' || $_POST[ 'shortcode' ] == 'vc_column_inner' ) {
            $width = ( isset( $attrs[ 'width' ] ) ) ? $attrs[ 'width' ] : '1/1';
            $width = explode( '/', $width );
            $width = $width[ 0 ] / $width[ 1 ] * 12;
            $el_classes .= "col-sm-$width";
        }
        if ( $action == 'build' ) {
            if ( $_POST[ 'shortcode' ] == 'vc_row' && isset( $attrs[ 'section_id' ] ) ) {
                $section_name = $attrs[ 'section_id' ];
                if ( isset( $_POST[ 'section_type' ] ) && 'custom' == $_POST[ 'section_type' ] ) {
                    $section_list = get_option( 'pixflow_custom_section' );
                    $section_list = json_decode( $section_list, true );
                    $goal_Section = $section_list[ $section_name ];
                    $content = $goal_Section[ 'content' ];
                    $mBuilderShortcodes[ 'vc_row' ][ 'default_content' ] = str_replace( '\\', '', $content );
                    unset( $goal_Section[ 'content' ] );
                    $row_attrs = $attrs = $goal_Section;
                } else {
                    $section_id = $attrs[ 'section_id' ];
                    require_once( PIXFLOW_THEME_SECTIONS . "/section-$section_id.php" );
                    $content = $section_params[ 'content' ];
                    $mBuilderShortcodes[ 'vc_row' ][ 'default_content' ] = $content;
                    unset( $section_params[ 'content' ] );
                    $row_attrs = $attrs = $section_params;
                }

            } else {
                $mBuilderShortcodes[ 'vc_row' ][ 'default_content' ] = '[vc_column][/vc_column]';
                MBuilder::load_shortcode_map( 'vc_column' );
                MBuilder::print_shortcode_map( 'vc_column' );
            }
            $mBuilderShortcodes[ 'vc_row_inner' ][ 'default_content' ] = '[vc_column_inner][/vc_column_inner]';
            if ( $_POST[ 'shortcode' ] != 'vc_row' ) {
                echo "<div class='mBuilder-element mBuilder-" . esc_attr( $shortcode ) . " vc_" . esc_attr( $shortcode ) . " " . esc_attr( $el_classes ) . "' data-mBuilder-el='" . esc_attr( $shortcode ) . "'>";
            }

            // Get enqueued scripts and styles before run shortcode
            $beforeScripts = $beforeStyles = $afterScripts = $afterStyles = array();
            global $wp_scripts, $wp_styles;
            $scripts = $wp_scripts->queue;
            $styles = $wp_styles->queue;
            foreach ( $scripts as $handle ) {
                $beforeScripts[] = $wp_scripts->registered[ $handle ]->src;
            }
            foreach ( $styles as $handle ) {
                $beforeStyles[] = $wp_styles->registered[ $handle ]->src;
            }
            ob_start();
            print( call_user_func_array( $shortcode_tags[ $_POST[ 'shortcode' ] ], array( $attrs, $mBuilderShortcodes[ $_POST[ 'shortcode' ] ][ 'default_content' ], $_POST[ 'shortcode' ] ) ) );
            $output = ob_get_clean();
            // Get enqueued scripts and styles in shortcode and print them
            global $wp_scripts, $wp_styles;
            $scripts = $wp_scripts->queue;
            $styles = $wp_styles->queue;
            foreach ( $scripts as $handle ) {
                $afterScripts[] = $wp_scripts->registered[ $handle ]->src;
            }
            $shortcodeScripts = array_diff( $afterScripts, $beforeScripts );
            foreach ( $shortcodeScripts as $script ) {
                $script = ( substr( $script, 0, '4' ) == '/wp-' ) ? get_site_url() . $script : $script;
                echo '<script src="' . esc_url( $script ) . '"></script>';
            }
            foreach ( $styles as $handle ) {
                $afterStyles[] = $wp_styles->registered[ $handle ]->src;
            }
            $shortcodeStyles = array_diff( $afterStyles, $beforeStyles );
            foreach ( $shortcodeStyles as $style ) {
                $style = ( substr( $style, 0, '4' ) == '/wp-' ) ? get_site_url() . $style : $style;
                echo "<link rel='stylesheet' href='" . esc_url( $style ) . "' type='text/css' media='all'/>";
            }
            MBuilder::print_shortcode_map( $shortcode );
            // Load shortcodes map used in section if section dropped
            if ( isset( $section_name ) && $section_name != '' ) {
                $shortcodes = MBuilder::get_shortcodes_by_content( $content );
                foreach ( $shortcodes as $used_shortcode ) {
                    MBuilder::load_shortcode_map( $used_shortcode );
                    MBuilder::print_shortcode_map( $used_shortcode );
                }
            }
            /* Load shortcode params if has child like tabs */
            if ( isset( $mBuilderShortcodes[ $shortcode ][ 'as_parent' ][ 'only' ] ) ) {
                $child_shortcode = $mBuilderShortcodes[ $shortcode ][ 'as_parent' ][ 'only' ];
                MBuilder::load_shortcode_map( $child_shortcode );
                MBuilder::print_shortcode_map( $child_shortcode );
            }

            print( $output );
            if ( $_POST[ 'shortcode' ] != 'vc_row' ) {
                echo "</div>";
            }
        } elseif ( $action == 'rebuild' ) {
            $id = $_POST[ 'id' ];
            $content = stripslashes( $_POST[ 'content' ] );
            // Get enqueued scripts and styles before run shortcode
            $beforeScripts = $beforeStyles = $afterScripts = $afterStyles = array();
            global $wp_scripts, $wp_styles;
            $scripts = $wp_scripts->queue;
            $styles = $wp_styles->queue;
            foreach ( $scripts as $handle ) {
                $beforeScripts[] = $wp_scripts->registered[ $handle ]->src;
            }
            foreach ( $styles as $handle ) {
                $beforeStyles[] = $wp_styles->registered[ $handle ]->src;
            }
            if ( $_POST[ 'shortcode' ] != 'vc_row' ) {
                echo "<div class='mBuilder-element mBuilder-" . esc_attr( $shortcode ) . " vc_" . esc_attr( $shortcode ) . " " . esc_attr( $el_classes ) . "' data-mBuilder-el='" . esc_attr( $shortcode ) . "' data-mbuilder-id='" . esc_attr( $id ) . "'>";
            }
            ob_start();
            print( call_user_func_array( $shortcode_tags[ $shortcode ], array( $attrs, $content, $shortcode ) ) );
            $output = ob_get_clean();
            // Get enqueued scripts and styles in shortcode and print them
            global $wp_scripts, $wp_styles;
            $scripts = $wp_scripts->queue;
            $styles = $wp_styles->queue;
            foreach ( $scripts as $handle ) {
                $afterScripts[] = $wp_scripts->registered[ $handle ]->src;
            }
            $shortcodeScripts = array_diff( $afterScripts, $beforeScripts );
            foreach ( $shortcodeScripts as $script ) {
                $script = ( substr( $script, 0, '4' ) == '/wp-' ) ? get_site_url() . $script : $script;
                echo '<script src="' . esc_url( $script ) . '"></script>';
            }
            foreach ( $styles as $handle ) {
                $afterStyles[] = $wp_styles->registered[ $handle ]->src;
            }
            $shortcodeStyles = array_diff( $afterStyles, $beforeStyles );
            foreach ( $shortcodeStyles as $style ) {
                $style = ( substr( $style, 0, '4' ) == '/wp-' ) ? get_site_url() . $style : $style;
                echo "<link rel='stylesheet' href='" . esc_url( $style ) . "' type='text/css' media='all'/>";
            }
            print( $output );
            if ( $_POST[ 'shortcode' ] != 'vc_row' ) {
                pixflow_load_fonts();
                echo "</div>";
            }
        }
        wp_die();
    }

    add_action( 'wp_ajax_mBuilder_buildShortcode', 'mBuilder_buildShortcode' );
    add_action( 'wp_ajax_nopriv_mBuilder_buildShortcode', 'mBuilder_buildShortcode' );

    /**
     * do shortcode and build it then send it to the builder
     *
     * @since 1.0.0
     */
    function mBuilder_doShortcode() {
        global $in_mbuilder;
        pixflow_require_shortcodes_files();
        $in_mbuilder = true;
        $shortcode = stripslashes( $_POST[ 'shortcode' ] );

        print( pixflow_js_remove_wpautop( $shortcode ) );

        wp_die();
    }

    add_action( 'wp_ajax_mBuilder_doShortcode', 'mBuilder_doShortcode' );
    add_action( 'wp_ajax_nopriv_mBuilder_doShortcode', 'mBuilder_doShortcode' );

    /**
     * Get content from builder and return generated wordPress shortcodes
     *
     * @return void
     * @since 1.0.0
     */
    function mBuilder_getContent() {
        $models = $_POST[ 'models' ];
        $builder = MBuilder::getInstance();
        $content = $builder->getContent( $models );

        print( $content );
        wp_die();
    }

    add_action( 'wp_ajax_mBuilder_getContent', 'mBuilder_getContent' );
    add_action( 'wp_ajax_nopriv_mBuilder_getContent', 'mBuilder_getContent' );

    /**
     * Get content from builder and generate wordpress shortcodes then save it to the database
     *
     * @return void
     * @since 1.0.0
     */
//@TODO: keep (change camelcase)
    function mBuilder_saveContent() {
        $models = $_POST[ 'models' ];
        $id = $_POST[ 'id' ];
        $builder = MBuilder::getInstance();
        $builder->getContent( $models );
        $builder->saveContent( $id );
        $builder->generate_static_js_css( $id );
        wp_die();
    }

    add_action( 'wp_ajax_mBuilder_saveContent', 'mBuilder_saveContent' );
    add_action( 'wp_ajax_nopriv_mBuilder_saveContent', 'mBuilder_saveContent' );

    /**
     * Google Font Styles DropDown Loader
     *
     * @param $key
     * @param $value
     *
     * @return void|string - options of select input
     * @since 1.0.0
     */
    function pixflow_loadFontStyles( $key = 0, $value = '' ) {
        global $fonts;
        $fontKey = ( isset( $_POST[ 'fontKey' ] ) ) ? $_POST[ 'fontKey' ] : $key;
        $value = ( isset( $_POST[ 'value' ] ) ) ? $_POST[ 'value' ] : $value;
        $fontStyles = $fonts[ $fontKey ];
        $fontStyles = explode( ',', $fontStyles->font_types );
        $options = '';
        $options_classes = ' dropdown-option active-text-color ';
        foreach ( $fontStyles as $style ) {
            if ( strtolower( $value ) == strtolower( $style ) ) {
                $options_classes += ' selected-option ';
            } else {
                $options_classes = ' dropdown-option active-text-color ';
            }
            $options .= '<div data-dropdown-value="' . $style . '" class="' . $options_classes . '">';
            $title = explode( ':', $style );
            $options .= $title[ 0 ] . '</div>';
        }
        if ( isset( $_POST[ 'fontKey' ] ) ) {
            print( $options );
            wp_die();
        } else {
            return $options;
        }
    }

    add_action( 'wp_ajax_pixflow_loadFontStyles', 'pixflow_loadFontStyles' );
    add_action( 'wp_ajax_nopriv_pixflow_loadFontStyles', 'pixflow_loadFontStyles' );
}