Dynamic date bug fix
[mediawiki.git] / includes / Skin.php
blobc20e22c47563ad3f0e35fe4e3e003d310ca88adc
1 <?
2 # See skin.doc
4 # These are the INTERNAL names, which get mapped
5 # directly to class names. For display purposes, the
6 # Language class has internationalized names
8 /* private */ $wgValidSkinNames = array(
9 "Standard", "Nostalgia", "CologneBlue"
12 class RecentChangesClass {
13 var $secureName , $displayName , $link , $namespace ;
14 var $oldid , $diffid , $timestamp , $curlink , $lastlink , $usertalklink , $versionlink ;
15 var $usercomment , $userlink ;
16 var $isminor , $isnew , $watched , $islog ;
17 } ;
19 class Skin {
21 /* private */ var $lastdate, $lastline;
23 var $rc_cache ; # Cache for Enhanced Recent Changes
24 var $rccc ; # Recent Changes Cache Counter for visibility toggle
27 function Skin()
31 function getSkinNames()
33 global $wgValidSkinNames;
34 return $wgValidSkinNames;
37 function getStylesheet()
39 return "wikistandard.css";
42 function qbSetting()
44 global $wgOut, $wgUser;
46 if ( $wgOut->isQuickbarSupressed() ) { return 0; }
47 $q = $wgUser->getOption( "quickbar" );
48 if ( "" == $q ) { $q = 0; }
49 return $q;
52 function initPage()
54 global $wgOut, $wgStyleSheetPath;
55 wfProfileIn( "Skin::initPage" );
57 $wgOut->addLink( "shortcut icon", "", "/favicon.ico" );
58 if ( $wgOut->isPrintable() ) { $ss = "wikiprintable.css"; }
59 else { $ss = $this->getStylesheet(); }
60 $wgOut->addLink( "stylesheet", "", "{$wgStyleSheetPath}/{$ss}" );
61 wfProfileOut();
64 function getHeadScripts() {
65 global $wgStyleSheetPath;
66 $r = "<script type=\"text/javascript\" src=\"{$wgStyleSheetPath}/wikibits.js\"></script>\n";
67 return $r;
70 function getUserStyles()
72 $s = "<style type='text/css' media='screen'><!--\n";
73 $s .= $this->doGetUserStyles();
74 $s .= "//--></style>\n";
75 return $s;
78 function doGetUserStyles()
80 global $wgUser;
82 $s = "";
83 if ( 1 == $wgUser->getOption( "underline" ) ) {
84 # Don't override browser settings
85 } else {
86 # Force no underline
87 $s .= "a.stub, a.new, a.internal, a.external { " .
88 "text-decoration: none; }\n";
90 if ( 1 == $wgUser->getOption( "highlightbroken" ) ) {
91 $s .= "a.new, #quickbar a.new { color: #CC2200; }\n";
93 if ( 1 == $wgUser->getOption( "justify" ) ) {
94 $s .= "#article { text-align: justify; }\n";
96 return $s;
99 function getBodyOptions()
101 global $wgUser, $wgTitle, $wgNamespaceBackgrounds, $wgOut, $oldid, $redirect, $diff,$action;
103 if ( 0 != $wgTitle->getNamespace() ) {
104 $a = array( "bgcolor" => "#FFFFDD" );
106 else $a = array( "bgcolor" => "#FFFFFF" );
107 if($wgOut->isArticle() && $wgUser->getOption("editondblclick")
109 (!$wgTitle->isProtected() || $wgUser->isSysop())
112 $n = $wgTitle->getPrefixedURL();
113 $t = wfMsg( "editthispage" );
114 $oid = $red = "";
115 if ( $redirect ) { $red = "&redirect={$redirect}"; }
116 if ( $oldid && ! isset( $diff ) ) {
117 $oid = "&oldid={$oldid}";
119 $s = wfLocalUrlE($n,"action=edit{$oid}{$red}");
120 $s = "document.location = \"" .$s ."\";";
121 $a += array ("ondblclick" => $s);
124 if($action=="edit") { # set focus in edit box
125 $a += array("onLoad"=>"document.editform.wpTextbox1.focus()");
127 return $a;
130 function getExternalLinkAttributes( $link, $text )
132 global $wgUser, $wgOut, $wgLang;
134 $link = urldecode( $link );
135 $link = $wgLang->checkTitleEncoding( $link );
136 $link = str_replace( "_", " ", $link );
137 $link = wfEscapeHTML( $link );
139 if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
140 else { $r = " class='external'"; }
142 if ( 1 == $wgUser->getOption( "hover" ) ) {
143 $r .= " title=\"{$link}\"";
145 return $r;
148 function getInternalLinkAttributes( $link, $text, $broken = false )
150 global $wgUser, $wgOut;
152 $link = urldecode( $link );
153 $link = str_replace( "_", " ", $link );
154 $link = wfEscapeHTML( $link );
156 if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
157 else if ( $broken == "stub" ) { $r = " class='stub'"; }
158 else if ( $broken == "yes" ) { $r = " class='new'"; }
159 else { $r = " class='internal'"; }
161 if ( 1 == $wgUser->getOption( "hover" ) ) {
162 $r .= " title=\"{$link}\"";
164 return $r;
167 function getLogo()
169 global $wgLogo;
170 return $wgLogo;
173 # This will be called immediately after the <body> tag. Split into
174 # two functions to make it easier to subclass.
176 function beforeContent()
178 global $wgUser, $wgOut;
180 if ( $wgOut->isPrintable() ) {
181 $s = $this->pageTitle() . $this->pageSubtitle() . "\n";
182 $s .= "\n<div class='bodytext'>";
183 return $s;
185 return $this->doBeforeContent();
188 function doBeforeContent()
190 global $wgUser, $wgOut, $wgTitle, $wgLang;
191 wfProfileIn( "Skin::doBeforeContent" );
193 $s = "";
194 $qb = $this->qbSetting();
196 if( $langlinks = $this->otherLanguages() ) {
197 $rows = 2;
198 $borderhack = "";
199 } else {
200 $rows = 1;
201 $langlinks = false;
202 $borderhack = "class='top'";
205 $s .= "\n<div id='content'>\n<div id='topbar'>" .
206 "<table width='98%' border=0 cellspacing=0><tr>";
208 $shove = ($qb != 0);
209 $left = ($qb == 1 || $qb == 3);
210 if($wgLang->isRTL()) $left = !$left;
212 if ( !$shove ) {
213 $s .= "<td class='top' align=left valign=top rowspan='{$rows}'>" .
214 $this->logoText() . "</td>";
215 } elseif( $left ) {
216 $s .= $this->getQuickbarCompensator( $rows );
218 $l = $wgLang->isRTL() ? "right" : "left";
219 $s .= "<td {$borderhack} align='$l' valign='top'>";
221 $s .= $this->topLinks() ;
222 $s .= "<p class='subtitle'>" . $this->pageTitleLinks();
224 $r = $wgLang->isRTL() ? "left" : "right";
225 $s .= "</td>\n<td {$borderhack} valign='top' align='$r' nowrap>";
226 $s .= $this->nameAndLogin();
227 $s .= "\n<br>" . $this->searchForm() . "</td>";
229 if ( $langlinks ) {
230 $s .= "</tr>\n<tr><td class='top' colspan=\"2\">$langlinks</td>";
233 if ( $shove && !$left ) { # Right
234 $s .= $this->getQuickbarCompensator( $rows );
236 $s .= "</tr></table>\n</div>\n";
237 $s .= "\n<div id='article'>";
239 $s .= $this->pageTitle();
240 $s .= $this->pageSubtitle() . "\n<p>";
241 wfProfileOut();
242 return $s;
245 function getQuickbarCompensator( $rows = 1 )
247 return "<td width='152' rowspan='{$rows}'>&nbsp;</td>";
250 # This gets called immediately before the </body> tag.
252 function afterContent()
254 global $wgUser, $wgOut, $wgServer, $HTTP_SERVER_VARS;
256 if ( $wgOut->isPrintable() ) {
257 $s = "\n</div>\n";
259 $u = $wgServer . $HTTP_SERVER_VARS['REQUEST_URI'];
260 $u = preg_replace( "/[?&]printable=yes/", "", $u );
261 $rf = str_replace( "$1", $u, wfMsg( "retrievedfrom" ) );
263 if ( $wgOut->isArticle() ) {
264 $lm = "<br>" . $this->lastModified();
265 } else { $lm = ""; }
267 $s .= "<p><em>{$rf}{$lm}</em>\n";
268 return $s;
270 return $this->doAfterContent();
273 function doAfterContent()
275 global $wgUser, $wgOut, $wgLang;
276 wfProfileIn( "Skin::doAfterContent" );
278 $s = "\n</div><br clear=all>\n";
280 $s .= "\n<div id='footer'>";
281 $s .= "<table width='98%' border=0 cellspacing=0><tr>";
283 $qb = $this->qbSetting();
284 $shove = ($qb != 0);
285 $left = ($qb == 1 || $qb == 3);
286 if($wgLang->isRTL()) $left = !$left;
288 if ( $shove && $left ) { # Left
289 $s .= $this->getQuickbarCompensator();
291 $l = $wgLang->isRTL() ? "right" : "left";
292 $s .= "<td class='bottom' align='$l' valign='top'>";
294 $s .= $this->bottomLinks();
295 $s .= "\n<br>" . $this->mainPageLink()
296 . " | " . $this->aboutLink()
297 . " | " . $this->specialLink( "recentchanges" )
298 . " | " . $this->searchForm()
299 . "<br>" . $this->pageStats();
301 $s .= "</td>";
302 if ( $shove && !$left ) { # Right
303 $s .= $this->getQuickbarCompensator();
305 $s .= "</tr></table>\n</div>\n</div>\n";
307 if ( 0 != $qb ) { $s .= $this->quickBar(); }
308 wfProfileOut();
309 return $s;
312 function pageTitleLinks()
314 global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang;
316 $s = $this->printableLink();
318 if ( $wgOut->isArticle() ) {
319 if ( $wgTitle->getNamespace() == Namespace::getImage() ) {
320 $name = $wgTitle->getDBkey();
321 $link = wfEscapeHTML( wfImageUrl( $name ) );
322 $style = $this->getInternalLinkAttributes( $link, $name );
323 $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
326 if ( "history" == $action || isset( $diff ) || isset( $oldid ) ) {
327 $s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(),
328 wfMsg( "currentrev" ) );
331 if ( $wgUser->getNewtalk() ) {
332 # do not show "You have new messages" text when we are viewing our
333 # own talk page
335 if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 &&
336 $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) {
337 $n =$wgUser->getName();
338 $tl = $this->makeKnownLink( $wgLang->getNsText(
339 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
340 wfMsg("newmessageslink") );
341 $s.=" | <strong>". str_replace( "$1", $tl, wfMsg("newmessages") ) . "</strong>";
344 return $s;
347 function printableLink()
349 global $wgOut, $wgTitle, $oldid, $action;
351 if ( "history" == $action ) { $q = "action=history&"; }
352 else { $q = ""; }
354 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
355 WfMsg( "printableversion" ), "{$q}printable=yes" );
356 return $s;
359 function pageTitle()
361 global $wgOut, $wgTitle;
363 $s = "<h1 class='pagetitle'>" . $wgOut->getPageTitle() . "</h1>";
364 return $s;
367 function pageSubtitle()
369 global $wgOut,$wgTitle,$wgNamespacesWithSubpages;
371 $sub = $wgOut->getSubtitle();
372 if ( "" == $sub ) { $sub = wfMsg( "fromwikipedia" ); }
373 if($wgOut->isArticle() && $wgNamespacesWithSubpages[$wgTitle->getNamespace()]) {
374 $ptext=$wgTitle->getPrefixedText();
375 if(preg_match("/\//",$ptext)) {
376 $sub.="</p><p class='subpages'>";
377 $links=explode("/",$ptext);
378 $c=0;
379 $growinglink="";
380 foreach($links as $link) {
381 $c++;
382 if ($c<count($links)) {
383 $growinglink.=$link;
384 $getlink=$this->makeLink($growinglink,$link);
385 if(preg_match("/class='new'/i",$getlink)) { break; } # this is a hack, but it saves time
386 if ($c>1) {
387 $sub .= " | ";
388 } else {
389 $sub .="&lt; ";
391 $sub .= $getlink;
392 $growinglink.="/";
398 $s = "<p class='subtitle'>{$sub}\n";
399 return $s;
402 function nameAndLogin()
404 global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader;
406 $li = $wgLang->specialPage( "Userlogin" );
407 $lo = $wgLang->specialPage( "Userlogout" );
409 $s = "";
410 if ( 0 == $wgUser->getID() ) {
411 if( $wgShowIPinHeader ) {
412 $n = getenv( "REMOTE_ADDR" );
414 $tl = $this->makeKnownLink( $wgLang->getNsText(
415 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
416 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
418 $s .= $n . " (".$tl.")";
419 } else {
420 $s .= wfMsg("notloggedin");
423 $rt = $wgTitle->getPrefixedURL();
424 if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) {
425 $q = "";
426 } else { $q = "returnto={$rt}"; }
428 $s .= "\n<br>" . $this->makeKnownLink( $li,
429 wfMsg( "login" ), $q );
430 } else {
431 $n = $wgUser->getName();
432 $rt = $wgTitle->getPrefixedURL();
433 $tl = $this->makeKnownLink( $wgLang->getNsText(
434 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
435 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
437 $tl = " ({$tl})";
439 $s .= $this->makeKnownLink( $wgLang->getNsText(
440 Namespace::getUser() ) . ":{$n}", $n ) . "{$tl}<br>" .
441 $this->makeKnownLink( $lo, wfMsg( "logout" ),
442 "returnto={$rt}" ) . " | " .
443 $this->specialLink( "preferences" );
445 $s .= " | " . $this->makeKnownLink( wfMsg( "helppage" ),
446 wfMsg( "help" ) );
448 return $s;
451 function searchForm()
453 global $search;
455 $s = "<form name='search' class='inline' method=get action=\""
456 . wfLocalUrl( "" ) . "\">"
457 . "<input type=text name=\"search\" size=19 value=\""
458 . htmlspecialchars(substr($search,0,256)) . "\">\n"
459 . "<input type=submit name=\"go\" value=\"" . wfMsg ("go") . "\">&nbsp;"
460 . "<input type=submit value=\"" . wfMsg ("search") . "\"></form>";
462 return $s;
465 function topLinks()
467 global $wgOut;
468 $sep = " |\n";
470 $s = $this->mainPageLink() . $sep
471 . $this->specialLink( "recentchanges" );
473 if ( $wgOut->isArticle() ) {
474 $s .= $sep . $this->editThisPage()
475 . $sep . $this->historyLink();
477 $s .= $sep . $this->specialPagesList();
479 return $s;
482 function bottomLinks()
484 global $wgOut, $wgUser, $wgTitle;
485 $sep = " |\n";
487 $s = "";
488 if ( $wgOut->isArticle() ) {
489 $s .= "<strong>" . $this->editThisPage() . "</strong>";
490 if ( 0 != $wgUser->getID() ) {
491 $s .= $sep . $this->watchThisPage();
493 $s .= $sep . $this->talkLink()
494 . $sep . $this->historyLink()
495 . $sep . $this->whatLinksHere()
496 . $sep . $this->watchPageLinksLink();
498 if ( $wgTitle->getNamespace() == Namespace::getUser()
499 || $wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser()) )
502 $id=User::idFromName($wgTitle->getText());
503 $ip=User::isIP($wgTitle->getText());
505 if($id || $ip) { # both anons and non-anons have contri list
506 $s .= $sep . $this->userContribsLink();
508 if ( 0 != $wgUser->getID() ) { # show only to signed in users
509 if($id) { # can only email non-anons
510 $s .= $sep . $this->emailUserLink();
514 if ( $wgUser->isSysop() && $wgTitle->getArticleId() ) {
515 $s .= "\n<br>" . $this->deleteThisPage() .
516 $sep . $this->protectThisPage() .
517 $sep . $this->moveThisPage();
519 $s .= "<br>\n" . $this->otherLanguages();
521 return $s;
524 function pageStats()
526 global $wgOut, $wgLang, $wgArticle;
527 global $oldid, $diff, $wgDisableCounters;
529 if ( ! $wgOut->isArticle() ) { return ""; }
530 if ( isset( $oldid ) || isset( $diff ) ) { return ""; }
531 if ( 0 == $wgArticle->getID() ) { return ""; }
533 if ( $wgDisableCounters ) {
534 $s = "";
535 } else {
536 $count = $wgArticle->getCount();
537 $s = str_replace( "$1", $count, wfMsg( "viewcount" ) );
539 $s .= $this->lastModified();
540 $s .= " " . wfMsg( "gnunote" );
541 return "<span id='pagestats'>{$s}</span>";
544 function lastModified()
546 global $wgLang, $wgArticle;
548 $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true );
549 $s = " " . str_replace( "$1", $d, wfMsg( "lastmodified" ) );
550 return $s;
553 function logoText( $align = "" )
555 if ( "" != $align ) { $a = " align='{$align}'"; }
556 else { $a = ""; }
558 $mp = wfMsg( "mainpage" );
559 $s = "<a href=\"" . wfLocalUrlE( $mp ) . "\"><img{$a} border=0 src=\""
560 . $this->getLogo() . "\" alt=\"" . "[{$mp}]\"></a>";
561 return $s;
564 function quickBar()
566 global $wgOut, $wgTitle, $wgUser, $action, $wgLang;
567 global $wpPreview;
568 wfProfileIn( "Skin::quickBar" );
570 $s = "\n<div id='quickbar'>";
571 $s .= "\n" . $this->logoText() . "\n<hr>";
573 $sep = "\n<br>";
574 $s .= $this->mainPageLink()
575 . $sep . $this->specialLink( "recentchanges" )
576 . $sep . $this->specialLink( "randompage" );
577 if ($wgUser->getID()) {
578 $s.= $sep . $this->specialLink( "watchlist" ) ;
579 $s .= $sep .$this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
580 wfMsg( "mycontris" ), "target=" . wfUrlencode($wgUser->getName() ) );
583 // only show watchlist link if logged in
584 if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
585 $s .= "\n<hr>";
586 $articleExists = $wgTitle->getArticleId();
587 if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) {
589 if($wgOut->isArticle()) {
590 $s .= "<strong>" . $this->editThisPage() . "</strong>";
591 } else { # backlink to the article in edit or history mode
593 if($articleExists){ # no backlink if no article
594 $tns=$wgTitle->getNamespace();
595 switch($tns) {
596 case 0:
597 $text = wfMsg("articlepage");
598 break;
599 case 1:
600 $text = wfMsg("viewtalkpage");
601 break;
602 case 2:
603 $text = wfMsg("userpage");
604 break;
605 case 3:
606 $text = wfMsg("viewtalkpage");
607 break;
608 case 4:
609 $text = wfMsg("wikipediapage");
610 break;
611 case 5:
612 $text = wfMsg("viewtalkpage");
613 break;
614 case 6:
615 $text = wfMsg("imagepage");
616 break;
617 case 7:
618 $text = wfMsg("viewtalkpage");
619 break;
620 default:
621 $text= wfMsg("articlepage");
624 $link = $wgTitle->getText();
625 if ($nstext = $wgLang->getNsText($tns) ) { # add namespace if necessary
626 $link = $nstext . ":" . $link ;
628 $s .= $this->makeLink($link, $text );
629 } elseif( $wgTitle->getNamespace() != Namespace::getSpecial() ) {
630 # we just throw in a "New page" text to tell the user that he's in edit mode,
631 # and to avoid messing with the separator that is prepended to the next item
632 $s .= "<strong>" . wfMsg("newpage") . "</strong>";
638 watching could cause problems in edit mode:
639 if user edits article, then loads "watch this article" in background and then saves
640 article with "Watch this article" checkbox disabled, the article is transparently
641 unwatched. Therefore we do not show the "Watch this page" link in edit mode
643 if ( 0 != $wgUser->getID() && $articleExists) {
644 if($action!="edit" && $action!="history" &&
645 $action != "submit" )
646 {$s .= $sep . $this->watchThisPage(); }
647 if ( $wgTitle->userCanEdit() ) $s .= $sep . $this->moveThisPage();
649 if ( $wgUser->isSysop() and $articleExists ) {
650 $s .= $sep . $this->deleteThisPage() .
651 $sep . $this->protectThisPage();
653 $s .= $sep . $this->talkLink();
654 if ($articleExists && $action !="history") { $s .= $sep . $this->historyLink();}
655 $s.=$sep . $this->whatLinksHere();
657 if($wgOut->isArticle()) {
658 $s .= $sep . $this->watchPageLinksLink();
661 if ( Namespace::getUser() == $wgTitle->getNamespace()
662 || $wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser())
665 $id=User::idFromName($wgTitle->getText());
666 $ip=User::isIP($wgTitle->getText());
668 if($id||$ip) {
669 $s .= $sep . $this->userContribsLink();
671 if ( 0 != $wgUser->getID() ) {
672 if($id) { # can only email real users
673 $s .= $sep . $this->emailUserLink();
677 $s .= "\n<hr>";
680 if ( 0 != $wgUser->getID() ) {
681 $s .= $this->specialLink( "upload" ) . $sep;
683 $s .= $this->specialLink( "specialpages" )
684 . $sep . $this->bugReportsLink();
686 $s .= "\n</div>\n";
687 wfProfileOut();
688 return $s;
691 function specialPagesList()
693 global $wgUser, $wgOut, $wgLang, $wgServer, $wgRedirectScript;
694 $a = array();
696 $validSP = $wgLang->getValidSpecialPages();
698 foreach ( $validSP as $name => $desc ) {
699 if ( "" == $desc ) { continue; }
700 $a[$name] = $desc;
702 if ( $wgUser->isSysop() )
704 $sysopSP = $wgLang->getSysopSpecialPages();
706 foreach ( $sysopSP as $name => $desc ) {
707 if ( "" == $desc ) { continue; }
708 $a[$name] = $desc ;
711 if ( $wgUser->isDeveloper() )
713 $devSP = $wgLang->getDeveloperSpecialPages();
715 foreach ( $devSP as $name => $desc ) {
716 if ( "" == $desc ) { continue; }
717 $a[$name] = $desc ;
720 $go = wfMsg( "go" );
721 $sp = wfMsg( "specialpages" );
722 $spp = $wgLang->specialPage( "Specialpages" );
724 $s = "<form id=\"specialpages\" method=\"get\" class=\"inline\" " .
725 "action=\"{$wgServer}{$wgRedirectScript}\">\n";
726 $s .= "<select name=\"wpDropdown\">\n";
727 $s .= "<option value=\"{$spp}\">{$sp}</option>\n";
729 foreach ( $a as $name => $desc ) {
730 $p = $wgLang->specialPage( $name );
731 $s .= "<option value=\"{$p}\">{$desc}</option>\n";
733 $s .= "</select>\n";
734 $s .= "<input type=submit value=\"{$go}\" name=redirect>\n";
735 $s .= "</form>\n";
736 return $s;
739 function mainPageLink()
741 $mp = wfMsg( "mainpage" );
742 $s = $this->makeKnownLink( $mp, $mp );
743 return $s;
746 function copyrightLink()
748 $s = $this->makeKnownLink( wfMsg( "copyrightpage" ),
749 wfMsg( "copyrightpagename" ) );
750 return $s;
753 function aboutLink()
755 $s = $this->makeKnownLink( wfMsg( "aboutpage" ),
756 wfMsg( "aboutwikipedia" ) );
757 return $s;
760 function editThisPage()
762 global $wgOut, $wgTitle, $oldid, $redirect, $diff;
764 if ( ! $wgOut->isArticle() || $diff ) {
765 $s = wfMsg( "protectedpage" );
766 } else if ( $wgTitle->userCanEdit() ) {
767 $n = $wgTitle->getPrefixedText();
768 $t = wfMsg( "editthispage" );
769 $oid = $red = "";
771 if ( $redirect ) { $red = "&redirect={$redirect}"; }
772 if ( $oldid && ! isset( $diff ) ) {
773 $oid = "&oldid={$oldid}";
775 $s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" );
776 } else {
777 $s = wfMsg( "protectedpage" );
779 return $s;
782 function deleteThisPage()
784 global $wgUser, $wgOut, $wgTitle, $diff;
786 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
787 $n = $wgTitle->getPrefixedText();
788 $t = wfMsg( "deletethispage" );
790 $s = $this->makeKnownLink( $n, $t, "action=delete" );
791 } else {
792 $s = wfMsg( "error" );
794 return $s;
797 function protectThisPage()
799 global $wgUser, $wgOut, $wgTitle, $diff;
801 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
802 $n = $wgTitle->getPrefixedText();
804 if ( $wgTitle->isProtected() ) {
805 $t = wfMsg( "unprotectthispage" );
806 $q = "action=unprotect";
807 } else {
808 $t = wfMsg( "protectthispage" );
809 $q = "action=protect";
811 $s = $this->makeKnownLink( $n, $t, $q );
812 } else {
813 $s = wfMsg( "error" );
815 return $s;
818 function watchThisPage()
820 global $wgUser, $wgOut, $wgTitle, $diff;
822 if ( $wgOut->isArticle() && ( ! $diff ) ) {
823 $n = $wgTitle->getPrefixedText();
825 if ( $wgTitle->userIsWatching() ) {
826 $t = wfMsg( "unwatchthispage" );
827 $q = "action=unwatch";
828 } else {
829 $t = wfMsg( "watchthispage" );
830 $q = "action=watch";
832 $s = $this->makeKnownLink( $n, $t, $q );
833 } else {
834 $s = wfMsg( "notanarticle" );
836 return $s;
839 function moveThisPage()
841 global $wgTitle, $wgLang;
843 if ( $wgTitle->userCanEdit() ) {
844 $s = $this->makeKnownLink( $wgLang->specialPage( "Movepage" ),
845 wfMsg( "movethispage" ), "target=" . $wgTitle->getPrefixedURL() );
846 } // no message if page is protected - would be redundant
847 return $s;
850 function historyLink()
852 global $wgTitle;
854 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
855 wfMsg( "history" ), "action=history" );
856 return $s;
859 function whatLinksHere()
861 global $wgTitle, $wgLang;
863 $s = $this->makeKnownLink( $wgLang->specialPage( "Whatlinkshere" ),
864 wfMsg( "whatlinkshere" ), "target=" . $wgTitle->getPrefixedURL() );
865 return $s;
868 function userContribsLink()
870 global $wgTitle, $wgLang;
872 $s = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
873 wfMsg( "contributions" ), "target=" . $wgTitle->getURL() );
874 return $s;
877 function emailUserLink()
879 global $wgTitle, $wgLang;
881 $s = $this->makeKnownLink( $wgLang->specialPage( "Emailuser" ),
882 wfMsg( "emailuser" ), "target=" . $wgTitle->getURL() );
883 return $s;
886 function watchPageLinksLink()
888 global $wgOut, $wgTitle, $wgLang;
890 if ( ! $wgOut->isArticle() ) {
891 $s = "(" . wfMsg( "notanarticle" ) . ")";
892 } else {
893 $s = $this->makeKnownLink( $wgLang->specialPage(
894 "Recentchangeslinked" ), wfMsg( "recentchangeslinked" ),
895 "target=" . $wgTitle->getPrefixedURL() );
897 return $s;
900 function otherLanguages()
902 global $wgOut, $wgLang, $wgTitle , $wgUseNewInterlanguage ;
904 $a = $wgOut->getLanguageLinks();
905 if ( 0 == count( $a ) ) {
906 if ( !$wgUseNewInterlanguage ) return "";
907 $ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ;
908 if ( $ns != 0 AND $ns != 1 ) return "" ;
909 $pn = "Intl" ;
910 $x = "mode=addlink&xt=".$wgTitle->getDBkey() ;
911 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
912 wfMsg( "intl" ) , $x );
915 if ( !$wgUseNewInterlanguage ) {
916 $s = wfMsg( "otherlanguages" ) . ": ";
917 } else {
918 global $wgLanguageCode ;
919 $x = "mode=zoom&xt=".$wgTitle->getDBkey() ;
920 $x .= "&xl=".$wgLanguageCode ;
921 $s = $this->makeKnownLink( $wgLang->specialPage( "Intl" ),
922 wfMsg( "otherlanguages" ) , $x ) . ": " ;
925 $first = true;
926 foreach( $a as $l ) {
927 if ( ! $first ) { $s .= " | "; }
928 $first = false;
930 $nt = Title::newFromText( $l );
931 $url = $nt->getFullURL();
932 $text = $wgLang->getLanguageName( $nt->getInterwiki() );
934 if ( "" == $text ) { $text = $l; }
935 $style = $this->getExternalLinkAttributes( $l, $text );
936 $s .= "<a href=\"{$url}\"{$style}>{$text}</a>";
938 return $s;
941 function bugReportsLink()
943 $s = $this->makeKnownLink( wfMsg( "bugreportspage" ),
944 wfMsg( "bugreports" ) );
945 return $s;
948 function dateLink()
950 global $wgLinkCache;
951 $t1 = Title::newFromText( gmdate( "F j" ) );
952 $t2 = Title::newFromText( gmdate( "Y" ) );
954 $wgLinkCache->suspend();
955 $id = $t1->getArticleID();
956 $wgLinkCache->resume();
958 if ( 0 == $id ) {
959 $s = $this->makeBrokenLink( $t1->getText() );
960 } else {
961 $s = $this->makeKnownLink( $t1->getText() );
963 $s .= ", ";
965 $wgLinkCache->suspend();
966 $id = $t2->getArticleID();
967 $wgLinkCache->resume();
969 if ( 0 == $id ) {
970 $s .= $this->makeBrokenLink( $t2->getText() );
971 } else {
972 $s .= $this->makeKnownLink( $t2->getText() );
974 return $s;
977 function talkLink()
979 global $wgLang, $wgTitle, $wgLinkCache;
981 $tns = $wgTitle->getNamespace();
982 if ( -1 == $tns ) { return ""; }
984 $pn = $wgTitle->getText();
985 $tp = wfMsg( "talkpage" );
986 if ( Namespace::isTalk( $tns ) ) {
987 $lns = Namespace::getSubject( $tns );
988 switch($tns) {
989 case 1:
990 $text = wfMsg("articlepage");
991 break;
992 case 3:
993 $text = wfMsg("userpage");
994 break;
995 case 5:
996 $text = wfMsg("wikipediapage");
997 break;
998 case 7:
999 $text = wfMsg("imagepage");
1000 break;
1001 default:
1002 $text= wfMsg("articlepage");
1004 } else {
1006 $lns = Namespace::getTalk( $tns );
1007 $text=$tp;
1009 $n = $wgLang->getNsText( $lns );
1010 if ( "" == $n ) { $link = $pn; }
1011 else { $link = "{$n}:{$pn}"; }
1013 $wgLinkCache->suspend();
1014 $s = $this->makeLink( $link, $text );
1015 $wgLinkCache->resume();
1017 return $s;
1020 # After all the page content is transformed into HTML, it makes
1021 # a final pass through here for things like table backgrounds.
1023 function transformContent( $text )
1025 return $text;
1028 # Note: This function MUST call getArticleID() on the link,
1029 # otherwise the cache won't get updated properly. See LINKCACHE.DOC.
1031 function makeLink( $title, $text= "", $query = "", $trail = "" )
1033 global $wgOut, $wgUser;
1035 $nt = Title::newFromText( $title );
1037 if ( $nt->isExternal() ) {
1038 $u = $nt->getFullURL();
1039 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1040 $style = $this->getExternalLinkAttributes( $link, $text );
1042 $inside = "";
1043 if ( "" != $trail ) {
1044 if ( preg_match( "/^([a-z]+)(.*)$$/sD", $trail, $m ) ) {
1045 $inside = $m[1];
1046 $trail = $m[2];
1049 return "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1051 if ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
1052 return $this->makeKnownLink( $title, $text, $query, $trail );
1054 if ( ( -1 == $nt->getNamespace() ) ||
1055 ( Namespace::getImage() == $nt->getNamespace() ) ) {
1056 return $this->makeKnownLink( $title, $text, $query, $trail );
1058 $aid = $nt->getArticleID() ;
1059 if ( 0 == $aid ) {
1060 return $this->makeBrokenLink( $title, $text, $query, $trail );
1061 } else {
1062 $threshold = $wgUser->getOption("stubthreshold") ;
1063 if ( $threshold > 0 ) {
1064 $res = wfQuery ( "SELECT HIGH_PRIORITY length(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'" ) ;
1066 if ( wfNumRows( $res ) > 0 ) {
1067 $s = wfFetchObject( $res );
1068 $size = $s->x;
1069 if ( $s->cur_is_redirect OR $s->cur_namespace != 0 )
1070 $size = $threshold*2 ; # Really big
1071 wfFreeResult( $res );
1072 } else $size = $threshold*2 ; # Really big
1073 } else $size = 1 ;
1075 if ( $size < $threshold )
1076 return $this->makeStubLink( $title, $text, $query, $trail );
1077 return $this->makeKnownLink( $title, $text, $query, $trail );
1081 function makeKnownLink( $title, $text = "", $query = "", $trail = "" )
1083 global $wgOut, $wgTitle;
1085 $nt = Title::newFromText( $title );
1086 $link = $nt->getPrefixedURL();
1088 if ( "" == $link ) {
1089 $u = "";
1090 if ( "" == $text ) { $text = $nt->getFragment(); }
1091 } else {
1092 $u = wfLocalUrlE( $link, $query );
1094 if ( "" != $nt->getFragment() ) {
1095 $u .= "#" . wfEscapeHTML( $nt->getFragment() );
1097 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1098 $style = $this->getInternalLinkAttributes( $link, $text );
1100 $inside = "";
1101 if ( "" != $trail ) {
1102 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1103 $inside = $m[1];
1104 $trail = $m[2];
1107 $r = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1108 return $r;
1111 function makeBrokenLink( $title, $text = "", $query = "", $trail = "" )
1113 global $wgOut, $wgUser;
1115 $nt = Title::newFromText( $title );
1116 $link = $nt->getPrefixedURL();
1118 if ( "" == $query ) { $q = "action=edit"; }
1119 else { $q = "action=edit&{$query}"; }
1120 $u = wfLocalUrlE( $link, $q );
1122 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1123 $style = $this->getInternalLinkAttributes( $link, $text, "yes" );
1125 $inside = "";
1126 if ( "" != $trail ) {
1127 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1128 $inside = $m[1];
1129 $trail = $m[2];
1132 if ( $wgOut->isPrintable() ||
1133 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1134 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1135 } else {
1136 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
1138 return $s;
1141 function makeStubLink( $title, $text = "", $query = "", $trail = "" )
1143 global $wgOut, $wgUser;
1145 $nt = Title::newFromText( $title );
1146 $link = $nt->getPrefixedURL();
1148 $u = wfLocalUrlE( $link, $query );
1150 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1151 $style = $this->getInternalLinkAttributes( $link, $text, "stub" );
1153 $inside = "";
1154 if ( "" != $trail ) {
1155 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1156 $inside = $m[1];
1157 $trail = $m[2];
1160 if ( $wgOut->isPrintable() ||
1161 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1162 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1163 } else {
1164 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
1166 return $s;
1169 function fnamePart( $url )
1171 $basename = strrchr( $url, "/" );
1172 if ( false === $basename ) { $basename = $url; }
1173 else { $basename = substr( $basename, 1 ); }
1174 return wfEscapeHTML( $basename );
1177 function makeImage( $url, $alt = "" )
1179 global $wgOut;
1181 if ( "" == $alt ) { $alt = $this->fnamePart( $url ); }
1182 $s = "<img src=\"{$url}\" alt=\"{$alt}\">";
1183 return $s;
1186 function makeImageLink( $name, $url, $alt = "" )
1188 global $wgOut, $wgTitle, $wgLang;
1190 $nt = Title::newFromText( $wgLang->getNsText(
1191 Namespace::getImage() ) . ":{$name}" );
1192 $link = $nt->getPrefixedURL();
1193 if ( "" == $alt ) { $alt = $name; }
1195 $u = wfLocalUrlE( $link );
1196 $s = "<a href=\"{$u}\" class='image' title=\"{$alt}\">" .
1197 "<img border=0 src=\"{$url}\" alt=\"{$alt}\"></a>";
1198 return $s;
1201 function makeMediaLink( $name, $url, $alt = "" )
1203 global $wgOut, $wgTitle;
1205 if ( "" == $alt ) { $alt = $name; }
1206 $u = wfEscapeHTML( $url );
1207 $s = "<a href=\"{$u}\" class='internal' title=\"{$alt}\">{$alt}</a>";
1208 return $s;
1211 function specialLink( $name, $key = "" )
1213 global $wgLang;
1215 if ( "" == $key ) { $key = strtolower( $name ); }
1216 $pn = $wgLang->ucfirst( $name );
1217 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
1218 wfMsg( $key ) );
1221 # Called by history lists and recent changes
1224 function beginRecentChangesList()
1226 $rc_cache = array() ;
1227 $rccc = 0 ;
1228 $this->lastdate = "";
1229 return "";
1232 function beginHistoryList()
1234 $this->lastdate = $this->lastline = "";
1235 $s = "\n<p>" . wfMsg( "histlegend" ) . "\n<ul>";
1236 return $s;
1239 function beginImageHistoryList()
1241 $s = "\n<h2>" . wfMsg( "imghistory" ) . "</h2>\n" .
1242 "<p>" . wfMsg( "imghistlegend" ) . "\n<ul>";
1243 return $s;
1246 function endRecentChangesList()
1248 $s = $this->recentChangesBlock() ;
1249 $s .= "</ul>\n";
1250 return $s;
1253 function endHistoryList()
1255 $last = wfMsg( "last" );
1257 $s = preg_replace( "/!OLDID![0-9]+!/", $last, $this->lastline );
1258 $s .= "</ul>\n";
1259 return $s;
1262 function endImageHistoryList()
1264 $s = "</ul>\n";
1265 return $s;
1268 function historyLine( $ts, $u, $ut, $ns, $ttl, $oid, $c, $isminor )
1270 global $wgLang;
1272 $artname = Title::makeName( $ns, $ttl );
1273 $last = wfMsg( "last" );
1274 $cur = wfMsg( "cur" );
1275 $cr = wfMsg( "currentrev" );
1277 if ( $oid && $this->lastline ) {
1278 $ret = preg_replace( "/!OLDID!([0-9]+)!/", $this->makeKnownLink(
1279 $artname, $last, "diff=\\1&oldid={$oid}" ), $this->lastline );
1280 } else {
1281 $ret = "";
1283 $dt = $wgLang->timeanddate( $ts, true );
1285 if ( $oid ) { $q = "oldid={$oid}"; }
1286 else { $q = ""; }
1287 $link = $this->makeKnownLink( $artname, $dt, $q );
1289 if ( 0 == $u ) {
1290 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1291 $ut, "target=" . $ut );
1292 } else { $ul = $this->makeLink( $wgLang->getNsText(
1293 Namespace::getUser() ) . ":{$ut}", $ut ); }
1295 $s = "<li>";
1296 if ( $oid ) {
1297 $curlink = $this->makeKnownLink( $artname, $cur,
1298 "diff=0&oldid={$oid}" );
1299 } else {
1300 $curlink = $cur;
1302 $s .= "({$curlink}) (!OLDID!{$oid}!) . .";
1304 $M = wfMsg( "minoreditletter" );
1305 if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
1306 $s .= " {$link} . . {$ul}";
1308 if ( "" != $c && "*" != $c ) { $s .= " <em>(" . wfEscapeHTML($c) . ")</em>"; }
1309 $s .= "</li>\n";
1311 $this->lastline = $s;
1312 return $ret;
1315 function recentChangesBlockLine ( $y ) {
1316 global $wgUploadPath ;
1318 $M = wfMsg( "minoreditletter" );
1319 $N = wfMsg( "newpageletter" );
1320 $r = "" ;
1321 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>" ;
1322 $r .= "<tt>" ;
1323 if ( $y->isnew ) $r .= $N ;
1324 else $r .= "&nbsp;" ;
1325 if ( $y->isminor ) $r .= $M ;
1326 else $r .= "&nbsp;" ;
1327 $r .= " ".$y->timestamp." " ;
1328 $r .= "</tt>" ;
1329 $link = $y->link ;
1330 if ( $y->watched ) $link = "<strong>{$link}</strong>" ;
1331 $r .= $link ;
1333 $r .= " (" ;
1334 $r .= $y->curlink ;
1335 $r .= "; " ;
1336 $r .= $this->makeKnownLink( $y->secureName, wfMsg( "hist" ), "action=history" );
1338 $r .= ") . . ".$y->userlink ;
1339 $r .= $y->usertalklink ;
1340 if ( $y->usercomment != "" )
1341 $r .= " <em>(".wfEscapeHTML($y->usercomment).")</em>" ;
1342 $r .= "<br>\n" ;
1343 return $r ;
1346 function recentChangesBlockGroup ( $y ) {
1347 global $wgUploadPath ;
1349 $r = "" ;
1350 $M = wfMsg( "minoreditletter" );
1351 $N = wfMsg( "newpageletter" );
1352 $isnew = false ;
1353 $userlinks = array () ;
1354 foreach ( $y AS $x ) {
1355 $oldid = $x->diffid ;
1356 if ( $x->isnew ) $isnew = true ;
1357 $u = $x->userlink ;
1358 if ( !isset ( $userlinks[$u] ) ) $userlinks[$u] = 0 ;
1359 $userlinks[$u]++ ;
1362 krsort ( $userlinks ) ;
1363 asort ( $userlinks ) ;
1364 $users = array () ;
1365 $u = array_keys ( $userlinks ) ;
1366 foreach ( $u as $x ) {
1367 $z = $x ;
1368 if ( $userlinks[$x] > 1 ) $z .= " ({$userlinks[$x]}&times;)" ;
1369 array_push ( $users , $z ) ;
1371 $users = " <font size='-1'>[".implode("; ",$users)."]</font>" ;
1373 $e = $y ;
1374 $e = array_shift ( $e ) ;
1376 # Arrow
1377 $rci = "RCI{$this->rccc}" ;
1378 $rcl = "RCL{$this->rccc}" ;
1379 $rcm = "RCM{$this->rccc}" ;
1380 $tl = "<a href='javascript:toggleVisibility(\"{$rci}\",\"{$rcm}\",\"{$rcl}\")'>" ;
1381 $tl .= "<span id='{$rcm}'><img src='{$wgUploadPath}/Arr_r.png' width=12 height=12 border=0></span>" ;
1382 $tl .= "<span id='{$rcl}' style='display:none'><img src='{$wgUploadPath}/Arr_d.png' width=12 height=12 border=0></span>" ;
1383 $tl .= "</a>" ;
1384 $r .= $tl ;
1386 # Main line
1387 $r .= "<tt>" ;
1388 if ( $isnew ) $r .= $N ;
1389 else $r .= "&nbsp;" ;
1390 $r .= "&nbsp;" ; # Minor
1391 $r .= " ".$e->timestamp." " ;
1392 $r .= "</tt>" ;
1394 $link = $e->link ;
1395 if ( $e->watched ) $link = "<strong>{$link}</strong>" ;
1396 $r .= $link ;
1398 if ( !$e->islog ) {
1399 $r .= " (".count($y)." " ;
1400 if ( $isnew ) $r .= wfMsg("changes");
1401 else $r .= $this->makeKnownLink( $e->secureName , wfMsg("changes") , "diff=0&oldid=".$oldid ) ;
1402 $r .= "; " ;
1403 $r .= $this->makeKnownLink( $e->secureName, wfMsg( "history" ), "action=history" );
1404 $r .= ")" ;
1407 $r .= $users ;
1408 $r .= "<br>\n" ;
1410 # Sub-entries
1411 $r .= "<div id='{$rci}' style='display:none'>" ;
1412 foreach ( $y AS $x )
1414 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>";
1415 $r .= "<tt>&nbsp; &nbsp; &nbsp; &nbsp;" ;
1416 if ( $x->isnew ) $r .= $N ;
1417 else $r .= "&nbsp;" ;
1418 if ( $x->isminor ) $r .= $M ;
1419 else $r .= "&nbsp;" ;
1420 $r .= "</tt>" ;
1422 $o = "" ;
1423 if ( $x->oldid != 0 ) $o = "oldid=".$x->oldid ;
1424 if ( $x->islog ) $link = $x->timestamp ;
1425 else $link = $this->makeKnownLink( $x->secureName, $x->timestamp , $o ) ;
1426 $link = "<tt>{$link}</tt>" ;
1429 $r .= $link ;
1430 $r .= " (" ;
1431 $r .= $x->curlink ;
1432 $r .= "; " ;
1433 $r .= $x->lastlink ;
1434 $r .= ") . . ".$x->userlink ;
1435 $r .= $x->usertalklink ;
1436 if ( $x->usercomment != "" )
1437 $r .= " <em>(".wfEscapeHTML($x->usercomment).")</em>" ;
1438 $r .= "<br>\n" ;
1440 $r .= "</div>\n" ;
1442 $this->rccc++ ;
1443 return $r ;
1446 function recentChangesBlock ()
1448 global $wgUploadPath ;
1449 if ( count ( $this->rc_cache ) == 0 ) return "" ;
1450 $k = array_keys ( $this->rc_cache ) ;
1451 foreach ( $k AS $x )
1453 $y = $this->rc_cache[$x] ;
1454 if ( count ( $y ) < 2 ) {
1455 $r .= $this->recentChangesBlockLine ( array_shift ( $y ) ) ;
1456 } else {
1457 $r .= $this->recentChangesBlockGroup ( $y ) ;
1461 return "<div align=left>{$r}</div>" ;
1464 function recentChangesLine( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1466 global $wgUser ;
1467 $usenew = $wgUser->getOption( "usenewrc" );
1468 if ( $usenew )
1469 $r = $this->recentChangesLineNew ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1470 else
1471 $r = $this->recentChangesLineOld ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1472 return $r ;
1475 function recentChangesLineOld( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0, $diffid = 0 )
1477 global $wgTitle, $wgLang, $wgUser;
1479 $d = $wgLang->date( $ts, true);
1480 $s = "";
1481 if ( $d != $this->lastdate ) {
1482 if ( "" != $this->lastdate ) { $s .= "</ul>\n"; }
1483 $s .= "<h4>{$d}</h4>\n<ul>";
1484 $this->lastdate = $d;
1486 $h = $wgLang->time( $ts, true );
1487 $t = Title::makeName( $ns, $ttl );
1488 $clink = $this->makeKnownLink( $t , "" );
1489 $nt = Title::newFromText( $t );
1491 if ( $watched ) {
1492 $clink = "<strong>{$clink}</strong>";
1494 $hlink = $this->makeKnownLink( $t, wfMsg( "hist" ), "action=history" );
1495 if ( $isnew || $nt->isLog() ) {
1496 $dlink = wfMsg( "diff" );
1497 } else {
1498 $dlink = $this->makeKnownLink( $t, wfMsg( "diff" ),
1499 "diff={$oldid}&oldid={$diffid}" ); # Finagle's law
1501 if ( 0 == $u ) {
1502 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1503 $ut, "target=" . $ut );
1504 } else { $ul = $this->makeLink( $wgLang->getNsText(
1505 Namespace::getUser() ) . ":{$ut}", $ut ); }
1507 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1508 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1509 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1510 $cr = wfMsg( "currentrev" );
1512 $s .= "<li> ({$dlink}) ({$hlink}) . .";
1513 $M = wfMsg( "minoreditletter" );
1514 $N = wfMsg( "newpageletter" );
1515 if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
1516 if ( $isnew ) { $s .= "<strong>{$N}</strong>"; }
1517 $s .= " {$clink}; {$h} . . {$ul}";
1519 $blink="";
1520 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1521 $blink = $this->makeKnownLink( $wgLang->specialPage(
1522 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1525 if(!$blink) {
1526 $utl = "({$utl})";
1527 } else {
1528 $utl = "({$utl} | {$blink})";
1530 $s.=" {$utl}";
1532 if ( "" != $c && "*" != $c ) {
1533 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
1535 $s .= "</li>\n";
1537 return $s;
1540 function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1542 global $wgTitle, $wgLang, $wgUser;
1544 $rc = new RecentChangesClass ;
1546 $d = $wgLang->date( $ts, true);
1547 $s = "";
1548 $ret = "" ;
1549 if ( $d != $this->lastdate ) {
1550 $ret = $this->recentChangesBlock () ;
1551 $this->rc_cache = array() ;
1552 $ret .= "<h4>{$d}</h4>\n";
1553 $this->lastdate = $d;
1555 $h = $wgLang->time( $ts, true );
1556 $t = Title::makeName( $ns, $ttl );
1557 $clink = $this->makeKnownLink( $t, "" ) ;
1558 if ( $oldid == 0 ) $c2link = $clink ;
1559 else $c2link = $this->makeKnownLink( $t, "" , "oldid={$oldid}" );
1560 $nt = Title::newFromText( $t );
1562 $rc->timestamp = $h ;
1563 $rc->oldid = $oldid ;
1564 $rc->diffid = $diffid ;
1565 $rc->watched = $watched ;
1566 $rc->isnew = $isnew ;
1567 $rc->isminor = $isminor ;
1568 $rc->secureName = $t ;
1569 $rc->displayName = $nt ;
1570 $rc->link = $clink ;
1571 $rc->usercomment = $c ;
1572 $rc->islog = $nt->isLog() ;
1574 if ( ( $isnew && $oldid == 0 ) || $nt->isLog() ) {
1575 $dlink = wfMsg( "cur" );
1576 } else {
1577 $dlink = $this->makeKnownLink( $t, wfMsg( "cur" ),
1578 "diff=0&oldid={$oldid}" );
1581 if ( $diffid == 0 || $nt->isLog() ) {
1582 $plink = wfMsg( "last" );
1583 } else {
1584 $plink = $this->makeKnownLink( $t, wfMsg( "last" ),
1585 "diff={$oldid}&oldid={$diffid}" );
1588 if ( 0 == $u ) {
1589 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1590 $ut, "target=" . $ut );
1591 } else { $ul = $this->makeLink( $wgLang->getNsText(
1592 Namespace::getUser() ) . ":{$ut}", $ut ); }
1594 $rc->userlink = $ul ;
1595 $rc->lastlink = $plink ;
1596 $rc->curlink = $dlink ;
1598 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1599 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1600 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1602 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1603 $blink = $this->makeKnownLink( $wgLang->specialPage(
1604 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1605 $rc->usertalklink= " ({$utl} | {$blink})";
1606 } else {
1607 $rc->usertalklink=" ({$utl})";
1610 if ( !isset ( $this->rc_cache[$t] ) ) $this->rc_cache[$t] = array() ;
1611 array_push ( $this->rc_cache[$t] , $rc ) ;
1612 return $ret;
1616 function imageHistoryLine( $iscur, $ts, $img, $u, $ut, $size, $c )
1618 global $wgUser, $wgLang, $wgTitle;
1620 $dt = $wgLang->timeanddate( $ts, true );
1621 $del = wfMsg( "deleteimg" );
1622 $cur = wfMsg( "cur" );
1624 if ( $iscur ) {
1625 $url = wfImageUrl( $img );
1626 $rlink = $cur;
1627 if ( $wgUser->isSysop() ) {
1628 $link = wfLocalUrlE( "", "image=" . $wgTitle->getURL() .
1629 "&action=delete" );
1630 $style = $this->getInternalLinkAttributes( $link, $del );
1632 $dlink = "<a href=\"{$link}\"{$style}>{$del}</a>";
1633 } else {
1634 $dlink = $del;
1636 } else {
1637 $url = wfEscapeHTML( wfImageArchiveUrl( $img ) );
1638 if( $wgUser->getID() != 0 ) {
1639 $rlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
1640 wfMsg( "revertimg" ), "action=revert&oldimage=" .
1641 urlencode( $img ) );
1642 $dlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
1643 $del, "action=delete&oldimage=" . urlencode( $img ) );
1644 } else {
1645 # Having live active links for non-logged in users
1646 # means that bots and spiders crawling our site can
1647 # inadvertently change content. Baaaad idea.
1648 $rlink = wfMsg( "revertimg" );
1649 $dlink = $del;
1652 if ( 0 == $u ) { $ul = $ut; }
1653 else { $ul = $this->makeLink( $wgLang->getNsText(
1654 Namespace::getUser() ) . ":{$ut}", $ut ); }
1656 $nb = str_replace( "$1", $size, wfMsg( "nbytes" ) );
1657 $style = $this->getInternalLinkAttributes( $url, $dt );
1659 $s = "<li> ({$dlink}) ({$rlink}) <a href=\"{$url}\"{$style}>{$dt}</a>"
1660 . " . . {$ul} ({$nb})";
1662 if ( "" != $c && "*" != $c ) {
1663 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
1665 $s .= "</li>\n";
1666 return $s;
1669 function tocIndent($level) {
1671 while($level-->0) $rv.="<div style=\"margin-left:2em;\">\n";
1672 return $rv;
1676 function tocUnindent($level) {
1677 while($level-->0) $rv.="</div>\n";
1678 return $rv;
1681 // parameter level defines if we are on an indentation level
1682 function tocLine($anchor,$tocline,$level) {
1684 if($level) {
1686 return "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n";
1687 } else {
1689 return "<div style=\"margin-bottom:0px;\">\n".
1690 "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n".
1691 "</div>\n";
1696 function tocTable($toc) {
1698 /* does not auto-expand, use table for now
1699 return "
1700 <div><div style=\"border-width:1px;background-color:#f3f3ff;border-color:#8888aa;border-style:solid;padding:1em;padding-bottom:1em;\">
1701 <b>".wfMsg("toc")."</b><P>
1702 $toc</div></div>";
1704 return
1705 "<table border=\"0\" bgcolor=\"#8888aa\" cellpadding=\"0\" cellspacing=\"1\"><tr><td>\n" .
1706 "<table border=\"0\" bgcolor=\"#f3f3ff\" CELLPADDING=5><tr><td>\n".
1707 "<b>".wfMsg("toc")."</b>" .
1708 " <script type='text/javascript'>showTocToggle(\"" . wfMsg("showtoc") . "\",\"" . wfMsg("hidetoc") . "\")</script>" .
1709 "</td></tr><tr id='tocinside'><td>\n".
1710 $toc."</td></tr></table></td></tr></table><P>\n";
1713 function editSectionLink($section) {
1715 global $wgTitle,$wgUser,$oldid;
1716 if($wgTitle->isProtected() && !$wgUser->isSysop()) return "";
1717 if($oldid) return "";
1718 $editurl="&section={$section}";
1719 $url=$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
1720 return "<div style=\"float:right;margin-left:5px;\"><small>[".$url."]</small></div>";
1725 include_once( "SkinStandard.php" );
1726 include_once( "SkinNostalgia.php" );
1727 include_once( "SkinCologneBlue.php" );