From: kmorimatsu Date: Tue, 13 May 2008 00:16:27 +0000 (+0000) Subject: ver 0.2.9.7 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=a65c5b733b7173b45d3712b89a1944b6c92b1299;p=nucleus-jp%2Fnucleus-plugins.git ver 0.2.9.7 git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@622 1ca29b6e-896d-4ea0-84a5-967f57386b96 --- diff --git a/trunk/NP_SubSilver/plugins/NP_OnlineUsers.php b/trunk/NP_SubSilver/plugins/NP_OnlineUsers.php new file mode 100644 index 0000000..7a8233d --- /dev/null +++ b/trunk/NP_SubSilver/plugins/NP_OnlineUsers.php @@ -0,0 +1,128 @@ +getName().' plugin'; } + function supportsFeature($what) { return (int)($what=='SqlTablePrefix'); } + function getEventList() { return array('PreSkinParse'); } + function getTableList() { return $this->sql_query('list'); } + function install() { + $this->sql_query('create','( + id int(11) not null auto_increment, + ip varchar(16) not null default "000.000.000.000", + mid int(11) not null default 0, + itemid int(11) not null default 0, + catid int(11) not null default 0, + time datetime not null default "0000-00-00 00:00:00", + PRIMARY KEY id(id) + )'); + $this->createOption('howlong','How many minutes do you collect the data?','text','5','datatype=numerical'); + $this->createOption('siteadmin','Template for showing siteadmin:','textarea','<%name%>'); + $this->createOption('moderator','Template for showing blogadmin:','textarea','<%name%>'); + $this->createOption('member','Template for showing other member:','textarea','<%name%>'); + $this->createOption('maxonlinenum','Maximum online user number','text','0','access=hidden'); + $this->createOption('recorddate','When recorded (timestamp)?','text','0','access=hidden'); + } + function unInstall() { $this->sql_query('drop'); } + var $data=false; + function doSkinVar($skinType,$type,$p1='') { + global $manager, $itemid, $catid; + if (!$this->data){ + $res=$this->sql_query('SELECT * FROM'); + $this->data=array(); + while($row=mysql_fetch_assoc($res)) $this->data[]=$row; + mysql_free_result($res); + if (count($this->data)>(int)$this->getOption('maxonlinenum')) { + $this->setOption('maxonlinenum',count($this->data)); + $this->setOption('recorddate',$this->time); + } + } + switch($type=strtolower($type)){ + case 'online': + case 'member': + case 'guest': + $count=0; + foreach($this->data as $row){ + if (0<$row[mid]){ + if ($type!='guest') $count++; + } else { + if ($type!='member') $count++; + } + } + echo (int)$count; + break; + case 'recordtime': + $template =& $manager->getTemplate($p1); + echo strftime($template['FORMAT_TIME'],$this->getOption('recorddate')); + break; + case 'recorddate': + $template =& $manager->getTemplate($p1); + echo strftime($template['FORMAT_DATE'],$this->getOption('recorddate')); + break; + case 'howlong': + case 'maxonlinenum': + echo htmlspecialchars($this->getOption($type),ENT_QUOTES); + break; + case 'onlinelist': + $moderators=array(); + $query='SELECT m.mnumber FROM '.sql_table('member').' as m, '. + sql_table('team').' as t'. + ' WHERE m.mnumber=t.tmember AND t.tadmin>0'; + $res=sql_query($query); + while($row=mysql_fetch_row($res)) $moderators[$row[0]]=$row[0]; + mysql_free_result($res); + $list=array(); + $extra=strstr($p1,'category')?' AND o.catid='.(int)$catid:''; + $extra.=strstr($p1,'item')?' AND o.itemid='.(int)$itemid:''; + $query='SELECT m.mnumber as mid, m.mrealname as name, m.madmin as admin FROM '. + sql_table('member').' as m, '.$this->sql_query('name').' as o'. + ' WHERE m.mnumber=o.mid'.$extra.' ORDER BY o.time DESC'; + $res=sql_query($query); + while($row=mysql_fetch_assoc($res)) { + $template=$this->getOption('member'); + if ($moderators[$row['mid']]) $template=$this->getOption('moderator'); + if ($row['admin']) $template=$this->getOption('siteadmin'); + $list[]=TEMPLATE::fill($template,array('name'=>htmlspecialchars($row['name'],ENT_QUOTES))); + } + mysql_free_result($res); + echo implode(',',$list); + default: + break; + } + } + function event_PreSkinParse(){ + global $blog,$member,$catid,$itemid; + if ($blog) $this->time=$blog->getCorrectTime(); + else $this->time=time(); + $ip=addslashes(serverVar('REMOTE_ADDR')); + $this->sql_query('DELETE FROM','WHERE ip="'.$ip.'"'. + ' OR ( mid='.(int)$member->getID().' AND mid>0 )'. + ' OR time<='.mysqldate(($this->time)-$this->getOption('howlong')*60)); + $this->sql_query('INSERT INTO','SET'. + ' ip="'.$ip.'"'. + ',mid='.(int)$member->getID(). + ',itemid='.(int)$itemid. + ',catid='.(int)$catid. + ',time='.mysqldate($this->time)); + } + function sql_query($mode='name',$p1=''){ + $tablename[0]=sql_table(strtolower('plugin_'.substr(get_class($this),3))); + switch($mode){ + case 'create': return sql_query('CREATE TABLE IF NOT EXISTS '.$tablename[0].' '.$p1); + case 'drop': return sql_query('DROP TABLE IF EXISTS '.$tablename[0]); + case 'list': return $tablename; + case 'name': return $tablename[0]; + default: return sql_query($mode.' '.$tablename[0].' '.$p1); + } + } + function quickQuery($mode,$p1){ + $row=mysql_fetch_assoc($res=$this->sql_query($mode,$p1)); + mysql_free_result($res); + return $row['result']; + } + //function getOption($name){ return $this->_getOption('global', 0, $name); }//required for Nucleus 3.24 +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/NP_subSilver.php b/trunk/NP_SubSilver/plugins/NP_subSilver.php new file mode 100644 index 0000000..58556e9 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/NP_subSilver.php @@ -0,0 +1,416 @@ +getName().' plugin'; } + function supportsFeature($what) { return (int)($what=='SqlTablePrefix'); } + function getEventList() { + return array('QuickMenu','InitSkinParse','PostAuthentication', + 'SpamCheck','PostAddComment','ValidateForm', + 'PreDeleteComment','PostDeleteComment','PreUpdateComment','PrepareCommentForEdit', + 'PostAddItem','PostAddCategory'); + } + function getTableList() { return $this->sql_query('list'); } + function install() { return call_user_func(array($this->loadClass('install'),'install')); } + function unInstall() { return call_user_func(array($this->loadClass('install'),'unInstall')); } + //function init() {} + function sql_query($mode='name',$p1=''){ + $tablename[0]=sql_table(strtolower('plugin_'.substr(get_class($this),3))); + switch($mode){ + case 'create': return sql_query('CREATE TABLE IF NOT EXISTS '.$tablename[0].' '.$p1); + case 'drop': return sql_query('DROP TABLE IF EXISTS '.$tablename[0]); + case 'list': return $tablename; + case 'name': return $tablename[0]; + default: return sql_query($mode.' '.$tablename[0].' '.$p1); + } + } + function quickQuery($mode,$p1){ + $row=mysql_fetch_assoc($res=$this->sql_query($mode,$p1)); + mysql_free_result($res); + if (!$row) return false; + return $row['result']; + } + var $commentquery='cid';// for example, 'cid' of 'http://www..com/?itemid=1&cid=5#cid5' + var $searchincform='
'; + var $home=false; + var $skin; + var $skintype; + var $showstickies=false;// see NP_subSilver_SKIN::showStickies and NP_subSilver_TEMPLATE::_if() + var $query_null=false;// See NP_subSilver_BLOG::getSqlSearch() + var $limit=10;// See NP_subSilver_BLOG_MEMBER::getSqlBlog() + var $langobj;// See NP_subSilver_text::doSkinVar() + function event_QuickMenu(&$data) { + global $member; + if (!($member->isLoggedIn() && $member->isAdmin())) return; + array_push($data['options'], array('title' => $this->getName(), + 'url' => '?action=pluginoptions&plugid='.(int)$this->getId(), + 'tooltip' => $this->getName() ) ); +?>noblogid=true; + } + // Restrict member's admin area. + global $member,$DIR_PLUGINS,$HTTP_POST_VARS,$action; + if ($member->isAdmin()) return; + if (strpos(realpath('./'),realpath($DIR_PLUGINS))===0) return; + if (strpos(realpath('./'),realpath($DIR_NUCLEUS))!==0) return; + $invalid=array('createitem'); + if ( !(postVar('ticket') || getVar('ticket')) && (!in_array($action,$invalid)) ) return; + $obj=&$this->loadClass('member'); + return $obj->event_PostAuthentication(); + } +/* General stuffs when the skin parse */ + function event_InitSkinParse(&$data){ + // Reset global $blogid if it's set in event_PostAuthentication. + // This is for avoiding error on search page when blogid isn't set. + // Also see the NP_subSilver_BLOG::getSqlSearch() function. + global $blogid; + if ($this->noblogid) $blogid=''; + // Check if homepage. + global $HTTP_SERVER_VARS,$CONF; + if (!isset($_SERVER)) $_SERVER=&$HTTP_SERVER_VARS; + if (!isset($_SERVER['REQUEST_URI'])) { + $_SERVER['REQUEST_URI']=str_replace(array('%2F','%2f'),'/',urlencode($_SERVER['PHP_SELF'])).'?'.$_SERVER['QUERY_STRING']; + } + $iuri=preg_replace('!^([^:]+)://([^/]+)/!','/',$CONF['IndexURL']); + if ($_SERVER['REQUEST_URI']==$iuri || $_SERVER['REQUEST_URI']==$iuri.'index.php') { + $this->home=true; + } elseif( !( getVar('blogid') || postVar('blogid') || + getVar('catid') || postVar('catid') || + getVar('itemid') || postVar('itemid') ) ) { + $this->home=true; + } + // Redirect just after logout. + if (getVar('action')=='logout') { + redirect(preg_replace('/^([^\?]+)\?([\s\S]*)$/','$1',$_SERVER['REQUEST_URI'])); + exit; + } + // Set skin object + $this->skin=&$data['skin']; + $this->skintype=$data['type']; + // Set category if item page. + global $catid,$itemid; + if ($itemid && !$catid) $catid=quickQuery('SELECT icat as result FROM '.sql_table('item').' WHERE inumber='.(int)$itemid); + // Count up the readnum column of table + //$_SERVER['REMOTE_ADDR']=rand(0,255).'.'.rand(0,255).'.'.rand(0,255).'.'.rand(0,255); + if ($itemid) { + if ($readip=$this->quickQuery('SELECT readip as result FROM','WHERE itemid='.(int)$itemid. + ' AND readip NOT LIKE "%,'.addslashes(serverVar('REMOTE_ADDR')).',%"')){ + $this->sql_query('UPDATE','SET'. + ' readnum=readnum+1'. + //',readip=CONCAT(SUBSTRING(readip,LOCATE(",",readip,2)),"'.addslashes(serverVar('REMOTE_ADDR')).',")'. + ',readip="'.addslashes(substr($readip,strpos($readip,',',1)).serverVar('REMOTE_ADDR')).',"'. + ' WHERE itemid='.(int)$itemid); + } + } + // Set the item read. + global $member; + if ($member->isLoggedIn()) { + $mstr=addslashes(','.$member->getId().','); + if ($itemid) { + $this->sql_query('UPDATE','SET '. + 'unread=CONCAT(LEFT(unread,INSTR(unread,"'.$mstr.'")),SUBSTRING(unread,INSTR(unread,"'.$mstr.'")+'.strlen($mstr).'))'. + ' WHERE itemid='.(int)$itemid); + } elseif (getVar('subSilver_action')=='mark') { + if ($cid=intGetVar('catid')) { + $this->sql_query('UPDATE','as s, '.sql_table('item').' as i SET '. + 's.unread=CONCAT(LEFT(s.unread,INSTR(s.unread,"'.$mstr.'")),SUBSTRING(s.unread,INSTR(s.unread,"'.$mstr.'")+'.strlen($mstr).'))'. + ' WHERE s.itemid=i.inumber'. + ' AND i.icat='.(int)$cid); + } elseif ($bid=intGetVar('blogid')) { + $this->sql_query('UPDATE','as s, '.sql_table('item').' as i, '.sql_table('category').' as c'.' SET '. + 's.unread=CONCAT(LEFT(s.unread,INSTR(s.unread,"'.$mstr.'")),SUBSTRING(s.unread,INSTR(s.unread,"'.$mstr.'")+'.strlen($mstr).'))'. + ' WHERE s.itemid=i.inumber'. + ' AND i.icat=c.catid'. + ' AND c.cblog='.(int)$bid); + } else { + $this->sql_query('UPDATE','SET '. + 'unread=CONCAT(LEFT(unread,INSTR(unread,"'.$mstr.'")),SUBSTRING(unread,INSTR(unread,"'.$mstr.'")+'.strlen($mstr).'))'. + ' WHERE 1'); + } + + } + } + // Error message (must use htmlspecialchars) + global $errormessage; + if ($msg=getVar('errormessage')) $errormessage=str_replace('&amp;','&',htmlspecialchars($msg,ENT_QUOTES)); + // Replace blog object for searching/memberlist feature. + global $blog,$query; + if ($blog && $data['type']=='search') { //if ($blog && ( $query||getVar('search_author') )) { + $obj=&$this->loadClass('search'); + $bid=$blog->getId(); + $blog=new NP_subSilver_BLOG($bid,$this); + if (!$query) { + // Create put temporary string into $query. + // This will be removed in NP_subSilver_BLOG::getSqlSearch() + $query = 'author: '.getVar('search_author'); + $this->query_null=true; + } + } elseif ($blog && $data['type']=='member'){ + $obj=&$this->loadClass('member'); + $bid=$blog->getId(); + $blog=new NP_subSilver_BLOG_MEMBER($bid,$this); + } + // Use language class + $this->loadClass('skin'); + $this->langobj=new NP_subSilver_text; + } +/* Following three events are used for posting */ + function event_SpamCheck(){ + if (postVar('subSilver_action')=='posting') { + $obj=&$this->loadClass('posting'); + return $obj->posting('SpamCheck',$data); + } + } + function event_ValidateForm(&$data){ + if (postVar('subSilver_action')=='posting') { + $obj=&$this->loadClass('posting'); + return $obj->posting('ValidateForm',$data); + } + } + function event_PostAddComment(&$data){ + $this->_event_everycomment(); + if (postVar('subSilver_action')=='posting') { + $obj=&$this->loadClass('posting'); + return $obj->posting('PostAddComment',$data); + } else { + $obj=&$this->loadClass('comments'); + return $obj->event_PostAddComment(&$data); + } + } + // PostAddItem event occurs when a new blog is created. + function event_PostAddItem(&$data){ + $obj=&$this->loadClass('posting'); + return $obj->event_PostAddItem($data); + } + function event_PostAddCategory(&$data){ + $obj=&$this->loadClass('posting'); + return $obj->event_PostAddCategory($data); + } +/* Following events are used when the comment is modified */ + function event_PreDeleteComment(&$data){ + $obj=&$this->loadClass('comments'); + return $obj->event_PreDeleteComment(&$data); + } + function event_PostDeleteComment(&$data){ + $obj=&$this->loadClass('comments'); + return $obj->event_PostDeleteComment(&$data); + } + function event_PrepareCommentForEdit(&$data){ + $obj=&$this->loadClass('comments'); + return $obj->event_PrepareCommentForEdit(&$data); + } + function event_PreUpdateComment(&$data){ + $obj=&$this->loadClass('comments'); + return $obj->event_PreUpdateComment(&$data); + } +/* General class object manager */ + var $classobjects=array(); + function &loadClass($name){ + if (isset($this->classobjects[$name])) return $this->classobjects[$name]; + if (file_exists($phpfile=dirname(__FILE__).'/subsilver/'.$name.'.php')) require_once($phpfile); + switch($name){ + case 'install': $this->classobjects[$name]=new NP_subSilver_install($this); break; + case 'posting': $this->classobjects[$name]=new NP_subSilver_posting($this); break; + case 'skin': $this->classobjects[$name]=new NP_subSilver_SKIN($this); break; + case 'member': $this->classobjects[$name]=new NP_subSilver_member($this); break; + case 'template': $this->classobjects[$name]=new NP_subSilver_TEMPLATE($this); break; + case 'comments': $this->classobjects[$name]=new NP_subSilver_COMMENTS($this); break; + case 'action': $this->classobjects[$name]=new NP_subSilver_action($this); break; + case 'search': $this->classobjects[$name]=new NP_subSilver_search($this); break; + default: exit('loadClass: error'); + } + return $this->classobjects[$name]; + } +/* common functions follow */ + var $stickydata; + function &infoSticky(){ + // List up all "information" and "sticky" items. + if (!isset($this->stickydata)) { + $this->stickydata=array(); + $res=sql_query('SELECT o.ovalue as value, o.ocontextid as itemid FROM '. + sql_table('plugin_option_desc').' as d, '. + sql_table('plugin_option').' as o '. + ' WHERE d.oname="iteminfo"'. + ' AND d.oid=o.oid'. + ' AND d.opid='.(int)$this->getId(). + ' AND NOT (o.ovalue=d.odef)'); + while($row=mysql_fetch_assoc($res)) $this->stickydata[$row['itemid']]=$row['value']; + mysql_free_result($res); + } + return $this->stickydata; + } + var $popularitemdata; + function popularItems($itemid=0){ + $popularnum=$this->getOption('popularnum'); + $populardef=$this->getOption('populardef'); + $populardef=TEMPLATE::fill($populardef,array( + 'days'=>'((1+UNIX_TIMESTAMP(s.time)-UNIX_TIMESTAMP(s.since))/86400)', + 'viewed'=>'s.readnum', + 'replies'=>'s.replynum' + )); + if (!isset($this->popularitemdata)) { + $this->popularitemdata=array(); + $res=$this->sql_query('SELECT itemid FROM','as s '. + ' ORDER BY ('.$populardef.')'. + ' DESC LIMIT '.(int)$popularnum); + while($row=mysql_fetch_row($res)) $this->popularitemdata[]=$row[0]; + mysql_free_result($res); + } + if ($itemid) return in_array($itemid,$this->popularitemdata); + return $this->popularitemdata; + } + function _event_everycomment(){ + // This function is called every "add comment" event. + global $itemid,$manager; + $blog =& $manager->getBlog(getBlogIDFromItemID($itemid)); + $timestamp=$blog->getCorrectTime(); + // Update the timestamp of item + sql_query('UPDATE '.sql_table('item'). + ' SET itime='.mysqldate($timestamp). + ' WHERE inumber='.(int)$itemid); + // Remove old "unread" data + $this->sql_query('UPDATE','SET unread=","'. + ' WHERE time<'.mysqldate($timestamp-$this->getOption('unreaddays')*86400). + ' AND NOT (unread=",")' ); + } +/* doXxx(Vars) follow */ + function doAction(){ + $args=func_get_args(); + $class=&$this->loadClass('action'); + return call_user_func_array(array(&$class,'doAction'),$args); + } + function doSkinVar() { + $args=func_get_args(); + if ($args[0]=='member'){ + if ($args[1]=='member') { + $class=&$this->loadClass('member'); + return call_user_func_array(array(&$class,'doSkinVar'),$args); + } + } + $class=&$this->loadClass('skin'); + return call_user_func_array(array(&$class,'doSkinVar'),$args); + } + function doTemplateVar() { + $args=func_get_args(); + $class=&$this->loadClass('template'); + return call_user_func_array(array(&$class,'doTemplateVar'),$args); + } + function doTemplateCommentsVar(&$item,&$comment,$type) { + $args=func_get_args(); + switch(strtolower($type)){ + case 'member': + $class=&$this->loadClass('member'); + return call_user_func_array(array(&$class,'doTemplateCommentsVar'),$args); + default: + $class=&$this->loadClass('comments'); + return call_user_func_array(array(&$class,'doTemplateCommentsVar'),$args); + } + } + var $isblogadmin=array(); + var $every=array(); + function doIf($mode,$p1=''){ + global $blog,$member,$memberid,$memberinfo; + if (!preg_match('/^([^=]+)=([^=]*)$/',$p1,$matches)) exit('doIf: error 1'); + $name=$matches[1]; + $value=$matches[2]; + switch(strtolower($mode)){ + case 'every': + if (isset($this->every[$name])) $this->every[$name]++; + else $this->every[$name]=1; + if ($this->every[$name]<(int)$value) return false; + $this->every[$name]=0; + return true; + case 'globalvar': + return $GLOBALS[$name]==$value; + case 'intglobalvar': + return (int)$GLOBALS[$name]==(int)$value; + case 'thisvar': + return $this->$name==$value; + case 'intthisvar': + return (int)$this->$name==(int)$value; + case 'getvar': + return getVar($name)==$value; + case 'intgetvar': + return (int)getVar($name)==(int)$value; + case 'postvar': + return postVar($name)==$value; + case 'intpostvar': + return (int)postVar($name)==(int)$value; + case 'requestvar': + if ($value) return postVar($name)==$value || getVar($name)==$value; + else return postVar($name)=='' && getVar($name)==''; + case 'intrequestvar': + if ($value) return (int)postVar($name)==(int)$value || (int)getVar($name)==(int)$value; + else return (int)postVar($name)==0 && (int)getVar($name)==0; + case 'member': + switch($name){ + case 'position': + switch(strtolower($value)){ + case 'superadmin': + return $memberinfo->isAdmin(); + case 'blogadmin': + if (isset($this->isblogadmin[$memberid])) return $this->isblogadmin[$memberid]; + return $this->isblogadmin[$memberid]=quickQuery('SELECT COUNT(*) as result FROM '.sql_table('team'). + ' WHERE tmember='.(int)$memberid.' AND tadmin=1 LIMIT 1'); + case 'ownerofpage': + if (!$member->isLoggedIn()) return false; + if ($member->isAdmin()) return true; + return $member->getId()==$memberid; + default: exit('doIf: error 4'); + } + case 'has': + switch(strtolower($value)){ + case 'url': + $obj=&$this->loadClass('member'); + $data=$obj->getData($memberid); + return (bool)$data['url']; + default: exit('doIf: error 4'); + } + case 'can': + switch(strtolower($value)){ + case 'postnew': + if ($this->getBlogOption($blog->getID(),'blogpostingbyguest')!='yes' && !$member->isLoggedIn()) return false; + case 'reply': + if (!$blog->getSetting('bcomments')) return false; + if ($member->isAdmin() || $member->isBlogAdmin($blog->getID())) return true; + if ($this->getBlogOption($blog->getID(),'bloghidden')=='yes') return false; + if ($member->isLoggedIn() || $blog->getSetting('bpublic')) return true; + return false; + case 'editcomment': + if (!$member->isLoggedIn()) return false; + if (!$member->canLogin()) return false; + return true; + default: exit('doIf: error 4'); + } + default: exit('doIf: error 3'); + } + default: exit('doIf: error 2'); + } + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/.htaccess b/trunk/NP_SubSilver/plugins/subsilver/.htaccess new file mode 100644 index 0000000..c4b37f0 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/.htaccess @@ -0,0 +1,3 @@ +Order allow,deny +Deny from all +#EOF diff --git a/trunk/NP_SubSilver/plugins/subsilver/action.php b/trunk/NP_SubSilver/plugins/subsilver/action.php new file mode 100644 index 0000000..cf22002 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/action.php @@ -0,0 +1,12 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + } + function doAction($type,$p1='') { + echo htmlspecialchars($type); + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/comments.php b/trunk/NP_SubSilver/plugins/subsilver/comments.php new file mode 100644 index 0000000..d73cee9 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/comments.php @@ -0,0 +1,83 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + } +/* Reply to the topic (see posting.php for creating new topic) */ + function event_PostAddComment(&$data){ + global $manager; + $itemid=quickQuery('SELECT citem as result FROM '.sql_table('comment').' WHERE cnumber='.(int)$data['commentid']); + $blog =& $manager->getBlog(getBlogIDFromItemID($itemid)); + $timestamp=$blog->getCorrectTime(); + // List up all members. + $members=','; + $res=sql_query('SELECT mnumber FROM '.sql_table('member')); + while($row=mysql_fetch_row($res)) $members.=$row[0].','; + mysql_free_result($res); + // Update data in SQL table + $itemid=quickQuery('SELECT citem as result FROM '.sql_table('comment').' WHERE cnumber='.(int)$data['commentid']); + $replies=-1+(int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment').' WHERE citem='.(int)$itemid); + $this->plug->sql_query('UPDATE','SET lastcommentid='.(int)$data['commentid'].','. + ' time='.mysqldate($timestamp).','. + ' unread="'.addslashes($members).'",'. + ' readip=",,,,,,",'. + ' replynum='.(int)$replies. + ' WHERE itemid='.(int)$itemid); + // redirect to the new reply + $url=createItemLink($itemid, array('cid'=>(int)$data['commentid'])).'#cid'.(int)$data['commentid']; + redirect(str_replace('&','&',$url)); + exit; + } +/* Following events are used when the comment is modified */ + var $deleteitemid=false; + function event_PreDeleteComment(&$data){// If there is just one comment for item, register the itemid + $itemid=quickQuery('SELECT citem as result FROM '.sql_table('comment').' WHERE cnumber='.(int)$data['commentid']); + if (1==quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment').' WHERE citem='.(int)$itemid)) $this->deleteitemid=$itemid; + } + function event_PostDeleteComment(&$data){// If there were just one comment for item. Let's delete the item. + if (!$this->deleteitemid) return; + sql_query('DELETE FROM '.sql_table('item').' WHERE inumber='.(int)$this->deleteitemid); + $this->plug->sql_query('DELETE FROM','WHERE itemid='.(int)$this->deleteitemid); + } + function event_PrepareCommentForEdit(&$data){// Add xxxx if first comment in item. + if ($itemid=$this->plug->quickQuery('SELECT itemid as result FROM','WHERE firstcommentid='.(int)$data['comment']['commentid'])) { + $title=quickQuery('SELECT ititle as result FROM '.sql_table('item').' WHERE inumber='.(int)$itemid); + $data['comment']['body']='<title>'.htmlspecialchars($title)."</title>\n".$data['comment']['body']; + } + } + function event_PreUpdateComment(&$data){// Pickup xxxx and change the title of item. + $itemid=$this->plug->quickQuery('SELECT itemid as result FROM','WHERE firstcommentid='.intRequestVar('commentid')); + if ($itemid && preg_match('!<title>([^\r\n]*)</title>
!',$data['body'],$matches)) { + $data['body']=trim(str_replace($matches[0],'',$data['body'])); + sql_query('UPDATE '.sql_table('item').' SET ititle="'.addslashes($matches[1]).'" WHERE inumber='.(int)$itemid); + }// Note that the $data['body'] has been sanitized before comming to this event. + } + function doTemplateCommentsVar(&$item, &$comment,$type) { + $type=strtolower($type); + if ($this->ob_ok && !in_array($type,array('if','ifnot','endif','else','elseif','elseifnot'))) return; // Just return if ob_ok. + global $catid; + $args=func_get_args(); + array_shift($args); + array_shift($args); + array_shift($args); + switch($type){ + case 'adminurl': + global $CONF; + echo htmlspecialchars($CONF['AdminURL'],ENT_QUOTES); + return; + case 'if': + case 'ifnot': + case 'else': + case 'elseif': + case 'elseifnot': + case 'endif': + return $this->_if_comment($type,$item,$comment,$args); + default: + break; + } + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/if.php b/trunk/NP_SubSilver/plugins/subsilver/if.php new file mode 100644 index 0000000..0b32f05 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/if.php @@ -0,0 +1,126 @@ +comment['commentid']; + if (!$member->isLoggedIn()) return false; + elseif (!$member->canLogin()) return false; + elseif ($member->isAdmin()) return true; + if (!isset($this->cecomm[$cid])) { + $this->cecomm[$cid]=$member->canAlterComment($cid); + } + return $this->cecomm[$cid]; + } + function _if_comment($mode,&$item,&$comment,&$args){ + $this->comment=&$comment; + return $this->_if($mode,$item,$args); + } + var $ob_ok=false; + var $parse_done=true; + var $if_stack=array(); + function _if($mode,&$item,&$args){ + if ($mode=='if' || $mode=='ifnot') { + array_push($this->if_stack,array($this->ob_ok,$this->parse_done)); + $this->ob_ok=false; + $this->parse_done=true; + } + switch($mode){ + case 'endif': + if ($this->ob_ok) ob_end_clean(); + list($this->ob_ok,$this->parse_done)=array_pop($this->if_stack); + return; + case 'else': + if ($this->ob_ok) { + ob_end_clean(); + $this->ob_ok=false; + } else $this->ob_ok=ob_start(); + return; + case 'elseif': + case 'elseifnot': + if ($this->ob_ok) { + ob_end_clean(); + $this->ob_ok=false; + } else if ($this->parse_done) return; + default: + break; + } + // Several conditions follow + $type=array_shift($args); + $cond=$this->_ifCond($type,$item); + while(count($args)){ + $andor=strtolower(array_shift($args)); + $type=array_shift($args); + switch($andor){ + case 'and': + $cond=$cond && $this->_ifCond($type,$item); + break; + case 'or': + $cond=$cond || $this->_ifCond($type,$item); + break; + case 'andnot': + $cond=$cond && !$this->_ifCond($type,$item); + break; + case 'ornot': + $cond=$cond || !$this->_ifCond($type,$item); + break; + default: + exit ('NP_subSilver syntax error: '.htmlspecialchars($andor,ENT_QUOTES)); + } + } + // Make decision. + switch($mode){ + case 'if': + case 'elseif': + if (!$cond) $this->ob_ok=ob_start(); + break; + case 'ifnot': + case 'elseifnot': + if ($cond) $this->ob_ok=ob_start(); + default: + break; + } + $this->parse_done=!$this->ob_ok; + } + function _ifCond($type,&$item) { + switch(strtolower($type)){ + case 'sticky': + $infosticky=$this->plug->infoSticky(); + return (bool)@$infosticky[$item->itemid]; + case 'showstickies': + return (bool)$this->plug->showstickies; + case 'new': + global $member; + if (!$member->isLoggedIn()) return false; + $data=$this->_getData($item->itemid); + return (bool)strstr($data['unread'],','.$member->getId().','); + case 'search': + global $query; + return $query || requestVar('subsilver_search')=='yes'; + case 'caneditcomment': + return $this->_canEditComment(); + case 'category': + global $catid; + return (bool)$catid; + case 'search': + global $query; + return (bool)$query; + case 'authorismember': + if (isset($this->comment)) return (bool)$this->comment['userid']; + else return (bool)$this->plug->quickQuery('SELECT authorid as result FROM','WHERE itemid='.(int)$item->itemid); + case 'hasurl': + if (!isset($this->comment)) exit ('if: Error'); + if ($authorid=$this->comment['memberid']) { + $memberclass=&$this->plug->loadClass('member'); + $memberdata=&$memberclass->getData($authorid); + return (bool)$memberdata['rawurl']; + } else { + return preg_match('!^(http|https)://[^/]+!',$this->comment['userid']); + } + default: + exit ('NP_subSilver syntax error: '.htmlspecialchars($type,ENT_QUOTES)); + } + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/index.php b/trunk/NP_SubSilver/plugins/subsilver/index.php new file mode 100644 index 0000000..42682b4 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/index.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/install.php b/trunk/NP_SubSilver/plugins/subsilver/install.php new file mode 100644 index 0000000..ea7835e --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/install.php @@ -0,0 +1,99 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + } + function install() { + $this->plug->createOption('droptable','Drop SQL table when uninstall?','yesno','no'); + $this->plug->createOption('popularnum','Number of popular topics?','text','5','datatype=numerical'); + $this->plug->createOption('populardef', + 'The definition of populer topic: (Use <%replies%>, <%viewed%>, and <%days%> here)', + 'textarea','(<%viewed%>/<%days%>)*(<%days%> > 6)'); + $this->plug->createOption('unreaddays','The "unread" data are kept for days:','text','7','datatype=numerical'); + $this->plug->createItemOption('iteminfo','This item is:','select','normal','Normal|normal|Information|info|Sticky|sticky'); + $this->plug->createBlogOption('blogpostingbyguest','Allow guest to post new reply?','yesno','yes'); + $this->plug->createBlogOption('blogpublic','Allow guest to see this?','yesno','yes'); + $this->plug->createBlogOption('bloghidden','Hidden category (only siteadmin and moderators can see this)?','yesno','no'); + // SQL table stuffs follow + $this->plug->sql_query('create','( + itemid int(11) not null default 0, + authorid int(11) not null default 0, + firstcommentid int(11) not null default 0, + lastcommentid int(11) not null default 0, + replynum int(11) not null default 0, + unread text not null default "", + readip varchar(85) not null default ",,,,,,", + readnum int(11) not null default 0, + time datetime not null default "0000-00-00 00:00:00", + since datetime not null default "0000-00-00 00:00:00", + PRIMARY KEY itemid (itemid), + KEY authorid (authorid), + FULLTEXT KEY unread(unread) + )'); + // List up all items without comment + $items=array(); + $res=sql_query('SELECT citem FROM '.sql_table('comment')); + while($row=mysql_fetch_row($res)) $items[$row[0]]=true; + mysql_free_result($res); + $res=sql_query('SELECT DISTINCT i.inumber as itemid, i.iauthor as authorid, i.ibody as body, i.itime as time, i.iblog as blogid'. + ' FROM '.sql_table('item').' as i'); + while($row=mysql_fetch_assoc($res)){ + if (isset($items[$row['itemid']])) continue; + sql_query('INSERT INTO '.sql_table('comment'). + ' SET cbody="'.htmlspecialchars(strip_tags($row['body']),ENT_QUOTES).'"'. + ', cmember='.(int)$row['authorid']. + ', citem='.(int)$row['itemid']. + ', ctime="'.addslashes($row['time']).'"'. + ', cip="'.addslashes(serverVar('REMOTE_ADDR')).'"'. + ', cblog='.(int)$row['blogid']); + } + mysql_free_result($res); + // List up all members. + $members=','; + $res=sql_query('SELECT mnumber FROM '.sql_table('member')); + while($row=mysql_fetch_row($res)) $members.=$row[0].','; + mysql_free_result($res); + // List up the data in the table + $data=array(); + $res=$this->plug->sql_query('SELECT itemid FROM'); + while ($row=mysql_fetch_row($res)) $data[]=$row[0]; + mysql_free_result($res); + // List up all the unregistered data in table + $items=array(); + $res=sql_query('SELECT inumber FROM '.sql_table('item')); + while ($row=mysql_fetch_row($res)) { + if (!in_array($row[0],$data)) $items[]=$row[0]; + } + mysql_free_result($res); + // Create the data if not exists. + foreach($items as $itemid){ + $query='SELECT cnumber, cmember, ctime FROM '.sql_table('comment'). + ' WHERE citem='.(int)$itemid. + ' ORDER BY ctime ASC LIMIT 1'; + $first=mysql_fetch_assoc($res=sql_query($query)); + mysql_free_result($res); + $query='SELECT cnumber, cmember, ctime FROM '.sql_table('comment'). + ' WHERE citem='.(int)$itemid. + ' ORDER BY ctime DESC LIMIT 1'; + $last=mysql_fetch_assoc($res=sql_query($query)); + mysql_free_result($res); + $unread=(mysqldate(time()-8*86400)<$last['ctime'])?$members:'';// "unread" data is created items in these 7 days. + $replies=-1+(int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment').' WHERE citem='.(int)$itemid); + $this->plug->sql_query('INSERT INTO','SET'. + ' itemid='.(int)$itemid. + ',authorid='.(int)$first['cmember']. + ',firstcommentid='.(int)$first['cnumber']. + ',lastcommentid='.(int)$last['cnumber']. + ',replynum='.(int)$replies. + ',unread="'.addslashes($unread).'"'. + ',time="'.addslashes($last['ctime']).'"'. + ',since="'.addslashes($first['ctime']).'"'); + } + } + function unInstall() { + if ($this->plug->getOption('droptable')=='yes') $this->plug->sql_query('drop'); + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/member.php b/trunk/NP_SubSilver/plugins/subsilver/member.php new file mode 100644 index 0000000..3148afb --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/member.php @@ -0,0 +1,233 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + global $memberid; + $this->mid=(int)$memberid; + $this->_getData(); + } + var $mid; + var $memberdata=array(); + var $totalreplies=false; + function &getData($mid){ + if (!$mid) exit ('Error: NP_subSilver_member::getData()'); + $tempmid=$this->mid; + $this->mid=$mid; + if (!isset($this->memberdata[$mid])) $this->_getData(); + $this->mid=$tempmid; + return $this->memberdata[$mid]; + } + function _getData(){ + if (!$this->totalreplies) $this->totalreplies=(int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment')); + if (!$this->totalreplies) $this->totalreplies=1; + $this->memberdata[$this->mid]=array(); + $this->memberdata[$this->mid]['replies']=(int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment').' WHERE cmember='.(int)$this->mid); + $this->memberdata[$this->mid]['percent']=0.01*(int)((float)10000*$this->memberdata[$this->mid]['replies']/$this->totalreplies); + $this->memberdata[$this->mid]['regdate']=strtotime(quickQuery('SELECT ctime as result FROM '.sql_table('comment').' WHERE cmember>='.(int)$this->mid.' ORDER BY ctime ASC LIMIT 1')); + $this->memberdata[$this->mid]['repliesperday']=0.01*(int)((float)100*$this->memberdata[$this->mid]['replies']*86000/(time()-$this->memberdata[$this->mid]['regdate'])); + $rawurl=quickQuery('SELECT murl as result FROM '.sql_table('member').' WHERE mnumber='.(int)$this->mid); + $url=htmlspecialchars($rawurl,ENT_QUOTES); + if ($url && $url!='http://') $url=''.$url.''; + else $url=$rawurl=''; + $this->memberdata[$this->mid]['url']=$url; + $this->memberdata[$this->mid]['rawurl']=$rawurl; + if (quickQuery('SELECT madmin as result FROM '.sql_table('member').' WHERE mnumber='.(int)$this->mid)) + $this->memberdata[$this->mid]['position']='Administrator'; + elseif (quickQuery('SELECT COUNT(*) as result FROM '.sql_table('team').' WHERE tmember='.(int)$this->mid.' AND tadmin=1 LIMIT 1')) + $this->memberdata[$this->mid]['position']='Moderator'; + else $this->memberdata[$this->mid]['position']='Member'; + } + function _getGuestData(){ + if (!$this->totalreplies) $this->totalreplies=(int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment')); + if (!$this->totalreplies) $this->totalreplies=1; + $this->memberdata[$this->mid]=array(); + $this->memberdata[$this->mid]['replies']=(int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment').' WHERE cuser="'.addslashes($this->mid).'"'); + $this->memberdata[$this->mid]['percent']=0.01*(int)((float)10000*$this->memberdata[$this->mid]['replies']/$this->totalreplies); + $this->memberdata[$this->mid]['regdate']=strtotime(quickQuery('SELECT ctime as result FROM '.sql_table('comment').' WHERE cuser="'.addslashes($this->mid).'" ORDER BY ctime ASC LIMIT 1')); + $this->memberdata[$this->mid]['repliesperday']=0.01*(int)((float)100*$this->memberdata[$this->mid]['replies']*86000/(time()-$this->memberdata[$this->mid]['regdate'])); + $url=$rawurl=$this->comment['url']; + if ($url && $url!='http://') $url=''.$url.''; + else $url=$rawurl=''; + $this->memberdata[$this->mid]['url']=$url; + $this->memberdata[$this->mid]['url']=$rawurl; + $this->memberdata[$this->mid]['position']='Guest'; + } + function member($type,$p1=''){ + global $manager; + switch($type=strtolower($type)){ + case 'url': + echo $this->memberdata[$this->mid]['url'];// This data was sanitized before ( see _getData() and _getGuestData() ) + break; + case 'rawurl': + case 'position': + case 'replies': + case 'percent': + case 'repliesperday': + echo htmlspecialchars($this->memberdata[$this->mid][$type],ENT_QUOTES); + break; + case 'regdate': + $template=&$manager->getTemplate($p1); + echo strftime($template['FORMAT_DATE'],$this->memberdata[$this->mid]['regdate']); + default: + break; + } + } + function doSkinVar() { + global $memberid; + if ((int)$memberid) { + $this->mid=(int)$memberid; + if (!isset($this->memberdata[$this->mid])) $this->_getData(); + } + $args=func_get_args(); + $skinType=array_shift($args); + $type=array_shift($args); + switch(strtolower($type)){ + case 'member': + return call_user_func_array(array($this,$type),$args); + default: + } + } + var $comment; + function doTemplateCommentsVar(&$item,&$comment) { + $args=func_get_args(); + $item=array_shift($args); + $this->comment=array_shift($args); + $mid=$this->comment['memberid']; + if (!$mid) { + $this->mid=$this->comment['user']; + if (!@$this->memberdata[$this->mid]['regdate']) $this->_getGuestData(); + + } elseif ($mid!=$this->mid) { + $this->mid=$mid; + if (!@$this->memberdata[$this->mid]['regdate']) $this->_getData(); + } + $type=array_shift($args); + switch(strtolower($type)){ + case 'member': + return call_user_func_array(array($this,$type),$args); + default: + } + } +/* Following function is used to avoid submitting <>"'\ by members. */ + function event_PostAuthentication(){ + // exclude body in commentupdate event + // plugoption[][] -> just unset the var when containing <>"'\ + // The value may contain <>"'\ if the value is equal to nucleus_blog.bname, bdesc or nucleus_category.cname, cdesc. + // forbidden: createitem/additem + global $CONF,$action; + global $HTTP_POST_VARS,$HTTP_GET_VARS;// $HTTP_REQUEST_VARS does not exist. + // First, remove all $_COOKIE values from $_REQUEST + // This must be OK because cookieVar() is not checked in requestVar() function for php 4.0.6 + if (isset($_REQUEST) and isset($_COOKIE)) { + foreach($_COOKIE as $key=>$value) { + if (isset($_REQUEST[$key])) unset($_REQUEST[$key]); + } + } + $accept=array(); + switch(strtolower($action)){ + case 'createitem': + case 'itemedit': + case 'additem': + case 'itemupdate': + exit($this->_error('_ERROR_DISALLOWED')); + case 'commentupdate': + $accept[]='body'; + break; + default: break; + } + if (isset($_REQUEST)) $this->_valueCheck($_POST,$_GET,$_REQUEST,$accept); + else { + // In requestVar() function, postVar() is first checked. + // In forrowing array_merge function, $HTTP_GET_VARS values are overrided by $HTTP_POST_VARS. + $request=array_merge($HTTP_GET_VARS,$HTTP_POST_VARS); + $this->_valueCheck($HTTP_POST_VARS,$HTTP_GET_VARS,$request,$accept); + } + } + function _valueCheck(&$post,&$get,&$request,&$accept,$depth=0){ + foreach($request as $key=>$value){ + if (is_array($value)) { + //if ($depth==0 && $key=='plugoption') continue; + $p=$g=false; + if (isset($post[$key])) $p=&$post[$key]; + if (isset($get[$key])) $g=&$get[$key]; + $this->_valueCheck($p,$g,$request[$key],$accept,$depth+1); + continue; + } + if (!preg_match('/[\x00<>\'"\\\\]/',$value)) continue; + switch($depth){ + case 0: + if (in_array($key,$accept)) continue; + if (quickQuery('SELECT COUNT(*) as result FROM '. + sql_table('blog').' as b, '. + sql_table('category').' as c'. + ' WHERE b.bname="'.addslashes($value).'"'. + ' OR b.bdesc="'.addslashes($value).'"'. + ' OR c.cname="'.addslashes($value).'"'. + ' OR c.cdesc="'.addslashes($value).'"'. + ' LIMIT 1')) break; + exit($this->_error('_ERROR_DISALLOWED',": '$key'=>'$value'")); + case 2: + if (quickQuery('SELECT COUNT(*) as result FROM '. + sql_table('plugin_option').' as o, '. + sql_table('plugin_option_desc').' as d'. + ' WHERE (d.odef="'.addslashes($value).'" AND NOT (d.ocontext="global"))'. + ' OR (o.ovalue="'.addslashes($value).'" AND o.ocontextid>0)'. + ' LIMIT 1')) break; + default: + exit($this->_error('_ERROR_DISALLOWED',": '$key'=>'$value'")); + } + } + } + function _error($msg,$msg2){ + // Must exit at the end of this function. Do not return. + global $DIR_LANG,$CONF; + include_once($DIR_LANG . ereg_replace( '[\\|/]', '', getLanguageName()) . '.php'); + if (defined($msg)) eval('$msg='.$msg.';'); + redirect($CONF['IndexURL'].'?special=error&errormessage='.urlencode($msg.htmlspecialchars($msg2,ENT_QUOTES))); + exit; + } +} +// To use NP_PageSwitch for the member list, replace the $blog object. +if (class_exists('BLOG')) {// This statement is requred when the member registration +class NP_subSilver_BLOG_MEMBER extends BLOG { + var $np_subsilver; + function NP_subSilver_BLOG_MEMBER($id,&$np_subsilver){ + $this->np_subsilver=&$np_subsilver; + return $this->BLOG($id); + } + function getSqlBlog($extraQuery, $mode=''){ + global $startpos; + if ($search=getVar('search_author')){ + $where= ' WHERE mrealname LIKE "%'.addslashes($search).'%" '; + } else { + $where=' WHERE 1 '; + } + if ($mode) { + $select='SELECT COUNT(*) as result '; + $limit=' '; + $order=' '; + } else { + $select='SELECT * '; + $limit=' LIMIT '.(int)$this->np_subsilver->limit.' OFFSET '.(int)$startpos.' '; + switch(getVar('sort')){ + case 'name_desc': + $order=' ORDER BY mrealname DESC '; + break; + case 'name_asc': + $order=' ORDER BY mrealname ASC '; + break; + case 'id_desc': + $order=' ORDER BY mnumber DESC '; + break; + case 'id_asc': + default: + $order=' ORDER BY mnumber ASC '; + } + } + return $select.' FROM '.sql_table('member').$where.$extraQuery.$order.$limit; + } +} +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/posting.php b/trunk/NP_SubSilver/plugins/subsilver/posting.php new file mode 100644 index 0000000..057a5b6 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/posting.php @@ -0,0 +1,126 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + } + var $nowposting=false; + function posting($event,&$data,$p1='') { + $this->nowposting=true; + switch($event){ + case 'SpamCheck': + // Unset global $itemid for parsing category skin. + global $itemid; + $itemid=0; + // Temporaliry accept the comment for current item for posting. + // This setting won't be saved into MySQL table. + global $manager; + $item=&$manager->getItem(postVar('itemid'),false,false); + $item['closed']=0; + return; + case 'ValidateForm': + // Require title + if (!postVar('title')) $data['error']=_LISTS_TITLE.':'._ERROR_NOEMPTYITEMS; + return; + case 'PostAddComment': + $newblogitemid=$p1; + // Create new item. + $cid=$data['commentid']; + // Find the administrator + $adminid=(int)quickQuery('SELECT mnumber as result FROM '.sql_table('member').' WHERE madmin=1 ORDER BY mnumber ASC LIMIT 1'); + global $member; + $mid=(0<$member->getID())?$member->getID():0; + if (phpversion() >= '5.0.0') eval('$mcopy = clone $member;'); + else $mcopy=$member; + + $member=MEMBER::createFromID($adminid); + + // Create new item + if ($newblogitemid) $result=array('status'=>'added','itemid'=>$newblogitemid); + else $result=ITEM::createFromRequest(); + + // Return to original member object + unset($member); + if (phpversion() >= '5.0.0') eval('$member = clone $mcopy;'); + else $member=$mcopy; + + // All done. Redirect to item URL + switch($result['status']){ + case 'added': + // Remove tags in item. + $query = 'UPDATE '.sql_table('item'). + ' SET ititle="'.addslashes(htmlspecialchars(postVar('title'),ENT_QUOTES)).'"'. + ' , ibody="'.addslashes(htmlspecialchars(postVar('body'),ENT_QUOTES)).'"'. + ' , imore=""'. + ' WHERE inumber=' . (int)$result['itemid']; + if (!$newblogitemid) sql_query($query); + // Move the comment to new item + $query = 'UPDATE '.sql_table('comment'). + ' SET citem='.(int)$result['itemid']. + ' WHERE cnumber=' . (int)$cid; + sql_query($query); + // List up all members. + $members=','; + $res=sql_query('SELECT mnumber FROM '.sql_table('member')); + while($row=mysql_fetch_row($res)) $members.=$row[0].','; + mysql_free_result($res); + // Add data into sql table + $this->plug->sql_query('DELETE FROM','WHERE itemid='.(int)$result['itemid']); + $this->plug->sql_query('INSERT INTO','SET'. + ' itemid='.(int)$result['itemid']. + ', authorid='.(int)$mid. + ', firstcommentid='.(int)$cid. + ', lastcommentid='.(int)$cid. + ', unread="'.addslashes($members).'"'. + ', time='.mysqldate($data['comment']['timestamp']). + ', since='.mysqldate($data['comment']['timestamp'])); + // Redirect + redirect(createItemLink($result['itemid'])); + exit; + default: // failed + $query = 'DELETE FROM '.sql_table('comment').' WHERE cnumber=' . (int)$cid; + sql_query($query); + exit('Sorry, an error occured.'); + } + default: + return; + } + } + // PostAddItem event occurs when a new blog is created. + function event_PostAddItem(&$data){ + // Just return if AddItem happens because of a posting of new topic + if ($this->nowposting) return; + global $member; + $itemid=$data['itemid']; + $row=mysql_fetch_assoc($res=sql_query('SELECT iauthor, ibody, itime FROM '.sql_table('item').' WHERE inumber='.(int)$itemid)); + mysql_free_result($res); + $comment=array(); + + $name = addslashes($comment['user']=''); + $url = addslashes($comment['userid']=''); + $email = addslashes($comment['email']=''); + $body = addslashes($comment['body']=htmlspecialchars($row['ibody'],ENT_QUOTES)); + $host = addslashes($comment['host']=serverVar('HTTP_HOST')); + $ip = addslashes($comment['ip']=serverVar('REMOTE_ADDR')); + $memberid = intval($comment['memberid']=$row['iauthor']); + $timestamp = date('Y-m-d H:i:s', ($comment['timestamp']=strtotime($row['itime']))); + $itemid = (int)$itemid; + + $query = 'INSERT INTO '.sql_table('comment').' (CUSER, CMAIL, CEMAIL, CMEMBER, CBODY, CITEM, CTIME, CHOST, CIP, CBLOG) ' + . "VALUES ('$name', '$url', '$email', $memberid, '$body', $itemid, '$timestamp', '$host', '$ip', '$blogid')"; + + sql_query($query); + $commentid = mysql_insert_id(); + $data=array('comment'=>&$comment,'commentid'=>$commentid); + $this->posting('PostAddComment',$data,$itemid); + } + // WHen new category is created. + function event_PostAddCategory(&$data){ + global $member; + $blog=&$data['blog']; + $blog->additem($data['catid'],'First Item','You can modify this topic.','',$blog->getId(), $member->getId(),$blog->getCorrectTime(),0,0,0); + + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/search.php b/trunk/NP_SubSilver/plugins/subsilver/search.php new file mode 100644 index 0000000..8c27524 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/search.php @@ -0,0 +1,151 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + } +} +class NP_subSilver_BLOG extends BLOG { + var $np_subsilver; + function NP_subSilver_BLOG($id,&$np_subsilver){ + $this->np_subsilver=&$np_subsilver; + return $this->BLOG($id); + } + function getSqlSearch($query, $amountMonths = 0, &$highlight, $mode = ''){ + global $blogid; + switch(getVar('search_type')){ + case 'unanswered': + $where=' and s.replynum<1 and s.itemid=i.inumber '; + if ($stime=intGetVar('search_time')) $where.=' and i.itime>' . mysqldate($this->getCorrectTime()-86400*$stime); + $query=$this->getSqlBlog($where,$mode); + $query = preg_replace('/^([\s]*)SELECT[\s]([^\'"=]*)[\s]FROM[\s]/i', + 'SELECT $2 FROM '.$this->np_subsilver->sql_query('name').' as s, ',$query); + if ($blogid) return $query; // $blogid is '' when not from intRequestVar('blogid') (see event_PostAuthentication) + return preg_replace('/i\.iblog([\s]*)=([\s]*)([0-9]+)([\s]+)and/i','',$query); + default: + return $this->subSilver_getSqlSearch($query,$amountMonths,$highlight,$mode); + } + } + function subSilver_getSqlSearch($query, $amountMonths = 0, &$highlight, $mode = '') + { + $searchclass =& new SEARCH($query); + + $highlight = $searchclass->inclusive; + + // if querystring is empty, return empty string + if ($searchclass->inclusive == '') + return ''; + + // where to search + if (!$this->np_subsilver->query_null) { + srand((double)microtime()*1000000); + $cbody = md5(uniqid(rand(), true)); + switch(getVar('search_fields')){ + case 'msgonly': + $where=$searchclass->boolean_sql_where($cbody); + break; + case 'titleonly': + $where=$searchclass->boolean_sql_where('ititle'); + break; + case 'all': + default: + $where=$searchclass->boolean_sql_where('ititle,'.$cbody); + } + $where=str_replace('i.'.$cbody,'d.cbody',$where); + } else $where='1'; + + + // Restrict author + if ($author=getVar('search_author')) { + switch(getVar('search_author_method')){ + case 'match': + $authors=array(); + $res=sql_query('SELECT mnumber FROM '.sql_table('member').' WHERE mrealname LIKE "%'.addslashes($author).'%"'); + while($row=mysql_fetch_row($res)) $authors[]=(int)$row[0]; + mysql_free_result($res); + if (count($authors)) $where.=' and (d.cmember in ('.implode(',',$authors).') or d.cuser LIKE "%'.addslashes($author).'%") '; + else $where.=' and d.cuser LIKE "%'.addslashes($author).'%" '; + break; + case 'exactly': + default: + $authors=array(); + $res=sql_query('SELECT mnumber FROM '.sql_table('member').' WHERE mrealname="'.addslashes($author).'"'); + while($row=mysql_fetch_row($res)) $authors[]=(int)$row[0]; + mysql_free_result($res); + if (count($authors)) $where.=' and (d.cmember in ('.implode(',',$authors).') or d.cuser="'.addslashes($author).'") '; + else $where.=' and d.cuser="'.addslashes($author).'" '; + break; + } + } + + // Restrict time + if ($stime=intGetVar('search_time')) { + $where.=' and i.itime>' . mysqldate($this->getCorrectTime()-86400*$stime); + } + + // sort method + switch(getVar('sort_by')){ + case 'replies': + $select='COUNT(d.cbody LIKE "%'.addslashes($query).'%")'; + break; + case 'title': + $select='i.ititle'; + break; + case 'forum': + $select='i.icat'; + break; + case 'time': + default: + $select='i.itime'; + } + + // get list of blogs to search + global $blogid; // $blogid is '' when not from intRequestVar('blogid') (see event_PostAuthentication) + if ($blogid) $selectblogs=' and i.iblog='.(int)$blogid; + else { + $selectblogs=' and i.iblog in ('; + $res=sql_query('SELECT bnumber FROM '.sql_table('blog')); + while($row=mysql_fetch_row($res)) $selectblogs.=(int)$row[0].','; + mysql_free_result($res); + $selectblogs=substr($selectblogs,0,-1).')'; + } + + if ($mode == '') + { + $query = 'SELECT DISTINCT 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'; + if ($select) $query .= ', '.$select. ' as score '; + } else { + $query = 'SELECT COUNT(DISTINCT i.inumber) as result '; + } + + $query .= ' FROM '.sql_table('comment').' as d, '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c' + . ' WHERE i.iauthor=m.mnumber' + . ' and i.icat=c.catid' + . ' and i.idraft=0' // exclude drafts + . $selectblogs + // don't show future items + . ' and i.itime<=' . mysqldate($this->getCorrectTime()) + . ' and '.$where + . ' and i.inumber=d.citem'; + + // take into account amount of months to search + if ($amountMonths > 0) + { + $localtime = getdate($this->getCorrectTime()); + $timestamp_start = mktime(0,0,0,$localtime['mon'] - $amountMonths,1,$localtime['year']); + $query .= ' and i.itime>' . mysqldate($timestamp_start); + } + + if ($mode == '') + { + if ($select) + $query .= ' GROUP BY i.inumber ORDER BY score '.(getVar('sort_dir')=='ASC'?'ASC ':'DESC '); + else + $query .= ' ORDER BY i.itime '.(getVar('sort_dir')=='ASC'?'ASC ':'DESC '); + } + + return $query; + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/skin.php b/trunk/NP_SubSilver/plugins/subsilver/skin.php new file mode 100644 index 0000000..f768fdc --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/skin.php @@ -0,0 +1,415 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + } + var $blogid; + var $blogs; + var $template='subSilver/index'; + function showBlogList($template, $bnametype='') { + $this->template=$template; + $this->blogs=array(); + $query = 'SELECT bnumber FROM '.sql_table('blog').' ORDER BY bnumber ASC'; + $res = sql_query($query); + while($row=mysql_fetch_row($res)) $this->blogs[]=$row[0]; + ob_start(); + BLOG::showBlogList($template, $bnametype); + $html=ob_get_contents(); + ob_end_clean(); + echo preg_replace_callback('/<:categorylist:>/',array($this,'showBlogListCallback'),$html); + } + function showBlogListCallback($match){ + global $blogid; + $this->blogid=array_shift($this->blogs); + if ($this->blogid!=$blogid && !$this->home) return ''; + ob_start(); + $this->showCategoryList($this->template); + $html=ob_get_contents(); + ob_end_clean(); + return $html; + } + function showCategoryList($template) { + global $manager,$CONF; + $blog=&$manager->getBlog($this->blogid); + ob_start(); + $blog->showCategoryList($template); + $html=ob_get_contents(); + ob_end_clean(); + + $template =& $manager->getTemplate($template); + $search=$replace=array(); + $skinurl=$CONF['SkinsURL'] . PARSER::getProperty('IncludePrefix'); + $search[]='<:skinurl:>'; + $replace[]=htmlspecialchars($skinurl,ENT_QUOTES); + + $categories=array(); + $query='SELECT * FROM '.sql_table('category').' WHERE cblog='.(int)$this->blogid; + $res=sql_query($query); + while($row=mysql_fetch_assoc($res)) $categories[]=$row; + mysql_free_result($res); + + $members=array(); + foreach($categories as $row){ + // Number of topics + $catid=$row['catid']; + $query='SELECT COUNT(*) as result FROM '.sql_table('item').' WHERE icat='.(int)$catid; + $search[]='<:topics:'.$catid.':>'; + $replace[]=(int)quickQuery($query); + // Number of replies + $query='SELECT COUNT(c.cnumber) as result FROM '.sql_table('item').' as i, '.sql_table('comment').' as c'. + ' WHERE i.icat='.(int)$catid. + ' AND c.citem=i.inumber'; + $search[]='<:replies:'.$catid.':>'; + $replace[]=(int)quickQuery($query); + // Last item + $query='SELECT inumber as result FROM '.sql_table('item').' WHERE icat='.(int)$catid.' ORDER BY itime DESC LIMIT 1'; + $itemid=(int)quickQuery($query); + $query='SELECT * FROM '.sql_table('comment').' WHERE citem='.(int)$itemid.' ORDER BY ctime DESC LIMIT 1'; + if ($row=mysql_fetch_assoc($res=sql_query($query))) { + if ($row['cmember']) { + if (!is_array($members[$row['cmember']])) { + $query='SELECT * FROM '.sql_table('member').' WHERE mnumber='.(int)$row['cmember'].' LIMIT 1'; + $members[$row['cmember']]=mysql_fetch_assoc($res2=sql_query($query)); + mysql_free_result($res2); + } + $authorname=$members[$row['cmember']]['mrealname']; + $authorlink=createMemberLink($row['cmember']); + } else { + $authorname=$row['cuser']; + $authorlink='#'._EDITC_NONMEMBER; + } + $timestamp=strtotime($row['ctime']); + $search[]='<:lastitem:date:'.$catid.':>'; + $replace[]=strftime($template['FORMAT_DATE'],$timestamp); + $search[]='<:lastitem:time:'.$catid.':>'; + $replace[]=strftime($template['FORMAT_TIME'],$timestamp); + $search[]='<:lastitem:authorname:'.$catid.':>'; + $replace[]=htmlspecialchars($authorname,ENT_QUOTES); + $search[]='<:lastitem:authorlink:'.$catid.':>'; + $replace[]=$authorlink; + $search[]='<:lastitem:link:'.$catid.':>'; + $replace[]=createItemLink($itemid,array($this->commentquery=>(int)$row['cnumber'])).'#'.$this->commentquery.(int)$row['cnumber']; + } else { + $search[]='<:lastitem:link:'.$catid.':>'; + $replace[]=createItemLink($itemid); + } + mysql_free_result($res); + + } + + // Parse category icon: read, unread or locked. + global $member; + $mid=$member->isLoggedIn()?$member->getId():0; + $num=preg_match_all('/<:categoryicon:([0-9]+):([^:]+):([^:]+):([^:]+):>/',$html,$matches,PREG_SET_ORDER); + for($i=0;$i<$num;$i++){ + $search[]=$matches[$i][0]; + $comm_ok=quickQuery('SELECT b.bcomments as result FROM '.sql_table('blog').' as b, '. + sql_table('category').' as c'. + ' WHERE c.cblog=b.bnumber'. + ' AND c.catid='.(int)$matches[$i][1]. + ' LIMIT 1'); + if ($mid) { + $new=$this->plug->quickQuery('SELECT COUNT(*) as result FROM','as s, '. + sql_table('item').' as i, '. + sql_table('category').' as c '. + ' WHERE i.icat='.(int)$matches[$i][1]. + ' AND c.catid='.(int)$matches[$i][1]. + ' AND i.inumber=s.itemid'. + ' AND s.unread LIKE "%,'.(int)$mid.',%"'); + } else $new=false; + if ($comm_ok && $new) $replace[]=htmlspecialchars($matches[$i][2],ENT_QUOTES); + else if ($comm_ok) $replace[]=htmlspecialchars($matches[$i][3],ENT_QUOTES); + else $replace[]=htmlspecialchars($matches[$i][4],ENT_QUOTES); + } + + echo str_replace($search,$replace,$html); + } + function showClock($template,$mode='both'){ + global $CONF, $manager, $blog; + if (!is_array($template)) $template =& $manager->getTemplate($template); + if ($blog) $timestamp=$blog->getCorrectTime(); + else $timestamp=time(); + if ($mode!='time') echo strftime($template['FORMAT_DATE'],$timestamp); + if ($mode=='both') echo ' '; + if ($mode!='date') echo strftime($template['FORMAT_TIME'],$timestamp); + } + function showConf($type){ + global $skin_subsilver_conf; + echo htmlspecialchars($skin_subsilver_conf[$type],ENT_QUOTES); + } + function strftime($format){ + global $blog; + if ($blog) $timestamp=$blog->getCorrectTime(); + else $timestamp=time(); + echo strftime($format,$timestamp); + } + function userdata($mode){ + switch($mode){ + case 'totalreplies': + echo (int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment')); + break; + case 'number': + echo (int)quickQuery('SELECT COUNT(*) as result FROM '.sql_table('member')); + break; + case 'newest': + echo htmlspecialchars(quickQuery('SELECT mrealname as result FROM '.sql_table('member').' ORDER BY mnumber DESC'),ENT_QUOTES); + break; + case 'newestlink': + $mid=(int)quickQuery('SELECT mnumber as result FROM '.sql_table('member').' ORDER BY mnumber DESC'); + echo createMemberLink($mid); + break; + case 'onlinenum': + case 'onlinemembernum': + case 'onlineguestnum': + case 'onlinemembers': + default: + echo '?'; + } + } + var $handler; + var $parser; + function _setHandler(){ + $actions=SKIN::getAllowedActionsForType($this->skintype); + $actions=array_merge($actions,array('itemid'));// For commentform for new topic + $this->handler =& new ACTIONS($this->skintype, $this); + $this->parser =& new PARSER($actions, $this->handler); + $this->handler->setParser($this->parser); + } + function commentform(){// used to show form for new topic + global $member; + if (!is_object($this->handler)) $this->_setHandler(); + + // values to prefill + $user = cookieVar($CONF['CookiePrefix'] .'comment_user'); + if (!$user) $user = postVar('user'); + $userid = cookieVar($CONF['CookiePrefix'] .'comment_userid'); + if (!$userid) $userid = postVar('userid'); + $email = cookieVar($CONF['CookiePrefix'] .'comment_email'); + if (!$email) { + $email = postVar('email'); + } + $body = postVar('body'); + + + // Discover an item that belongs to this category. + global $catid,$itemid; + if ($catid && !$itemid){ + $itemid=quickQuery('SELECT inumber as result FROM '.sql_table('item').' WHERE icat='.(int)$catid.' ORDER BY itime DESC LIMIT 1'); + } + $itemid=(int)$itemid; + + $this->handler->formdata = array( + 'destinationurl' => '', + 'actionurl' => htmlspecialchars($actionurl,ENT_QUOTES), + 'itemid' => $itemid, + 'user' => htmlspecialchars($user,ENT_QUOTES), + 'userid' => htmlspecialchars($userid,ENT_QUOTES), + 'email' => htmlspecialchars($email,ENT_QUOTES), + 'body' => htmlspecialchars($body,ENT_QUOTES), + 'membername' => $member->getDisplayName(), + 'rememberchecked' => cookieVar($CONF['CookiePrefix'] .'comment_user')?'checked="checked"':'' + ); + + ob_start(); + if (!$member->isLoggedIn()) { + $this->handler->doForm('commentform-notloggedin'); + } else { + $this->handler->doForm('commentform-loggedin'); + } + $html=ob_get_contents(); + ob_end_clean(); + // Insert new tags that are required for posting. + $newtag='\n"; + $newtag.=''."\n"; + $newtag.=''."\n"; + $newtag.=''."\n"; + $newtag.=''."\n"; + $newtag.=''."\n"; + $newtag.=''."\n"; + // $this->searchincform is like '
' (see NP_subSilver.php) + echo str_replace($this->searchincform,$this->searchincform.$newtag,$html); + } + function showStickies($template){ + global $blog,$catid; + if (!$blog || !$catid) return; + if (!$infosticky=$this->plug->infoSticky()) return; + $stickies=''; + foreach($infosticky as $itemid=>$mode) $stickies.=($stickies?',':'').(int)$itemid; + $query=$blog->getSqlBlog('AND i.inumber in ('.$stickies.')'); + $this->plug->showstickies=true; + $blog->showUsingQuery($template,$query,'',1); + $this->plug->showstickies=false; + } + function strip_tags(){ + $args=func_get_args(); + $mode=array_shift($args); + switch(strtolower($mode)){ + case 'begin': + ob_start(); + break; + case 'end': + $html=ob_get_contents(); + ob_end_clean(); + echo htmlspecialchars(strip_tags($html),ENT_QUOTES); + break; + default: + if (!is_object($this->handler)) $this->_setHandler(); + ob_start(); + call_user_func_array(array($this->handler,'parse_'.$mode),$args); + $html=ob_get_contents(); + ob_end_clean(); + echo htmlspecialchars(strip_tags($html),ENT_QUOTES); + break; + } + } + function form($type){ + switch($type){ + case 'bloglist': + $res=sql_query('SELECT bnumber, bname FROM '.sql_table('blog')); + while($row=mysql_fetch_assoc($res)) { + echo '\n"; + } + mysql_free_result($res); + break; + case 'categorylist': + $res=sql_query('SELECT catid, cname FROM '.sql_table('category')); + while($row=mysql_fetch_assoc($res)) { + echo '\n"; + } + mysql_free_result($res); + break; + case 'javascript': + $res=sql_query('SELECT catid, cblog FROM '.sql_table('category')); +?>handler)) $this->_setHandler(); + $this->plug->limit=$limit; + global $blog,$manager,$memberinfo,$memberid; + $template =& $manager->getTemplate($template); + $res=sql_query($blog->getSqlBlog('')); + $found=false; + $contents=$template['ARCHIVELIST_LISTITEM']; + while ($row=mysql_fetch_assoc($res)) { + $memberid=$row['mnumber']; + $memberinfo=$manager->getMember($memberid); + $this->parser->parse($contents); + $found=true; + } + mysql_free_result($res); + if (($author=getVar('search_author')) && !$found) { + $contents=TEMPLATE::fill($template['ARCHIVELIST_FOOTER'],array('query'=>htmlspecialchars($author,ENT_QUOTES))); + $this->parser->parse($contents); + } + } + function sortbutton($descrip,$img_asc,$param_asc,$img_desc,$param_desc){ + global $CONF; + $params=preg_replace('/(^|&)sort=([^&]*)(&|$)/i','$3',serverVar('QUERY_STRING')); + if ($params) $params='?'.$params.'&'; + else $params='?'; + $skinurl=$CONF['SkinsURL'] . PARSER::getProperty('IncludePrefix'); + $link_asc=htmlspecialchars($CONF['self'].$params.'sort='.$param_asc); + $link_desc=htmlspecialchars($CONF['self'].$params.'sort='.$param_desc); + $img_asc=htmlspecialchars($skinurl.$img_asc); + $img_desc=htmlspecialchars($skinurl.$img_desc); + $descrip=htmlspecialchars($descrip); + if (getVar('sort')==$param_asc) { +?><?php echo $descrip; ?><?php echo $descrip; ?><?php echo $descrip; ?> +pluginInstalled('NP_text')) { + $pid=count($manager->cachedInfo['installedPlugins'])*2; + $manager->cachedInfo['installedPlugins'][$pid]='NP_text'; + $manager->plugins['NP_text']=&$this; + } + } + function doSkinVar(&$skintype,$text){ + if (preg_match('/[^0-9a-zA-Z_]/',$text) || !defined($text)) return; + eval("echo $text;"); + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/plugins/subsilver/template.php b/trunk/NP_SubSilver/plugins/subsilver/template.php new file mode 100644 index 0000000..d2a9361 --- /dev/null +++ b/trunk/NP_SubSilver/plugins/subsilver/template.php @@ -0,0 +1,123 @@ +plug=&$plug; + foreach($plug as $key=>$value) $this->$key=&$plug->$key; + } + var $tabledata=array(); + function &_getData($itemid){ + // Get all data for the item in SQL table of this plugin + if (!isset($this->tabledata[$itemid])) { + $this->tabledata[$itemid]=mysql_fetch_assoc($res=$this->plug->sql_query('SELECT * FROM','WHERE itemid='.(int)$itemid.' LIMIT 1')); + mysql_free_result($res); + } + return $this->tabledata[$itemid]; + } + var $memberdata=array(); + function &_getMember($mid){ + // Get all data for the member + if (!isset($this->memberdata[$mid])) { + $this->memberdata[$mid]=mysql_fetch_assoc($res=sql_query('SELECT * FROM '.sql_table('member').' WHERE mnumber='.(int)$mid.' LIMIT 1')); + mysql_free_result($res); + } + return $this->memberdata[$mid]; + } + var $commentdata=array(); + function &_getComment($cid){ + // Get all data for the comment + if (!isset($this->commentdata[$cid])) { + $this->commentdata[$cid]=mysql_fetch_assoc($res=sql_query('SELECT * FROM '.sql_table('comment').' WHERE cnumber='.(int)$cid.' LIMIT 1')); + mysql_free_result($res); + } + return $this->commentdata[$cid]; + } + function _getCidFromItem($itemid){ + $row=$this->_getdata($itemid); + return $row['lastcommentid']; + } + function _getAuthorFromItem($itemid){ + $auth=array(); + $row=$this->_getdata($itemid); + if ($row['authorid']) { + $memm=$this->_getMember($row['authorid']); + $auth['authorname']=$memm['mrealname']; + $auth['authorlink']=createMemberLink($row['authorid']); + } else { + $comm=$this->_getComment($row['firstcommentid']); + $auth['authorname']=$comm['cuser']; + $auth['authorlink']='#'._EDITC_NONMEMBER; + } + return $auth; + } + function _itemicon(&$item,&$args){ + global $blog,$member; + $mid=$member->isLoggedIn()?$member->getId():0; + // 0:new, 1:new_hot, 2:new_locked, 3:read, 4:read_hot, 5: read_locked, 6:info, 7:sticky + $data=$this->_getData($item->itemid); + if ($blog->commentsEnabled()) $closed=$item->closed; + else $closed=true; + $hot=$this->plug->popularItems($item->itemid);// Popular topics + $infosticky=$this->plug->infoSticky(); + $new=strstr($data['unread'],",$mid,"); + switch(strtolower(@$infosticky[$item->itemid])){ + case 'info': $i=6; break; + case 'sticky': $i=7; break; + default: + $i=$new?0:3; + if ($closed) $i=$i+2; + elseif ($hot) $i++; + } + echo htmlspecialchars(trim($args[$i]),ENT_QUOTES); + } + function doTemplateVar(&$item,$type) { + $type=strtolower($type); + if ($this->ob_ok && !in_array($type,array('if','ifnot','endif','else','elseif','elseifnot'))) return; // Just return if ob_ok. + global $catid; + $args=func_get_args(); + array_shift($args); + array_shift($args); + switch($type){ + case 'readnum': + case 'replynum': + $row=$this->_getdata($item->itemid); + echo htmlspecialchars($row[$type],ENT_QUOTES); + break; + case 'authorname': + case 'authorlink': + $data=$this->_getAuthorFromItem($item->itemid); + echo htmlspecialchars($data[$type],ENT_QUOTES); + break; + case 'lastreplyby': + case 'lastreplyauthorlink': + case 'lastreplylink': + $data=array(); + $cid=$this->_getCidFromItem($item->itemid); + $data['lastreplylink']=createItemLink($item->itemid,array($this->commentquery=>(int)$cid)).'#'.$this->commentquery.(int)$cid; + $comm=$this->_getComment($cid); + if ($comm['cmember']) { + $memm=$this->_getMember($comm['cmember']); + $data['lastreplyby']=$memm['mrealname']; + $data['lastreplyauthorlink']=createMemberLink($comm['cmember']); + } else { + $data['lastreplyby']=$comm['cuser']; + $data['lastreplyauthorlink']='#'._EDITC_NONMEMBER; + } + echo str_replace('&amp;','&',htmlspecialchars($data[$type],ENT_QUOTES)); + break; + case 'itemicon': + return $this->_itemicon($item,$args); + case 'if': + case 'ifnot': + case 'else': + case 'elseif': + case 'elseifnot': + case 'endif': + return $this->_if($type,$item,$args); + default: + break; + } + } +} +?> \ No newline at end of file diff --git a/trunk/NP_SubSilver/skins/subsilver/.htaccess b/trunk/NP_SubSilver/skins/subsilver/.htaccess new file mode 100644 index 0000000..21c9ea1 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/.htaccess @@ -0,0 +1,5 @@ + + Order allow,deny + Deny from all + +#EOF \ No newline at end of file diff --git a/trunk/NP_SubSilver/skins/subsilver/category.inc b/trunk/NP_SubSilver/skins/subsilver/category.inc new file mode 100644 index 0000000..590f31d --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/category.inc @@ -0,0 +1,90 @@ + + + + + + + + + + +
<%category(name)%>
モデレーター: 無し
+
+ + +
トピックの新規投稿 +
+ + + + + + + + + + +<%if(subSilver,getVar,startpos=)%> +<%subSilver(showStickies,subsilver/index)%> +<%elseif(subSilver,getVar,startpos=0)%> +<%subSilver(showStickies,subsilver/index)%> +<%endif%> + +<%if(hasplugin,PageSwitch)%> +<%blog(subsilver/index,10)%> +<%else%> +<%blog(subsilver/index,10000)%> +<%endif%> + + + + +
 ãƒˆãƒ”ック  è¿”ä¿¡  æŠ•ç¨¿è€…  è¦³é–²  æœ€æ–°è¨˜äº‹ 
+
+
+ + + + + 特定期間内のトピックを表示:  +   + + +
+ + + + + + + +<%ifnot(hasplugin,PageSwitch)%> +<%elseif(PageSwitch,requied)%> + + + +<%endif%> +
+
+ + +
トピックの新規投稿 +
   <%sitevar(name)%> フォーラム一覧 -> <%category(name)%>
+
Page <%PageSwitch(num)%> of <%PageSwitch(total)%>
diff --git a/trunk/NP_SubSilver/skins/subsilver/faq.inc b/trunk/NP_SubSilver/skins/subsilver/faq.inc new file mode 100644 index 0000000..0f0e8a6 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/faq.inc @@ -0,0 +1,16 @@ + + + + +
+ 現在の時刻 - <%subSilver(showClock,subSilver/index)%>
<%sitevar(name)%> フォーラム一覧 +
+ +<%subSilver(includelanguage,faq.inc)%>
+<%subSilver(includelanguage,faq1.inc)%>
+<%subSilver(includelanguage,faq2.inc)%>
+<%subSilver(includelanguage,faq3.inc)%>
+<%subSilver(includelanguage,faq4.inc)%>
+<%subSilver(includelanguage,faq5.inc)%>
+<%subSilver(includelanguage,faq6.inc)%>
+<%subSilver(includelanguage,faq7.inc)%>
diff --git a/trunk/NP_SubSilver/skins/subsilver/footer.inc b/trunk/NP_SubSilver/skins/subsilver/footer.inc new file mode 100644 index 0000000..286198c --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/footer.inc @@ -0,0 +1,10 @@ +


+Powered by <%version%> © +<%if(admin)%> + Valid XHTML +<%endif%> +
+ + + + diff --git a/trunk/NP_SubSilver/skins/subsilver/formIE.css b/trunk/NP_SubSilver/skins/subsilver/formIE.css new file mode 100644 index 0000000..fde54cb --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/formIE.css @@ -0,0 +1,19 @@ +/* Fancy form styles for IE */ + +input, textarea, select { +border-top-width : 1px; +border-right-width : 1px; +border-bottom-width : 1px; +border-left-width : 1px; +} + +input { text-indent : 2px; } + +input.button { +border-top-width : 1px; +border-right-width : 1px; +border-bottom-width : 1px; +border-left-width : 1px; +} + +.postbody { line-height: 18px} diff --git a/trunk/NP_SubSilver/skins/subsilver/head.inc b/trunk/NP_SubSilver/skins/subsilver/head.inc new file mode 100644 index 0000000..4ffcaa8 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/head.inc @@ -0,0 +1,34 @@ + + + + + + + + + + + + +<%if(skintype,index)%> + <%if(subSilver,getVar,blogid=)%> + <%subSilver(strip_tags,sitevar,name)%> :: 一覧 + <%elseif(category)%> + <%subSilver(strip_tags,begin)%><%blogsetting(name)%> :: <%category(name)%><%subSilver(strip_tags,end)%> + <%else%> + <%subSilver(strip_tags,begin)%><%sitevar(name)%> :: <%blogsetting(name)%><%subSilver(strip_tags,end)%> + <%endif%> +<%elseif(skintype,item)%> + <%subSilver(strip_tags,begin)%><%category(name)%> :: <%itemtitle(attribute)%><%subSilver(strip_tags,end)%> +<%elseif(skintype,member)%> + <%if(subSilver,intGlobalVar,memberid=0)%> + <%subSilver(strip_tags,begin)%><%sitevar(name)%> :: メンバーリスト<%subSilver(strip_tags,end)%> + <%else%> + <%subSilver(strip_tags,begin)%><%sitevar(name)%> :: <%member(realname)%><%subSilver(strip_tags,end)%> + <%endif%> +<%else%> + <%subSilver(strip_tags,sitevar,name)%> +<%endif%> + + diff --git a/trunk/NP_SubSilver/skins/subsilver/header.inc b/trunk/NP_SubSilver/skins/subsilver/header.inc new file mode 100644 index 0000000..0fe1439 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/header.inc @@ -0,0 +1,33 @@ + + + + + + + + +
+ + + + + +
<%sitevar(name)%> フォーラム一覧<%sitevar(name)%>
<%subSilver(showConf,SiteDesc)%>
 
+ + + + + + + +
+  ã‚ˆãã‚る質問よくある質問  +  æ¤œç´¢æ¤œç´¢  +  ãƒ¡ãƒ³ãƒãƒ¼ãƒªã‚¹ãƒˆãƒ¡ãƒ³ãƒãƒ¼ãƒªã‚¹ãƒˆ  +
+ <%if(loggedin)%> ãƒ¦ãƒ¼ã‚¶ãƒ¼è¨­å®šãƒ¦ãƒ¼ã‚¶ãƒ¼è¨­å®š  + <%else%> ç™»éŒ²ç™»éŒ² <%endif%> +  ãƒ­ã‚°ã‚¤ãƒ³<%if(loggedin)%>管理メニュー<%else%>ログイン<%endif%>  +
+
+
diff --git a/trunk/NP_SubSilver/skins/subsilver/images/cellpic.gif b/trunk/NP_SubSilver/skins/subsilver/images/cellpic.gif new file mode 100644 index 0000000..47457ef Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/cellpic.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/cellpic1.gif b/trunk/NP_SubSilver/skins/subsilver/images/cellpic1.gif new file mode 100644 index 0000000..715b8d4 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/cellpic1.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/cellpic2.jpg b/trunk/NP_SubSilver/skins/subsilver/images/cellpic2.jpg new file mode 100644 index 0000000..a0ca7e8 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/cellpic2.jpg differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/cellpic3.gif b/trunk/NP_SubSilver/skins/subsilver/images/cellpic3.gif new file mode 100644 index 0000000..ecf70e1 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/cellpic3.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/created_by.jpg b/trunk/NP_SubSilver/skins/subsilver/images/created_by.jpg new file mode 100644 index 0000000..f274727 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/created_by.jpg differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder.gif new file mode 100644 index 0000000..c16bfa7 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_announce.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_announce.gif new file mode 100644 index 0000000..0589feb Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_announce.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_announce_new.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_announce_new.gif new file mode 100644 index 0000000..56b2702 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_announce_new.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_big.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_big.gif new file mode 100644 index 0000000..9b2bc47 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_big.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_hot.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_hot.gif new file mode 100644 index 0000000..a7e8831 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_hot.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_lock.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_lock.gif new file mode 100644 index 0000000..10eb776 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_lock.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_lock_new.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_lock_new.gif new file mode 100644 index 0000000..720e210 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_lock_new.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_locked_big.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_locked_big.gif new file mode 100644 index 0000000..436f3d2 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_locked_big.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_new.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_new.gif new file mode 100644 index 0000000..4e56157 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_new.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_new_big.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_new_big.gif new file mode 100644 index 0000000..5eec565 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_new_big.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_new_hot.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_new_hot.gif new file mode 100644 index 0000000..25ced64 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_new_hot.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_sticky.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_sticky.gif new file mode 100644 index 0000000..09861a9 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_sticky.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/folder_sticky_new.gif b/trunk/NP_SubSilver/skins/subsilver/images/folder_sticky_new.gif new file mode 100644 index 0000000..dd2e366 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/folder_sticky_new.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_delete.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_delete.gif new file mode 100644 index 0000000..1153ba5 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_delete.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_latest_reply.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_latest_reply.gif new file mode 100644 index 0000000..b45e57a Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_latest_reply.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_faq.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_faq.gif new file mode 100644 index 0000000..b8b873d Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_faq.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_groups.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_groups.gif new file mode 100644 index 0000000..be5c201 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_groups.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_login.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_login.gif new file mode 100644 index 0000000..30b309b Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_login.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_members.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_members.gif new file mode 100644 index 0000000..a79a5a7 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_members.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_message.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_message.gif new file mode 100644 index 0000000..57071d6 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_message.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_profile.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_profile.gif new file mode 100644 index 0000000..3dc0871 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_profile.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_register.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_register.gif new file mode 100644 index 0000000..11b8f31 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_register.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_search.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_search.gif new file mode 100644 index 0000000..1295e9f Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_mini_search.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_minipost.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_minipost.gif new file mode 100644 index 0000000..d172abb Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_minipost.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_minipost_new.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_minipost_new.gif new file mode 100644 index 0000000..8ec44a1 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_minipost_new.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/icon_newest_reply.gif b/trunk/NP_SubSilver/skins/subsilver/images/icon_newest_reply.gif new file mode 100644 index 0000000..eca2861 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/icon_newest_reply.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/index.htm b/trunk/NP_SubSilver/skins/subsilver/images/index.htm new file mode 100644 index 0000000..491b26d --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/images/index.htm @@ -0,0 +1,16 @@ + + +subSilver created by subBlue Design + + + + + + + + + +
Created by subBlue Design
+ + + \ No newline at end of file diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_aim.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_aim.gif new file mode 100644 index 0000000..4b6a858 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_aim.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_edit.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_edit.gif new file mode 100644 index 0000000..bb70004 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_edit.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_email.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_email.gif new file mode 100644 index 0000000..3d359c2 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_email.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_icq_add.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_icq_add.gif new file mode 100644 index 0000000..4bf276d Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_icq_add.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_ip.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_ip.gif new file mode 100644 index 0000000..bf17a51 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_ip.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_msnm.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_msnm.gif new file mode 100644 index 0000000..6518415 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_msnm.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_pm.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_pm.gif new file mode 100644 index 0000000..f87b4f5 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_pm.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_profile.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_profile.gif new file mode 100644 index 0000000..2bd32d2 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_profile.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_quote.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_quote.gif new file mode 100644 index 0000000..3dec675 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_quote.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_search.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_search.gif new file mode 100644 index 0000000..8dd38a3 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_search.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_www.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_www.gif new file mode 100644 index 0000000..8c1731f Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_www.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_yim.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_yim.gif new file mode 100644 index 0000000..57e75b3 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/icon_yim.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/msg_newpost.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/msg_newpost.gif new file mode 100644 index 0000000..ce2c1a8 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/msg_newpost.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/post.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/post.gif new file mode 100644 index 0000000..4b7cb20 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/post.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/reply-locked.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/reply-locked.gif new file mode 100644 index 0000000..5ab1d7a Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/reply-locked.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/lang_english/reply.gif b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/reply.gif new file mode 100644 index 0000000..cb385af Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/lang_english/reply.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/logo_clear.png b/trunk/NP_SubSilver/skins/subsilver/images/logo_clear.png new file mode 100644 index 0000000..fe4eb3a Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/logo_clear.png differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/logo_petitforum.png b/trunk/NP_SubSilver/skins/subsilver/images/logo_petitforum.png new file mode 100644 index 0000000..2ac1b0b Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/logo_petitforum.png differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/logo_phpBB.gif b/trunk/NP_SubSilver/skins/subsilver/images/logo_phpBB.gif new file mode 100644 index 0000000..37aa0fd Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/logo_phpBB.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/logo_phpBB_med.gif b/trunk/NP_SubSilver/skins/subsilver/images/logo_phpBB_med.gif new file mode 100644 index 0000000..3d84f94 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/logo_phpBB_med.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/msg_inbox.gif b/trunk/NP_SubSilver/skins/subsilver/images/msg_inbox.gif new file mode 100644 index 0000000..011d0bd Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/msg_inbox.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/msg_outbox.gif b/trunk/NP_SubSilver/skins/subsilver/images/msg_outbox.gif new file mode 100644 index 0000000..84fdce3 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/msg_outbox.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/msg_savebox.gif b/trunk/NP_SubSilver/skins/subsilver/images/msg_savebox.gif new file mode 100644 index 0000000..86d1f2c Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/msg_savebox.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/msg_sentbox.gif b/trunk/NP_SubSilver/skins/subsilver/images/msg_sentbox.gif new file mode 100644 index 0000000..b95db75 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/msg_sentbox.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/s_asc.png b/trunk/NP_SubSilver/skins/subsilver/images/s_asc.png new file mode 100644 index 0000000..9990376 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/s_asc.png differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/s_desc.png b/trunk/NP_SubSilver/skins/subsilver/images/s_desc.png new file mode 100644 index 0000000..a03226d Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/s_desc.png differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/spacer.gif b/trunk/NP_SubSilver/skins/subsilver/images/spacer.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/spacer.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/topic_delete.gif b/trunk/NP_SubSilver/skins/subsilver/images/topic_delete.gif new file mode 100644 index 0000000..3b21b11 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/topic_delete.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/topic_lock.gif b/trunk/NP_SubSilver/skins/subsilver/images/topic_lock.gif new file mode 100644 index 0000000..fe32fea Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/topic_lock.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/topic_move.gif b/trunk/NP_SubSilver/skins/subsilver/images/topic_move.gif new file mode 100644 index 0000000..ab2fd23 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/topic_move.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/topic_split.gif b/trunk/NP_SubSilver/skins/subsilver/images/topic_split.gif new file mode 100644 index 0000000..bdbc884 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/topic_split.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/topic_unlock.gif b/trunk/NP_SubSilver/skins/subsilver/images/topic_unlock.gif new file mode 100644 index 0000000..dae3e4d Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/topic_unlock.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/vote_lcap.gif b/trunk/NP_SubSilver/skins/subsilver/images/vote_lcap.gif new file mode 100644 index 0000000..269088b Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/vote_lcap.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/vote_rcap.gif b/trunk/NP_SubSilver/skins/subsilver/images/vote_rcap.gif new file mode 100644 index 0000000..f9584e2 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/vote_rcap.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/voting_bar.gif b/trunk/NP_SubSilver/skins/subsilver/images/voting_bar.gif new file mode 100644 index 0000000..9947315 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/voting_bar.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/images/whosonline.gif b/trunk/NP_SubSilver/skins/subsilver/images/whosonline.gif new file mode 100644 index 0000000..b450927 Binary files /dev/null and b/trunk/NP_SubSilver/skins/subsilver/images/whosonline.gif differ diff --git a/trunk/NP_SubSilver/skins/subsilver/index.inc b/trunk/NP_SubSilver/skins/subsilver/index.inc new file mode 100644 index 0000000..29fbe84 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/index.inc @@ -0,0 +1,27 @@ + + + + + +
+ 現在の時刻 - <%subSilver(showClock,subSilver/index)%>
<%sitevar(name)%> フォーラム一覧 +
+ 未返信の記事を表示 + <%ifnot(loggedin)%> + <%elseif(subSilver,intGetVar,blogid=0)%> +  ã‚µã‚¤ãƒˆå…¨ã¦ã®ãƒˆãƒ”ックをマーク + <%else%> +  ã‚«ãƒ†ã‚´ãƒªå…¨ã¦ã®ãƒˆãƒ”ックをマーク + <%endif%> +
+ + + + + + + + + <%subSilver(showBlogList,subSilver/index)%> +
 ãƒ•ã‚©ãƒ¼ãƒ©ãƒ   ãƒˆãƒ”ック  æŠ•ç¨¿è¨˜äº‹  æœ€æ–°è¨˜äº‹ 
+ diff --git a/trunk/NP_SubSilver/skins/subsilver/item.inc b/trunk/NP_SubSilver/skins/subsilver/item.inc new file mode 100644 index 0000000..8ae6ce2 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/item.inc @@ -0,0 +1,106 @@ +
+ + + + + + + +
<%itemtitle%> + <%if(admin)%>edit<%endif%> +

+  
+ + + + + + + +
+ + +    + + +    <%sitevar(name)%> フォーラム一覧 -> <%category(name)%> + <%if(hasplugin,DisplayComments)%> + <%DisplayComments(pageswitch,info,ページ移動)%>  + <%DisplayComments(pageswitch,prev,前へ)%> + <%DisplayComments(pageswitch,index,10)%> + <%DisplayComments(pageswitch,next,次へ)%> + <%endif%> +
+ + + + + + + +<%if(hasplugin,DisplayComments)%> +<%DisplayComments(comments,subSilver/index,10)%> +<%else%> +<%comments(subSilver/index)%> +<%endif%> + +
前のトピックを表示 :: 次のトピックを表示  
+ + + + + + +
+ + +    + + + + <%if(hasplugin,DisplayComments)%> + <%DisplayComments(pageswitch,info,ページ移動)%>  + <%DisplayComments(pageswitch,prev,前へ)%> + <%DisplayComments(pageswitch,index,10)%> + <%DisplayComments(pageswitch,next,次へ)%> + <%endif%> +
+ +
+ +<%if(subSilver,postVar,subSilver_action=commentform)%> + + + + + + + + + +
返信の投稿
+
+ <%commentform%> +
+
+<%endif%> diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq.inc new file mode 100644 index 0000000..9abd968 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq.inc @@ -0,0 +1,75 @@ + + + + + + + + + + + +
よくある質問
+ ログインと登録に関する問題
+ + 何故ログインできないのでしょうか?
+ 登録は必ずしなければいけないですか?
+ 何故自動的にログオフしてしまうのでしょうか?
+ オンライン状態のユーザーとして名前をリストに表示されないようにするにはどうすればいいのでしょうか?
+ パスワードが無くなってしまいました。
+ 登録したのにログインすることができません。
+ + 過去に登録したのにログインできません。
+
+ ユーザー設定
+ どのようにユーザー設定を変更できますか?
+ 時刻が正しくありません。
+ タイムゾーン設定を変更しても時刻が正しくありません。
+ + 掲示板の言語に私の使用する言語がありません。
+ どのように名前の下に画像を表示できますか?
+ どのようにランクを変更できますか?
+ メールアイコンを使ってユーザーにメールを送信しようとするとログイン画面が表示されます。
+
+ 投稿に関する問題
+ + どのようにトピックを投稿できますか?
+ どのように記事を削除/編集できますか?
+ どのように自分の記事にサインを追加できますか?
+ どのように記事に投票を追加できますか?
+ どのように投票の削除/編集を行うことができますか?
+ 何故フォーラムにアクセスできないのでしょうか?
+ + 何故投票が行えないのでしょうか?
+
+ フォーマットとトピックの種類
+ BBCodeとは何でしょうか?
+ HTMLを使うことはできますか?
+ スマイリーとは何でしょうか?
+ + 記事の本文中に画像を載せることはできますか?
+ 重要トピックとは何でしょうか?
+ 告知トピックとは何でしょうか?
+ ロックトピックとは何でしょうか?
+
+ ユーザーレベルとグループ
+ + 管理者とは何でしょうか?
+ モデレーターとは何でしょうか?
+ ユーザーグループとは何でしょうか?
+ どのようにグループに参加することができますか?
+ どのようにグループのモデレーターになることができますか?
+
+ + PM(プライベートメッセージ)
+ プライベートメッセージを送信できません。
+ 読みたくないPMを定期的に受信しています。
+ この掲示板のユーザーによって、スパム等が自分のメールアドレスに送信されています。
+
+ phpBB 2関連の情報
+ + phpBB 2を作成したのは誰でしょうか?
+ 必要な機能がありません。
+ この掲示板に関連した不正・法的問題については誰に問い合わせればいいのでしょうか?
+
+
 
diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq1.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq1.inc new file mode 100644 index 0000000..98efcb7 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq1.inc @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ログインと登録に関する問題
何故ログインできないのでしょうか?
ユーザー登録は行いましたか?ログインするためにはユーザー登録を行う必要があります。あるいは掲示板の使用を禁止されていますか(禁止されている場合は画面に禁止されていると表示されます)? 使用を禁止されている場合は、管理者に何故禁止されたのかを問い合わせる必要があります。上記のことが原因でないにも関わらずログインができない場合は、ログイン時の名前とパスワードを確かめてください。通常はこれが問題であることが多いですが、これでもない場合は管理者に問い合わせてください。
トップに移動
登録は必ずしなければいけないですか?
掲示板の管理方針によっては、ログインしなくても投稿するできる場合がありますので、必ずしも登録する必要はありません。しかし、登録をすることでユーザー画像の使用、プライベートメッセージ(PM)の使用、仲間のユーザーへのメール送信、グループの参加など様々な機能にアクセスすることができるようになります。登録をしていないゲストユーザーの場合は、利用できる機能が登録ユーザーよりも少ないです。登録は数分で行うことができますので、掲示板をよく使う場合はユーザー登録することをお勧めします。
トップに移動
何故自動的にログオフしてしまうのでしょうか?
「自動ログインを有効にする」のボックスをチェックしていない場合は、一時的にしかログインしません。 常にログイン状態でありたい場合は、このボックスをチェックしてからログインします。この自動ログイン機能は図書館、インターネット喫茶、大学などの共有されたコンピューター環境では利用しないことをお勧めします。
トップに移動
オンライン状態のユーザーとして名前をリストに表示されないようにするにはどうすればいいのでしょうか?
ユーザー設定にある「オンラインステータスを隠す」を「はい」にすると、あなたのオンライン状態は管理人以外には表示されません。この場合は隠れユーザーとして数えられます。
トップに移動
パスワードが無くなってしまいました。
無くしたパスワードを取り戻すことはできませんが、パスワードを再発行することができます。パスワードを再発行する場合は、ログイン画面に入って「パスワードを忘れてしまいました」を選択し、登録した名前とメールアドレスを入力して送信します。再発行されたパスワードは、入力したメールアドレスに送信されます。
トップに移動
登録したのにログインすることができません。
まず最初に正しい名前とパスワードを入力しているかを確認してください。両方とも正しい場合は、次の2つが問題である可能性があります。1つ目は、掲示板がCOPPA(子供のオンライン・プライバシー保護法)の設定を有効にしている場合、13歳未満として登録しているユーザーは与えられた指示に従う必要があります。2つ目は、アカウントをアクティブにしたかを確認してください。掲示板の設定によっては、登録したアカウントのアクティベーションを行わないとアカウントが有効になりません。アクティベーションが必要かどうかは登録完了時に知らされます。アクティブ用のメールが送られているはずなので文章の指示に従ってアクティベーションを行ってください。メールが送信されていない場合は、登録時に正しいメールアドレスを入力したかを確認してください。アカウントのアクティベーション機能が使われている理由の一つとして、無作法なユーザーによる匿名性の乱用等を防ぐということが挙げられます。正しいメールアドレスを入力したにも関わらず登録できない場合は、掲示板の管理者に問い合わせてください。
トップに移動
過去に登録したのにログインできません。
最も可能性のある理由は、間違った名前とパスワードでログインしようとしているため(登録した時に送信されたメールに載っているアカウントを確認してください)、又は、管理者が何らかの理由であなたのアカウントを削除したためでしょう。後者が当てはまる人は、投稿した経験があるでしょうか?管理者によってはデータベースのサイズを小さくするために、登録してから全く投稿を行わないユーザーのアカウントを削除することがあります。この場合は再び登録をして、積極的に議論に参加しましょう。
トップに移動
diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq2.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq2.inc new file mode 100644 index 0000000..95446c3 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq2.inc @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ユーザー設定
どのようにユーザー設定を変更できますか?
全ての設定はデータベースに保管されています。ユーザー設定を変更する場合は、通常ページの上のの部分にあるメニューの「ユーザー設定」をクリックしてください。この画面で全てのユーザー設定を変更することができます。
トップに移動
時刻が正しくありません。
設定しているタイムゾーンによって、時刻が正しく表示されていない場合があります。この場合は、ユーザー設定で時間が合うようにタイムゾーンを設定する必要があります。タイムゾーン等のユーザー設定は登録したユーザーしか行うことができないので注意してください。
トップに移動
タイムゾーン設定を変更しても時刻が正しくありません。
正しいタイムゾーン設定を行っても時刻が正しくない場合、その問題のほとんどがサマータイムによるものです。掲示板の時刻システムはサマータイムに対応していないので、正しい時刻を表示させたい場合は、タイムゾーン設定を1時間ずらす必要があります。
トップに移動
掲示板の言語に私の使用する言語がありません。
使用したい言語がない理由は、その言語ファイルが掲示板に導入されていないか、誰も基本言語ファイル(基本言語は英語)をその言語に翻訳していないかのどちらかです。使用したい言語ファイルが存在する場合は、掲示板の管理者に導入してもらいます。もしも使用したい言語ファイルが存在しない場合は、是非とも翻訳して言語ファイルを作ってください。詳細はphpBB Groupのウェブサイトを見てください。
トップに移動
どのように名前の下に画像を表示できますか?
名前の下に表示される画像は2種類あります。一つは投稿数に応じたランクの画像です。もう一つはユーザー画像です。ユーザー画像は一般的に各ユーザーの好きな画像を選択することができます。掲示板の設定によって定められたユーザー画像しか使えなかったり、一切ユーザー画像が使えない場合があります。ユーザー画像を一切使用できない場合は、どうしてユーザー画像が使用できないかを管理者に問い合わせてください。
トップに移動
どのようにランクを変更できますか?
基本的にランクを変更することはできません。ほとんどの掲示板は、投稿数に応じたランク、管理者やモデレーター等の特定の権限を持つユーザーのみに表示されるランクを使用しています。ランクを上げるために掲示板に無駄な記事を投稿しないようにしてください。場合によっては、ランクを下げられたり、アカウントを削除される可能性があります。
トップに移動
メールアイコンを使ってユーザーにメールを送信しようとするとログイン画面が表示されます。
残念ながら掲示板によるメール送信は登録ユーザーしか行うことができません(掲示板によるメール送信機能は掲示板の設定によって無効になっている場合があります)。これは匿名ユーザーによるメールを使った悪質な行為を防ぐためです。
トップに移動
diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq3.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq3.inc new file mode 100644 index 0000000..40bd18d --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq3.inc @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
投稿に関する問題
どのようにトピックを投稿できますか?
新規トピックのボタンをクリックすれば投稿することができます。掲示板の設定によっては、記事を投稿するために登録を行っている必要があります。フォーラム画面とトピック画面の右下に自分ができるアクションが表示されます。
トップに移動
どのように記事を削除/編集できますか?
一般のユーザーは自分の記事の削除/編集しか行えません。編集を行う場合は、編集したい記事の編集ボタンをクリックします。その記事に返信がある場合は、編集後に記事に編集した回数が表示されます。返信のない記事を編集する場合や、モデレーターと管理者が編集する場合は編集回数は表示されません。削除に関しては、一般のユーザーは返信のある記事を削除することができませんので注意してください。
トップに移動
どのように自分の記事にサインを追加できますか?
サインを追加するためにはユーザー設定を行う必要があります。ユーザー設定画面の「サイン」の欄に追加したいサインを入力して設定します。そして投稿画面で「サインを有効にする」をチェックすれば、自分の記事の本文の一番下にサインを追加することができます。ユーザー設定画面の「サインを常に有効にする」を有効にしていれば、投稿画面の「サインを有効にする」は常にチェックされた状態になります(チェックを外せばサインは追加されません)。
トップに移動
どのように記事に投票を追加できますか?
投票を追加する場合は、新規トピックを投稿するときに「投票の追加/編集」の欄を使います。ここで投票のお題と選択肢を最低2つ作ります(選択肢を作るときは「選択肢を追加」をクリックしてください)。投票期間を設けることもできますが、特に期間を設けない場合は0に設定してください。ちなみに選択肢の数は制限されています(数の上限は掲示板の設定によります)。
トップに移動
どのように投票の削除/編集を行うことができますか?
投票の削除/編集は投票を作成したユーザー、モデレーター、管理者しか行うことができません。投票の削除/編集は、記事の編集ボタンをクリックし、投票関連の情報の削除/編集を行います。一票でもはいっている投票の編集/削除は行うことができませんので注意してください。
トップに移動
何故フォーラムにアクセスできないのでしょうか?
一部のフォーラムは特定のグループやユーザーしか観閲できないように制限がかかっていることがあります。これらのフォーラムを使う権限は、モデレーターと管理人しか与えることができないので、必要に応じて権限を与えてもらうようにしてください。
トップに移動
何故投票が行えないのでしょうか?
投票の混乱を招くような大量投稿などを防ぐため、登録ユーザーしか投票を行うことはできません。登録ユーザーなのに投票が行えない場合は、適切なアクセス権限が与えられていない可能性があります。
トップに移動
diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq4.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq4.inc new file mode 100644 index 0000000..4e6e9fb --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq4.inc @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
フォーマットとトピックの種類
BBCodeとは何でしょうか?
BBCodeとは特殊なHTMLの実行コードです。BBCodeの使用は管理者によって設定されていますので、設定でBBCodeが無効となっている場合は使うことができません。BBCodeが有効となっている場合でも、ユーザーは投稿画面でBBCodeを無効にすることができます。BBCodeはHTMLと似たスタイルをしていて、タグは< >ではなく[ ]が用いられます。使用するテンプレートによってBBCodeは記事内容投稿欄の上にBBCode用のボタンがあり、これ使うことで直接BBCodeタグを入力することなく挿入することができます。詳細は投稿画面のオプションにある「BBCode」のリンクをクリックしてください。
トップに移動
HTMLを使うことはできますか?
HTMLを使用できるかは掲示板の設定によって異なります。HTMLの使用が許可されている場合でも、全てのHTMLタグを使えるわけではありません。これは一部のHTMLタグを使用することで表示等において問題が生じてしまうのを防ぐ安全策です。HTMLを使用したくない場合は、投稿画面で「HTMLを無効にする」をチェックしてください。
トップに移動
スマイリーとは何でしょうか?
スマイリー(別称はエモーションアイコン)とは感情を表現するために用いられる小さな画像のことです。例えば、:) は嬉しい感情、:( は悲しい感情を表します。投稿画面にスマイリー一覧が載っています。投稿画面では複数の記号として表示されますが、記事ではスマイリー画像として表示されます。ただし、スマイリーが多くなると記事が読みづらくなりますので、スマイリーの乱用はしないでください。スマイリーを乱用した記事は、編集/削除/移動対象となる可能性があります。
トップに移動
記事の本文中に画像を載せることはできますか?
本文中の画像を載せることはできます。しかし、画像を掲示板上にアップロードする機能はありません。そのため、インターネット上に存在する画像を利用する必要があります。サーバーでない限り、自分のコンピューター内にある画像にリンクしても掲示板では表示されません。また、アクセスにパスワード等が必要なサイト内の画像、HotmailやYahooのメールボックス内の画像等も利用できませんので注意してください。画像を表示させるには画像URLを[img][/img]で囲みます(HTMLの使用が許可されている場合はHTMLタグも使用できます)。
トップに移動
重要トピックとは何でしょうか?
重要トピックは、掲示板利用者であればすぐに読むべき重要な情報が載っているトピックです。重要トピックはフォーラムの各ページの一番上に表示されます。重要トピックに返信を行えるかどうかはユーザーの権限によります。
トップに移動
告知トピックとは何でしょうか?
告知トピックとは、最初のページの重要トピックの下(重要トピックがない場合は一番上)に表示されるトピックで、比較的重要な情報が含まれています。そのため、告知トピックは読めるときに読んでください。告知トピックに返信を行えるかどうかはユーザーの権限によります。
トップに移動
ロックトピックとは何でしょうか?
ロックトピックとは返信が禁止されているトピック(投票がある場合は投票も禁止されています)です。様々な理由により、モデレーターや管理者によってトピックがロックされることがあります。
トップに移動
diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq5.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq5.inc new file mode 100644 index 0000000..e11baa8 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq5.inc @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ユーザーレベルとグループ
管理者とは何でしょうか?
管理者とは、掲示板における最高権限を持つ人のことです。管理者は、パーミッション設定、特定のユーザーの掲示板使用の禁止、グループやモデレーターの作成等掲示板における全ての設定と操作を行うことができます。もちろん管理者は、全てのフォーラムにおいて完全なモデレーター権限を持っています。
トップに移動
モデレーターとは何でしょうか?
モデレーターとは、フォーラムの管理を行う人のことです。モデレーターは、他人の記事の削除/編集/ロック/移動等の権限を持っています。基本的にモデレーターの役割とは、フォーラムの趣旨を外れた投稿、規約に反する投稿などを削除等を行うことで、そのフォーラムの秩序を保つことです。
トップに移動
ユーザーグループとは何でしょうか?
ユーザーグループとは、管理者がユーザーをグループ分けする方法の一つです。ユーザーグループはグループと呼ぶこともあります。各ユーザーは複数のグループに所属することができて、各グループには個々のアクセス権限が適用されます。これによって管理者は、複数のモデレーターをグループにいれることで管理することが容易になったり、特定のユーザーしか入れないフォーラムを提供することも容易になります。
トップに移動
どのようにグループに参加することができますか?
グループに参加する場合は、ページの上の部分にある「グループ」をクリックしてください。グループ画面に入ると、全てのグループが表示されます。全てのグループが誰でも参加できるオープングループとは限らず、特定のユーザーしか受け入れないクローズドグループ、メンバーが一切表示されない隠れグループもあります。オープングループの場合は、正しい手順で参加の申請を行ってください。参加の申請がグループのモデレーターに承認されると、晴れてグループのメンバーとなることができます。場合によっては、グループに参加する理由をグループのモデレーターに問われることもあります。何らかの理由で参加の申請を却下された場合は、グループのモデレーターを問い詰めるようなことはしないでください。
トップに移動
どのようにグループのモデレーターになることができますか?
グループは管理者によって作られるものですが、その際に管理者はグループを管理する人間を任命します。これがグループのモデレーターです。一般的にグループの作成を申請した人がグループのモデレーターとなることが多いようです。新しいグループを作りたい場合は、PM(プライベートメッセージ)等を使って管理者にグループ作成に関して問い合わせてください。
トップに移動
diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq6.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq6.inc new file mode 100644 index 0000000..aa6f0b7 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq6.inc @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
PM(プライベートメッセージ)
プライベートメッセージを送信できません。
3つの理由があると考えられます。1つ目は登録ユーザーでないため、(PMは登録ユーザーしか使用できない機能です)。2つ目はその掲示板でPMの使用が許可されていないため、3つ目は管理者があなたのPMの使用を禁止しているためです。3つ目の場合は、管理者に何故PMの使用を禁止されたかを問い合わせてください。
トップに移動
読みたくないPMを定期的に受信しています。
次期バージョンでは、プライベートメッセージシステムに無視リスト機能を追加する予定です。現在のバージョンの対策は、管理者に報告して対処してもらうしかありません。
トップに移動
この掲示板のユーザーによって、スパム等が自分のメールアドレスに送信されています。
まことに残念な出来事です。掲示板にはセーフガード機能があり、誰が掲示板を介してそのようなメールを送ったかを探知できます。今まで受信したスパム等のメールのコピーを管理者に送信してください。管理者に送信するコピーにはヘッダー情報が含まれていることを確認してください。これにより、管理者はこの問題に対処することができます。
トップに移動
diff --git a/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq7.inc b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq7.inc new file mode 100644 index 0000000..b5c7f77 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/japanese-utf8/faq7.inc @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
phpBB 2関連の情報
phpBB 2を作成したのは誰でしょうか?
このソフトウェアはphpBB Groupによって作られたもので、著作権はphpBB Groupが有しています。phpBB 2は、GNU 一般公有使用許諾書に定められている条件に従って使用や配布が許諾されています。詳細については、phpBB Groupのサイトを見てください。
トップに移動
必要な機能がありません。
このソフトウェアの作成を行ったのはphpBB Groupで、著作権はphpBB Groupが有しています。その機能が必要なものだと思う場合は、phpbb.comのサイトを訪れて、php Groupに提案してみてください。新機能の提案・要望は、決してphpbb.comの掲示板には書き込まないでください。新機能等の追加の作業はsourceforgeで行われています。フォラームをよく読み、既に提案しようとしている新機能の追加が決まっているかを確認してから、新機能の提案・要望の手順を行ってください。
トップに移動
この掲示板に関連した不正・法的問題については誰に問い合わせればいいのでしょうか?
この掲示板の管理者に問い合わせてください。管理者が誰か分からない場合は、モデレーターに管理者が誰なのかを尋ねてみてください。モデレーターから応答がない場合は、ドメインの管理者等に問い合わせてください(whois lookupを使って調べてみてください)。phpBB Groupには、誰が何処でどのようにこの掲示板が使用するかに干渉する権限は全くないということに注意してください。phpBB Groupの方に直接phpbb.comやphpBBのソフトウェアと関わりのない法的問題に関連することを問い合わせても無意味です。第三者によるphpBBの使用に関してphpBB Groupにメールで問い合わせても、回答は簡単なものか全くされないものと考えてください。
トップに移動
diff --git a/trunk/NP_SubSilver/skins/subsilver/legend.inc b/trunk/NP_SubSilver/skins/subsilver/legend.inc new file mode 100644 index 0000000..e0442e2 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/legend.inc @@ -0,0 +1,59 @@ +
+<%if(category)%> + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
新しい記事有り新しい記事有り  æ–°ã—い記事無し新しい記事無し  é‡è¦ãƒˆãƒ”ック重要トピック
新しい記事有り(人気)新しい記事有り(人気)  æ–°ã—い記事無し(人気)新しい記事無し(人気)  å‘ŠçŸ¥ãƒˆãƒ”ック告知トピック
新しい記事有り(ロック)新しい記事有り(ロック)  æ–°ã—い記事無し(ロック)新しい記事無し(ロック)
+ 新規投稿: <%if(subSilver,member,can=postnew)%>可<%else%>不可<%endif%>
+ 返信: <%if(subSilver,member,can=reply)%>可<%else%>不可<%endif%>
+ 自分の記事の編集: <%if(subSilver,member,can=editcomment)%>可<%else%>不可<%endif%>
+ 自分の記事の削除: <%if(subSilver,member,can=editcomment)%>可<%else%>不可<%endif%>
+
+ +<%else%> + + + + + + + + + + + + +
新しい記事有り新しい記事有り  æ–°ã—い記事無し新しい記事無し  ãƒ­ãƒƒã‚¯çŠ¶æ…‹ãƒ­ãƒƒã‚¯çŠ¶æ…‹
+ +<%endif%> diff --git a/trunk/NP_SubSilver/skins/subsilver/loginform.inc b/trunk/NP_SubSilver/skins/subsilver/loginform.inc new file mode 100644 index 0000000..5ea921a --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/loginform.inc @@ -0,0 +1,8 @@ + + + + + + + +
ログイン
<%loginform%>
diff --git a/trunk/NP_SubSilver/skins/subsilver/member.inc b/trunk/NP_SubSilver/skins/subsilver/member.inc new file mode 100644 index 0000000..2ffabbe --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/member.inc @@ -0,0 +1,83 @@ + + + + + +
<%sitevar(name)%> フォーラム一覧
+ + + + + + + + + + + + + + + + + + + + + +
ユーザー情報 :: <%member(realname)%>
ユーザー画像<%member(realname)%>の詳細 + <%if(subSilver,member,position=ownerofpage)%> + + + <%endif%> +

+ <%if(subSilver,member,position=superadmin)%>Administrator + <%elseif(subSilver,member,position=blogadmin)%>Moderator + <%endif%> +
+ + + + + + + + + + + + + + + + +
登録日: <%subSilver(member,regdate,subSilver/index)%> 頃
投稿数: <%subSilver(member,replies)%>
[全体の割合: <%subSilver(member,percent)%>% / 1日の投稿数: <%subSilver(member,repliesperday)%>]
<%member(realname)%>の投稿記事を全て検索
<%if(subSilver,member,has=url)%>ホームページ: <%endif%><%subSilver(member,url)%>
+
連絡先: <%member(realname)%>
+ + + + +
プライベートメッセージ: +
+ +
+
+ +<%if(subSilver,postVar,subSilver_action=sendmessage)%> + + +
 
+ + + + + + + + +
プライベートメッセージ
+
+ <%membermailform%> +
+
+<%endif%> diff --git a/trunk/NP_SubSilver/skins/subsilver/memberlist.inc b/trunk/NP_SubSilver/skins/subsilver/memberlist.inc new file mode 100644 index 0000000..fd82735 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/memberlist.inc @@ -0,0 +1,45 @@ + + + + +
+ + + + + + + + + + + +<%if(hasplugin,PageSwitch)%> +<%subSilver(memberlist,subSilver/index,10)%> +<%else%> +<%subSilver(memberlist,subSilver/index,10000)%> +<%endif%> + + + + +
+ # <%subSilver(sortbutton,ソート,images/s_asc.png,id_asc,images/s_desc.png,id_desc)%> +   + 名前 <%subSilver(sortbutton,ソート,images/s_asc.png,name_asc,images/s_desc.png,name_desc)%> + + 登録日 <%subSilver(sortbutton,ソート,images/s_asc.png,id_asc,images/s_desc.png,id_desc)%> + 投稿記事ホームページ
+
+ + 名前で検索: + +
+
diff --git a/trunk/NP_SubSilver/skins/subsilver/nucleus.css b/trunk/NP_SubSilver/skins/subsilver/nucleus.css new file mode 100644 index 0000000..b44628e --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/nucleus.css @@ -0,0 +1,115 @@ +img { + border: none; +} + +/*------------------------------------------------- + Forms +-------------------------------------------------*/ +.loginform, .searchform +{ + margin: 5px 0; +} +.commentform, .mailform +{ + margin-top: 10px; + padding: 10px; + background: #EEEEEE; + /* Rounded borders, for Mozilla browsers */ + /* -moz-border-radius: 10px; */ +} +.commentform img{ + margin: 5px 0 0 0; +} +.formfield +{ + font-size: 11px; + background: white; + color: #494949; + border-top: 1px solid #868686; + border-left: 1px solid #868686; + border-bottom: 1px solid #D4D2CF; + border-right: 1px solid #D4D2CF; + margin: 1px 0 0 0; +} +.formbutton +{ + font-size: 11px; + background: white; + color: #494949; + border-top: 1px solid #D4D2CF; + border-left: 1px solid #D4D2CF; + border-bottom: 1px solid #868686; + border-right: 1px solid #868686; + margin: 1px 0 0 0; +} +.commentform .formfield, .commentform .formbutton { + display: block; +} +.searchform .formfield +{ + width: 130px; + font-family: Arial, Tahoma, Trebuchet MS, Verdana, sans-serif; + padding: 2px 0; + margin: 0 2px 2px 0; +} +.searchform .formbutton +{ + width: 60px; + font-family: Tahoma, Arial, Trebuchet MS, Verdana, sans-serif; + padding: 2px 2px; +} +.loginform .formfield +{ + width: 130px; + font-family: Arial, Tahoma, Trebuchet MS, Verdana, sans-serif; + padding: 2px 0; + margin: 0 2px 2px 0; +} +.loginform .formbutton +{ + width: 60px; + font-family: Tahoma, Arial, Trebuchet MS, Verdana, sans-serif; + padding: 2px 2px; +} +.mainform .formfield +{ + width: 280px; + font-family: Arial, Tahoma, Trebuchet MS, Verdana, sans-serif; + padding: 2px 0; + margin: 0 2px 2px 0; +} +.mailform .formbutton +{ + width: 100px; + font-family: Tahoma, Arial, Trebuchet MS, Verdana, sans-serif; + padding: 2px 2px; +} +#nucleus_cf_title, #nucleus_cf_name, #nucleus_cf_mail, #nucleus_cf_email +{ + width: 700px; + font-family: Arial, Trebuchet MS, Verdana, sans-serif; +} +.commentform textarea, .commentform .formfield, .mailform textarea, .mailform .formfield +{ + width: 700px; +} +.commentform .formbutton +{ + width: 100px; + height: 22px; + font-family: Tahoma, Arial, Trebuchet MS, Verdana, sans-serif; +} +.error +{ + color: red; + font-weight: bold; +} +/* znSmiley, lines contain '>' */ +.znsm_re { + color: #090; +} +/* */ +.znsm_img { + vertical-align: middle; + border: none; +} diff --git a/trunk/NP_SubSilver/skins/subsilver/onlinedata.inc b/trunk/NP_SubSilver/skins/subsilver/onlinedata.inc new file mode 100644 index 0000000..1838e6b --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/onlinedata.inc @@ -0,0 +1,26 @@ +<%ifnot(category)%> + + + + + + + + + + + + +
オンライン管理
オンライン管理ユーザーが投稿した記事の総数: <%subSilver(userdata,totalreplies)%>
登録ユーザーの数: <%subSilver(userdata,number)%>
一番新しい登録ユーザー: <%subSilver(userdata,newest)%>
<%if(hasplugin,OnlineUsers)%> + オンライン状態のユーザーは<%OnlineUsers(online)%>人います :: 登録ユーザー(<%OnlineUsers(member)%>人), ゲストユーザー(<%OnlineUsers(guest)%>人)   [ Administrator ]   [ Moderator ]
ユーザー数の記録は <%OnlineUsers(maxonlinenum)%>人 (<%OnlineUsers(recorddate,subSilver/index)%> <%OnlineUsers(recordtime,subSilver/index)%>)
登録ユーザー: <%OnlineUsers(onlinelist)%>
+ <%endif%>
+ + + + +
+ <%if(hasplugin,OnlineUsers)%>このデータは、過去<%OnlineUsers(howlong)%>分間の間にアクションを取ったユーザーに基づいたものです + <%else%>  + <%endif%>
+ +<%endif%> \ No newline at end of file diff --git a/trunk/NP_SubSilver/skins/subsilver/posting.inc b/trunk/NP_SubSilver/skins/subsilver/posting.inc new file mode 100644 index 0000000..253393b --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/posting.inc @@ -0,0 +1,21 @@ + + + + +
<%sitevar(name)%> フォーラム一覧 + -> <%category(name)%>
+ + + + + + + + + + +
トピックの新規投稿
+
+ <%subSilver(commentform)%> +
+
diff --git a/trunk/NP_SubSilver/skins/subsilver/regconfirm.inc b/trunk/NP_SubSilver/skins/subsilver/regconfirm.inc new file mode 100644 index 0000000..02547e9 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/regconfirm.inc @@ -0,0 +1,32 @@ + + + + +
<%sitevar(name)%> フォーラム一覧
+ + + + + + + + +
<%sitevar(name)%> - 登録規約
+ + + + +

掲示板の管理者とモデレーターは、不適切な記事を発見次第削除/編集するように心がけますが、全ての記事に目を通すことはできません。そのため、この掲示板に投稿される全ての記事はその投稿者の視点と意見を表現するものであり、掲示板管理者、モデレーター、サイト管理者の視点と意見を表現するものではなく、管理人は記事に対する責任を一切負いません(掲示板管理者、モデレーター、サイト管理者自身の記事は除く)。

口汚い記事、猥褻な言葉、品性を欠く記事、他人を中傷する記事、嫌悪感を与える記事、脅迫的な記事、性的差別につながる記事、法律を違反する記事の投稿は禁止します。この規約を破った場合は、対象ユーザーのアカウント停止が即座に行われます(場合によっては対象ユーザーのプロバイダーに報告されます)。このような処置を実行するために、全ての記事のIPアドレスが記録されています。掲示板管理者、モデレーター、サイト管理者は、自らの判断で掲示板の如何なる記事を削除、編集、移動、ロックする権限があります。あなたが掲示板上で入力した情報をデータベースに保管されます。あなたの同意がない限り、この情報は第三者に公開されることはありませんが、ハッキング等によるデータの損傷や盗難があった場合は掲示板管理者、モデレーター、サイト管理者はその責任を一切負いません。

この掲示板では、あなたのローカル・コンピューターに情報を保管するためにCookieを使用しています。このCookieは、掲示板の使い勝手の向上させるための情報しか含まれません。メールアドレスは、登録したアカウントの詳細とパスワードを確認するためにだけ使われます(現在のパスワードを忘れた場合、パスワードを再発行する場合にも使われます)。

+ +登録を続ける場合は、これらの規約に同意したものと見なされます。


+ +
+
+ + +

+
+ +
+
+
diff --git a/trunk/NP_SubSilver/skins/subsilver/regform.inc b/trunk/NP_SubSilver/skins/subsilver/regform.inc new file mode 100644 index 0000000..f165df4 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/regform.inc @@ -0,0 +1,39 @@ + + + + +
<%sitevar(name)%> フォーラム一覧
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
登録情報
*がついている項目は必ず入力する必要があります
ユーザー名: *   (only a-z, 0-9)
本名: *
E-mail: *   (利用可能なものを。パスワードはここに送信されます。)
URL:
+ +
diff --git a/trunk/NP_SubSilver/skins/subsilver/search.inc b/trunk/NP_SubSilver/skins/subsilver/search.inc new file mode 100644 index 0000000..1e41af4 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/search.inc @@ -0,0 +1,41 @@ + + + + +
+ <%ifnot(subSilver,requestVar,query=)%>"<%query%>"での検索結果 + <%elseif(subSilver,requestVar,search_author_method=exactly)%><%subSilver(requestVar,search_author)%>の記事を含むトピック一覧 + <%else%>著者が"<%subSilver(requestVar,search_author)%>"の記事を含むトピック一覧 + <%endif%> + <%if(hasplugin,PageSwitch)%>: <%PageSwitch(found)%>件<%endif%> +
+ + + + + + +
<%sitevar(name)%> フォーラム一覧 +
+ + + + + + + + + + + + +<%searchresults(subsilver/index,10)%> + +
  ãƒ•ã‚©ãƒ¼ãƒ©ãƒ   ãƒˆãƒ”ック  è¿”ä¿¡  æŠ•ç¨¿è€…  è¦³é–²  æœ€æ–°è¨˜äº‹ 
\ No newline at end of file diff --git a/trunk/NP_SubSilver/skins/subsilver/searchform.inc b/trunk/NP_SubSilver/skins/subsilver/searchform.inc new file mode 100644 index 0000000..8a9ca4b --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/searchform.inc @@ -0,0 +1,75 @@ +<%subSilver(form,javascript)%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
検索クエリ
キーワードを検索:
検索では AND, OR, NOT を使用することができます。
投稿者を検索: +
+ 完全一致 + 部分一致 +
検索オプション
フォーラム: ç‰¹å®šæœŸé–“内を検索:  +
+ トピックの題名と本文を検索
+ 本文のみを検索
+ トピックの題名のみを検索 +
カテゴリ: ã‚½ãƒ¼ãƒˆæ–¹æ³•:  +
+ 昇順
+ 降順
  +
+ +
\ No newline at end of file diff --git a/trunk/NP_SubSilver/skins/subsilver/skinbackup.xml b/trunk/NP_SubSilver/skins/subsilver/skinbackup.xml new file mode 100644 index 0000000..30f3974 --- /dev/null +++ b/trunk/NP_SubSilver/skins/subsilver/skinbackup.xml @@ -0,0 +1,252 @@ + + + +