Seditio Source
Root |
./othercms/b2evolution_7.2.3/plugins/_email_elements.plugin.php
<?php
/**
 * This file implements the Email Elements plugin for b2evolution
 *
 * Email Elements
 *
 * b2evolution - {@link http://b2evolution.net/}
 * Released under GNU GPL License - {@link http://b2evolution.net/about/gnu-gpl-license}
 * @copyright (c)2003-2020 by Francois Planque - {@link http://fplanque.com/}
 *
 * @package plugins
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );

class
email_elements_plugin extends Plugin
{
    var
$code = 'b2evEmailEl';
    var
$name = 'Email Elements';
    var
$priority = 50;
    var
$version = '7.2.3';
    var
$group = 'rendering';
    var
$short_desc;
    var
$long_desc;
    var
$help_topic = 'email-elements-plugin';
    var
$number_of_installs = 1;

    var
$cta_numbers = array( 1, 2, 3 );
    var
$button_styles = array( 'primary', 'success', 'warning', 'danger', 'info', 'default', 'link', 'image' );
    var
$default_button_styles = array(
           
'button'      => 'primary',
           
'cta'         => 'primary',
           
'like'        => 'success',
           
'dislike'     => 'danger',
           
'activate'    => 'success',
           
'unsubscribe' => 'link',
        );

   
/**
     * Init
     */
   
function PluginInit( & $params )
    {
       
$this->short_desc = T_('Email Elements');
       
$this->long_desc = T_('Enables users to add UI elements to emails.');
    }


   
/**
     * Define here the default collection/blog settings that are to be made available in the backoffice
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_coll_setting_definitions( & $params )
    {
       
$default_params = array_merge( $params, array( 'default_post_rendering' => 'never' ) );
        return
parent::get_coll_setting_definitions( $default_params );
    }


   
/**
     * Define here default email settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_email_setting_definitions( & $params )
    {
       
// set params to allow rendering for emails by default:
       
$default_params = array_merge( $params, array( 'default_email_rendering' => 'opt-out' ) );
        return
parent::get_email_setting_definitions( $default_params );
    }


   
/**
     * Display Toolbar
     *
     * @param object Blog
     */
   
