OSDN Git Service

Security fix
[nucleus-jp/nucleus-jp-ancient.git] / nucleus / libs / ACTIONS.php
index 5fdbdae..5b5ab6c 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
- * Copyright (C) 2002-2006 The Nucleus Group
+ * Copyright (C) 2002-2007 The Nucleus Group
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -17,9 +17,9 @@
  * SKIN::getAllowedActionsForType($type) method
  *
  * @license http://nucleuscms.org/license.txt GNU General Public License
- * @copyright Copyright (C) 2002-2006 The Nucleus Group
- * @version $Id: ACTIONS.php,v 1.2 2006-07-20 08:01:52 kimitake Exp $
- * @version $NucleusJP$
+ * @copyright Copyright (C) 2002-2007 The Nucleus Group
+ * @version $Id: ACTIONS.php,v 1.7 2007-03-22 03:30:13 kmorimatsu Exp $
+ * @version $NucleusJP: ACTIONS.php,v 1.6 2007/03/13 05:17:37 shizuki Exp $
  */
 
 class ACTIONS extends BaseActions {
@@ -35,18 +35,17 @@ class ACTIONS extends BaseActions {
        // reference to the skin object for which a part is being parsed
        var $skin;
 
-
        // used when including templated forms from the include/ dir. The $formdata var
        // contains the values to fill out in there (assoc array name -> value)
        var $formdata;
 
-
        // filled out with the number of displayed items after calling one of the
-
        // (other)blog/(other)searchresults skinvars.
-
        var $amountfound;
 
+       /**
+        * Constructor for a new ACTIONS object
+        */
        function ACTIONS($type) {
                // call constructor of superclass first
                $this->BaseActions();
@@ -58,16 +57,22 @@ class ACTIONS extends BaseActions {
                        $this->linkparams = array('catid' => $catid);
        }
 
+       /**
+        * Set the skin
+        */
        function setSkin(&$skin) {
                $this->skin =& $skin;
        }
 
+       /**
+        * Set the parser
+        */
        function setParser(&$parser) {
                $this->parser =& $parser;
        }
 
-       /*
-               Forms get parsedincluded now, using an extra <formdata> skinvar
+       /**
+        *      Forms get parsedincluded now, using an extra <formdata> skinvar
        */
        function doForm($filename) {
                global $DIR_NUCLEUS;
@@ -86,35 +91,6 @@ class ACTIONS extends BaseActions {
                array_pop($this->parser->actions);              // ticket
        }
 
-       function parse_ticket() {
-               global $manager;
-               $manager->addTicketHidden();
-       }
-
-       function parse_formdata($what) {
-               echo $this->formdata[$what];
-       }
-       function parse_text($which) {
-               // constant($which) only available from 4.0.4 :(
-               if (defined($which)) {
-                       eval("echo $which;");
-               }
-       }
-       function parse_callback($eventName, $type)
-       {
-               global $manager;
-               $manager->notify($eventName, array('type' => $type));
-       }
-       function parse_errordiv() {
-               global $errormessage;
-               if ($errormessage)
-                       echo '<div class="error">', htmlspecialchars($errormessage),'</div>';
-       }
-
-       function parse_skinname() {
-               echo $this->skin->getName();
-       }
-
        /**
         * Checks conditions for if statements
         *
@@ -123,7 +99,7 @@ class ACTIONS extends BaseActions {
         * @param string $value value of property
         */
        function checkCondition($field, $name='', $value = '') {
-               global $catid, $blog, $member, $itemidnext, $itemidprev, $manager;
+               global $catid, $blog, $member, $itemidnext, $itemidprev, $manager, $archiveprevexists, $archivenextexists;
 
                $condition = 0;
                switch($field) {
@@ -148,6 +124,12 @@ class ACTIONS extends BaseActions {
                        case 'previtem':
                                $condition = ($itemidprev != '');
                                break;
+                       case 'archiveprevexists':
+                               $condition = ($archiveprevexists == true);
+                               break;
+                       case 'archivenextexists':
+                               $condition = ($archivenextexists == true);
+                               break;
                        case 'skintype':
                                $condition = ($name == $this->skintype);
                                break;
@@ -191,6 +173,9 @@ class ACTIONS extends BaseActions {
                return $condition;
        }
 
+       /**
+        * Checks if a plugin exists and call its doIf function
+        */
        function _ifPlugin($name, $key = '', $value = '') {
                global $manager;
 
@@ -203,6 +188,9 @@ class ACTIONS extends BaseActions {
                return call_user_func_array(array(&$plugin, 'doIf'), $params);
        }
 
+       /**
+        * Different checks for a category
+        */
        function _ifCategory($name = '', $value='') {
                global $blog, $catid;
 
@@ -224,6 +212,9 @@ class ACTIONS extends BaseActions {
                return false;
        }
 
+       /**
+        * Checks if a member is on the team of a blog and return his rights
+        */
        function _ifOnTeam($blogName = '') {
                global $blog, $member, $manager;
 
@@ -242,6 +233,9 @@ class ACTIONS extends BaseActions {
                return $member->teamRights($blogid);
        }
 
+       /**
+        * Checks if a member is admin of a blog
+        */
        function _ifAdmin($blogName = '') {
                global $blog, $member, $manager;
 
@@ -259,125 +253,7 @@ class ACTIONS extends BaseActions {
 
                return $member->isBlogAdmin($blogid);
        }
-
-       function parse_ifcat($text = '') {
-               if ($text == '') {
-                       // new behaviour
-                       $this->parse_if('category');
-               } else {
-                       // old behaviour
-                       global $catid, $blog;
-                       if ($blog->isValidCategory($catid))
-                               echo $text;
-               }
-       }
-
-       // a link to the today page (depending on selected blog, etc...)
-       function parse_todaylink($linktext = '') {
-               global $blog, $CONF;
-               if ($blog)
-                       echo $this->_link(createBlogidLink($blog->getID(),$this->linkparams), $linktext);
-               else
-                       echo $this->_link($CONF['SiteUrl'], $linktext);
-       }
-
-       // a link to the archives for the current blog (or for default blog)
-       function parse_archivelink($linktext = '') {
-               global $blog, $CONF;
-               if ($blog)
-                       echo $this->_link(createArchiveListLink($blog->getID(),$this->linkparams), $linktext);
-               else
-                       echo $this->_link(createArchiveListLink(), $linktext);
-       }
-
-       // include itemid of prev item
-       function parse_previtem() {
-               global $itemidprev;
-               echo $itemidprev;
-       }
-
-       // include itemtitle of prev item
-       function parse_previtemtitle($format = '') {
-               global $itemtitleprev;
-
-               switch ($format) {
-                       case 'xml':
-                               echo stringToXML ($itemtitleprev);
-                               break;
-                       case 'attribute':
-                               echo stringToAttribute ($itemtitleprev);
-                               break;
-                       case 'raw':
-                               echo $itemtitleprev;
-                               break;
-                       default:
-                               echo htmlspecialchars($itemtitleprev);
-                               break;
-               }
-       }
-
-       // include itemid of next item
-       function parse_nextitem() {
-               global $itemidnext;
-               echo $itemidnext;
-       }
-
-       // include itemtitle of next item
-       function parse_nextitemtitle($format = '') {
-               global $itemtitlenext;
-
-               switch ($format) {
-                       case 'xml':
-                               echo stringToXML ($itemtitlenext);
-                               break;
-                       case 'attribute':
-                               echo stringToAttribute ($itemtitlenext);
-                               break;
-                       case 'raw':
-                               echo $itemtitlenext;
-                               break;
-                       default:
-                               echo htmlspecialchars($itemtitlenext);
-                               break;
-               }
-       }
-
-       function parse_prevarchive() {
-               global $archiveprev;
-               echo $archiveprev;
-       }
-
-       function parse_nextarchive() {
-               global $archivenext;
-               echo $archivenext;
-       }
-
-       function parse_archivetype() {
-               global $archivetype;
-               echo $archivetype;
-       }
-
-       function parse_prevlink($linktext = '', $amount = 10) {
-               global $itemidprev, $archiveprev, $startpos;
-
-               if ($this->skintype == 'item')
-                       $this->_itemlink($itemidprev, $linktext);
-               else if ($this->skintype == 'search' || $this->skintype == 'index')
-                       $this->_searchlink($amount, $startpos, 'prev', $linktext);
-               else
-                       $this->_archivelink($archiveprev, $linktext);
-       }
-
-       function parse_nextlink($linktext = '', $amount = 10) {
-               global $itemidnext, $archivenext, $startpos;
-               if ($this->skintype == 'item')
-                       $this->_itemlink($itemidnext, $linktext);
-               else if ($this->skintype == 'search' || $this->skintype == 'index')
-                       $this->_searchlink($amount, $startpos, 'next', $linktext);
-               else
-                       $this->_archivelink($archivenext, $linktext);
-       }
-
+       
        /**
         * returns either
         *              - a raw link (html/xml encoded) when no linktext is provided
@@ -393,7 +269,7 @@ class ACTIONS extends BaseActions {
                        $l = $u;
                return $l;
        }
-
+       
        /**
         * Outputs a next/prev link
         *
@@ -453,6 +329,9 @@ class ACTIONS extends BaseActions {
                        echo $this->_link($url, $linktext);
        }
 
+       /**
+        * Creates an item link and if no id is given a todaylink
+        */
        function _itemlink($id, $linktext = '') {
                global $CONF;
                if ($id)
@@ -461,6 +340,9 @@ class ACTIONS extends BaseActions {
                        $this->parse_todaylink($linktext);
        }
 
+       /**
+        * Creates an archive link and if no id is given a todaylink
+        */
        function _archivelink($id, $linktext = '') {
                global $CONF, $blog;
                if ($id)
@@ -469,10 +351,71 @@ class ACTIONS extends BaseActions {
                        $this->parse_todaylink($linktext);
        }
 
+       /**
+         * Helper function that sets the category that a blog will need to use
+         *
+         * @param $blog
+         *             An object of the blog class, passed by reference (we want to make changes to it)
+         * @param $catname
+         *             The name of the category to use
+         */
+       function _setBlogCategory(&$blog, $catname) {
+               global $catid;
+               if ($catname != '')
+                       $blog->setSelectedCategoryByName($catname);
+               else
+                       $blog->setSelectedCategory($catid);
+       }
+
+       /**
+        * Notifies the Manager that a PreBlogContent event occurs
+        */
+       function _preBlogContent($type, &$blog) {
+               global $manager;
+               $manager->notify('PreBlogContent',array('blog' => &$blog, 'type' => $type));
+       }
+
+       /**
+        * Notifies the Manager that a PostBlogContent event occurs
+        */
+       function _postBlogContent($type, &$blog) {
+               global $manager;
+               $manager->notify('PostBlogContent',array('blog' => &$blog, 'type' => $type));
+       }
+
+       /**
+        * Parse skinvar additemform
+        */
+       function parse_additemform() {
+               global $blog, $CONF;
+               $this->formdata = array(
+                       'adminurl' => htmlspecialchars($CONF['AdminURL'],ENT_QUOTES),
+                       'catid' => $blog->getDefaultCategory()
+               );
+               $blog->InsertJavaScriptInfo();
+               $this->doForm('additemform');
+       }
+
+       /**
+        * Parse skinvar adminurl
+        * (shortcut for admin url)      
+        */
+       function parse_adminurl() {
+               $this->parse_sitevar('adminurl');
+       }
+
+       /**
+        * Parse skinvar archive
+        */     
+       function parse_archive($template, $category = '') {
+               global $blog, $archive;
+               // can be used with either yyyy-mm or yyyy-mm-dd
+               sscanf($archive,'%d-%d-%d',$y,$m,$d);
+               $this->_setBlogCategory($blog, $category);
+               $this->_preBlogContent('achive',$blog);
+               $blog->showArchive($template, $y, $m, $d);
+               $this->_postBlogContent('achive',$blog);
 
-       function parse_itemlink($linktext = '') {
-               global $itemid;
-               $this->_itemlink($itemid, $linktext);
        }
 
        /**
@@ -506,82 +449,27 @@ class ACTIONS extends BaseActions {
                echo strftime($format,mktime(0,0,0,$m,$d?$d:1,$y));
        }
 
-       function parse_blog($template, $amount = 10, $category = '') {
-               global $blog, $startpos;
-
-               list($limit, $offset) = sscanf($amount, '%d(%d)');
+       /**
+        * Parse skinvar archivedaylist
+        */     
+       function parse_archivedaylist($template, $category = 'all', $limit = 0) {
+               global $blog;
+               if ($category == 'all') $category = '';
+               $this->_preBlogContent('archivelist',$blog);
                $this->_setBlogCategory($blog, $category);
-               $this->_preBlogContent('blog',$blog);
-               $this->amountfound = $blog->readLog($template, $limit, $offset, $startpos);
-               $this->_postBlogContent('blog',$blog);
+               $blog->showArchiveList($template, 'day', $limit);
+               $this->_postBlogContent('archivelist',$blog);
        }
-
-       function parse_otherblog($blogname, $template, $amount = 10, $category = '') {
-               global $manager;
-
-               list($limit, $offset) = sscanf($amount, '%d(%d)');
-
-               $b =& $manager->getBlog(getBlogIDFromName($blogname));
-               $this->_setBlogCategory($b, $category);
-               $this->_preBlogContent('otherblog',$b);
-               $this->amountfound = $b->readLog($template, $limit, $offset);
-               $this->_postBlogContent('otherblog',$b);
-       }
-
-       // include one item (no comments)
-       function parse_item($template) {
-               global $blog, $itemid, $highlight;
-               $this->_setBlogCategory($blog, '');     // need this to select default category
-               $this->_preBlogContent('item',$blog);
-               $r = $blog->showOneitem($itemid, $template, $highlight);
-               if ($r == 0)
-                       echo _ERROR_NOSUCHITEM;
-               $this->_postBlogContent('item',$blog);
-       }
-
-       function parse_itemid() {
-               global $itemid;
-               echo $itemid;
-       }
-
-
-       // include comments for one item
-       function parse_comments($template) {
-               global $itemid, $manager, $blog, $highlight;
-               $template =& $manager->getTemplate($template);
-
-               // create parser object & action handler
-               $actions =& new ITEMACTIONS($blog);
-               $parser =& new PARSER($actions->getDefinedActions(),$actions);
-               $actions->setTemplate($template);
-               $actions->setParser($parser);
-               $item = ITEM::getitem($itemid, 0, 0);
-               $actions->setCurrentItem($item);
-
-               $comments =& new COMMENTS($itemid);
-               $comments->setItemActions($actions);
-               $comments->showComments($template, -1, 1, $highlight);  // shows ALL comments
-       }
-
-       function parse_archive($template, $category = '') {
-               global $blog, $archive;
-               // can be used with either yyyy-mm or yyyy-mm-dd
-               sscanf($archive,'%d-%d-%d',$y,$m,$d);
-               $this->_setBlogCategory($blog, $category);
-               $this->_preBlogContent('achive',$blog);
-               $blog->showArchive($template, $y, $m, $d);
-               $this->_postBlogContent('achive',$blog);
-
-       }
-
-       function parse_otherarchive($blogname, $template, $category = '') {
-               global $archive, $manager;
-               sscanf($archive,'%d-%d-%d',$y,$m,$d);
-               $b =& $manager->getBlog(getBlogIDFromName($blogname));
-               $this->_setBlogCategory($b, $category);
-               $this->_preBlogContent('otherachive',$b);
-               $b->showArchive($template, $y, $m, $d);
-               $this->_postBlogContent('otherachive',$b);
+       
+       /**
+        *      A link to the archives for the current blog (or for default blog)
+        */
+       function parse_archivelink($linktext = '') {
+               global $blog, $CONF;
+               if ($blog)
+                       echo $this->_link(createArchiveListLink($blog->getID(),$this->linkparams), $linktext);
+               else
+                       echo $this->_link(createArchiveListLink(), $linktext);
        }
 
        function parse_archivelist($template, $category = 'all', $limit = 0) {
@@ -593,50 +481,72 @@ class ACTIONS extends BaseActions {
                $this->_postBlogContent('archivelist',$blog);
        }
 
-       function parse_archivedaylist($template, $category = 'all', $limit = 0) {
-               global $blog;
-               if ($category == 'all') $category = '';
-               $this->_preBlogContent('archivelist',$blog);
+       /**
+        * Parse skinvar archivetype
+        */     
+       function parse_archivetype() {
+               global $archivetype;
+               echo $archivetype;
+       }
+
+       /**
+        * Parse skinvar blog
+        */     
+       function parse_blog($template, $amount = 10, $category = '') {
+               global $blog, $startpos;
+
+               list($limit, $offset) = sscanf($amount, '%d(%d)');
                $this->_setBlogCategory($blog, $category);
-               $blog->showArchiveList($template, 'day', $limit);
-               $this->_postBlogContent('archivelist',$blog);
+               $this->_preBlogContent('blog',$blog);
+               $this->amountfound = $blog->readLog($template, $limit, $offset, $startpos);
+               $this->_postBlogContent('blog',$blog);
        }
 
-       function parse_itemtitle($format = '') {
-               global $manager, $itemid;
-               $item =& $manager->getItem($itemid,0,0);
+       /*
+       *       Parse skinvar bloglist
+       *       Shows a list of all blogs
+       *       bnametype: whether 'name' or 'shortname' is used for the link text        
+       */      
+       function parse_bloglist($template, $bnametype = '') {
+               BLOG::showBlogList($template, $bnametype);
+       }
 
-               switch ($format) {
-                       case 'xml':
-                               echo stringToXML ($item['title']);
+       /**
+        * Parse skinvar blogsetting
+        */
+       function parse_blogsetting($which) {
+               global $blog;
+               switch($which) {
+                       case 'id':
+                               echo htmlspecialchars($blog->getID(),ENT_QUOTES);
                                break;
-                       case 'attribute':
-                               echo stringToAttribute ($item['title']);
+                       case 'url':
+                               echo htmlspecialchars($blog->getURL(),ENT_QUOTES);
                                break;
-                       case 'raw':
-                               echo $item['title'];
+                       case 'name':
+                               echo htmlspecialchars($blog->getName(),ENT_QUOTES);
                                break;
-                       default:
-                               echo htmlspecialchars(strip_tags($item['title']));
+                       case 'desc':
+                               echo htmlspecialchars($blog->getDescription(),ENT_QUOTES);
+                               break;
+                       case 'short':
+                               echo htmlspecialchars($blog->getShortName(),ENT_QUOTES);
                                break;
                }
        }
 
-       function parse_categorylist($template, $blogname = '') {
-               global $blog, $manager;
-
-               if ($blogname == '') {
-                       $this->_preBlogContent('categorylist',$blog);
-                       $blog->showCategoryList($template);
-                       $this->_postBlogContent('categorylist',$blog);
-               } else {
-                       $b =& $manager->getBlog(getBlogIDFromName($blogname));
-                       $this->_preBlogContent('categorylist',$b);
-                       $b->showCategoryList($template);
-                       $this->_postBlogContent('categorylist',$b);
-               }
+       /**
+        * Parse callback
+        */
+       function parse_callback($eventName, $type)
+       {
+               global $manager;
+               $manager->notify($eventName, array('type' => $type));
        }
 
+       /**
+        * Parse skinvar category
+        */     
        function parse_category($type = 'name') {
                global $catid, $blog;
                if (!$blog->isValidCategory($catid))
@@ -655,67 +565,164 @@ class ACTIONS extends BaseActions {
                }
        }
 
-       function parse_otherarchivelist($blogname, $template, $category = 'all', $limit = 0) {
-               global $manager;
-               if ($category == 'all') $category = '';
-               $b =& $manager->getBlog(getBlogIDFromName($blogname));
-               $this->_setBlogCategory($b, $category);
-               $this->_preBlogContent('otherarchivelist',$b);
-               $b->showArchiveList($template, 'month', $limit);
-               $this->_postBlogContent('otherarchivelist',$b);
+       /**
+        * Parse categorylist
+        */     
+       function parse_categorylist($template, $blogname = '') {
+               global $blog, $manager;
+
+               if ($blogname == '') {
+                       $this->_preBlogContent('categorylist',$blog);
+                       $blog->showCategoryList($template);
+                       $this->_postBlogContent('categorylist',$blog);
+               } else {
+                       $b =& $manager->getBlog(getBlogIDFromName($blogname));
+                       $this->_preBlogContent('categorylist',$b);
+                       $b->showCategoryList($template);
+                       $this->_postBlogContent('categorylist',$b);
+               }
        }
 
-       function parse_otherarchivedaylist($blogname, $template, $category = 'all', $limit = 0) {
-               global $manager;
-               if ($category == 'all') $category = '';
-               $b =& $manager->getBlog(getBlogIDFromName($blogname));
-               $this->_setBlogCategory($b, $category);
-               $this->_preBlogContent('otherarchivelist',$b);
-               $b->showArchiveList($template, 'day', $limit);
-               $this->_postBlogContent('otherarchivelist',$b);
+       /**
+        * Parse skinvar charset
+        */
+       function parse_charset() {
+               echo _CHARSET;
        }
 
-       function parse_searchresults($template, $maxresults = 50 ) {
-               global $blog, $query, $amount, $startpos;
+       /**
+        * Parse skinvar commentform
+        */
+       function parse_commentform($destinationurl = '') {
+               global $blog, $itemid, $member, $CONF, $manager, $DIR_LIBS, $errormessage;
 
-               $this->_setBlogCategory($blog, '');     // need this to select default category
-               $this->_preBlogContent('searchresults',$blog);
-               $this->amountfound = $blog->search($query, $template, $amount, $maxresults, $startpos);
-               $this->_postBlogContent('searchresults',$blog);
-       }
+               // warn when trying to provide a actionurl (used to be a parameter in Nucleus <2.0)
+               if (stristr($destinationurl, 'action.php')) {
+                       $args = func_get_args();
+                       $destinationurl = $args[1];
+                       ACTIONLOG::add(WARNING,'actionurl is not longer a parameter on commentform skinvars. Moved to be a global setting instead.');
+               }
 
-       function parse_othersearchresults($blogname, $template, $maxresults = 50) {
-               global $query, $amount, $manager, $startpos;
-               $b =& $manager->getBlog(getBlogIDFromName($blogname));
-               $this->_setBlogCategory($b, '');        // need this to select default category
-               $this->_preBlogContent('othersearchresults',$b);
-               $b->search($query, $template, $amount, $maxresults, $startpos);
-               $this->_postBlogContent('othersearchresults',$b);
-       }
+               $actionurl = $CONF['ActionURL'];
 
-       // includes the search query
-       function parse_query() {
-               global $query;
-               echo htmlspecialchars($query);
+               // if item is closed, show message and do nothing
+               $item =& $manager->getItem($itemid,0,0);
+               if ($item['closed'] || !$blog->commentsEnabled()) {
+                       $this->doForm('commentform-closed');
+                       return;
+               }
+
+               if (!$destinationurl)
+               {
+                       $destinationurl = createLink(
+                               'item',
+                               array(
+                                       'itemid' => $itemid,
+                                       'title' => $item['title'],
+                                       'timestamp' => $item['timestamp'],
+                                       'extra' => $this->linkparams
+                               )
+                       );
+
+                       // note: createLink returns an HTML encoded URL
+               } else {
+                       // HTML encode URL
+                       $destinationurl = htmlspecialchars($destinationurl,ENT_QUOTES);
+               }
+
+               // 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');
+
+               $this->formdata = array(
+                       'destinationurl' => $destinationurl,    // url is already HTML encoded
+                       '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"':''
+               );
+
+               if (!$member->isLoggedIn()) {
+                       $this->doForm('commentform-notloggedin');
+               } else {
+                       $this->doForm('commentform-loggedin');
+               }
        }
 
-       // include nucleus versionnumber
-       function parse_version() {
-               global $nucleus;
-               echo 'Nucleus CMS ' . $nucleus['version'];
+       /**
+        * Parse skinvar comments
+        * include comments for one item         
+        */     
+       function parse_comments($template) {
+               global $itemid, $manager, $blog, $highlight;
+               $template =& $manager->getTemplate($template);
+
+               // create parser object & action handler
+               $actions =& new ITEMACTIONS($blog);
+               $parser =& new PARSER($actions->getDefinedActions(),$actions);
+               $actions->setTemplate($template);
+               $actions->setParser($parser);
+               $item = ITEM::getitem($itemid, 0, 0);
+               $actions->setCurrentItem($item);
+
+               $comments =& new COMMENTS($itemid);
+               $comments->setItemActions($actions);
+               $comments->showComments($template, -1, 1, $highlight);  // shows ALL comments
        }
 
+       /**
+        * Parse errordiv
+        */
+       function parse_errordiv() {
+               global $errormessage;
+               if ($errormessage)
+                       echo '<div class="error">', htmlspecialchars($errormessage),'</div>';
+       }
 
+       /**
+        * Parse skinvar errormessage
+        */
        function parse_errormessage() {
                global $errormessage;
                echo $errormessage;
        }
 
+       /**
+        * Parse formdata
+        */
+       function parse_formdata($what) {
+               echo $this->formdata[$what];
+       }
 
-       function parse_imagetext() {
-               echo htmlspecialchars(requestVar('imagetext'));
+       /**
+        * Parse ifcat
+        */
+       function parse_ifcat($text = '') {
+               if ($text == '') {
+                       // new behaviour
+                       $this->parse_if('category');
+               } else {
+                       // old behaviour
+                       global $catid, $blog;
+                       if ($blog->isValidCategory($catid))
+                               echo $text;
+               }
        }
 
+       /**
+        * Parse skinvar image
+        */
        function parse_image($what = 'imgtag') {
                global $CONF;
 
@@ -747,55 +754,87 @@ class ACTIONS extends BaseActions {
                }
        }
 
-       // When commentform is not used, to include a hidden field with itemid
-       function parse_vars() {
+       /**
+        * Parse skinvar imagetext
+        */
+       function parse_imagetext() {
+               echo htmlspecialchars(requestVar('imagetext'),ENT_QUOTES);
+       }
+
+       /**
+        * Parse skinvar item
+        * include one item (no comments)        
+        */     
+       function parse_item($template) {
+               global $blog, $itemid, $highlight;
+               $this->_setBlogCategory($blog, '');     // need this to select default category
+               $this->_preBlogContent('item',$blog);
+               $r = $blog->showOneitem($itemid, $template, $highlight);
+               if ($r == 0)
+                       echo _ERROR_NOSUCHITEM;
+               $this->_postBlogContent('item',$blog);
+       }
+
+       /**
+        * Parse skinvar itemid
+        */     
+       function parse_itemid() {
                global $itemid;
-               echo '<input type="hidden" name="itemid" value="'.$itemid.'" />';
+               echo $itemid;
        }
 
-       // include a sitevar
-       function parse_sitevar($which) {
-               global $CONF;
-               switch($which) {
-                       case 'url':
-                               echo $CONF['IndexURL'];
-                               break;
-                       case 'name':
-                               echo $CONF['SiteName'];
-                               break;
-                       case 'admin':
-                               echo $CONF['AdminEmail'];
-                               break;
-                       case 'adminurl':
-                               echo $CONF['AdminURL'];
-               }
+       /**
+        * Parse skinvar itemlink
+        */     
+       function parse_itemlink($linktext = '') {
+               global $itemid;
+               $this->_itemlink($itemid, $linktext);
        }
 
-       // shortcut for admin url
-       function parse_adminurl() { $this->parse_sitevar('adminurl'); }
+       /**
+        * Parse itemtitle
+        */     
+       function parse_itemtitle($format = '') {
+               global $manager, $itemid;
+               $item =& $manager->getItem($itemid,0,0);
 
-       function parse_blogsetting($which) {
-               global $blog;
-               switch($which) {
-                       case 'id':
-                               echo $blog->getID();
-                               break;
-                       case 'url':
-                               echo $blog->getURL();
+               switch ($format) {
+                       case 'xml':
+                               echo stringToXML ($item['title']);
                                break;
-                       case 'name':
-                               echo $blog->getName();
+                       case 'attribute':
+                               echo stringToAttribute ($item['title']);
                                break;
-                       case 'desc':
-                               echo $blog->getDescription();
+                       case 'raw':
+                               echo $item['title'];
                                break;
-                       case 'short':
-                               echo $blog->getShortName();
+                       default:
+                               echo htmlspecialchars(strip_tags($item['title']),ENT_QUOTES);
                                break;
                }
        }
 
-       // includes a member info thingie
+       /**
+        * Parse skinvar loginform
+        */
+       function parse_loginform() {
+               global $member, $CONF;
+               if (!$member->isLoggedIn()) {
+                       $filename = 'loginform-notloggedin';
+                       $this->formdata = array();
+               } else {
+                       $filename = 'loginform-loggedin';
+                       $this->formdata = array(
+                               'membername' => $member->getDisplayName(),
+                       );
+               }
+               $this->doForm($filename);
+       }
+
+       /**
+        * Parse skinvar member
+        * (includes a member info thingie)
+        */
        function parse_member($what) {
                global $memberinfo, $member;
 
@@ -804,22 +843,22 @@ class ACTIONS extends BaseActions {
 
                        switch($what) {
                                case 'name':
-                                       echo $memberinfo->getDisplayName();
+                                       echo htmlspecialchars($memberinfo->getDisplayName(),ENT_QUOTES);
                                        break;
                                case 'realname':
-                                       echo $memberinfo->getRealName();
+                                       echo htmlspecialchars($memberinfo->getRealName(),ENT_QUOTES);
                                        break;
                                case 'notes':
-                                       echo $memberinfo->getNotes();
+                                       echo htmlspecialchars($memberinfo->getNotes(),ENT_QUOTES);
                                        break;
                                case 'url':
-                                       echo $memberinfo->getURL();
+                                       echo htmlspecialchars($memberinfo->getURL(),ENT_QUOTES);
                                        break;
                                case 'email':
-                                       echo $memberinfo->getEmail();
+                                       echo htmlspecialchars($memberinfo->getEmail(),ENT_QUOTES);
                                        break;
                                case 'id':
-                                       echo $memberinfo->getID();
+                                       echo htmlspecialchars($memberinfo->getID(),ENT_QUOTES);
                                        break;
                        }
                }
@@ -851,28 +890,180 @@ class ACTIONS extends BaseActions {
 
        }
 
-       function parse_preview($template) {
-               global $blog, $CONF, $manager;
+       /**
+        * Parse skinvar membermailform
+        */
+       function parse_membermailform($rows = 10, $cols = 40, $desturl = '') {
+               global $member, $CONF, $memberid;
+
+               if ($desturl == '') {
+                       if ($CONF['URLMode'] == 'pathinfo')
+                               $desturl = createMemberLink($memberid);
+                       else
+                               $desturl = $CONF['IndexURL'] . createMemberLink($memberid);
+               }
+
+               $message = postVar('message');
+               $frommail = postVar('frommail');
+
+               $this->formdata = array(
+                       'url' => htmlspecialchars($desturl),
+                       'actionurl' => htmlspecialchars($CONF['ActionURL'],ENT_QUOTES),
+                       'memberid' => $memberid,
+                       'rows' => $rows,
+                       'cols' => $cols,
+                       'message' => htmlspecialchars($message,ENT_QUOTES),
+                       'frommail' => htmlspecialchars($frommail,ENT_QUOTES)
+               );
+               if ($member->isLoggedIn()) {
+                       $this->doForm('membermailform-loggedin');
+               } else if ($CONF['NonmemberMail']) {
+                       $this->doForm('membermailform-notloggedin');
+               } else {
+                       $this->doForm('membermailform-disallowed');
+               }
 
-               $template =& $manager->getTemplate($template);
-               $row['body'] = '<span id="prevbody"></span>';
-               $row['title'] = '<span id="prevtitle"></span>';
-               $row['more'] = '<span id="prevmore"></span>';
-               $row['itemlink'] = '';
-               $row['itemid'] = 0; $row['blogid'] = $blog->getID();
-               echo TEMPLATE::fill($template['ITEM_HEADER'],$row);
-               echo TEMPLATE::fill($template['ITEM'],$row);
-               echo TEMPLATE::fill($template['ITEM_FOOTER'],$row);
        }
 
-       function parse_additemform() {
-               global $blog, $CONF;
+       /**
+        * Parse skinvar nextarchive
+        */     
+       function parse_nextarchive() {
+               global $archivenext;
+               echo $archivenext;
+       }
+
+       /**
+        * Parse skinvar nextitem
+        * (include itemid of next item)
+        */      
+       function parse_nextitem() {
+               global $itemidnext;
+               if (isset($itemidnext)) echo (int)$itemidnext;
+       }
+
+       /**
+        * Parse skinvar nextitemtitle
+        * (include itemtitle of next item)
+        */
+       function parse_nextitemtitle($format = '') {
+               global $itemtitlenext;
+
+               switch ($format) {
+                       case 'xml':
+                               echo stringToXML ($itemtitlenext);
+                               break;
+                       case 'attribute':
+                               echo stringToAttribute ($itemtitlenext);
+                               break;
+                       case 'raw':
+                               echo $itemtitlenext;
+                               break;
+                       default:
+                               echo htmlspecialchars($itemtitlenext,ENT_QUOTES);
+                               break;
+               }
+       }
+
+       /**
+        * Parse skinvar nextlink
+        */     
+       function parse_nextlink($linktext = '', $amount = 10) {
+               global $itemidnext, $archivenext, $startpos;
+               if ($this->skintype == 'item')
+                       $this->_itemlink($itemidnext, $linktext);
+               else if ($this->skintype == 'search' || $this->skintype == 'index')
+                       $this->_searchlink($amount, $startpos, 'next', $linktext);
+               else
+                       $this->_archivelink($archivenext, $linktext);
+       }
+
+       /**
+        * Parse skinvar nucleusbutton
+        */
+       function parse_nucleusbutton($imgurl = '',
+                                                                $imgwidth = '85',
+                                                                $imgheight = '31') {
+               global $CONF;
+               if ($imgurl == '') {
+                       $imgurl = $CONF['AdminURL'] . 'nucleus.gif';
+               } else if (PARSER::getProperty('IncludeMode') == 'skindir'){
+                       // when skindit IncludeMode is used: start from skindir
+                       $imgurl = $CONF['SkinsURL'] . PARSER::getProperty('IncludePrefix') . $imgurl;
+               }
+
                $this->formdata = array(
-                       'adminurl' => htmlspecialchars($CONF['AdminURL']),
-                       'catid' => $blog->getDefaultCategory()
+                       'imgurl' => $imgurl,
+                       'imgwidth' => $imgwidth,
+                       'imgheight' => $imgheight,
                );
-               $blog->InsertJavaScriptInfo();
-               $this->doForm('additemform');
+               $this->doForm('nucleusbutton');
+       }
+
+       /**
+        * Parse skinvar otherarchive
+        */     
+       function parse_otherarchive($blogname, $template, $category = '') {
+               global $archive, $manager;
+               sscanf($archive,'%d-%d-%d',$y,$m,$d);
+               $b =& $manager->getBlog(getBlogIDFromName($blogname));
+               $this->_setBlogCategory($b, $category);
+               $this->_preBlogContent('otherachive',$b);
+               $b->showArchive($template, $y, $m, $d);
+               $this->_postBlogContent('otherachive',$b);
+       }
+
+       /**
+        * Parse skinvar otherarchivedaylist
+        */     
+       function parse_otherarchivedaylist($blogname, $template, $category = 'all', $limit = 0) {
+               global $manager;
+               if ($category == 'all') $category = '';
+               $b =& $manager->getBlog(getBlogIDFromName($blogname));
+               $this->_setBlogCategory($b, $category);
+               $this->_preBlogContent('otherarchivelist',$b);
+               $b->showArchiveList($template, 'day', $limit);
+               $this->_postBlogContent('otherarchivelist',$b);
+       }
+
+       /**
+        * Parse skinvar otherarchivelist
+        */     
+       function parse_otherarchivelist($blogname, $template, $category = 'all', $limit = 0) {
+               global $manager;
+               if ($category == 'all') $category = '';
+               $b =& $manager->getBlog(getBlogIDFromName($blogname));
+               $this->_setBlogCategory($b, $category);
+               $this->_preBlogContent('otherarchivelist',$b);
+               $b->showArchiveList($template, 'month', $limit);
+               $this->_postBlogContent('otherarchivelist',$b);
+       }
+
+       /**
+        * Parse skinvar otherblog
+        */     
+       function parse_otherblog($blogname, $template, $amount = 10, $category = '') {
+               global $manager;
+
+               list($limit, $offset) = sscanf($amount, '%d(%d)');
+
+               $b =& $manager->getBlog(getBlogIDFromName($blogname));
+               $this->_setBlogCategory($b, $category);
+               $this->_preBlogContent('otherblog',$b);
+               $this->amountfound = $b->readLog($template, $limit, $offset);
+               $this->_postBlogContent('otherblog',$b);
+       }
+
+       /**
+        * Parse skinvar othersearchresults
+        */     
+       function parse_othersearchresults($blogname, $template, $maxresults = 50) {
+               global $query, $amount, $manager, $startpos;
+               $b =& $manager->getBlog(getBlogIDFromName($blogname));
+               $this->_setBlogCategory($b, '');        // need this to select default category
+               $this->_preBlogContent('othersearchresults',$b);
+               $b->search($query, $template, $amount, $maxresults, $startpos);
+               $this->_postBlogContent('othersearchresults',$b);
        }
 
        /**
@@ -904,121 +1095,96 @@ class ACTIONS extends BaseActions {
                call_user_func_array(array(&$plugin,'doSkinVar'), $params);
        }
 
+       /**
+        * Parse skinvar prevarchive
+        */     
+       function parse_prevarchive() {
+               global $archiveprev;
+               echo $archiveprev;
+       }
 
-       function parse_commentform($destinationurl = '') {
-               global $blog, $itemid, $member, $CONF, $manager, $DIR_LIBS, $errormessage;
-
-               // warn when trying to provide a actionurl (used to be a parameter in Nucleus <2.0)
-               if (stristr($destinationurl, 'action.php')) {
-                       $args = func_get_args();
-                       $destinationurl = $args[1];
-                       ACTIONLOG::add(WARNING,'actionurl is not longer a parameter on commentform skinvars. Moved to be a global setting instead.');
-               }
-
-               $actionurl = $CONF['ActionURL'];
+       /**
+        * Parse skinvar preview
+        */
+       function parse_preview($template) {
+               global $blog, $CONF, $manager;
 
-               // if item is closed, show message and do nothing
-               $item =& $manager->getItem($itemid,0,0);
-               if ($item['closed'] || !$blog->commentsEnabled()) {
-                       $this->doForm('commentform-closed');
-                       return;
-               }
+               $template =& $manager->getTemplate($template);
+               $row['body'] = '<span id="prevbody"></span>';
+               $row['title'] = '<span id="prevtitle"></span>';
+               $row['more'] = '<span id="prevmore"></span>';
+               $row['itemlink'] = '';
+               $row['itemid'] = 0; $row['blogid'] = $blog->getID();
+               echo TEMPLATE::fill($template['ITEM_HEADER'],$row);
+               echo TEMPLATE::fill($template['ITEM'],$row);
+               echo TEMPLATE::fill($template['ITEM_FOOTER'],$row);
+       }
 
-               if (!$destinationurl)
-               {
-                       $destinationurl = createLink(
-                               'item',
-                               array(
-                                       'itemid' => $itemid,
-                                       'title' => $item['title'],
-                                       'timestamp' => $item['timestamp'],
-                                       'extra' => $this->linkparams
-                               )
-                       );
+       /*
+        * Parse skinvar previtem
+        * (include itemid of prev item)                 
+        */       
+       function parse_previtem() {
+               global $itemidprev;
+               if (isset($itemidprev)) echo (int)$itemidprev;
+       }
 
-                       // note: createLink returns an HTML encoded URL
-               } else {
-                       // HTML encode URL
-                       $destinationurl = htmlspecialchars($destinationurl);
-               }
+       /**
+        * Parse skinvar previtemtitle
+        * (include itemtitle of prev item)
+        */      
+       function parse_previtemtitle($format = '') {
+               global $itemtitleprev;
 
-               // 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');
+               switch ($format) {
+                       case 'xml':
+                               echo stringToXML ($itemtitleprev);
+                               break;
+                       case 'attribute':
+                               echo stringToAttribute ($itemtitleprev);
+                               break;
+                       case 'raw':
+                               echo $itemtitleprev;
+                               break;
+                       default:
+                               echo htmlspecialchars($itemtitleprev,ENT_QUOTES);
+                               break;
                }
-               $body = postVar('body');
+       }
 
-               $this->formdata = array(
-                       'destinationurl' => $destinationurl,    // url is already HTML encoded
-                       'actionurl' => htmlspecialchars($actionurl),
-                       'itemid' => $itemid,
-                       'user' => htmlspecialchars($user),
-                       'userid' => htmlspecialchars($userid),
-                       'email' => htmlspecialchars($email),
-                       'body' => htmlspecialchars($body),
-                       'membername' => $member->getDisplayName(),
-                       'rememberchecked' => cookieVar($CONF['CookiePrefix'] .'comment_user')?'checked="checked"':''
-               );
+       /**
+        * Parse skinvar prevlink
+        */     
+       function parse_prevlink($linktext = '', $amount = 10) {
+               global $itemidprev, $archiveprev, $startpos;
 
-               if (!$member->isLoggedIn()) {
-                       $this->doForm('commentform-notloggedin');
-               } else {
-                       $this->doForm('commentform-loggedin');
-               }
+               if ($this->skintype == 'item')
+                       $this->_itemlink($itemidprev, $linktext);
+               else if ($this->skintype == 'search' || $this->skintype == 'index')
+                       $this->_searchlink($amount, $startpos, 'prev', $linktext);
+               else
+                       $this->_archivelink($archiveprev, $linktext);
        }
 
-       function parse_loginform() {
-               global $member, $CONF;
-               if (!$member->isLoggedIn()) {
-                       $filename = 'loginform-notloggedin';
-                       $this->formdata = array();
-               } else {
-                       $filename = 'loginform-loggedin';
-                       $this->formdata = array(
-                               'membername' => $member->getDisplayName(),
-                       );
-               }
-               $this->doForm($filename);
+       /**
+        * Parse skinvar query
+        * (includes the search query)   
+        */     
+       function parse_query() {
+               global $query;
+               echo htmlspecialchars($query,ENT_QUOTES);
        }
 
-
-       function parse_membermailform($rows = 10, $cols = 40, $desturl = '') {
-               global $member, $CONF, $memberid;
-
-               if ($desturl == '') {
-                       if ($CONF['URLMode'] == 'pathinfo')
-                               $desturl = createMemberLink($memberid);
-                       else
-                               $desturl = $CONF['IndexURL'] . createMemberLink($memberid);
-               }
-
-               $message = postVar('message');
-               $frommail = postVar('frommail');
-
-               $this->formdata = array(
-                       'url' => htmlspecialchars($desturl),
-                       'actionurl' => htmlspecialchars($CONF['ActionURL']),
-                       'memberid' => $memberid,
-                       'rows' => $rows,
-                       'cols' => $cols,
-                       'message' => htmlspecialchars($message),
-                       'frommail' => htmlspecialchars($frommail)
-               );
-               if ($member->isLoggedIn()) {
-                       $this->doForm('membermailform-loggedin');
-               } else if ($CONF['NonmemberMail']) {
-                       $this->doForm('membermailform-notloggedin');
-               } else {
-                       $this->doForm('membermailform-disallowed');
-               }
-
+       /**
+        * Parse skinvar referer
+        */
+       function parse_referer() {
+               echo htmlspecialchars(serverVar('HTTP_REFERER'),ENT_QUOTES);
        }
 
+       /**
+        * Parse skinvar searchform
+        */
        function parse_searchform($blogname = '') {
                global $CONF, $manager, $maxresults;
                if ($blogname) {
@@ -1029,68 +1195,113 @@ class ACTIONS extends BaseActions {
                // use default blog when no blog is selected
                $this->formdata = array(
                        'id' => $blog?$blog->getID():$CONF['DefaultBlog'],
-                       'query' => htmlspecialchars(getVar('query')),
+                       'query' => htmlspecialchars(getVar('query'),ENT_QUOTES),
                );
                $this->doForm('searchform');
        }
 
-       function parse_nucleusbutton($imgurl = '',
-                                                                $imgwidth = '85',
-                                                                $imgheight = '31') {
-               global $CONF;
-               if ($imgurl == '') {
-                       $imgurl = $CONF['AdminURL'] . 'nucleus.gif';
-               } else if (PARSER::getProperty('IncludeMode') == 'skindir'){
-                       // when skindit IncludeMode is used: start from skindir
-                       $imgurl = $CONF['SkinsURL'] . PARSER::getProperty('IncludePrefix') . $imgurl;
-               }
+       /**
+        * Parse skinvar searchresults
+        */     
+       function parse_searchresults($template, $maxresults = 50 ) {
+               global $blog, $query, $amount, $startpos;
 
-               $this->formdata = array(
-                       'imgurl' => $imgurl,
-                       'imgwidth' => $imgwidth,
-                       'imgheight' => $imgheight,
-               );
-               $this->doForm('nucleusbutton');
+               $this->_setBlogCategory($blog, '');     // need this to select default category
+               $this->_preBlogContent('searchresults',$blog);
+               $this->amountfound = $blog->search($query, $template, $amount, $maxresults, $startpos);
+               $this->_postBlogContent('searchresults',$blog);
        }
 
+       /**
+        * Parse skinvar self
+        */
        function parse_self() {
                global $CONF;
                echo $CONF['Self'];
        }
 
-       function parse_referer() {
-               echo htmlspecialchars(serverVar('HTTP_REFERER'));
+       /**
+        * Parse skinvar sitevar
+        * (include a sitevar)   
+        */
+       function parse_sitevar($which) {
+               global $CONF;
+               switch($which) {
+                       case 'url':
+                               echo $CONF['IndexURL'];
+                               break;
+                       case 'name':
+                               echo $CONF['SiteName'];
+                               break;
+                       case 'admin':
+                               echo $CONF['AdminEmail'];
+                               break;
+                       case 'adminurl':
+                               echo $CONF['AdminURL'];
+               }
        }
 
-       function parse_charset() {
-               echo _CHARSET;
+       /**
+        * Parse skinname
+        */
+       function parse_skinname() {
+               echo $this->skin->getName();
        }
 
        /**
-         * Helper function that sets the category that a blog will need to use
-         *
-         * @param $blog
-         *             An object of the blog class, passed by reference (we want to make changes to it)
-         * @param $catname
-         *             The name of the category to use
-         */
-       function _setBlogCategory(&$blog, $catname) {
-               global $catid;
-               if ($catname != '')
-                       $blog->setSelectedCategoryByName($catname);
-               else
-                       $blog->setSelectedCategory($catid);
+        * Parse skintype (experimental)
+        */
+       function parse_skintype() {
+               echo $this->skintype;
        }
 
-       function _preBlogContent($type, &$blog) {
-               global $manager;
-               $manager->notify('PreBlogContent',array('blog' => &$blog, 'type' => $type));
+       /**
+        * Parse text
+        */
+       function parse_text($which) {
+               // constant($which) only available from 4.0.4 :(
+               if (defined($which)) {
+                       eval("echo $which;");
+               }
        }
 
-       function _postBlogContent($type, &$blog) {
+       /**
+        * Parse ticket
+        */
+       function parse_ticket() {
                global $manager;
-               $manager->notify('PostBlogContent',array('blog' => &$blog, 'type' => $type));
+               $manager->addTicketHidden();
+       }
+
+       /**
+        *      Parse skinvar todaylink
+        *      A link to the today page (depending on selected blog, etc...)
+        */     
+       function parse_todaylink($linktext = '') {
+               global $blog, $CONF;
+               if ($blog)
+                       echo $this->_link(createBlogidLink($blog->getID(),$this->linkparams), $linktext);
+               else
+                       echo $this->_link($CONF['SiteUrl'], $linktext);
+       }
+
+       /**
+        * Parse vars
+        * When commentform is not used, to include a hidden field with itemid   
+        */
+       function parse_vars() {
+               global $itemid;
+               echo '<input type="hidden" name="itemid" value="'.$itemid.'" />';
+       }
+
+       /**
+        * Parse skinvar version
+        * (include nucleus versionnumber)       
+        */
+       function parse_version() {
+               global $nucleus;
+               echo 'Nucleus CMS ' . $nucleus['version'];
        }
 
 }
-?>
+?>
\ No newline at end of file