b2evolution

Multilingual multiuser multiblog engine

b2evolution Technical Documentation (Version 1.9) [ class tree: evocore ] [ index: evocore ] [ all elements ]

Source for file _comment.class.php

Documentation is available at _comment.class.php

  1. <?php
  2. /**
  3.  * This file implements the Comment class.
  4.  *
  5.  * This file is part of the b2evolution/evocms project - {@link http://b2evolution.net/}.
  6.  * See also {@link http://sourceforge.net/projects/evocms/}.
  7.  *
  8.  * @copyright (c)2003-2006 by Francois PLANQUE - {@link http://fplanque.net/}.
  9.  *  Parts of this file are copyright (c)2004-2005 by Daniel HAHLER - {@link http://thequod.de/contact}.
  10.  *
  11.  * @license http://b2evolution.net/about/license.html GNU General Public License (GPL)
  12.  *
  13.  *  {@internal Open Source relicensing agreement:
  14.  *  Daniel HAHLER grants Francois PLANQUE the right to license
  15.  *  Daniel HAHLER's contributions to this file and the b2evolution project
  16.  *  under any OSI approved OSS license (http://www.opensource.org/licenses/).
  17.  *  }}}
  18.  *
  19.  * @package evocore
  20.  *
  21.  *  {@internal Below is a list of authors who have contributed to design/coding of this file: }}
  22.  * @author blueyed: Daniel HAHLER.
  23.  * @author fplanque: Francois PLANQUE
  24.  *
  25.  * @version $Id: _comment.class.php,v 1.38.2.10 2007/03/22 00:04:16 blueyed Exp $
  26.  */
  27. if!defined('EVO_MAIN_INIT') ) die'Please, do not access this page directly.' );
  28.  
  29. /**
  30.  * Includes:
  31.  */
  32. require_once dirname(__FILE__).'/../dataobjects/_dataobject.class.php';
  33.  
  34. /**
  35.  * Comment Class
  36.  *
  37.  * @package evocore
  38.  */
  39. class Comment extends DataObject
  40. {
  41.     /**
  42.      * The item (parent) of this Comment (lazy-filled).
  43.      * @see Comment::get_Item()
  44.      * @see Comment::set_Item()
  45.      * @access protected
  46.      * @var Item 
  47.      */
  48.     var $Item;
  49.     /**
  50.      * @var integer The ID of the comment's Item.
  51.      */
  52.     var $item_ID;
  53.     /**
  54.      * The comment's user, this is NULL for (anonymous) visitors (lazy-filled).
  55.      * @see Comment::get_author_User()
  56.      * @see Comment::set_author_User()
  57.      * @access protected
  58.      * @var User 
  59.      */
  60.     var $author_User;
  61.     /**
  62.      * @var integer|NULLThe ID of the author's user. NULL for anonymous visitors.
  63.      */
  64.     var $author_ID;
  65.     /**
  66.      * @var string Comment type: 'comment', 'linkback', 'trackback' or 'pingback'
  67.      */
  68.     var $type;
  69.     /**
  70.      * @var string Comment visibility status: 'published', 'deprecated', 'protected', 'private' or 'draft'
  71.      */
  72.     var $status;
  73.     /**
  74.      * @var string Name of the (anonymous) visitor (if any).
  75.      */
  76.     var $author;
  77.     /**
  78.      * @var string Email address of the (anonymous) visitor (if any).
  79.      */
  80.     var $author_email;
  81.     /**
  82.      * @var string URL/Homepage of the (anonymous) visitor (if any).
  83.      */
  84.     var $author_url;
  85.     /**
  86.      * @var string IP address of the comment's author (while posting).
  87.      */
  88.     var $author_IP;
  89.     /**
  90.      * @var string Date of the comment (MySQL DATETIME - use e.g. {@link mysql2timestamp()}); local time ({@link $localtimenow})
  91.      */
  92.     var $date;
  93.     /**
  94.      * @var string 
  95.      */
  96.     var $content;
  97.     /**
  98.      * @var integer Spam karma of the comment (0-100), 0 being "probably no spam at all"
  99.      */
  100.     var $spam_karma;
  101.     /**
  102.      * @var boolean Does an anonymous commentator allow to send messages through a message form?
  103.      */
  104.     var $allow_msgform;
  105.  
  106.  
  107.     /**
  108.      * Constructor
  109.      */
  110.     function Comment$db_row NULL )
  111.     {
  112.         // Call parent constructor:
  113.         parent::DataObject'T_comments''comment_''comment_ID' );
  114.  
  115.         if$db_row == NULL )
  116.         {
  117.             // echo 'null comment';
  118.         }
  119.         else
  120.         {
  121.             $this->ID = $db_row['comment_ID'];
  122.             $this->item_ID = $db_row['comment_post_ID'];
  123.             ifempty($db_row['comment_author_ID']) )
  124.             {
  125.                 $this->author_user_ID $db_row['comment_author_ID'];
  126.             }
  127.             $this->type = $db_row['comment_type'];
  128.             $this->status = $db_row['comment_status'];
  129.             $this->author = $db_row['comment_author'];
  130.             $this->author_email = $db_row['comment_author_email'];
  131.             $url trim$db_row['comment_author_url');
  132.             ifempty($url&& preg_match'~^\w+://~'$url ) )
  133.             // URL given and does not start with a protocol:
  134.                 $url 'http://'.$url;
  135.             }
  136.             $this->author_url = $url;
  137.             $this->author_IP = $db_row['comment_author_IP'];
  138.             $this->date = $db_row['comment_date'];
  139.             $this->content = $db_row['comment_content'];
  140.             $this->spam_karma = $db_row['comment_spam_karma'];
  141.             $this->allow_msgform = $db_row['comment_allow_msgform'];
  142.         }
  143.     }
  144.  
  145.  
  146.     /**
  147.      * Get the author User of the comment. This is NULL for anonymous visitors.
  148.      *
  149.      * @return User 
  150.      */
  151.     function get_author_User()
  152.     {
  153.         ifisset($this->author_user_ID&& isset($this->author_User) )
  154.         {
  155.             global $UserCache;
  156.             $this->author_User = $UserCache->get_by_ID$this->author_user_ID );
  157.         }
  158.  
  159.         return $this->author_User;
  160.     }
  161.  
  162.  
  163.     /**
  164.      * Get the Item this comment relates to
  165.      *
  166.      * @return Item 
  167.      */
  168.     function get_Item()
  169.     {
  170.         ifisset($this->Item) )
  171.         {
  172.             global $ItemCache;
  173.  
  174.             $this->Item = $ItemCache->get_by_ID$this->item_ID );
  175.         }
  176.  
  177.         return $this->Item;
  178.     }
  179.  
  180.  
  181.     /**
  182.      * Get a member param by its name
  183.      *
  184.      * @param mixed Name of parameter
  185.      * @return mixed Value of parameter
  186.      */
  187.     function get$parname )
  188.     {
  189.         global $post_statuses;
  190.  
  191.         switch$parname )
  192.         {
  193.             case 't_status':
  194.                 // Text status:
  195.                 return T_$post_statuses[$this->status);
  196.         }
  197.  
  198.         return parent::get$parname );
  199.     }
  200.  
  201.  
  202.     /**
  203.      * Set param value
  204.      *
  205.      * @param string parameter name
  206.      * @param mixed parameter value
  207.      * @return boolean true, if a value has been set; false if it has not changed
  208.      */
  209.     function set$parname$parvalue )
  210.     {
  211.         switch$parname )
  212.         {
  213.             default:
  214.                 return parent::set_param$parname'string'$parvalue );
  215.         }
  216.     }
  217.  
  218.  
  219.     /**
  220.      * Set Item this comment relates to
  221.      * @param Item 
  222.      */
  223.     function set_Item$Item )
  224.     {
  225.         $this->Item = $Item;
  226.         $this->item_ID = $Item->ID;
  227.         parent::set_param'post_ID''number'$Item->ID );
  228.     }
  229.  
  230.  
  231.     /**
  232.      * Set author User of this comment
  233.      */
  234.     function set_author_User$author_User )
  235.     {
  236.         $this->author_User = $author_User;
  237.         parent::set_param'author_ID''number'$author_User->ID );
  238.     }
  239.  
  240.  
  241.     /**
  242.      * Set the spam karma, as a number.
  243.      * @param integer Spam karma (-100 - 100)
  244.      * @access protected
  245.      */
  246.     function set_spam_karma$spam_karma )
  247.     {
  248.         return parent::set_param'spam_karma''number'$spam_karma );
  249.     }
  250.  
  251.  
  252.     /**
  253.      * Get the anchor-ID of the comment
  254.      *
  255.      * @return string 
  256.      */
  257.     function get_anchor()
  258.     {
  259.         return 'c'.$this->ID;
  260.     }
  261.  
  262.  
  263.     /**
  264.      * Template function: display anchor for permalinks to refer to
  265.      */
  266.     function anchor()
  267.     {
  268.         echo '<a id="'.$this->get_anchor().'"></a>';
  269.     }
  270.  
  271.  
  272.     /**
  273.      * Get the comment author's name.
  274.      *
  275.      * @return string 
  276.      */
  277.     function get_author_name()
  278.     {
  279.         if$this->get_author_User() )
  280.         {
  281.             return $this->author_User->preferred_name'raw'false );
  282.         }
  283.         else
  284.         {
  285.             return $this->author;
  286.         }
  287.     }
  288.  
  289.  
  290.     /**
  291.      * Get the EMail of the comment's author.
  292.      *
  293.      * @return string 
  294.      */
  295.     function get_author_email()
  296.     {
  297.         if$this->get_author_User() )
  298.         // Author is a user
  299.             return $this->author_User->get('email');
  300.         }
  301.         else
  302.         {
  303.             return $this->author_email;
  304.         }
  305.     }
  306.  
  307.  
  308.     /**
  309.      * Get the URL of the comment's author.
  310.      *
  311.      * @return string 
  312.      */
  313.     function get_author_url()
  314.     {
  315.         if$this->get_author_User() )
  316.         // Author is a user
  317.             return $this->author_User->get('url');
  318.         }
  319.         else
  320.         {
  321.             return $this->author_url;
  322.         }
  323.     }
  324.  
  325.  
  326.     /**
  327.      * Template function: display author of comment
  328.      *
  329.      * @param string String to display before author name if not a user
  330.      * @param string String to display after author name if not a user
  331.      * @param string String to display before author name if he's a user
  332.      * @param string String to display after author name if he's a user
  333.      * @param string Output format, see {@link format_to_output()}
  334.      * @param boolean true for link, false if you want NO html link
  335.      */
  336.     function author$before ''$after '#'$before_user ''$after_user '#',
  337.                                         $format 'htmlbody'$makelink false )
  338.     {
  339.         global $Plugins;
  340.  
  341.         $r '';
  342.  
  343.         if$this->get_author_User() )
  344.         // Author is a user
  345.             ifstrlen$this->author_User->url <= 10 $makelink false;
  346.             if$after_user == '#' $after_user ' ['.T_('Member').']';
  347.             $r .= $before_user;
  348.             if$makelink $r .= '<a href="'.htmlspecialchars($this->author_User->url).'">';
  349.             $r .= $this->author_User->preferred_name$formatfalse );
  350.             if$makelink $r .= '</a>';
  351.             $r .= $after_user;
  352.         }
  353.         else
  354.         // Display info recorded at edit time:
  355.             ifstrlen$this->author_url <= 10 $makelink false;
  356.             if$after == '#' $after ' ['.T_('Visitor').']';
  357.             $r .= $before;
  358.  
  359.             if$makelink $r .= '<a href="'.htmlspecialchars($this->author_url).'">';
  360.             $r .= $this->dget'author'$format );
  361.             if$makelink $r .= '</a>';
  362.             $r .= $after;
  363.         }
  364.  
  365.         $Plugins->trigger_event'FilterCommentAuthor'array'data' => $r'makelink' => $makelink'Comment' => $this ) );
  366.  
  367.         echo $r;
  368.     }
  369.  
  370.  
  371.     /**
  372.      * Template function: display comment's author's IP
  373.      *
  374.      * @param string String to display before IP, if IP exists
  375.      * @param string String to display after IP, if IP exists
  376.      */
  377.     function author_ip$before=''$after='' )
  378.     {
  379.         if!empty$this->author_IP ) )
  380.         {
  381.             echo $before;
  382.             echo $this->author_IP;
  383.             echo $after;
  384.         }
  385.     }
  386.  
  387.  
  388.     /**
  389.      * Template function: display link to comment author's provided email
  390.      *
  391.      * @param string String to display for link: leave empty to display email
  392.      * @param string String to display before email, if email exists
  393.      * @param string String to display after email, if email exists
  394.      * @param boolean false if you want NO html link
  395.      */
  396.     function author_email$linktext=''$before=''$after=''$makelink true )
  397.     {
  398.         $email $this->get_author_email();
  399.  
  400.         ifstrlen$email )
  401.         // If email exists:
  402.             echo $before;
  403.             if$makelink echo '<a href="mailto:'.$email.'">';
  404.             echo ($linktext != ''$linktext $email;
  405.             if$makelink echo '</a>';
  406.             echo $after;
  407.         }
  408.     }
  409.  
  410.  
  411.     /**
  412.      * Template function: display link to comment author's provided URL
  413.      *
  414.      * @param string String to display for link: leave empty to display URL
  415.      * @param string String to display before link, if link exists
  416.      * @param string String to display after link, if link exists
  417.      * @param boolean false if you want NO html link
  418.      * @return boolean true if URL has been displayed
  419.      */
  420.     function author_url$linktext=''$before=''$after=''$makelink true )
  421.     {
  422.         global $Plugins;
  423.  
  424.         $url $this->get_author_url();
  425.  
  426.         ifstrlen$url 10 )
  427.         {
  428.             return false;
  429.         }
  430.  
  431.         // If URL exists:
  432.         $r $before;
  433.         if$makelink )
  434.         {
  435.             $r .= '<a href="'.$url.'">';
  436.         }
  437.         $r .= empty($linktext$url $linktext );
  438.         if$makelink $r .= '</a>';
  439.         $r .= $after;
  440.  
  441.         $Plugins->trigger_event'FilterCommentAuthorUrl'array'data' => $r'makelink' => $makelink'Comment' => $this ) );
  442.  
  443.         echo $r;
  444.         return true;
  445.     }
  446.  
  447.  
  448.     /**
  449.      * Template function: display spam karma of the comment (in percent)
  450.      *
  451.      * "%s" gets replaced by the karma value
  452.      *
  453.      * @param string Template string to display, if we have a karma value
  454.      * @param string Template string to display, if we have no karma value (pre-Phoenix)
  455.      */
  456.     function spam_karma$template '%s%'$template_unknown NULL )
  457.     {
  458.         ifisset($this->spam_karma) )
  459.         {
  460.             echo str_replace'%s'$this->spam_karma$template );
  461.         }
  462.         else
  463.         {
  464.             ifisset($template_unknown) )
  465.             {
  466.                 echo /* TRANS: "not available" */ T_('N/A');
  467.             }
  468.             else
  469.             {
  470.                 echo $template_unknown;
  471.             }
  472.         }
  473.     }
  474.  
  475.  
  476.     /**
  477.      * Provide link to edit a comment if user has edit rights
  478.      *
  479.      * @param string to display before link
  480.      * @param string to display after link
  481.      * @param string link text
  482.      * @param string link title
  483.      * @param string class name
  484.      * @return boolean 
  485.      */
  486.     function edit_link$before ' '$after ' '$text '#'$title '#'$class '' )
  487.     {
  488.         global $current_User$admin_url;
  489.  
  490.         ifis_logged_in() ) return false;
  491.  
  492.         $this->get_Item();
  493.  
  494.         if$current_User->check_perm'blog_comments'''false$this->Item->get'blog_ID' ) ) )
  495.         // If User has no permission to edit comments:
  496.             return false;
  497.         }
  498.  
  499.         if$text == '#' $text get_icon'edit' ).' '.T_('Edit...');
  500.         if$title == '#' $title T_('Edit this comment');
  501.  
  502.         echo $before;
  503.         echo '<a href="'.$admin_url.'?ctrl=edit&amp;action=editcomment&amp;comment='.$this->ID;
  504.         echo '" title="'.$title.'"';
  505.         if!empty$class ) ) echo ' class="'.$class.'"';
  506.         echo '>'.$text.'</a>';
  507.         echo $after;
  508.  
  509.         return true;
  510.     }
  511.  
  512.  
  513.     /**
  514.      * Displays button for deleeing the Comment if user has proper rights
  515.      *
  516.      * @param string to display before link
  517.      * @param string to display after link
  518.      * @param string link text
  519.      * @param string link title
  520.      * @param string class name
  521.      * @param boolean true to make this a button instead of a link
  522.      */
  523.     function delete_link$before ' '$after ' '$text '#'$title '#'$class ''$button  false )
  524.     {
  525.         global $current_User$admin_url;
  526.  
  527.         ifis_logged_in() ) return false;
  528.  
  529.         $this->get_Item();
  530.  
  531.         if$current_User->check_perm'blog_comments'''false$this->Item->get'blog_ID' ) ) )
  532.         // If User has permission to edit comments:
  533.             return false;
  534.         }
  535.  
  536.         if$text == '#' )
  537.         // Use icon+text as default, if not displayed as button (otherwise just the text)
  538.             if$button )
  539.             {
  540.                 $text get_icon'delete''imgtag' ).' '.T_('Delete!');
  541.             }
  542.             else
  543.             {
  544.                 $text T_('Delete!');
  545.             }
  546.         }
  547.         if$title == '#' $title T_('Delete this comment');
  548.  
  549.         $url $admin_url.'?ctrl=editactions&amp;action=deletecomment&amp;comment_ID='.$this->ID;
  550.  
  551.         echo $before;
  552.         if$button )
  553.         // Display as button
  554.             echo '<input type="button"';
  555.             echo ' value="'.$text.'" title="'.$title.'" onclick="if ( confirm(\'';
  556.             echo TS_('You are about to delete this comment!\\n\'Cancel\' to stop, \'OK\' to delete.');
  557.             echo '\') ) { document.location.href=\''.$url.'\' }"';
  558.             if!empty$class ) ) echo ' class="'.$class.'"';
  559.             echo '/>';
  560.         }
  561.         else
  562.         // Display as link
  563.             echo '<a href="'.$url.'" title="'.$title.'" onclick="return confirm(\'';
  564.             echo TS_('You are about to delete this comment!\\n\'Cancel\' to stop, \'OK\' to delete.');
  565.             echo '\')"';
  566.             if!empty$class ) ) echo ' class="'.$class.'"';
  567.             echo '>'.$text.'</a>';
  568.         }
  569.         echo $after;
  570.  
  571.         return true;
  572.     }
  573.  
  574.  
  575.     /**
  576.      * Provide link to deprecate a comment if user has edit rights
  577.      *
  578.      * @param string to display before link
  579.      * @param string to display after link
  580.      * @param string link text
  581.      * @param string link title
  582.      * @param string class name
  583.      * @param string glue between url params
  584.      * @param boolean save context?
  585.      */
  586.     function get_deprecate_link$before ' '$after ' '$text '#'$title '#'$class ''$glue '&amp;'$save_context false )
  587.     {
  588.         global $current_User$admin_url;
  589.  
  590.         ifis_logged_in() ) return false;
  591.  
  592.         $this->get_Item();
  593.  
  594.         if( ($this->status == 'deprecated'// Already deprecateded!
  595.             || $current_User->check_perm'blog_comments'''false$this->Item->get'blog_ID' ) ) )
  596.         // If User has permission to edit comments:
  597.             return false;
  598.         }
  599.  
  600.         if$text == '#' $text get_icon'deprecate''imgtag' ).' '.T_('Deprecate!');
  601.         if$title == '#' $title T_('Deprecate this comment!');
  602.  
  603.         $r $before;
  604.         $r .= '<a href="';
  605.         //if( $save_context )
  606.         {
  607.         }
  608.         //else
  609.         {
  610.             $r .= $admin_url.'?ctrl=editactions'.$glue.'action=deprecate_comment'.$glue.'comment_ID='.$this->ID;
  611.         }
  612.         $r .= '" title="'.$title.'"';
  613.         if!empty$class ) ) $r .= ' class="'.$class.'"';
  614.         $r .= '>'.$text.'</a>';
  615.         $r .= $after;
  616.  
  617.         return $r;
  618.     }
  619.  
  620.  
  621.     /**
  622.      * Display link to deprecate a comment if user has edit rights
  623.      *
  624.      * @param string to display before link
  625.      * @param string to display after link
  626.      * @param string link text
  627.      * @param string link title
  628.      * @param string class name
  629.      * @param string glue between url params
  630.      * @param boolean save context?
  631.      */
  632.     function deprecate_link$before ' '$after ' '$text '#'$title '#'$class ''$glue '&amp;'$save_context false )
  633.     {
  634.         echo $this->get_deprecate_link$before$after$text$title$class$glue$save_context );
  635.     }
  636.  
  637.  
  638.     /**
  639.      * Provide link to publish a comment if user has edit rights
  640.      *
  641.      * @param string to display before link
  642.      * @param string to display after link
  643.      * @param string link text
  644.      * @param string link title
  645.      * @param string class name
  646.      * @param string glue between url params
  647.      * @param boolean save context?
  648.      */
  649.     function get_publish_link$before ' '$after ' '$text '#'$title '#'$class ''$glue '&amp;'$save_context false )
  650.     {
  651.         global $current_User$admin_url;
  652.  
  653.         ifis_logged_in() ) return false;
  654.  
  655.         $this->get_Item();
  656.  
  657.         if( ($this->status == 'published'// Already published!
  658.             || $current_User->check_perm'blog_comments'''false$this->Item->get'blog_ID' ) ) )
  659.         // If User has permission to edit comments:
  660.             return false;
  661.         }
  662.  
  663.         if$text == '#' $text get_icon'publish''imgtag' ).' '.T_('Publish!');
  664.         if$title == '#' $title T_('Publish this comment!');
  665.  
  666.         $r $before;
  667.         $r .= '<a href="';
  668.         //if( $save_context )
  669.         {
  670.         }
  671.         //else
  672.         {
  673.             $r .= $admin_url.'?ctrl=editactions'.$glue.'action=publish_comment'.$glue.'comment_ID='.$this->ID;
  674.         }
  675.         $r .= '" title="'.$title.'"';
  676.         if!empty$class ) ) $r .= ' class="'.$class.'"';
  677.         $r .= '>'.$text.'</a>';
  678.         $r .= $after;
  679.  
  680.         return $r;
  681.     }
  682.  
  683.  
  684.     /**
  685.      * Display link to publish a comment if user has edit rights
  686.      *
  687.      * @param string to display before link
  688.      * @param string to display after link
  689.      * @param string link text
  690.      * @param string link title
  691.      * @param string class name
  692.      * @param string glue between url params
  693.      * @param boolean save context?
  694.      */
  695.     function publish_link$before ' '$after ' '$text '#'$title '#'$class ''$glue '&amp;'$save_context false )
  696.     {
  697.         echo $this->get_publish_link$before$after$text$title$class$glue$save_context );
  698.     }
  699.  
  700.  
  701.     /**
  702.      * Provide link to message form for this comment's author
  703.      *
  704.      * @param string url of the message form
  705.      * @param string to display before link
  706.      * @param string to display after link
  707.      * @param string link text
  708.      * @param string link title
  709.      * @param string class name
  710.      */
  711.     function msgform_link$form_url$before ' '$after ' '$text '#'$title '#'$class '' )
  712.     {
  713.         if$this->get_author_User() )
  714.         // This comment is from a registered user:
  715.             ifempty($this->author_User->email) )
  716.             // We have no email for this Author :(
  717.                 return false;
  718.             }
  719.             elseifempty($this->author_User->allow_msgform) )
  720.             // User does not allow message form
  721.                 return false;
  722.             }
  723.             $form_url url_add_param$form_url'recipient_id='.$this->author_User->ID );
  724.         }
  725.         else
  726.         // This comment is from a visitor:
  727.             ifempty($this->author_email) )
  728.             // We have no email for this comment :(
  729.                 return false;
  730.             }
  731.             elseifempty($this->allow_msgform) )
  732.             // Anonymous commentator does not allow message form (for this comment)
  733.                 return false;
  734.             }
  735.         }
  736.  
  737.         $form_url url_add_param$form_url'comment_id='.$this->ID.'&amp;post_id='.$this->item_ID
  738.                 .'&amp;redirect_to='.rawurlencode(url_rel_to_same_host(regenerate_url('','','','&')$form_url)) );
  739.  
  740.         if$title == '#' $title T_('Send email to comment author');
  741.         if$text == '#' $text get_icon'email''imgtag'array'class' => 'middle''title' => $title ) );
  742.  
  743.         echo $before;
  744.         echo '<a href="'.$form_url.'" title="'.$title.'"';
  745.         if!empty$class ) ) echo ' class="'.$class.'"';
  746.         echo '>'.$text.'</a>';
  747.         echo $after;
  748.  
  749.         return true;
  750.     }
  751.  
  752.  
  753.     /**
  754.      * Generate permalink to this comment.
  755.      *
  756.      * Note: This actually only returns the URL, to get a real link, use Comment::get_permanent_link()
  757.      *
  758.      * @param string 'urltitle', 'pid', 'archive#id' or 'archive#title'
  759.      * @param string url to use
  760.      */
  761.     function get_permanent_url$mode ''$blogurl='' )
  762.     {
  763.         global $Settings;
  764.  
  765.         ifempty$mode ) )
  766.             $mode $Settings->get'permalink_type' );
  767.  
  768.         // some permalink modes are not acceptable here:
  769.         switch$mode )
  770.         {
  771.             case 'archive#id':
  772.             case 'archive#title':
  773.                 $mode 'pid';
  774.         }
  775.  
  776.         $this->get_Item();
  777.         $post_permalink $this->Item->get_permanent_url$mode$blogurl );
  778.         return $post_permalink.'#'.$this->get_anchor();
  779.     }
  780.  
  781.  
  782.     /**
  783.      * Template function: display permalink to this comment
  784.      *
  785.      * Note: This actually only returns the URL, to get a real link, use Comment::permanent_link()
  786.      *
  787.      * @param string 'urltitle', 'pid', 'archive#id' or 'archive#title'
  788.      * @param string url to use
  789.      */
  790.     function permanent_url$mode ''$blogurl='' )
  791.     {
  792.         echo $this->get_permanent_url$mode$blogurl );
  793.     }
  794.  
  795.  
  796.     /**
  797.      * Returns a permalink link to the Comment
  798.      *
  799.      * Note: If you only want the permalink URL, use Comment::get_permanent_url()
  800.      *
  801.      * @param string link text or special value: '#', '#icon#', '#text#'
  802.      * @param string link title
  803.      * @param string class name
  804.      */
  805.     function get_permanent_link$text '#'$title '#'$class '' )
  806.     {
  807.         global $current_User$baseurl;
  808.  
  809.         switch$text )
  810.         {
  811.             case '#':
  812.                 $text get_icon'permalink' ).T_('Permalink');
  813.                 break;
  814.  
  815.             case '#icon#':
  816.                 $text get_icon'permalink' );
  817.                 break;
  818.  
  819.             case '#text#':
  820.                 $text T_('Permalink');
  821.                 break;
  822.         }
  823.  
  824.         if$title == '#' $title T_('Permanent link to this comment');
  825.  
  826.         $url $this->get_permanent_url();
  827.  
  828.         // Display as link
  829.         $r '<a href="'.$url.'" title="'.$title.'"';
  830.         if!empty$class ) ) $r .= ' class="'.$class.'"';
  831.         $r .= '>'.$text.'</a>';
  832.  
  833.         return $r;
  834.     }
  835.  
  836.  
  837.     /**
  838.      * Displays a permalink link to the Comment
  839.      *
  840.      * Note: If you only want the permalink URL, use Comment::permanent_url()
  841.      *
  842.      * @param string link text
  843.      * @param string link title
  844.      * @param string class name
  845.      */
  846.     function permanent_link$text '#'$title '#'$class '' )
  847.     {
  848.         echo $this->get_permanent_link$text$title$class );
  849.     }
  850.  
  851.  
  852.     /**
  853.      * Template function: get content of comment
  854.      *
  855.      * @param string Output format, see {@link format_to_output()}
  856.      * @return string 
  857.      */
  858.     function get_content$format 'htmlbody' )
  859.     {
  860.         global $Plugins;
  861.  
  862.         $comment $this->content;
  863.         $comment str_replace('<trackback />'''$comment);
  864.         $comment str_replace('<pingback />'''$comment);
  865.         $Plugins->trigger_event'FilterCommentContent'array'data' => $comment'Comment' => $this ) );
  866.         $comment format_to_output$comment$format );
  867.  
  868.         return $comment;
  869.     }
  870.  
  871.  
  872.     /**
  873.      * Template function: display content of comment
  874.      *
  875.      * @param string Output format, see {@link format_to_output()}
  876.      */
  877.     function content$format 'htmlbody' )
  878.     {
  879.         echo $this->get_content$format );
  880.     }
  881.  
  882.  
  883.     /**
  884.      * Template function: display date (datetime) of comment
  885.      *
  886.      * @param string date/time format: leave empty to use locale default date format
  887.      * @param boolean true if you want GMT
  888.      */
  889.     function date$format=''$useGM false )
  890.     {
  891.         ifempty($format) )
  892.             echo mysql2datelocale_datefmt()$this->date$useGM);
  893.         else
  894.             echo mysql2date$format$this->date$useGM);
  895.     }
  896.  
  897.  
  898.     /**
  899.      * Template function: display time (datetime) of comment
  900.      *
  901.      * @param string date/time format: leave empty to use locale default time format
  902.      * @param boolean true if you want GMT
  903.      */
  904.     function time$format=''$useGM false )
  905.     {
  906.         ifempty($format) )
  907.             echo mysql2datelocale_timefmt()$this->date$useGM );
  908.         else
  909.             echo mysql2date$format$this->date$useGM );
  910.     }
  911.  
  912.  
  913.     /**
  914.      * Template function: display status of comment
  915.      *
  916.      * Statuses:
  917.      * - published
  918.      * - deprecated
  919.      * - protected
  920.      * - private
  921.      * - draft
  922.      *
  923.      * @param string Output format, see {@link format_to_output()}
  924.      */
  925.     function status$format 'htmlbody' )
  926.     {
  927.         global $post_statuses;
  928.  
  929.         if$format == 'raw' )
  930.         {
  931.             $this->disp'status''raw' );
  932.         }
  933.         else
  934.         {
  935.             echo format_to_output$this->get('t_status')$format );
  936.         }
  937.     }
  938.  
  939.  
  940.     /**
  941.      * Send email notifications to subscribed users:
  942.      *
  943.      * @todo shall we notify suscribers of blog were this is in extra-cat?
  944.      * @todo cache message by locale like {@link Item::send_email_notifications()}
  945.      * @todo Indicator in url to see where the user came from (&from=subnote ["subscription notification"]) - Problem: too long urls.
  946.      * @todo "Beautify" like {@link Item::send_email_notifications()} ?
  947.      * @todo Should include "visibility status" in the mail to the Item's Author
  948.      */
  949.     function send_email_notifications()
  950.     {
  951.         global $DB$admin_url$debug$Debuglog;
  952.  
  953.         $this->get_Item();
  954.  
  955.         // Get list of users who want to be notfied:
  956.         // TODO: also use extra cats/blogs??
  957.         // So far you get notifications for everything. We'll need a setting to decide if you want to received unmoderated (aka unpublished) comments or not.
  958.     // Note: users receive comments on their own posts. This is done on purpose. Otherwise they think it's broken when they test the app.
  959.         $sql 'SELECT DISTINCT user_email, user_locale
  960.                             FROM T_subscriptions INNER JOIN T_users ON sub_user_ID = user_ID
  961.                          WHERE sub_coll_ID = '.$this->Item->blog_ID.'
  962.                            AND sub_comments <> 0
  963.                            AND LENGTH(TRIM(user_email)) > 0';
  964.         $notify_list $DB->get_results$sql );
  965.  
  966.         // Preprocess list:
  967.         $notify_array array();
  968.         foreach$notify_list as $notification )
  969.         {
  970.             $notify_array[$notification->user_email$notification->user_locale;
  971.         }
  972.  
  973.         // Check if we need to add the author:
  974.         $item_author_User $this->Item->get_creator_User();
  975.         if$item_author_User->notify
  976.                 && empty$item_author_User->email ) ) )
  977.         // Author wants to be notified:
  978.             $notify_array[$item_author_User->email$item_author_User->locale;
  979.         }
  980.  
  981.         ifcount($notify_array) )
  982.         // No-one to notify:
  983.             return false;
  984.         }
  985.  
  986.         /*
  987.          * We have a list of email addresses to notify:
  988.          */
  989.         if$this->get_author_User() )
  990.         // Comment from a registered user:
  991.             $mail_from '"'.$this->author_User->get('preferredname').'" <'.$this->author_User->get('email').'>';
  992.         }
  993.         elseifempty$email ) )
  994.         {
  995.             global $notify_from;
  996.             $mail_from $notify_from;
  997.         }
  998.         else
  999.         {
  1000.             $mail_from "\"$this->author\" <$this->author_email>";
  1001.         }
  1002.  
  1003.         $Blog $this->Item->get_Blog();
  1004.  
  1005.         // Send emails:
  1006.         foreach$notify_array as $notify_email => $notify_locale )
  1007.         {
  1008.             locale_temp_switch($notify_locale);
  1009.  
  1010.             switch$this->type )
  1011.             {
  1012.                 case 'trackback':
  1013.                     /* TRANS: Subject of the mail to send on new trackbacks. First %s is the blog's shortname, the second %s is the item's title. */
  1014.                     $subject T_('[%s] New trackback on "%s"');
  1015.                     break;
  1016.  
  1017.                 default:
  1018.                     /* TRANS: Subject of the mail to send on new comments. First %s is the blog's shortname, the second %s is the item's title. */
  1019.                     $subject T_('[%s] New comment on "%s"');
  1020.             }
  1021.  
  1022.             $subject sprintf$subject$Blog->get('shortname')$this->Item->get('title') );
  1023.  
  1024.             $notify_message T_('Blog').': '.$Blog->get('shortname')
  1025.                 .' ( '.str_replace('&amp;''&'$Blog->get('blogurl'))." )\n"
  1026.                 .T_('Post').': '.$this->Item->get('title')
  1027.                 .' ( '.str_replace('&amp;''&'$this->Item->get_permanent_url'pid' ))." )\n";
  1028.                 // We use pid to get a short URL and avoid it to wrap on a new line in the mail which may prevent people from clicking
  1029.  
  1030.             switch$this->type )
  1031.             {
  1032.                 case 'trackback':
  1033.                     $user_domain gethostbyaddr($this->author_IP);
  1034.                     $notify_message .= T_('Website')."$this->author (IP: $this->author_IP$user_domain)\n";
  1035.                     $notify_message .= T_('Url')."$this->author_url\n";
  1036.                     break;
  1037.  
  1038.                 default:
  1039.                     if$this->get_author_User() )
  1040.                     // Comment from a registered user:
  1041.                         $notify_message .= T_('Author').': '.$this->author_User->get('preferredname').' ('.$this->author_User->get('login').")\n";
  1042.                     }
  1043.                     else
  1044.                     // Comment from visitor:
  1045.                         $user_domain gethostbyaddr($this->author_IP);
  1046.                         $notify_message .= T_('Author')."$this->author (IP: $this->author_IP$user_domain)\n";
  1047.                         $notify_message .= T_('Email')."$this->author_email\n";
  1048.                         $notify_message .= T_('Url')."$this->author_url\n";
  1049.                     }
  1050.             }
  1051.  
  1052.             $notify_message .=
  1053.                 T_('Comment').': '.str_replace('&amp;''&'$this->get_permanent_url'pid' ))."\n" // We use pid to get a short URL and avoid it to wrap on a new line in the mail which may prevent people from clicking
  1054.                 .$this->get('content')."\n\n"
  1055.                 .T_('Edit/Delete').': '.$admin_url.'?ctrl=browse&tab=posts&blog='.$this->Item->blog_ID.'&p='.$this->Item->ID."&c=1\n\n"
  1056.                 .T_('Edit your subscriptions/notifications').': '.str_replace('&amp;''&'url_add_param$Blog->get'blogurl' )'disp=subs' ) )."\n";
  1057.  
  1058.             if$debug )
  1059.             {
  1060.                 $mail_dump "Sending notification to $notify_email:<pre>Subject: $subject\n$notify_message</pre>";
  1061.  
  1062.                 if$debug >= )
  1063.                 // output mail content - NOTE: this will kill sending of headers.
  1064.                     echo "<p>DEGUG>=3 dump:</p>$mail_dump";
  1065.                 }
  1066.  
  1067.                 $Debuglog->add$mail_dump'notification' );
  1068.             }
  1069.  
  1070.             send_mail$notify_email$subject$notify_message$mail_from );
  1071.  
  1072.             locale_restore_previous();
  1073.         }
  1074.     }
  1075.  
  1076.  
  1077.     /**
  1078.      * Trigger event AfterCommentUpdate after calling parent method.
  1079.      *
  1080.      * @return boolean true on success
  1081.      */
  1082.     function dbupdate()
  1083.     {
  1084.         global $Plugins;
  1085.  
  1086.         $dbchanges $this->dbchanges;
  1087.  
  1088.         if$r parent::dbupdate() )
  1089.         {
  1090.             $Plugins->trigger_event'AfterCommentUpdate'$params array'Comment' => $this'dbchanges' => $dbchanges ) );
  1091.         }
  1092.  
  1093.         return $r;
  1094.     }
  1095.  
  1096.  
  1097.     /**
  1098.      * Get karma and set it before adding the Comment to DB.
  1099.      *
  1100.      * @return boolean true on success, false if it did not get inserted
  1101.      */
  1102.     function dbinsert()
  1103.     {
  1104.         /**
  1105.          * @var Plugins
  1106.          */
  1107.         global $Plugins;
  1108.         global $Settings;
  1109.  
  1110.         // Get karma percentage (interval -100 - 100)
  1111.         $spam_karma $Plugins->trigger_karma_collect'GetSpamKarmaForComment'array'Comment' => $this ) );
  1112.  
  1113.         $this->set_spam_karma$spam_karma );
  1114.  
  1115.         // Change status accordingly:
  1116.         ifis_null($spam_karma) )
  1117.         {
  1118.             if$spam_karma $Settings->get('antispam_threshold_publish') )
  1119.             // Publish:
  1120.                 $this->set'status''published' );
  1121.             }
  1122.             elseif$spam_karma $Settings->get('antispam_threshold_delete') )
  1123.             // Delete/No insert:
  1124.                 return false;
  1125.             }
  1126.         }
  1127.  
  1128.         $dbchanges $this->dbchanges;
  1129.  
  1130.         if$r parent::dbinsert() )
  1131.         {
  1132.             $Plugins->trigger_event'AfterCommentInsert'$params array'Comment' => $this'dbchanges' => $dbchanges ) );
  1133.         }
  1134.  
  1135.         return $r;
  1136.     }
  1137.  
  1138.  
  1139.     /**
  1140.      * Trigger event AfterCommentDelete after calling parent method.
  1141.      *
  1142.      * @return boolean true on success
  1143.      */
  1144.     function dbdelete()
  1145.     {
  1146.         global $Plugins;
  1147.  
  1148.         // remember ID, because parent method resets it to 0
  1149.         $old_ID $this->ID;
  1150.  
  1151.         if$r parent::dbdelete() )
  1152.         {
  1153.             // re-set the ID for the Plugin event
  1154.             $this->ID = $old_ID;
  1155.  
  1156.             $Plugins->trigger_event'AfterCommentDelete'$params array'Comment' => $this ) );
  1157.  
  1158.             $this->ID = 0;
  1159.         }
  1160.  
  1161.         return $r;
  1162.     }
  1163.  
  1164. }
  1165.  
  1166.  
  1167. /*
  1168.  * $Log: _comment.class.php,v $
  1169.  * Revision 1.38.2.10  2007/03/22 00:04:16  blueyed
  1170.  * MFH: Escape author_url and author_User->url in author_url() template function
  1171.  *
  1172.  * Revision 1.38.2.9  2007/01/21 20:13:57  fplanque
  1173.  * MFH: comments http:// issue
  1174.  *
  1175.  * Revision 1.38.2.8  2006/11/23 01:59:07  fplanque
  1176.  * minor
  1177.  *
  1178.  * Revision 1.38.2.7  2006/11/17 22:36:42  blueyed
  1179.  * MFH: dbchanges param for AfterItemUpdate, AfterItemInsert, AfterCommentUpdate and AfterCommentInsert
  1180.  *
  1181.  * Revision 1.38.2.6  2006/11/04 19:54:53  fplanque
  1182.  * Reinjected old Log blocks. Removing them from CVS was a bad idea -- especially since Daniel has decided branch 1.9 was his HEAD...
  1183.  *
  1184.  * Revision 1.38  2006/07/26 17:15:44  blueyed
  1185.  * Replaced "name" attribute with "id" for anchors
  1186.  *
  1187.  * Revision 1.37  2006/07/04 17:32:29  fplanque
  1188.  * no message
  1189.  *
  1190.  * Revision 1.36  2006/06/22 18:37:47  fplanque
  1191.  * fixes
  1192.  *
  1193.  * Revision 1.35  2006/05/30 20:32:56  blueyed
  1194.  * Lazy-instantiate "expensive" properties of Comment and Item.
  1195.  *
  1196.  * Revision 1.34  2006/05/19 18:15:05  blueyed
  1197.  * Merged from v-1-8 branch
  1198.  *
  1199.  * Revision 1.33.2.1  2006/05/19 15:06:24  fplanque
  1200.  * dirty sync
  1201.  *
  1202.  * Revision 1.33  2006/05/04 10:05:39  blueyed
  1203.  * Fixed anchor in notification mails and shortened again, because of length.. probably it does not make sense to have get_anchor() anyway.. dunno..
  1204.  *
  1205.  * Revision 1.32  2006/05/04 04:07:24  blueyed
  1206.  * After posting a comment, add the anchor to the redirect param; also use more distinctive anchor name for comments
  1207.  *
  1208.  * Revision 1.31  2006/05/02 04:36:24  blueyed
  1209.  * Spam karma changed (-100..100 instead of abs/max); Spam weight for plugins; publish/delete threshold
  1210.  *
  1211.  * Revision 1.30  2006/05/02 01:27:55  blueyed
  1212.  * Moved nofollow handling to basic antispam plugin; added Filter events to Comment class
  1213.  *
  1214.  * Revision 1.29  2006/05/01 22:20:20  blueyed
  1215.  * Made rel="nofollow" optional (enabled); added Antispam settings page
  1216.  *
  1217.  * Revision 1.28  2006/04/29 23:27:10  blueyed
  1218.  * Only trigger update/insert/delete events if parent returns true
  1219.  *
  1220.  * Revision 1.27  2006/04/24 15:43:35  fplanque
  1221.  * no message
  1222.  *
  1223.  * Revision 1.26  2006/04/21 23:14:16  blueyed
  1224.  * Add Messages according to Comment's status.
  1225.  *
  1226.  * Revision 1.25  2006/04/21 18:10:53  blueyed
  1227.  * todos
  1228.  *
  1229.  * Revision 1.24  2006/04/20 00:00:21  blueyed
  1230.  * Fixed delete-link-button
  1231.  *
  1232.  * Revision 1.23  2006/04/19 22:08:16  blueyed
  1233.  * Fixed spam_karma()
  1234.  *
  1235.  * Revision 1.22  2006/04/19 19:52:27  blueyed
  1236.  * url-encode redirect_to param
  1237.  *
  1238.  * Revision 1.21  2006/04/19 13:05:21  fplanque
  1239.  * minor
  1240.  *
  1241.  * Revision 1.20  2006/04/18 20:17:25  fplanque
  1242.  * fast comment status switching
  1243.  *
  1244.  * Revision 1.19  2006/04/18 19:29:51  fplanque
  1245.  * basic comment status implementation
  1246.  *
  1247.  * Revision 1.18  2006/03/28 22:24:46  blueyed
  1248.  * Fixed logical spam karma issues
  1249.  *
  1250.  * Revision 1.17  2006/03/28 14:12:19  fplanque
  1251.  * minor fix
  1252.  *
  1253.  * Revision 1.16  2006/03/23 22:13:50  blueyed
  1254.  * doc
  1255.  *
  1256.  * Revision 1.15  2006/03/19 17:54:26  blueyed
  1257.  * Opt-out for email through message form.
  1258.  *
  1259.  * Revision 1.14  2006/03/18 23:38:44  blueyed
  1260.  * Decent getters; allow_msgform added
  1261.  *
  1262.  * Revision 1.13  2006/03/18 19:17:53  blueyed
  1263.  * Removed remaining use of $img_url
  1264.  *
  1265.  * Revision 1.12  2006/03/12 23:08:58  fplanque
  1266.  * doc cleanup
  1267.  *
  1268.  * Revision 1.11  2006/03/12 20:58:59  blueyed
  1269.  * doc
  1270.  *
  1271.  * Revision 1.9  2006/03/11 21:50:16  blueyed
  1272.  * Display spam_karma with comments
  1273.  *
  1274.  * Revision 1.8  2006/03/11 12:45:54  blueyed
  1275.  * fixed stupid regexp
  1276.  *
  1277.  * Revision 1.6  2006/03/09 22:29:59  fplanque
  1278.  * cleaned up permanent urls
  1279.  *
  1280.  * Revision 1.5  2006/03/09 21:58:52  fplanque
  1281.  * cleaned up permalinks
  1282.  *
  1283.  * Revision 1.4  2006/03/09 15:23:26  fplanque
  1284.  * fixed broken images
  1285.  *
  1286.  * Revision 1.3  2006/03/06 20:03:40  fplanque
  1287.  * comments
  1288.  *
  1289.  * Revision 1.1  2006/02/23 21:11:57  fplanque
  1290.  * File reorganization to MVC (Model View Controller) architecture.
  1291.  * See index.hml files in folders.
  1292.  * (Sorry for all the remaining bugs induced by the reorg... :/)
  1293.  *
  1294.  * Revision 1.24  2006/01/29 20:36:35  blueyed
  1295.  * Renamed Item::getBlog() to Item::get_Blog()
  1296.  *
  1297.  * Revision 1.23  2006/01/26 23:08:35  blueyed
  1298.  * Plugins enhanced.
  1299.  *
  1300.  * Revision 1.22  2005/12/12 19:21:21  fplanque
  1301.  * big merge; lots of small mods; hope I didn't make to many mistakes :]
  1302.  *
  1303.  * Revision 1.21  2005/12/11 19:59:51  blueyed
  1304.  * Renamed gen_permalink() to get_permalink()
  1305.  *
  1306.  * Revision 1.20  2005/11/04 21:42:22  blueyed
  1307.  * Use setter methods to set parameter values! dataobject::set_param() won't pass the parameter to dbchange() if it is already set to the same member value.
  1308.  *
  1309.  * Revision 1.19  2005/11/04 18:30:59  fplanque
  1310.  * no message
  1311.  *
  1312.  * Revision 1.18  2005/11/04 13:50:57  blueyed
  1313.  * Dataobject::set_param() / set(): return true if a value has been set and false if it did not change. It will not get considered for dbchange() then, too.
  1314.  *
  1315.  * Revision 1.17  2005/10/07 20:18:57  blueyed
  1316.  * Added TRANS comments
  1317.  *
  1318.  * Revision 1.16  2005/10/03 17:26:44  fplanque
  1319.  * synched upgrade with fresh DB;
  1320.  * renamed user_ID field
  1321.  *
  1322.  * Revision 1.15  2005/09/29 15:07:30  fplanque
  1323.  * spelling
  1324.  *
  1325.  * Revision 1.14  2005/09/06 17:13:54  fplanque
  1326.  * stop processing early if referer spam has been detected
  1327.  *
  1328.  * Revision 1.13  2005/08/30 18:26:04  fplanque
  1329.  * comment spam issues
  1330.  *
  1331.  * Revision 1.12  2005/08/09 15:22:40  fplanque
  1332.  * no message
  1333.  *
  1334.  * Revision 1.11  2005/08/08 22:35:56  blueyed
  1335.  * DEbuglog for send_email_notifications(), whitespace/code layout.
  1336.  *
  1337.  * Revision 1.10  2005/05/25 18:31:01  fplanque
  1338.  * implemented email notifications for new posts
  1339.  *
  1340.  * Revision 1.9  2005/05/25 17:13:33  fplanque
  1341.  * implemented email notifications on new comments/trackbacks
  1342.  *
  1343.  * Revision 1.8  2005/04/28 20:44:20  fplanque
  1344.  * normalizing, doc
  1345.  *
  1346.  * Revision 1.7  2005/04/12 18:58:16  fplanque
  1347.  * use TS_() instead of T_() for JavaScript strings
  1348.  *
  1349.  * Revision 1.6  2005/04/07 17:55:50  fplanque
  1350.  * minor changes
  1351.  *
  1352.  * Revision 1.5  2005/03/06 16:30:40  blueyed
  1353.  * deprecated global table names.
  1354.  *
  1355.  * Revision 1.4  2005/02/28 09:06:32  blueyed
  1356.  * removed constants for DB config (allows to override it from _config_TEST.php), introduced EVO_CONFIG_LOADED
  1357.  *
  1358.  * Revision 1.3  2004/12/09 21:21:19  fplanque
  1359.  * introduced foreign key support
  1360.  *
  1361.  * Revision 1.2  2004/10/14 18:31:25  blueyed
  1362.  * granting copyright
  1363.  *
  1364.  * Revision 1.1  2004/10/13 22:46:32  fplanque
  1365.  * renamed [b2]evocore/*
  1366.  *
  1367.  * Revision 1.33  2004/10/11 19:13:14  fplanque
  1368.  * Edited code documentation.
  1369.  *
  1370.  * Revision 1.32  2004/10/11 19:02:04  fplanque
  1371.  * Edited code documentation.
  1372.  *
  1373.  */
  1374. ?>

Documentation generated on Tue, 18 Dec 2007 19:13:07 +0100 by phpDocumentor 1.4.0