function DisplayCodeToolbar( $params = array() )
    {
        global
$Hit, $baseurl, $debug;

        if(
$Hit->is_lynx() )
        {    
// let's deactivate toolbar on Lynx, because they don't work there:
           
return false;
        }

       
$params = array_merge( array(
               
'js_prefix' => '', // Use different prefix if you use several toolbars on one page
           
), $params );

       
$js_code_prefix = $params['js_prefix'].$this->code;

       
// Initialize JavaScript to build and open window:
       
echo_modalwindow_js();

       
$Form = new Form();
       
$Form->output = false;
       
$cta_select = $Form->select_input_array( 'cta_num', NULL, $this->cta_numbers, T_('CTA number') );
       
$style_select = $Form->select_input_array( 'button_type', NULL, $this->button_styles, T_('Link/Button style') );
       
$image_link_ID_input = '<div id="image_link_ID_wrapper" style="display:none">'.$Form->text_input( 'image_link_ID', '', NULL, T_('Image Link ID'), '', array( 'required' => true ) ).'</div>';
       
$button_text_input = $Form->text_input( 'button_text', '', NULL, T_('Text'), '', array( 'style' => 'width:100%;' ) );
       
$button_url_input = $Form->text_input( 'button_url', '', NULL, T_('URL'), '', array( 'style' => 'width:100%;' ) );

       
?><script>
        //<![CDATA[
        function email_elements_toolbar( title, prefix )
        {
            var r = '<?php echo format_to_js( $this->get_template( 'toolbar_title_before' ) );?>' + title + '<?php echo format_to_js( $this->get_template( 'toolbar_title_after' ) );?>'
                + '<?php echo format_to_js( $this->get_template( 'toolbar_group_before' ) ); ?>'

                // Button element
                + '<input type="button" title="<?php echo format_to_output( TS_('Button (or link) for any use'), 'htmlattr' );?>"'
                + ' class="<?php echo $this->get_template( 'toolbar_button_class' );?>"'
                + ' data-func="<?php echo $js_code_prefix;?>_insert_button|button" value="<?php echo format_to_output( TS_('Button'), 'htmlattr' );?>" />'

                // Call to Action Button element
                + '<input type="button" title="<?php echo format_to_output( TS_('Button (or link) which additionally records CTA stats'), 'htmlattr' );?>"'
                + ' class="<?php echo $this->get_template( 'toolbar_button_class' );?>"'
                + ' data-func="<?php echo $js_code_prefix;?>_insert_button|cta" value="<?php echo format_to_output( TS_('Call to Action'), 'htmlattr' );?>" />'

                // Like Button element
                + '<input type="button" title="<?php echo format_to_output( TS_('Button which records a like'), 'htmlattr' );?>"'
                + ' class="<?php echo $this->get_template( 'toolbar_button_class' );?>"'
                + ' data-func="<?php echo $js_code_prefix;?>_insert_button|like" value="<?php echo format_to_output( TS_('Like'), 'htmlattr' );?>" />'

                // Dislike Button element
                + '<input type="button" title="<?php echo format_to_output( TS_('Button which record a dislike'), 'htmlattr' );?>"'
                + ' class="<?php echo $this->get_template( 'toolbar_button_class' );?>"'
                + ' data-func="<?php echo $js_code_prefix;?>_insert_button|dislike" value="<?php echo format_to_output( TS_('Dislike'), 'htmlattr' );?>" />'

                // Activate
                + '<input type="button" title="<?php echo format_to_output( TS_('Button which activates the User\'s account'), 'htmlattr' );?>"'
                + ' class="<?php echo $this->get_template( 'toolbar_button_class' );?>"'
                + ' data-func="<?php echo $js_code_prefix;?>_insert_button|activate" value="<?php echo format_to_output( TS_('Activate'), 'htmlattr' );?>" />'

                // Unsubscribe
                + '<input type="button" title="<?php echo format_to_output( TS_('Button which Unsubscribes the User from the current List'), 'htmlattr' );?>"'
                + ' class="<?php echo $this->get_template( 'toolbar_button_class' );?>"'
                + ' data-func="<?php echo $js_code_prefix;?>_insert_button|unsubscribe" value="<?php echo format_to_output( TS_('Unsubscribe'), 'htmlattr' );?>" />'

                + '<?php echo format_to_js( $this->get_template( 'toolbar_group_after' ) );?>';

                jQuery( '.' + prefix + '<?php echo $this->code;?>_toolbar' ).html( r );
        }

        <?php echo $js_code_prefix;?>_insert_button = function( type )
        {
            var modal_window_title;
            var r = '<form id="email_element_button_wrapper" class="form-horizontal">';

            if( type == 'cta' )
            {
                r += '<?php echo format_to_js( $cta_select );?>';
            }

            r += '<?php echo format_to_js( $style_select );?>';
            r += '<?php echo format_to_js( $image_link_ID_input );?>';

            if( type != 'unsubscribe' )
            {
                r += '<?php echo format_to_js( $button_url_input );?>';
            }

            r += '<?php echo format_to_js( $button_text_input );?>';

            r += '</form>';

            switch( type )
            {
                case 'button':
                    modal_window_title = '<?php echo TS_('Add a link button');?>';
                    break;

                case 'like':
                    modal_window_title = '<?php echo TS_('Add a like button');?>';
                    break;

                case 'dislike':
                    modal_window_title = '<?php echo TS_('Add a dislike button');?>';
                    break;

                case 'cta':
                    modal_window_title = '<?php echo TS_('Add a call to action button');?>';
                    break;

                case 'activate':
                    modal_window_title = '<?php echo TS_('Add an activate button');?>';
                    break;

                case 'unsubscribe':
                    modal_window_title = '<?php echo TS_('Add an unsubscribe button');?>';
                    break;
            }

            openModalWindow( r, '600px', '', true,
                    modal_window_title, // Window title
                    [ '-', 'email_element_button_buttons' ],
                    true );

            // Set max-height to keep the action buttons on screen:
            var modal_window = jQuery( '#email_element_button_wrapper' ).parent();
            var modal_height = jQuery( window ).height() - 20;

            if( modal_window.hasClass( 'modal-body' ) )
            {    // Extract heights of header and footer:
                modal_height -= 55 + 64 +
                    parseInt( modal_window.css( 'padding-top' ) ) + parseInt( modal_window.css( 'padding-bottom' ) );
            }
            modal_window.css( {
                'display': 'block',
                'overflow': 'auto',
                'max-height': modal_height
            } );

            // Add insert button:
            var buttons_side_obj = jQuery( '.email_element_button_buttons' ).length ?
                        jQuery( '.email_element_button_buttons' ) :
                        jQuery( '#email_element_button_buttons' );
            buttons_side_obj.after( '<button id="email_element_button_insert" class="btn btn-primary" data-function="' + type + '"><?php echo TS_('Insert');?></button>' );

            // Set button type dropdown default:
            var button_defaults = { <?php
            $js_default_button_styles
= array();
            foreach(
$this->default_button_styles as $button_type => $button_style )
            {
               
$js_default_button_styles[] = '\''.$button_type.'\': \''.$button_style.'\'';
            }
            echo
implode( ', ', $js_default_button_styles );
           
?> };
            jQuery( 'select[name=button_type]', '#email_element_button_wrapper' ).val( button_defaults[type] );

            // To prevent link default event:
            return false;
        }

        // Show/Hide additional fields depending on "Link/Button style":
        jQuery( document ).on( 'change', '#email_element_button_wrapper select[name=button_type]', function()
        {
            if( jQuery( this ).val() == 'image' )
            {
                jQuery( 'label[for=button_text]', '#email_element_button_wrapper' ).html( '<?php echo TS_('Alt text'); ?>:' );
                jQuery( '#image_link_ID_wrapper', '#email_element_button_wrapper' ).show();
            }
            else
            {
                jQuery( 'label[for=button_text]', '#email_element_button_wrapper' ).html( '<?php echo TS_('Text'); ?>:' );
                jQuery( '#image_link_ID_wrapper', '#email_element_button_wrapper' ).hide();
            }
        } );

        // Insert a button short tag to textarea
        jQuery( document ).on( 'click', '#email_element_button_insert', function()
        {
            var type = jQuery( this ).data( 'function' );
            var url = jQuery( 'input[name=button_url]', '#email_element_button_wrapper' ).val();
            var text = jQuery( 'input[name=button_text]', '#email_element_button_wrapper' ).val();
            var button_type = jQuery( 'select[name=button_type]', '#email_element_button_wrapper' ).val();
            var myField = <?php echo $params['js_prefix']; ?>b2evoCanvas;
            var shortTag;

            if( button_type == 'image' )
            {    // Append a link ID for image style:
                button_type += '#' + jQuery( 'input[name=image_link_ID]', '#email_element_button_wrapper' ).val();
            }

            // Insert tag text in area
            switch( type )
            {
                case 'button':
                    shortTag = '[button' + ':' + button_type + ( url == '' ? '' : ':' + url ) + ']'+text+'[/button]';
                    break;

                case 'like':
                    shortTag = '[like' + ':' + button_type + ( url == '' ? '' : ':' + url ) + ']'+text+'[/like]';
                    break;

                case 'dislike':
                    shortTag = '[dislike' + ':' + button_type + ( url == '' ? '' : ':' + url ) + ']'+text+'[/dislike]'
                    break;

                case 'cta':
                    var cta_num = jQuery( 'select[name=cta_num]', '#email_element_button_wrapper' ).val();
                    shortTag = '[cta:' + cta_num + ':' + button_type + ( url == '' ? '' : ':' + url ) + ']'+text+'[/cta]'
                    break;

                case 'activate':
                    shortTag = '[activate' + ':' + button_type + ( url == '' ? '' : ':' + url ) + ']'+text+'[/activate]';
                    break;

                case 'unsubscribe':
                    shortTag = '[unsubscribe' + ':' + button_type + ']'+text+'[/unsubscribe]';
                    break;
            }
            textarea_wrap_selection( myField, shortTag, '', 0 );
            // Close main modal window
            closeModalWindow();

            // To prevent link default event
            return false;
        } );

        //]]>
        </script><?php

       
