OSDN Git Service

sync the original code
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / libs / BLOG.php
1 <?php\r
2 \r
3 /*\r
4  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
5  * Copyright (C) 2002-2005 The Nucleus Group\r
6  *\r
7  * This program is free software; you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License\r
9  * as published by the Free Software Foundation; either version 2\r
10  * of the License, or (at your option) any later version.\r
11  * (see nucleus/documentation/index.html#license for more info)\r
12  */\r
13 /**\r
14  * A class representing a blog and containing functions to get that blog shown\r
15  * on the screen\r
16  *\r
17  * @license http://nucleuscms.org/license.txt GNU General Public License\r
18  * @copyright Copyright (C) 2002-2005 The Nucleus Group\r
19  * @version $Id: BLOG.php,v 1.4 2005-08-13 07:31:04 kimitake Exp $\r
20  * $NucleusJP: BLOG.php,v 1.3 2005/03/12 06:19:05 kimitake Exp $\r
21  */\r
22 class BLOG {\r
23         \r
24         // blog id\r
25         var $blogid;\r
26         \r
27         // ID of currently selected category\r
28         var $selectedcatid;\r
29         \r
30         // After creating an object of the blog class, contains true if the BLOG object is \r
31         // valid (the blog exists)\r
32         var $isValid;\r
33         \r
34         // associative array, containing all blogsettings (use the get/set functions instead)\r
35         var $settings;\r
36         \r
37         /**\r
38          * Creates a new BLOG object for the given blog\r
39          *\r
40          * @param $id blogid\r
41          */\r
42         function BLOG($id) {\r
43                 $this->blogid = intval($id);\r
44                 $this->readSettings();\r
45 \r
46                 // try to set catid \r
47                 // (the parse functions in SKIN.php will override this, so it's mainly useless)\r
48                 global $catid;\r
49                 $this->setSelectedCategory($catid);\r
50         }\r
51 \r
52         /**\r
53          * Shows the given amount of items for this blog\r
54          *\r
55          * @param $template\r
56          *              String representing the template _NAME_ (!)\r
57          * @param $amountEntries \r
58          *              amount of entries to show\r
59          * @param $startpos\r
60          *              offset from where items should be shown (e.g. 5 = start at fifth item)\r
61          * @returns int\r
62          *              amount of items shown\r
63          */\r
64         function readLog($template, $amountEntries, $offset = 0, $startpos = 0) {\r
65                 return $this->readLogAmount($template,$amountEntries,'','',1,1,$offset, $startpos);\r
66         }\r
67 \r
68         /**\r
69          * Shows an archive for a given month\r
70          *\r
71          * @param $year\r
72          *              year\r
73          * @param $month\r
74          *              month \r
75          * @param $template\r
76          *              String representing the template name to be used\r
77          */\r
78         function showArchive($templatename, $year, $month, $day=0) {\r
79                 \r
80                 // create extra where clause for select query\r
81                 if ($day == 0) {\r
82                         $timestamp_start = mktime(0,0,0,$month,1,$year);\r
83                         $timestamp_end = mktime(0,0,0,$month+1,1,$year);  // also works when $month==12\r
84                 } else {\r
85                         $timestamp_start = mktime(0,0,0,$month,$day,$year);\r
86                         $timestamp_end = mktime(0,0,0,$month,$day+1,$year);  \r
87                 }\r
88                 $extra_query = ' and i.itime>=' . mysqldate($timestamp_start)\r
89                              . ' and i.itime<' . mysqldate($timestamp_end);\r
90                 \r
91         \r
92                 $this->readLogAmount($templatename,0,$extra_query,'',1,1);\r
93 \r
94         }\r
95 \r
96 \r
97         // sets/gets current category (only when category exists)\r
98         function setSelectedCategory($catid) {\r
99                 if ($this->isValidCategory($catid) || (intval($catid) == 0)) \r
100                         $this->selectedcatid = intval($catid);\r
101         }\r
102         \r
103         function setSelectedCategoryByName($catname) {\r
104                 $this->setSelectedCategory($this->getCategoryIdFromName($catname));\r
105         }\r
106 \r
107         function getSelectedCategory() { \r
108                 return $this->selectedcatid; \r
109         }\r
110 \r
111         /**\r
112          * Shows the given amount of items for this blog\r
113          *\r
114          * @param $template\r
115          *              String representing the template _NAME_ (!)\r
116          * @param $amountEntries\r
117          *              amount of entries to show (0 = no limit)\r
118          * @param $extraQuery\r
119          *              extra conditions to be added to the query\r
120          * @param $highlight\r
121          *              contains a query that should be highlighted\r
122          * @param $comments\r
123          *              1=show comments 0=don't show comments\r
124          * @param $dateheads\r
125          *              1=show dateheads 0=don't show dateheads\r
126          * @param $offset\r
127          *              offset\r
128          * @returns int\r
129          *              amount of items shown\r
130          */\r
131         function readLogAmount($template, $amountEntries, $extraQuery, $highlight, $comments, $dateheads, $offset = 0, $startpos = 0) {\r
132 \r
133                 $query = $this->getSqlBlog($extraQuery);\r
134                 \r
135                 if ($amountEntries > 0) {\r
136                         // $offset zou moeten worden:\r
137                         // (($startpos / $amountentries) + 1) * $offset ... later testen ...\r
138                        $query .= ' LIMIT ' . intval($startpos + $offset).',' . intval($amountEntries);\r
139                 }\r
140                 return $this->showUsingQuery($template, $query, $highlight, $comments, $dateheads);\r
141         }\r
142 \r
143         function showUsingQuery($templateName, $query, $highlight = '', $comments = 0, $dateheads = 1) {\r
144                 global $CONF, $manager;\r
145 \r
146                 $lastVisit = cookieVar($CONF['CookiePrefix'] .'lastVisit');\r
147                 if ($lastVisit != 0)\r
148                         $lastVisit = $this->getCorrectTime($lastVisit);\r
149 \r
150                 // set templatename as global variable (so plugins can access it)\r
151                 global $currentTemplateName;\r
152                 $currentTemplateName = $templateName;\r
153                 \r
154                 $template =& $manager->getTemplate($templateName);\r
155                 \r
156                 // create parser object & action handler\r
157                 $actions =& new ITEMACTIONS($this);\r
158                 $parser =& new PARSER($actions->getDefinedActions(),$actions);\r
159                 $actions->setTemplate($template);\r
160                 $actions->setHighlight($highlight);\r
161                 $actions->setLastVisit($lastVisit);\r
162                 $actions->setParser($parser);\r
163                 $actions->setShowComments($comments);\r
164 \r
165                 // execute query\r
166                 $items = sql_query($query);\r
167                 \r
168                 // loop over all items\r
169                 while ($item = mysql_fetch_object($items)) {\r
170                         \r
171                         $item->timestamp = strtotime($item->itime);     // string timestamp -> unix timestamp\r
172                 \r
173                         // action handler needs to know the item we're handling\r
174                         $actions->setCurrentItem($item);\r
175                         \r
176                         // add date header if needed\r
177                         if ($dateheads) {\r
178                                 $new_date = date('dFY',$item->timestamp);\r
179                                 if ($new_date != $old_date) {\r
180                                         // unless this is the first time, write date footer\r
181                                         $timestamp = $item->timestamp;\r
182                                         if ($old_date != 0) {\r
183                                                 $oldTS = strtotime($old_date);\r
184                                                 $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => $oldTS));\r
185                                                 $parser->parse(strftime($template['DATE_FOOTER'], $oldTS));\r
186                                                 $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => $oldTS));                                                \r
187                                         }\r
188                                         $manager->notify('PreDateHead',array('blog' => &$this, 'timestamp' => $timestamp));\r
189                                         // note, to use templatvars in the dateheader, the %-characters need to be doubled in\r
190                                         // order to be preserved by strftime\r
191                                         $parser->parse(strftime($template['DATE_HEADER'],$timestamp));\r
192                                         $manager->notify('PostDateHead',array('blog' => &$this, 'timestamp' => $timestamp));                                    \r
193                                 }\r
194                                 $old_date = $new_date;\r
195                         }\r
196                         \r
197                         // parse item \r
198                         $parser->parse($template['ITEM_HEADER']);\r
199                         $manager->notify('PreItem', array('blog' => &$this, 'item' => &$item));                 \r
200                         $parser->parse($template['ITEM']);                      \r
201                         $manager->notify('PostItem', array('blog' => &$this, 'item' => &$item));                        \r
202                         $parser->parse($template['ITEM_FOOTER']);\r
203 \r
204                 }\r
205                 \r
206                 $numrows = mysql_num_rows($items);\r
207                 \r
208                 // add another date footer if there was at least one item\r
209                 if (($numrows > 0) && $dateheads) {\r
210                         $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));           \r
211                         $parser->parse($template['DATE_FOOTER']);\r
212                         $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));\r
213                 }\r
214                 \r
215                 mysql_free_result($items);      // free memory\r
216                 \r
217                 return $numrows;\r
218                 \r
219         }        \r
220         \r
221         function showOneitem($itemid, $template, $highlight) {\r
222                 $extraQuery = ' and inumber=' . intval($itemid);\r
223                 \r
224                 return $this->readLogAmount($template, 1, $extraQuery, $highlight, 0, 0);\r
225         }\r
226         \r
227 \r
228         /**\r
229           * Adds an item to this blog\r
230           */\r
231         function additem($catid, $title, $body, $more, $blogid, $authorid, $timestamp, $closed, $draft) {\r
232                 global $manager;\r
233 \r
234                 $blogid         = intval($blogid);\r
235                 $authorid       = intval($authorid);\r
236                 $title          = $title;\r
237                 $body           = $body;\r
238                 $more           = $more;\r
239                 $catid          = intval($catid);\r
240 \r
241                 // convert newlines to <br />\r
242                 if ($this->convertBreaks()) {\r
243                         $body = addBreaks($body);\r
244                         $more = addBreaks($more);\r
245                 }\r
246                 \r
247                 if ($closed != '1')     $closed = '0';\r
248                 if ($draft != '0') $draft = '1';\r
249 \r
250                 if (!$this->isValidCategory($catid))\r
251                         $catid = $this->getDefaultCategory();\r
252                 \r
253                 if ($timestamp > $this->getCorrectTime())\r
254                         $isFuture = 1;\r
255 \r
256                 $timestamp = date('Y-m-d H:i:s',$timestamp);\r
257 \r
258                 $manager->notify('PreAddItem',array('title' => &$title, 'body' => &$body, 'more' => &$more, 'blog' => &$this, 'authorid' => &$authorid, 'timestamp' => &$timestamp, 'closed' => &$closed, 'draft' => &$draft, 'catid' => &$catid));\r
259 \r
260                 $title = addslashes($title);\r
261                 $body = addslashes($body);\r
262                 $more = addslashes($more);\r
263 \r
264                 $query = 'INSERT INTO '.sql_table('item').' (ITITLE, IBODY, IMORE, IBLOG, IAUTHOR, ITIME, ICLOSED, IDRAFT, ICAT) '\r
265                        . "VALUES ('$title', '$body', '$more', $blogid, $authorid, '$timestamp', $closed, $draft, $catid)";\r
266                 sql_query($query);  \r
267                 $itemid = mysql_insert_id();\r
268                 \r
269                 $manager->notify('PostAddItem',array('itemid' => $itemid));\r
270                 \r
271                 if (!$draft) \r
272                         $this->updateUpdateFile();\r
273                 \r
274                 // send notification mail\r
275                 if (!$draft && !$isFuture && $this->getNotifyAddress() && $this->notifyOnNewItem()) \r
276                         $this->sendNewItemNotification($itemid, stripslashes($title), stripslashes($body));\r
277                 \r
278                 return $itemid;\r
279         }\r
280         \r
281         function sendNewItemNotification($itemid, $title, $body) {\r
282                 global $CONF, $member;\r
283                 \r
284                 // create text version of html post\r
285                 $ascii = toAscii($body);\r
286 \r
287                 $mailto_msg = _NOTIFY_NI_MSG . " \n";\r
288                 $mailto_msg .= $CONF['IndexURL'] . 'index.php?itemid=' . $itemid . "\n\n";\r
289                 $mailto_msg .= _NOTIFY_TITLE . ' ' . strip_tags($title) . "\n";\r
290                 $mailto_msg .= _NOTIFY_CONTENTS . "\n " . $ascii . "\n";\r
291                 $mailto_msg .= getMailFooter();\r
292                 \r
293                 $mailto_title = $this->getName() . ': ' . _NOTIFY_NI_TITLE;\r
294                         \r
295                 $frommail = $member->getNotifyFromMailAddress();\r
296 \r
297                 $notify =& new NOTIFICATION($this->getNotifyAddress());\r
298                 $notify->notify($mailto_title, $mailto_msg , $frommail);\r
299                                 \r
300 \r
301 \r
302         }\r
303 \r
304         \r
305         /**\r
306           * Creates a new category for this blog\r
307           *\r
308           * @param $catName\r
309           *             name of the new category. When empty, a name is generated automatically \r
310           *             (starting with newcat)\r
311           * @param $catDescription\r
312           *             description of the new category. Defaults to 'New Category'\r
313           *\r
314           * @returns \r
315           *             the new category-id in case of success. \r
316           *             0 on failure\r
317           */\r
318         function createNewCategory($catName = '', $catDescription = 'New category') {\r
319                 global $member, $manager;\r
320 \r
321                 if ($member->blogAdminRights($this->getID())) {\r
322                         // generate \r
323                         if ($catName == '')\r
324                         {\r
325                                 $catName = 'newcat';\r
326                                 $i = 1;\r
327                                 while(mysql_num_rows(sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID())) > 0) \r
328                                         $i++;\r
329                                 $catName = $catName . $i;\r
330                         }\r
331                         \r
332                         $manager->notify(\r
333                                 'PreAddCategory',\r
334                                 array(\r
335                                         'blog' => &$this,\r
336                                         'name' => &$catName,\r
337                                         'description' => $catDescription\r
338                                 )\r
339                         );\r
340                         \r
341                         $query = 'INSERT INTO '.sql_table('category').' (cblog, cname, cdesc) VALUES (' . $this->getID() . ", '" . addslashes($catName) . "', '" . addslashes($catDescription) . "')";\r
342                         sql_query($query);\r
343                         $catid = mysql_insert_id();\r
344                         \r
345                         $manager->notify(\r
346                                 'PostAddCategory',\r
347                                 array(\r
348                                         'blog' => &$this,\r
349                                         'name' => $catName,\r
350                                         'description' => $catDescription,\r
351                                         'catid' => $catid\r
352                                 )\r
353                         );                      \r
354                         \r
355                         return $catid;\r
356                 } else {\r
357                         return 0;\r
358                 }\r
359         \r
360         }       \r
361 \r
362 \r
363         /**\r
364          * Searches all months of this blog for the given query\r
365          *\r
366          * @param $query\r
367          *              search query\r
368          * @param $template\r
369          *              template to be used (__NAME__ of the template)\r
370          * @param $amountMonths\r
371          *              max amount of months to be search (0 = all)\r
372          * @param $maxresults\r
373          *              max number of results to show\r
374          * @param $startpos\r
375          *              offset\r
376          * @returns\r
377          *              amount of hits found\r
378          */\r
379         function search($query, $template, $amountMonths, $maxresults, $startpos) {\r
380         global $CONF, $manager;\r
381 \r
382                 $highlight      = '';\r
383                 $sqlquery       = $this->getSqlSearch($query, $amountMonths, $highlight);\r
384                 \r
385                 if ($sqlquery == '')\r
386                 {\r
387                         // no query -> show everything\r
388             $extraquery = '';\r
389                     $amountfound = $this->readLogAmount($template, $maxresults, $extraQuery, $query, 1, 1);\r
390                 } else {\r
391                 \r
392                         // add LIMIT to query (to split search results into pages)\r
393             if (intval($maxresults > 0)) \r
394                     $sqlquery .= ' LIMIT ' . intval($startpos).',' . intval($maxresults);\r
395 \r
396                         // show results\r
397                     $amountfound = $this->showUsingQuery($template, $sqlquery, $highlight, 1, 1);\r
398                     \r
399                         // when no results were found, show a message \r
400                 if ($amountfound == 0) \r
401                 {\r
402                         $template =& $manager->getTemplate($template);\r
403                         $vars = array(\r
404                                 'query'         => htmlspecialchars($query),\r
405                                 'blogid'        => $this->getID()\r
406                         );\r
407                         echo TEMPLATE::fill($template['SEARCH_NOTHINGFOUND'],$vars);\r
408                 }\r
409         }\r
410         \r
411                 return $amountfound;\r
412         }\r
413         \r
414         /**\r
415          * Returns an SQL query to use for a search query\r
416          *\r
417          * @param $query\r
418          *              search query\r
419          * @param $amountMonths\r
420          *              amount of months to search back. Default = 0 = unlimited\r
421          * @param $mode\r
422          *              either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query\r
423          * @returns $highlight\r
424          *              words to highlight (out parameter)\r
425          * @returns \r
426          *              either a full SQL query, or an empty string (if querystring empty)\r
427          * @note\r
428          *              No LIMIT clause is added. (caller should add this if multiple pages are requested)\r
429          */\r
430         function getSqlSearch($query, $amountMonths = 0, &$highlight, $mode = '')\r
431         {\r
432         $searchclass =& new SEARCH($query);\r
433         \r
434         $highlight        = $searchclass->inclusive;\r
435         \r
436         // if querystring is empty, return empty string\r
437         if ($searchclass->inclusive == '') \r
438                 return '';\r
439             \r
440            \r
441                 $where  = $searchclass->boolean_sql_where('ititle,ibody,imore');\r
442                 $select = $searchclass->boolean_sql_select('ititle,ibody,imore');\r
443 \r
444                 // get list of blogs to search\r
445                 $blogs          = $searchclass->blogs;          // array containing blogs that always need to be included\r
446                 $blogs[]        = $this->getID();                       // also search current blog (duh)\r
447                 $blogs          = array_unique($blogs);         // remove duplicates\r
448                 $selectblogs = '';\r
449                 if (count($blogs) > 0)\r
450                         $selectblogs = ' and i.iblog in (' . implode(',', $blogs) . ')';\r
451 \r
452                 if ($mode == '') \r
453                 {\r
454                         $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed';\r
455                         if ($select) \r
456                                 $query .= ', '.$select. ' as score ';\r
457                 } else {\r
458                         $query = 'SELECT COUNT(*) as result ';\r
459                 }\r
460                         \r
461                 $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c'\r
462                            . ' WHERE i.iauthor=m.mnumber'\r
463                            . ' and i.icat=c.catid'\r
464                            . ' and i.idraft=0'  // exclude drafts\r
465                            . $selectblogs\r
466                                         // don't show future items\r
467                            . ' and i.itime<=' . mysqldate($this->getCorrectTime())\r
468                            . ' and '.$where;\r
469 \r
470                 // take into account amount of months to search\r
471                 if ($amountMonths > 0) \r
472                 {\r
473                         $localtime = getdate($this->getCorrectTime());\r
474                         $timestamp_start = mktime(0,0,0,$localtime['mon'] - $amountMonths,1,$localtime['year']);\r
475                         $query .= ' and i.itime>' . mysqldate($timestamp_start);\r
476                 }\r
477 \r
478                 if ($mode == '')\r
479                 {\r
480                         if ($select) \r
481                                 $query .= ' ORDER BY score DESC';\r
482                         else \r
483                                 $query .= ' ORDER BY i.itime DESC ';\r
484                 }\r
485 \r
486                 return $query;          \r
487         }\r
488         \r
489         /**\r
490          * Returns the SQL query that's normally used to display the blog items on the index type skins\r
491          *\r
492          * @param $mode\r
493          *              either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query\r
494          * @returns \r
495          *              either a full SQL query, or an empty string \r
496          * @note\r
497          *              No LIMIT clause is added. (caller should add this if multiple pages are requested)\r
498          */\r
499         function getSqlBlog($extraQuery, $mode = '')\r
500         {\r
501                 if ($mode == '')\r
502                         $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed';\r
503                 else\r
504                         $query = 'SELECT COUNT(*) as result ';\r
505                 \r
506                 $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c'\r
507                        . ' WHERE i.iblog='.$this->blogid\r
508                        . ' and i.iauthor=m.mnumber'\r
509                        . ' and i.icat=c.catid'\r
510                        . ' and i.idraft=0'      // exclude drafts\r
511                                         // don't show future items\r
512                        . ' and i.itime<=' . mysqldate($this->getCorrectTime());\r
513 \r
514                 if ($this->getSelectedCategory())\r
515                         $query .= ' and i.icat=' . $this->getSelectedCategory() . ' ';\r
516 \r
517 \r
518                 $query .= $extraQuery;\r
519                 \r
520                 if ($mode == '')\r
521                         $query .= ' ORDER BY i.itime DESC';\r
522                        \r
523                 return $query;\r
524         }\r
525 \r
526         /**\r
527           * Shows the archivelist using the given template\r
528           */\r
529         function showArchiveList($template, $mode = 'month', $limit = 0) {\r
530                 global $CONF, $catid, $manager;\r
531 \r
532                 if ($catid) \r
533                         $linkparams = array('catid' => $catid);\r
534                 \r
535                 $template =& $manager->getTemplate($template);\r
536                 $data['blogid'] = $this->getID();\r
537 \r
538                 echo TEMPLATE::fill($template['ARCHIVELIST_HEADER'],$data);\r
539 \r
540                 $query = 'SELECT itime, SUBSTRING(itime,1,4) AS Year, SUBSTRING(itime,6,2) AS Month, SUBSTRING(itime,9,2) as Day FROM '.sql_table('item')\r
541                 . ' WHERE iblog=' . $this->getID()\r
542                 . ' and itime <=' . mysqldate($this->getCorrectTime())  // don't show future items!\r
543                 . ' and idraft=0'; // don't show draft items\r
544                 \r
545                 if ($catid)\r
546                         $query .= ' and icat=' . intval($catid);\r
547                 \r
548                 $query .= ' GROUP BY Year, Month';\r
549                 if ($mode == 'day')\r
550                         $query .= ', Day';\r
551                 \r
552                         \r
553                 $query .= ' ORDER BY itime DESC';                               \r
554                 \r
555                 if ($limit > 0) \r
556                         $query .= ' LIMIT ' . intval($limit);\r
557                 \r
558                 $res = sql_query($query);\r
559 \r
560                 while ($current = mysql_fetch_object($res)) {\r
561                         $current->itime = strtotime($current->itime);   // string time -> unix timestamp\r
562                 \r
563                         if ($mode == 'day') {\r
564                                 $archivedate = date('Y-m-d',$current->itime);\r
565                                 $archive['day'] = date('d',$current->itime);\r
566                         } else {\r
567                                 $archivedate = date('Y-m',$current->itime);                     \r
568                         }\r
569                         $data['month'] = date('m',$current->itime);\r
570                         $data['year'] = date('Y',$current->itime);\r
571                         $data['archivelink'] = createArchiveLink($this->getID(),$archivedate,$linkparams);\r
572 \r
573                         $temp = TEMPLATE::fill($template['ARCHIVELIST_LISTITEM'],$data);\r
574                         echo strftime($temp,$current->itime);\r
575 \r
576                 }\r
577                 \r
578                 mysql_free_result($res);\r
579 \r
580                 echo TEMPLATE::fill($template['ARCHIVELIST_FOOTER'],$data);\r
581         }\r
582         \r
583 \r
584         /**\r
585           * Shows the list of categories using a given template\r
586           */\r
587         function showCategoryList($template) {\r
588                 global $CONF, $manager;\r
589                 \r
590                 // determine arguments next to catids\r
591                 // I guess this can be done in a better way, but it works\r
592                 global $archive, $archivelist;\r
593                 \r
594                 $linkparams = array();\r
595                 if ($archive) {\r
596                         $blogurl = createArchiveLink($this->getID(), $archive, '');\r
597                         $linkparams['blogid'] = $this->getID();\r
598                         $linkparams['archive'] = $archive;\r
599                 } else if ($archivelist) {\r
600                         $blogurl = createArchiveListLink($this->getID(), '');\r
601                         $linkparams['archivelist'] = $archivelist;\r
602                 } else {\r
603                         $blogurl = createBlogidLink($this->getID(), '');\r
604                         $linkparams['blogid'] = $this->getID();\r
605                 } \r
606                         \r
607                 //$blogurl = $this->getURL() . $qargs;\r
608                 $blogurl = createBlogLink($this->getURL(), $linkparams);\r
609 \r
610                 $template =& $manager->getTemplate($template);\r
611 \r
612                 echo TEMPLATE::fill($template['CATLIST_HEADER'],\r
613                                                         array(\r
614                                                                 'blogid' => $this->getID(),\r
615                                                                 'blogurl' => $blogurl,\r
616                                                                 'self' => $CONF['Self']\r
617                                                         ));\r
618 \r
619                 $query = 'SELECT catid, cdesc as catdesc, cname as catname FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' ORDER BY cname ASC';\r
620                 $res = sql_query($query);\r
621 \r
622 \r
623                 while ($data = mysql_fetch_assoc($res)) {\r
624                         $data['blogid'] = $this->getID();       \r
625                         $data['blogurl'] = $blogurl;\r
626                         $data['catlink'] = createCategoryLink($data['catid'], $linkparams);\r
627                         $data['self'] = $CONF['Self'];\r
628 \r
629                         $temp = TEMPLATE::fill($template['CATLIST_LISTITEM'],$data);\r
630                         echo strftime($temp,$current->itime);\r
631 \r
632                 }\r
633                 \r
634                 mysql_free_result($res);\r
635 \r
636                 echo TEMPLATE::fill($template['CATLIST_FOOTER'],\r
637                                                         array(\r
638                                                                 'blogid' => $this->getID(),\r
639                                                                 'blogurl' => $blogurl,\r
640                                                                 'self' => $CONF['Self']                                                         \r
641                                                         ));\r
642         }\r
643 \r
644         /**\r
645           * Blogsettings functions\r
646           */\r
647           \r
648         function readSettings() {\r
649                 $query =  'SELECT *'\r
650                        . ' FROM '.sql_table('blog')\r
651                        . ' WHERE bnumber=' . $this->blogid;\r
652                 $res = sql_query($query);\r
653                 \r
654                 $this->isValid = (mysql_num_rows($res) > 0);\r
655                 if (!$this->isValid)\r
656                         return;\r
657                 \r
658                 $this->settings = mysql_fetch_assoc($res);\r
659         }\r
660         \r
661         function writeSettings() {\r
662         \r
663                 // (can't use floatval since not available prior to PHP 4.2)\r
664                 $offset = $this->getTimeOffset();\r
665                 if (!is_float($offset))\r
666                         $offset = intval($offset);\r
667                 \r
668                 $query =  'UPDATE '.sql_table('blog')\r
669                        . " SET bname='" . addslashes($this->getName()) . "',"\r
670                        . "     bshortname='". addslashes($this->getShortName()) . "',"\r
671                        . "     bcomments=". intval($this->commentsEnabled()) . ","\r
672                        . "     bmaxcomments=" . intval($this->getMaxComments()) . ","\r
673                        . "     btimeoffset=" . $offset . ","\r
674                        . "     bpublic=" . intval($this->isPublic()) . ","\r
675                        . "     bsendping=" . intval($this->pingUserland()) . ","\r
676                        . "     bconvertbreaks=" . intval($this->convertBreaks()) . ","\r
677                        . "     ballowpast=" . intval($this->allowPastPosting()) . ","                      \r
678                        . "     bnotify='" . addslashes($this->getNotifyAddress()) . "',"\r
679                        . "     bnotifytype=" . intval($this->getNotifyType()) . ","                    \r
680                        . "     burl='" . addslashes($this->getURL()) . "',"\r
681                        . "     bupdate='" . addslashes($this->getUpdateFile()) . "',"\r
682                        . "     bdesc='" . addslashes($this->getDescription()) . "',"\r
683                        . "     bdefcat=" . intval($this->getDefaultCategory()) . ","                   \r
684                        . "     bdefskin=" . intval($this->getDefaultSkin()) . ","\r
685                        . "     bincludesearch=" . intval($this->getSearchable())\r
686                        . " WHERE bnumber=" . intval($this->getID());\r
687                 sql_query($query);\r
688 \r
689         }\r
690         \r
691 \r
692                 \r
693         // update update file if requested\r
694         function updateUpdatefile() {\r
695                  if ($this->getUpdateFile()) {\r
696                         $f_update = fopen($this->getUpdateFile(),'w');\r
697                         fputs($f_update,$this->getCorrectTime());\r
698                         fclose($f_update);\r
699                  }\r
700 \r
701         }\r
702         \r
703         /**\r
704           * Sends a XML-RPC ping message to Userland, so the weblog can\r
705           * show up in the weblogs.com updates-list\r
706           */\r
707         function sendUserlandPing() {\r
708                 global $php_errormsg;\r
709                 \r
710                  if ($this->pingUserland()) {\r
711                           // testmessage for adding an item\r
712                           $message = new xmlrpcmsg('weblogUpdates.ping',array(\r
713                                         new xmlrpcval($this->getName(),'string'),       \r
714                                         new xmlrpcval($this->getURL(),'string')\r
715                           ));\r
716                           \r
717                           $c = new xmlrpc_client('/RPC2', 'rpc.weblogs.com', 80);\r
718 \r
719                           // $c->setDebug(1);\r
720 \r
721                           $r = $c->send($message,15); // 15 seconds timeout...\r
722                           \r
723                           if (($r == 0) && ($r->errno || $r->errstring)) {\r
724                                 return 'Error ' . $r->errno . ' : ' . $r->errstring;\r
725                           } elseif (($r == 0) && ($php_errormsg)) {\r
726                                 return 'PHP Error: ' . $php_errormsg;\r
727                           } elseif ($r == 0) {\r
728                                 return 'Error while trying to send ping. Sorry about that.';\r
729                           } elseif ($r->faultCode() != 0) {\r
730                                 return 'Error: ' . $r->faultString();\r
731                           } else {\r
732                                   $r = $r->value();     // get response struct\r
733                                   // get values\r
734                                   $flerror = $r->structmem('flerror');\r
735                                   $flerror = $flerror->scalarval();\r
736  \r
737                                   \r
738                                   $message = $r->structmem('message');\r
739                                   $message = $message->scalarval();\r
740 \r
741                                   if ($flerror != 0)\r
742                                         return 'Error (flerror=1): ' . $message;\r
743                                   else\r
744                                         return 'Success: ' . $message;\r
745                           }                       \r
746                  }\r
747         }\r
748         \r
749         function isValidCategory($catid) {\r
750                 $query = 'SELECT * FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' and catid=' . intval($catid);\r
751                 return (mysql_num_rows(mysql_query($query)) != 0);\r
752         }\r
753         \r
754         function getCategoryName($catid) {\r
755                 $res = mysql_query('SELECT cname FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));\r
756                 $o = mysql_fetch_object($res);\r
757                 return $o->cname;\r
758         }\r
759         \r
760         function getCategoryDesc($catid) {\r
761                 $res = mysql_query('SELECT cdesc FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));\r
762                 $o = mysql_fetch_object($res);\r
763                 return $o->cdesc;\r
764         }\r
765 \r
766         function getCategoryIdFromName($name) {\r
767                 $res = mysql_query('SELECT catid FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and cname="' . addslashes($name) . '"');\r
768                 if (mysql_num_rows($res) > 0) {\r
769                         $o = mysql_fetch_object($res);\r
770                         return $o->catid;       \r
771                 } else {\r
772                         return $this->getDefaultCategory();\r
773                 }\r
774         }\r
775         \r
776         function pingUserland() {\r
777                 return $this->getSetting('bsendping');\r
778         }\r
779         \r
780         function setPingUserland($val) {\r
781                 $this->setSetting('bsendping',$val);\r
782         }\r
783         \r
784         function convertBreaks() {\r
785                 return $this->getSetting('bconvertbreaks');\r
786         }\r
787         \r
788         function insertJavaScriptInfo($authorid = '') {\r
789                 global $member, $CONF;\r
790                 \r
791                 if ($authorid == '')    \r
792                         $authorid = $member->getID();\r
793                         \r
794                 ?>\r
795                 <script type="text/javascript">\r
796                         setConvertBreaks(<?php echo  $this->convertBreaks() ? 'true' : 'false' ?>);\r
797                         setMediaUrl("<?php echo $CONF['MediaURL']?>");\r
798                         setAuthorId(<?php echo $authorid?>);\r
799                 </script><?php  }\r
800         \r
801         function setConvertBreaks($val) {\r
802                 $this->setSetting('bconvertbreaks',$val);\r
803         }\r
804         function setAllowPastPosting($val) {\r
805                 $this->setSetting('ballowpast',$val);\r
806         }               \r
807         function allowPastPosting() {\r
808                 return $this->getSetting('ballowpast');\r
809         }\r
810         \r
811         function getCorrectTime($t=0) {\r
812                 if ($t == 0) $t = time();\r
813                 return ($t + 3600 * $this->getTimeOffset());\r
814         }\r
815         \r
816         function getName() {\r
817                 return $this->getSetting('bname');\r
818         }\r
819         \r
820         function getShortName() {\r
821                 return $this->getSetting('bshortname');\r
822         }\r
823         \r
824         function getMaxComments() {\r
825                 return $this->getSetting('bmaxcomments');\r
826         }\r
827         \r
828         function getNotifyAddress() {\r
829                 return $this->getSetting('bnotify');\r
830         }\r
831         \r
832         function getNotifyType() {\r
833                 return $this->getSetting('bnotifytype');\r
834         }\r
835         \r
836         function notifyOnComment() {\r
837                 $n = $this->getNotifyType();\r
838                 return (($n != 0) && (($n % 3) == 0));\r
839         }\r
840 \r
841         function notifyOnVote() {\r
842                 $n = $this->getNotifyType();\r
843                 return (($n != 0) && (($n % 5) == 0));\r
844         }\r
845 \r
846         function notifyOnNewItem() {\r
847                 $n = $this->getNotifyType();\r
848                 return (($n != 0) && (($n % 7) == 0));\r
849         }\r
850         \r
851         function setNotifyType($val) {\r
852                 $this->setSetting('bnotifytype',$val);  \r
853         }\r
854         \r
855 \r
856         function getTimeOffset() {\r
857                 return $this->getSetting('btimeoffset');\r
858         }\r
859         \r
860         function commentsEnabled() {\r
861                 return $this->getSetting('bcomments');\r
862         }\r
863         \r
864         function getURL() {\r
865                 return $this->getSetting('burl');\r
866         }\r
867         \r
868         function getDefaultSkin() {\r
869                 return $this->getSetting('bdefskin');\r
870         }\r
871         \r
872         function getUpdateFile() {\r
873                 return $this->getSetting('bupdate');\r
874         }\r
875         \r
876         function getDescription() {\r
877                 return $this->getSetting('bdesc');\r
878         }\r
879         \r
880         function isPublic() {\r
881                 return $this->getSetting('bpublic');\r
882         }\r
883         \r
884         function getSearchable() {\r
885                 return $this->getSetting('bincludesearch');\r
886         }\r
887 \r
888         function getDefaultCategory() {\r
889                 return $this->getSetting('bdefcat');\r
890         }\r
891         \r
892         function setPublic($val) {\r
893                 $this->setSetting('bpublic',$val);\r
894         }\r
895 \r
896         function setSearchable($val) {\r
897                 $this->setSetting('bincludesearch',$val);\r
898         }\r
899 \r
900         function setDescription($val) {\r
901                 $this->setSetting('bdesc',$val);\r
902         }\r
903 \r
904         function setUpdateFile($val) {\r
905                 $this->setSetting('bupdate',$val);\r
906         }\r
907         \r
908         function setDefaultSkin($val) {\r
909                 $this->setSetting('bdefskin',$val);\r
910         }\r
911         \r
912         function setURL($val) {\r
913                 $this->setSetting('burl',$val);\r
914         }\r
915         \r
916         function setName($val) {\r
917                 $this->setSetting('bname',$val);\r
918         }\r
919         \r
920         function setShortName($val) {\r
921                 $this->setSetting('bshortname',$val);\r
922         }\r
923         \r
924         function setCommentsEnabled($val) { \r
925                 $this->setSetting('bcomments',$val);\r
926         }\r
927         \r
928         function setMaxComments($val) {\r
929                 $this->setSetting('bmaxcomments',$val);\r
930         }\r
931         \r
932         function setNotifyAddress($val) {\r
933                 $this->setSetting('bnotify',$val);\r
934         }\r
935         \r
936         function setTimeOffset($val) {\r
937                 // check validity of value\r
938                 // 1. replace , by . (common mistake)\r
939                 $val = str_replace(',','.',$val);\r
940                 // 2. cast to float or int\r
941                 if (is_numeric($val) && strstr($val,'.5')) {\r
942                         $val = (float) $val;\r
943                 } else {\r
944                         $val = intval($val);\r
945                 }\r
946         \r
947                 $this->setSetting('btimeoffset',$val);\r
948         }\r
949         \r
950         function setDefaultCategory($val) {\r
951                 $this->setSetting('bdefcat',$val);\r
952         }\r
953 \r
954         function getSetting($key) {\r
955                 return $this->settings[$key];\r
956         }\r
957         \r
958         function setSetting($key,$value) {\r
959                 $this->settings[$key] = $value;\r
960         }\r
961         \r
962         \r
963         // tries to add a member to the team. Returns false if the member was already on\r
964         // the team\r
965         function addTeamMember($memberid, $admin) {\r
966                 global $manager;\r
967                 \r
968                 $memberid = intval($memberid);\r
969                 $admin = intval($admin);\r
970                 \r
971                 // check if member is already a member\r
972                 $tmem = MEMBER::createFromID($memberid);\r
973                 \r
974                 if ($tmem->isTeamMember($this->getID()))\r
975                         return 0;\r
976                 \r
977                 $manager->notify(\r
978                         'PreAddTeamMember',\r
979                         array(\r
980                                 'blog' => &$this,\r
981                                 'member' => &$tmem,\r
982                                 'admin' => &$admin\r
983                         )\r
984                 );\r
985                 \r
986                 // add to team\r
987                 $query = 'INSERT INTO '.sql_table('team').' (TMEMBER, TBLOG, TADMIN) '\r
988                        . 'VALUES (' . $memberid .', '.$this->getID().', "'.$admin.'")';\r
989                 sql_query($query);\r
990                 \r
991                 $manager->notify(\r
992                         'PostAddTeamMember',\r
993                         array(\r
994                                 'blog' => &$this,\r
995                                 'member' => &$tmem,\r
996                                 'admin' => $admin\r
997                         )\r
998                         \r
999                 );\r
1000                 \r
1001                 ACTIONLOG::add(INFO, 'Added ' . $tmem->getDisplayName() . ' (ID=' .\r
1002                                $memberid .') to the team of blog "' . $this->getName() . '"');\r
1003                 \r
1004                 return 1;\r
1005         }\r
1006         \r
1007         function getID() {\r
1008                 return $this->blogid;\r
1009         }\r
1010         \r
1011         // returns true if there is a blog with the given shortname (static)\r
1012         function exists($name) {\r
1013                 $r = sql_query('select * FROM '.sql_table('blog').' WHERE bshortname="'.addslashes($name).'"');\r
1014                 return (mysql_num_rows($r) != 0);\r
1015         }\r
1016 \r
1017         // returns true if there is a blog with the given ID (static)\r
1018         function existsID($id) {\r
1019                 $r = sql_query('select * FROM '.sql_table('blog').' WHERE bnumber='.intval($id));\r
1020                 return (mysql_num_rows($r) != 0);\r
1021         }       \r
1022         \r
1023         \r
1024 }\r
1025 \r
1026 /**\r
1027   * This class is used when parsing item templates\r
1028   */\r
1029 class ITEMACTIONS extends BaseActions {\r
1030 \r
1031         // contains an assoc array with parameters that need to be included when\r
1032         // generating links to items/archives/... (e.g. catid)\r
1033         var $linkparams;\r
1034         \r
1035         // true when the current user is a blog admin (and thus allowed to edit all items)\r
1036         var $allowEditAll;\r
1037         \r
1038         // timestamp of last visit\r
1039         var $lastVisit;\r
1040         \r
1041         // item currently being handled (mysql result object, see BLOG::showUsingQuery)\r
1042         var $currentItem;\r
1043         \r
1044         // reference to the blog currently being displayed\r
1045         var $blog;\r
1046         \r
1047         // associative array with template info (part name => contents)\r
1048         var $template;\r
1049         \r
1050         // true when comments need to be displayed\r
1051         var $showComments;\r
1052         \r
1053         function ITEMACTIONS(&$blog) {\r
1054                 // call constructor of superclass first\r
1055                 $this->BaseActions();   \r
1056                 \r
1057                 // extra parameters for created links\r
1058                 global $catid;\r
1059                 if ($catid)\r
1060                         $this->linkparams = array('catid' => $catid);\r
1061                         \r
1062                 // check if member is blog admin (and thus allowed to edit all items)\r
1063                 global $member;\r
1064                 $this->allowEditAll = ($member->isLoggedIn() && $member->blogAdminRights($blog->getID()));\r
1065                 $this->setBlog($blog);\r
1066         }\r
1067 \r
1068         function getDefinedActions() {\r
1069                 return array(\r
1070                         'blogid',\r
1071                         'title',\r
1072                         'body',\r
1073                         'more',\r
1074                         'smartbody',\r
1075                         'itemid',\r
1076                         'morelink',\r
1077                         'category',\r
1078                         'categorylink',\r
1079                         'author',\r
1080                         'authorid',\r
1081                         'authorlink',\r
1082                         'catid',\r
1083                         'karma',\r
1084                         'date',\r
1085                         'time',\r
1086                         'query',\r
1087                         'itemlink',\r
1088                         'blogurl',\r
1089                         'closed',\r
1090                         'syndicate_title',\r
1091                         'syndicate_description',\r
1092                         'karmaposlink',\r
1093                         'karmaneglink',\r
1094                         'new',\r
1095                         'image',\r
1096                         'popup',\r
1097                         'media',\r
1098                         'daylink',\r
1099                         'query',\r
1100                         'include',\r
1101                         'phpinclude',\r
1102                         'parsedinclude',\r
1103                         'skinfile',\r
1104                         'set',\r
1105                         'plugin',\r
1106                         'edit',\r
1107                         'editlink',\r
1108                         'editpopupcode',\r
1109                         'comments',\r
1110                         'relevance'\r
1111                 );\r
1112         }\r
1113         \r
1114 \r
1115         \r
1116         function setLastVisit($lastVisit) {             $this->lastVisit = $lastVisit; }\r
1117         function setParser(&$parser) {                  $this->parser =& $parser; }\r
1118         function setCurrentItem(&$item) {               $this->currentItem =& $item; }\r
1119         function setBlog(&$blog) {                              $this->blog =& $blog; }\r
1120         function setTemplate($template) {               $this->template =& $template; }\r
1121         function setShowComments($val) {                $this->showComments = $val; }\r
1122         \r
1123         // methods used by parser to insert content\r
1124         \r
1125         function parse_blogid() {               echo $this->blog->getID();      }\r
1126         function parse_body() {                 $this->highlightAndParse($this->currentItem->body); }\r
1127         function parse_title() {                $this->highlightAndParse($this->currentItem->title); }\r
1128         function parse_more() {                 $this->highlightAndParse($this->currentItem->more); }   \r
1129         function parse_itemid() {               echo $this->currentItem->itemid; }              \r
1130         function parse_category() {             echo $this->currentItem->category; }                            \r
1131         function parse_categorylink() { echo createCategoryLink($this->currentItem->catid); }                           \r
1132         function parse_catid() {                echo $this->currentItem->catid; }                                       \r
1133         function parse_authorid() {             echo $this->currentItem->authorid; }\r
1134         function parse_authorlink() {   echo createMemberLink($this->currentItem->authorid, $this->linkparams); }       \r
1135         function parse_query() {                echo $this->strHighlight; }\r
1136         function parse_itemlink() {             echo createItemLink($this->currentItem->itemid, $this->linkparams); }\r
1137         function parse_blogurl() {              echo $this->blog->getURL(); }\r
1138         function parse_closed() {               echo $this->currentItem->closed; }\r
1139         function parse_relevance() {    echo round($this->currentItem->score,2);}\r
1140         \r
1141         function parse_karma($type = 'totalscore') {\r
1142                 global $manager;\r
1143 \r
1144                 // get karma object\r
1145                 $karma =& $manager->getKarma($this->currentItem->itemid);\r
1146                 \r
1147                 switch($type) {\r
1148                         case 'pos':\r
1149                                 echo $karma->getNbPosVotes();\r
1150                                 break;\r
1151                         case 'neg':\r
1152                                 echo $karma->getNbNegVotes();\r
1153                                 break;                          \r
1154                         case 'votes':\r
1155                                 echo $karma->getNbOfVotes();\r
1156                                 break;          \r
1157                         case 'posp':\r
1158                                 $percentage = $karma->getNbOfVotes() ? 100 * ($karma->getNbPosVotes() / $karma->getNbOfVotes()) : 50;\r
1159                                 echo number_format($percentage,2), '%';                         \r
1160                                 break;                          \r
1161                         case 'negp':\r
1162                                 $percentage = $karma->getNbOfVotes() ? 100 * ($karma->getNbNegVotes() / $karma->getNbOfVotes()) : 50;\r
1163                                 echo number_format($percentage,2), '%';                         \r
1164                                 break;                          \r
1165                         case 'totalscore':\r
1166                         default:\r
1167                                 echo $karma->getTotalScore();\r
1168                                 break;\r
1169                 }\r
1170                 \r
1171         }                                               \r
1172 \r
1173         function parse_author($which = '') {            \r
1174                 switch($which)\r
1175                 {\r
1176                         case 'realname':\r
1177                                 echo $this->currentItem->authorname;\r
1178                                 break;\r
1179                         case 'id':\r
1180                                 echo $this->currentItem->authorid;\r
1181                                 break;\r
1182                         case 'email':\r
1183                                 echo $this->currentItem->authormail;\r
1184                                 break;\r
1185                         case 'url':\r
1186                                 echo $this->currentItem->authorurl;\r
1187                                 break;\r
1188                         case 'name':\r
1189                         default:\r
1190                                 echo $this->currentItem->author;\r
1191                 }\r
1192         }               \r
1193         \r
1194         function parse_smartbody() {\r
1195                 if (!$this->currentItem->more) {\r
1196                         $this->highlightAndParse($this->currentItem->body);\r
1197                 } else {\r
1198                         $this->highlightAndParse($this->currentItem->more);             \r
1199                 }\r
1200         }\r
1201 \r
1202         function parse_morelink() {             \r
1203                 if ($this->currentItem->more)\r
1204                         $this->parser->parse($this->template['MORELINK']);\r
1205         }                       \r
1206         \r
1207         function parse_date($format = '') {\r
1208                 echo formatDate($format, $this->currentItem->timestamp, $this->template['FORMAT_DATE']);\r
1209         }\r
1210         \r
1211         /**\r
1212           * @param format optional strftime format\r
1213           */\r
1214         function parse_time($format = '') {                     \r
1215                 echo strftime($format ? $format : $this->template['FORMAT_TIME'],$this->currentItem->timestamp); \r
1216         }\r
1217         \r
1218         /**\r
1219           * @param maxLength optional maximum length\r
1220           */\r
1221         function parse_syndicate_title($maxLength = 100) { \r
1222                 $syndicated = strip_tags($this->currentItem->title);\r
1223                 echo htmlspecialchars(shorten($syndicated,$maxLength,'...'));\r
1224         }\r
1225         \r
1226         /**\r
1227           * @param maxLength optional maximum length\r
1228           */\r
1229         function parse_syndicate_description($maxLength = 250, $addHighlight = 0) { \r
1230                 $syndicated = strip_tags($this->currentItem->body);\r
1231                 if ($addHighlight) {\r
1232                     echo $this->highlightAndParse(htmlspecialchars(shorten($syndicated,$maxLength,'...')));\r
1233                 } else {\r
1234                 echo htmlspecialchars(shorten($syndicated,$maxLength,'...'));\r
1235                 }\r
1236         }\r
1237         \r
1238         function parse_karmaposlink($text = '') { \r
1239                 global $CONF;\r
1240                 $link = $CONF['ActionURL'] . '?action=votepositive&amp;itemid='.$this->currentItem->itemid; \r
1241                 echo $text ? '<a href="'.$link.'">'.$text.'</a>' : $link;\r
1242         }\r
1243         \r
1244         function parse_karmaneglink($text = '') { \r
1245                 global $CONF;\r
1246                 $link = $CONF['ActionURL'] . '?action=votenegative&amp;itemid='.$this->currentItem->itemid; \r
1247                 echo $text ? '<a href="'.$link.'">'.$text.'</a>' : $link;\r
1248         }\r
1249         \r
1250         function parse_new() {  \r
1251                 if (($this->lastVisit != 0) && ($this->currentItem->timestamp > $this->lastVisit))\r
1252                         echo $this->template['NEW'];\r
1253         }\r
1254         \r
1255         function parse_image() {\r
1256                 // image/popup calls have arguments separated by |\r
1257                 $args = func_get_args();\r
1258                 $args = explode('|',implode($args,', '));\r
1259                 call_user_func_array(array(&$this,'createImageCode'),$args);\r
1260         }\r
1261         function parse_popup() {\r
1262                 // image/popup calls have arguments separated by |\r
1263                 $args = func_get_args();\r
1264                 $args = explode('|',implode($args,', '));\r
1265                 call_user_func_array(array(&$this,'createPopupCode'),$args);\r
1266         }\r
1267         function parse_media() {\r
1268                 // image/popup calls have arguments separated by |\r
1269                 $args = func_get_args();\r
1270                 $args = explode('|',implode($args,', '));\r
1271                 call_user_func_array(array(&$this,'createMediaCode'),$args);\r
1272         }\r
1273         \r
1274         function parse_daylink() {              \r
1275                 echo createArchiveLink($this->blog->getID(), strftime('%Y-%m-%d',$this->currentItem->timestamp), $this->linkparams);\r
1276         }\r
1277         \r
1278         function parse_comments($maxToShow = 0) {\r
1279                 if ($maxToShow == 0)\r
1280                         $maxToShow = $this->blog->getMaxComments();\r
1281                         \r
1282                 // add comments\r
1283                 if ($this->showComments && $this->blog->commentsEnabled()) {\r
1284                         $comments =& new COMMENTS($this->currentItem->itemid);\r
1285                         $comments->setItemActions($this);\r
1286                         $comments->showComments($this->template, $maxToShow, $this->currentItem->closed ? 0 : 1, $this->strHighlight); \r
1287                 }\r
1288         }\r
1289 \r
1290         /**\r
1291           * Executes a plugin templatevar\r
1292           *\r
1293           * @param pluginName name of plugin (without the NP_)\r
1294           * \r
1295           * extra parameters can be added\r
1296           */\r
1297         function parse_plugin($pluginName) {\r
1298                 global $manager;\r
1299                 \r
1300                 // only continue when the plugin is really installed\r
1301                 if (!$manager->pluginInstalled('NP_' . $pluginName))\r
1302                         return;\r
1303                 \r
1304                 $plugin =& $manager->getPlugin('NP_' . $pluginName);\r
1305                 if (!$plugin) return;\r
1306 \r
1307                 // get arguments\r
1308                 $params = func_get_args();\r
1309                 \r
1310                 // remove plugin name \r
1311                 array_shift($params);\r
1312                 \r
1313                 // add item reference (array_unshift didn't work)\r
1314                 $params = array_merge(array(&$this->currentItem),$params);\r
1315 \r
1316                 call_user_func_array(array(&$plugin,'doTemplateVar'), $params);\r
1317         }\r
1318         \r
1319         function parse_edit() {\r
1320                 global $member, $CONF;\r
1321                 if ($this->allowEditAll || ($member->isLoggedIn() && ($member->getID() == $this->currentItem->authorid)) ) {\r
1322                         $this->parser->parse($this->template['EDITLINK']);\r
1323                 }\r
1324         }\r
1325         \r
1326         function parse_editlink() {\r
1327                 global $CONF;\r
1328                 echo $CONF['AdminURL'],'bookmarklet.php?action=edit&amp;itemid=',$this->currentItem->itemid;\r
1329         }\r
1330         \r
1331         function parse_editpopupcode() {\r
1332                 echo "if (event &amp;&amp; event.preventDefault) event.preventDefault();winbm=window.open(this.href,'nucleusbm','scrollbars=yes,width=600,height=500,left=10,top=10,status=yes,resizable=yes');winbm.focus();return false;";\r
1333         }\r
1334         \r
1335         // helper functions\r
1336 \r
1337         /**\r
1338           * Parses highlighted text, with limited actions only (to prevent not fully trusted team members\r
1339           * from hacking your weblog. \r
1340           */\r
1341         function highlightAndParse(&$data) {\r
1342                 // allow only a limited subset of actions (do not allow includes etc, they might be evil)\r
1343                 $this->parser->actions = array('image','media','popup');\r
1344                 $this->parser->parse($this->highlight($data));\r
1345                 $this->parser->actions = $this->getDefinedActions();\r
1346         }\r
1347         \r
1348         function createPopupCode($filename, $width, $height, $text = '') {\r
1349                 global $CONF;\r
1350         \r
1351                 // select private collection when no collection given\r
1352                 if (!strstr($filename,'/')) {\r
1353                         $filename = $this->currentItem->authorid . '/' . $filename;\r
1354                 }\r
1355                 \r
1356                 $windowwidth = $width;\r
1357                 $windowheight = $height;\r
1358                 \r
1359                 $vars['rawpopuplink']   = $CONF['Self'] . "?imagepopup=" . htmlspecialchars($filename) . "&amp;width=$width&amp;height=$height&amp;imagetext=" . urlencode(htmlspecialchars($text));\r
1360                 $vars['popupcode']              = "window.open(this.href,'imagepopup','status=no,toolbar=no,scrollbars=no,resizable=yes,width=$windowwidth,height=$windowheight');return false;";\r
1361                 $vars['popuptext']              = htmlspecialchars($text);\r
1362                 $vars['popuplink']              = '<a href="' . $vars['rawpopuplink']. '" onclick="'. $vars['popupcode'].'" >' . $vars['popuptext'] . '</a>';\r
1363                 $vars['width']                  = $width;\r
1364                 $vars['height']                 = $height;\r
1365                 $vars['text']                   = $text;\r
1366                 \r
1367                 echo TEMPLATE::fill($this->template['POPUP_CODE'],$vars);\r
1368         }\r
1369         \r
1370         function createImageCode($filename, $width, $height, $text = '') {\r
1371                 global $CONF;\r
1372                 \r
1373                 // select private collection when no collection given\r
1374                 if (!strstr($filename,'/')) {\r
1375                         $filename = $this->currentItem->authorid . '/' . $filename;\r
1376                 }\r
1377                 \r
1378                 $windowwidth = $width;\r
1379                 $windowheight = $height;\r
1380                 \r
1381                 $vars['link']                   = htmlspecialchars($CONF['MediaURL']. $filename);\r
1382                 $vars['text']                   = htmlspecialchars($text);\r
1383                 $vars['image'] = '<img src="' . $vars['link'] . '" width="' . $width . '" height="' . $height . '" alt="' . $vars['text'] . '" title="' . $vars['text'] . '" />';\r
1384                 $vars['width']                  = $width;\r
1385                 $vars['height']                 = $height;\r
1386                                 \r
1387                 \r
1388                 \r
1389                 echo TEMPLATE::fill($this->template['IMAGE_CODE'],$vars);;\r
1390 \r
1391         }\r
1392         \r
1393         function createMediaCode($filename, $text = '') {\r
1394                 global $CONF;\r
1395                 \r
1396                 // select private collection when no collection given\r
1397                 if (!strstr($filename,'/')) {\r
1398                         $filename = $this->currentItem->authorid . '/' . $filename;\r
1399                 }               \r
1400 \r
1401                 $vars['link']                   = htmlspecialchars($CONF['MediaURL'] . $filename);\r
1402                 $vars['text']                   = htmlspecialchars($text);\r
1403                 $vars['media']                  = '<a href="' . $vars['link'] . '">' . $vars['text'] . '</a>';\r
1404 \r
1405                 echo TEMPLATE::fill($this->template['MEDIA_CODE'],$vars);;\r
1406         }\r
1407         \r
1408         \r
1409 }\r
1410 \r
1411 \r
1412 // used for mail notification (html -> text)\r
1413 \r
1414 function toAscii($html) {\r
1415         // strip off most tags \r
1416         $html = strip_tags($html,'<a>');\r
1417         $to_replace = "/<a[^>]*href=[\"\']([^\"^']*)[\"\'][^>]*>([^<]*)<\/a>/i"; \r
1418         _links_init(); \r
1419         $ascii = preg_replace_callback ($to_replace, '_links_add', $html); \r
1420         $ascii .= "\n\n" . _links_list(); \r
1421         return strip_tags($ascii);\r
1422 }\r
1423 \r
1424 function _links_init() { \r
1425    global $tmp_links; \r
1426    $tmp_links = array(); \r
1427\r
1428 \r
1429 function _links_add($match) { \r
1430    global $tmp_links; \r
1431    array_push($tmp_links, $match[1]); \r
1432    return $match[2] . ' [' . sizeof($tmp_links) .']'; \r
1433\r
1434 \r
1435 function _links_list() { \r
1436    global $tmp_links; \r
1437    $output = ''; \r
1438    $i = 1; \r
1439    foreach ($tmp_links as $current) { \r
1440       $output .= "[$i] $current\n"; \r
1441       $i++; \r
1442    } \r
1443    return $output; \r
1444\r
1445 \r
1446  \r
1447 ?>\r