PHPOpenChat PHP Cross Reference Customer Relationship Management

Source: /getlines.php - 444 lines - 21683 bytes - Summary - Text - Print

   1  <?php //-*-php-*-
   2  /*   ********************************************************************   **
   3  **   Copyright notice                                                       **
   4  **                                                                          **
   5  **   (c) 1995-2004 PHPOpenChat Development Team                             **
   6  **   http://phpopenchat.sourceforge.net/                                    **
   7  **                                                                          **
   8  **   All rights reserved                                                    **
   9  **                                                                          **
  10  **   This script is part of the PHPOpenChat project. The PHPOpenChat        **
  11  **   project is free software; you can redistribute it and/or modify        **
  12  **   it under the terms of the GNU General Public License as published by   **
  13  **   the Free Software Foundation; either version 2 of the License, or      **
  14  **   (at your option) any later version.                                    **
  15  **                                                                          **
  16  **   The GNU General Public License can be found at                         **
  17  **   http://www.gnu.org/copyleft/gpl.html.                                  **
  18  **   A copy is found in the textfile GPL and important notices to the       **
  19  **   license from the team is found in the textfile LICENSE distributed     **
  20  **   with these scripts.                                                    **
  21  **                                                                          **
  22  **   This script is distributed in the hope that it will be useful,         **
  23  **   but WITHOUT ANY WARRANTY; without even the implied warranty of         **
  24  **   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          **
  25  **   GNU General Public License for more details.                           **
  26  **                                                                          **
  27  **   This copyright notice MUST APPEAR in all copies of the script!         **
  28  **   ********************************************************************   */
  29  
  30  /*
  31    $Author: letreo $
  32    $Date: 2004/08/26 11:57:24 $
  33    $Source: /cvsroot/phpopenchat/chat3/getlines.php,v $
  34    $Revision: 1.74.2.20 $
  35  */
  36  
  37  //Get default values
  38  require_once ('config.inc.php');
  39  
  40  require_once (POC_INCLUDE_PATH.'/adodb/adodb.inc.php');
  41  require_once (POC_INCLUDE_PATH.'/class.Chatter.inc');
  42  require_once (POC_INCLUDE_PATH.'/class.Chat.inc');
  43  require_once (POC_INCLUDE_PATH.'/class.Recipient.inc');//extents Chatter
  44  require_once (POC_INCLUDE_PATH.'/class.Line.inc');
  45  require_once (POC_INCLUDE_PATH.'/class.Channel.inc');
  46  require_once(POC_INCLUDE_PATH.'/class.Channel_Buffer_'.CHANNEL_BUFFER_TYPE.'.inc');
  47  require_once (POC_INCLUDE_PATH.'/class.Translator.inc');
  48  require_once (POC_INCLUDE_PATH.'/class.Template.inc');
  49  require_once (POC_INCLUDE_PATH.'/class.Mail.inc');
  50  require_once (POC_INCLUDE_PATH.'/class.Mailbox.inc');
  51  
  52  session_start();
  53  if(!isset($_SESSION['chatter']) || !is_object($_SESSION['chatter'])) {
  54    die('Login first!');
  55  }
  56  
  57  if( $_SESSION['chatter']->is_kicked() || $_SESSION['chatter']->is_disabled() ) {
  58    die('
  59    <html><head>
  60      <script type="text/javascript">
  61      if(parent.input && parent.input.document.forms[0]){
  62        //switch off polling
  63        parent.serialize_refresh=0;
  64      
  65        parent.input.document.forms[0].elements[\'line\'].value = parent.input.last_sent_line + \'foo\';
  66        parent.input.document.forms[0].submit();
  67      }
  68      </script>
  69      </head>
  70      <body></body>
  71    </html>
  72    ');
  73  }
  74    
  75  if(( $_SESSION['reload_count'] * LINE_POLLING_INTERVAL ) >= MAX_INACTIVE_ONLINETIME)
  76  {
  77    $lang = $_SESSION['chat']->logout();
  78  
  79    //redirect to the homepage
  80    header('Status: 301');
  81    if( EXIT_URL != '' ) {
  82      header('Location: index.php?forceOnTop=1&jump='. urlencode(EXIT_URL));
  83    } else {
  84      header('Location: index.php?forceOnTop=1&'.session_name().'='.session_id().'&'.$lang);
  85    }
  86    exit;
  87  } else {    
  88    $_SESSION['reload_count']++;
  89    if( ($_SESSION['reload_count'] % 2) == 0 ) //do not refresh every time
  90      $_SESSION['chatter']->refresh();
  91  }
  92  
  93  $alert_recipient = '';
  94  $sound_recipient = '';
  95  $css_line_class  = '';
  96  $js_debug        = '';
  97  $all_lines       = '';
  98  $TEMPLATE_OUT['js_onload']         = '';
  99  $TEMPLATE_OUT['all_chatters']      = '';
 100  $TEMPLATE_OUT['js_update_chatter'] = '';
 101  $login           = false;
 102  
 103  function addSound( $sound ){
 104    if( $_SESSION['chatter']->get_advice() != 'sound' )return'';
 105    
 106    return '
 107      <object classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" height="0" width="0">
 108        <param name="url" value="'.$_SESSION['template']->get_theme_path().'/sounds/'.$sound.'.wav" />
 109        <param name="autostart" value="true" />
 110      </object>
 111      <object data="'.$_SESSION['template']->get_theme_path().'/sounds/'.$sound.'.wav" type="audio/wav" width="0" height="0">
 112        <param name="src" value="'.$_SESSION['template']->get_theme_path().'/sounds/'.$sound.'.wav" />
 113        <param name="autostart" value="true" />
 114      </object>
 115      ';
 116  }
 117  
 118  
 119  if( ( $_SESSION['reload_count'] * LINE_POLLING_INTERVAL ) > (MAX_INACTIVE_ONLINETIME - 10) )
 120    $TEMPLATE_OUT['js_onload'] .= 'parent.autoLogoutNotice();';
 121  
 122  if( isset($_GET['login']) && $_GET['login'] == 1 && !isset($_SESSION['in']))
 123  {
 124    /* mozilla 1.4b uses the source of frameset every time where this page are reloaded, 
 125     * so $_GET['login'] is set everytime 
 126     * Workaround:
 127     */
 128    $login = true;
 129    if(function_exists('session_register')) {
 130      session_register('in');
 131    }
 132    $_SESSION['in'] = '';
 133    
 134    $TEMPLATE_OUT['js_onload'] .= 'parent.scroll_it();parent.currentChannel=\''.$_SESSION['channel']->get_name().'\';';
 135    define('MY_NICK', $_SESSION['chatter']->get_nick());
 136    if(! DISABLE_CONTEXT_MENU_ICONS)
 137    { $img_path = $_SESSION['template']->get_tmpl_web_path();
 138      //define('ADD_ICON','<img src="'.$img_path.'/images/icons/add_chatter.gif" />');
 139      define('NOTICE_ICON','<img src="'.$img_path.'/images/icons/notice.gif" width="16" height="16" />');
 140      define('PRIVATE_CHAT_ICON','<img src="'.$img_path.'/images/icons/private_chat.gif" width="16" height="16" />');
 141      define('SAY_TO_ICON','<img src="'.$img_path.'/images/icons/say_to.gif" width="16" height="16" />');
 142      define('WHISPER_TO_ICON','<img src="'.$img_path.'/images/icons/whisper_to.gif" width="16" height="16" />');
 143      define('USERPAGE_ICON','<img src="'.$img_path.'/images/icons/userpage.gif" width="16" height="16" />');
 144      define('INVITE_ICON','<img src="'.$img_path.'/images/icons/invite_chatter.gif" width="16" height="16" />');
 145      define('DISINVITE_ICON','<img src="'.$img_path.'/images/icons/disinvite_chatter.gif" width="16" height="16" />');
 146      define('IGNORE_CHATTER_ICON','<img src="'.$img_path.'/images/icons/add_ignore_list.gif" width="16" height="16" />');
 147      define('UNIGNORE_CHATTER_ICON','<img src="'.$img_path.'/images/icons/del_ignore_list.gif" width="16" height="16" />');
 148      define('ADD_FRIEND_ICON','<img src="'.$img_path.'/images/icons/add_friend_list.gif" width="16" height="16" />');
 149      define('MAIL_ICON','<img style="border:0" src="'.$img_path.'/images/icons/newmail.gif" width="16" height="16" />');
 150      define('TRANSPARENT_ICON','<img src="'.$img_path.'/images/dot_clear.gif" width="16" height="16" />');
 151    }
 152    else
 153    {
 154      //define('ADD_ICON','');
 155      define('NOTICE_ICON','');
 156      define('PRIVATE_CHAT_ICON','');
 157      define('SAY_TO_ICON','');
 158      define('WHISPER_TO_ICON','');
 159      define('USERPAGE_ICON','');
 160      define('INVITE_ICON','');
 161      define('DISINVITE_ICON','');
 162      define('IGNORE_CHATTER_ICON','');
 163      define('UNIGNORE_CHATTER_ICON','');
 164      define('ADD_FRIEND_ICON','');
 165      define('MAIL_ICON','');
 166      define('TRANSPARENT_ICON','');
 167    }
 168    define('_LANG',$_SESSION['chat']->get_language());
 169    $all_lines = $_SESSION['chat']->get_template('output');
 170    /*
 171    $TEMPLATE_OUT['all_chatters']  = 'parent.chatter.document.writeln(\'';
 172    $TEMPLATE_OUT['all_chatters'] .= $_SESSION['chat']->get_template('chatter');
 173    $TEMPLATE_OUT['all_chatters'] .= '\');';
 174    */
 175    
 176    //if the chatter has birthday, we send him congratulations
 177    if( $_SESSION['chatter']->has_birthday() )
 178    {
 179      $_SESSION['chat']->write_sys_msg( ':birthday: '.$_SESSION['translator']->out('HAPPY_BIRTHDAY',true),$_SESSION['chatter'] );
 180      $sound_recipient .= addSound('birthday');
 181    }
 182    $inbox = &new POC_Mailbox( 'inbox' );
 183    if( $inbox->get_unread_mail_count()>0 ){
 184      $_SESSION['chat']->write_sys_msg( ':mail: '.$_SESSION['translator']->out('YOU_HAVE_NEW_MAIL',true),$_SESSION['chatter'], true );
 185      $sound_recipient .= addSound('new_mail');
 186    }
 187    unset($inbox);
 188  } elseif( $private_request = $_SESSION['chatter']->check_private() ) {
 189    if(function_exists('session_register') && !session_is_registered('invited_from') ) {
 190      session_register('invited_from');
 191    }
 192    $invited_from = $private_request;
 193    $_SESSION['invited_from'] = $invited_from;
 194    $TEMPLATE_OUT['js_onload'] .= 'parent.output.privateChatWindow(\''.$_SESSION['chatter']->get_nick().'\',\''.$private_request.'\');';
 195  }
 196  
 197  /* Do not load any new line if channel is password protected and the chatter are not authorized */
 198  if(  $_SESSION['channel']->is_password_protected() 
 199   && !$_SESSION['chatter']->is_authorized_for($_SESSION['channel']->get_name()) 
 200   && isset($_GET['polling']) )
 201    die('<html><body onload="parent.serialize_refresh=0"></body></html>');
 202  
 203  $_SESSION['channel_buffer']->connect();
 204  
 205  if( $lines = $_SESSION['channel_buffer']->get_lines_since( $_SESSION['lastRedLine'] ) )
 206  {
 207      $max_line_idx = $_SESSION['channel_buffer']->get_max_line_idx();
 208      $_SESSION['channel_buffer']->disconnect();
 209      reset($lines);
 210      $i = $_SESSION['lastRedLine'];
 211      $moderate_line = '';
 212      do{
 213          $i = ++$i % $max_line_idx;
 214          $current_line   = current($lines);
 215          if( !is_object($current_line) ){
 216            if( defined('DEBUG') && DEBUG )
 217              $js_debug.='alert("'.$current_line.'");';
 218            continue;
 219          }
 220          $line_sender    = $current_line->get_chatter();
 221          $line_recipient = $current_line->get_recipient();
 222          
 223          //whispering to somebody?!
 224          if( is_object($line_recipient) && $line_recipient->get_nick() == $_SESSION['translator']->out('EVERYBODY'))
 225            $current_line->set_whispered(false);
 226            
 227          if(  $current_line->is_loginMsg() 
 228          && $current_line->get_login() != $_SESSION['chatter']->get_nick() ){
 229            $TEMPLATE_OUT['js_update_chatter'] .= 'parent.addNewChatter(\''.$current_line->get_login().'\');';
 230            if($_SESSION['chatter']->is_friend( $current_line->get_login() ))
 231              $sound_recipient .= addSound('friend_login');
 232          }elseif(  $current_line->is_leavingMsg() 
 233          && $current_line->get_leave() != $_SESSION['chatter']->get_nick() ){
 234            $TEMPLATE_OUT['js_update_chatter'] .= 'parent.delChatter(\''.$current_line->get_leave().'\');';
 235            if($_SESSION['chatter']->is_friend( $current_line->get_leave() ))
 236              $sound_recipient .= addSound('friend_logout');
 237          }
 238          
 239          if( SHOW_CHAT_HISTORY && $current_line->is_loginMsg() 
 240          && $current_line->get_login() == $_SESSION['chatter']->get_nick() ){
 241            $all_lines .= '<div style="margin-top:30px;font-size:16px;font-weight:bold">'.$_SESSION['translator']->out('CHANNEL').': '.$_SESSION['channel']->get_name().'</div>';
 242            $_SESSION['channel_buffer']->connect();
 243            $chat_history = $_SESSION['channel_buffer']->get_all_lines_in_buffer();
 244            $_SESSION['channel_buffer']->disconnect();
 245            array_pop($chat_history);//no need for the last line
 246            foreach($chat_history as $history_line){
 247              if($history_line->is_whispered() || ($_SESSION['channel']->is_moderated() && !$history_line->get_approved()))
 248                continue;
 249              $history_line_sender    = $history_line->get_sender();
 250              $history_line_recipient = $history_line->get_recipient();
 251              $all_lines .= '<div style="margin-left:34px;color: #'.$history_line_sender->get_color().'">'.HTML_BEFORE_LINE;
 252              $all_lines .= '&nbsp;<span>'.$history_line_sender->get_nick().'</span>';
 253              if(is_object($history_line_recipient)){
 254                $all_lines .= '&nbsp;';
 255                $all_lines .= ($history_line->get_whispered())? 
 256                              $_SESSION['translator']->out('WHISPERS_TO',true):
 257                              $_SESSION['translator']->out('SAYS_TO',true);
 258                $all_lines .= '&nbsp;<span>'.$history_line_recipient->get_nick().'</span>';
 259              }
 260              
 261              $all_lines .= ':&nbsp;';
 262              $history_line->filter_buffer_output();
 263              $all_lines .= $history_line->get_said().HTML_AFTER_LINE.'</div>';
 264            }
 265            unset($chat_history);
 266            unset($history_line_sender);
 267            unset($history_line_recipient);
 268          }
 269          //and now here come some 'guards'
 270  
 271          //skip curent line if chatter wants to talk private or it's a whispered line or chatter
 272          //doesn't want system messages
 273          if( $_SESSION['chatter']->get_private() 
 274          && ($line_sender->get_nick()      != $_SESSION['chatter']->get_nick())
 275          && (@$line_recipient->get_nick()  != $_SESSION['chatter']->get_nick())
 276          )
 277             continue;
 278  
 279          if( $_SESSION['chatter']->get_bodies() 
 280          && !$_SESSION['chatter']->is_friend($line_sender->get_nick())
 281          && !$_SESSION['chatter']->is_friend(@$line_recipient->get_nick())
 282          && (@$line_recipient->get_nick()  != $_SESSION['chatter']->get_nick())
 283          ){
 284             continue;
 285          }
 286          
 287          
 288          if( $current_line->get_whispered() 
 289          && ($line_sender->get_nick()      != $_SESSION['chatter']->get_nick())
 290          && (@$line_recipient->get_nick()  != $_SESSION['chatter']->get_nick())
 291          )
 292             continue;
 293  
 294          if( $_SESSION['chatter']->get_sys_msg() 
 295          && ($line_sender->get_nick() == strval(STATUS_BOT_NAME)) 
 296          )
 297             continue;
 298           
 299          if( !$_SESSION['channel']->is_moderated()
 300          && ($line_sender->get_nick() == $_SESSION['chatter']->get_nick() )
 301          )
 302             continue;
 303          
 304          if( ($line_sender->get_nick() == strval(STATUS_BOT_NAME))
 305          && !$current_line->is_info()
 306          && $current_line->get_whispered()
 307          && !$current_line->is_invitationMsg()
 308          && ($line_recipient->get_nick() == $_SESSION['chatter']->get_nick() )
 309          )
 310             continue;
 311             
 312          //skip line, if sender is ignored by the current chatter
 313          if( $_SESSION['chatter']->is_ignored( $line_sender->get_nick() ) )
 314             continue;
 315             
 316          if( $current_line->in_private_window() )
 317             continue;
 318  
 319          //channel moderated? if( $_SESSION['channel']->is_moderated() )
 320          //line approved?     if( $current_line->get_approved() 
 321          if( $_SESSION['channel']->is_moderated() )
 322          {
 323            //channel is moderated
 324            if( !$current_line->get_approved() && $_SESSION['chatter']->is_vip() )
 325              continue; //skip line if current chatter is a vip and line are not approved
 326              
 327            if( !$current_line->get_approved() 
 328                && !$_SESSION['chatter']->is_moderator()
 329                && $line_sender->get_nick() != strval(STATUS_BOT_NAME)
 330                )
 331              continue; //skip line if current a profane chatter, line are not approved, and line isn't from the system-bot
 332  
 333            if( !$current_line->get_approved() && $_SESSION['chatter']->is_moderator()
 334                && $line_sender->get_nick()    != strval(STATUS_BOT_NAME)
 335              )
 336            {
 337              //the line isn't from a moderator, vip, or system-bot
 338              $moderate_line  = '
 339                <form name="approve" class="moderate" action="approve.php" method="post" target="satModeration">
 340                  '.$_SESSION['session_post'].'
 341                  <input name="line" type="hidden" value="'.urlencode(serialize($current_line)).'" />
 342                  <input class="moderate" type="button" value="'.$_SESSION['translator']->out('DISAPPROVE').'" onclick="taggedDiv.style.display=\\\'none\\\'" />
 343                  <input class="moderate" name="moderate" type="submit" value="'.$_SESSION['translator']->out('EDIT').'" onclick="openWindow();blur();this.style.display=\\\'none\\\'" />
 344                </form>
 345                <form action="approve.php" method="post" target="dummy" class="moderate">
 346                  '.$_SESSION['session_post'].'
 347                  <input name="line" type="hidden" value="'.urlencode(serialize($current_line)).'" />
 348                  <input class="moderate" name="approve" type="submit" onclick="blur();this.style.display=\\\'none\\\'" value="'.$_SESSION['translator']->out('APPROVE').'" />
 349                </form>
 350              ';
 351              //$moderate_line = preg_replace('/\r\n|\r|\n|<!--.[^-]*-->|  /', '', $moderate_line);
 352              $moderate_line = preg_replace('/\r\n|\r|\n|  /', '', $moderate_line);
 353              
 354              $css_line_class = ' class="unapprovedLine"';
 355            }
 356            
 357            if( $current_line->get_approved() && $_SESSION['chatter']->is_moderator() )
 358              $css_line_class = ' class="approvedLine"';
 359          }
 360  
 361          if( $_SESSION['chatter']->is_friend( $line_sender->get_nick()) )
 362            $friend_class = ' class="friend"';
 363          else
 364            $friend_class = '';
 365  
 366          $ranking = $_SESSION['chat']->get_grade_icon( $line_sender );
 367          $gender  = '';
 368          if( SHOW_GENDER_ICON )
 369            $gender=($line_sender->get_gender())? '<img src="'.$_SESSION['template']->get_tmpl_web_path().'/images/icons/'.$line_sender->get_gender().'.gif" width="8" height="8" alt="'.$_SESSION['translator']->out('GENDER').'" /> ':'<img src="'.$_SESSION['template']->get_tmpl_web_path().'/images/dot_clear.gif" width="8" height="8" alt="" /> ';
 370          $italic = ( $current_line->is_whispered() )? ';font-style:italic':'';
 371          $all_lines .= '<div'.$css_line_class.' style="color: #'.$line_sender->get_color().$italic.'" onmouseover="setNickname(\\\''.preg_replace( "/\#{3}([^#]*)\#{3}/e", "htmlentities(\$_SESSION['translator']->out('\\1'))", $line_sender->get_nick() ).'\\\');tagDiv(this)">'.HTML_BEFORE_LINE.$moderate_line.$ranking.$gender.'<span'.$friend_class.'>';
 372          unset($italic);
 373          if( $line_sender->get_nick()!=STATUS_BOT_NAME 
 374          && !$line_sender->is_guest()
 375          && !$_SESSION['channel']->is_moderated() )
 376          {
 377            $all_lines .= '<a style="color: #'.$line_sender->get_color().'" href="#" oonclick="return showNotice(event.screenX,event.screenY,\\\''.urlencode($line_sender->get_nick()).'\\\')" onclick="return selectNick(\\\''.$line_sender->get_nick().'\\\',\\\''.$current_line->get_whispered().'\\\')" onmouseover="setNickname(\\\''.$line_sender->get_nick().'\\\')">';
 378            $all_lines .= $line_sender->get_nick();
 379            $all_lines .= '</a>';
 380          } else 
 381            $all_lines .= $line_sender->get_nick();
 382          $all_lines .= '</span>';
 383          if( !is_null($line_recipient) )
 384          {
 385            if( $line_recipient->get_nick() == $_SESSION['chatter']->get_nick() 
 386                && $line_sender->get_nick() != STATUS_BOT_NAME
 387                && !is_null($_SESSION['chatter']->get_advice())
 388                && $_SESSION['chatter']->get_advice() != 'quiet')
 389            {
 390              if($_SESSION['chatter']->get_advice() == 'alert'){
 391                $alert_content    = $_SESSION['chat']->get_template('messageWindow');
 392                $alert_recipient  = 'msgWindow = window.open("","displayWindow","menubar=no,width=350,height=50,scrollbars=no");'.NL;
 393                $alert_recipient .= 'msgWindow.document.write("'.$alert_content.'");'.NL;
 394                $alert_recipient .= 'msgWindow.focus();'.NL;
 395              }else{
 396                $sound_recipient .= addSound('new_line');
 397              }
 398            }
 399            $all_lines .= '&nbsp;';
 400            $all_lines .= ($current_line->get_whispered())? 
 401                          $_SESSION['translator']->out('WHISPERS_TO',true):
 402                          $_SESSION['translator']->out('SAYS_TO',true);
 403            $all_lines .= '&nbsp;<span>'.$line_recipient->get_nick().'</span>';
 404          }
 405          $all_lines .= ':&nbsp;';
 406          $current_line->filter_buffer_output();
 407          $all_lines .= $current_line->get_said().HTML_AFTER_LINE.'</div>';
 408      }while( next($lines) );
 409  
 410      $_SESSION['lastRedLine'] = intval($i);
 411      unset($i);
 412      
 413      if( empty($all_lines)){
 414        if(isset($_SESSION['invited_from']) ) die('<html><body onload="parent.serialize_refresh=0;'.$TEMPLATE_OUT['js_onload'].'"></body></html>');
 415        else die('<html><body onload="parent.serialize_refresh=0"></body></html>');
 416      }
 417  }else{
 418      $_SESSION['channel_buffer']->disconnect();
 419      if( isset($_SESSION['invited_from']) )
 420        die('<html><body onload="parent.serialize_refresh=0;'.$TEMPLATE_OUT['js_onload'].'"></body></html>');
 421      else
 422        die('<html><body onload="parent.serialize_refresh=0"></body></html>');
 423  }
 424  
 425  
 426  
 427  unset($lines);
 428  unset($current_line);
 429  unset($line_sender);
 430  unset($lines);
 431  unset($max_line_idx);
 432  
 433  if( $login && $_SESSION['channel']->is_password_protected() 
 434   && !$_SESSION['chatter']->is_authorized_for($_SESSION['channel']->get_name()) )
 435  {
 436    $all_lines .= '<form action="unlock_channel.php" method="post" target="dummy" style="display:inline"><input class="unlock" type="password" name="password" /><input class="submit" type="submit" value="'.$_SESSION['translator']->out('UNLOCK_CHANNEL',true).'" /><\/form>';
 437  }
 438  $TEMPLATE_OUT['all_lines'] = $all_lines;
 439  $TEMPLATE_OUT['alert_recipient'] = $alert_recipient;
 440  $TEMPLATE_OUT['js_debug'] = $js_debug;
 441  $TEMPLATE_OUT['sound_recipient'] = $sound_recipient;
 442  
 443  $_SESSION['template']->get_template();
 444  ?>

title

Description

title

Description

title

Description

title

title

Body