<?php
if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

define( 'QTX_WIDGET_CSS',
    '.qtranxs_widget ul { margin: 0; }
.qtranxs_widget ul li
{
display: inline; /* horizontal list, use "list-item" or other appropriate value for vertical list */
list-style-type: none; /* use "initial" or other to enable bullets */
margin: 0 5px 0 0; /* adjust spacing between items */
opacity: 0.5;
-o-transition: 1s ease opacity;
-moz-transition: 1s ease opacity;
-webkit-transition: 1s ease opacity;
transition: 1s ease opacity;
}
/* .qtranxs_widget ul li span { margin: 0 5px 0 0; } */ /* other way to control spacing */
.qtranxs_widget ul li.active { opacity: 0.8; }
.qtranxs_widget ul li:hover { opacity: 1; }
.qtranxs_widget img { box-shadow: none; vertical-align: middle; display: initial; }
.qtranxs_flag { height:12px; width:18px; display:block; }
.qtranxs_flag_and_text { padding-left:20px; }
.qtranxs_flag span { display:none; }
' );

//define('QTX_WIDGET_CUSTOM_FORMAT','%f<span>%n</span>');

/* qTranslate-X Widget */

class qTranslateXWidget extends WP_Widget {

    function __construct() {
        $widget_ops = array(
            'classname'   => 'qtranxs_widget',
            'description' => __( 'Allows your visitors to choose a Language.', 'qtranslate' )
        );
        parent::__construct( 'qtranslate', __( 'qTranslate Language Chooser', 'qtranslate' ), $widget_ops );
    }

    function widget( $args, $instance ): void {
        if ( ! isset( $instance['widget-css-off'] ) ) {
            echo '<style>' . PHP_EOL;
            echo empty( $instance['widget-css'] ) ? QTX_WIDGET_CSS : $instance['widget-css'];
            echo '</style>' . PHP_EOL;
        }
        echo $args['before_widget'];
        if ( empty( $instance['hide-title'] ) ) {
            $title = $instance['title'];
            if ( empty( $title ) ) {
                $title = qtranxf_translate_wp( 'Language' );
            }    //translators: expected in WordPress default textdomain
            if ( empty( $instance['hide-title-colon'] ) ) {
                $title = sprintf( __( '%s:', 'qtranslate' ), $title );
            }    //translators: Colon after a title.
            $title = apply_filters( 'qtranslate_widget_title', $title, $this );
            echo $args['before_title'] . $title . $args['after_title'];
        }
        qtranxf_generateLanguageSelectCode( $instance, $this->id );
        echo $args['after_widget'];
    }

    function update( $new_instance, $old_instance ): array {
        $instance          = $old_instance;
        $instance['title'] = $new_instance['title'];

        if ( isset( $new_instance['hide-title'] ) ) {
            $instance['hide-title'] = true;
        } else {
            unset( $instance['hide-title'] );
        }

        if ( isset( $new_instance['hide-title-colon'] ) ) {
            $instance['hide-title-colon'] = true;
        } else {
            unset( $instance['hide-title-colon'] );
        }

        $instance['type'] = $new_instance['type'];

        if ( ! empty( $new_instance['format'] ) ) {
            $instance['format'] = $new_instance['format'];
        } else {
            unset( $instance['format'] );
        }

        if ( isset( $new_instance['widget-css-on'] ) ) {
            unset( $instance['widget-css-off'] );
        } else {
            $instance['widget-css-off'] = true;
        }

        if ( $new_instance['widget-css'] == QTX_WIDGET_CSS ) {
            unset( $instance['widget-css'] );
        } else {
            $instance['widget-css'] = $new_instance['widget-css'];
        }

        return $instance;
    }

    function form( $instance ): void {
        $instance         = wp_parse_args( $instance, array(
            'title'      => '',
            'type'       => 'text',
            'format'     => '',
            'widget-css' => QTX_WIDGET_CSS
        ) );
        $title            = $instance['title'];
        $hide_title       = isset( $instance['hide-title'] ) && $instance['hide-title'] !== false;
        $hide_title_colon = isset( $instance['hide-title-colon'] );
        $type             = $instance['type'];
        $format           = $instance['format'];
        $widget_css_on    = ! isset( $instance['widget-css-off'] );
        $widget_css       = $instance['widget-css'];
        if ( empty( $widget_css ) ) {
            $widget_css = QTX_WIDGET_CSS;
        }
        ?>
        <p><label for="<?php echo $this->get_field_id( 'title' ) ?>"><?php _e( 'Title:', 'qtranslate' ) ?> <input
                    class="widefat" id="<?php echo $this->get_field_id( 'title' ) ?>"
                    name="<?php echo $this->get_field_name( 'title' ) ?>" type="text"
                    value="<?php echo esc_attr( $title ) ?>"/></label></p>
        <p><label for="<?php echo $this->get_field_id( 'hide-title' ) ?>"><?php _e( 'Hide Title:', 'qtranslate' ) ?>
                <input type="checkbox" id="<?php echo $this->get_field_id( 'hide-title' ) ?>"
                       name="<?php echo $this->get_field_name( 'hide-title' ) ?>" <?php checked( $hide_title ) ?>/></label>
        </p>
        <p>
            <label
                for="<?php echo $this->get_field_id( 'hide-title-colon' ) ?>"><?php _e( 'Hide Title Colon:', 'qtranslate' ) ?>
                <input type="checkbox" id="<?php echo $this->get_field_id( 'hide-title-colon' ) ?>"
                       name="<?php echo $this->get_field_name( 'hide-title-colon' ) ?>" <?php checked( $hide_title_colon ) ?>/></label>
        </p>
        <p><?php _e( 'Display:', 'qtranslate' ) ?></p>
        <p><label for="<?php echo $this->get_field_id( 'type' ) ?>-text"><input type="radio"
                                                                                name="<?php echo $this->get_field_name( 'type' ) ?>"
                                                                                id="<?php echo $this->get_field_id( 'type' ) ?>-text"
                                                                                value="text"<?php checked( $type == 'text' ) ?>/> <?php _e( 'Text only', 'qtranslate' ) ?>
            </label></p>
        <p><label for="<?php echo $this->get_field_id( 'type' ) ?>-image"><input type="radio"
                                                                                 name="<?php echo $this->get_field_name( 'type' ) ?>"
                                                                                 id="<?php echo $this->get_field_id( 'type' ) ?>-image"
                                                                                 value="image"<?php checked( $type == 'image' ) ?>/> <?php _e( 'Image only', 'qtranslate' ) ?>
            </label></p>
        <p><label for="<?php echo $this->get_field_id( 'type' ) ?>-both"><input type="radio"
                                                                                name="<?php echo $this->get_field_name( 'type' ) ?>"
                                                                                id="<?php echo $this->get_field_id( 'type' ) ?>-both"
                                                                                value="both"<?php checked( $type == 'both' ) ?>/> <?php _e( 'Text and Image', 'qtranslate' ) ?>
            </label></p>
        <p><label for="<?php echo $this->get_field_id( 'type' ) ?>-dropdown"><input type="radio"
                                                                                    name="<?php echo $this->get_field_name( 'type' ) ?>"
                                                                                    id="<?php echo $this->get_field_id( 'type' ) ?>-dropdown"
                                                                                    value="dropdown"<?php checked( $type == 'dropdown' ) ?>/> <?php _e( 'Dropdown Box', 'qtranslate' ) ?>
            </label></p>
        <p><label for="<?php echo $this->get_field_id( 'type' ) ?>-custom"><input type="radio"
                                                                                  name="<?php echo $this->get_field_name( 'type' ) ?>"
                                                                                  id="<?php echo $this->get_field_id( 'type' ) ?>-custom"
                                                                                  value="custom"<?php checked( $type == 'custom' ) ?>/> <?php _e( 'Custom list item format:', 'qtranslate' ) ?>
            </label></p>
        <p>
            <label for="<?php echo $this->get_field_id( 'format' ) ?>-format"><input type="text" class="widefat"
                                                                                     name="<?php echo $this->get_field_name( 'format' ) ?>"
                                                                                     id="<?php echo $this->get_field_id( 'format' ) ?>-format"
                                                                                     value="<?php echo esc_html( $format ) ?>"/></label>
            <br><?php
            echo __( 'Accepted format arguments:', 'qtranslate' ) . '<ul>' . PHP_EOL;
            echo '<li>%f - ' . __( 'Flag Image HTML', 'qtranslate' ) . '</li>' . PHP_EOL;
            echo '<li>%s - ' . __( 'Flag Image URL', 'qtranslate' ) . '</li>' . PHP_EOL;
            echo '<li>%n - ' . __( 'Language Native Name', 'qtranslate' ) . '</li>' . PHP_EOL;
            echo '<li>%a - ' . __( 'Language Name in Active Language', 'qtranslate' ) . '</li>' . PHP_EOL;
            echo '<li>%c - ' . __( 'Language 2-Letter Code', 'qtranslate' ) . '</li>' . PHP_EOL;
            echo '</ul>';
            ?>
            <small><?php printf( __( 'For example, format "%s" would do the same as the choice "%s".', 'qtranslate' ), esc_html( '%f<span>%n</span>' ), __( 'Text and Image', 'qtranslate' ) ) ?>
                &nbsp;
                <?php _e( 'An appropriate custom CSS is expected to be provided in this case.', 'qtranslate' ) ?></small>
        </p>
        <p><label for="<?php echo $this->get_field_id( 'widget-css' ) ?>"><input type="checkbox"
                                                                                 id="<?php echo $this->get_field_id( 'widget-css-on' ) ?>"
                                                                                 name="<?php echo $this->get_field_name( 'widget-css-on' ) ?>" <?php checked( $widget_css_on ) ?>/><?php echo __( 'Widget CSS:', 'qtranslate' ) ?>
            </label><br/><textarea class="widefat" rows="6" name="<?php echo $this->get_field_name( 'widget-css' ) ?>"
                                   id="<?php echo $this->get_field_id( 'widget-css' ) ?>"><?php echo esc_attr( $widget_css ) ?></textarea><br/>
            <small><?php echo __( 'To reset to default, clear the text.', 'qtranslate' ) . ' ' . __( 'To disable this inline CSS, clear the check box.', 'qtranslate' ) . ' ' . sprintf( __( 'Other common CSS block for flag classes "%s" is loaded in the head of HTML and can be controlled with option "%s".', 'qtranslate' ), 'qtranxs_flag_xx', __( 'Head inline CSS', 'qtranslate' ) ) ?></small>
        </p>
        <?php
    }
}

/**
 * Language Select Code for non-Widget users
 * @args is a hash array of options, which accepts the following keys:
 *   ‘type’ – one of the values: ‘text’, ‘image’, ‘both’, ‘dropdown’ and ‘custom’, which match the choices on widget admin page.
 *   ‘format’ – needs to be provided if ‘type’ is ‘custom’. Read help text to this option on widget admin page.
 *   ‘id’ – id of widget, which is used as a distinctive string to create CSS entities.
 * @since 3.4.5 type of argument is changed, compatibility with old way is preserved.
 */
function qtranxf_generateLanguageSelectCode( $args = array(), $id = '' ) {
    global $q_config;
    if ( is_string( $args ) ) {
        $type = $args;
    } elseif ( is_bool( $args ) && $args ) {
        $type = 'image';
    } elseif ( is_array( $args ) ) {
        if ( ! empty( $args['type'] ) ) {
            $type = $args['type'];
        }
        if ( empty( $id ) && ! empty( $args['id'] ) ) {
            $id = $args['id'];
        }
    }
    if ( empty( $type ) ) {
        $type = 'text';
    } else switch ( $type ) {
        case 'text':
        case 'image':
        case 'both':
        case 'short':
        case 'css_only':
        case 'custom':
        case 'dropdown':
            break;
        default:
            $type = 'text';
    }
    if ( empty( $id ) ) {
        $id = 'qtranslate';
    }
    $id .= '-chooser';
    if ( is_404() ) {
        $url = get_option( 'home' );
    } else {
        $url = '';
    }
    $flag_location = qtranxf_flag_location();
    echo PHP_EOL . '<ul class="language-chooser language-chooser-' . $type . ' qtranxs_language_chooser" id="' . $id . '">' . PHP_EOL;
    switch ( $type ) {
        case 'image':
        case 'text':
        case 'css_only':
        case 'dropdown':
            {
                foreach ( qtranxf_getSortedLanguages() as $language ) {
                    $alt     = $q_config['language_name'][ $language ] . ' (' . $language . ')';
                    $classes = array( 'lang-' . $language );
                    if ( $language == $q_config['language'] ) {
                        $classes[] = 'active';
                    }
                    echo '<li class="' . implode( ' ', $classes ) . '"><a href="' . qtranxf_convertURL( $url, $language, false, true ) . '"';
                    echo ' title="' . $alt . '"';
                    if ( $type == 'image' ) {
                        echo ' class="qtranxs_image qtranxs_image_' . $language . '"';
                    } elseif ( $type == 'text' ) {
                        echo ' class="qtranxs_text qtranxs_text_' . $language . '"';
                    } elseif ( $type == 'css_only' )// to be removed
                    {
                        echo ' class="qtranxs_css qtranxs_css_' . $language . '"';
                    }
                    echo '>';
                    if ( $type == 'image' ) {
                        echo '<img class="qtranxs-flag" src="' . $flag_location . $q_config['flag'][ $language ] . '" alt="' . $alt . '" />';
                    }
                    echo '<span';
                    if ( $type == 'image' || $type == 'css_only' ) {
                        echo ' style="display:none"';
                    }
                    echo '>' . $q_config['language_name'][ $language ] . '</span>';
                    echo '</a></li>' . PHP_EOL;
                }

                if ( $type == 'dropdown' ) {
                    echo '<script>' . PHP_EOL . '// <![CDATA[' . PHP_EOL;
                    echo "var lc = document.getElementById('" . $id . "');" . PHP_EOL;
                    echo "var s = document.createElement('select');" . PHP_EOL;
                    echo "s.id = 'qtranxs_select_" . $id . "';" . PHP_EOL;
                    echo "lc.parentNode.insertBefore(s,lc);" . PHP_EOL;
                    // create dropdown fields for each language
                    foreach ( qtranxf_getSortedLanguages() as $language ) {
                        echo qtranxf_insertDropDownElement( $language, qtranxf_convertURL( $url, $language, false, true ), $id );
                    }
                    // hide html language chooser text
                    echo "s.onchange = function() { document.location.href = this.value;}" . PHP_EOL;
                    echo "lc.style.display='none';" . PHP_EOL;
                    echo '// ]]>' . PHP_EOL . '</script>' . PHP_EOL;
                }
            }
            break;
        case 'both':
            {
                foreach ( qtranxf_getSortedLanguages() as $language ) {
                    $alt = $q_config['language_name'][ $language ] . ' (' . $language . ')';
                    echo '<li';
                    if ( $language == $q_config['language'] ) {
                        echo ' class="active"';
                    }
                    echo '><a href="' . qtranxf_convertURL( $url, $language, false, true ) . '"';
                    echo ' class="qtranxs_flag qtranxs_flag_' . $language . ' qtranxs_flag_and_text" title="' . $alt . '">';
                    echo '<span>' . $q_config['language_name'][ $language ] . '</span></a></li>' . PHP_EOL;
                }
            }
            break;
        case 'short':
            {
                // TODO undocumented, to be removed
                foreach ( qtranxf_getSortedLanguages() as $language ) {
                    $alt = $q_config['language_name'][ $language ] . ' (' . $language . ')';
                    echo '<li';
                    if ( $language == $q_config['language'] ) {
                        echo ' class="active"';
                    }
                    echo '><a href="' . qtranxf_convertURL( $url, $language, false, true ) . '"';
                    echo ' class="qtranxs_short_' . $language . ' qtranxs_short" title="' . $alt . '">';
                    echo '<span>' . $language . '</span></a></li>' . PHP_EOL;
                }
            }
            break;
        case 'custom':
            {
                $format = $args['format'] ?? '';
                foreach ( qtranxf_getSortedLanguages() as $language ) {
                    $alt     = $q_config['language_name'][ $language ] . ' (' . $language . ')';
                    $s       = $flag_location . $q_config['flag'][ $language ];
                    $n       = $q_config['language_name'][ $language ];
                    $content = $format;
                    $content = str_replace( '%f', '<img class="qtranxs-flag" src="' . $s . '" alt="' . $alt . '" />', $content );
                    $content = str_replace( '%s', $s, $content );
                    $content = str_replace( '%n', $n, $content );
                    if ( strpos( $content, '%a' ) !== false ) {
                        $a       = qtranxf_getLanguageName( $language );//this is an expensive function, do not call without necessity.
                        $content = str_replace( '%a', $a == $n ? '' : $a, $content );
                    }
                    $content = str_replace( '%c', $language, $content );
                    $classes = array( 'language-chooser-item', 'language-chooser-item-' . $language );
                    if ( $language == $q_config['language'] ) {
                        $classes[] = 'active';
                    }
                    echo '<li class="' . implode( ' ', $classes ) . '"><a href="' . qtranxf_convertURL( $url, $language, false, true ) . '" title="' . $alt . '">' . $content . '</a></li>' . PHP_EOL;
                }
            }
            break;
    }
    echo '</ul><div class="qtranxs_widget_end"></div>' . PHP_EOL;
}

function qtranxf_widget_init() {
    register_widget( 'qTranslateXWidget' );
    do_action( 'qtranslate_widget_init' );
}
