diff --git a/src/components/com_tjcertificate/administrator/access.xml b/src/components/com_tjcertificate/administrator/access.xml index 30c7d82f..944f9715 100644 --- a/src/components/com_tjcertificate/administrator/access.xml +++ b/src/components/com_tjcertificate/administrator/access.xml @@ -10,5 +10,7 @@ + + diff --git a/src/components/com_tjcertificate/administrator/controllers/certificate.php b/src/components/com_tjcertificate/administrator/controllers/certificate.php index 90587aea..337faeb7 100644 --- a/src/components/com_tjcertificate/administrator/controllers/certificate.php +++ b/src/components/com_tjcertificate/administrator/controllers/certificate.php @@ -47,6 +47,14 @@ public function download() } $certificate = TJCERT::Certificate(); + + // Check user having permission to download + if (!$certificate::canDownload($uniqueCertificateId)) + { + $app->enqueueMessage(Text::_('JERROR_ALERTNOAUTHOR')); + $app->redirect('index.php'); + } + $certificateObj = $certificate::validateCertificate($uniqueCertificateId); if (!$certificateObj->id) diff --git a/src/components/com_tjcertificate/administrator/languages/en-GB/en-GB.com_tjcertificate.ini b/src/components/com_tjcertificate/administrator/languages/en-GB/en-GB.com_tjcertificate.ini index 65685b6a..ab0f28d1 100644 --- a/src/components/com_tjcertificate/administrator/languages/en-GB/en-GB.com_tjcertificate.ini +++ b/src/components/com_tjcertificate/administrator/languages/en-GB/en-GB.com_tjcertificate.ini @@ -105,7 +105,7 @@ COM_TJCERTIFICATE_CERTIFICATE_LIST_VIEW_COMMENT="Comment" ;Certificate - Filters COM_TJCERTIFICATE_CERTIFICATE_FILTER_SEARCH_LABEL="Search" -COM_TJCERTIFICATE_CERTIFICATE_FILTER_SEARCH_LABEL_DESC="Search in template title. Prefix with ID:to search for a Certificate ID" +COM_TJCERTIFICATE_CERTIFICATE_FILTER_SEARCH_LABEL_DESC="Search in template title. Prefix with ID:to search for a Certificate ID. Search for User Name" COM_TJCERTIFICATE_CERTIFICATE_FILTER_CERTIFICATE_TEMPLATE_SELECT="- Select Template -" COM_TJCERTIFICATE_CERTIFICATE_FILTER_CERTIFICATE_TEMPLATE="Template" COM_TJCERTIFICATE_CERTIFICATE_FILTER_DESC_CERTIFICATE_TEMPLATE="Select Template" @@ -250,3 +250,22 @@ COM_TJCERTIFICATE_SOCIAL_SHARING_OPTIONS="Select social sharing options" ;Certificate Menu option COM_TJCERTIFICATE_CERTIFICATE_TEXT_FILTER="Show Free Text Filter" COM_TJCERTIFICATE_CERTIFICATE_TYPE_FILTER="Show Certificate Type Filter" + +;Certificate PDF download permissions +COM_TJCERTIFICATE_PERMISSION_CERTIFICATE_DOWNLOAD_OWN="Download own certificate" +COM_TJCERTIFICATE_PERMISSION_CERTIFICATE_DOWNLOAD_OWN_DESC="Allow users to download own certificate" +COM_TJCERTIFICATE_PERMISSION_CERTIFICATE_DOWNLOAD_ALL="Download all certificate" +COM_TJCERTIFICATE_PERMISSION_CERTIFICATE_DOWNLOAD_ALL_DESC="Allow users to download all certificate" + +;Issued Certificate View +COM_TJCERTIFICATE_CERTIFICATE_EXPIRED="Certificate expired" +COM_TJCERTIFICATE_CERTIFICATE_URL_COPY="Copy Url" +COM_TJCERTIFICATE_CERTIFICATE_URL="Certificate Url" +COM_TJCERTIFICATE_CERTIFICATE_TYPE_NAME="Title" +COM_TJCERTIFICATE_CERTIFICATE_LIST_VIEW_USER_NAME="User Name" +COM_TJCERTIFICATE_CERTIFICATE_FILTER_USER_SELECT="- Select User -" +COM_TJCERTIFICATE_CERTIFICATE_LIST_VIEW_CERTIFICATE_ID="Certificate Id" +COM_TJCERTIFICATE_CERTIFICATE_FILTER_CERTIFICATE_TYPE_SELECT="- Select Type -" +COM_TJCERTIFICATE_CLIENT_COM_TJLMS_COURSE="Course" +COM_TJCERTIFICATE_CLIENT_COM_JTICKETING_EVENT="Event" +COM_TJCERTIFICATE_CERTIFICATE_LIST_VIEW_TYPE="Type" diff --git a/src/components/com_tjcertificate/administrator/libraries/certificate.php b/src/components/com_tjcertificate/administrator/libraries/certificate.php index 5a162233..503b063a 100644 --- a/src/components/com_tjcertificate/administrator/libraries/certificate.php +++ b/src/components/com_tjcertificate/administrator/libraries/certificate.php @@ -552,7 +552,11 @@ public function getUrl($options, $showSearchBox = true) { $url = 'index.php?option=com_tjcertificate&view=certificate&certificate=' . $this->unique_certificate_id; - $url .= '&show_search=' . $showSearchBox; + // If search box is true then only show search box param in URL + if ($showSearchBox) + { + $url .= '&show_search=' . $showSearchBox; + } if (isset($options['popup'])) { @@ -751,8 +755,8 @@ public function issueCertificate($replacements, $options) { try { - // Check user_id or certificate_template_id (this is needed to generate certificate body) is empty - if (empty($this->user_id) || empty($this->certificate_template_id)) + // Check user_id or issued Id or certificate_template_id (this is needed to generate certificate body) is empty + if ((empty($this->user_id) && empty($this->client_issued_to)) || empty($this->certificate_template_id)) { throw new Exception(Text::_('COM_TJCERTIFICATE_CERTIFICATE_EMPTY_DATA')); } @@ -937,4 +941,36 @@ protected function generateUniqueCertId($options) return $certificateString; } + + /** + * This function checks the certificate download permission + * + * @param STRING $uniqueCertificateId certificate Id + * + * @return boolean + * + * @since __DEPLOY_VERSION__ + */ + public static function canDownload($uniqueCertificateId) + { + $user = Factory::getUser(); + + if ($user->authorise('certificate.download.all', 'com_tjcertificate')) + { + return true; + } + + if ($user->authorise('certificate.download.own', 'com_tjcertificate')) + { + $table = TJCERT::table("certificates"); + $table->load(array('unique_certificate_id' => $uniqueCertificateId)); + + if ($user->get('id') == $table->user_id) + { + return true; + } + } + + return false; + } } diff --git a/src/components/com_tjcertificate/administrator/models/certificates.php b/src/components/com_tjcertificate/administrator/models/certificates.php index 6039421a..78ce5435 100644 --- a/src/components/com_tjcertificate/administrator/models/certificates.php +++ b/src/components/com_tjcertificate/administrator/models/certificates.php @@ -157,7 +157,9 @@ protected function getListQuery() else { $search = $db->quote('%' . str_replace(' ', '%', $db->escape(trim($search), true) . '%')); - $query->where(' (ct.title LIKE ' . $search . ' OR ci.unique_certificate_id LIKE ' . $search . ' )'); + $query->where(' (ct.title LIKE ' . $search . ' OR ci.unique_certificate_id LIKE ' + . $search . ' OR ci.client_issued_to_name LIKE ' . $search . + ' OR users.name LIKE ' . $search . ' )'); } } diff --git a/src/components/com_tjcertificate/administrator/models/forms/filter_certificates.xml b/src/components/com_tjcertificate/administrator/models/forms/filter_certificates.xml index 463914a4..f9c13f6e 100644 --- a/src/components/com_tjcertificate/administrator/models/forms/filter_certificates.xml +++ b/src/components/com_tjcertificate/administrator/models/forms/filter_certificates.xml @@ -22,16 +22,15 @@ - - + addfieldpath="/components/com_tjcertificate/models/fields" + clientByUser="0" + onchange="this.form.submit();" /> - + + escape($this->state->get('list.ordering')); $listDirn = $this->escape($this->state->get('list.direction')); $saveOrder = $listOrder == 'ci.id'; +$dispatcher = JDispatcher::getInstance(); +PluginHelper::importPlugin('content'); if ( $saveOrder ) { @@ -81,16 +89,16 @@ - + - + - + @@ -98,6 +106,12 @@ + + + + + + @@ -117,6 +131,7 @@ items as $i => $item) { + $data = $dispatcher->trigger('getCertificateClientData', array($item->client_id, $item->client)); $item->max_ordering = 0; $canEdit = $this->canDo->get('core.edit'); @@ -156,8 +171,29 @@ escape($item->title); ?> - escape($item->client); ?> - escape($item->uname); ?> + + client); + $client = strtoupper("COM_TJCERTIFICATE_CLIENT_" . $client); + echo TEXT::_($client); + ?> + + + client_issued_to_name)) + { + $userName = $this->escape($item->client_issued_to_name); + } + elseif (!empty($item->uname)) + { + $userName = $this->escape($item->uname); + } + + echo $userName; + ?> + issued_on, Text::_('DATE_FORMAT_LC')); ?> expired_on) && $item->expired_on != '0000-00-00 00:00:00') @@ -169,6 +205,37 @@ echo '-'; } ?> + + title)) ? $data[0]->title : '-'; + ?> + + + toSql(); + + if ($item->expired_on > $utcNow || $item->expired_on == '0000-00-00 00:00:00') + { + // Get TJcertificate url for display certificate + $urlOpts = array ('absolute' => ''); + $link = TJCERT::Certificate($item->id)->getUrl($urlOpts, false); + ?> +
+ + + +
+ + escape($item->comment); ?> id; ?> diff --git a/src/components/com_tjcertificate/media/css/tjCertificate.css b/src/components/com_tjcertificate/media/css/tjCertificate.css index 64608b41..fe11faaa 100644 --- a/src/components/com_tjcertificate/media/css/tjCertificate.css +++ b/src/components/com_tjcertificate/media/css/tjCertificate.css @@ -129,11 +129,20 @@ .bs-v1 { box-shadow: 0 4px 10px 0 rgba(0,0,0,0.1); } +.line-h-noraml{ + line-height: normal; +} +.w-100{ + width:100%; +} .tj-certificate-image { background-color: #fff; width: 100%; float: left; } +.tj-certificate-image img{ + width: 100%; +} #certificateContent{ margin: 0 auto; } @@ -148,14 +157,16 @@ border-radius: 5px; margin-left: 4px; border: 1px solid #ddd; - display: inline-block; + display: inline-block !important; } .tjlmspin__caption_desc{ line-height: 18px; font-size: 14px; margin-bottom: 10px; } -.tjlmspin__position { +.tjlmspin__position, +.eventlist__price +{ position: absolute; top: 9px; background: #FAF8F8; @@ -163,10 +174,14 @@ color: #333; font-weight: 600; } -.tjlmslist .tjlmslist__image .tjlmspin__price { +.tjlmslist .tjlmslist__image .tjlmspin__price, +.eventlist .eventlist__price +{ left: 25px; } -.tjlmspin.mobile-view{ +.tjlmspin.mobile-view, +.eventpin.mobile-view +{ width: 255px; margin: 0 auto; float: none; @@ -174,6 +189,15 @@ .view-certificate .popover-title{ display: none; } +.tj-certificate .thumbnail{ + min-height: auto !important; + width: 100% !important; +} +.eventlist__desc{ + height: 20px; + overflow: hidden; + display: inline-block; +} @media screen and (max-width: 600px) { .tj-certificate-share-download{ text-align: center; @@ -183,9 +207,8 @@ .tjlmslist .thumbnail{ border:0; } - #certificateContent{ min-height: 800px; width: 1150px; } -} +} \ No newline at end of file diff --git a/src/components/com_tjcertificate/media/js/certificateImage.js b/src/components/com_tjcertificate/media/js/certificateImage.js index 22de5924..ce2977d9 100644 --- a/src/components/com_tjcertificate/media/js/certificateImage.js +++ b/src/components/com_tjcertificate/media/js/certificateImage.js @@ -12,7 +12,7 @@ var certificateImage = { enableDownloadShareBtns: function() { - jQuery("#download-popover").popover({ + jQuery("#download-popover").popover({ trigger: 'focus', html: true, content: jQuery('#download-popover-content').html() @@ -23,6 +23,8 @@ var certificateImage = { html: true, content: jQuery('#sharing-popover-content').html() }); + + jQuery("#copyurl").popover(); }, uploadImage: function(image) { @@ -44,9 +46,9 @@ var certificateImage = { jQuery('#certificateContent').hide(); img.src = imagePath + certificateId + ".png"; jQuery("#previewImage").append(img); - setTimeout(function(){ - Joomla.loadingLayer('hide'); }, - 1000); + setTimeout(function(){ + Joomla.loadingLayer('hide'); + }, 1000); } }); @@ -54,11 +56,11 @@ var certificateImage = { }, generateImage: function(element) { - jQuery('#certificateContent').width(element.offsetWidth).height(element.offsetHeight); + // jQuery('#certificateContent').width(element.offsetWidth).height(element.offsetHeight); Joomla.loadingLayer('show'); html2canvas(element, { - scale: (2), + // scale: (2), scrollX: 0, scrollY: -window.scrollY, allowTaint: true @@ -66,5 +68,21 @@ var certificateImage = { certificateImage.enableDownloadShareBtns(); certificateImage.uploadImage(canvas.toDataURL('image/png')); }); + }, + + copyUrl: function(element) { + element = '#' + element; + var inputDump = document.createElement('input'), + hrefText = jQuery(element).attr('data-alt-url'); + jQuery(element).popover("show"); + document.body.appendChild(inputDump); + inputDump.value = hrefText; + inputDump.select(); + document.execCommand('copy'); + document.body.removeChild(inputDump); + + setTimeout(function() { + jQuery(element).popover("hide"); + }, 1000); } } diff --git a/src/components/com_tjcertificate/media/js/certificateImage.min.js b/src/components/com_tjcertificate/media/js/certificateImage.min.js index a0781531..de5e7ab6 100644 --- a/src/components/com_tjcertificate/media/js/certificateImage.min.js +++ b/src/components/com_tjcertificate/media/js/certificateImage.min.js @@ -1 +1 @@ -var certificateImage={printCertificate:function(e){var t=document.getElementById(e).innerHTML,o=document.body.innerHTML;document.body.innerHTML=t,window.print(),document.body.innerHTML=o,certificateImage.enableDownloadShareBtns()},enableDownloadShareBtns:function(){jQuery("#download-popover").popover({trigger:"focus",html:!0,content:jQuery("#download-popover-content").html()}),jQuery("#sharing-popover").popover({trigger:"focus",html:!0,content:jQuery("#sharing-popover-content").html()})},uploadImage:function(e){var t=!1,o=jQuery("#certificateId").val();return jQuery.ajax({url:certRootUrl+"index.php?option=com_tjcertificate&task=certificate.uploadCertificate",type:"POST",data:{image:e,certificateId:o},success:function(e){t=e;var o=jQuery("#certificateId").val(),n=certRootUrl+"media/com_tjcertificate/certificates/",a=document.createElement("img");jQuery("#certificateContent").hide(),a.src=n+o+".png",jQuery("#previewImage").append(a),setTimeout(function(){Joomla.loadingLayer("hide")},1e3)}}),t},generateImage:function(e){jQuery("#certificateContent").width(e.offsetWidth).height(e.offsetHeight),Joomla.loadingLayer("show"),html2canvas(e,{scale:2,scrollX:0,scrollY:-window.scrollY,allowTaint:!0}).then(function(e){certificateImage.enableDownloadShareBtns(),certificateImage.uploadImage(e.toDataURL("image/png"))})}}; +var certificateImage={printCertificate:function(e){var t=document.getElementById(e).innerHTML,o=document.body.innerHTML;document.body.innerHTML=t,window.print(),document.body.innerHTML=o,certificateImage.enableDownloadShareBtns()},enableDownloadShareBtns:function(){jQuery("#download-popover").popover({trigger:"focus",html:!0,content:jQuery("#download-popover-content").html()}),jQuery("#sharing-popover").popover({trigger:"focus",html:!0,content:jQuery("#sharing-popover-content").html()}),jQuery("#copyurl").popover()},uploadImage:function(e){var t=!1,o=jQuery("#certificateId").val();return jQuery.ajax({url:certRootUrl+"index.php?option=com_tjcertificate&task=certificate.uploadCertificate",type:"POST",data:{image:e,certificateId:o},success:function(e){t=e;var o=jQuery("#certificateId").val(),n=certRootUrl+"media/com_tjcertificate/certificates/",r=document.createElement("img");jQuery("#certificateContent").hide(),r.src=n+o+".png",jQuery("#previewImage").append(r),setTimeout(function(){Joomla.loadingLayer("hide")},1e3)}}),t},generateImage:function(e){Joomla.loadingLayer("show"),html2canvas(e,{scrollX:0,scrollY:-window.scrollY,allowTaint:!0}).then(function(e){certificateImage.enableDownloadShareBtns(),certificateImage.uploadImage(e.toDataURL("image/png"))})},copyUrl:function(e){e="#"+e;var t=document.createElement("input"),o=jQuery(e).attr("data-alt-url");jQuery(e).popover("show"),document.body.appendChild(t),t.value=o,t.select(),document.execCommand("copy"),document.body.removeChild(t),setTimeout(function(){jQuery(e).popover("hide")},1e3)}}; \ No newline at end of file diff --git a/src/components/com_tjcertificate/site/languages/en-GB/en-GB.com_tjcertificate.ini b/src/components/com_tjcertificate/site/languages/en-GB/en-GB.com_tjcertificate.ini index 66a75185..9deabb4b 100644 --- a/src/components/com_tjcertificate/site/languages/en-GB/en-GB.com_tjcertificate.ini +++ b/src/components/com_tjcertificate/site/languages/en-GB/en-GB.com_tjcertificate.ini @@ -69,3 +69,6 @@ COM_TJCERTIFICATE_CERTIFICATE_COMPLETED_BY="Completed by " COM_TJCERTIFICATE_CERTIFICATE_DETAIL_VIEW_HEAD="Certificate" COM_TJCERTIFICATE_CERTIFICATE_DETAIL_VIEW_DATE_FORMAT="F j, Y" COM_TJCERTIFICATE_CERTIFICATE_BACK_BUTTON="Back" +COM_TJCERTIFICATE_CERTIFICATE_URL_COPY="Copy URL" +COM_TJCERTIFICATE_CERTIFICATE_LIST_VIEW_CERTIFICATE_ID="Certificate Id" +COM_TJCERTIFICATE_CERTIFICATE_FILTER_CERTIFICATE_TYPE_SELECT="- Select Type -" diff --git a/src/components/com_tjcertificate/site/models/fields/getclientlist.php b/src/components/com_tjcertificate/site/models/fields/getclientlist.php index bc517001..eb1b08bd 100644 --- a/src/components/com_tjcertificate/site/models/fields/getclientlist.php +++ b/src/components/com_tjcertificate/site/models/fields/getclientlist.php @@ -34,7 +34,7 @@ protected function getOptions() $clientByUser = $this->getAttribute('clientByUser'); - $options[] = JHtml::_('select.option', '', Text::_('COM_TJCERTIFICATE_CERTIFICATE_FILTER_CERTIFICATE_CLIENT_SELECT')); + $options[] = JHtml::_('select.option', '', Text::_('COM_TJCERTIFICATE_CERTIFICATE_FILTER_CERTIFICATE_TYPE_SELECT')); // Get Private/Created by logged-in user's templates if ($user->id) diff --git a/src/components/com_tjcertificate/site/views/certificate/tmpl/default.php b/src/components/com_tjcertificate/site/views/certificate/tmpl/default.php index 93dc8dda..54cfade1 100644 --- a/src/components/com_tjcertificate/site/views/certificate/tmpl/default.php +++ b/src/components/com_tjcertificate/site/views/certificate/tmpl/default.php @@ -16,9 +16,11 @@ use Joomla\CMS\Language\Text; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Filesystem\File; +use Joomla\CMS\Uri\Uri; $options['relative'] = true; HTMLHelper::_('jquery.framework'); +HTMLHelper::_('bootstrap.framework'); HTMLHelper::_('behavior.framework'); HTMLHelper::StyleSheet('media/com_tjcertificate/vendors/font-awesome-4.1.0/css/font-awesome.min.css'); HTMLHelper::StyleSheet('media/com_tjcertificate/css/tjCertificate.css'); @@ -72,7 +74,7 @@ // For twitter $document->addCustomTag(''); $document->addCustomTag(''); - $document->addCustomTag(''); + $document->addCustomTag(''); $document->addCustomTag(''); $document->addCustomTag(''); @@ -82,15 +84,15 @@

-
-

item->title; ?>

+
+

item->title; ?>

-
+
-
+
contentHtml)) @@ -99,7 +101,7 @@ } ?>
-
+
certificate->getUserId() == Factory::getUser()->id) { @@ -114,17 +116,20 @@ certificate->getDownloadUrl()) - { - ?> - - - - - downloadPermission) + { + if ($this->certificate->getDownloadUrl()) + { + ?> + + + + + @@ -149,6 +154,12 @@ + + +
- This certificate (ID: certificate->unique_certificate_id;?>) verifies that certificate->getUserId())->name; ?> has successfully completed the item->title; ?> on certificate->issued_on, Text::_('COM_TJCERTIFICATE_CERTIFICATE_DETAIL_VIEW_DATE_FORMAT'));?>. + item->title) + { ?> + This certificate (ID: certificate->unique_certificate_id;?>) verifies that certificate->getUserId())->name; ?> has successfully completed the item->title; ?> on certificate->issued_on, Text::_('COM_TJCERTIFICATE_CERTIFICATE_DETAIL_VIEW_DATE_FORMAT'));?>. + + This certificate (ID: certificate->unique_certificate_id;?>) has been awarded to certificate->getUserId())->name; ?> on certificate->issued_on, Text::_('COM_TJCERTIFICATE_CERTIFICATE_DETAIL_VIEW_DATE_FORMAT'));?>. + certificate->getExpiry() != '0000-00-00 00:00:00') { @@ -171,7 +192,7 @@
-
+
certificate->generated_body; ?> @@ -196,12 +217,15 @@ { jQuery('#certificateContent').hide(); } - else - { - certificateImage.generateImage(document.querySelector("#certificateContent")); - } certificateImage.enableDownloadShareBtns(); }); +window.onload = function() { + if (!imageExists) + { + certificateImage.generateImage(document.querySelector("#certificateContent")); + } +} + diff --git a/src/components/com_tjcertificate/site/views/certificate/view.html.php b/src/components/com_tjcertificate/site/views/certificate/view.html.php index 34d45bfc..a4a63504 100644 --- a/src/components/com_tjcertificate/site/views/certificate/view.html.php +++ b/src/components/com_tjcertificate/site/views/certificate/view.html.php @@ -46,6 +46,8 @@ class TjCertificateViewCertificate extends JViewLegacy public $fileName = null; + public $downloadPermission = null; + /** * Display the view * @@ -58,7 +60,7 @@ class TjCertificateViewCertificate extends JViewLegacy public function display($tpl = null) { $this->params = ComponentHelper::getParams('com_tjcertificate'); - $input = Factory::getApplication()->input; + $input = Factory::getApplication()->input; $this->uniqueCertificateId = $input->get('certificate', '', 'STRING'); $this->showSearchBox = $input->getInt('show_search', $this->params->get('show_search_box')); @@ -72,6 +74,8 @@ public function display($tpl = null) if (!$this->certificate->id) { JError::raiseWarning(500, Text::_('COM_TJCERTIFICATE_ERROR_CERTIFICATE_EXPIRED')); + + return false; } } @@ -89,6 +93,7 @@ public function display($tpl = null) $certificateUrl = 'index.php?option=com_tjcertificate&view=certificate&certificate=' . $this->certificate->unique_certificate_id; $this->certificateUrl = Uri::root() . substr(Route::_($certificateUrl), strlen(Uri::base(true)) + 1); + $this->downloadPermission = $certificate::canDownload($this->certificate->unique_certificate_id); // Get HTML $clientId = $this->certificate->getClientId(); diff --git a/src/components/com_tjcertificate/site/views/certificates/tmpl/my.php b/src/components/com_tjcertificate/site/views/certificates/tmpl/my.php index 99e969b9..fcd6a227 100644 --- a/src/components/com_tjcertificate/site/views/certificates/tmpl/my.php +++ b/src/components/com_tjcertificate/site/views/certificates/tmpl/my.php @@ -57,7 +57,7 @@ - + @@ -105,7 +105,7 @@ ?> - title; ?> + title ? $data[0]->title : "-"; ?> issued_on, Text::_('DATE_FORMAT_LC')); ?>