OSDN Git Service

NP_Paint v1.18
[nucleus-jp/nucleus-plugins.git] / trunk / NP_MultipleCategories / NP_MultipleCategories.php
1 <?php
2
3 /**
4   * Plugin for Nucleus CMS (http://plugins.nucleuscms.org/)
5   * Copyright (C) 2003 The Nucleus Plugins Project
6   *
7   * This program is free software; you can redistribute it and/or
8   * modify it under the terms of the GNU General Public License
9   * as published by the Free Software Foundation; either version 2
10   * of the License, or (at your option) any later version.
11   *
12   * see license.txt for the full license
13   */
14
15 /**
16 * Usage:
17 *                
18 *
19 * Versions:
20 *
21 *  TODO
22 *               - documentation
23 *               - etc
24 */
25
26 if (!function_exists('array_key_exists')){
27     function array_key_exists($key, $array) {
28         return key_exists($key, $array);
29     }
30 }
31
32 class NP_MultipleCategories extends NucleusPlugin {
33
34     function getName()  { return 'Multiple Categories [Custom Edition]'; }
35     function getAuthor()      { return 'Anand + nakahara21 + Taka + sato(na) + shizuki + Katsumi'; }
36     function getURL()    { return 'http://reverb.jp/vivian/download.php?itemid=NP_MultipleCategories'; }
37     function getVersion()    { return '0.5.1j'; }
38     function getMinNucleusVersion()  { return '220'; }
39     function getDescription()   {
40         // include language file for this plugin 
41 //              $language = ereg_replace( '[\\|/]', '', getLanguageName()); 
42         $language = preg_replace( '![\\|/]!', '', getLanguageName()); 
43         if (file_exists($this->getDirectory().'language/'.$language.'.php')) {
44             include_once($this->getDirectory().'language/'.$language.'.php'); 
45         } else {
46             include_once($this->getDirectory().'language/'.'english.php');
47         }
48         return _NPMC_DESCRIPTION;
49     }
50     function supportsFeature($what) {
51         switch($what)
52         {
53             case 'SqlTablePrefix':
54                 return 1;
55             default:
56                 return 0;
57         }
58     }
59     
60     function install() {
61         // include language file for this plugin 
62 //              $language = ereg_replace( '[\\|/]', '', getLanguageName()); 
63         $language = preg_replace( '![\\|/]!', '', getLanguageName()); 
64         if (file_exists($this->getDirectory().'language/'.$language.'.php')) {
65             include_once($this->getDirectory().'language/'.$language.'.php'); 
66         } else {
67             include_once($this->getDirectory().'language/'.'english.php');
68         }
69         
70         $this->createOption('addindex',      _NP_MCOP_ADDINDEX, "yesno",    'yes');
71         $this->createOption('addblogid_def', _NP_MCOP_ADBIDDEF, "yesno",    'no');
72         $this->createOption('addblogid',     _NP_MCOP_ADBLOGID, "yesno",    'yes');
73         $this->createOption("mainsep",       _NP_MCOP_MAINSEP,  "text",     " , ");
74         $this->createOption("addsep",        _NP_MCOP_ADDSEP,   "text",     " , ");
75         $this->createOption("subformat",     _NP_MCOP_SUBFOMT,  "text",     "<%category%> ( <%subcategory%> )");
76         $this->createOption("catheader",     _NP_MCOP_CATHEADR, "textarea", '<ul class="nobullets">' . "\n");
77         $this->createOption("catlist",       _NP_MCOP_CATLIST,  "textarea", '<li<%catflag%>><a href="<%catlink%>"><%catname%></a>(<%catamount%>)<%subcategorylist%></li>'."\n");
78         $this->createOption("catfooter",     _NP_MCOP_CATFOOTR, "textarea", '</ul>' . "\n");
79         $this->createOption("catflag",       _NP_MCOP_CATFLAG,  "textarea", ' class="current"' . "\n");
80         $this->createOption("subheader",     _NP_MCOP_SUBHEADR, "textarea", '<ul>' . "\n");
81         $this->createOption("sublist",       _NP_MCOP_SUBLIST,  "textarea", '<li<%subflag%>><a href="<%sublink%>"><%subname%></a>(<%subamount%>)</li>'."\n");
82         $this->createOption("subfooter",     _NP_MCOP_SUBFOOTR, "textarea", '</ul>' . "\n");
83         $this->createOption("subflag",       _NP_MCOP_SUBFLAG,  "textarea", ' class="current"' . "\n");
84         $this->createOption("replace",       _NP_MCOP_REPLACE,  'yesno',    'no');
85         $this->createOption("replacechar",   _NP_MCOP_REPRCHAR, 'text',     '+');
86         $this->createOption("archeader",     _NP_MCOP_ARCHEADR, "textarea", '<ul>' . "\n");
87         $this->createOption("arclist",       _NP_MCOP_ARCLIST,  "textarea", '<li><a href="<%archivelink%>">%Y-%m</a></li>'."\n");
88         $this->createOption("arcfooter",     _NP_MCOP_ARCFOOTR, "textarea", '</ul>'."\n");
89         $this->createOption("locale",        _NP_MCOP_LOCALE,   "text",     'ja_JP');
90         $this->createOption("quickmenu",     _NP_MCOP_QICKMENU, "yesno",    "no");
91         $this->createOption("del_uninstall", _NP_MCOP_DELTABLE, "yesno",    "no");
92 /*
93         $this->createOption('addindex', '[When URL-Mode is normal] If a blog URL ends with "/", add "index.php" before query strings.', 'yesno', 'yes');
94         $this->createOption('addblogid_def', 'Add blogid to default blog\'s category URLs.', 'yesno', 'no');
95         $this->createOption('addblogid', 'When a blog URL is different from default blog URL, add blogid to its category URLs.', 'yesno', 'yes');
96         $this->createOption("mainsep", "Separate character between a category and additional categories", "text", " , ");
97         $this->createOption("addsep", "Separate character between additional categories", "text", " , ");
98         $this->createOption("subformat", "Display form of a category name when the item belongs to one or more sub categories.", "text", "<%category%> ( <%subcategory%> )");
99         $this->createOption("catheader", "[Category list] Header Template. You can use <%blogid%>, <%blogurl%>, <%self%>", "textarea",'<ul class="nobullets">'."\n");
100         $this->createOption("catlist", "[Category list] List item Template. You can use <%catname%>, <%catdesc%>, <%catid%>, <%catlink%>, <%catflag%>, <%catamount%>, <%subcategorylist%>", "textarea",'<li<%catflag%>><a href="<%catlink%>"><%catname%></a>(<%catamount%>)<%subcategorylist%></li>'."\n");
101         $this->createOption("catfooter", "[Category list] Footer Template. You can use <%blogid%>, <%blogurl%>, <%self%>", "textarea",'</ul>'."\n");
102         $this->createOption("catflag", "[Category list] Flag Template", "textarea",' class="current"'."\n");
103         $this->createOption("subheader", "[Category list] Sub-Category Header Template", "textarea",'<ul>'."\n");
104         $this->createOption("sublist", "[Category list] Sub-Category List item Template. You can use <%subname%>, <%subdesc%>, <%subcatid%>, <%sublink%>, <%subflag%>, <%subamount%>", "textarea",'<li<%subflag%>><a href="<%sublink%>"><%subname%></a>(<%subamount%>)</li>'."\n");
105         $this->createOption("subfooter", "[Category list] Sub-Category Footer Template", "textarea",'</ul>'."\n");
106         $this->createOption("subflag", "[Category list] Sub-Category Flag Template", "textarea",' class="current"'."\n");
107         $this->createOption("replace", '[Category list] a-1: When a category has sub categories, replace "<%amount%>" of category list template to another character.', 'yesno','no');
108         $this->createOption("replacechar", '[Category list] a-2: The character to replace.', 'text','+');
109         $this->createOption("archeader", "[Archive list] Header Template. You can use <%blogid%>", "textarea",'<ul>'."\n");
110         $this->createOption("arclist", "[Archive list] List item Template. You can use <%archivelink%>,<%blogid%>, month/year/day like \"%B, %Y\"", "textarea",'<li><a href="<%archivelink%>">%Y-%m</a></li>'."\n");
111         $this->createOption("arcfooter", "[Archive list] Footer Template. You can use <%blogid%>", "textarea",'</ul>'."\n");
112         $this->createOption("locale", "[Archive list] Locale", "text",'ja_JP');
113         $this->createOption("quickmenu", "Show in quick menu", "yesno", "no");
114         $this->createOption("del_uninstall", "Delete tables on uninstall?", "yesno", "no");
115 */
116 /*
117
118 ALTER TABLE `000_nucleus_plug_multiple_categories_sub` ADD `parentid` INT( 11 ) DEFAULT '0' NOT NULL AFTER `scatid` ,
119 ADD `ordid` INT( 11 ) DEFAULT '100' NOT NULL AFTER `parentid` ;
120
121
122 */
123         // create the table that will keep track of notifications
124         $query =  'CREATE TABLE IF NOT EXISTS '. sql_table('plug_multiple_categories'). '(';    
125         $query .= ' item_id int(11) NOT NULL,';
126         $query .= ' categories varchar(255) not null,';     
127         $query .= ' subcategories varchar(255) not null,';      
128         $query .= ' PRIMARY KEY  (item_id)';
129         $query .= ') TYPE=MyISAM;';
130         sql_query($query);
131
132         $check_column = sql_query('SELECT * FROM '. sql_table('plug_multiple_categories'). ' WHERE 1=0');
133         for ($i=0; $i<mysql_num_fields($check_column); $i++) {
134             if ($meta = mysql_fetch_field($check_column)) {
135                 $names[] = $meta->name;
136             }
137         }
138         if (!in_array("subcategories",$names)) {
139             sql_query ('ALTER TABLE '.sql_table('plug_multiple_categories').' ADD subcategories varchar(255) not null');
140             sql_query('ALTER TABLE ' .sql_table('plug_multiple_categories').' MODIFY categories varchar(255) not null');
141         }
142         $query =  'CREATE TABLE IF NOT EXISTS '. sql_table('plug_multiple_categories_sub'). '('
143         . 'scatid int(11) not null auto_increment,'
144         . 'catid int(11) not null,'
145         . 'sname varchar(40) not null,'
146         . 'sdesc varchar(200) not null,'
147         . ' PRIMARY KEY (scatid)'
148         . ') TYPE=MyISAM;';
149         sql_query($query);
150         
151         //<sato(na)0.5.1j>
152         //table Upgrade
153         if ($this->checkMSCVersion() == 2){
154             $q = "
155                 ALTER TABLE 
156                     `".sql_table('plug_multiple_categories_sub')."` 
157                 ADD `parentid` INT( 11 ) DEFAULT   '0' NOT NULL AFTER `scatid` , 
158                 ADD `ordid`    INT( 11 ) DEFAULT '100' NOT NULL AFTER `parentid`
159             ";
160         } elseif ($this->version == 3){
161             $q = "
162                 ALTER TABLE 
163                     `".sql_table('plug_multiple_categories_sub')."` 
164                 ADD `ordid`    INT( 11 ) DEFAULT '100' NOT NULL AFTER `parentid`
165             ";
166         }
167         if ($q) sql_query($q);
168         //</sato(na)0.5.1j>
169     }
170
171     function unInstall() {
172         if ($this->getOption('del_uninstall') == "yes") {
173             sql_query('DROP TABLE ' .sql_table('plug_multiple_categories'));
174             sql_query('DROP TABLE ' .sql_table('plug_multiple_categories_sub'));
175         }
176     }
177
178     function getTableList() {
179         return array(sql_table('plug_multiple_categories'), sql_table('plug_multiple_categories_sub'));
180     }
181
182     function hasAdminArea() { return 1; }
183
184     function getEventList() {
185         return array('PreSkinParse','PostAddItem','AddItemFormExtras', 'EditItemFormExtras', 'PreUpdateItem', 'PostDeleteItem', 'PostDeleteCategory','QuickMenu');
186     }   
187
188     function event_QuickMenu(&$data) {
189         // only show when option enabled
190         if ($this->getOption('quickmenu') != 'yes') return;
191         global $member;
192         // only show to admins
193         if (!($member->isLoggedIn() && $member->isAdmin())) return;
194         array_push(
195             $data['options'],
196             array(
197                 'title' => 'Multiple Categories',
198                 'url' => $this->getAdminURL(),
199                 'tooltip' => 'Edit sub categories'
200             )
201         );
202     }
203     
204     function getRequestName() {
205         return "subcatid";
206     }
207     
208     function init() {
209         $this->setglobal = 0;
210         $this->subOrderArray = $this->_setSubOrder();//<sato(na)t1855 />
211     }
212     
213     function event_PreSkinParse($data) {
214         global $catid, $subcatid, $CONF;
215         
216         if ($this->setglobal == 1) return;
217
218         if ($CONF['URLMode'] == 'pathinfo') {
219             if (!$subcatid) {
220                 $sid = 0;
221                 $pathdata = explode("/",serverVar('PATH_INFO'));
222                 for ($i=0;$i<sizeof($pathdata);$i++) {
223                     switch ($pathdata[$i]) {
224                         case $this->getRequestName():
225                             $i++;
226                             if ($i<sizeof($pathdata)) $sid = $pathdata[$i];
227                             break 2;
228                     }
229                 }
230                 if ($sid) $subcatid = intval($sid);
231             }
232         } else {
233             $subcatid = intRequestVar($this->getRequestName());
234         }
235         if ($subcatid && !$catid) {
236             $catid = intval($this->_getParentCatID($subcatid));//Intval is not needed. ($subcatid) <sato(na)0.5j />
237             if (!$catid) {
238                 $subcatid = null;
239                 $catid = null;
240             }
241         } elseif ($subcatid) {
242             $pcatid = intval($this->_getParentCatID($subcatid));//Intval is not needed. ($subcatid) <sato(na)0.5j />
243             if ($pcatid != $catid) $subcatid = null;
244         }
245         
246         $this->setglobal = 1;
247     }
248     
249 //modify start+++++++++
250     function checkMSCVersion(){
251                 $res = sql_query("SHOW FIELDS from ".sql_table('plug_multiple_categories_sub') );
252                 $fieldnames = array();
253                 while ($co = mysql_fetch_assoc($res)) {
254                     $fieldnames[] = $co['Field'];
255                 }
256                 if(in_array('ordid',$fieldnames)) return 4;
257                 if(in_array('parentid',$fieldnames)) return 3;
258                 return 2;
259     }
260 //modify end+++++++++
261
262     function _getCategories($id){
263         $aResult = array(); 
264         $query = 'SELECT catid, cname as name, cdesc FROM '.sql_table('category').' WHERE cblog=' . intval($id);
265         $res = sql_query($query);   
266         while ($a = mysql_fetch_assoc($res)){
267             array_push($aResult,$a);
268         } 
269         return $aResult;    
270     }
271
272     function _getDefinedScats($id){
273         $aResult = array(); 
274         $query = 'SELECT * FROM '.sql_table('plug_multiple_categories_sub').' WHERE catid=' . intval($id);
275         $res = sql_query($query);   
276         while ($a = mysql_fetch_assoc($res)){
277             array_push($aResult,$a);
278         } 
279         return $aResult;
280     }
281     
282     function _getScatIDs($id){
283         $aResult = array(); 
284         $query = 'SELECT scatid FROM '.sql_table('plug_multiple_categories_sub').' WHERE catid=' . intval($id);
285         $res = sql_query($query);   
286         while ($row = mysql_fetch_row($res)){
287             $aResult[] = intval($row[0]); //<sato(na)0.5j />ultrarich
288         } 
289         return $aResult;
290     }
291     
292     function _getCatNameFromID($id){
293         return quickQuery('SELECT cname as result FROM '.sql_table('category').' WHERE catid='.intval($id));
294     }
295
296     function _getScatNameFromID($id) {
297         return quickQuery('SELECT sname as result FROM '.sql_table('plug_multiple_categories_sub').' WHERE scatid='.intval($id));
298     }
299
300     function _getScatDescFromID($id) {
301         return quickQuery('SELECT sdesc as result FROM '.sql_table('plug_multiple_categories_sub').' WHERE scatid='.intval($id));
302     }
303
304     function _getScatIDFromName($name) {
305         return quickQuery('SELECT scatid as result FROM '.sql_table('plug_multiple_categories_sub').' WHERE sname="'.addslashes($name).'"');
306     }
307
308     function _getParentCatID($id) {
309         return quickQuery('SELECT catid as result FROM '.sql_table('plug_multiple_categories_sub').' WHERE scatid='.intval($id));
310     }
311     
312     function _getScatMap($numarray) {
313         $aResult = array();
314         $numstr  = implode(",",array_map("intval",$numarray));
315         //<sato(na)t1855>
316         $numstr = $this->permuteSubcategories($numstr);
317         if (!$numstr) $numstr = 0;//<mod by shizuki>
318         //$res = sql_query("SELECT catid, scatid, sname FROM ". sql_table("plug_multiple_categories_sub") ." WHERE scatid in (".$numstr.")");
319         $sql_str = "SELECT catid, scatid, sname FROM ". sql_table("plug_multiple_categories_sub").
320         " WHERE scatid in (".$numstr.") ORDER BY FIND_IN_SET(scatid,'".$numstr."')";
321         $res = sql_query($sql_str);
322         //</sato(na)t1855>
323         while ($o = mysql_fetch_object($res)) {
324             if (!isset($aResult[$o->catid])) $aResult[$o->catid] = array();
325             $aResult[$o->catid][$o->scatid] = $o->sname;
326         }
327         return $aResult;
328     }
329
330     function _getMultiCategories($itemid){
331         $query = "SELECT categories FROM ".sql_table('plug_multiple_categories')." WHERE item_id=".intval($itemid); 
332         $result = sql_query($query); 
333         if(mysql_num_rows($result)==0) return;
334         $row = mysql_fetch_row($result);
335         return $row[0];
336     }
337     
338     function _getSubCategories($itemid){
339         $query = "SELECT subcategories FROM ".sql_table('plug_multiple_categories')." WHERE item_id=".intval($itemid); 
340         $result = sql_query($query); 
341         if(mysql_num_rows($result)==0) return;
342         $row = mysql_fetch_row($result);
343         return $row[0];
344     }
345     //<sato(na)t1855>
346     function _setSubOrder(){
347         $subOrderString = substr($this->_getSubOrder(0), 1);
348         return explode(",", $subOrderString);
349     }
350     function _getSubOrder($pid){
351         $sql_str  = 'SELECT scatid FROM '.sql_table('plug_multiple_categories_sub').' WHERE parentid='.intval($pid).' ORDER BY ordid'; //<sato(na)0.5j />
352         $qid_scat = mysql_query($sql_str);
353         if ($qid_scat === FALSE) return ''; //<sato(na)0.403j />
354         $scat_str = '';
355         while ($row_scat = mysql_fetch_object($qid_scat)) $scat_str .= ',' . intval($row_scat->scatid) . $this->_getSubOrder($row_scat->scatid); //<sato(na)0.5j />
356         return $scat_str;
357     }
358     function permuteSubcategories($subcategories){
359         $itemScats = explode(",", $subcategories);
360         $retArray  = array_intersect($this->subOrderArray, $itemScats);
361         $ret = implode(",", $retArray);
362         return $ret;
363     }
364     //</sato(na)t1855>
365     //<sato(na)0.402j>
366     function doAction($type) {
367         $catid    = intRequestVar('catid');
368         $subcatid = intRequestVar('subcatid');
369         echo '
370 function orderKey(key, sequence) {
371     var scatDat = new Array();';
372         $query = "SELECT scatid, sname, sdesc FROM ".sql_table('plug_multiple_categories_sub')." WHERE parentid=$subcatid AND catid=$catid";
373         $res   = sql_query($query);
374         $i     = 0;
375         while($row = mysql_fetch_array($res)) {
376             //<sato(na)0.5j>
377             echo 'scatDat['.($i++).'] = new setScatDat('.
378             intval($row['scatid']).
379             ' , "'.
380             htmlspecialchars($row['sname'], ENT_QUOTES).
381             '", "'.
382             htmlspecialchars($row['sdesc'], ENT_QUOTES).
383             '");'."\n";
384             //</sato(na)0.5j>
385         }
386         echo '
387     scatDat.sort(eval("sort" + key + sequence));
388     scatListRefresh(scatDat);
389 }';
390     }
391     //</sato(na)0.402j>
392     
393     function _getItemObject($id) {
394         $res = sql_query("SELECT inumber as itemid, icat as catid FROM ".sql_table('item')." WHERE inumber=".intval($id));
395         if ($res) {
396             return mysql_fetch_object($res);
397         }
398     }
399     
400     function event_AddItemFormExtras($data) {
401         $aCategories = $this->_getCategories($data['blog']->blogid);
402         if(count($aCategories) > 1) {
403             $this->showForm($aCategories,$data['itemid']);
404         } elseif (count($aCategories) > 0) {
405             $this->showSubForm($aCategories,$data['itemid']);
406         }
407     }
408
409     function event_EditItemFormExtras($data) {
410         $aCategories = $this->_getCategories($data['blog']->blogid);
411         if(count($aCategories) > 1) {
412             $this->showForm($aCategories,$data['itemid']);
413         } elseif (count($aCategories) > 0) {
414             $this->showSubForm($aCategories,$data['itemid']);
415         }
416     }
417     
418     function showSubForm($aCategories, $itemid) {
419         $aDefinedScats = $this->_getDefinedScats($aCategories[0]['catid']);
420         if (!count($aDefinedScats)) return;
421
422         $itemScats = array();
423         if($subcatlist = $this->_getSubCategories($itemid))//Intval is not needed. ($itemid) <sato(na)0.5j />
424             $itemScats = explode(",",$subcatlist);
425         
426         //<sato(na)>$snum = 0;</sato(na)>
427         echo '<h3>Multiple Categories</h3>'; 
428         echo "<fieldset><legend>Sub Categories</legend>";
429         //<sato(na)>
430         $sql_str = 'SELECT * FROM '.sql_table('plug_multiple_categories_sub').' WHERE catid='.intval($aCategories[0]['catid']).' AND  parentid=0'; //<sato(na)0.5j />
431         $qid = sql_query($sql_str);
432         while ($aSub = mysql_fetch_assoc($qid)) {
433             $schecked = (in_array($aSub['scatid'], $itemScats)) ? " checked=checked" : "";
434             echo '<input type="checkbox" id="npmc_scat'.$aSub['scatid'].'" name="npmc_scat['.$aSub['scatid'].']"'.$schecked.' value="'.$aSub['scatid'].'" />'; 
435             echo '<label for="npmc_scat'.$aSub['scatid'].'">'.htmlspecialchars($aSub['sname'], ENT_QUOTES).'</label><br />'; //<sato(na)0.5j />
436             $this->showFormHierarchical($aSub['scatid'], $itemScats); //<sato(na)0.5j />
437         }
438         //</sato(na)>
439         echo "</fieldset>";
440     }
441     
442     function showForm($aCategories,$itemid) {
443         $itemcats = array();
444         $itemScats = array();
445         if($multicatlist = $this->_getMultiCategories($itemid))//Intval is not needed. ($itemid) <sato(na)0.5j />
446             $itemcats = explode(",",$multicatlist);
447         if($subcatlist = $this->_getSubCategories($itemid))//Intval is not needed. ($itemid) <sato(na)0.5j />
448             $itemScats = explode(",",$subcatlist);
449
450         echo '<h3 style="margin-bottom:0px;">Multiple Categories</h3>'; 
451         $num = 0;
452         //<sato(na)>
453         //$snum = 0;
454         echo '<div style="height: 300px;overflow: auto;"><table><tbody>';
455         //</sato(na)>
456         foreach ($aCategories as $aCategory){
457             $checked = "";
458             if(in_array($aCategory['catid'],$itemcats)) $checked = " checked=checked";
459             echo '<tr><td>';
460             echo '<input type="checkbox" id="npmc_cat'.$num.'" name="npmc_cat['.$num.']"'.$checked.' value="'.$aCategory['catid'].'" />'; 
461             echo '<label for="npmc_cat'.$num.'">'.htmlspecialchars($aCategory['name'], ENT_QUOTES); //<sato(na)0.5j />
462             if ($aCategory['cdesc']) echo "(".htmlspecialchars($aCategory['cdesc'], ENT_QUOTES).")"; //<sato(na)0.5j />
463             echo '</label>';
464             $num ++;
465             //<sato(na)>
466             $sql_str = 'SELECT * FROM '.sql_table('plug_multiple_categories_sub').' WHERE catid='.intval($aCategory['catid']).' AND parentid=0'; //<sato(na)0.5j />
467             $qid = sql_query($sql_str);
468             if (mysql_num_rows($qid)) {
469                 echo "<fieldset style=\"margin-left:1.5em;border:none\">";
470                 while ($aSub = mysql_fetch_assoc($qid)) {
471                     $schecked = (in_array($aSub['scatid'], $itemScats)) ? " checked=checked" : "";
472                     echo '<input type="checkbox" id="npmc_scat'.$aSub['scatid'].'" name="npmc_scat['.$aSub['scatid'].']"'.$schecked.' value="'.$aSub['scatid'].'" />'; 
473                     echo '<label for="npmc_scat'.$aSub['scatid'].'">'.htmlspecialchars($aSub['sname'], ENT_QUOTES).'</label><br />'; //<sato(na)0.5j />
474                     $this->showFormHierarchical($aSub['scatid'], $itemScats); //<sato(na)0.5j />
475                 }
476                 echo "</fieldset>";
477             }
478             //</sato(na)>
479             echo "</td></tr>";
480         }
481         echo "</tbody></table></div>";//<sato(na) />
482     }
483     //<sato(na)>
484     function showFormHierarchical($parentid, $itemScats) {
485         $qid = sql_query('SELECT * FROM '.sql_table('plug_multiple_categories_sub').' WHERE parentid='.intval($parentid));
486         if (mysql_num_rows($qid)){
487             echo "<div style=\"margin-left:3em;border:none\">";
488             while ($aSub = mysql_fetch_assoc($qid)) {
489                 $schecked = (in_array($aSub['scatid'], $itemScats)) ? " checked=checked" : "";
490                 echo '<input type="checkbox" id="npmc_scat'.$aSub['scatid'].'" name="npmc_scat['.$aSub['scatid'].']"'.$schecked.' value="'.$aSub['scatid'].'" />'; 
491                 echo '<label for="npmc_scat'.$aSub['scatid'].'">'.htmlspecialchars($aSub['sname'], ENT_QUOTES).'</label><br />'; //<sato(na)0.5j />
492                 $this->showFormHierarchical($aSub['scatid'], $itemScats); //<sato(na)0.5j />
493             }
494             echo "</div>";
495         }
496     }
497     //</sato(na)>
498
499     function event_PostAddItem($data) {
500         $selected = requestIntArray('npmc_cat');
501         $s_selected = requestIntArray('npmc_scat');
502         if (count($selected) == 0 && count($s_selected) == 0) return;   
503         
504         $pcatid = quickQuery("SELECT icat as result FROM ".sql_table('item')." WHERE inumber=".intval($data['itemid']));
505         
506         $this->updateData($data['itemid'], $pcatid, $selected, $s_selected);
507     }
508
509     function event_PreUpdateItem($data) {
510         $selected = requestIntArray('npmc_cat');
511         $s_selected = requestIntArray('npmc_scat');
512
513         if(($this->_getMultiCategories($data['itemid']) || $this->_getSubCategories($data['itemid'])) && count($selected) == 0 && count($s_selected) == 0 ){
514             sql_query('DELETE FROM ' . sql_table('plug_multiple_categories') . ' WHERE item_id=' . intval($data['itemid']));
515             return;
516         } elseif (count($selected) == 0 && count($s_selected) == 0) {
517             return;
518         }
519         
520         $this->updateData($data['itemid'],$data['catid'],$selected,$s_selected);
521     }
522     
523     function updateData($itemid, $pcatid, $selected, $s_selected) {
524         $value = "";
525         $aMulti = array();
526         $aSub = array();
527         if (is_array($selected) && count($selected) > 0) {
528             $aMulti = $selected;
529         }
530         
531         if (is_array($s_selected) && count($s_selected) > 0) {
532             foreach ($s_selected as $v) {
533                 $v = intval($v);
534                 $mycatid = $this->_getParentCatID($v);
535                 if ($mycatid) {
536                     $aSub[] = $v;
537                     if (!in_array($mycatid,$aMulti)) {
538                         $aMulti[] = $mycatid;
539                     }
540                 }
541             }
542         }
543         
544         if (count($aMulti) > 0) {
545             $aMulti = array_map("intval",$aMulti);
546             $cat_string = join(",",$aMulti);
547             $value .= ', "'.addslashes($cat_string).'"';
548         } else {
549             $value .= ', ""';
550         }
551
552         if (count($aSub) > 0) {
553             $scat_string = join(",",$aSub);
554             $value .= ', "'.addslashes($scat_string).'"';
555         } else {
556             $value .= ', ""';
557         }
558         
559         $query = 'REPLACE INTO '.sql_table('plug_multiple_categories').' (item_id,categories,subcategories) VALUES('.intval($itemid).$value.');'; //$value : addslashes
560         sql_query($query);
561     }
562
563     function event_PostDeleteItem($data){
564         $query = 'DELETE FROM ' . sql_table('plug_multiple_categories') . ' WHERE item_id=' . intval($data['itemid']);
565         sql_query($query);
566     }
567
568     function event_PostDeleteCategory($data) {
569         $catid = intval($data['catid']);
570         $subcats = $this->_getScatIDs($catid);
571         if (count($subcats > 0)) {
572             sql_query("DELETE FROM ". sql_table("plug_multiple_categories_sub") ." WHERE catid=$catid");
573             global $manager;
574             foreach ($subcats as $val) {
575                 $manager->notify(
576                                  'PostDeleteSubcat',
577                                  array(
578                                        'subcatid' => $val
579                                       )
580                                 );
581             }
582         }
583         
584         $query = "SELECT categories, subcategories, item_id FROM ". sql_table("plug_multiple_categories") ." WHERE categories REGEXP '(^|,)$catid(,|$)'";
585         if (count($subcats > 0)) { 
586          $query .= " or subcategories REGEXP '(^|,)(".implode("|",$subcats).")(,|$)'";
587         }
588         $res = sql_query($query);
589         $del = array();
590         $up = array();
591         
592         while ($o = mysql_fetch_object($res)) {
593             $o->categories = preg_replace("/^(?:(.*),)?$catid(?:,(.*))?$/","$1,$2",$o->categories);
594             $o->subcategories = preg_replace("/^(?:(.*),)?$catid(?:,(.*))?$/","$1,$2",$o->subcategories);
595             if ((!$o->categories || $o->categories == ',') && (!$o->subcategories || $o->subcategories == ',')) {
596                 $del[] = intval($o->item_id); //<sato(na)0.5j />ultrarich
597             } else {
598                 $o->categories = preg_replace("/(^,+|(?<=,),+|,+$)/","",$o->categories);
599                 $o->subcategories = preg_replace("/(^,+|(?<=,),+|,+$)/","",$o->subcategories);
600                 $up[] = "UPDATE ". sql_table("plug_multiple_categories") ." SET categories='".addslashes($o->categories).
601                     "', subcategories='".addslashes($o->subcategories)."' WHERE item_id=".intval($o->item_id); //<sato(na)0.5j />ultrarich
602             }
603         }
604         
605         if (count($del) > 0) {
606             sql_query("DELETE FROM ". sql_table("plug_multiple_categories") . " WHERE item_id in (".implode(",",$del).")");
607         }
608         if (count($up) > 0) {
609             foreach ($up as $v) {
610                 sql_query($v);
611             }
612         }
613     }
614
615     function doSKinVar(){
616         global $blog, $catid, $CONF, $manager, $itemid, $subcatid, $startpos, $archive;
617         
618         $params = func_get_args();
619         // item skin
620         if ($params[0] == 'item' && $params[1] != "1") {
621             if ($itemid) $this->_parseItem($params[1], intval($itemid));//<sato(na)0.5j />
622             return;
623         }
624
625         if (intval($params[1]) == 1) {
626             switch ($params[2]) {
627                 case 'id':
628                     if (!$subcatid || !$catid) return;
629                     echo intval($subcatid);//<sato(na)0.5j />
630                     return;
631                     break;
632                 case 'desc':
633                     if (!$subcatid || !$catid) return;
634                     echo htmlspecialchars($this->_getScatDescFromID($subcatid), ENT_QUOTES);//Intval is not needed. ($subcatid) <sato(na)0.5j />
635                     return;
636                     break;
637                 case 'name':
638                     if (!$subcatid || !$catid) return;
639                     echo htmlspecialchars($this->_getScatNameFromID($subcatid), ENT_QUOTES);//Intval is not needed. ($subcatid) <sato(na)0.5j />
640                     return;
641                     break;
642                 case 'url':
643                     if (!$subcatid || !$catid) return;
644                     if ($blog) {
645                         $b =& $blog;
646                     } else {
647                         $b =& $manager->getBlog($CONF['DefaultBlog']);
648                     }
649                     $this->_setCommonData($b->getID());
650                     $sparams = array_merge($this->param, array($this->getRequestName() => intval($subcatid)));//<sato(na)0.5j />
651                     $url = createCategoryLink(intval($catid), $sparams);//<sato(na)0.5j />
652                     if ($CONF['URLMode'] != 'pathinfo') {
653                         list(,$temp_param) = explode("?",$url);
654                         $url = $this->url. "?" . $temp_param;
655                     }
656                     $url = preg_replace(array("/</", "/>/"), array("&lt;", "&gt;"), $url); //<sato(na)0.5j />
657                     echo $url; //$sparams escape OK <sato(na)0.5j />
658                     return;
659                     break;
660                 case 'link':
661                     if ($params[0] != 'item') return;
662                     $item = $this->_getItemObject(intval($itemid));//<sato(na)0.5j />
663                     if ($item) {
664                         $this->doTemplateVar(&$item);
665                     }
666                     return;
667                     break;
668                 case 'archivelink':
669                     if ($blog) {
670                         $b =& $blog;
671                     } else {
672                         $b =& $manager->getBlog($CONF['DefaultBlog']);
673                     }
674                     $bid = $b->getID();
675                     $this->_setCommonData($bid);
676                     $cur_params = array();
677                     if ($catid) $cur_params['catid'] = intval($catid);//<sato(na)0.5j />
678                     if ($subcatid) {
679                         $rname = $this->getRequestName();
680                         $cur_params[$rname] = intval($subcatid);//<sato(na)0.5j />
681                     }
682                     $url = createArchiveListLink($bid, $cur_params);
683                     if ($CONF['URLMode'] != 'pathinfo') {
684                         list(,$temp_param) = explode("?",$url);
685                         $url = $this->url. "?" . $temp_param;
686                     }
687                     $url = preg_replace(array("/</", "/>/"), array("&lt;", "&gt;"), $url); //<sato(na)0.5j />
688                     echo $url; //$cur_params escape OK <sato(na)0.5j />
689                     return;
690                     break;
691                 case 'categorylist':
692                     $this->showCategoryList();
693                     return;
694                     break;
695                 case 'archivelist':
696                     $arcmode = 'month';
697                     if (isset($params[3]) && $params[3] == 'day') {
698                         $arcmode = 'day';
699                     }
700                     $limit = 0;
701                     if (isset($params[4]) && intval($params[4])) {
702                         $arclimit = intval($params[4]);
703                     }
704                     $this->showArchiveList($arcmode,$arclimit);
705                     return;
706                     break;
707             }
708         }
709         
710         if ($blog) {
711             $b =& $blog;
712         } else {
713             $b =& $manager->getBlog($CONF['DefaultBlog']);
714         }
715         
716         $mycatid    = ($catid)    ? intval($catid)    : 0;//<sato(na)0.5j />
717         $mysubcatid = ($subcatid) ? intval($subcatid) : 0;//<sato(na)0.5j />
718         $templateName = $params[1];
719         $amountEntries = 0;
720         $offset = 0;
721         $startpos = intval($startpos);//<sato(na)0.5j />
722         if (isset($params[2])) {
723             list($amountEntries, $offset) = sscanf($params[2], '%d(%d)');
724             if ($offset) {
725                 $startpos += $offset;
726             }
727         }
728         if (isset($params[3]) && $params[3])
729             $mycatid = getCatIDFromName($params[3]);
730         if (isset($params[4]) && $params[4])
731             $mysubcatid = $this->_getScatIDFromName($params[4]);
732         
733         if (!$templateName) $templateName = 'grey/short';
734         if (!$amountEntries) $amountEntries = 10;
735         
736         $mycatid = intval($mycatid);
737         $mysubcatid = intval($mysubcatid);
738         if (!$mycatid && $mysubcatid) $mysubcatid = 0;
739         
740         $query =  'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, UNIX_TIMESTAMP(i.itime) as timestamp, i.itime, i.imore as more, m.mnumber as authorid, c.cname as category, i.icat as catid, i.iclosed as closed' ;
741         //<sato(na)0.5j>
742         //$query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c';
743         $query .= ' FROM '.sql_table('category').' as c, '.sql_table('member').' as m, '.sql_table('item').' as i';
744         //</sato(na)0.5j>
745         
746         if ($mycatid) {
747             $query .= ' LEFT JOIN '.sql_table('plug_multiple_categories').' as p ON i.inumber=p.item_id';
748         }
749         
750         $query .=  ' WHERE i.iauthor=m.mnumber' 
751              . ' and i.iblog='.intval($b->getID()) //<sato(na)0.5j />
752              . ' and i.icat=c.catid' 
753              . ' and i.idraft=0';
754         if ($params[0] == 'archive' && $archive) {
755             sscanf($archive,'%d-%d-%d',$y,$m,$d);
756             if ($d) {
757                 $timestamp_start = mktime(0,0,0,$m,$d,$y);
758                 $timestamp_end = mktime(0,0,0,$m,$d+1,$y);
759             } else {
760                 $timestamp_start = mktime(0,0,0,$m,1,$y);
761                 $timestamp_end = mktime(0,0,0,$m+1,1,$y);
762             }
763             
764             $query .= ' and i.itime>=' . mysqldate($timestamp_start)
765                    . ' and i.itime<' . mysqldate($timestamp_end);
766             
767         } else {
768             $query .= ' and i.itime<=' . mysqldate($b->getCorrectTime());
769         }
770         
771         if ($mycatid) {
772             $query .= ' and ((i.inumber=p.item_id and (p.categories REGEXP "(^|,)'.$mycatid.'(,|$)" or i.icat='.$mycatid.')) or (i.icat='.$mycatid.' and p.item_id IS NULL))';
773         }
774         if ($mysubcatid) {
775             $query .= ' and p.subcategories REGEXP "(^|,)'.$mysubcatid.'(,|$)"';
776         }
777         
778         $query .= ' ORDER BY i.itime DESC'; 
779
780         $query .= ' LIMIT ' . intval($startpos).',' . intval($amountEntries);
781         
782         $b->showUsingQuery($templateName, $query, 0, 1, 1); 
783     }
784
785
786     function doTemplateCommentsVar(&$item, &$comment, $what='') {
787         if ($what == 'itemlink') {
788             $this->doTemplateVar(&$item, $what);
789         }
790     }
791
792     function doTemplateVar(&$item, $what='') {
793         global $CONF, $catid, $subcatid;
794         
795         $bid = getBlogIDFromItemID($item->itemid);
796         if (!isset($this->defurl)) $this->_setCommonData($bid);
797         if ($bid != $this->bid) $this->_setBlogData($bid);
798         
799         if ($what == 'itemlink') {
800             $sparams = array();
801             if ($catid) {
802                 $sparams['catid'] = intval($catid);//<sato(na)0.5j />
803                 if ($subcatid) {
804                     $sparams[$this->getRequestName()] = intval($subcatid);//<sato(na)0.5j />
805                 }
806             }
807             $url = createItemLink($item->itemid, $sparams);
808             if ($CONF['URLMode'] != 'pathinfo') {
809                 list(,$temp_param) = explode("?",$url);
810                 $url = $this->url. "?" . $temp_param;
811             }
812             $url = preg_replace(array("/</", "/>/"), array("&lt;", "&gt;"), $url); //<sato(na)0.5j />
813             echo $url; //$cur_params escape OK <sato(na)0.5j />
814             return;
815         }
816         
817         $url = createCategoryLink($item->catid, $this->param);
818         if ($CONF['URLMode'] != 'pathinfo') {
819             list(,$temp_param) = explode("?",$url);
820             $url = $this->url. "?" . $temp_param;
821         }
822         $mcat_string = '<a href="'.$this->cnvHtmlUrlAttribute($url).'">'.htmlspecialchars($this->_getCatNameFromID($item->catid), ENT_QUOTES).'</a>'; //<sato(na)0.5j />
823         
824         $itemScats = array();
825         if ($itemscatstr = $this->_getSubCategories($item->itemid)) {
826             $itemScats = explode(",",$itemscatstr);
827             $scatMaps = $this->_getScatMap($itemScats);
828         }
829         if ($itemscatstr && array_key_exists($item->catid,$scatMaps)) {
830             $extra_scat_string = array();
831             foreach ($scatMaps[$item->catid] as $id => $name) {
832                 if ($CONF['URLMode'] == 'pathinfo') {
833                     $sparams = array_merge($this->param, array($this->getRequestName() => $id));
834                     $surl = createCategoryLink($item->catid, $sparams);
835                 } else {
836                     $surl = addLinkParams($url,array($this->getRequestName() => $id));
837                 }
838                 $extra_scat_string[] = '<a href="'.$this->cnvHtmlUrlAttribute($surl).'">'.htmlspecialchars($name, ENT_QUOTES).'</a>'; //<sato(na)0.5j />
839             }
840             $scat_string = implode($this->ssep,$extra_scat_string);
841             $cat_string = str_replace(array("<%category%>","<%subcategory%>"), array($mcat_string,$scat_string), $this->sform);
842         } else {
843             $cat_string = $mcat_string;
844         }
845         
846         if ($multicatstr = $this->_getMultiCategories($item->itemid)) {
847             $itemcats = explode(",",$multicatstr);
848             $extra_cat_string = array();
849             foreach ($itemcats as $icat){
850                 if ($icat != $item->catid) {
851                     $url = createCategoryLink($icat,$this->param);
852                     if ($CONF['URLMode'] != 'pathinfo') {
853                         list(,$temp_param) = explode("?",$url);
854                         $url = $this->url. "?" . $temp_param;
855                     }
856                     $mcat_string = '<a href="'.$this->cnvHtmlUrlAttribute($url).'">'.htmlspecialchars($this->_getCatNameFromID($icat), ENT_QUOTES).'</a>'; //<sato(na)0.5j />
857                     
858                     if (count($itemScats) > 0 && array_key_exists($icat,$scatMaps)) {
859                         $extra_scat_string = array();
860                         foreach ($scatMaps[$icat] as $id => $name) {
861                             if ($CONF['URLMode'] == 'pathinfo') {
862                                 $sparams = array_merge($this->param, array($this->getRequestName() => $id));
863                                 $surl = createCategoryLink($icat,$sparams);
864                             } else {
865                                 $surl = addLinkParams($url,array($this->getRequestName() => $id));
866                             }
867                             $extra_scat_string[] = '<a href="'.$this->cnvHtmlUrlAttribute($surl).'">'.htmlspecialchars($name, ENT_QUOTES).'</a>'; //<sato(na)0.5j />
868                         }
869                         $scat_string = implode($this->ssep,$extra_scat_string);
870                         $extra_cat_string[] = str_replace(array("<%category%>","<%subcategory%>"), array($mcat_string,$scat_string), $this->sform);
871                     } else {
872                         $extra_cat_string[] = $mcat_string;
873                     }
874                 }
875             }
876             if (count($extra_cat_string) > 0) {
877                 $cat_string .= $this->msep . implode($this->ssep,$extra_cat_string);
878             }
879         }
880         echo $cat_string;//$mcat_string, $scat_string escape OK <sato(na)0.5j />
881     }
882         //<sato(na)0.5j>
883     function cnvHtmlUrlAttribute($forHtmlAtt__str)
884     {
885         //onEvent
886         $forHtmlAtt__str = preg_replace('/[\'"]/', '', $forHtmlAtt__str);
887         
888         //href="javascript:"
889         $forHtmlAtt__str = preg_replace('/javascript/i', '', preg_replace('/[\x00-\x20\x22\x27]/', '', $forHtmlAtt__str));
890         
891         return $forHtmlAtt__str;
892     }
893         //</sato(na)0.5j>
894     
895     function _setCommonData($bid) {
896         global $CONF;
897         $this->msep = $this->getOption('mainsep');
898         $this->ssep = $this->getOption('addsep');
899         $this->sform = $this->getOption('subformat');
900         $this->addindex = ($this->getOption('addindex') == 'yes');
901         $this->addbiddef = ($this->getOption('addblogid_def') == 'yes');
902         $this->addbid = ($this->getOption('addblogid') == 'yes');
903         $this->defurl = quickQuery("SELECT burl as result from ".sql_table('blog')." WHERE bnumber=".addslashes($CONF['DefaultBlog'])); //<sato(na)0.5j />
904         if (!$this->defurl) $this->defurl = $CONF['Self'];
905         $this->_setBlogData($bid);
906     }
907     
908     function _setBlogData($bid) {
909         global $CONF;
910         $this->param = array();
911         $this->bid = intval($bid);
912         if ($bid != $CONF['DefaultBlog']) {
913             $this->url = quickQuery("SELECT burl as result from ".sql_table('blog')." WHERE bnumber=".$this->bid);
914             if (!$this->url) $this->url = $this->defurl;
915         } else {
916             $this->url = $this->defurl;
917         }
918         if ($CONF['URLMode'] == 'normal' && substr($this->url,-1) == "/" && $this->addindex) {
919             $this->url .= "index.php";
920         }
921         if ($this->bid == $CONF['DefaultBlog'] && $this->addbiddef) {
922             $this->param['blogid'] = $this->bid; //$this->bid intval OK
923         } elseif ($this->bid != $CONF['DefaultBlog'] && ($this->url == $this->defurl || $this->addbid)){
924             $this->param['blogid'] = $this->bid; //$this->bid intval OK
925         }
926     }
927     
928     function _parseItem($template, $itemid) {
929         global $manager;
930         
931         $b =& $manager->getBlog(getBlogIDFromItemID($itemid));//Intval is not needed. ($itemid) <sato(na)0.5j />
932         
933         $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';
934         
935         //<sato(na)0.5j>
936         //$query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c'
937         $query .= ' FROM '.sql_table('category').' as c, '.sql_table('member').' as m, '.sql_table('item').' as i'
938         //</sato(na)0.5j>
939                . ' WHERE i.iblog='.intval($b->getID()) //<sato(na)0.5j />
940                . ' and i.iauthor=m.mnumber'
941                . ' and i.icat=c.catid'
942                . ' and i.idraft=0'  // exclude drafts
943                     // don't show future items
944                . ' and i.itime<=' . mysqldate($b->getCorrectTime())
945                . ' and i.inumber='.intval($itemid)
946                . ' ORDER BY i.itime DESC LIMIT 0,1';
947          
948         $b->showUsingQuery($template, $query, 0, 0, 0); 
949         
950     }
951     
952     function showCategoryList() {
953         global $CONF, $manager, $blog, $catid, $subcatid;
954         global $archive, $archivelist;
955         
956         //<sato(na)0.5j>
957         if ($archive) {
958             sscanf ($archive,'%d-%d-%d', $y, $m, $d);
959             if ($d) {
960                 $archive = sprintf ('%04d-%02d-%02d', $y, $m, $d);
961             } else {
962                 $archive = sprintf ('%4d-%02d', $y, $m);
963             }
964         }
965         // check archivelist
966         if (! is_numeric($archivelist)) $archivelist = getBlogIDFromName($archivelist);
967         //</sato(na)0.5j>
968         
969         if ($blog) {
970              $b =& $blog;
971         } else {
972              $b =& $manager->getBlog($CONF['DefaultBlog']);
973         }
974         $blogid = $b->getID();
975         $blogid = (is_numeric($blogid)) ? intval($blogid) : getBlogIDFromName($blogid); //<sato(na)0.5j />
976         
977         if (!isset($this->defurl)) $this->_setCommonData($blogid);
978         
979         $linkparams = array();
980         if ($archive) {
981             $blogurl = createArchiveLink($blogid, $archive, '');
982             if ($CONF['URLMode'] != 'pathinfo') {
983                 list(,$temp_param) = explode("?",$url);
984                 $blogurl = $this->url. "?" . $temp_param;
985             }
986             $linkparams['blogid'] = $blogid;
987             $linkparams['archive'] = $archive;
988         } else if ($archivelist) {
989             $blogurl = createArchiveListLink($blogid, '');
990             if ($CONF['URLMode'] != 'pathinfo') {
991                 list(,$temp_param) = explode("?",$blogurl);
992                 $blogurl = $this->url. "?" . $temp_param;
993             }
994             $linkparams['archivelist'] = $archivelist;
995         } else {
996             $blogurl = $this->url;
997             $linkparams = $this->param;
998         } 
999         
1000
1001         echo TEMPLATE::fill($this->getOption('catheader'),
1002                             array(
1003                                 'blogid' => $blogid,
1004                                 'blogurl' => $blogurl,
1005                                 'self' => $CONF['Self']
1006                             ));
1007         /* begin modification by kat */
1008         $items=array();
1009         $catdata=array();
1010         $scatdata=array();
1011         $query = 'SELECT inumber,icat FROM '.sql_table('item').
1012             ' WHERE iblog='.(int)$blogid;
1013         $res = sql_query($query);
1014         while ($row=mysql_fetch_row($res)) {
1015             $items[$row[0]]=true;
1016             $catdata[$row[1]][$row[0]]=true;
1017             
1018         }
1019         $query = 'SELECT item_id, categories, subcategories FROM '.sql_table('plug_multiple_categories');
1020         $res = sql_query($query);
1021         while ($row=mysql_fetch_row($res)) {
1022             if (!$items[$row[0]]) continue;
1023             foreach(explode(',',$row[1]) as $cat) if ($cat) $catdata[$cat][$row[0]]=true;
1024             foreach(explode(',',$row[2]) as $scat) if ($scat) $scatdata[$scat][$row[0]]=true;
1025         }
1026         /* end modification by kat */
1027
1028         $query = 'SELECT c.catid, c.cdesc as catdesc, c.cname as catname FROM '.sql_table('category').
1029             ' as c WHERE c.cblog=' . intval($blogid) . ' GROUP BY c.cname ORDER BY c.cname ASC'; //<sato(na)0.5j />
1030         $res = sql_query($query);
1031
1032         $tp = array();
1033         $tp['catlist'] = $this->getOption('catlist');
1034         $tp['subheader'] = $this->getOption('subheader');
1035         $tp['sublist'] = $this->getOption('sublist');
1036         $tp['subfooter'] = $this->getOption('subfooter');
1037         $replace = ($this->getOption('replace') == 'yes');
1038         if ($replace) {
1039             $rchar = $this->getOption('replacechar');
1040         }
1041         
1042         while ($data = mysql_fetch_assoc($res)) {
1043             $data['catid'] = intval($data['catid']); //<sato(na)0.5j />ultrarich
1044             $data['blogid'] = $blogid;  
1045             $data['blogurl'] = $blogurl;
1046             $data['catlink'] = createCategoryLink($data['catid'], $linkparams);
1047             if ($CONF['URLMode'] != 'pathinfo') {
1048                 list(,$temp_param) = explode("?",$data['catlink']);
1049                 $data['catlink'] = $this->url. "?" . $temp_param;
1050             }
1051             $data['self'] = $CONF['Self'];
1052             if ($data['catid'] == intval($catid)) { //<sato(na)0.5j />
1053                 $data['catflag'] = $this->getOption('catflag');
1054             }
1055             /* begin modification by kat */
1056             /*
1057             $cq = 'SELECT count(*) as result FROM '.sql_table('item').' as i';
1058             $cq .= ' LEFT JOIN '.sql_table('plug_multiple_categories').' as p ON  i.inumber=p.item_id';
1059             $cq .= ' WHERE ((i.inumber=p.item_id and (p.categories REGEXP "(^|,)'.$data['catid'].'(,|$)" or i.icat='.$data['catid'].')) or (p.item_id IS NULL and i.icat='.$data['catid'].'))';
1060             $cq .= ' and i.itime<=' . mysqldate($b->getCorrectTime()) . ' and i.idraft=0';
1061             
1062             $data['catamount'] = quickQuery($cq);
1063             */
1064             $data['catamount']=count($catdata[$data['catid']]);
1065             /* end modification by kat */
1066             if (intval($data['catamount']) < 1) {
1067                 continue;
1068             }
1069             
1070             $query = 'SELECT scatid as subcatid, sname as subname, sdesc as subdesc FROM '.sql_table('plug_multiple_categories_sub').' WHERE catid='.$data['catid']. ' ORDER BY sname ASC';
1071             $sres = sql_query($query);
1072             if (mysql_num_rows($sres) > 0) {
1073                 $subliststr = "";
1074                 
1075                 while ($sdata = mysql_fetch_assoc($sres)) {
1076                     $sdata['subcatid'] = intval($sdata['subcatid']); //<sato(na)0.5j />ultrarich
1077                     /* begin modification by kat */
1078                     /*
1079                     $ares = sql_query(
1080                         'SELECT count(i.inumber) FROM '
1081                         . sql_table('item').' as i, '
1082                         . sql_table('plug_multiple_categories').' as p'
1083                         . ' WHERE i.idraft=0 and i.itime<='.mysqldate($b->getCorrectTime())
1084                         . ' and i.inumber=p.item_id'
1085                         . ' and p.subcategories REGEXP "(^|,)'.$sdata['subcatid'].'(,|$)"'
1086                     );
1087                     if ($ares && $row = mysql_fetch_row($ares)) {
1088                     */
1089                     if ($row[0]=count($scatdata[$sdata['subcatid']])) {
1090                     /* end modification by kat */
1091                         $sdata['subamount'] = $row[0];
1092                         if ($sdata['subamount'] > 0) {
1093                             if ($CONF['URLMode'] == 'pathinfo') {
1094                                 $sparams = array_merge($linkparams, array($this->getRequestName() => $sdata['subcatid']));
1095                                 $sdata['sublink'] = createCategoryLink($data['catid'],$sparams);
1096                             } else {
1097                                 $sdata['sublink'] = addLinkParams($data['catlink'], array($this->getRequestName() => $sdata['subcatid']));
1098                             }
1099                             if ($sdata['subcatid'] == $subcatid) {
1100                                 $sdata['subflag']= $this->getOption('subflag');
1101                             }
1102                             $subliststr .= TEMPLATE::fill($tp['sublist'],$sdata);
1103                         }
1104                     }
1105                 }
1106                 if ($subliststr) {
1107                     $data['subcategorylist'] = $tp['subheader'];
1108                     $data['subcategorylist'] .= $subliststr;
1109                     $data['subcategorylist'] .= $tp['subfooter'];
1110                     if ($replace) {
1111                         $data['amount'] = $rchar;
1112                     }
1113                 }
1114             }
1115             mysql_free_result($sres);
1116
1117             echo TEMPLATE::fill($tp['catlist'],$data);
1118
1119         }
1120         
1121         mysql_free_result($res);
1122
1123         echo TEMPLATE::fill($this->getOption('catfooter'),
1124                             array(
1125                                 'blogid' => $blogid,
1126                                 'blogurl' => $blogurl,
1127                                 'self' => $CONF['Self']
1128                             ));
1129     }
1130     
1131     function showArchiveList($mode = 'month', $limit = 0) {
1132         global $CONF, $manager, $blog, $catid, $subcatid;
1133
1134         if ($blog) {
1135              $b =& $blog;
1136         } else {
1137              $b =& $manager->getBlog($CONF['DefaultBlog']);
1138         }
1139         
1140         if ($catid) $linkparams = array('catid' => intval($catid)); //<sato(na)0.5j />
1141         if ($subcatid) $linkparams['subcatid'] = intval($subcatid); //<sato(na)0.5j />
1142         if ($lc = $this->getOption('locale')) {
1143             setlocale(LC_TIME,$lc);
1144         }
1145         
1146         $template['header'] = $this->getOption('archeader');
1147         $template['list'] = $this->getOption('arclist');
1148         $template['footer'] = $this->getOption('arcfooter');
1149
1150         echo TEMPLATE::fill($template['header'],array('blogid'=>$b->getID()));
1151
1152         $query = 'SELECT i.itime, SUBSTRING(i.itime,1,4) AS Year, SUBSTRING(i.itime,6,2) AS Month, SUBSTRING(i.itime,9,2) as Day FROM '.sql_table('item').' as i';
1153         if ($catid) {
1154             $query .= ' LEFT JOIN '.sql_table('plug_multiple_categories').' as p ON i.inumber=p.item_id';
1155         }
1156         $query .= ' WHERE i.iblog=' . intval($b->getID()) //<sato(na)0.5j />
1157         . ' and i.itime <=' . mysqldate($b->getCorrectTime())   // don't show future items!
1158         . ' and i.idraft=0'; // don't show draft items
1159         
1160         if ($catid) {
1161             $query .= ' and ((i.inumber=p.item_id and (p.categories REGEXP "(^|,)'.intval($catid).'(,|$)" or i.icat='.intval($catid).')) or (i.icat='.intval($catid).' and p.item_id IS NULL))';
1162         }
1163         if ($subcatid) {
1164             $query .= ' and p.subcategories REGEXP "(^|,)'.intval($subcatid).'(,|$)"';
1165         }
1166         
1167         $query .= ' GROUP BY Year, Month';
1168         if ($mode == 'day')
1169             $query .= ', Day';
1170         
1171         $query .= ' ORDER BY i.itime DESC';
1172         
1173         if ($limit > 0) 
1174             $query .= ' LIMIT ' . intval($limit);
1175         
1176         $res = sql_query($query);
1177
1178         while ($current = mysql_fetch_object($res)) {
1179             $current->itime = strtotime($current->itime);   // string time -> unix timestamp
1180             $data = array('blogid'=>$b->getID());
1181         
1182             if ($mode == 'day') {
1183                 $archivedate = date('Y-m-d',$current->itime);
1184                 $data['day'] = date('d',$current->itime);
1185             } else {
1186                 $archivedate = date('Y-m',$current->itime);
1187             }
1188             $data['month'] = date('m',$current->itime);
1189             $data['year'] = date('Y',$current->itime);
1190             $data['archivelink'] = createArchiveLink($b->getID(),$archivedate,$linkparams);
1191             if ($CONF['URLMode'] != 'pathinfo') {
1192                 list(,$temp_param) = explode("?",$data['archivelink']);
1193                 $data['archivelink'] = $this->url. "?" . $temp_param;
1194             }
1195
1196             $temp = TEMPLATE::fill($template['list'], $data);
1197             echo strftime($temp,$current->itime);
1198         }
1199         mysql_free_result($res);
1200
1201         echo TEMPLATE::fill($template['footer'],array('blogid'=>$b->getID()));
1202     }
1203     
1204     //<sato(na)0.5.1j>
1205     function doIf($name='', $value = '')
1206     {
1207         global $subcatid;
1208
1209         if ($name == 'subcategory' || ($value == ''))
1210             return $this->isValidSubCategory($subcatid);
1211
1212         if ($name == 'subcatname') {
1213             //Even as for "subcategory" with same "parent", the name is not unique either.
1214             $scatname = _getScatNameFromID($subcatid);
1215             if ($value == $scatname)
1216                 return $this->isValidSubCategory($subcatid);
1217         }
1218
1219         if (($name == 'subcatid') && ($value == $subcatid))
1220             return $this->isValidSubCategory($subcatid);
1221
1222         return false;
1223     }
1224     function isValidSubCategory($subcatid) {
1225 //              global $blog;
1226         global $manager;
1227 //              $catid = quickQuery('SELECT catid AS result FROM '.sql_table('plug_multiple_categories_sub').' WHERE scatid=' . intval($subcatid));
1228 // <mod by shizuki>
1229         $catid = $this->_getParentCatID($subcatid);
1230         $bid   = getBlogIDFromCatID($catid);
1231         $b     = $manager->getBlog($bid);
1232 //              return $blog->isValidCategory($catid);
1233         return $b->isValidCategory($catid);
1234 // </ mod by shizuki>
1235     }
1236     //</sato(na)0.5.1j>
1237
1238 }
1239 ?>