<!--
 Licensed to the Apache Software Foundation (ASF) under one   *
 or more contributor license agreements.  See the NOTICE file *
 distributed with this work for additional information        *
 regarding copyright ownership.  The ASF licenses this file   *
 to you under the Apache License, Version 2.0 (the            *
 "License"); you may not use this file except in compliance   *
 with the License.  You may obtain a copy of the License at   *
                                                              *
   http://www.apache.org/licenses/LICENSE-2.0                 *
                                                              *
 Unless required by applicable law or agreed to in writing,   *
 software distributed under the License is distributed on an  *
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
 KIND, either express or implied.  See the License for the    *
 specific language governing permissions and limitations      *
 under the License.                                           *
-->
<lift:surround with="base" at="left">    
  <lift:conv_info>
    <div id="back-header">  
      <h1>
        <lift:loc>ui_default_conversation</lift:loc>        
        <span id="following"><conv:followButton/></span>                                
      </h1>
      <lift:embed what="templates-hidden/message_update_box"/>     
      <script> 
        setReplyTo(<conv:conversationId/>,"...",<conv:messagePool/>,"");
      </script>
  	</div>                                                 
  	<div class="container-aux">                                              
      <lift:conv_info>           
        <conv:cometTimeline />        
      </lift:conv_info>   
    </div>   
  </lift:conv_info>
</lift:surround>


	
