made a copy
[atutor.git] / themes / fluid / include / header.tmpl.php
1 <?php
2 /************************************************************************/
3 /* ATutor                                                                                                                               */
4 /************************************************************************/
5 /* Copyright (c) 2002-2008 by Greg Gay, Joel Kronenberg & Heidi Hazelton*/
6 /* Adaptive Technology Resource Centre / University of Toronto                  */
7 /* http://atutor.ca                                                                                                             */
8 /*                                                                                                                                              */
9 /* This program is free software. You can redistribute it and/or                */
10 /* modify it under the terms of the GNU General Public License                  */
11 /* as published by the Free Software Foundation.                                                */
12 /************************************************************************/
13 // $Id: header.tmpl.php 3825 2005-03-11 15:35:51 joel $
14 if (!defined('AT_INCLUDE_PATH')) { exit; }
15 /* available header.tmpl.php variables:
16  * $this->lang_code                     the ISO language code
17  * SITE_NAME                            the site name from the config file
18  * $this->page_title            the name of this page to use in the <title>
19  * $this->lang_charset          the ISO language character set
20  * $this->content_base_href     the <base href> to use for this page
21  * $this->base_path                     the absolute path to this atutor installation
22  * $this->rtl_css                       if set, the path to the RTL style sheet
23  * $this->icon                  the path to a course icon
24  * $this->banner_style          -deprecated-
25  * $this->theme                         the directory name of the current theme
26  * $this->base_href                     the full url to this atutor installation
27  * $this->onload                        javascript onload() calls
28  * $this->img                           the absolute path to this theme's images/ directory
29  * $this->sequence_links        associative array of 'previous', 'next', and/or 'resume' links
30  * $this->path                          associative array of path to this page: aka bread crumbs
31  * $this->rel_url                       the relative url from the installation root to this page
32  * $this->nav_courses           associative array of this user's enrolled courses
33  * $this->section_title         the title of this section (course, public, admin, my start page)
34  * $this->top_level_pages       associative array of the top level navigation
35  * $this->current_top_level_page        the full path to the current top level page with file name
36  * $this->sub_level_pages                       associate array of sub level navigation
37  * $this->back_to_page                          if set, the path and file name to the part of this page (if parent is not a top level nav)
38  * $this->current_sub_level_page        the full path to the current sub level page with file name
39  * $this->guide                         the full path and file name to the guide page
40  * ======================================
41  * top_level_pages           array(array('url', 'title'))     the top level pages. ATutor default creates tabs.
42  * section_title             string                           the name of the current section. either name of the course, administration, my start page, etc.
43  * page_title                string                           the title of the current page.
44  * path                      array(array('url', 'title'))     the path to the current page.
45  * back_to_page              array('url', 'title')            the link back to the part of the current page, if needed.
46  * current_top_level_page    string                           full url to the current top level page in "top_leve_pages"
47  * current_sub_level_page    string                           full url to the current sub level page in the "sub_level_pages"
48  * sub_level_pages           array(array('url', 'title'))     the sub level pages.
49  */
50
51 // will have to be moved to the header.inc.php
52 global $system_courses, $_custom_css, $db, $_base_path;
53
54 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
55
56 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="<?php echo $this->lang_code; ?>"> 
57
58 <head>
59         <title><?php echo SITE_NAME; ?> : <?php echo $this->page_title; ?></title>
60         <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $this->lang_charset; ?>" />
61         <meta name="Generator" content="ATutor - Copyright 2005 by http://atutor.ca" />
62         <base href="<?php echo $this->content_base_href; ?>" />
63         <link rel="shortcut icon" href="<?php echo $this->base_path; ?>favicon.ico" type="image/x-icon" />
64         <link rel="stylesheet" href="<?php echo $this->base_path.'themes/'.$this->theme; ?>/print.css" type="text/css" media="print" />
65         <link rel="stylesheet" href="<?php echo $this->base_path.'themes/'.$this->theme; ?>/styles.css" type="text/css" />
66         <!--[if IE]>
67           <link rel="stylesheet" href="<?php echo $this->base_path.'themes/'.$this->theme; ?>/ie_styles.css" type="text/css" />
68         <![endif]-->
69         <link rel="stylesheet" href="<?php echo $this->base_path.'themes/'.$this->theme; ?>/forms.css" type="text/css" />
70         <link rel="stylesheet" type="text/css" href="<?php echo $this->base_path; ?>infusion/framework/fss/css/fss-layout.css" />
71         <link rel="stylesheet" type="text/css" href="<?php echo $this->base_path; ?>infusion/components/reorderer/Reorderer.css" />
72         <?php echo $this->rtl_css; ?>
73         <?php if ($system_courses[$this->course_id]['rss']): ?>
74         <link rel="alternate" type="application/rss+xml" title="<?php echo SITE_NAME; ?> - RSS 2.0" href="<?php echo $this->base_href; ?>get_rss.php?<?php echo $this->course_id; ?>-2" />
75         <link rel="alternate" type="application/rss+xml" title="<?php echo SITE_NAME; ?> - RSS 1.0" href="<?php echo $this->base_href; ?>get_rss.php?<?php echo $this->course_id; ?>-1" />
76         <?php endif; ?>
77         <script type="text/javascript" src="<?php echo $this->base_path; ?>jscripts/infusion/InfusionAll.js"></script>
78         <script src="<?php echo $this->base_path; ?>jscripts/infusion/jquery.autoHeight.js" type="text/javascript"></script>
79         <?php echo $this->custom_css; ?>
80 </head>
81
82 <body onload="<?php echo $this->onload; ?>">
83
84 <script language="javascript" type="text/javascript">
85 //<!--
86 jQuery(document).ready(function () {
87         // only specific list items are sortable
88         var reorder_example_list = fluid.reorderList('#contentwrapper', {
89                 selectors : {
90                         movables : '.orderable',
91                         selectables: '.orderable',
92                         dropTargets: '.orderable',
93                         grabHandle: '.grab'
94                 },
95                 orientation: fluid.orientation.HORIZONTAL,
96             listeners: {
97                         afterMove: function (item, requestedPosition, movables) {
98                                 //save the state to the db
99                                 var myDivs = jQuery ("div[class^=orderable]", "#contentwrapper");
100                                 jQuery.post("<?php echo AT_BASE_HREF; ?>themes/fluid/save_state.php", { 'left':myDivs[0].id }, function(data) {});     
101                 }
102             }
103         });
104 });
105
106 var newwindow;
107 function poptastic(url) {
108         newwindow=window.open(url,'popup','height=600,width=600,scrollbars=yes,resizable=yes');
109         if (window.focus) {newwindow.focus()}
110 }
111
112 function getexpirydate(nodays){
113         var UTCstring;
114         Today = new Date();
115         nomilli=Date.parse(Today);
116         Today.setTime(nomilli+nodays*24*60*60*1000);
117         UTCstring = Today.toUTCString();
118         return UTCstring;
119 }
120
121 function setcookie(name,value,duration){
122         cookiestring=name+"="+escape(value)+";path=/;expires="+getexpirydate(duration);
123         document.cookie=cookiestring;
124         if(!getcookie(name)){
125                 return false;
126         } else {
127                 return true;
128         }
129 }
130
131 function getcookie(cookiename) {
132         var cookiestring=""+document.cookie;
133         var index1=cookiestring.indexOf(cookiename);
134         if (index1==-1 || cookiename=="") return ""; 
135         var index2=cookiestring.indexOf(';',index1);
136         if (index2==-1) index2=cookiestring.length; 
137         return unescape(cookiestring.substring(index1+cookiename.length+1,index2));
138 }
139
140 function setDisplay(objId) {
141         var toc = document.getElementById(objId);
142
143         var state = getcookie(objId);
144         if (document.getElementById(objId) && state && (state == 'none')) {
145                 toggleToc(objId);
146         }
147 }
148
149
150 function setstates() {
151         return;
152         var objId = "side-menu";
153         var state = getcookie(objId);
154         if (document.getElementById(objId) && state && (state == 'none')) {
155                 toggleToc(objId);
156         }
157
158         var objId = "toccontent";
159         var state = getcookie(objId);
160         if (document.getElementById(objId) && state && (state == 'none')) {
161                 toggleToc(objId);
162         }
163
164 }
165
166 function showTocToggle(objId, show, hide, key, selected) {
167         if(document.getElementById) {
168                 if (key) {
169                         var accesskey = " accesskey='" + key + "' title='"+ show + "/" + hide + " Alt - "+ key +"'";
170                 } else {
171                         var accesskey = "";
172                 }
173
174                 if (selected == 'hide') {
175                         document.writeln('<a href="javascript:toggleToc(\'' + objId + '\')" ' + accesskey + '>' +
176                         '<span id="' + objId + 'showlink" style="display:none;">' + show + '</span>' +
177                         '<span id="' + objId + 'hidelink">' + hide + '</span>'  + '</a>');
178                 } else {
179                         document.writeln('<a href="javascript:toggleToc(\'' + objId + '\')" ' + accesskey + '>' +
180                         '<span id="' + objId + 'showlink">' + show + '</span>' +
181                         '<span id="' + objId + 'hidelink" style="display:none;">' + hide + '</span>'    + '</a>');
182                 }
183         }
184 }
185
186 function toggleToc(objId) {
187         var toc = document.getElementById(objId);
188         if (toc == null) {
189                 return;
190         }
191         var showlink=document.getElementById(objId + 'showlink');
192         var hidelink=document.getElementById(objId + 'hidelink');
193         if (hidelink.style.display == 'none') {
194                 document.getElementById('contentcolumn').id="contentcolumn_shiftright";
195                 toc.style.display = '';
196                 hidelink.style.display='';
197                 showlink.style.display='none';
198         } else {
199                 document.getElementById('contentcolumn_shiftright').id="contentcolumn";
200                 toc.style.display = 'none';
201                 hidelink.style.display='none';
202                 showlink.style.display='';
203         }
204         setcookie(objId, toc.style.display, 1);
205 }
206
207 function getcookie(cookiename) {
208         var cookiestring=""+document.cookie;
209         var index1=cookiestring.indexOf(cookiename);
210         if (index1==-1 || cookiename=="") return ""; 
211         var index2=cookiestring.indexOf(';',index1);
212         if (index2==-1) index2=cookiestring.length; 
213         return unescape(cookiestring.substring(index1+cookiename.length+1,index2));
214 }
215
216 //toggle content folder in side menu "content navigation"
217 function toggleFolder(cid)
218 {
219         if (jQuery("#tree_icon"+cid).attr("src") == tree_collapse_icon) {
220                 jQuery("#tree_icon"+cid).attr("src", tree_expand_icon);
221                 jQuery("#tree_icon"+cid).attr("alt", "<?php echo _AT('expand'); ?>");
222                 setcookie("c<?php echo $this->course_id;?>_"+cid, null, 1);
223         }
224         else {
225                 jQuery("#tree_icon"+cid).attr("src", tree_collapse_icon);
226                 jQuery("#tree_icon"+cid).attr("alt", "<?php echo _AT('collapse'); ?>");
227                 setcookie("c<?php echo $this->course_id;?>_"+cid, "1", 1);
228         }
229         
230         jQuery("#folder"+cid).slideToggle();
231 }
232
233 // toggle elements in side menu
234 function elementToggle(elem, title)
235 {
236         element_collapse_icon = "<?php echo $_base_path; ?>images/mswitch_minus.gif";
237         element_expand_icon = "<?php echo $_base_path; ?>images/mswitch_plus.gif";
238         
239         if (jQuery(elem).attr("src") == element_collapse_icon) {
240                 jQuery(elem).attr("src", element_expand_icon);
241                 jQuery(elem).attr("alt", "<?php echo _AT('show'). ' '; ?>"+ title);
242                 jQuery(elem).attr("title", "<?php echo _AT('show'). ' '; ?>"+ title);
243                 setcookie("m_"+title, 0, 1);
244         }
245         else {
246                 jQuery(elem).attr("src", element_collapse_icon);
247                 jQuery(elem).attr("alt", "<?php echo _AT('collapse'); ?>");
248                 jQuery(elem).attr("alt", "<?php echo _AT('hide'). ' '; ?>"+ title);
249                 jQuery(elem).attr("title", "<?php echo _AT('hide'). ' '; ?>"+ title);
250                 setcookie("m_"+title, null, 1);;
251         }
252         
253         jQuery(elem).parent().next().slideToggle();
254 }
255
256 function printSubmenuHeader(title)
257 {
258         if (getcookie("m_"+title) == "0")
259         {
260                 image = "<?php echo $_base_path?>images/mswitch_plus.gif";
261                 alt_text = "<?php echo _AT('show'); ?>" + title;
262         }
263         else
264         {
265                 image = "<?php echo $_base_path?>images/mswitch_minus.gif";
266                 alt_text = "<?php echo _AT('hide'); ?>" + title;
267         }
268         
269         document.writeln('<h4 class="box">'+
270         '       <input src="'+image+'"' + 
271         '              onclick="elementToggle(this, \''+title+'\'); return false;"' +
272         '              alt="'+ alt_text + '" ' +
273         '              title="'+ alt_text + '"' +
274         '              style="float:right" type="image" />'+ title +
275         '</h4>');
276 }
277 //-->
278 </script>
279
280 <div id="top-links"> <!-- top help/search/login links -->
281         <a href="<?php echo htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES); ?>#content" accesskey="c">
282         <img src="<?php echo $this->base_path; ?>images/clr.gif" height="1" width="1" border="0" alt="<?php echo _AT('goto_content'); ?> ALT+c" /></a>          
283
284         <a href="<?php echo htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES); ?>#menu"  accesskey="m"><img src="<?php echo $this->base_path; ?>images/clr.gif" height="1" width="1" border="0" alt="<?php echo _AT('goto_menu'); ?> ALT+m" /></a>
285         <?php if (isset($_SESSION['member_id']) && $_SESSION['member_id']): ?>
286                 <!-- start the jump menu -->
287                 <?php if (empty($_GET)): ?>
288                 <form method="post" action="<?php echo $this->base_path; ?>bounce.php?p=<?php echo urlencode($this->rel_url); ?>" target="_top">
289                 <?php else: ?>
290                         <form method="post" action="<?php echo $this->base_path; ?>bounce.php" target="_top">
291                 <?php endif; ?>
292                 <label for="jumpmenu" accesskey="j"></label>
293                         <select name="course" id="jumpmenu" title="<?php echo _AT('jump'); ?>:  Alt-j">                                                 
294                                 <option value="0"><?php echo _AT('my_start_page'); ?></option>
295                                 <optgroup label="<?php echo _AT('courses_below'); ?>">
296                                         <?php foreach ($this->nav_courses as $this_course_id => $this_course_title): ?>
297                                                 <option value="<?php echo $this_course_id; ?>"><?php echo $this_course_title; ?></option>
298                                         <?php endforeach; ?>
299                                 </optgroup>
300                         </select> <input type="submit" name="jump" value="<?php echo _AT('jump'); ?>" class="button" /> </form>
301                 <!-- /end the jump menu -->
302                 <?php if ($_SESSION['is_super_admin']): ?>
303                         <a href="<?php echo $this->base_path; ?>bounce.php?admin"><?php echo _AT('return_to_admin_area'); ?></a> | 
304                 <?php endif; ?>
305
306                 <?php if ($this->course_id > -1): ?>
307                         <?php if (get_num_new_messages()): ?>
308                                 <a href="<?php echo $this->base_path; ?>inbox/index.php"><?php echo _AT('inbox'); ?> (<?php echo get_num_new_messages(); ?>)</a> 
309                         <?php else: ?>
310                                 <a href="<?php echo $this->base_path; ?>inbox/index.php"><?php echo _AT('inbox'); ?></a>
311                         <?php endif; ?>
312                 <?php endif; ?>
313         <?php endif; ?>
314         <a href="<?php echo $this->base_path; ?>search.php"><?php echo _AT('search'); ?></a> <a href="<?php echo $this->base_path; ?>help/index.php"><?php echo _AT('help'); ?></a>
315 </div>
316
317 <div id="header">
318         <?php
319         // If there is a custom course banner in the file manager called banner.html, display it here
320         @readfile(AT_CONTENT_DIR . $this->course_id.'/banner.txt'); 
321
322         /*
323         and example banner.html file might look like:
324         <div style="width: 760px; height: 42px; background: white;"><img src="http://[mysite]/atutor15rc3/banners/kart-camb.jpg"></div>
325         */
326
327         ?>
328
329         <?php if (!empty($this->icon)) { // if a course icon is available, display it here.  ?>
330                 <a href="<?php echo $this->base_path; ?>index.php"><img src="<?php echo $this->icon; ?>" class="headicon" alt="<?php echo  _AT('home'); ?>" /></a>      
331         <?php } ?>
332
333         <h1 id="section-title">
334                 <?php if ($_SESSION['valid_user']): 
335                         echo '<span style="color:black;font-size:small;font-weight:bold;">'.stripslashes(SITE_NAME).'</span><br />';    
336                 endif; ?>       
337                 <?php echo $this->section_title; ?>
338                 <?php if (($this->course_id > 0) && ($_SESSION['enroll'] == AT_ENROLL_NO)) : ?> 
339                         - <small><a href="<?php echo $this->base_path; ?>enroll.php?course=<?php echo $this->course_id; ?>"><?php echo _AT('enroll_me'); ?></a></small>
340                 <?php endif; ?>
341         </h1>
342         
343         
344 </div>
345
346 <div id="topnavlistcontainer">
347 <!-- the main navigation. in our case, tabs -->
348         <ul id="topnavlist">
349                 <?php foreach ($this->top_level_pages as $page): ?>
350                         <?php ++$accesscounter; $accesscounter = ($accesscounter == 10 ? 0 : $accesscounter); ?>
351                         <?php $accesskey_text = ($accesscounter < 10 ? 'accesskey="'.$accesscounter.'"' : ''); ?>
352                         <?php $accesskey_title = ($accesscounter < 10 ? ' Alt+'.$accesscounter : ''); ?>
353                         <?php if ($page['url'] == $this->current_top_level_page): ?>
354                                 <li><a href="<?php echo $page['url']; ?>" <?php echo $accesskey_text; ?> title="<?php echo $page['title'] . $accesskey_title; ?>" class="active"><?php echo $page['title']; ?></a></li>
355                         <?php else: ?>
356                                 <li><a href="<?php echo $page['url']; ?>" <?php echo $accesskey_text; ?> title="<?php echo $page['title'] . $accesskey_title; ?>"><?php echo $page['title']; ?></a></li>
357                         <?php endif; ?>
358                         <?php $accesscounter = ($accesscounter == 0 ? 11 : $accesscounter); ?>
359                 <?php endforeach; ?>
360         </ul>
361 </div>
362
363 <div id="subnav">
364         <!-- the sub navigation -->
365         <div style="float: right; text-transform: lowercase;">
366                 <?php if ($_SESSION['valid_user']): ?>                                  
367                         <strong><?php echo get_display_name($_SESSION['member_id']); ?></strong> | <a href="<?php echo $this->base_path; ?>logout.php"><?php echo _AT('logout'); ?></a>
368                 <?php else: ?>
369                          <a href="<?php echo $this->base_path; ?>login.php?course=<?php echo $this->course_id; ?>"><?php echo _AT('login'); ?></a> | <a href="<?php echo $this->base_path; ?>registration.php"><?php echo _AT('register'); ?></a>
370                 <?php endif; ?>
371         </div>
372
373         <?php if ($this->sub_level_pages): ?>
374                 <?php if (isset($this->back_to_page)): ?>
375                         <a href="<?php echo $this->back_to_page['url']; ?>" id="back-to"><?php echo _AT('back_to').' '.$this->back_to_page['title']; ?></a> | 
376                 <?php endif; ?>
377
378                 <?php $num_pages = count($this->sub_level_pages); ?>
379                 <?php for ($i=0; $i<$num_pages; $i++): ?>
380                         <?php if ($this->sub_level_pages[$i]['url'] == $this->current_sub_level_page): ?>
381                                 <strong><?php echo $this->sub_level_pages[$i]['title']; ?></strong>
382                         <?php else: ?>
383                                 <a href="<?php echo $this->sub_level_pages[$i]['url']; ?>"><?php echo $this->sub_level_pages[$i]['title']; ?></a>
384                         <?php endif; ?>
385                         <?php if ($i < $num_pages-1): ?>
386                                 |
387                         <?php endif; ?>
388                 <?php endfor; ?>
389         <?php else: ?>
390                 <div id="sub-navigation">
391                         &nbsp;
392                 </div>
393         <?php endif; ?>
394 </div>
395
396 <div id="contentwrapper" class="fluid-horizontal-order">
397         <?php if (($this->course_id > 0) && $system_courses[$this->course_id]['side_menu'] && ($_SESSION['prefs']['PREF_MENU']!="right")): ?>
398         <div id="side-menu" class="orderable" style="display:inline; float:left">
399                 <div class="grab"><img src="<?php echo $this->img; ?>layers.png" alt="<?php echo _AT('drag'); ?>" /></div>
400                 <?php require(AT_INCLUDE_PATH.'side_menu.inc.php'); ?>
401         </div>
402         <?php endif; ?>
403
404         <div class="orderable" style="display:inline; float:left; margin-left: 10px; margin-right: 10px; <?php if (($this->course_id <= 0) && !$this->side_menu) { ?> width:99%; <?php } else { ?> width:76.5%; <?php } ?>">
405         
406                 <div class="grab">
407                         <div><img src="<?php echo $this->img; ?>layers.png" style="float:left;margin:3px;" alt="<?php echo _AT('drag'); ?>" /></div>
408         <?php if ($this->guide && ($_SESSION["prefs"]["PREF_SHOW_GUIDE"] || $_SESSION["course_id"] == "-1")): ?>
409                                 <a href="<?php echo $this->guide; ?>" id="guide" onclick="poptastic('<?php echo $this->guide; ?>'); return false;" target="_new"><em><?php echo $this->page_title; ?></em></a>
410         <?php endif; ?>
411         <?php if ($_SESSION["prefs"]["PREF_SHOW_BREAD_CRUMBS"]) { ?>
412                         <div id="breadcrumbs">
413                                 <?php foreach ($this->path as $page): ?>
414                                         <a href="<?php echo $page['url']; ?>"><?php echo htmlspecialchars($page['title'], ENT_COMPAT, "UTF-8"); ?></a> > 
415                                 <?php endforeach; ?> <?php echo $this->page_title; ?>
416                         </div>
417         <?php } ?>
418                 </div>
419                 
420                 <?php if ($this->course_id > 0): ?>
421                 <a href=""></a>
422                 <div id="sequence-links">
423                 <?php if ($_SESSION["prefs"]["PREF_SHOW_NEXT_PREVIOUS_BUTTONS"]) { ?>
424                         <?php if ($this->sequence_links['resume']): ?>
425                                         <a style="color:white;" href="<?php echo $this->sequence_links['resume']['url']; ?>" accesskey="."><img src="<?php echo $this->img; ?>resume.gif" border="0" title="<?php echo _AT('resume').': '.$this->sequence_links['resume']['title']; ?> Alt+." alt="<?php echo $this->sequence_links['resume']['title']; ?> Alt+." class="img-size-ascdesc" /></a>
426                         <?php else:
427                                 if ($this->sequence_links['previous']): ?>
428                                         <a href="<?php echo $this->sequence_links['previous']['url']; ?>" title="<?php echo _AT('previous_topic').': '. $this->sequence_links['previous']['title']; ?> Alt+," accesskey=","><img src="<?php echo $this->img; ?>previous.gif" border="0" alt="<?php echo _AT('previous_topic').': '. $this->sequence_links['previous']['title']; ?> Alt+," class="img-size-ascdesc" /></a>
429                                 <?php endif;
430                                 if ($this->sequence_links['next']): ?>
431                                         <a href="<?php echo $this->sequence_links['next']['url']; ?>" title="<?php echo _AT('next_topic').': '.$this->sequence_links['next']['title']; ?> Alt+." accesskey="."><img src="<?php echo $this->img; ?>next.gif" border="0" alt="<?php echo _AT('next_topic').': '.$this->sequence_links['next']['title']; ?> Alt+." class="img-size-ascdesc" /></a>
432                                 <?php endif; ?>
433                         <?php endif; ?>
434                 <?php } ?>
435                         &nbsp;
436                 </div>
437                 <?php endif; ?>
438
439         <!-- the page title -->
440         <h2 class="page-title"><?php echo $this->page_title; ?></h2>
441
442         <a name="content"></a>
443         <?php global $msg; $msg->printAll(); ?>