Source for file read_body.php
Documentation is available at read_body.php
* This file is used for reading the msgs array and displaying
* the resulting emails in the right frame.
* @copyright © 1999-2006 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id: read_body.php,v 1.386 2006/10/06 21:58:17 stevetruckstuff Exp $
* Include the SquirrelMail initialization file.
require
('../include/init.php');
/* SquirrelMail required files. */
require_once(SM_PATH .
'functions/imap.php');
require_once(SM_PATH .
'functions/imap_asearch.php'); // => move to mailbox_display
require_once(SM_PATH .
'functions/mime.php');
require_once(SM_PATH .
'functions/date.php');
require_once(SM_PATH .
'functions/url_parser.php');
require_once(SM_PATH .
'functions/identity.php');
require_once(SM_PATH .
'functions/mailbox_display.php');
require_once(SM_PATH .
'functions/forms.php');
require_once(SM_PATH .
'functions/attachment_common.php');
* Given an IMAP message id number, this will look it up in the cached
* and sorted msgs array and return the index of the next message
* @param int $passed_id The current message UID
* @return the index of the next valid message from the array
if ($passed_id==
'backwards' ||
!is_array($uidset)) { // check for backwards compattibilty gpg plugin
* Given an IMAP message id number, this will look it up in the cached
* and sorted msgs array and return the index of the previous message
* @param int $passed_id The current message UID
* @return the index of the next valid message from the array
global $base_uri, $show_html_default;
if ($message->header->type0 ==
'message' &&
$message->header->type1 ==
'rfc822') {
$type0 =
$message->rfc822_header->content_type->type0;
$type1 =
$message->rfc822_header->content_type->type1;
$type0 =
$message->header->type0;
$type1 =
$message->header->type1;
if($type0 ==
'multipart' &&
($type1 ==
'alternative' ||
$type1 ==
'mixed' ||
$type1 ==
'related' ||
$type1==
'signed')) {
if ($message->findDisplayEntity(array(), array('text/html'), true)) {
* Normal single part message so check its type.
if($type0 ==
'text' &&
$type1 ==
'html') {
$vars =
array('passed_ent_id', 'show_more', 'show_more_cc', 'override_type0', 'override_type1', 'startMessage','where', 'what');
$new_link =
$base_uri .
'src/read_body.php?passed_id=' .
urlencode($passed_id) .
'&passed_ent_id=' .
urlencode($passed_ent_id) .
$new_link .=
'&' .
$var .
'=' .
urlencode($temp);
if($show_html_default ==
1) {
$new_link .=
'&show_html_default=0';
$new_link .=
'&show_html_default=1';
/* escaping $ doesn't work -> \x36 */
return ( in_array('$mdnsent',$aFlags,true) ||
function SendMDN ( $mailbox, $passed_id, $sender, $message, $imapConnection) {
$header =
$message->rfc822_header;
$content_type->properties['report-type']=
'disposition-notification';
$content_type->properties['charset']=
$default_charset;
$rfc822_header->content_type =
$content_type;
$rfc822_header->to[] =
$header->dnt;
$rfc822_header->subject =
_("Read:") .
' ' .
encodeHeader($header->subject);
// Patch #793504 Return Receipt Failing with <@> from Tim Craig (burny_md)
// This merely comes from compose.php and only happens when there is no
// email_addr specified in user's identity (which is the startup config)
if (ereg("^([^@%/]+)[@%/](.+)$", $username, $usernamedata)) {
$popuser =
$usernamedata[1];
$domain =
$usernamedata[2];
if(!isset
($identity)) $identity =
0;
$full_name =
$ident[$identity]['full_name'];
$from_mail =
$ident[$identity]['email_address'];
$from_addr =
'"'.
$full_name.
'" <'.
$from_mail.
'>';
$reply_to =
$ident[$identity]['reply_to'];
$from_mail =
"$popuser@$domain";
$rfc822_header->from =
$rfc822_header->parseAddress($from_addr,true);
$rfc822_header->reply_to =
$rfc822_header->parseAddress($reply_to,true);
foreach ($to_array as $line) {
$to .=
' '.
$line->getAddress();
$body =
_("Your message") .
"\r\n\r\n" .
"\t" .
_("Subject") .
': ' .
decodeHeader($header->subject,false,false) .
"\r\n" .
"\t" .
_("Sent") .
': ' .
$senton .
"\r\n" .
sprintf( _("Was displayed on %s"), $now );
if (isset
($languages[$squirrelmail_language]['XTRA_CODE']) &&
function_exists($languages[$squirrelmail_language]['XTRA_CODE'] .
'_encode')) {
$body =
call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] .
'_encode', $body);
if (strtolower($default_charset) ==
'iso-2022-jp') {
if (mb_detect_encoding($body) ==
'ASCII') {
$special_encoding =
'8bit';
$body =
mb_convert_encoding($body, 'JIS');
$special_encoding =
'7bit';
$special_encoding =
'8bit';
$mime_header->type0 =
'text';
$mime_header->type1 =
'plain';
$mime_header->encoding =
$special_encoding;
$mime_header->encoding =
'us-ascii';
$mime_header->parameters['charset'] =
$default_charset;
$part1->mime_header =
$mime_header;
$original_recipient =
$to;
$original_message_id =
$header->message_id;
$report =
"Reporting-UA : $SERVER_NAME ; SquirrelMail (version $version) \r\n";
if ($original_recipient !=
'') {
$report .=
"Original-Recipient : $original_recipient\r\n";
$final_recipient =
$sender;
$report .=
"Final-Recipient: rfc822; $final_recipient\r\n" .
"Original-Message-ID : $original_message_id\r\n" .
"Disposition: manual-action/MDN-sent-manually; displayed\r\n";
$part2->setBody($report);
$mime_header->type0 =
'message';
$mime_header->type1 =
'disposition-notification';
$mime_header->encoding =
'us-ascii';
$part2->mime_header =
$mime_header;
$composeMessage->rfc822_header =
$rfc822_header;
$composeMessage->addEntity($part1);
$composeMessage->addEntity($part2);
require_once(SM_PATH .
'class/deliver/Deliver_SendMail.class.php');
// Check for outdated configuration
if (!isset
($sendmail_args)) {
if ($sendmail_path==
'/var/qmail/bin/qmail-inject') {
$sendmail_args =
'-i -t';
$stream =
$deliver->initStream($composeMessage,$sendmail_path);
require_once(SM_PATH .
'class/deliver/Deliver_SMTP.class.php');
$authPop =
(isset
($pop_before_smtp) &&
$pop_before_smtp) ?
true :
false;
$stream =
$deliver->initStream($composeMessage,$domain,0,
$smtpServerAddress, $smtpPort, $user, $pass, $authPop);
$length =
$deliver->mail($composeMessage, $stream);
$success =
$deliver->finalizeStream($stream);
$msg =
$deliver->dlv_msg;
if (! empty($deliver->dlv_server_msg)) {
_("Server replied:") .
' ' .
$deliver->dlv_ret_nr .
' ' .
require_once(SM_PATH .
'class/deliver/Deliver_IMAP.class.php');
$imap_deliver->mail($composeMessage, $imapConnection);
function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
$cmd =
'STORE ' .
$passed_id .
' ' .
$sg .
'FLAGS ($MDNSent)';
global $show_more_cc, $show_more, $show_more_bcc,
if ((is_array($recipients)) &&
(isset
($recipients[0]))) {
} else if ($item ==
'cc') {
} else if ($item ==
'bcc') {
foreach ($recipients as $r) {
$oTemplate->assign('which_field', $item);
$oTemplate->assign('recipients', $a);
$oTemplate->assign('more_less_toggle_href', $url);
$oTemplate->assign('show_more', $show);
$string =
$oTemplate->fetch('read_recipient_list.tpl');
$show_xmailer_default, $mdn_user_support, $PHP_SELF, $javascript_on,
$squirrelmail_language, $oTemplate;
$mailbox =
$aMailbox['NAME'];
$header =
$message->rfc822_header;
$from_name =
$header->getAddr_s('from');
$from_name =
$header->getAddr_s('sender');
$env[_("From")] =
_("Unknown sender");
if ($default_use_priority) {
$oTemplate->assign('message_priority', $header->priority);
$env[_("Priority")] =
$oTemplate->fetch('read_message_priority.tpl');
if ($show_xmailer_default) {
$oTemplate->assign('xmailer', decodeHeader($header->xmailer));
$env[_("Mailer")] =
$oTemplate->fetch('read_xmailer.tpl');
$mdn_url =
set_url_var($PHP_SELF, 'passed_id', $passed_id);
$mdn_url =
set_url_var($PHP_SELF, 'passed_ent_id', $passed_ent_id);
$oTemplate->assign('read_receipt_sent', $message->is_mdnsent);
$oTemplate->assign('first_time_reading', $FirstTimeSee);
$oTemplate->assign('send_receipt_href', $mdn_url);
$env[_("Read Receipt")] =
$oTemplate->fetch('read_handle_receipt.tpl');
$env[_("Options")] =
formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
$oTemplate->assign('headers_to_display', $env);
$oTemplate->display('read_headers.tpl');
* @param string $mailbox Name of current mailbox
* @param int $passed_id UID of current message
* @param int $passed_ent_id Id of entity within message
* @param object $message Current message object
* @param object $mbx_response
function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top =
TRUE) {
global $base_uri, $draft_folder, $where, $what, $sort,
$startMessage, $PHP_SELF, $save_as_draft,
$enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
$delete_prev_next_display, $show_copy_buttons,
$compose_new_win, $javascript_on, $compose_width, $compose_height,
//FIXME cleanup argument list, use $aMailbox where possible
$mailbox =
$aMailbox['NAME'];
$msgs_url =
$base_uri .
'src/';
// Create Prev & Next links
// Handle nested entities first (i.e. Mime Attach parts)
$prev_href =
$next_href =
$up_href =
$del_href =
$del_prev_href =
$del_next_href =
'';
$msg_list_href =
$search_href =
$view_msg_href =
'';
if (isset
($passed_ent_id) &&
$passed_ent_id) {
// code for navigating through attached message/rfc822 messages
foreach($message->parent->entities as $ent) {
if ($ent->type0 ==
'message' &&
$ent->type1 ==
'rfc822') {
$entity_count[$c] =
$ent->entity_id;
$entities[$ent->entity_id] =
$c;
if(isset
($entities[$passed_ent_id]) &&
$entities[$passed_ent_id] >
1) {
$prev_ent_id =
$entity_count[$entities[$passed_ent_id] -
1];
$prev_href =
set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
if(isset
($entities[$passed_ent_id]) &&
$entities[$passed_ent_id] <
$c) {
$next_ent_id =
$entity_count[$entities[$passed_ent_id] +
1];
$next_href =
set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
$par_ent_id =
$message->parent->entity_id;
$par_ent_id =
substr($par_ent_id,0,-
2);
if ( $par_ent_id !=
0 ) {
$up_href =
set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
// Prev/Next links for regular messages
} else if ( true ) { //!(isset($where) && isset($what)) ) {
$prev_href =
$base_uri .
'src/read_body.php?passed_id='.
$prev.
'&mailbox='.
$urlMailbox.
'&sort='.
$sort.
"&where=$where&what=$what" .
'&startMessage='.
$startMessage.
'&show_more=0';
$next_href =
$base_uri .
'src/read_body.php?passed_id='.
$next.
'&mailbox='.
$urlMailbox.
'&sort='.
$sort.
"&where=$where&what=$what" .
'&startMessage='.
$startMessage.
'&show_more=0';
// Only bother with Delete & Prev and Delete & Next IF
// top display is enabled.
if ( $delete_prev_next_display ==
1 &&
in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
$del_prev_href =
$base_uri .
'src/read_body.php?passed_id='.
$prev.
'&mailbox='.
$urlMailbox.
'&sort='.
$sort.
'&startMessage='.
$startMessage.
'&show_more=0'.
"&where=$where&what=$what" .
'&delete_id='.
$passed_id;
$del_next_href =
$base_uri .
'src/read_body.php?passed_id='.
$next.
'&mailbox='.
$urlMailbox.
'&sort='.
$sort.
'&startMessage='.
$startMessage.
'&show_more=0'.
"&where=$where&what=$what" .
'&delete_id='.
$passed_id;
// Start with Search Results or Message List link.
$list_xtra =
"?where=read_body.php&what=$what&mailbox=" .
$urlMailbox.
"&startMessage=$startMessage";
$msg_list_href =
$base_uri .
'src/right_main.php'.
$list_xtra;
$search_href =
$where==
'search.php' ?
$base_uri .
'src/search.php?'.
$list_xtra :
'';
$comp_uri =
$base_uri.
'src/compose.php' .
'?passed_id=' .
$passed_id .
'&mailbox=' .
$urlMailbox .
'&startMessage=' .
$startMessage .
(isset
($passed_ent_id) ?
'&passed_ent_id='.
$passed_ent_id :
'');
// Start form for reply/reply all/forward..
$method=
'method="post" ';
if ($compose_new_win ==
'1') {
if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
$on_click=
' onclick="comp_in_new_form(\''.
$comp_uri.
'\', this, this.form,'.
$compose_width .
',' .
$compose_height .
')"';
$comp_uri =
'javascript:void(0)';
$onsubmit =
'onsubmit="return false" ';
$target =
'target="_blank"';
$oTemplate->assign('nav_on_top', $nav_on_top);
$oTemplate->assign('prev_href', $prev_href);
$oTemplate->assign('up_href', $up_href);
$oTemplate->assign('next_href', $next_href);
$oTemplate->assign('del_prev_href', $del_prev_href);
$oTemplate->assign('del_next_href', $del_next_href);
$oTemplate->assign('view_msg_href', $view_msg_href);
$oTemplate->assign('message_list_href', $msg_list_href);
$oTemplate->assign('search_href', $search_href);
$oTemplate->assign('form_extra', $method .
$target .
$onsubmit);
$oTemplate->assign('compose_href', $comp_uri);
$oTemplate->assign('button_onclick', $on_click);
$oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment==
1);
// If Draft folder - create Resume link
$resume_draft =
$edit_as_new =
false;
if (($mailbox ==
$draft_folder) &&
($save_as_draft)) {
$resume_draft =
true; 'smaction_draft';
$oTemplate->assign('can_resume_draft', $resume_draft);
$oTemplate->assign('can_edit_as_new', $edit_as_new);
if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
$delete_url =
$base_uri .
"src/$where";
$oTemplate->assign('can_be_deleted', true);
$oTemplate->assign('move_delete_form_action', $base_uri.
'src/'.
$where);
$oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME']).
"\n" .
addHidden('startMessage', $startMessage).
"\n" );
if (!(isset
($passed_ent_id) &&
$passed_ent_id)) {
$oTemplate->assign('can_be_moved', true);
$oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME']).
"\n" .
$oTemplate->assign('last_move_target', isset
($lastTargetMailbox) &&
!empty($lastTargetMailbox) ?
$lastTargetMailbox :
'');
$oTemplate->assign('can_be_copied', $show_copy_buttons==
1);
$oTemplate->assign('can_be_moved', false);
$oTemplate->assign('move_form_extra', '');
$oTemplate->assign('last_move_target', '');
$oTemplate->assign('can_be_copied', false);
$oTemplate->assign('can_be_deleted', false);
$oTemplate->assign('move_delete_form_action', '');
$oTemplate->assign('delete_form_extra', '');
$oTemplate->assign('can_be_moved', false);
$oTemplate->assign('move_form_extra', '');
$oTemplate->assign('last_move_target', '');
$oTemplate->assign('can_be_copied', false);
$oTemplate->display('read_menubar_nav.tpl');
$oTemplate->display('read_menubar_buttons.tpl');
$oTemplate->display('read_menubar_buttons.tpl');
$oTemplate->display('read_menubar_nav.tpl');
function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
global $base_uri, $where, $what, $show_html_default,
$oTemplate, $javascript_on, $download_href,
$unsafe_image_toggle_href, $unsafe_image_toggle_text;
$urlPassed_ent_id =
urlencode($passed_ent_id);
$query_string =
'mailbox=' .
$urlMailbox .
'&passed_id=' .
$urlPassed_id .
'&passed_ent_id=' .
$urlPassed_ent_id;
$query_string .=
'&where=' .
urlencode($where);
$query_string .=
'&what=' .
urlencode($what);
$url =
$base_uri.
'src/view_header.php?'.
$query_string;
// Build the printer friend link
$view_unsafe_images =
false;
$view_unsafe_images =
true;
$pf_params =
'?passed_ent_id=' .
$urlPassed_ent_id .
'&mailbox=' .
$urlMailbox .
'&passed_id=' .
$urlPassed_id .
'&view_unsafe_images='. (bool)
$view_unsafe_images .
'&show_html_default=' .
$show_html_default;
'Text' =>
_("View Full Header")
'Text' =>
_("View Printable Version")
'Text' =>
_("Download this is a file")
'Text' =>
$show_html_default==
1 ?
_("View as plain text") :
_("View as HTML")
if (!empty($unsafe_image_toggle_href)) {
'URL' =>
$unsafe_image_toggle_href,
'Text' =>
$unsafe_image_toggle_text
do_hook('read_body_header_right', $links);
$oTemplate->assign('links', $links);
return $oTemplate->fetch('read_toolbar.tpl');
/***************************/
/* Main of read_body.php */
/***************************/
/* get the globals we may need */
$oErrorHandler->AssignDelayedErrors($delayed_errors);
$where =
'right_main.php';
* Used as entry key to the list of uid's cached in the mailbox cache
* we use the cached uid's to get the next and prev message.
$show_more = (int)
$temp;
$show_more_cc = (int)
$temp;
$show_more_bcc = (int)
$temp;
$passed_id = (int)
$temp;
$startMessage = (int)
$temp;
$show_html_default = (int)
$temp;
$view_unsafe_images = (int)
$temp;
if($view_unsafe_images ==
1) {
global $sqimap_capabilities, $lastTargetMailbox;
$imapConnection =
sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
$aMailbox =
sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' =>
$what, 'offset' =>
$startMessage),array());
Start code to set the columns to fetch in case of hitting the next/prev link
The reason for this is the fact that the cache can be invalidated which means that the headers
to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
* Replace From => To in case it concerns a draft or sent folder
if (($mailbox ==
$sent_folder ||
$mailbox ==
$draft_folder) &&
$aNewOrder =
array(); // nice var name ;)
foreach($index_order as $iCol) {
$aColumns[$iCol] =
array();
foreach ($index_order as $iCol) {
$aColumns[$iCol] =
array();
'columns' =>
$aColumns, // columns bound settings
'highlight_list' =>
$message_highlight_list, // row highlighting rules
'trash_folder' =>
$trash_folder,
'sent_folder' =>
$sent_folder,
'draft_folder' =>
$draft_folder));
End code to set the columns to fetch in case of hitting the next/prev link
* Check if cache is still valid, $what contains the key
* which gives us acces to the array with uid's. At this moment
* 0 is used for a normal message list and search uses 1 as key. This can be
* changed / extended in the future.
* If on a select of a mailbox we detect that the cache should be invalidated due to
* the delete of messages or due to new messages we empty the list with uid's and
* that's what we detect below.
if (!is_array($aMailbox['UIDSET'][$what])) {
$iSetIndex =
$aMailbox['SETINDEX'];
$aMailbox['CURRENT_MSG'][$iSetIndex] =
$passed_id;
* and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
if (isset
($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
$aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] =
true;
* Process Delete from delete-move-next
* but only if delete_id was set
* $message contains all information about the message
* including header and body
if (isset
($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
$message =
$aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
$FirstTimeSee =
!$message->is_seen;
$FirstTimeSee =
!$message->is_seen;
$message->is_seen =
true;
$aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] =
$message;
if (isset
($passed_ent_id) &&
$passed_ent_id) {
$message =
$message->getEntity($passed_ent_id);
if ($message->type0 !=
'message' &&
$message->type1 !=
'rfc822') {
$message =
$message->parent;
$read =
sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
$rfc822_header->parseHeader($read);
$message->rfc822_header =
$rfc822_header;
} else if ($message->type0 ==
'message' &&
$message->type1 ==
'rfc822' && isset
($message->entities[0])) {
$read =
sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
$rfc822_header->parseHeader($read);
$message->rfc822_header =
$rfc822_header;
/****************************************/
/* Block for handling incoming url vars */
/****************************************/
if (isset
($sendreceipt)) {
if ( !$message->is_mdnsent ) {
if ((isset
($identity)) &&
($identity !=
0)) //Main identity
$final_recipient =
trim(getPref($data_dir, $username, 'email_address' .
$identity, '' ));
if ($final_recipient ==
'' )
$final_recipient =
trim(getPref($data_dir, $username, 'email_address', '' ));
if ( SendMDN( $mailbox, $passed_id, $final_recipient, $message, $imapConnection ) >
0 &&
$supportMDN ) {
$message->is_mdnsent =
true;
$aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] =
$message;
/***********************************************/
/* End of block for handling incoming url vars */
/***********************************************/
if ($show_html_default ==
1) {
$ent_ar =
$message->findDisplayEntity(array());
$ent_ar =
$message->findDisplayEntity(array(), array('text/plain'));
for ($i =
0; $i <
$cnt; $i++
) {
$messagebody .=
formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
$messagebody .=
'<hr />';
* Write mailbox with updated seen flag information back to cache.
$mailbox_cache[$iAccount.
'_'.
$aMailbox['NAME']] =
$aMailbox;
$_SESSION['mailbox_cache'] =
$mailbox_cache;
formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
$oTemplate->assign('message_body', $messagebody);
$oTemplate->display('read_message_body.tpl');
/* show attached images inline -- if pref'fed so */
if ($attachment_common_show_images &&
is_array($attachment_common_show_images_list)) {
foreach ($attachment_common_show_images_list as $img) {
$imgurl =
SM_PATH .
'src/download.php' .
'passed_id=' .
urlencode($img['passed_id']) .
$a['Name'] =
$img['name'];
$a['DisplayURL'] =
$imgurl;
$a['DownloadURL'] =
$img['download_href'];
$oTemplate->assign('images', $images);
$oTemplate->display('read_display_images_inline.tpl');
formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
$oTemplate->display('footer.tpl');
Documentation generated on Sat, 07 Oct 2006 16:13:14 +0300 by phpDocumentor 1.3.0RC6