Add digit transformation function Language::formatNum() for Arabic and other
[lhc/web/wiklou.git] / includes / Skin.php
index 7f68821..bbdeaad 100644 (file)
@@ -1,4 +1,4 @@
-<?
+<?php
 # See skin.doc
 
 # These are the INTERNAL names, which get mapped
@@ -6,26 +6,54 @@
 # Language class has internationalized names
 #
 /* private */ $wgValidSkinNames = array(
-       "Standard", "Nostalgia", "CologneBlue"
+       "Standard", "Nostalgia", "CologneBlue" #, "Smarty", "Montparnasse"
 );
 
-class RecentChangesClass {
-       var $secureName , $displayName , $link , $namespace ;
-       var $oldid , $diffid , $timestamp , $curlink , $lastlink , $usertalklink , $versionlink ;
-       var $usercomment , $userlink ;
-       var $isminor , $isnew , $watched , $islog ;
-       } ;
+include_once( "RecentChange.php" );
+
+# For some odd PHP bug, this function can't be part of a class
+function getCategories ()
+{
+  global $wgOut , $wgTitle , $wgUseCategoryMagic , $wgUser , $wgParser ;
+  if ( !isset ( $wgUseCategoryMagic ) || !$wgUseCategoryMagic ) return "" ;
+  if ( count ( $wgParser->mCategoryLinks ) == 0 ) return "" ;
+  if ( !$wgOut->isArticle() ) return "" ;
+  $sk = $wgUser->getSkin() ;
+  $s = "" ;
+  $s .=  "\n<br>\n";
+  $s .= $sk->makeKnownLink ( "Special:Categories" , "Categories" , "article=".$wgTitle->getDBkey() ) ;
+  $t = implode ( " | " , $wgParser->mCategoryLinks ) ;
+  if ( $t != "" ) $s .= " : " ;
+  $s .= $t ;
+  return $s ;
+}
+
+class RCCacheEntry extends RecentChange
+{
+       var $secureName, $link;
+       var $curlink , $lastlink , $usertalklink , $versionlink ;
+       var $userlink, $timestamp, $watched;
+
+       function newFromParent( $rc )
+       {
+               $rc2 = new RCCacheEntry;
+               $rc2->mAttribs = $rc->mAttribs;
+               $rc2->mExtra = $rc->mExtra;
+               return $rc2;
+       }
+} ;
 
 class Skin {
 
        /* private */ var $lastdate, $lastline;
-
+       var $linktrail ; # linktrail regexp
        var $rc_cache ; # Cache for Enhanced Recent Changes
-       var $rccc ; # Recent Changes Cache Counter for visibility toggle
-
+       var $rcCacheIndex ; # Recent Changes Cache Counter for visibility toggle
+       var $rcMoveIndex;
 
        function Skin()
        {
+               $this->linktrail = wfMsg("linktrail");
        }
 
        function getSkinNames()
@@ -43,22 +71,50 @@ class Skin {
        {
                global $wgOut, $wgUser;
 
-               if ( $wgOut->isQuickbarSupressed() ) { return 0; }
+               if ( $wgOut->isQuickbarSuppressed() ) { return 0; }
                $q = $wgUser->getOption( "quickbar" );
                if ( "" == $q ) { $q = 0; }
                return $q;
        }
 
-       function initPage()
+       function initPage( &$out )
        {
-               global $wgOut, $wgStyleSheetPath;
-               wfProfileIn( "Skin::initPage" );
+               global $wgStyleSheetPath;
+               $fname = "Skin::initPage";
+               wfProfileIn( $fname );
+               
+               $out->addLink( "shortcut icon", "", "/favicon.ico" );
+               
+               wfProfileOut( $fname );
+       }
+       
+       function outputPage( &$out ) {
+               global $wgDebugComments;
+               
+               wfProfileIn( "Skin::outputPage" );
+               $this->initPage( $out );
+               $out->out( $out->headElement() );
+
+               $out->out( "\n<body" );
+               $ops = $this->getBodyOptions();
+               foreach ( $ops as $name => $val ) {
+                       $out->out( " $name='$val'" );
+               }
+               $out->out( ">\n" );
+               if ( $wgDebugComments ) {
+                       $out->out( "<!-- Wiki debugging output:\n" .
+                         $out->mDebugtext . "-->\n" );
+               }
+               $out->out( $this->beforeContent() );
+
+               $out->out( $out->mBodytext );
 
-               $wgOut->addLink( "shortcut icon", "", "/favicon.ico" );
-               if ( $wgOut->isPrintable() ) { $ss = "wikiprintable.css"; }
-               else { $ss = $this->getStylesheet(); }
-               $wgOut->addLink( "stylesheet", "", "{$wgStyleSheetPath}/{$ss}" );
-               wfProfileOut();
+               $out->out( $this->afterContent() );
+               
+               wfProfileClose();
+               $out->out( $out->reportTime() );
+
+               $out->out( "\n</body></html>" );
        }
 
        function getHeadScripts() {
@@ -69,8 +125,17 @@ class Skin {
 
        function getUserStyles()
        {
-               $s = "<style type='text/css' media='screen'><!--\n";
+               global $wgOut, $wgStyleSheetPath;
+               if( $wgOut->isPrintable() ) {
+                       $sheet = "wikiprintable.css";
+               } else {
+                       $sheet = $this->getStylesheet();
+               }
+               $s = "<style type='text/css'><!--\n";
+               $s .= "@import url(\"$wgStyleSheetPath/$sheet\");\n";
+               $s .= "/*/*/\n"; # <-- Hide the styles from Netscape 4 without hiding them from IE/Mac
                $s .= $this->doGetUserStyles();
+               $s .= "/* */\n";
                $s .= "//--></style>\n";
                return $s;
        }
@@ -83,6 +148,7 @@ class Skin {
                if ( 1 == $wgUser->getOption( "underline" ) ) {
                        # Don't override browser settings
                } else {
+                       # CHECK MERGE @@@
                        # Force no underline
                        $s .= "a.stub, a.new, a.internal, a.external { " .
                          "text-decoration: none; }\n";
@@ -101,7 +167,7 @@ class Skin {
                global $wgUser, $wgTitle, $wgNamespaceBackgrounds, $wgOut, $oldid, $redirect, $diff,$action;
 
                if ( 0 != $wgTitle->getNamespace() ) {
-                       $a = array( "bgcolor" => "#FFFFDD" );
+                       $a = array( "bgcolor" => "#ffffec" );
                }
                else $a = array( "bgcolor" => "#FFFFFF" );
                if($wgOut->isArticle() && $wgUser->getOption("editondblclick")
@@ -109,21 +175,18 @@ class Skin {
                        (!$wgTitle->isProtected() || $wgUser->isSysop())
                        
                        ) {
-                       $n = $wgTitle->getPrefixedURL();
                        $t = wfMsg( "editthispage" );
                        $oid = $red = "";
                        if ( $redirect ) { $red = "&redirect={$redirect}"; }
                        if ( $oldid && ! isset( $diff ) ) {
                                $oid = "&oldid={$oldid}";
                        }
-                       $s = wfLocalUrlE($n,"action=edit{$oid}{$red}");
+                       $s = $wgTitle->getUrl( "action=edit{$oid}{$red}", false, true );
                        $s = "document.location = \"" .$s ."\";";
                        $a += array ("ondblclick" => $s);
 
                }
-               if($action=="edit") { # set focus in edit box
-                       $a += array("onLoad"=>"document.editform.wpTextbox1.focus()");  
-               }
+               $a['onload'] = $wgOut->getOnloadHandler();
                return $a;
        }
 
@@ -153,17 +216,42 @@ class Skin {
                $link = str_replace( "_", " ", $link );
                $link = wfEscapeHTML( $link );
 
-               if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
-                else if ( $broken == "stub" ) { $r = " class='stub'"; }
-               else if ( $broken == "yes" ) { $r = " class='new'"; }
-               else { $r = " class='internal'"; }
+               if ( $wgOut->isPrintable() ) { 
+                       $r = " class='printable'"; 
+               } else if ( $broken == "stub" ) { 
+                       $r = " class='stub'"; 
+               } else if ( $broken == "yes" ) { 
+                       $r = " class='new'"; 
+               } else { 
+                       $r = " class='internal'"; 
+               }
 
                if ( 1 == $wgUser->getOption( "hover" ) ) {
                        $r .= " title=\"{$link}\"";
                }
                return $r;
        }
+       
+       function getInternalLinkAttributesObj( &$nt, $text, $broken = false )
+       {
+               global $wgUser, $wgOut;
 
+               if ( $wgOut->isPrintable() ) { 
+                       $r = " class='printable'"; 
+               } else if ( $broken == "stub" ) { 
+                       $r = " class='stub'"; 
+               } else if ( $broken == "yes" ) { 
+                       $r = " class='new'"; 
+               } else { 
+                       $r = " class='internal'"; 
+               }
+
+               if ( 1 == $wgUser->getOption( "hover" ) ) {
+                       $r .= ' title ="' . $nt->getEscapedText() . '"';
+               }
+               return $r;
+       }               
+       
        function getLogo()
        {
                global $wgLogo;
@@ -175,20 +263,26 @@ class Skin {
        #
        function beforeContent()
        {
-               global $wgUser, $wgOut;
+               global $wgUser, $wgOut, $wgSiteNotice;
 
                if ( $wgOut->isPrintable() ) {
                        $s = $this->pageTitle() . $this->pageSubtitle() . "\n";
                        $s .= "\n<div class='bodytext'>";
                        return $s;
                }
-               return $this->doBeforeContent();
+               if( $wgSiteNotice ) {
+                       $note = "\n<div id='notice' style='font-weight: bold; color: red; text-align: center'>$wgSiteNotice</div>\n";
+               } else {
+                       $note = "";
+               }
+               return $this->doBeforeContent() . $note;
        }
 
        function doBeforeContent()
        {
-               global $wgUser, $wgOut, $wgTitle;
-               wfProfileIn( "Skin::doBeforeContent" );
+               global $wgUser, $wgOut, $wgTitle, $wgLang;
+               $fname = "Skin::doBeforeContent";
+               wfProfileIn( $fname );
 
                $s = "";
                $qb = $this->qbSetting();
@@ -205,18 +299,24 @@ class Skin {
                $s .= "\n<div id='content'>\n<div id='topbar'>" .
                  "<table width='98%' border=0 cellspacing=0><tr>";
 
-               if ( 0 == $qb ) {
+               $shove = ($qb != 0);
+               $left = ($qb == 1 || $qb == 3);
+               if($wgLang->isRTL()) $left = !$left;
+               
+               if ( !$shove ) {
                        $s .= "<td class='top' align=left valign=top rowspan='{$rows}'>" .
                          $this->logoText() . "</td>";
-               } else if ( 1 == $qb || 3 == $qb ) { # Left
+               } elseif( $left ) {
                        $s .= $this->getQuickbarCompensator( $rows );
                }
-               $s .= "<td {$borderhack} align=left valign=top>";
+               $l = $wgLang->isRTL() ? "right" : "left";
+               $s .= "<td {$borderhack} align='$l' valign='top'>";
 
                $s .= $this->topLinks() ;
                $s .= "<p class='subtitle'>" . $this->pageTitleLinks();
 
-               $s .= "</td>\n<td {$borderhack} valign=top align=right nowrap>";
+               $r = $wgLang->isRTL() ? "left" : "right";
+               $s .= "</td>\n<td {$borderhack} valign='top' align='$r' nowrap>";
                $s .= $this->nameAndLogin();
                $s .= "\n<br>" . $this->searchForm() . "</td>";
 
@@ -224,15 +324,17 @@ class Skin {
                        $s .= "</tr>\n<tr><td class='top' colspan=\"2\">$langlinks</td>";
                }
 
-               if ( 2 == $qb ) { # Right
+               if ( $shove && !$left ) { # Right
                        $s .= $this->getQuickbarCompensator( $rows );
                }
                $s .= "</tr></table>\n</div>\n";
                $s .= "\n<div id='article'>";
 
                $s .= $this->pageTitle();
-               $s .= $this->pageSubtitle() . "\n<p>";
-               wfProfileOut();
+               $s .= $this->pageSubtitle() ;
+               $s .= getCategories(); // For some odd reason, zhis can't be a function of the object
+               $s .= "\n<p>";
+               wfProfileOut( $fname );
                return $s;
        }
 
@@ -245,20 +347,22 @@ class Skin {
        #
        function afterContent()
        {
-               global $wgUser, $wgOut, $wgServer, $HTTP_SERVER_VARS;
-
+               global $wgUser, $wgOut, $wgServer;
+               global $wgTitle, $wgLang;
+               
                if ( $wgOut->isPrintable() ) {
                        $s = "\n</div>\n";
 
-                       $u = $wgServer . $HTTP_SERVER_VARS['REQUEST_URI'];
-                       $u = preg_replace( "/[?&]printable=yes/", "", $u );
-                       $rf = str_replace( "$1", $u, wfMsg( "retrievedfrom" ) );
+                       $u = htmlspecialchars( $wgServer . $wgTitle->getFullURL() );
+                       $u = "<a href=\"$u\">$u</a>";
+                       $rf = wfMsg( "retrievedfrom", $u );
 
                        if ( $wgOut->isArticle() ) {
                                $lm = "<br>" . $this->lastModified();
                        } else { $lm = ""; }
 
-                       $s .= "<p><em>{$rf}{$lm}</em>\n";
+                       $cr = wfMsg( "gnunote" );
+                       $s .= "<p>" . $wgLang->emphasize("{$rf}{$lm} {$cr}\n");
                        return $s;
                }
                return $this->doAfterContent();
@@ -266,19 +370,30 @@ class Skin {
 
        function doAfterContent()
        {
-               global $wgUser, $wgOut;
-               wfProfileIn( "Skin::doAfterContent" );
+               global $wgUser, $wgOut, $wgLang;
+               $fname =  "Skin::doAfterContent";
+               wfProfileIn( $fname );
+               wfProfileIn( "$fname-1" );
 
                $s = "\n</div><br clear=all>\n";
-
                $s .= "\n<div id='footer'>";
                $s .= "<table width='98%' border=0 cellspacing=0><tr>";
+               
+               wfProfileOut( "$fname-1" );
+               wfProfileIn( "$fname-2" );
 
                $qb = $this->qbSetting();
-               if ( 1 == $qb || 3 == $qb ) { # Left
+               $shove = ($qb != 0);
+               $left = ($qb == 1 || $qb == 3);
+               if($wgLang->isRTL()) $left = !$left;
+
+               if ( $shove && $left ) { # Left
                        $s .= $this->getQuickbarCompensator();
                }
-               $s .= "<td class='bottom' align=left valign=top>";
+               wfProfileOut( "$fname-2" );
+               wfProfileIn( "$fname-3" );
+               $l = $wgLang->isRTL() ? "right" : "left";
+               $s .= "<td class='bottom' align='$l' valign='top'>";
 
                $s .= $this->bottomLinks();
                $s .= "\n<br>" . $this->mainPageLink()
@@ -288,48 +403,70 @@ class Skin {
                  . "<br>" . $this->pageStats();
 
                $s .= "</td>";
-               if ( 2 == $qb ) { # Right
+               if ( $shove && !$left ) { # Right
                        $s .= $this->getQuickbarCompensator();
                }
                $s .= "</tr></table>\n</div>\n</div>\n";
-
+               
+               wfProfileOut( "$fname-3" );
+               wfProfileIn( "$fname-4" );
                if ( 0 != $qb ) { $s .= $this->quickBar(); }
-               wfProfileOut();
+               wfProfileOut( "$fname-4" );
+               wfProfileOut( $fname );
                return $s;
        }
 
        function pageTitleLinks()
        {
-               global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang;
+               global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang, $wgUseApproval ;
 
                $s = $this->printableLink();
+               if ( wfMsg ( "disclaimers" ) != "-" ) $s .= " | " . $this->makeKnownLink( wfMsg( "disclaimerpage" ), wfMsg( "disclaimers" ) ) ;
 
-               if ( $wgOut->isArticle() ) {
+               if ( $wgOut->isArticleRelated() ) {
                        if ( $wgTitle->getNamespace() == Namespace::getImage() ) {
                                $name = $wgTitle->getDBkey();
                                $link = wfEscapeHTML( wfImageUrl( $name ) );
                                $style = $this->getInternalLinkAttributes( $link, $name );
                                $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
                        }
+                       # This will show the "Approve" link if $wgUseApproval=true;
+                       if ( isset ( $wgUseApproval ) && $wgUseApproval )
+                       {
+                               $t = $wgTitle->getDBkey();
+                               $name = "Approve this article" ; 
+                               $link = "http://test.wikipedia.org/w/magnus/wiki.phtml?title={$t}&action=submit&doit=1" ;
+                               #wfEscapeHTML( wfImageUrl( $name ) );
+                               $style = $this->getExternalLinkAttributes( $link, $name );
+                               $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>" ;
+                       }               
                }
                if ( "history" == $action || isset( $diff ) || isset( $oldid ) ) {
                        $s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(),
-                         wfMsg( "currentrev" ) );
+                                       wfMsg( "currentrev" ) );
                }
 
                if ( $wgUser->getNewtalk() ) {
-                       # do not show "You have new messages" text when we are viewing our 
-                       # own talk page 
-                       
+               # do not show "You have new messages" text when we are viewing our 
+               # own talk page 
+
                        if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 &&
-                            $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) {
+                                               $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) {
                                $n =$wgUser->getName();
                                $tl = $this->makeKnownLink( $wgLang->getNsText(
-                               Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
-                               wfMsg("newmessageslink") );
-                               $s.=" | <strong>". str_replace( "$1", $tl, wfMsg("newmessages") ) . "</strong>";
+                                                       Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
+                                               wfMsg("newmessageslink") );
+                               $s.=" | <strong>". wfMsg( "newmessages", $tl ) . "</strong>";
                        }
                }
+               if( $wgUser->isSysop() &&
+                               (($wgTitle->getArticleId() == 0) || ($action == "history")) &&
+                               ($n = $wgTitle->isDeleted() ) ) {
+                       $s .= " | " . wfMsg( "thisisdeleted",
+                                       $this->makeKnownLink(
+                                               $wgLang->SpecialPage( "Undelete/" . $wgTitle->getPrefixedDBkey() ),
+                                               wfMsg( "restorelink", $n ) ) );
+               }
                return $s;
        }
 
@@ -337,9 +474,13 @@ class Skin {
        {
                global $wgOut, $wgTitle, $oldid, $action;
 
-               if ( "history" == $action ) { $q = "action=history&"; }
-               else { $q = ""; }
-
+               $q = "";
+               foreach( $_GET as $var => $val ) {
+                       if( $var != "title" && $var != "printable" )
+                               $q .= urlencode( $var ) . "=" . urlencode( $val );
+               }
+               if( !empty( $q ) ) $q .= "&";
+               
                $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
                  WfMsg( "printableversion" ), "{$q}printable=yes" );
                return $s;
@@ -347,9 +488,10 @@ class Skin {
 
        function pageTitle()
        {
-               global $wgOut, $wgTitle;
+               global $wgOut, $wgTitle, $wgUser;
 
                $s = "<h1 class='pagetitle'>" . $wgOut->getPageTitle() . "</h1>";
+               if($wgUser->getOption("editsectiononrightclick") && $wgTitle->userCanEdit()) { $s=$this->editSectionScript(0,$s);}
                return $s;
        }
 
@@ -358,21 +500,24 @@ class Skin {
                global $wgOut,$wgTitle,$wgNamespacesWithSubpages;
 
                $sub = $wgOut->getSubtitle();
-               if ( "" == $sub ) { $sub = wfMsg( "fromwikipedia" ); }
+               if ( "" == $sub ) {
+                       global $wgExtraSubtitle;
+                       $sub = wfMsg( "fromwikipedia" ) . $wgExtraSubtitle;
+               }
                if($wgOut->isArticle() && $wgNamespacesWithSubpages[$wgTitle->getNamespace()]) {
-                       $ptext=$wgTitle->getPrefixedText();                     
-                       if(preg_match("/\//",$ptext)) {                         
-                               $sub.="</p><p class='subpages'>";       
+                       $ptext=$wgTitle->getPrefixedText();
+                       if(preg_match("/\//",$ptext)) {
+                               $sub.="</p><p class='subpages'>";
                                $links=explode("/",$ptext);
                                $c=0;
                                $growinglink="";
                                foreach($links as $link) {
                                        $c++;
-                                       if ($c<count($links)) {                                         
-                                               $growinglink.=$link;
-                                               $getlink=$this->makeLink($growinglink,$link);                                           
+                                       if ($c<count($links)) {
+                                               $growinglink .= $link;
+                                               $getlink = $this->makeLink( $growinglink, $link );
                                                if(preg_match("/class='new'/i",$getlink)) { break; } # this is a hack, but it saves time
-                                               if ($c>1) { 
+                                               if ($c>1) {
                                                        $sub .= " | ";
                                                } else  {
                                                        $sub .="&lt; ";
@@ -384,23 +529,23 @@ class Skin {
                                }
                        }
                }
-               $s = "<p class='subtitle'>{$sub}\n";            
+               $s = "<p class='subtitle'>{$sub}\n";
                return $s;
        }
 
        function nameAndLogin()
        {
-               global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader;
+               global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader, $wgIP;
 
                $li = $wgLang->specialPage( "Userlogin" );
                $lo = $wgLang->specialPage( "Userlogout" );
 
                $s = "";
                if ( 0 == $wgUser->getID() ) {
-                       if( $wgShowIPinHeader ) {
-                               $n = getenv( "REMOTE_ADDR" );
+                       if( $wgShowIPinHeader && isset(  $_COOKIE[ini_get("session.name")] ) ) {
+                               $n = $wgIP;
 
-                               $tl = $this->makeKnownLink( $wgLang->getNsText(
+                               $tl = $this->makeKnownLink( $wgLang->getNsText(
                                  Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
                                  $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
                          
@@ -441,12 +586,12 @@ class Skin {
        {
                global $search;
 
-               $s = "<form name='search' class='inline' method=get action=\""
+               $s = "<form name='search' class='inline' method=post action=\""
                  . wfLocalUrl( "" ) . "\">"
                  . "<input type=text name=\"search\" size=19 value=\""
                  . htmlspecialchars(substr($search,0,256)) . "\">\n"
                  . "<input type=submit name=\"go\" value=\"" . wfMsg ("go") . "\">&nbsp;"
-                 . "<input type=submit value=\"" . wfMsg ("search") . "\"></form>";
+                 . "<input type=submit name=\"fulltext\" value=\"" . wfMsg ("search") . "\"></form>";
 
                return $s;
        }
@@ -459,11 +604,12 @@ class Skin {
                $s = $this->mainPageLink() . $sep
                  . $this->specialLink( "recentchanges" );
 
-               if ( $wgOut->isArticle() ) {
+               if ( $wgOut->isArticleRelated() ) {
                        $s .=  $sep . $this->editThisPage()
                          . $sep . $this->historyLink();
                }
-               $s .= $sep . $this->specialPagesList();
+               # Many people don't like this dropdown box
+               #$s .= $sep . $this->specialPagesList();
 
                return $s;
        }
@@ -474,7 +620,7 @@ class Skin {
                $sep = " |\n";
 
                $s = "";
-               if ( $wgOut->isArticle() ) {
+               if ( $wgOut->isArticleRelated() ) {
                        $s .= "<strong>" . $this->editThisPage() . "</strong>";
                        if ( 0 != $wgUser->getID() ) {
                                $s .= $sep . $this->watchThisPage();
@@ -522,8 +668,8 @@ class Skin {
                if ( $wgDisableCounters ) {
                        $s = "";
                } else {
-                       $count = $wgArticle->getCount();
-                       $s = str_replace( "$1", $count, wfMsg( "viewcount" ) );
+                       $count = $wgLang->formatNum( $wgArticle->getCount() );
+                       $s = wfMsg( "viewcount", $count );
                }
                $s .= $this->lastModified();
                $s .= " " . wfMsg( "gnunote" );
@@ -535,7 +681,7 @@ class Skin {
                global $wgLang, $wgArticle;
 
                $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true );
-               $s = " " . str_replace( "$1", $d, wfMsg( "lastmodified" ) );
+               $s = " " . wfMsg( "lastmodified", $d );
                return $s;
        }
 
@@ -543,9 +689,11 @@ class Skin {
        {
                if ( "" != $align ) { $a = " align='{$align}'"; }
                else { $a = ""; }
-
+               
                $mp = wfMsg( "mainpage" );
-               $s = "<a href=\"" . wfLocalUrlE( $mp ) . "\"><img{$a} border=0 src=\""
+               $titleObj = Title::newFromText( $mp );
+               $s = "<a href=\"" . $titleObj->getURL( "", true )
+                 . "\"><img{$a} border=0 src=\""
                  . $this->getLogo() . "\" alt=\"" . "[{$mp}]\"></a>";
                return $s;
        }
@@ -553,11 +701,15 @@ class Skin {
        function quickBar()
        {
                global $wgOut, $wgTitle, $wgUser, $action, $wgLang;
-               global $wpPreview;
-               wfProfileIn( "Skin::quickBar" );
+               global $wpPreview, $wgDisableUploads, $wgRemoteUploads;
+           
+               $fname =  "Skin::quickBar";
+               wfProfileIn( $fname );
+
+               $tns=$wgTitle->getNamespace();
 
                $s = "\n<div id='quickbar'>";
-               $s .= "\n" . $this->logoText() . "\n<hr>";
+               $s .= "\n" . $this->logoText() . "\n<hr class='sep'>";
 
                $sep = "\n<br>";
                $s .= $this->mainPageLink()
@@ -570,17 +722,14 @@ class Skin {
                
                }
                // only show watchlist link if logged in
-                if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
-                $s .= "\n<hr>";
+               if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
+               $s .= "\n<br><hr class='sep'>";
                $articleExists = $wgTitle->getArticleId();
-               if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) {
-                                               
+               if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) {                            
                        if($wgOut->isArticle()) {
                                $s .= "<strong>" . $this->editThisPage() . "</strong>";
                        } else { # backlink to the article in edit or history mode
-
                                if($articleExists){ # no backlink if no article
-                                       $tns=$wgTitle->getNamespace();          
                                        switch($tns) {
                                                case 0:
                                                $text = wfMsg("articlepage");
@@ -614,7 +763,8 @@ class Skin {
                                        if ($nstext = $wgLang->getNsText($tns) ) { # add namespace if necessary
                                                $link = $nstext . ":" . $link ;
                                        }                       
-                                       $s .= $this->makeLink($link, $text );                   
+
+                                       $s .= $this->makeLink( $link, $text );                  
                                } elseif( $wgTitle->getNamespace() != Namespace::getSpecial() ) {
                                        # we just throw in a "New page" text to tell the user that he's in edit mode,
                                        # and to avoid messing with the separator that is prepended to the next item
@@ -623,6 +773,11 @@ class Skin {
                        
                        }
                        
+
+                       if( $tns%2 && $action!="edit" && !$wpPreview) {
+                               $s.="<br>".$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("postcomment"),"action=edit&section=new");
+                       }
+
                        /*
                        watching could cause problems in edit mode:
                        if user edits article, then loads "watch this article" in background and then saves
@@ -630,20 +785,24 @@ class Skin {
                        unwatched. Therefore we do not show the "Watch this page" link in edit mode
                        */                      
                        if ( 0 != $wgUser->getID() && $articleExists) {
-                               if($action!="edit" && $action!="history" &&
-                                   $action != "submit" ) 
-                               {$s .= $sep . $this->watchThisPage(); }
-                               if ( $wgTitle->userCanEdit() ) $s .= $sep . $this->moveThisPage();
+                               if($action!="edit" && $action != "submit" ) 
+                               {
+                                       $s .= $sep . $this->watchThisPage(); 
+                               }
+                               if ( $wgTitle->userCanEdit() ) 
+                                       $s .= $sep . $this->moveThisPage();
                        }
                        if ( $wgUser->isSysop() and $articleExists ) {
                                $s .= $sep . $this->deleteThisPage() .
                                $sep . $this->protectThisPage();
                        }
                        $s .= $sep . $this->talkLink();
-                       if ($articleExists && $action !="history") { $s .= $sep . $this->historyLink();}
+                       if ($articleExists && $action !="history") { 
+                               $s .= $sep . $this->historyLink();
+                       }
                        $s.=$sep . $this->whatLinksHere();
                        
-                       if($wgOut->isArticle()) {
+                       if($wgOut->isArticleRelated()) {
                                $s .= $sep . $this->watchPageLinksLink();
                        }
 
@@ -663,17 +822,23 @@ class Skin {
                                        }
                                }
                        }
-                       $s .= "\n<hr>";
+                       $s .= "\n<br><hr class='sep'>";
                } 
                
-               if ( 0 != $wgUser->getID() ) {
+               if ( 0 != $wgUser->getID() && ( !$wgDisableUploads || $wgRemoteUploads ) ) {
                        $s .= $this->specialLink( "upload" ) . $sep;
                }
                $s .= $this->specialLink( "specialpages" )
                  . $sep . $this->bugReportsLink();
-
-               $s .= "\n</div>\n";
-               wfProfileOut();
+               
+               global $wgSiteSupportPage;
+               if( $wgSiteSupportPage ) {
+                       $s .= "\n<br><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
+                         "\" class=\"internal\">" . wfMsg( "sitesupport" ) . "</a>";
+               }
+       
+               $s .= "\n<br></div>\n";
+               wfProfileOut( $fname );
                return $s;
        }
 
@@ -746,15 +911,28 @@ class Skin {
                return $s;
        }
 
+
+      function disclaimerLink()
+       {
+               $s = $this->makeKnownLink( wfMsg( "disclaimerpage" ),
+                 wfMsg( "disclaimers" ) );
+               return $s;
+       }
+
        function editThisPage()
        {
                global $wgOut, $wgTitle, $oldid, $redirect, $diff;
 
-               if ( ! $wgOut->isArticle() || $diff ) {
+               if ( ! $wgOut->isArticleRelated() ) {
                        $s = wfMsg( "protectedpage" );
-               } else if ( $wgTitle->userCanEdit() ) {
+               } else {
                        $n = $wgTitle->getPrefixedText();
-                       $t = wfMsg( "editthispage" );
+                       if ( $wgTitle->userCanEdit() ) {
+                               $t = wfMsg( "editthispage" );
+                       } else {
+                               #$t = wfMsg( "protectedpage" );
+                               $t = wfMsg( "viewsource" );
+                       }
                        $oid = $red = "";
 
                        if ( $redirect ) { $red = "&redirect={$redirect}"; }
@@ -762,8 +940,6 @@ class Skin {
                                $oid = "&oldid={$oldid}";
                        }
                        $s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" );
-               } else {
-                       $s = wfMsg( "protectedpage" );
                }
                return $s;
        }
@@ -778,7 +954,7 @@ class Skin {
 
                        $s = $this->makeKnownLink( $n, $t, "action=delete" );
                } else {
-                       $s = wfMsg( "error" );
+                       $s = "";
                }
                return $s;
        }
@@ -799,7 +975,7 @@ class Skin {
                        }
                        $s = $this->makeKnownLink( $n, $t, $q );
                } else {
-                       $s = wfMsg( "error" );
+                       $s = "";
                }
                return $s;
        }
@@ -808,7 +984,7 @@ class Skin {
        {
                global $wgUser, $wgOut, $wgTitle, $diff;
 
-               if ( $wgOut->isArticle() && ( ! $diff ) ) {
+               if ( $wgOut->isArticleRelated() ) {
                        $n = $wgTitle->getPrefixedText();
 
                        if ( $wgTitle->userIsWatching() ) {
@@ -859,7 +1035,7 @@ class Skin {
                global $wgTitle, $wgLang;
 
                $s = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
-                 wfMsg( "contributions" ), "target=" . $wgTitle->getURL() );
+                 wfMsg( "contributions" ), "target=" . $wgTitle->getPartialURL() );
                return $s;
        }
 
@@ -868,7 +1044,7 @@ class Skin {
                global $wgTitle, $wgLang;
 
                $s = $this->makeKnownLink( $wgLang->specialPage( "Emailuser" ),
-                 wfMsg( "emailuser" ), "target=" . $wgTitle->getURL() );
+                 wfMsg( "emailuser" ), "target=" . $wgTitle->getPartialURL() );
                return $s;
        }
 
@@ -876,7 +1052,7 @@ class Skin {
        {
                global $wgOut, $wgTitle, $wgLang;
 
-               if ( ! $wgOut->isArticle() ) {
+               if ( ! $wgOut->isArticleRelated() ) {
                        $s = "(" . wfMsg( "notanarticle" ) . ")";
                } else {
                        $s = $this->makeKnownLink( $wgLang->specialPage(
@@ -888,14 +1064,15 @@ class Skin {
 
        function otherLanguages()
        {
-               global $wgOut, $wgLang, $wgTitle , $wgUseNewInterlanguage ;
+               global $wgOut, $wgLang, $wgTitle, $wgUseNewInterlanguage;
 
                $a = $wgOut->getLanguageLinks();
+               # TEST THIS @@@
                if ( 0 == count( $a ) ) {
                        if ( !$wgUseNewInterlanguage ) return "";
                        $ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ;
                        if ( $ns != 0 AND $ns != 1 ) return "" ;
-                       $pn = "Intl" ;
+                       $pn = "Intl" ;
                        $x = "mode=addlink&xt=".$wgTitle->getDBkey() ;
                        return $this->makeKnownLink( $wgLang->specialPage( $pn ),
                                  wfMsg( "intl" ) , $x );
@@ -911,7 +1088,9 @@ class Skin {
                                  wfMsg( "otherlanguages" ) , $x ) . ": " ;
                        }
 
+               $s = wfMsg( "otherlanguages" ) . ": ";
                $first = true;
+               if($wgLang->isRTL()) $s .= "<span dir='LTR'>";
                foreach( $a as $l ) {
                        if ( ! $first ) { $s .= " | "; }
                        $first = false;
@@ -924,6 +1103,7 @@ class Skin {
                        $style = $this->getExternalLinkAttributes( $l, $text );
                        $s .= "<a href=\"{$url}\"{$style}>{$text}</a>";
                }
+               if($wgLang->isRTL()) $s .= "</span>";
                return $s;
        }
 
@@ -1006,23 +1186,88 @@ class Skin {
                return $s;
        }
 
+       function commentLink()
+       {
+               global $wgLang, $wgTitle, $wgLinkCache;
+
+               $tns = $wgTitle->getNamespace();
+               if ( -1 == $tns ) { return ""; }
+
+               $lns = ( Namespace::isTalk( $tns ) ) ? $tns : Namespace::getTalk( $tns );
+
+               # assert Namespace::isTalk( $lns )
+
+               $n = $wgLang->getNsText( $lns );
+               $pn = $wgTitle->getText();
+
+               $link = "{$n}:{$pn}";
+
+               $wgLinkCache->suspend();
+               $s = $this->makeKnownLink($link, wfMsg("postcomment"), "action=edit&section=new");
+               $wgLinkCache->resume();
+
+               return $s;
+       }
+
        # After all the page content is transformed into HTML, it makes
        # a final pass through here for things like table backgrounds.
        #
        function transformContent( $text )
-       {
+       {
                return $text;
        }
 
        # Note: This function MUST call getArticleID() on the link,
        # otherwise the cache won't get updated properly.  See LINKCACHE.DOC.
        #
-       function makeLink( $title, $text= "", $query = "", $trail = "" )
-       {
-               global $wgOut, $wgUser;
+       function makeLink( $title, $text = "", $query = "", $trail = "" ) {
+               wfProfileIn( "Skin::makeLink" );
+               $nt = Title::newFromText( $title );
+               if ($nt) {              
+                       $result = $this->makeLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+               } else {
+                       wfDebug( "Invalid title passed to Skin::makeLink(): \"$title\"\n" );
+                       $result = $text == "" ? $title : $text;
+               }       
+               
+               wfProfileOut( "Skin::makeLink" );
+               return $result;
+       }
 
+       function makeKnownLink( $title, $text = "", $query = "", $trail = "" ) {
                $nt = Title::newFromText( $title );
+               if ($nt) {              
+                       return $this->makeKnownLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+               } else {
+                       wfDebug( "Invalid title passed to Skin::makeKnownLink(): \"$title\"\n" );
+                       return $text == "" ? $title : $text;
+               }
+       }
 
+       function makeBrokenLink( $title, $text = "", $query = "", $trail = "" ) {
+               $nt = Title::newFromText( $title );
+               if ($nt) {              
+                       return $this->makeBrokenLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+               } else {
+                       wfDebug( "Invalid title passed to Skin::makeBrokenLink(): \"$title\"\n" );
+                       return $text == "" ? $title : $text;
+               }
+       }
+       
+       function makeStubLink( $title, $text = "", $query = "", $trail = "" ) {
+               $nt = Title::newFromText( $title );
+               if ($nt) {              
+                       return $this->makeStubLinkObj( Title::newFromText( $title ), $text, $query, $trail );
+               } else {
+                       wfDebug( "Invalid title passed to Skin::makeStubLink(): \"$title\"\n" );
+                       return $text == "" ? $title : $text;
+               }
+       }
+
+       # Pass a title object, not a title string
+       function makeLinkObj( &$nt, $text= "", $query = "", $trail = "", $prefix = "" )
+       {
+               global $wgOut, $wgUser;
                if ( $nt->isExternal() ) {
                        $u = $nt->getFullURL();
                        if ( "" == $text ) { $text = $nt->getPrefixedText(); }
@@ -1035,125 +1280,140 @@ class Skin {
                                        $trail = $m[2];
                                }
                        }
-                       return "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
-               }
-               if ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
-                       return $this->makeKnownLink( $title, $text, $query, $trail );
-               }
-               if ( ( -1 == $nt->getNamespace() ) ||
-          ( Namespace::getImage() == $nt->getNamespace() ) ) {
-                       return $this->makeKnownLink( $title, $text, $query, $trail );
-               }
-                $aid = $nt->getArticleID() ;
-                if ( 0 == $aid ) {
-                        return $this->makeBrokenLink( $title, $text, $query, $trail );
-                } else {
-                        $threshold = $wgUser->getOption("stubthreshold") ;
-                        if ( $threshold > 0 ) {
-                                $res = wfQuery ( "SELECT HIGH_PRIORITY length(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'" ) ;
-
-                                if ( wfNumRows( $res ) > 0 ) {
-                                        $s = wfFetchObject( $res );
-                                        $size = $s->x;
-                                        if ( $s->cur_is_redirect OR $s->cur_namespace != 0 )
-                                                $size = $threshold*2 ; # Really big
-                                        wfFreeResult( $res );
-                                } else $size = $threshold*2 ; # Really big
-                        } else $size = 1 ;
-
-                        if ( $size < $threshold )
-                                return $this->makeStubLink( $title, $text, $query, $trail );
-                        return $this->makeKnownLink( $title, $text, $query, $trail );
-                }
-        }
-
-       function makeKnownLink( $title, $text = "", $query = "", $trail = "" )
+                       $retVal = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
+               } elseif ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
+                       $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix );
+               } elseif ( ( -1 == $nt->getNamespace() ) ||
+                               ( Namespace::getImage() == $nt->getNamespace() ) ) {
+                       $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix );
+               } else {
+                       $aid = $nt->getArticleID() ;
+                       if ( 0 == $aid ) {
+                               $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail, $prefix );
+                       } else {
+                               $threshold = $wgUser->getOption("stubthreshold") ;
+                               if ( $threshold > 0 ) {
+                                       $res = wfQuery ( "SELECT LENGTH(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'", DB_READ ) ;
+
+                                       if ( wfNumRows( $res ) > 0 ) {
+                                               $s = wfFetchObject( $res );
+                                               $size = $s->x;
+                                               if ( $s->cur_is_redirect OR $s->cur_namespace != 0 ) {
+                                                       $size = $threshold*2 ; # Really big
+                                               }
+                                               wfFreeResult( $res );
+                                       } else {
+                                               $size = $threshold*2 ; # Really big
+                                       }
+                               } else {
+                                       $size = 1 ;
+                               }       
+                               if ( $size < $threshold ) {
+                                       $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail, $prefix );
+                               } else {
+                                       $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail, $prefix );
+                               }
+                       }
+               }
+               return $retVal;
+       }
+
+       # Pass a title object, not a title string
+       function makeKnownLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" )
        {
                global $wgOut, $wgTitle;
 
-               $nt = Title::newFromText( $title );
+               $fname = "Skin::makeKnownLinkObj";
+               wfProfileIn( $fname );
+
                $link = $nt->getPrefixedURL();
 
                if ( "" == $link ) {
                        $u = "";
                        if ( "" == $text ) { $text = $nt->getFragment(); }
                } else {
-                       $u = wfLocalUrlE( $link, $query );
+                       $u = $nt->getURL( $query, true );
                }
                if ( "" != $nt->getFragment() ) {
                        $u .= "#" . wfEscapeHTML( $nt->getFragment() );
                }
                if ( "" == $text ) { $text = $nt->getPrefixedText(); }
-               $style = $this->getInternalLinkAttributes( $link, $text );
+               $style = $this->getInternalLinkAttributesObj( $nt, $text );
 
                $inside = "";
                if ( "" != $trail ) {
-                       if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
+                       if ( preg_match( $this->linktrail, $trail, $m ) ) {
                                $inside = $m[1];
                                $trail = $m[2];
                        }
                }
-               $r = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
+               $r = "<a href=\"{$u}\"{$style}>{$prefix}{$text}{$inside}</a>{$trail}";
+               wfProfileOut( $fname );
                return $r;
        }
-
-       function makeBrokenLink( $title, $text = "", $query = "", $trail = "" )
+       
+       # Pass a title object, not a title string
+       function makeBrokenLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" )
        {
                global $wgOut, $wgUser;
+               
+               $fname = "Skin::makeBrokenLinkObj";
+               wfProfileIn( $fname );
 
-               $nt = Title::newFromText( $title );
                $link = $nt->getPrefixedURL();
 
                if ( "" == $query ) { $q = "action=edit"; }
                else { $q = "action=edit&{$query}"; }
-               $u = wfLocalUrlE( $link, $q );
+               $u = $nt->getURL( $q );
 
                if ( "" == $text ) { $text = $nt->getPrefixedText(); }
-               $style = $this->getInternalLinkAttributes( $link, $text, "yes" );
+               $style = $this->getInternalLinkAttributesObj( $nt, $text, "yes" );
 
                $inside = "";
                if ( "" != $trail ) {
-                       if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
+                       if ( preg_match( $this->linktrail, $trail, $m ) ) {
                                $inside = $m[1];
                                $trail = $m[2];
                        }
                }
                if ( $wgOut->isPrintable() ||
                  ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
-                       $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
+                       $s = "<a href=\"{$u}\"{$style}>{$prefix}{$text}{$inside}</a>{$trail}";
                } else {
-                       $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
+                       $s = "{$prefix}{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
                }
+
+               wfProfileOut( $fname );
                return $s;
        }
+       
+       # Pass a title object, not a title string
+       function makeStubLinkObj( &$nt, $text = "", $query = "", $trail = "", $prefix = "" )
+       {
+               global $wgOut, $wgUser;
 
-        function makeStubLink( $title, $text = "", $query = "", $trail = "" )
-        {
-                global $wgOut, $wgUser;
-
-                $nt = Title::newFromText( $title );
-                $link = $nt->getPrefixedURL();
+               $link = $nt->getPrefixedURL();
 
-                $u = wfLocalUrlE( $link, $query );
+               $u = $nt->getURL( $query, true );
 
-                if ( "" == $text ) { $text = $nt->getPrefixedText(); }
-                $style = $this->getInternalLinkAttributes( $link, $text, "stub" );
+               if ( "" == $text ) { $text = $nt->getPrefixedText(); }
+               $style = $this->getInternalLinkAttributesObj( $nt, $text, "stub" );
 
-                $inside = "";
-                if ( "" != $trail ) {
-                        if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
-                                $inside = $m[1];
-                                $trail = $m[2];
-                        }
-                }
-                if ( $wgOut->isPrintable() ||
-                  ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
-                        $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
-                } else {
-                        $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
-                }
-                return $s;
-        }
+               $inside = "";
+               if ( "" != $trail ) {
+                       if ( preg_match( $this->linktrail, $trail, $m ) ) {
+                               $inside = $m[1];
+                               $trail = $m[2];
+                       }
+               }
+               if ( $wgOut->isPrintable() ||
+                               ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
+                       $s = "<a href=\"{$u}\"{$style}>{$prefix}{$text}{$inside}</a>{$trail}";
+               } else {
+                       $s = "{$prefix}{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
+               }
+               return $s;
+       }
 
        function fnamePart( $url )
        {
@@ -1171,28 +1431,249 @@ class Skin {
                $s = "<img src=\"{$url}\" alt=\"{$alt}\">";
                return $s;
        }
+       
+       function makeImageLink( $name, $url, $alt = "" ) {
+               $nt = Title::makeTitle( Namespace::getImage(), $name );
+               return $this->makeImageLinkObj( $nt, $alt );
+       }
+
+       function makeImageLinkObj( $nt, $alt = "" ) {
+               global $wgLang, $wgUseImageResize;
+               $name  = $nt->getDBKey();
+               $url   = wfImageUrl( $name );
+               $align = "";
+               $prefix = $postfix = "";
+
+               if ( $wgUseImageResize ) {
+                       # Check if the alt text is of the form "options|alt text"
+                       # Options are:
+                       #  * thumbnail          make a thumbnail with enlarge-icon and caption, alignment depends on lang
+                       #  * left               no resizing, just left align. label is used for alt= only
+                       #  * right              same, but right aligned
+                       #  * none               same, but not aligned
+                       #  * ___px              scale to ___ pixels width, no aligning. e.g. use in taxobox
+       
+                       $part = explode( "|", $alt);
+       
+                       $mwThumb  =& MagicWord::get( MAG_IMG_THUMBNAIL );
+                       $mwLeft   =& MagicWord::get( MAG_IMG_LEFT );
+                       $mwRight  =& MagicWord::get( MAG_IMG_RIGHT );
+                       $mwNone   =& MagicWord::get( MAG_IMG_NONE );
+                       $mwWidth  =& MagicWord::get( MAG_IMG_WIDTH );
+                       $mwCenter =& MagicWord::get( MAG_IMG_CENTER );
+                       $alt = $part[count($part)-1];
+
+                       $thumb=false;
+
+                       foreach( $part as $key => $val ) {
+                               if ( ! is_null( $mwThumb->matchVariableStartToEnd($val) ) ) {
+                                       $thumb=true;
+                               } elseif ( ! is_null( $mwRight->matchVariableStartToEnd($val) ) ) {
+                                       # remember to set an alignment, don't render immediately
+                                       $align = "right";
+                               } elseif ( ! is_null( $mwLeft->matchVariableStartToEnd($val) ) ) {
+                                       # remember to set an alignment, don't render immediately
+                                       $align = "left";
+                               } elseif ( ! is_null( $mwCenter->matchVariableStartToEnd($val) ) ) {
+                                       # remember to set an alignment, don't render immediately
+                                       $align = "center";
+                               } elseif ( ! is_null( $mwNone->matchVariableStartToEnd($val) ) ) {
+                                       # remember to set an alignment, don't render immediately
+                                       $align = "none";
+                               } elseif ( ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) {
+                                       # $match is the image width in pixels
+                                       $width = intval($match);
+                               }
+                       }
+                       if ( "center" == $align )
+                       {
+                               $prefix  = "<center>";
+                               $postfix = "</center>";
+                               $align   = "none";
+                       }
+       
+                       if ( $thumb ) {
+       
+                               # Create a thumbnail. Alignment depends on language
+                               # writing direction, # right aligned for left-to-right-
+                               # languages ("Western languages"), left-aligned
+                               # for right-to-left-languages ("Semitic languages")
+                               #
+                               # If  thumbnail width has not been provided, it is set
+                               # here to 180 pixels
+                               if ( $align == "" ) {
+                                       $align = $wgLang->isRTL() ? "left" : "right";
+                               }
+                               if ( ! isset($width) ) {
+                                       $width = 180;
+                               }
+                               return $prefix.$this->makeThumbLinkObj( $nt, $alt, $align, $width ).$postfix;
+       
+                       } elseif ( isset($width) ) {
+                               
+                               # Create a resized image, without the additional thumbnail
+                               # features
+                               $url = $this->createThumb( $name, $width );
+                       }
+               } # endif $wgUseImageResize
+                       
+               if ( empty( $alt ) ) {
+                       $alt = preg_replace( '/\.(.+?)^/', '', $name );
+               }
+               $alt = htmlspecialchars( $alt );
 
-       function makeImageLink( $name, $url, $alt = "" )
-       {
-               global $wgOut, $wgTitle, $wgLang;
+               $u = $nt->getURL( "", true );
+               $s = "<a href=\"{$u}\" class='image' title=\"{$alt}\">" .
+                 "<img border=\"0\" src=\"{$url}\" alt=\"{$alt}\"></a>";
+               if ( "" != $align ) {
+                       $s = "<div class=\"float{$align}\">{$s}</div>";
+               }
+               return $prefix.$s.$postfix;
+       }
+
+       function createThumb( $name, $width ) {
+               global $wgUploadDirectory;
+               global $wgImageMagickConvertCommand;
+               global $wgUseImageMagick;
+               global $wgUseSquid, $wgInternalServer;
+               $imgPath   = wfImagePath( $name );
+               $thumbName = $width."px-".$icon.$name;
+               $thumbPath = wfImageThumbDir( $thumbName )."/".$thumbName;
+               $thumbUrl  = wfImageThumbUrl( $thumbName );
+
+               if (     (! file_exists( $thumbPath ) && file_exists( $imgPath )) 
+               ||  ( filemtime($thumbPath) < filemtime($imgPath) ) ) {
+                       # Squid purging
+                       if ( $wgUseSquid ) {
+                               $urlArr = Array(
+                                       $wgInternalServer.$thumbUrl
+                               );
+                               wfPurgeSquidServers($urlArr);
+                       }
 
-               $nt = Title::newFromText( $wgLang->getNsText(
-                 Namespace::getImage() ) . ":{$name}" );
-               $link = $nt->getPrefixedURL();
-               if ( "" == $alt ) { $alt = $name; }
+                       if ( $wgUseImageMagick ) {
+                               # use ImageMagick
+                               $cmd  =  $wgImageMagickConvertCommand .
+                                       " -quality 85 -geometry {$width} ".
+                                       escapeshellarg($imgPath) . " " .
+                                       escapeshellarg($thumbPath);
+                               $conv = shell_exec( $cmd );
+                       } else {
+                               # Use PHP's builtin GD library functions.
+                               #
+                               # First find out what kind of file this is, and select the correct
+                               # input routine for this.
+                               list($src_width, $src_height, $src_type, $src_attr) = getimagesize( $imgPath );
+                               switch( $src_type ) {
+                                       case 1: # GIF
+                                               $src_image = imagecreatefromgif( $imgPath );
+                                               break;
+                                       case 2: # JPG
+                                               $src_image = imagecreatefromjpeg( $imgPath );
+                                               break;
+                                       case 3: # PNG
+                                               $src_image = imagecreatefrompng( $imgPath );
+                                               break;
+                                       case 15: # WBMP for WML
+                                               $src_image = imagecreatefromwbmp( $imgPath );
+                                               break;
+                                       case 16: # XBM
+                                               $src_image = imagecreatefromxbm( $imgPath );
+                                               break;
+                                       default:
+                                               return "Image type not supported";
+                                               break;
+                               }
+                               $height = floor( $src_height * ( $width/$src_width ) );
+                               $dst_image = imagecreatetruecolor( $width, $height );
+                               imagecopyresampled( $dst_image, $src_image, 
+                                                       0,0,0,0,
+                                                       $width, $height, $src_width, $src_height );
+                               switch( $src_type ) {
+                                       case 1:  # GIF
+                                       case 3:  # PNG
+                                       case 15: # WBMP
+                                       case 16: # XBM
+                                               #$thumbUrl .= ".png";
+                                               #$thumbPath .= ".png";
+                                               imagepng( $dst_image, $thumbPath );
+                                               break;
+                                       case 2:  # JPEG
+                                               #$thumbUrl .= ".jpg";
+                                               #$thumbPath .= ".jpg";
+                                               imageinterlace( $dst_image );
+                                               imagejpeg( $dst_image, $thumbPath, 95 );
+                                               break;
+                                       default:
+                                               break;
+                               }
+                               imagedestroy( $dst_image );
+                               imagedestroy( $src_image );
 
-               $u = wfLocalUrlE( $link );
-               $s = "<a href=\"{$u}\" class='image' title=\"{$alt}\">" .
-                 "<img border=0 src=\"{$url}\" alt=\"{$alt}\"></a>";
+
+                       }
+                       #
+                       # Check for zero-sized thumbnails. Those can be generated when 
+                       # no disk space is available or some other error occurs
+                       #
+                       $thumbstat = stat( $thumbPath );
+                       $imgstat   = stat( $imgPath );
+                       if( $thumbstat["size"] == 0 )
+                       {
+                               unlink( $thumbPath );
+                       }
+
+               }
+               return $thumbUrl;
+       }
+
+       function makeThumbLinkObj( $nt, $label = "", $align = "right", $boxwidth = 180 ) {
+               global $wgUploadPath;
+               $name = $nt->getDBKey();
+               $image = Title::makeTitle( Namespace::getImage(), $name );
+               $url  = wfImageUrl( $name );
+               $path = wfImagePath( $name );
+               
+               #$label = htmlspecialchars( $label );
+               $alt = preg_replace( "/<[^>]*>/", "", $label);
+               $alt = htmlspecialchars( $alt );
+               
+               list($width, $height, $type, $attr) = getimagesize( $path );
+               $boxheight  = intval( $height/($width/$boxwidth) );
+               if ( $boxwidth > $width ) {
+                       $boxwidth  = $width;
+                       $boxheight = $height;
+               }
+               
+               $thumbUrl = $this->createThumb( $name, $boxwidth );
+
+               $u = $nt->getURL( "", true );
+
+               $more = htmlspecialchars(wfMsg( "thumbnail-more" ));
+               
+               $s = "<div class=\"thumbnail-{$align}\" style=\"width:{$boxwidth}px;\">" .
+                 "<a href=\"{$u}\" class=\"internal\" title=\"{$alt}\">" .
+                 "<img border=\"0\" src=\"{$thumbUrl}\" alt=\"{$alt}\" width=\"{$boxwidth}\" height=\"{$boxheight}\"></a>" .
+                 "<a href=\"{$u}\" class=\"internal\" title=\"{$more}\">" .
+                   "<img border=\"0\" src=\"{$wgUploadPath}/magnify-clip.png\" width=\"26\" height=\"24\" align=\"right\" alt=\"{$more}\"></a>" .
+                 "<p>{$label}</p></div>";
                return $s;
        }
 
-       function makeMediaLink( $name, $url, $alt = "" )
+       function makeMediaLink( $name, $url, $alt = "" ) {
+               $nt = Title::makeTitle( Namespace::getMedia(), $name );
+               return $this->makeMediaLinkObj( $nt, $alt );
+       }
+
+       function makeMediaLinkObj( $nt, $alt = "" )
        {
-               global $wgOut, $wgTitle;
+               $name = $nt->getDBKey();
+               $url = wfImageUrl( $name );
+               if ( empty( $alt ) ) {
+                       $alt = preg_replace( '/\.(.+?)^/', '', $name );
+               }
 
-               if ( "" == $alt ) { $alt = $name; }
-               $u = wfEscapeHTML( $url );
+               $u = htmlspecialchars( $url );
                $s = "<a href=\"{$u}\" class='internal' title=\"{$alt}\">{$alt}</a>";
                return $s;
        }
@@ -1210,21 +1691,16 @@ class Skin {
        # Called by history lists and recent changes
        #
 
+       # Returns text for the start of the tabular part of RC
        function beginRecentChangesList()
        {
-               $rc_cache = array() ;
-               $rccc = 0 ;
+               $this->rc_cache = array() ;
+               $this->rcMoveIndex = 0;
+               $this->rcCacheIndex = 0 ;
                $this->lastdate = "";
                return "";
        }
 
-       function beginHistoryList()
-       {
-               $this->lastdate = $this->lastline = "";
-               $s = "\n<p>" . wfMsg( "histlegend" ) . "\n<ul>";
-               return $s;
-       }
-
        function beginImageHistoryList()
        {
                $s = "\n<h2>" . wfMsg( "imghistory" ) . "</h2>\n" .
@@ -1232,6 +1708,8 @@ class Skin {
                return $s;
        }
 
+       # Returns text for the end of RC
+       # If enhanced RC is in use, returns pretty much all the text
        function endRecentChangesList()
        {
                $s = $this->recentChangesBlock() ;
@@ -1239,133 +1717,102 @@ class Skin {
                return $s;
        }
 
-       function endHistoryList()
-       {
-               $last = wfMsg( "last" );
-
-               $s = preg_replace( "/!OLDID![0-9]+!/", $last, $this->lastline );
-               $s .= "</ul>\n";
-               return $s;
-       }
-
-       function endImageHistoryList()
-       {
-               $s = "</ul>\n";
-               return $s;
-       }
-
-       function historyLine( $ts, $u, $ut, $ns, $ttl, $oid, $c, $isminor )
+       # Enhanced RC ungrouped line
+       function recentChangesBlockLine ( $rcObj ) 
        {
-               global $wgLang;
-
-               $artname = Title::makeName( $ns, $ttl );
-               $last = wfMsg( "last" );
-               $cur = wfMsg( "cur" );
-               $cr = wfMsg( "currentrev" );
-
-               if ( $oid && $this->lastline ) {
-                       $ret = preg_replace( "/!OLDID!([0-9]+)!/", $this->makeKnownLink(
-                         $artname, $last, "diff=\\1&oldid={$oid}" ), $this->lastline );
-               } else {
-                       $ret = "";
-               }
-               $dt = $wgLang->timeanddate( $ts, true );
-
-               if ( $oid ) { $q = "oldid={$oid}"; }
-               else { $q = ""; }
-               $link = $this->makeKnownLink( $artname, $dt, $q );
-
-               if ( 0 == $u ) {
-            $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
-                       $ut, "target=" . $ut );
-               } else { $ul = $this->makeLink( $wgLang->getNsText(
-                 Namespace::getUser() ) . ":{$ut}", $ut ); }
-
-               $s = "<li>";
-               if ( $oid ) {
-                       $curlink = $this->makeKnownLink( $artname, $cur,
-                         "diff=0&oldid={$oid}" );
+               global $wgUploadPath, $wgLang ;
+               
+               # Get rc_xxxx variables
+               extract( $rcObj->mAttribs ) ;
+               $curIdEq = "curid=$rc_cur_id";
+               
+               # Spacer image
+               $r = "" ;
+               $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>" ;              $r .= "<tt>" ;
+               
+               if ( $rc_type == RC_MOVE ) {
+                       $r .= "&nbsp;&nbsp;";
                } else {
-                       $curlink = $cur;
+                       # M & N (minor & new)
+                       $M = wfMsg( "minoreditletter" );
+                       $N = wfMsg( "newpageletter" );
+               
+                       if ( $rc_type == RC_NEW ) {
+                               $r .= $N ;
+                       } else {
+                               $r .= "&nbsp;" ;
+                       }
+                       if ( $rc_minor ) {
+                               $r .= $M ;
+                       } else {
+                               $r .= "&nbsp;" ;
+                       }
                }
-               $s .= "({$curlink}) (!OLDID!{$oid}!) . .";
-
-               $M = wfMsg( "minoreditletter" );
-               if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
-               $s .= " {$link} . . {$ul}";
-
-               if ( "" != $c && "*" != $c ) { $s .= " <em>(" . wfEscapeHTML($c) . ")</em>"; }
-               $s .= "</li>\n";
-
-               $this->lastline = $s;
-               return $ret;
-       }
-
-       function recentChangesBlockLine ( $y ) {
-               global $wgUploadPath ;
-
-               $M = wfMsg( "minoreditletter" );
-               $N = wfMsg( "newpageletter" );
-               $r = "" ;
-               $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>" ;
-               $r .= "<tt>" ;
-               if ( $y->isnew ) $r .= $N ;
-               else $r .= "&nbsp;" ;
-               if ( $y->isminor ) $r .= $M ;
-               else $r .= "&nbsp;" ;
-               $r .= " ".$y->timestamp." " ;
+               
+               # Timestamp
+               $r .= " ".$rcObj->timestamp." " ;
                $r .= "</tt>" ;
-               $link = $y->link ;
-               if ( $y->watched ) $link = "<strong>{$link}</strong>" ;
+
+               # Article link
+               $link = $rcObj->link ;
+               if ( $rcObj->watched ) $link = "<strong>{$link}</strong>" ;
                $r .= $link ;
 
+               # Cur
                $r .= " (" ;
-               $r .= $y->curlink ;
+               $r .= $rcObj->curlink ;
                $r .= "; " ;
-               $r .= $this->makeKnownLink( $y->secureName, wfMsg( "hist" ), "action=history" );
+               
+               # Hist
+               $r .= $this->makeKnownLinkObj( $rcObj->getTitle(), wfMsg( "hist" ), "{$curIdEq}&action=history" );
 
-               $r .= ") . . ".$y->userlink ;
-               $r .= $y->usertalklink ;
-               if ( $y->usercomment != "" )
-                       $r .= " <em>(".wfEscapeHTML($y->usercomment).")</em>" ;
+               # User/talk
+               $r .= ") . . ".$rcObj->userlink ;
+               $r .= $rcObj->usertalklink ;
+               
+               # Comment
+               if ( $rc_comment != "" && $rc_type != RC_MOVE ) {
+                       $r .= $wgLang->emphasize( " (".wfEscapeHTML($rc_comment).")" );
+               }
                $r .= "<br>\n" ;
                return $r ;
-               }
-
-       function recentChangesBlockGroup ( $y ) {
-               global $wgUploadPath ;
+       }
 
+       # Enhanced RC group
+       function recentChangesBlockGroup ( $block ) 
+       {
+               global $wgUploadPath, $wgLang ;
+               
                $r = "" ;
                $M = wfMsg( "minoreditletter" );
                $N = wfMsg( "newpageletter" );
+               
+               # Collate list of users
                $isnew = false ;
                $userlinks = array () ;
-               foreach ( $y AS $x ) {
-                       $oldid = $x->diffid ;
-                       if ( $x->isnew ) $isnew = true ;
-                       $u = $x->userlink ;
+               foreach ( $block AS $rcObj ) {
+                       $oldid = $rcObj->mAttribs['rc_last_oldid'];
+                       if ( $rcObj->mAttribs['rc_new'] ) $isnew = true ;
+                       $u = $rcObj->userlink ;
                        if ( !isset ( $userlinks[$u] ) ) $userlinks[$u] = 0 ;
                        $userlinks[$u]++ ;
-                       }
-
+               }
+               
+               # Sort the list and convert to text
                krsort ( $userlinks ) ;
                asort ( $userlinks ) ;
                $users = array () ;
-               $u = array_keys ( $userlinks ) ;
-               foreach ( $u as $x ) {
-                       $z = $x ;
-                       if ( $userlinks[$x] > 1 ) $z .= " ({$userlinks[$x]}&times;)" ;
-                       array_push ( $users , $z ) ;
-                       }
+               foreach ( $userlinks as $userlink => $count) {
+                       $text = $userlink ;
+                       if ( $count > 1 ) $text .= " ({$count}&times;)" ;
+                       array_push ( $users , $text ) ;
+               }
                $users = " <font size='-1'>[".implode("; ",$users)."]</font>" ;
 
-               $e = $y ;
-               $e = array_shift ( $e ) ;
-
                # Arrow
-               $rci = "RCI{$this->rccc}" ;
-               $rcl = "RCL{$this->rccc}" ;
-               $rcm = "RCM{$this->rccc}" ;
+               $rci = "RCI{$this->rcCacheIndex}" ;
+               $rcl = "RCL{$this->rcCacheIndex}" ;
+               $rcm = "RCM{$this->rcCacheIndex}" ;
                $tl = "<a href='javascript:toggleVisibility(\"{$rci}\",\"{$rcm}\",\"{$rcl}\")'>" ;
                $tl .= "<span id='{$rcm}'><img src='{$wgUploadPath}/Arr_r.png' width=12 height=12 border=0></span>" ;
                $tl .= "<span id='{$rcl}' style='display:none'><img src='{$wgUploadPath}/Arr_d.png' width=12 height=12 border=0></span>" ;
@@ -1373,234 +1820,321 @@ class Skin {
                $r .= $tl ;
 
                # Main line
+               # M/N
                $r .= "<tt>" ;
                if ( $isnew ) $r .= $N ;
                else $r .= "&nbsp;" ;
                $r .= "&nbsp;" ; # Minor
-               $r .= " ".$e->timestamp." " ;
-               $r .= "</tt>" ;
 
-               $link = $e->link ;
-               if ( $e->watched ) $link = "<strong>{$link}</strong>" ;
+               # Timestamp
+               $r .= " ".$block[0]->timestamp." " ;
+               $r .= "</tt>" ;
+               
+               # Article link
+               $link = $block[0]->link ;
+               if ( $block[0]->watched ) $link = "<strong>{$link}</strong>" ;
                $r .= $link ;
-
-               if ( !$e->islog ) {
-                       $r .= " (".count($y)." " ;
+               
+               $curIdEq = "curid=" . $block[0]->mAttribs['rc_cur_id'];
+               if ( $block[0]->mAttribs['rc_type'] != RC_LOG ) {
+                       # Changes
+                       $r .= " (".count($block)." " ;
                        if ( $isnew ) $r .= wfMsg("changes");
-                       else $r .= $this->makeKnownLink( $e->secureName , wfMsg("changes") , "diff=0&oldid=".$oldid ) ;
+                       else $r .= $this->makeKnownLinkObj( $block[0]->getTitle() , wfMsg("changes") , 
+                               "{$curIdEq}&diff=0&oldid=".$oldid ) ;
                        $r .= "; " ;
-                       $r .= $this->makeKnownLink( $e->secureName, wfMsg( "history" ), "action=history" );
+
+                       # History
+                       $r .= $this->makeKnownLinkObj( $block[0]->getTitle(), wfMsg( "history" ), "{$curIdEq}&action=history" );
                        $r .= ")" ;
-                       }
+               }
 
                $r .= $users ;
                $r .= "<br>\n" ;
 
                # Sub-entries
                $r .= "<div id='{$rci}' style='display:none'>" ;
-               foreach ( $y AS $x )
-                       {
+               foreach ( $block AS $rcObj ) {
+                       # Get rc_xxxx variables
+                       extract( $rcObj->mAttribs );
+                       
                        $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>";
                        $r .= "<tt>&nbsp; &nbsp; &nbsp; &nbsp;" ;
-                       if ( $x->isnew ) $r .= $N ;
+                       if ( $rc_new ) $r .= $N ;
                        else $r .= "&nbsp;" ;
-                       if ( $x->isminor ) $r .= $M ;
+                       if ( $rc_minor ) $r .= $M ;
                        else $r .= "&nbsp;" ;
                        $r .= "</tt>" ;
 
                        $o = "" ;
-                       if ( $x->oldid != 0 ) $o = "oldid=".$x->oldid ;
-                       if ( $x->islog ) $link = $x->timestamp ;
-                       else $link = $this->makeKnownLink( $x->secureName, $x->timestamp , $o ) ;
+                       if ( $rc_last_oldid != 0 ) {
+                               $o = "oldid=".$rc_last_oldid ;
+                       }
+                       if ( $rc_type == RC_LOG ) {
+                               $link = $rcObj->timestamp ;
+                       } else {
+                               $link = $this->makeKnownLink( $rcObj->getTitle(), $rcObj->timestamp , "{$curIdEq}&$o" ) ;
+                       }
                        $link = "<tt>{$link}</tt>" ;
 
-
                        $r .= $link ;
                        $r .= " (" ;
-                       $r .= $x->curlink ;
+                       $r .= $rcObj->curlink ;
                        $r .= "; " ;
-                       $r .= $x->lastlink ;
-                       $r .= ") . . ".$x->userlink ;
-                       $r .= $x->usertalklink ;
-                       if ( $x->usercomment != "" )
-                               $r .= " <em>(".wfEscapeHTML($x->usercomment).")</em>" ;
-                       $r .= "<br>\n" ;
+                       $r .= $rcObj->lastlink ;
+                       $r .= ") . . ".$rcObj->userlink ;
+                       $r .= $rcObj->usertalklink ;
+                       if ( $rc_comment != "" ) {
+                               $r .= $wgLang->emphasize( " (".wfEscapeHTML($rc_comment).")" ) ;
                        }
+                       $r .= "<br>\n" ;
+               }
                $r .= "</div>\n" ;
 
-               $this->rccc++ ;
+               $this->rcCacheIndex++ ;
                return $r ;
-               }
+       }
 
+       # If enhanced RC is in use, this function takes the previously cached
+       # RC lines, arranges them, and outputs the HTML
        function recentChangesBlock ()
        {
                global $wgUploadPath ;
                if ( count ( $this->rc_cache ) == 0 ) return "" ;
-               $k = array_keys ( $this->rc_cache ) ;
-               foreach ( $k AS $x )
-                       {
-                       $y = $this->rc_cache[$x] ;
-                       if ( count ( $y ) < 2 ) {
-                               $r .= $this->recentChangesBlockLine ( array_shift ( $y ) ) ;
+               #$k = array_keys ( $this->rc_cache ) ;
+               foreach ( $this->rc_cache AS $secureName => $block ) {
+                       if ( count ( $block ) < 2 ) {
+                               $r .= $this->recentChangesBlockLine ( array_shift ( $block ) ) ;
                        } else {
-                               $r .= $this->recentChangesBlockGroup ( $y ) ;
-                               }
+                               $r .= $this->recentChangesBlockGroup ( $block ) ;
                        }
+               }
 
                return "<div align=left>{$r}</div>" ;
        }
 
-       function recentChangesLine( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
+       # Called in a loop over all displayed RC entries
+       # Either returns the line, or caches it for later use
+       function recentChangesLine( &$rc, $watched = false )
        {
                global $wgUser ;
                $usenew = $wgUser->getOption( "usenewrc" );
                if ( $usenew )
-                       $r = $this->recentChangesLineNew ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
+                       $line = $this->recentChangesLineNew ( $rc, $watched ) ;
                else
-                       $r = $this->recentChangesLineOld ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
-               return $r ;
+                       $line = $this->recentChangesLineOld ( $rc, $watched ) ;
+               return $line ;
        }
-
-       function recentChangesLineOld( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0, $diffid = 0 )
+       
+       function recentChangesLineOld( &$rc, $watched = false )
        {
                global $wgTitle, $wgLang, $wgUser;
-
-               $d = $wgLang->date( $ts, true);
+               
+               # Extract DB fields into local scope
+               extract( $rc->mAttribs );
+               $curIdEq = "curid=" . $rc_cur_id;
+               
+               # Make date header if necessary
+               $date = $wgLang->date( $rc_timestamp, true);
                $s = "";
-               if ( $d != $this->lastdate ) {
+               if ( $date != $this->lastdate ) {
                        if ( "" != $this->lastdate ) { $s .= "</ul>\n"; }
-                       $s .= "<h4>{$d}</h4>\n<ul>";
-                       $this->lastdate = $d;
+                       $s .= "<h4>{$date}</h4>\n<ul>";
+                       $this->lastdate = $date;
                }
-               $h = $wgLang->time( $ts, true );
-               $t = Title::makeName( $ns, $ttl );
-               $clink = $this->makeKnownLink( $t , "" );
-               $nt = Title::newFromText( $t );
+               $s .= "<li> ";
+               
+               if ( $rc_type == RC_MOVE ) {
+                       # Diff
+                       $s .= "(" . wfMsg( "diff" ) . ") (";
+                       # Hist
+                       $s .= $this->makeKnownLinkObj( $rc->getMovedToTitle(), wfMsg( "hist" ), "action=history" ) .
+                               ") . . ";
+                       
+                       # "[[x]] moved to [[y]]"
 
-               if ( $watched ) {
-                       $clink = "<strong>{$clink}</strong>";
-               }
-               $hlink = $this->makeKnownLink( $t, wfMsg( "hist" ), "action=history" );
-               if ( $isnew || $nt->isLog() ) {
-                       $dlink = wfMsg( "diff" );
-               } else {
-                       $dlink = $this->makeKnownLink( $t, wfMsg( "diff" ),
-                         "diff={$oldid}&oldid={$diffid}" ); # Finagle's law
-               }
-               if ( 0 == $u ) {
-               $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
-                       $ut, "target=" . $ut );                                 
-               } else { $ul = $this->makeLink( $wgLang->getNsText(
-                 Namespace::getUser() ) . ":{$ut}", $ut ); }
-                 
-               $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
-               $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
-               $utl= $this->makeLink($utns . ":{$ut}", $talkname );
-               $cr = wfMsg( "currentrev" );
+                       $s .= wfMsg( "1movedto2", $this->makeKnownLinkObj( $rc->getTitle(), "", "redirect=no" ),
+                               $this->makeKnownLinkObj( $rc->getMovedToTitle(), "" ) );
 
-               $s .= "<li> ({$dlink}) ({$hlink}) . .";
-               $M = wfMsg( "minoreditletter" );
-               $N = wfMsg( "newpageletter" );
-               if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
-               if ( $isnew ) { $s .= "<strong>{$N}</strong>"; }
-               $s .= " {$clink}; {$h} . . {$ul}";
-
-               $blink="";
-               if ( ( 0 == $u ) && $wgUser->isSysop() ) {
-                       $blink = $this->makeKnownLink( $wgLang->specialPage(
-                         "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
+               } else {
+                       # Diff link
+                       if ( $rc_type == RC_NEW || $rc_type == RC_LOG ) {
+                               $diffLink = wfMsg( "diff" );
+                       } else {
+                               $diffLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "diff" ),
+                                 "{$curIdEq}&diff={$rc_this_oldid}&oldid={$rc_last_oldid}" );
+                       }
+                       $s .= "($diffLink) (";
                        
+                       # History link
+                       $s .= $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "hist" ), "{$curIdEq}&action=history" ); 
+                       $s .= ") . . ";
+
+                       # M and N (minor and new)
+                       $M = wfMsg( "minoreditletter" );
+                       $N = wfMsg( "newpageletter" );
+                       if ( $rc_minor ) { $s .= " <strong>{$M}</strong>"; }
+                       if ( $rc_type == RC_NEW ) { $s .= "<strong>{$N}</strong>"; }
+
+                       # Article link
+                       $articleLink = $this->makeKnownLinkObj( $rc->getTitle(), "" );
+
+                       if ( $watched ) {
+                               $articleLink = "<strong>{$articleLink}</strong>";
+                       }
+                       $s .= " $articleLink";
+
                }
-               if(!$blink) { 
-                       $utl = "({$utl})";
+               
+               # Timestamp
+               $s .= "; " . $wgLang->time( $rc_timestamp, true ) . " . . ";
+               
+               # User link (or contributions for unregistered users)
+               if ( 0 == $rc_user ) {
+                       $userLink = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
+                       $rc_user_text, "target=" . $rc_user_text );                                     
+               } else { 
+                       $userLink = $this->makeLink( $wgLang->getNsText( NS_USER ) . ":{$rc_user_text}", $rc_user_text ); 
+               }
+               $s .= $userLink;
+               
+               # User talk link
+               $talkname=$wgLang->getNsText(NS_TALK); # use the shorter name
+               global $wgDisableAnonTalk;
+               if( 0 == $rc_user && $wgDisableAnonTalk ) {
+                       $userTalkLink = "";
                } else {
-                       $utl = "({$utl} | {$blink})";
+                       $utns=$wgLang->getNsText(NS_USER_TALK);
+                       $userTalkLink= $this->makeLink($utns . ":{$rc_user_text}", $talkname );
+               }
+               # Block link
+               $blockLink="";
+               if ( ( 0 == $rc_user ) && $wgUser->isSysop() ) {
+                       $blockLink = $this->makeKnownLink( $wgLang->specialPage(
+                         "Blockip" ), wfMsg( "blocklink" ), "ip={$rc_user_text}" );
+                       
                }
-               $s.=" {$utl}";
+               if($blockLink) { 
+                       if($userTalkLink) $userTalkLink .= " | ";
+                       $userTalkLink .= $blockLink;
+               }
+               if($userTalkLink) $s.=" ({$userTalkLink})";
 
-               if ( "" != $c && "*" != $c ) {
-                       $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
+               # Add comment
+               if ( "" != $rc_comment && "*" != $rc_comment && $rc_type != RC_MOVE ) {
+                       $s .= $wgLang->emphasize(" (" . wfEscapeHTML( $rc_comment ) . ")");
                }
                $s .= "</li>\n";
 
                return $s;
        }
-
-       function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
+       
+#      function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
+       function recentChangesLineNew( &$baseRC, $watched = false )
        {
                global $wgTitle, $wgLang, $wgUser;
 
-               $rc = new RecentChangesClass ;
+               # Create a specialised object
+               $rc = RCCacheEntry::newFromParent( $baseRC ) ;
 
-               $d = $wgLang->date( $ts, true);
-               $s = "";
+               # Extract fields from DB into the function scope (rc_xxxx variables)
+               extract( $rc->mAttribs );
+               $curIdEq = "curid=" . $rc_cur_id;
+
+               # If it's a new day, add the headline and flush the cache
+               $date = $wgLang->date( $rc_timestamp, true);
                $ret = "" ;
-               if ( $d != $this->lastdate ) {
+               if ( $date != $this->lastdate ) {
+                       # Process current cache
                        $ret = $this->recentChangesBlock () ;
                        $this->rc_cache = array() ;
-                       $ret .= "<h4>{$d}</h4>\n";
-                       $this->lastdate = $d;
-               }
-               $h = $wgLang->time( $ts, true );
-               $t = Title::makeName( $ns, $ttl );
-               $clink = $this->makeKnownLink( $t, "" ) ;
-               if ( $oldid == 0 ) $c2link = $clink ;
-               else $c2link = $this->makeKnownLink( $t, "" , "oldid={$oldid}" );
-               $nt = Title::newFromText( $t );
-
-               $rc->timestamp = $h ;
-               $rc->oldid = $oldid ;
-               $rc->diffid = $diffid ;
+                       $ret .= "<h4>{$date}</h4>\n";
+                       $this->lastdate = $date;
+               }
+               
+               # Make article link
+               if ( $rc_type == RC_MOVE ) {
+                       $clink = $this->makeKnownLinkObj( $rc->getTitle(), "", "redirect=no" );
+                       $clink .= " " . wfMsg("movedto") . " ";
+                       $clink .= $this->makeKnownLinkObj( $rc->getMovedToTitle(), "" );
+               } else {
+                       $clink = $this->makeKnownLinkObj( $rc->getTitle(), "" ) ;
+               }
+               
+               $time = $wgLang->time( $rc_timestamp, true );
                $rc->watched = $watched ;
-               $rc->isnew = $isnew ;
-               $rc->isminor = $isminor ;
-               $rc->secureName = $t ;
-               $rc->displayName = $nt ;
                $rc->link = $clink ;
-               $rc->usercomment = $c ;
-               $rc->islog = $nt->isLog() ;
-
-               if ( ( $isnew && $oldid == 0 ) || $nt->isLog() ) {
-                       $dlink = wfMsg( "cur" );
+               $rc->timestamp = $time;
+               
+               # Make "cur" link
+               if ( ( $rc_type == RC_NEW && $rc_this_oldid == 0 ) || $rc_type == RC_LOG || $rc_type == RC_MOVE) {
+                       $curLink = wfMsg( "cur" );
                } else {
-                       $dlink = $this->makeKnownLink( $t, wfMsg( "cur" ),
-                         "diff=0&oldid={$oldid}" );
+                       $curLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "cur" ),
+                         "{$curIdEq}&diff=0&oldid={$rc_this_oldid}" );
                }
 
-               if ( $diffid == 0 || $nt->isLog() ) {
-                       $plink = wfMsg( "last" );
+               # Make "last" link
+               $titleObj = $rc->getTitle();
+               if ( $rc_last_oldid == 0 || $rc_type == RC_LOG || $rc_type == RC_MOVE ) {
+                       $lastLink = wfMsg( "last" );
                } else {
-                       $plink = $this->makeKnownLink( $t, wfMsg( "last" ),
-                         "diff={$oldid}&oldid={$diffid}" );
+                       $lastLink = $this->makeKnownLinkObj( $rc->getTitle(), wfMsg( "last" ),
+                         "{$curIdEq}&diff={$rc_this_oldid}&oldid={$rc_last_oldid}" );
                }
 
-               if ( 0 == $u ) {
-               $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
-                       $ut, "target=" . $ut );
-               } else { $ul = $this->makeLink( $wgLang->getNsText(
-                 Namespace::getUser() ) . ":{$ut}", $ut ); }
-
-               $rc->userlink = $ul ;
-               $rc->lastlink = $plink ;
-               $rc->curlink = $dlink ;
+               # Make user link (or user contributions for unregistered users)
+               if ( 0 == $rc_user ) {
+                       $userLink = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
+                       $rc_user_text, "target=" . $rc_user_text );
+               } else { 
+                       $userLink = $this->makeLink( $wgLang->getNsText(
+                         Namespace::getUser() ) . ":{$rc_user_text}", $rc_user_text ); 
+               }
 
-               $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
-               $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
-               $utl= $this->makeLink($utns . ":{$ut}", $talkname );                                            
+               $rc->userlink = $userLink ;
+               $rc->lastlink = $lastLink ;
+               $rc->curlink = $curLink ;
 
-               if ( ( 0 == $u ) && $wgUser->isSysop() ) {
-                       $blink = $this->makeKnownLink( $wgLang->specialPage(
-                         "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
-                       $rc->usertalklink= " ({$utl} | {$blink})";
+               # Make user talk link           
+               $utns=$wgLang->getNsText(NS_USER_TALK);
+               $talkname=$wgLang->getNsText(NS_TALK); # use the shorter name
+               $userTalkLink= $this->makeLink($utns . ":{$rc_user_text}", $talkname ); 
+               
+               global $wgDisableAnonTalk;
+               if ( ( 0 == $rc_user ) && $wgUser->isSysop() ) {
+                       $blockLink = $this->makeKnownLink( $wgLang->specialPage(
+                         "Blockip" ), wfMsg( "blocklink" ), "ip={$rc_user_text}" );
+                       if( $wgDisableAnonTalk )
+                               $rc->usertalklink = " ({$blockLink})";
+                       else
+                               $rc->usertalklink = " ({$userTalkLink} | {$blockLink})";
+               } else {
+                       if( $wgDisableAnonTalk && ($rc_user == 0) )
+                               $rc->usertalklink = "";
+                       else
+                               $rc->usertalklink = " ({$userTalkLink})";
+               }
+
+               # Put accumulated information into the cache, for later display
+               # Page moves go on their own line
+               $title = $rc->getTitle();
+               $secureName = $title->getPrefixedDBkey();
+               if ( $rc_type == RC_MOVE ) {
+                       # Use an @ character to prevent collision with page names
+                       $this->rc_cache["@@" . ($rcMoveIndex++)] = array($rc);
                } else {
-                       $rc->usertalklink=" ({$utl})";
+                       if ( !isset ( $this->rc_cache[$secureName] ) ) $this->rc_cache[$secureName] = array() ;
+                       array_push ( $this->rc_cache[$secureName] , $rc ) ;
                }
-
-               if ( !isset ( $this->rc_cache[$t] ) ) $this->rc_cache[$t] = array() ;
-               array_push ( $this->rc_cache[$t] , $rc ) ;
                return $ret;
        }
 
+       function endImageHistoryList()
+       {
+               $s = "</ul>\n";
+               return $s;
+       }
 
        function imageHistoryLine( $iscur, $ts, $img, $u, $ut, $size, $c )
        {
@@ -1614,8 +2148,8 @@ class Skin {
                        $url = wfImageUrl( $img );
                        $rlink = $cur;
                        if ( $wgUser->isSysop() ) {
-                               $link = wfLocalUrlE( "", "image=" . $wgTitle->getURL() .
-                                 "&action=delete" );
+                               $link = $wgTitle->getURL( "image=" . $wgTitle->getPartialURL() . 
+                                 "&action=delete", true );
                                $style = $this->getInternalLinkAttributes( $link, $del );
 
                                $dlink = "<a href=\"{$link}\"{$style}>{$del}</a>";
@@ -1642,14 +2176,14 @@ class Skin {
                else { $ul = $this->makeLink( $wgLang->getNsText(
                  Namespace::getUser() ) . ":{$ut}", $ut ); }
 
-               $nb = str_replace( "$1", $size, wfMsg( "nbytes" ) );
+               $nb = wfMsg( "nbytes", $size );
                $style = $this->getInternalLinkAttributes( $url, $dt );
 
                $s = "<li> ({$dlink}) ({$rlink}) <a href=\"{$url}\"{$style}>{$dt}</a>"
                  . " . . {$ul} ({$nb})";
 
                if ( "" != $c && "*" != $c ) {
-                       $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
+                       $s .= $wgLang->emphasize(" (" . wfEscapeHTML( $c ) . ")");
                }
                $s .= "</li>\n";
                return $s;
@@ -1663,6 +2197,7 @@ class Skin {
        }
 
        function tocUnindent($level) {
+               $rv = "";
                while($level-->0) $rv.="</div>\n";
                return $rv;
        }
@@ -1683,31 +2218,139 @@ class Skin {
        }
 
        function tocTable($toc) {
-
-/* does not auto-expand, use table for now
-       return "
-       <div><div style=\"border-width:1px;background-color:#f3f3ff;border-color:#8888aa;border-style:solid;padding:1em;padding-bottom:1em;\">
-       <b>".wfMsg("toc")."</b><P>
-       $toc</div></div>";
-*/
-       return
-       "<table border=\"0\" bgcolor=\"#8888aa\" cellpadding=\"0\" cellspacing=\"1\"><tr><td>\n" .
-       "<table border=\"0\" bgcolor=\"#f3f3ff\" CELLPADDING=5><tr><td>\n".
-       "<b>".wfMsg("toc")."</b>" .
-       " <script type='text/javascript'>showTocToggle(\"" . wfMsg("showtoc") . "\",\"" . wfMsg("hidetoc") . "\")</script>" .
-       "</td></tr><tr id='tocinside'><td>\n".
-       $toc."</td></tr></table></td></tr></table><P>\n";
+               // note to CSS fanatics: putting this in a div does not work -- div won't auto-expand
+               global $printable;
+               
+               if (!$printable) {
+                       $hideline = " <script type='text/javascript'>showTocToggle(\"" . wfMsg("showtoc") . "\",\"" . wfMsg("hidetoc") . "\")</script>";
+               }
+               return
+               "<p><table border=\"0\" id=\"toc\"><tr><td align=\"center\">\n".
+               "<b>".wfMsg("toc")."</b>" .
+               $hideline .
+               "</td></tr><tr id='tocinside'><td>\n".
+               $toc."</td></tr></table><P>\n";
        }
 
-       function editSectionLink($section) {
+       # These two do not check for permissions: check $wgTitle->userCanEdit before calling them
+       function editSectionScript($section,$head) {
 
                global $wgTitle,$wgUser,$oldid;
-               if($wgTitle->isProtected() && !$wgUser->isSysop()) return "";
-               if($oldid) return "";
-               $editurl="&section={$section}";         
-               $url=$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
-               return "<div style=\"float:right;margin-left:5px;\"><small>[".$url."]</small></div>";
+               if($oldid) return $head;
+               $url = $wgTitle->getUrl( "action=edit&section=$section", true );
+               return "<span onContextMenu='document.location=\"".$url."\";return false;'>{$head}</span>";
+       }
 
+       function editSectionLink($section) {
+               global $printable,$oldid;
+               global $wgTitle, $wgUser, $wgLang;
+               
+               if( isset( $oldid ) ) return "";
+               if( isset( $printable ) ) return "";
+               
+               $editurl = "&section={$section}";
+               $url = $this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
+               
+               if( $wgLang->isRTL() ) {
+                       $farside = "left";
+                       $nearside = "right";
+               } else {
+                       $farside = "right";
+                       $nearside = "left";
+               }
+               return "<div style=\"float:$farside;margin-$nearside:5px;\"><small>[".$url."]</small></div>";
+
+       }
+
+       // This function is called by EditPage.php and shows a bulletin board style
+       // toolbar for common editing functions. It can be disabled in the user preferences.
+       // The necsesary JavaScript code can be found in style/wikibits.js.
+       function getEditToolbar() {
+
+               global $wgUploadPath,$wgLang;
+
+               // toolarray an array of arrays which each include the filename of
+               // the button image (without path), the opening tag, the closing tag,
+               // and optionally a sample text that is inserted between the two when no
+               // selection is highlighted.
+               // The tip text is shown when the user moves the mouse over the button.
+               $toolarray=array(
+                       array(  "image"=>"button_bold.png",
+                               "open"=>"\'\'\'",
+                               "close"=>"\'\'\'",
+                               "sample"=>wfMsg("bold_sample"),
+                               "tip"=>wfMsg("bold_tip")),
+                       array(  "image"=>"button_italic.png",
+                               "open"=>"\'\'",
+                               "close"=>"\'\'",
+                               "sample"=>wfMsg("italic_sample"),
+                               "tip"=>wfMsg("italic_tip")),
+                       array(  "image"=>"button_link.png",
+                               "open"=>"[[",
+                               "close"=>"]]",
+                               "sample"=>wfMsg("link_sample"),
+                               "tip"=>wfMsg("link_tip")),
+                       array(  "image"=>"button_extlink.png",
+                               "open"=>"[",
+                               "close"=>"]",
+                               "sample"=>wfMsg("extlink_sample"),
+                               "tip"=>wfMsg("extlink_tip")),
+                       array(  "image"=>"button_headline.png",
+                               "open"=>"\\n== ",
+                               "close"=>" ==\\n",
+                               "sample"=>wfMsg("headline_sample"),
+                               "tip"=>wfMsg("headline_tip")),
+                       array(  "image"=>"button_image.png",
+                               "open"=>"[[".$wgLang->getNsText(NS_IMAGE).":",
+                               "close"=>"]]",
+                               "sample"=>wfMsg("image_sample"),
+                               "tip"=>wfMsg("image_tip")),
+                       array(  "image"=>"button_media.png",
+                               "open"=>"[[".$wgLang->getNsText(NS_MEDIA).":",
+                               "close"=>"]]",
+                               "sample"=>wfMsg("media_sample"),
+                               "tip"=>wfMsg("media_tip")),
+                       array(  "image"=>"button_math.png",
+                               "open"=>"\\<math\\>",
+                               "close"=>"\\</math\\>",
+                               "sample"=>wfMsg("math_sample"),
+                               "tip"=>wfMsg("math_tip")),
+                       array(  "image"=>"button_nowiki.png",
+                               "open"=>"\\<nowiki\\>",
+                               "close"=>"\\</nowiki\\>",
+                               "sample"=>wfMsg("nowiki_sample"),
+                               "tip"=>wfMsg("nowiki_tip")),
+                       array(  "image"=>"button_sig.png",
+                               "open"=>"--~~~~",
+                               "close"=>"",
+                               "sample"=>"",
+                               "tip"=>wfMsg("sig_tip")),
+                       array(  "image"=>"button_hr.png",
+                               "open"=>"\\n----\\n",
+                               "close"=>"",
+                               "sample"=>"",
+                               "tip"=>wfMsg("hr_tip"))
+               );
+               $toolbar.="<script type='text/javascript'>\n";
+               $toolbar.="document.writeln(\"<div id='toolbar'>\");\n";
+               foreach($toolarray as $tool) {
+
+                       $image=$wgUploadPath."/".$tool["image"];
+                       $open=$tool["open"];
+                       $close=$tool["close"];
+                       $sample = addslashes( $tool["sample"] );
+
+                       // Note that we use the tip both for the ALT tag and the TITLE tag of the image.
+                       // Older browsers show a "speedtip" type message only for ALT.
+                       // Ideally these should be different, realistically they
+                       // probably don't need to be.
+                       $tip = addslashes( $tool["tip"] );
+                       $toolbar.="addButton('$image','$tip','$open','$close','$sample');\n";
+               }
+
+               $toolbar.="addInfobox('" . addslashes( wfMsg( "infobox" ) ) . "');\n";
+               $toolbar.="document.writeln(\"</div>\");\n</script>";
+               return $toolbar;
        }
 }
 
@@ -1715,4 +2358,6 @@ include_once( "SkinStandard.php" );
 include_once( "SkinNostalgia.php" );
 include_once( "SkinCologneBlue.php" );
 
+#include_once( "SkinSmarty.php" );
+
 ?>