echo $this->get_template( 'toolbar_before', array( '$toolbar_class$' => $params['js_prefix'].$this->code.'_toolbar' ) );
        echo
$this->get_template( 'toolbar_after' );
       
?>
       <script>email_elements_toolbar( '<?php echo TS_('Email Elements:'); ?>', '<?php echo $params['js_prefix']; ?>' );</script>
        <?php

       
return true;
    }


   
/**
     * Event handler: Called when displaying editor toolbars for email.
     *
     * @param array Associative array of parameters
     * @return boolean did we display a toolbar?
     */
   
function DisplayEmailToolbar( & $params )
    {
       
$apply_rendering = $this->get_email_setting( 'email_apply_rendering' );
        if( ! empty(
$apply_rendering ) && $apply_rendering != 'never' )
        {    
// Print toolbar on screen:
           
return $this->DisplayCodeToolbar( $params );
        }
        return
false;
    }


   
/**
     * Dummy placeholder. Without it the plugin would ne be considered to be a renderer...
     *
     * @see Plugin::RenderItemAsHtml
     */
   
function RenderItemAsHtml( & $params )
    {
        return
false;
    }


   
/**
     * Perform rendering of email
     *
     * @see Plugin::RenderEmailAsHtml()
     */
   
function RenderEmailAsHtml( & $params )
    {
       
$content = & $params['data'];

       
// Render inline tags in email campaign content:
       
$params = array_merge( $params, array(
               
'Object'      => isset( $params['EmailCampaign'] ) ? $params['EmailCampaign'] : NULL,
               
'inline_tags' => array( $content ),
            ) );
       
$rendered_tags = $this->RenderInlineTags( $params );

       
$content = isset( $rendered_tags[ $content ] ) ? $rendered_tags[ $content ] : $content;

        return
true;
    }


   
