<h2>Smarty Addons</h2>
<p>This module adds a few smarty convenience addons for use with other modules. They are listed and described here:</p>

<ul class="accordion-list">
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&#123xt_module_hint} <span class="small">Create hint parameters to module actions</span></h3>
    <div class="accordion-list-item-body">
      <p>This function plugin can be used to provide hints for module behavior before the module is called or for parameters that cannot or should not be specified in the URL.  I.e: In a situation when a site is configured to use pretty urls for SEO purposes it is often impossible to provide additional module parameters like a detailtemplate or sort order on a URL.  This plugin can be used in any templates or in a page specific way to give hints as to how modules should behave.</p>
      <p><strong>Note:</strong> Any parameters that are specified on the URL or module tag will override matching module hints. I.e: When using News and a detailtemplate parameter is specified on a News detail url, any detailtemplate hints will have no effect.</p>
      <p><strong>Note:</strong> In order to ensure proper behavior, module hints must be created before the module is called, and usually before the &lbrace;content} tag is executed in the CMSMS page template.  Therefore, they should (normally) be created very early in the page template process.  An ideal location for page specific hints is in the &quot;Smarty data or logic that is specific to this page:&quot; textarea on the editcontent form.</p>

      <h4>Example:</h4>
      <p>When using the News module, and pretty urls.  You wish to display news articles for a specific category on one page, and would like to use a non-standard detail template to display the individual articles on a differernt page.  I.e: perhaps on your &quot;Sports&quot; page you are calling News like: <strong><code>&lbrace;News category=sports detailpage=sports_detail}</code></strong>. However, using pretty urls it is impossible to specify a detailtemplate on the links that will generate the detail views.  The solution is to use the <strong><code>&lbrace;xt_module_hint}</code></strong> tag on the <u>sports_detail</u> page to provide some hints as to how News should behave on that page.</p>
      <p>When editing the <u>sports_detail</u> page on the options tab, in the textarea entitled &quot;Smarty data or logic that is specific to this page:&quot; you could enter a tag such as: <strong><code>&lbrace;xt_module_hint module=News detailtemplate=sports}</code></strong>.  Now when a user clicks on a link from the News display on your &quot;sports&quot; page he will be directed to the <u>sports_detail</u> page, and the News detail template entitled &quot;sports&quot; will be used to display the article.</p>
      <p>Note:</p>
      <ul>
        <li>It is possible to specify multiple parameter hints to a single module in one call to this plugin.</li>
        <li>It is possible to call this module multiple times in a request to provide hints to different modules.</li>
      </ul>

      <h4>Usage:</h4>
     <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;xt_module_hint module=News summarytemplate=something detailpage=home}
  &lbrace;xt_module_hint module=SmartImage noembed=1}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_error}...&lbrace;/xt_error} <span class="small">Display an error message <span style="color:green">(new)</span></span></h3>
    <div class="accordion-list-item-body">
      <p>alias of xterror for consistency</p>

      <p>A block plugin that uses the error template (configurable from the CMSMSExt admin interface) to display an error message.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>errorclass</b> - (string) override the default class name in the template.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_error}This is error text&lbrace;/xt_error}</pre>

      <pre>&lbrace;xterror [errorclass=string]}...&lbrace;/xterror} <span style="color:orange">&lbrace;* deprecated: use xt_error instead. This tag will be removed in the future *}</span></pre>

    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_content_type} <span class="small">change the mime-type of an action</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin is used to change the mime-type of an action. This is particularly useful in templates that are in response to ajax requests.</p>
      <p>Parameters:</p>
      <ul>
         <li><b>type</b> - (string) The desired output mime type.</li>
      </ul>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_cached_url} <span class="small">Retrieve the contents of a remote URL and cache it</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin can retrieve the contents of a remote URL and cache the contents for a specified number of minutes.  Then returns those.  This plugin is useful for retrieving the contents of remote URLS, or of local urls that represent expensive operations but can be cached.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>url</b> - (string) - The URL to fetch and cache</li>
        <li><b>time</b> - (int) - The number of minutes to cache this url for. The default value is 120</li>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lt;div id="something"&gt;&lbrace;xt_cached_url url=something}&lt;/div&gt;</pre>
      <p>Tip:  It is possible to use this function to cache expensive operations:</p>
      <ol>
        <li>Create a new page template with just <code>&lbrace;content}</code> in it. Name the page template something like content_only</li>
        <li>Create a new content page using the new content_only page template.  Ensure that it will not be shown in the menu. In the content area of this page place smarty tags or other functions that are quite expensive in processing but do not need to be refreshed regularly.  Remember the page alias for this new page.</li>
        <li>On your normal page template(s) call <code>&lbrace;xt_cached_url url="&lbrace;cms_selflink href=$page_alias}"}</code></li>
      </ol>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_isbot} <span class="small">Whether the user agent of the request has been identified to be a robot</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin returns a boolean indicating whether the user agent of the request has been identified to be a robot.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_isbot assign='isbot'}&lbrace;if $isbot}&lt;h3&gt;You are a bot&lt;/h3&gt;&lbrace;/if}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_is_smartphone} <span class="small">Whether the request is from a smartphone</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin determines whether the request is from a smartphone such as an iphone or android.<p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_is_smartphone assign='isphone'}&lbrace;if !$isphone}&lbrace;* display more stuff *}&lbrace;/if}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_getbrowser} <span class="small">Returns a short string indicating the browser type</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin returns a short string indicating the browser type.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_getbrowser assign='browser'}&lbrace;if $browser == 'chrome'}&lbrace;* display more stuff *}&lbrace;/if}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_isandroid} <span class="small">Whether the current request was made from an android platform</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin returns whether the current request was made from an android platform or not.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_isandroid assign='android'}&lbrace;if $android}&lt;h3 style="color: green;"&gt;Woot!!!&lt;/h3&gt;&lbrace;/if}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_isios} <span class="small">Whether the current request was made from an ios platform</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin returns whether the current request was made from an ios platform or not.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_isios assign='ios'}&lbrace;if $ios}&lt;h3 style="color: orange;"&gt;Note: PWAs have problems!!!&lt;/h3&gt;&lbrace;/if}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_isie} <span class="small">whether the current request was made by Internet Exploder</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin returns whether the current request was made by Internet Exploder. It returns 0 or 1.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_isie assign='ie'}&lbrace;if $ie}&lt;h3 style="color: red;"&gt;bummer!!!&lt;/h3&gt;&lbrace;/if}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_state_options} <span class="small">Output a set of &lt;option&gt; tags for US/Canada states</span></h3>
    <div class="accordion-list-item-body">
      <p>Output a set of &lt;option&gt; tags for states.  The values are US/Canada State/Province abbreviations, the labels are the full length names in English.  This method reads the defined state list as defined in the database.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>selected</b> - (string) - Indicates the currently selected option.  Should be a state or province abbreviation.</li>
        <li><b>selectone</b> - (string) - Adds an option to the top of the dropdown indicating that no value has been selected.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lt;select name="state"&gt;&lbrace;xt_state_options selected=$mystate}&lt;/select&gt;</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_country_options} <span class="small">Output a set of &lt;options&gt; tags for countries</span></h3>
    <div class="accordion-list-item-body">
      <p>Output a set of &lt;options&gt; tags for countries.  The values are approved country codes, the labels are the full length names (in english).  This method reads the country list as defined in the database, and takes into account the priority countries as defined in the CMSMSExt admin console.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>selected</b> - (string) - Indicates the currently selected option.  Should be a country abbreviation.</li>
        <li><b>selectone</b> - (string) - Adds an option to the top of the dropdown indicating that no value has been selected.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lt;select name="state"&gt;&lbrace;xt_country_options selected=$mystate}&lt;/select&gt;</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;get_current_url} <span class="small">Return the current request url</span></h3>
    <div class="accordion-list-item-body">
      <p>Return the current request url (without fragment, or query arguments).  This plugin is useful to build form or anchor links or for any other tag that requires knowing the current page URL.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) - Assign the output of this plugin to the named smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lt;a href="&lbrace;get_current_url}#anchor"&gt;Go to Anchor&lt;/a&gt;</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_setlist} <span class="small"> <span style="color:orange">(deprecated)</span></span></h3>
    <div class="accordion-list-item-body">
      <p style="color: red;">Deprecated... this functionality is available natively in Smarty now.</p>
      <p>Allows adding items to flat smarty arrays. This plugin returns no output</p>
      <p>Parameters:</p>
      <ul>
        <li><b>name</b> - The name of the smarty array.</li>
        <li><b>key</b> - The array key.</li>
        <li><b>value</b> - The array value.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_setlist name=items key=item1 value='value1'}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_unsetlist} <span class="small"> <span style="color:orange">(deprecated)</span></span></h3>
    <div class="accordion-list-item-body">
      <p style="color: red;">Deprecated... this functionality is available natively in Smarty now.</p>
      <p>Removing items from flat smarty arrays. This plugin returns no output</p>
      <p>Parameters:</p>
      <ul>
        <li><b>name</b> - The name of the smarty array.</li>
        <li><b>key</b> - The array key.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_unsetlist name=items key=item1}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_yesno_options} <span class="small">Dropdown list that allows selecting two options</span></h3>
    <div class="accordion-list-item-body">
      <p>Output options for a dropdown list that allows selecting two options, &quot;Yes&quot; or &quot;No&quot;.  This plugin will output the &lt;option&gt; tags using localized strings for the labels, and integers for the values.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>prefix</b> - (string) A prefix to place before the name attribute on the tag.  i.e: prefix=$actionid</li>
        <li><b>name</b> - (string) A name for the select list, if this parameter is specified the system will generate a complete &lt;select&gt; tag.  Otherwise, only &lt;option&gt; tags will be generated.</li>
        <li><b>id</b> - (string) An id attribute for the select list.  Only useful if the name is also specified.</li>
        <li><b>class</b> - (string) A class attribute for the select list.  Only useful if the name is also specified.</li>
        <li><b>selected</b> - (string) The value of the currently selected element (either 0 or 1)</li>
        <li><b>assign</b> - (string) Assign the output html code to a newly generated smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_yesno_options name=flag selected=$myflag}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_have_module} <span class="small">Is the specified module is installed and ready to use</span></h3>
    <div class="accordion-list-item-body">
      <p>Output a boolean (0 or 1) value if the specified module is installed and ready to use.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>m</b>|<b>mod</b>|<b>module</b> - (string) Specify the module name</li>
        <li><b>assign</b> - (string) Assign the output html code to a newly generated smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_have_module module='Cart2' assign='cart2'}&lbrace;if $have_cart2}&lbrace;Cart2}&lbrace;/if}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_image} <span class="small">Output an image tag  <span style="color:green">(new)</span></span></h3>
    <div class="accordion-list-item-body">
      <p><span style="color:green">(new) alias of xtimage for consistency. </span>
      <span style="color:orange">xtimage is deprecated and will be removed.</span></p>
      <code>&lbrace;xt_image image=string [alt=string] [class=string] [width=int] [height=int] [assign=string]} </code>
      <p>Output an image tag, This plugin is typically used in admin templates, as it automatically searches in the admin theme, and in registered icon directories.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>image</b> - The filename of the image.  You may specify a filename, or a path relative to the admin theme&quot;s images directory.</li>
        <li><b>alt</b> - Specify alt text for the image.  If not specified, the value of the image parameter will be used.</li>
        <li><b>class</b> - Specify a class for the image tag.</li>
        <li><b>width</b> - Specify an integer width for the image tag.</li>
        <li><b>height</b> - Specify an integer height for the image tag.</li>
        <li><b>assign</b> - Assign the output html code to a newly generated smarty variable.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;xt_image image='icons/system/newobject.gif' alt='Create new item'}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;...|rfc_date} <span class="small">Format time strings consistent with RFC</span></h3>
      <div class="accordion-list-item-body"> - <em>modifier</em>
      <p>Format a supplied time in an RFC consistent manner.  This modifier is particularly useful when generating RSS feeds.</p>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;$smarty.now|rfc_date}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;jsmin}...&lbrace;/jsmin} <span class="small">javascript minifier</span></h3>
    <div class="accordion-list-item-body">
      <p>Pass content through the javascript minifier.</p>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;jsmin}
    $(document).ready(function()&lbrace;
      $(document).tooltip();
    })
    &lbrace;/jsmin}</pre>
      <p>Note: You must specify the appropriate &lbrace;literal},&lbrace;/literal},&lbrace;ldelim|, and &lbrace;rdelim} inside the block to allow smarty to process or ignore the code.</p>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_textarea} <span class="small">Text area tag with support for WYSIWYG or syntax highlighter</span></h3>
    <div class="accordion-list-item-body">
      <p>Create a text area tag, with optional support for WYSIWYG editor or syntax highlighter.  This tag is typically used in admin templates to create text areas.</p>
      <p>Parameters:</p>
        <ul>
          <li><b>prefix</b> - (string) A string to prefix the textarea element name.  i.e: &lbrace;$actionid}</li>
          <li><b>name</b> - (string, <strong>required</strong>) The element name.</li>
          <li><b>wysiwyg</b> - (bool) Indicates whether a WYSIWYG should be applied (the actual WYSIWYG that is used depends on CMSMS site preferences and user preferences.</li>
          <li><b>syntax</b> - (bool) Indicates whether the preferred syntax highlighter (if any are available and selected) should be applied. If both WYSIWYG and syntax are true, then wysiwyg is preferred.  No check is done to see if a WYSIWYG module is actually available.  This parameter is ignored when this tag is used for frontend requests.</li>
          <li><b>content</b> - (string) )The content for the text area.</li>
          <li><b>class</b> - (string) An optional class to supply to the text area tag.</li>
          <li><b>id</b> - (string) An optional id attribute for the text area tag.</li>
          <li><b>rows</b> - (int) An optional rows attribute for the text area tag.</li>
          <li><b>cols</b> - (int) An optional cols attribute for the text area tag.</li>
          <li><b>assign</b> - (int) Assign the output html code to a newly generated smarty variable.</li>
        </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_textarea prefix=$actionid name=description content=$description wysiwyg=1}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_str_to_assoc} <span class="small"> <span style="color:orange">(deprecated)</span></span></h3>
    <div class="accordion-list-item-body">
      <p style="color: red;">Deprecated</p>
      <p>Convert a URL parameter type string to an associative array.</p>
      <p>Parameters:</p>
        <ul>
          <li><b>input</b> - (string,<strong>required</strong> The input string</li>
          <li><b>delim1</b> - (string) )Delimiter for separating the string into a list of variables.  Defaults to &quot;,&quot;</li>
          <li><b>delim2</b> - (string) Delimiter for separating variable into a variable name and value.  Defaults to &quot;=&quot;</li>
          <li><b>assign</b> - (string) Assign the output html code to a newly generated smarty variable.</li>
        </ul>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_str_to_assoc input=&quot;var1=val1,var2=val2,var3=val3&quot; assign=&quot;tmp&quot;}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_wysiwyg} <span class="small"> .... </span></h3>
    <div class="accordion-list-item-body">
      <p>An alias for the &lbrace;xt_textarea} plugin.</p>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_cache}...&lbrace;/xt_cache} <span class="small"> <span style="color:orange">(deprecated: see &lbrace;xt_cache_block})</span></span></h3>
    <div class="accordion-list-item-body">
    <p style="color: red;">Deprecated... See the &lbrace;xt_cache_block} plugin instead.</p>
    <p>This compiler plugin allows caching HTML output between start and end blocks for performance. By default, content between the start and end tags is cached to files in the tmp/cache directory for a period of five minutes.  Later versions of this plugin will allow extending the cache lifetime.</p>
    <p><strong>Note:</strong> This is not technically a block plugin, but does behave like one.</p>
    <p><strong>Note:</strong> This is an advanced plugin that can dramatically improve the average performance of your (primarily static) website, though it should be used with caution as using it incorrectly can cause strange behaviour on your site.  This functionality works best when wrapped around smarty tags that query the database and generate static html content.  This plugin should not be used around dynamic functionality or forms.</p>
    <p><strong>Note:</strong> This plugin utilizes file locking to prevent race conditions.  This may present problems on different platforms.  Use this plugin with caution.</p>
    <p>Parameters:</p>
      <ul>
        <li><b>key</b> - (string) An optional unique key to identify this cache block.  Must contain only alphanumeric characters.</li>
      </ul>
    <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_cache}&lbrace;Products}&lbrace;/xt_cache}</pre>
  </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_cache_block} <span class="small">Caches output of the specified block to increase performance</span></h3>
    <div class="accordion-list-item-body">
       <p>This block plugin allows caching HTML output of the specified block to increase performance. This plugin is particularly handy for blocks of HTML that are static in nature (don't change often) but require significant server resources to generate.</p>
       <p>This block plugin caches the HTML output.  It is intended to improve performance.  It will not check if the content inside the block has changed, it merely caches the HTML for a specified amount of time (1 hour by default).</p>
       <p>By default, this plugin adds entropy to the key (even if it is auto generated) to ensure that the particular block is cached once per CMSMS page.  This allows use of &lbrace;xt_cache_block} around navigations and other blocks of code that change for each page, but for which the template syntax is entirely the same.</p>
       <p><strong>Note:</strong> This plugin should not be used around dynamic functionality, or forms.</p>
       <p><strong>Note:</strong> This plugin has no effect when logged in to the CMSMS admin console.  For testing, it is recommended that you use an incognito or private window, or a different browser.</p>
       <p><strong>Note:</strong> This plugin utilizes file locking to prevent race conditions.  This may present problems on different platforms.  Use this plugin with caution.</p>
      <p>Parameters:</p>
        <ul>
          <li><b>key</b> - (string) An optional unique key to identify this cache block.  Must contain only alphanumeric characters.</li>
          <li><b>expires</b> - (integer) The expiry time for this block (in minutes).  The default value is 120 minutes.</li>
          <li><b>lowentropy</b> - (boolean) Prevent adding entropy to the key.  This allows the same block of HTML to be cached across multiple different pages.</li>
        </ul>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_cache_block}&lbrace;Products}&lbrace;/xt_cache_block}</pre>
      <p><strong>Tip:</strong> Never place the &lbrace;xt_cache_block} tags around the default content block.</p>
      <p><strong>Tip:</strong> Use caution with smarty logic and the assignment of variables within &lbrace;xt_cache_block} calls.  Do not create smarty variables within the block that will be used outside.</p>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_cookie_set} <span class="small">Saves values to cookies <span style="color:green">(new)</span></span></h3>
    <div class="accordion-list-item-body">
      <p><span class="green">NEW</span> This function plugin allows saving values to cookies as you would in PHP. It has all the parameters typically used with PHP function <b>setcookie(...)</b></p>
      <p>Parameters:</p>
        <ul>
          <li><b>name</b> - (string) A required name to the cookie.</li>
          <li><b>value</b> - (string) (optional) An optional value.</li>
          <li><b>expire</b> - (integer) (optional) The time the cookie expires. This is a Unix timestamp so is in number of seconds since the epoch. The expression <i>time()+(86400*30)</i> can be used as an example to calculate 30 days from current time. Omission will set the expiry time to the end of the browsing session.</li>
          <li><b>path</b> - (string) (optional) The path on the server in which the cookie will be available on. If set to '/', the cookie will be available within the entire domain.</li>
          <li><b>domain</b> - (string) (optional) The (sub)domain that the cookie is available to.</li>
          <li><b>secure</b> - (boolean) (optional) Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client. When set to true, the cookie will only be set if a secure connection exists.</li>
          <li><b>httponly</b> - (boolean) (optional) When true the cookie will be made accessible only through the HTTP protocol. This means that the cookie won't be accessible by scripting languages, such as JavaScript.</li>
        </ul>
      <p><strong>Note:</strong> For more documentation and specifics please consult PHP site documentation about the <b>setcookie(...)</b> function.</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_cookie_set name=mycookie value='chocolate'}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_file_list} <span class="small">Retrieve a list of files that match a criteria</span></h3>
    <div class="accordion-list-item-body">
       <p>A Smarty plugin to retrieve a list of files that match a criteria, and optionally to build a list of HTML options from the results for use in a dropdown</p>
       <p>Parameters:</p>
        <ul>
         <li><b>dir</b> - (string) The name of the directory <em>(relative to the uploads path)</em> to search.</li>
         <li><b>pattern</b> - (string) A list of file patterns separated by || to search for.  i.e: *.pdf||*.doc</li>
         <li><b>excludes</b> - (string) A list of file patterns separated by || to exclude from the returned list.  i.e: Z*</li>
         <li><b>maxdepth</b> - (int) A positive integer representing the maximum depth of directories to search.  Default is to put no limit on directory depth.</li>
         <li><b>absolute</b> - (bool) A boolean option indicating that the absolute path to the files should be used in the returned values.</li>
         <li><b>options</b> - (bool) A boolean option indicating that the output should be a string of html options.</li>
         <li><b>selected</b> - (string) If options is specified, this parameter can be used to specify the currently selected option.</li>
         <li><b>novalue</b> - (string) if the &quot;options&quot; attribute is specified, this parameter can be used to specify the string used to indicate in the generated dropdown or multi select list to indicate that no value has been selected.  By default, there is no option indicating novalue.</li>
         <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
        </ul>
       <p>Example One: Create a dropdown of PDF files in the uploads/docs directory:</p>
       <pre class="click-to-copy" title="Click to copy to clipboard">&lt;select name="&lbrace;$actionid}pdf_file">&lbrace;xt_file_list dir=docs options=1 novalue="None" pattern='*.pdf' selected=$somevar}&lt;select&gt;</pre>
       <p>Example Two: Create an array of PDF Files in the uploads/docs directory:</p>
         <pre class="click-to-copy" title="Click to copy to clipboard">&lbrace;xt_file_list dir=docs pattern='*.pdf' assign='pdf_files'}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_image_list} <span class="small">Retrieves a list of images that match a criteria from a directory</span></h3>
    <div class="accordion-list-item-body">
       <p>A smarty plugin to retrieve a list of images that match a criteria from a directory, and optionally to build a list of html options from the results.  This plugin is simply a wrapper around the &lbrace;xt_file_list} plugin described above.</p>
       <p>Parameters:</p>
       <ul>
         <li><b>dir</b> - (string) The name of the directory <em>(relative to the uploads path)</em> to search.</li>
         <li><b>extensions</b> - (string) A list of file patterns separated by || to override the default pattern of *.jpg||*.jpeg||*.png||*.gif||*.bmp||*.ico</li>
         <li><b>excludes</b> - (string) A list of file patterns separated by || to exclude from the returned list.  i.e: Z*||a*</li>
         <li><b>maxdepth</b> - (int) A positive integer representing the maximum depth of directories to search.  Default is to put no limit on directory depth.</li>
         <li><b>absolute</b> - (bool) A boolean option indicating that the absolute path to the files should be used in the returned values.</li>
         <li><b>options</b> - (bool) A boolean option indicating that the output should be a string of html options.</li>
         <li><b>selected</b> - (string) If options is specified, this parameter can be used to specify the currently selected option.</li>
         <li><b>novalue</b> - (string) if the &quot;options&quot; attribute is specified, this parameter can be used to specify the string used to indicate in the generated dropdown or multi select list to indicate that no value has been selected.  By default, there is no option indicating novalue.</li>
         <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
       </ul>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_message} <span class="small">Store and retrieve messages in the session</span></h3>
    <div class="accordion-list-item-body">
       <p>A simple convenience plugin to store messages in the session and retrieve them. Messages are automatically removed from the session once retrieved.</p>
       <p>See also: class xt_message</p>
       <p>Parameters:</p>
       <ul>
         <li><b>key</b> - (string) The message key.</li>
         <li><b>value</b> - (string) Optionally create a new message variable.</li>
         <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
       </ul>
       <p>Usage:</p>
        <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;xt_message key='sample'} &lbrace;* get, erase, and output the value of &quot;sample&quot; if it exists *}</pre>
        <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;xt_message key='sample' assign='foo'} &lbrace;* get, erase, and assign the value of &quot;sample&quot; if it exists to the smarty variable foo.*}</pre>
        <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;xt_message key='sample' value='bar'} &lbrace;* set the value of the key &quot;sample&quot; to &quot;bar&quot; *}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_pageoptions} <span class="small">Generate a list of options for a select statement consisting of matching content pages</span></h3>
    <div class="accordion-list-item-body">
       <p>Generate a list of options for a select statement consisting of matching content pages.  This can be used to select a page as a module preference etc.</p>
       <p>Parameters:</p>
        <ul>
         <li><b>start_page</b> - (int|string) The page id or alias of the parent page.  Only the descendents of this page will be used in the output.</li>
         <li><b>selected</b> - (int|string) The page id or alias of the currently selected page.</li>
         <li><b>show_navhidden</b> - (bool) Whether or not to show content items that are marked as not shown in menu.</li>
         <li><b>none</b> - (bool) Whether or not to show a &quot;None&quot; option at the top of the list.</li>
        </ul>
       <p>Usage:</p>
       <pre class="click-to-copy" title="Click to copy to clipboard">  &lt;select name="&lbrace;$actionid}something"&gt;
    &lbrace;xt_pageoptions selected=$some_preference}
  &lt;/select&gt;</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_file_link} <span class="small">Generate an obfuscated link to a file</span></h3>
    <div class="accordion-list-item-body">
      <p>Generate an obfuscated link to a file to allow viewing or downloading the file without providing path information.  For links to images optionally generate and display a thumbnail, and (by default) allow opening the image in the browser.</p>
      <p>Parameters:</p>
      <ul>
         <li><b>in</b> - (string) The file path or URL to the item.  Input must be within the CMSMS root path even if specifying an absolute file location.  file paths relative to the image_uploads_path, or the root path are also acceptable. URLS must be complete URLS. Protocol specific URLS may also work but must specify the complete domain name and path.</li>
         <li><b>page</b> - (int|string) - A page id or alias to a public/unprotected page for the URL to allow sharing.  If not specified the current page id will be used.</li>
         <li><b>urlonly</b> - (bool) Output only the URL to the obfuscated file, no link or thumbnail. Off by default</li>
         <li><b>download</b> - (bool) For links to image files force the image to be downloaded on click rather than opening in the browser. Off by default</li>
         <li><b>thumbnail</b> - (bool) For links to image files optionally display a thumbnail for the image... generating one if necessary.  On by default</li>
      </ul>
      <p>Usage:</p>
    <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;xt_file_link in='uploads/terms.pdf'}
  &lbrace;xt_file_link in='uploads/images/about.jpg'}</pre>
  </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_html_options} <span class="small">HTML &lt;option&gt; tags suitable for use in a select statement</span></h3>
    <div class="accordion-list-item-body">
      <p>Given an array of option definitions create HTML &lt;option&gt; tags suitable for use in a select statement.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>options</b> - (array) An array of key/value pairs or an array of label and value attributes.
            <p>When passing an array of label and value records, this module will also accept a &quot;disable&quot;, &quot;class&quot;, &quot;selected&quot; and &quot;id&quot; attributes.  i.e.:</p>
        <pre>&lbrace;$options = [
       [
           'label' =&gt; 'Canada',
           'value' =&gt; 'US',
       ],
       [
           'label' =&gt; 'United States',
           'value' =&gt; 'US',
           'disabled' =&gt; 1,
       ],
       [
           'label' =&gt; 'France',
           'value' =&gt; 'FR',
           'id' =&gt; 'FR',
           'class' =&gt; 'cool'
       ],
       [
           'label' =&gt; 'Netherlands',
           'value' =&gt; 'NL',
           'selected' =&gt; 1
       ],
    ]}</pre>
          </li>
          <li><b>selected</b> - (string|array) The value of the selected element(s).</li>
          <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
        </ul>
      <p>Example:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">&lt;select name="something"&gt;&lbrace;xt_html_options options=$my_options}&lt;/select&gt;</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_form_csrf} <span class="small">Generate a CSRF token for module forms</span></h3>
    <div class="accordion-list-item-body">
      <p>Generate a CSRF token and embed it as hidden inputs into a form.</p>
      <p>This tool can be used to generate unique tokens to prevent Cross-Site-Request-Forgery attacks on form submissions.</p>
      <p>See the <code>\xt_utils::validate_form_csrf()</code> companion method.</p>
      <p>See the <code>xt_ignore_csrf</code> config entry below.</p>
      <p>Parameters:</p>
      <ul>
        <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
      </ul>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xtcss_add}...&lbrace;/xtcss_add} <span class="small">Cache and minify stylesheets</span></h3>
    <div class="accordion-list-item-body">
    <p>This plugin allows adding CSS to the cached stylesheets generated by <code>&lbrace;xtjs_render}</code>. This is similar to (but better than) embedded CSS &lt;style&gt; tags because the css is concatenated to a minimized, and cached stylesheet that is downloaded by the user once.</p>
    <p>See Also: <code>&lbrace;xtjs_render}</code></p>
    <p>Parameters:</p>
      <ul>
         <li><b>depends</b> - (mixed) Either a comma separated string, or an array of required library names.  These libraries (and their dependents will be loaded prior to the inclusion of this css).</li>
         <li><b>nominify</b> - (bool) Explicitly disable minifying this CSS.</li>
         <li><b>append</b> - (bool) Specify that this code should be appended AFTER all regular requires, and includes.  This parameter can be useful considering the order in which CMSMS templates are processed.</li>
      </ul>
    <p>Usage:</p>
  <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;* add some css specific for this page or template *
  &lbrace;xtcss_add}
    img.album &lbrace;
      float: left;
      width: 33%;
      padding: 4px;
    }
  &lbrace;/xtcss_add}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xtjs_add}...&lbrace;/xtjs_add} <span class="small">Cache and minify javascript</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin allows adding javascript to the cached javascript file generated by <code>&lbrace;xtjs_render}</code>. This is similar to (but better than) embedded &lt;script&gt; tags because the javascript is concatenated to a minimized, and cached stylesheet that is downloaded by the user once.</p>
      <p>See Also: <code>&lbrace;xtjs_render}</code></p>
      <p>Parameters:</p>
      <ul>
        <li><b>depends</b> - (mixed) A comma separated list of registered lib names, or an array of registered lib names.</li>
        <li><b>nominify</b> - (bool) explicitly disable minifying this javascript.</li>
        <li><b>append</b> - (bool) specify that this code should be appended AFTER all regular requires, and includes.  This parameter can be useful if there is javascript generated in module templates, and output at the bottom of the page content.</li>
      </ul>
      <p>Usage:</p>
      <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;* automatically enable jquery ui tooltip functionality *}
  &lbrace;xtjs_add depends=ui}
    $(document).ready(function()&lbrace;
    $(document).tooltip();
    });
  &lbrace;/xtjs_add}</pre>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xtjs_require} <span class="small">Add libraries to &lbrace;xtjs_render}</span></h3>