/**
     * Render inline tags in content of Email Campaign
     *
     * @param array Associative array of parameters
     *   - 'inline_tags' - Array of inline tags
     *   - 'Object' - Item, Comment, Message, EmailCampaign
     * @return array Rendered tags: Key - Original inline tag, Value - The rendered tag html
     */
   
function RenderInlineTags( & $params )
    {
        if( ! isset(
$params['inline_tags'] ) ||
            !
is_array( $params['inline_tags'] ) )
        {    
// No inline tags to render:
           
return array();
        }

        if( ! isset(
$params['Object'] ) ||
            !
is_object( $params['Object'] ) ||
           
get_class( $params['Object'] ) != 'EmailCampaign' )
        {    
// Not supported object by this plugin:
           
return array();
        }

       
$EmailCampaign = & $params['Object'];

       
$default_destination = empty( $EmailCampaign->email_defaultdest ) ? '' : $EmailCampaign->email_defaultdest;

       
$search_pattern = '#\[(button|like|dislike|cta|activate|unsubscribe):?([^\[\]]*?)](.*?)\[\/\1]#';

       
$rendered_tags = array();
        foreach(
$params['inline_tags'] as $inline_tag )
        {
            if( !
preg_match_all( $search_pattern, $inline_tag, $matches ) )
            {
                continue;
            }

           
$rendered_tag = $inline_tag;

            foreach(
$matches[0] as $i => $current_element )
            {
               
$type = $matches[1][$i];
               
$text = trim( $matches[3][$i] );
               
$index_shift = ( $type == 'cta' ? 1 : 0 ); // CTA buttons have additional param for a number after type like [cta:1:...]
               
$options = explode( ':', $matches[2][$i], 2 + $index_shift );

               
$style = explode( '#', $options[ $index_shift ] );
               
$style_link_data = isset( $style[1] ) ? $style[1] : NULL;
               
$style = $style[0];
                if(
in_array( $style, $this->button_styles ) )
                {    
// If 2nd/3rd option is a style then 3rd is an URL:
                   
$url = isset( $options[ 1 + $index_shift ] ) ? trim( $options[ 1 + $index_shift ] ) : NULL;
                }
                else
                {    
// Otherwise 2nd/3rd option is an URL, i.e. this short tag should use default style:
                   
$url = trim( $matches[2][$i] );
                   
$style = $this->default_button_styles[ $type ];
                }
                if( empty(
$style ) )
                {    
// Use default button style if it is not defined in short tag:
                   
$style = $this->default_button_styles[ $type ];
                }
                if(
$style == 'image' )
                {    
// Check if correct image link ID is used:
                   
$image_style = '';
                    if(
$style_link_data !== NULL && preg_match( '/^(\d+)(\..+)?$/', $style_link_data, $style_link_match ) )
                    {    
// Corrent link ID and/or style class:
                       
$style_link_ID = $style_link_match[1];
                        if( isset(
$style_link_match[2] ) )
                        {    
// Convert a separator between several classes like '.rounded.border' to '.rounded+.border' for function emailskin_style():
                           
$image_style = ltrim( str_replace( '.', '+.', $style_link_match[2] ), '+' );
                           
$image_style = emailskin_style( $image_style, false );
                        }
                    }
                    else
                    {    
// Wrong link ID:
                       
$style_link_ID = NULL;
                    }
                   
$image_File = NULL;
                   
$LinkCache = & get_LinkCache();
                   
$current_element_error_message = NULL;
                    if( ! (
$image_Link = & $LinkCache->get_by_ID( $style_link_ID, false, false ) ) )
                    {    
// Link is not found in DB:
                       
$current_element_error_message = sprintf( T_('Link %s doesn\'t exist!'), '#'.$style_link_ID );
                    }
                    elseif( ! (
$image_File = & $image_Link->get_File() ) || ! $image_File->is_image() )
                    {    
// File is not image:
                       
$current_element_error_message = sprintf( T_('File of the Link %s is not an image!'), '#'.$style_link_ID );
                    }
                    if(
$current_element_error_message !== NULL )
                    {    
// Replace original short tag with error message:
                       
$rendered_tag = str_replace( $current_element, get_rendering_error( $current_element.' - '.$current_element_error_message, 'span' ), $rendered_tag );
                        continue;
                    }
                   
// If image file is correct we should display it instead of text:
                   
$text = $image_Link->get_tag( array_merge( $params, array(
                       
'before_image'        => '<div'.emailskin_style( '.image_block' ).'>',
                       
'before_image_legend' => '<div'.emailskin_style( '.image_legend' ).'>',
                       
'after_image_legend'  => '</div>',
                       
'after_image'         => '</div>',
                       
'image_link_to'       => false,
                       
'image_alt'           => $text,
                       
'image_style'         => $image_style,
                       
'image_desc'          => $text,
                       
'add_loadimg'         => false,
                    ) ) );
                }

                if( empty(
$url ) && in_array( $type, array( 'button', 'like', 'dislike', 'cta' ) ) )
                {    
// Use default destination of the Email Campaign if optional URL if not defined:
                   
$url = $default_destination;
                }
               
$url_params = NULL;

                switch(
$type )
                {
                    case
'like':
                    case
'dislike':
                       
$url_params = array( 'evo_mail_function' => $type );
                        break;

                    case
'cta':
                       
$cta_num = trim( $options[0] );
                        if( !
in_array( $cta_num, $this->cta_numbers ) )
                        {    
// Don't allow CTA with wrong number:
                           
unset( $url );
                            break;
                        }

                       
$url_params = array( 'evo_mail_function' => $type.$cta_num );
                        break;

                    case
'activate':
                       
// Only EASY activation will work for this case:
                       
$url = get_htsrv_url().'login.php?action=activateacc_ez&userID=$user_ID$&reminderKey=$reminder_key$';

                       
$redirect_to = isset( $options[1] ) ? trim( $options[1] ) : NULL;
                        if( ! empty(
$redirect_to ) )
                        {    
// Append a redirect URL after activation if it is defined in options of the short tag:
                           
$url = url_add_param( $url, array( 'redirect_to' => $redirect_to ) );
                        }
                        break;

                    case
'unsubscribe':
                       
$url = get_htsrv_url().'quick_unsubscribe.php?type=newsletter&newsletter=$newsletter_ID$&user_ID=$user_ID$&key=$unsubscribe_key$';
                        break;
                }

                if( ! empty(
$text ) && ! empty( $url ) && ! validate_url( $url ) )
                {    
// If button/link is correct and can be rendered:
                   
if( $url_params !== NULL )
                    {    
// Additional URL param:
                       
$url = url_add_param( $url, $url_params );
                    }
                   
$link_tag = get_link_tag( $url, $text, in_array( $style, array( 'link', 'image' ) ) ? '' : 'div.btn a+a.btn-'.$style );
                   
// Render short tag:
                   
$rendered_tag = str_replace( $current_element, $link_tag, $rendered_tag );
                    continue;
                }
               
// Otherwise keep the wrong short tag as is without rendering:
           
}

           
$rendered_tags[ $inline_tag ] = $rendered_tag;
        }

        return
$rendered_tags;
    }


   
/**
     * This method initializes an array that used as additional tabs/forms
     *   for the modal/popup window "Insert image into content"
     *
     * @param array Array of parameters:
     *   - 'link_ID' - Link ID
     *   - 'active_tag' - Index of current tag: 'image', 'thumbnail', 'inline' or custom from a plugin
     * @return array Array:
     *   key - Index of additional tab/form, NOTE: indexes 'image', 'thumbnail', 'inline' are used by core
     *   value - Tab title
     */
   
function GetImageInlineTags( & $params )
    {
        if(
get_link_owner_type( $params['link_ID'] ) != 'emailcampaign' )
        {    
// Allow additional inline tag 'clickable' only for Email Campaigns:
           
return array();
        }

        return array(
'clickable' => T_('Clickable') );
    }


   
/**
     * This method initializes params for form of additional tab
     *   on the modal/popup window "Insert image into content"
     *
     * @param array Array of parameters:
     *   - 'tag_type' - Active tag type
     *   - 'link_ID' - Link ID
     *   - 'source_tag' - Full code of short tag
     * @return array Array of parameters:
     *   - 'tag_type' - Overridden tag type
     *   - 'link_ID' - Overridden link ID
     */
   
function InitImageInlineTagForm( & $params )
    {
        if( empty(
$params['source_tag'] ) )
        {    
// No source tag:
           
return;
        }

        if( !
preg_match( '#\[(button|like|dislike|cta|activate|unsubscribe)(:(\d+))?:image\#(\d+)([^\[\]]*?)](.*?)\[\/\1]#', $params['source_tag'], $tag_match ) )
        {    
// The requested tag is not supoerted by this plugin:
           
return;
        }

       
set_param( 'clickable_caption', $tag_match[6] );
       
set_param( 'clickable_class', $tag_match[5] );
       
set_param( 'clickable_type', $tag_match[1] );
       
set_param( 'clickable_cta_num', $tag_match[3] );

        return array(
               
'tag_type' => 'clickable',
               
'link_ID' => $tag_match[4],
            );
    }


   