<div class="accordion-list-item-body"><p>This plugin allows adding <em>(one of)</em> a predefined javascript library (and its associated css), a CMSMS stylesheet, a static CSS file, or a javascript file to the compiled javascript and css output.  This plugin replaces multiple &lt;script&gt; and/or &lt;link rel=stylesheet ...&gt; tags.</p>
    <p>See Also: <code>&lbrace;xtjs_render}</code></p>
    <p>Parameters:</p>
      <ul>
        <li><b>lib</b> - (string) A name of a registered library.</li>
        <li><b>cssname</b> - (string) The name of a CMSMS stylesheet.</li>
        <li><b>cssfile</b> - (string) A CSS Filename <em>(relative to the current module, or to the uploads directory)</em></li>
        <li><b>cssurl</b> - (string) A URL to a remote CSS file to fetch and cache.</li>
        <li><b>jsfile</b> - (string) A Javascript filename <em>(relative to the current module, or to the uploads directory)</em></li>
        <li><b>jsurl</b> - (string) A URL to a remote Javascript file to fetch and cache.</li>
        <li><b>depends</b> - (mixed) A comma separated list of registered lib names, or an array of registered lib names.</li>
        <li><b>nominify</b> - (bool) explicitly disable minifying both the css and the javascript from this library, overriding what is stated in the library.</li>
      </ul>
    <p>Usage:</p>
      <ul>
        <li><code>&lbrace;xtjs_require lib='fancybox'}</code><br/>Ensure that the fancybox library, and any (registered) libraries that it depends on are loaded.</li>
        <li><code>&lbrace;xtjs_require jsfile='assets/mystuff.js'}</code><br/>Ensure that the specified javascript file is included in the javascript output when this page is rendered.</li>
        <li><code>&lbrace;xtjs_require cssname='mystuff'}</code><br/>Ensure that the specified CMSMS stylesheet named 'mystuff' is included in the css output when this page is rendered.</li>
        <li><code>&lbrace;xtjs_require cssfile='assets/mystuff.css'}</code><br/>Ensure that the specified CSS file is included in the css output when this page is rendered.</li>
        <li><code>&lbrace;xtjs_require jsfile='assets/mystuff2.js' depends='fancybox'}</code><br/>Ensure that the assets/mystuff2.js file, and it's dependents (fancybox) is included in the javascript output,</li>
      </ul>
    <p>Notes:</p>
       <ul>
         <li>Only one of: lib, jsfile, jsurl, cssfile, cssurl, and cssname are required.  Specifying multiple arguments could result in random behavior.</li>
         <li>The jsfile, cssfile, and cssname arguments all support the 'depends' argument... however it is ignored when specifying the &quot;lib&quot; argument.</li>
         <li>When using remote URLS, they are cached locally before minifying or attaching to the css.</li>
         <li>Libraries, files and code are largely attached in the order they are specified.</li>
       </ul>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xtjs_render} <span class="small">Render all library dependencies</span></h3>
    <div class="accordion-list-item-body">
      <p>This plugin intelligently and recursively resolves all library dependencies, and outputs two tags:</p>
      <ul>
        <li>A script tag to include all the requested javascript (including javascript libraries, javascript files, and embedded javascript), in a single minimized file.</li>
        <li>A stylesheet tag to include all the requested CSS (including that defined for javascript libraries), CSS files, and embedded CSS), in a single minimized file.</li>
      </ul>
    <p>The plugin allows caching the output for an adjustable number of hours, so that the potentially expensive function of resolving all the dependencies, reading all the code and concatenating them is minimized.</p>
    <p>Parameters:</p>
    <ul>
      <li><b>excludes</b> - (string[]) - An array of library names to exclude from the output <em>(even if they are required by other libaries)</em> This is useful if some libraries will be included by means external to the <code>&lbrace;xtjs_require}</code> tag.</li>
      <li><b>cache_lifetime</b> - (int) - The number of hours that the output should be cached for.  The default value is 24.  This value can be overridden globally with the &quot;xtejs_cachelife&quot; config entry.</li>
      <li><b>nocache</b> - (int) - Any non zero value indicates that caching should be turned off entirely... this is potentially an expensive option, and should only be used for development.  This value can be overridden globally with the &quot;xtejs_nocache&quot; config entry.</li>
      <li><b>nominify</b> - (int) - Any non zero value indicates that minifying of javascript and CSS output should be turned off entirely... This value can be overridden globally with the &quot;xtejs_nominify&quot; config entry.</li>
      <li><b>no_css</b> - (int) - Any non zero value indicates that stylesheet tags should not be output.</li>
      <li><b>no_js</b> - (int) - Any non zero value indicates that javascript tags should not be output.</li>
      <li><b>addkey</b> - (string) Add entropy into the cache file name generation algorithm.</li>
      <li><b>assign</b> - (string) Assign the html output of this plugin to the named smarty variable.</li>
    </ul>
    <p>Usage:</p>
  <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;* output all javascript and CSS data queued via the xtjs_require, xtjs_addjs, and xtjs_addcss plugins *}
    &lbrace;xtjs_render}
  &lt;/head&gt;</pre>
    <p>Notes:</p>
    <ul>
      <li>This plugin is merely a wrapper around the <code>xt_jsloader::render</code> API function.</li>
      <li>The <code>xt_jsloader::render</code> API function is called automatically for admin actions in modules that inherit from CMSMSExt.  This means that you can use &lbrace;xtjs_require}, &lbrace;xtjs_addcss} and &lbrace;xtjs_addjs} in any admin side action in any of my modules.</li>
      <li>In admin side actions, because the CMSMS admin theme <em>(OneEleven, and NCleanGrey)</em> automatically include JQuery, and JQuery UI, these libraries <em>(jquery, ui)</em> are automatically added to the exclude list.</li>
      <li>In frontend page templates, I recommend adding this tag to the bottom of the &lt;head&gt; tag so that &lbrace;xtjs_require}, &lbrace;xtjs_add} and &lbrace;xtcss_add} can be called anywhere in module action templates, page templates, etc.</li>
    </ul>
    </div>
  </li>
    {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;check_session_status} <span class="small">Checks the session expiration status <span style="color:green">(new)</span></span></h3>
    <div class="accordion-list-item-body"> <p>A smarty plugin used to check the session expiration status, display a countdown timer to the user and display a message or a toast to the user if and when the session has expired. Except for the script that is generated by this plugin, the rest of html and css are optional and can be customized or overridden.</p>
     <p>Parameters:</p>
      <ul>
        <li><b>session_check_interval</b> - (integer, optional): The interval (in seconds) at which the session status is checked. Default value is 1 second.</li>
        <li><b>toast_display_interval</b> - (integer, optional): The duration (in seconds) for which the toast message is displayed. Default value is 10 seconds.</li>
        <li><b>use_toast</b> - (integer, optional): Flag indicating whether to use toast for displaying the session expired message. Set to 1 for true, 0 for false. Default value is 1.</li>
        <li><b>use_custom_html</b> - (integer, optional): Flag indicating whether to use custom HTML for session status display. Set to 1 for true, 0 for false. Default value is 0.</li>
        <li><b>use_custom_css</b> - (integer, optional): Flag indicating whether to use custom CSS for session status display. Set to 1 for true, 0 for false. Default value is 0.</li>
        <li><b>counter_id</b> - (string, optional): The ID attribute for the countdown timer element. Default value is 'session_status_countdown'.</li>
        <li><b>counter_class</b> - (string, optional): The class attribute for the countdown timer element. Default value is 'session_status_countdown'.</li>
        <li><b>counter_span_id</b> - (string, optional): The ID attribute for the countdown timer span element. Default value is 'session_status_countdown_span'.</li>
        <li><b>counter_span_class</b> - (string, optional): The class attribute for the countdown timer span element. Default value is 'session_status_countdown_span'.</li>
        <li><b>toast_id</b> - (string, optional): The ID attribute for the toast element. Default value is 'session_status_toast'.</li>
        <li><b>toast_class</b> - (string, optional): The class attribute for the toast element. Default value is 'session_status_toast'.</li>
        <li><b>notification_id</b> - (string, optional): The ID attribute for the session expired notification element. Default value is 'session_status_expired_alert'.</li>
        <li><b>notification_class</b> - (string, optional): The class attribute for the session expired notification element. Default value is 'session_status_alert'.</li>
        <li><b>alert_message_id</b> - (string, optional): The ID attribute for the alert message element within the notification. Default value is 'alert_message'.</li>
        <li><b>end_session_message</b> - (string, optional): The message to display when the session has expired. Default value is 'Your session has expired. Please refresh the page to continue.'.</li>
        <li><b>custom_callback</b> - (string, optional): The name of a custom callback function to be executed when the session expires. Default value is an empty string.</li>
      </ul>
    </div>
  </li>
    {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;restrict_by_ip_list} <span class="small">restricts access by IP address. <span style="color:green">(new)</span></span></h3>
    <div class="accordion-list-item-body"> <p>A smarty plugin used to restrict access by a single IP address or a list of them be it IPV4 or IPV6. Throws a <b>CmsError403Exception</b> exception which will redirect to a CMSMS custom page if set, or a host custom page if not. Can be used on a template or on a page.</p>
     <p>Parameters:</p>
      <ul>
       <li><b>list</b> - (string or array) An array of IP addresses or a single IP address.</li>
      </ul>
    </div>
  </li>
  </ul>
{*******************************************************************************}
  <h3>Tab Functions:</h3>
  <p style="color: red;">Deprecated! The core now has the functionality built in.</p>
  <p>This module provides some smarty plugins to assist in building tabbed output in admin side templates.  This aids in further separating the display issues from logic issues.</p>
  <h4>Example:</h4>
  <pre class="click-to-copy" title="Click to copy to clipboard">  &lbrace;xt_start_tabs}
  &lbrace;xt_tabheader name='tab1' label='Tab One'}
  &lbrace;xt_tabheader name='tab2' label='Tab Two'}
  &lbrace;xt_tabcontent_start name='tab1'}
    &lt;p&gt;Content for tab one&lt;/p&gt;
  &lbrace;xt_tabcontent_end}&lbrace;* not necessary, but provided for completeness *}
  &lbrace;xt_tabcontent_start name='tab2'}
    &lt;p&gt;Content for tab two&lt;/p&gt;
  &lbrace;xt_end_tabs}</pre>
{*******************************************************************************}
  <ul class="accordion-list">

  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_start_tabs} <span class="small">Indicates the start of tabbed output</span></h3>
<div class="accordion-list-item-body"> <p>An admin only smarty plugin useful in admin tabs to indicate the start of tabbed output.  See the brief demo above.</p>
     <p>Parameters:</p>
     <ul>
       <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
     </ul>
    </div></li>
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_tabheader name=string} <span class="small">Indicates the start of a tab header</span></h3>
    <div class="accordion-list-item-body">
       <p>An admin only smarty plugin used to denote the start of a tab header.  See the brief demo above.</p>
       <p>Parameters:</p>
       <ul>
         <li><b>name</b> - (string) The name for the tab.  This should be all alphanumeric characters, or underscore.</li>
         <li><b>label</b> - (string) The human-readable label for this tab.</li>
         <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
        </ul>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_tabcontent_start} <span class="small">Indicates the start of a tab content</span></h3>
    <div class="accordion-list-item-body">
     <p>An admin only smarty plugin used to denote the start of a tab content.  See the demo above.</p>
     <p><strong>Note:</strong> The order of the tabcontents must match exactly the order of the tab headers specified.  Additionally, it is not necessary to denote the ending of the tab headers, as this is detected automatically by the first call to &lbrace;xt_tabcontent_start}.</p>
     <p>Parameters:</p>
      <ul>
       <li><b>name</b> - (string) The name for the tab.  This should be all alphanumeric characters, or underscore.</li>
       <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
      </ul>
    </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_tabcontent_end} <span class="small">Indicates the end of a tab content</span></h3>
    <div class="accordion-list-item-body">
     <p>An admin only smarty plugin used to denote the end of a tabs content.  See the demo above.</p>
     <p><strong>Note:</strong>  It is not necessary to call this plugin for each tab, as it is done implicitly by the call to &lbrace;xt_tabcontent_start} or &lbrace;xt_end_tabs}.</p>
     <p>Parameters:</p>
     <ul>
       <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
     </ul>
  </div>
  </li>
  {*******************************************************************************}
  <li class="accordion-list-item">
    <h3 class="al">&lbrace;xt_end_tabs} <span class="small">Indicates the end of tabbed output</span></h3>
    <div class="accordion-list-item-body"> <p>An admin only smarty plugin used to denote the end of tabbed output...  See the demo above.</p>
     <p>Parameters:</p>
      <ul>
       <li><b>assign</b> - (string) Assign the output of this plugin to the named smarty variable.</li>
      </ul>
    </div>
  </li>
</ul>