/**
     * This method displays a form for additional tab
     *   on the modal/popup window "Insert image into content"
     *
     * @param array Array of parameters:
     *   - 'link_ID' - Link ID
     *   - 'active_tag' - Index of currently active tag: 'image', 'thumbnail', 'inline' or custom from a plugin
     *   - 'display_tag' - Index of the plugin tag which should be displayed
     *   - 'Form' - Form object
     * @return boolean Did we display a form?
     */
   
function DisplayImageInlineTagForm( & $params )
    {
        if(
get_link_owner_type( $params['link_ID'] ) != 'emailcampaign' )
        {    
// Allow additional inline tag 'clickable' only for Email Campaigns:
           
return false;
        }

        if( empty(
$params['Form'] ) )
        {    
// Form object must be passed for this event:
           
return false;
        }

       
$Form = & $params['Form'];

        switch(
$params['display_tag'] )
        {
            case
'clickable':
               
// Caption:
               
$Form->text( 'clickable_caption', get_param( 'clickable_caption' ), 40, T_('Caption'), '<br>
                    <span style="display: flex; flex-flow: row; align-items: center; margin-top: 8px;">
                        <input type="checkbox" name="clickable_disable_caption" id="clickable_disable_caption" value="1" style="margin: 0 8px 0 0;">
                        <span>'
.T_('Disable caption').'</span></span>', '' );
               
// Styles:
               
$Form->text( 'clickable_class', get_param( 'clickable_class' ), 40, T_('Styles'), '<br><div class="style_buttons" style="margin-top: 8px;">
                    <button class="btn btn-default btn-xs">border</button>
                    <button class="btn btn-default btn-xs">noborder</button>
                    <button class="btn btn-default btn-xs">rounded</button>
                    <button class="btn btn-default btn-xs">squared</button></div>'
, '' );
               
// Type:
               
$Form->output = false;
               
$Form->switch_layout( 'none' );
               
$cta_select = $Form->select_input_array( 'clickable_cta_num', param( 'clickable_cta_num', 'integer', 1 ), $this->cta_numbers, '' );
               
$Form->switch_layout( NULL );
               
$Form->output = true;
               
$Form->radio( 'clickable_type', param( 'clickable_type', 'string', 'button' ), array(
                        array(
'button', T_('Button') ),
                        array(
'cta', T_('Call to Action'), $cta_select ),
                        array(
'like', T_('Like') ),
                        array(
'dislike', T_('Dislike') ),
                        array(
'activate', T_('Activate') ),
                        array(
'unsubscribe', T_('Unsubscribe') ),
                    ),
T_('Type'), true );
                return
true;
        }

        return
false;
    }


   
/**
     * This method initializes JavaScript before submit/insert inline tag
     *   from the modal/popup window "Insert image into content"
     *
     * @param array Array of parameters:
     *   - 'link_ID' - Link ID
     * @return string JavaScript code
     */
   
function GetInsertImageInlineTagJavaScript( & $params )
    {
        if(
get_link_owner_type( $params['link_ID'] ) != 'emailcampaign' )
        {    
// Allow additional inline tag 'clickable' only for Email Campaigns:
           
return;
        }

        return
'if( tagType == "clickable" )
{
    tag_caption = jQuery( "input[name=" + tagType + "_caption]" ).val();
    var noCaption = jQuery( "input[name=" + tagType + "_disable_caption]" ).is( ":checked" );
    if( noCaption )
    {
        tag_caption = "";
    }

    var clickable_type = jQuery( "input[name=" + tagType + "_type]:checked" ).val();

    linkID = ( clickable_type == "cta" ? jQuery( "select[name=" + tagType + "_cta_num]" ).val() + ":" : "" )
        + "image#" + linkID + classes;

    options = "";
    tagType = clickable_type;
}'
;
    }
}