Fixed problem with image pages of non existing images
[lhc/web/wiklou.git] / includes / Skin.php
1 <?
2 # See skin.doc
3
4 # These are the INTERNAL names, which get mapped
5 # directly to class names. For display purposes, the
6 # Language class has internationalized names
7 #
8 /* private */ $wgValidSkinNames = array(
9 "Standard", "Nostalgia", "CologneBlue" #, "Smarty", "Montparnasse"
10 );
11
12 # For some odd PHP bug, this function can't be part of a class
13 function getCategories ()
14 {
15 global $wgOut , $wgTitle , $wgUseCategoryMagic , $wgUser ;
16 if ( !isset ( $wgUseCategoryMagic ) || !$wgUseCategoryMagic ) return "" ;
17 if ( count ( $wgOut->mCategoryLinks ) == 0 ) return "" ;
18 if ( !$wgOut->isArticle() ) return "" ;
19 $sk = $wgUser->getSkin() ;
20 $s = "" ;
21 $s .= "\n<br>\n";
22 $s .= $sk->makeKnownLink ( "Special:Categories" , "Categories" , "article=".$wgTitle->getDBkey() ) ;
23 $t = implode ( " | " , $wgOut->mCategoryLinks ) ;
24 if ( $t != "" ) $s .= " : " ;
25 $s .= $t ;
26 return $s ;
27 }
28
29
30 class RecentChangesClass {
31 var $secureName , $displayName , $link , $namespace ;
32 var $oldid , $diffid , $timestamp , $curlink , $lastlink , $usertalklink , $versionlink ;
33 var $usercomment , $userlink ;
34 var $isminor , $isnew , $watched , $islog ;
35 } ;
36
37 class Skin {
38
39 /* private */ var $lastdate, $lastline;
40
41 var $rc_cache ; # Cache for Enhanced Recent Changes
42 var $rccc ; # Recent Changes Cache Counter for visibility toggle
43
44
45 function Skin()
46 {
47 }
48
49 function getSkinNames()
50 {
51 global $wgValidSkinNames;
52 return $wgValidSkinNames;
53 }
54
55 function getStylesheet()
56 {
57 return "wikistandard.css";
58 }
59
60 function qbSetting()
61 {
62 global $wgOut, $wgUser;
63
64 if ( $wgOut->isQuickbarSupressed() ) { return 0; }
65 $q = $wgUser->getOption( "quickbar" );
66 if ( "" == $q ) { $q = 0; }
67 return $q;
68 }
69
70 function initPage()
71 {
72 global $wgOut, $wgStyleSheetPath;
73 $fname = "Skin::initPage";
74 wfProfileIn( $fname );
75
76 $wgOut->addLink( "shortcut icon", "", "/favicon.ico" );
77 if ( $wgOut->isPrintable() ) { $ss = "wikiprintable.css"; }
78 else { $ss = $this->getStylesheet(); }
79 $wgOut->addLink( "stylesheet", "", "{$wgStyleSheetPath}/{$ss}" );
80 wfProfileOut( $fname );
81 }
82
83 function outputPage( &$out ) {
84 global $wgDebugComments;
85
86 wfProfileIn( "Skin::outputPage" );
87 $this->initPage();
88 $out->out( $out->headElement() );
89
90 $out->out( "\n<body" );
91 $ops = $this->getBodyOptions();
92 foreach ( $ops as $name => $val ) {
93 $out->out( " $name='$val'" );
94 }
95 $out->out( ">\n" );
96 if ( $wgDebugComments ) {
97 $out->out( "<!-- Wiki debugging output:\n" .
98 $out->mDebugtext . "-->\n" );
99 }
100 $out->out( $this->beforeContent() );
101
102 $out->out( $out->mBodytext );
103
104 $out->out( $this->afterContent() );
105
106 wfProfileClose();
107 $out->out( $out->reportTime() );
108
109 $out->out( "\n</body></html>" );
110 }
111
112 function getHeadScripts() {
113 global $wgStyleSheetPath;
114 $r = "<script type=\"text/javascript\" src=\"{$wgStyleSheetPath}/wikibits.js\"></script>\n";
115 return $r;
116 }
117
118 function getUserStyles()
119 {
120 $s = "<style type='text/css'><!--\n";
121 $s .= $this->doGetUserStyles();
122 $s .= "//--></style>\n";
123 return $s;
124 }
125
126 function doGetUserStyles()
127 {
128 global $wgUser;
129
130 $s = "";
131 if ( 1 == $wgUser->getOption( "underline" ) ) {
132 # Don't override browser settings
133 } else {
134 # CHECK MERGE @@@
135 # Force no underline
136 $s .= "a.stub, a.new, a.internal, a.external { " .
137 "text-decoration: none; }\n";
138 }
139 if ( 1 == $wgUser->getOption( "highlightbroken" ) ) {
140 $s .= "a.new, #quickbar a.new { color: #CC2200; }\n";
141 }
142 if ( 1 == $wgUser->getOption( "justify" ) ) {
143 $s .= "#article { text-align: justify; }\n";
144 }
145 return $s;
146 }
147
148 function getBodyOptions()
149 {
150 global $wgUser, $wgTitle, $wgNamespaceBackgrounds, $wgOut, $oldid, $redirect, $diff,$action;
151
152 if ( 0 != $wgTitle->getNamespace() ) {
153 $a = array( "bgcolor" => "#ffffec" );
154 }
155 else $a = array( "bgcolor" => "#FFFFFF" );
156 if($wgOut->isArticle() && $wgUser->getOption("editondblclick")
157 &&
158 (!$wgTitle->isProtected() || $wgUser->isSysop())
159
160 ) {
161 $n = $wgTitle->getPrefixedURL();
162 $t = wfMsg( "editthispage" );
163 $oid = $red = "";
164 if ( $redirect ) { $red = "&redirect={$redirect}"; }
165 if ( $oldid && ! isset( $diff ) ) {
166 $oid = "&oldid={$oldid}";
167 }
168 $s = wfLocalUrlE($n,"action=edit{$oid}{$red}");
169 $s = "document.location = \"" .$s ."\";";
170 $a += array ("ondblclick" => $s);
171
172 }
173 $a['onload'] = $wgOut->getOnloadHandler();
174 return $a;
175 }
176
177 function getExternalLinkAttributes( $link, $text )
178 {
179 global $wgUser, $wgOut, $wgLang;
180
181 $link = urldecode( $link );
182 $link = $wgLang->checkTitleEncoding( $link );
183 $link = str_replace( "_", " ", $link );
184 $link = wfEscapeHTML( $link );
185
186 if ( $wgOut->isPrintable() ) { $r = " class='printable'"; }
187 else { $r = " class='external'"; }
188
189 if ( 1 == $wgUser->getOption( "hover" ) ) {
190 $r .= " title=\"{$link}\"";
191 }
192 return $r;
193 }
194
195 function getInternalLinkAttributes( $link, $text, $broken = false )
196 {
197 global $wgUser, $wgOut;
198
199 $link = urldecode( $link );
200 $link = str_replace( "_", " ", $link );
201 $link = wfEscapeHTML( $link );
202
203 if ( $wgOut->isPrintable() ) {
204 $r = " class='printable'";
205 } else if ( $broken == "stub" ) {
206 $r = " class='stub'";
207 } else if ( $broken == "yes" ) {
208 $r = " class='new'";
209 } else {
210 $r = " class='internal'";
211 }
212
213 if ( 1 == $wgUser->getOption( "hover" ) ) {
214 $r .= " title=\"{$link}\"";
215 }
216 return $r;
217 }
218
219 function getInternalLinkAttributesObj( &$nt, $text, $broken = false )
220 {
221 global $wgUser, $wgOut;
222
223 if ( $wgOut->isPrintable() ) {
224 $r = " class='printable'";
225 } else if ( $broken == "stub" ) {
226 $r = " class='stub'";
227 } else if ( $broken == "yes" ) {
228 $r = " class='new'";
229 } else {
230 $r = " class='internal'";
231 }
232
233 if ( 1 == $wgUser->getOption( "hover" ) ) {
234 $r .= ' title ="' . $nt->getEscapedText() . '"';
235 }
236 return $r;
237 }
238
239 function getLogo()
240 {
241 global $wgLogo;
242 return $wgLogo;
243 }
244
245 # This will be called immediately after the <body> tag. Split into
246 # two functions to make it easier to subclass.
247 #
248 function beforeContent()
249 {
250 global $wgUser, $wgOut, $wgSiteNotice;
251
252 if ( $wgOut->isPrintable() ) {
253 $s = $this->pageTitle() . $this->pageSubtitle() . "\n";
254 $s .= "\n<div class='bodytext'>";
255 return $s;
256 }
257 if( $wgSiteNotice ) {
258 $note = "\n<div id='notice' style='font-weight: bold; color: red; text-align: center'>$wgSiteNotice</div>\n";
259 } else {
260 $note = "";
261 }
262 return $this->doBeforeContent() . $note;
263 }
264
265 function doBeforeContent()
266 {
267 global $wgUser, $wgOut, $wgTitle, $wgLang;
268 $fname = "Skin::doBeforeContent";
269 wfProfileIn( $fname );
270
271 $s = "";
272 $qb = $this->qbSetting();
273
274 if( $langlinks = $this->otherLanguages() ) {
275 $rows = 2;
276 $borderhack = "";
277 } else {
278 $rows = 1;
279 $langlinks = false;
280 $borderhack = "class='top'";
281 }
282
283 $s .= "\n<div id='content'>\n<div id='topbar'>" .
284 "<table width='98%' border=0 cellspacing=0><tr>";
285
286 $shove = ($qb != 0);
287 $left = ($qb == 1 || $qb == 3);
288 if($wgLang->isRTL()) $left = !$left;
289
290 if ( !$shove ) {
291 $s .= "<td class='top' align=left valign=top rowspan='{$rows}'>" .
292 $this->logoText() . "</td>";
293 } elseif( $left ) {
294 $s .= $this->getQuickbarCompensator( $rows );
295 }
296 $l = $wgLang->isRTL() ? "right" : "left";
297 $s .= "<td {$borderhack} align='$l' valign='top'>";
298
299 $s .= $this->topLinks() ;
300 $s .= "<p class='subtitle'>" . $this->pageTitleLinks();
301
302 $r = $wgLang->isRTL() ? "left" : "right";
303 $s .= "</td>\n<td {$borderhack} valign='top' align='$r' nowrap>";
304 $s .= $this->nameAndLogin();
305 $s .= "\n<br>" . $this->searchForm() . "</td>";
306
307 if ( $langlinks ) {
308 $s .= "</tr>\n<tr><td class='top' colspan=\"2\">$langlinks</td>";
309 }
310
311 if ( $shove && !$left ) { # Right
312 $s .= $this->getQuickbarCompensator( $rows );
313 }
314 $s .= "</tr></table>\n</div>\n";
315 $s .= "\n<div id='article'>";
316
317 $s .= $this->pageTitle();
318 $s .= $this->pageSubtitle() ;
319 $s .= getCategories(); // For some odd reason, zhis can't be a function of the object
320 $s .= "\n<p>";
321 wfProfileOut( $fname );
322 return $s;
323 }
324
325 function getQuickbarCompensator( $rows = 1 )
326 {
327 return "<td width='152' rowspan='{$rows}'>&nbsp;</td>";
328 }
329
330 # This gets called immediately before the </body> tag.
331 #
332 function afterContent()
333 {
334 global $wgUser, $wgOut, $wgServer;
335 global $wgTitle;
336
337 if ( $wgOut->isPrintable() ) {
338 $s = "\n</div>\n";
339
340 $u = htmlspecialchars( $wgServer . $wgTitle->getFullURL() );
341 $u = "<a href=\"$u\">$u</a>";
342 $rf = wfMsg( "retrievedfrom", $u );
343
344 if ( $wgOut->isArticle() ) {
345 $lm = "<br>" . $this->lastModified();
346 } else { $lm = ""; }
347
348 $cr = wfMsg( "gnunote" );
349 $s .= "<p><em>{$rf}{$lm} {$cr}</em>\n";
350 return $s;
351 }
352 return $this->doAfterContent();
353 }
354
355 function doAfterContent()
356 {
357 global $wgUser, $wgOut, $wgLang;
358 $fname = "Skin::doAfterContent";
359 wfProfileIn( $fname );
360 wfProfileIn( "$fname-1" );
361
362 $s = "\n</div><br clear=all>\n";
363 $s .= "\n<div id='footer'>";
364 $s .= "<table width='98%' border=0 cellspacing=0><tr>";
365
366 wfProfileOut( "$fname-1" );
367 wfProfileIn( "$fname-2" );
368
369 $qb = $this->qbSetting();
370 $shove = ($qb != 0);
371 $left = ($qb == 1 || $qb == 3);
372 if($wgLang->isRTL()) $left = !$left;
373
374 if ( $shove && $left ) { # Left
375 $s .= $this->getQuickbarCompensator();
376 }
377 wfProfileOut( "$fname-2" );
378 wfProfileIn( "$fname-3" );
379 $l = $wgLang->isRTL() ? "right" : "left";
380 $s .= "<td class='bottom' align='$l' valign='top'>";
381
382 $s .= $this->bottomLinks();
383 $s .= "\n<br>" . $this->mainPageLink()
384 . " | " . $this->aboutLink()
385 . " | " . $this->specialLink( "recentchanges" )
386 . " | " . $this->searchForm()
387 . "<br>" . $this->pageStats();
388
389 $s .= "</td>";
390 if ( $shove && !$left ) { # Right
391 $s .= $this->getQuickbarCompensator();
392 }
393 $s .= "</tr></table>\n</div>\n</div>\n";
394
395 wfProfileOut( "$fname-3" );
396 wfProfileIn( "$fname-4" );
397 if ( 0 != $qb ) { $s .= $this->quickBar(); }
398 wfProfileOut( "$fname-4" );
399 wfProfileOut( $fname );
400 return $s;
401 }
402
403 function pageTitleLinks()
404 {
405 global $wgOut, $wgTitle, $oldid, $action, $diff, $wgUser, $wgLang, $wgUseApproval ;
406
407 $s = $this->printableLink();
408 if ( wfMsg ( "disclaimers" ) != "-" ) $s .= " | " . $this->makeKnownLink( wfMsg( "disclaimerpage" ), wfMsg( "disclaimers" ) ) ;
409
410 if ( $wgOut->isArticle() ) {
411 if ( $wgTitle->getNamespace() == Namespace::getImage() ) {
412 $name = $wgTitle->getDBkey();
413 $link = wfEscapeHTML( wfImageUrl( $name ) );
414 $style = $this->getInternalLinkAttributes( $link, $name );
415 $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>";
416 }
417 # This will show the "Approve" link if $wgUseApproval=true;
418 if ( isset ( $wgUseApproval ) && $wgUseApproval )
419 {
420 $t = $wgTitle->getDBkey();
421 $name = "Approve this article" ;
422 $link = "http://test.wikipedia.org/w/magnus/wiki.phtml?title={$t}&action=submit&doit=1" ;
423 #wfEscapeHTML( wfImageUrl( $name ) );
424 $style = $this->getExternalLinkAttributes( $link, $name );
425 $s .= " | <a href=\"{$link}\"{$style}>{$name}</a>" ;
426 } }
427 if ( "history" == $action || isset( $diff ) || isset( $oldid ) ) {
428 $s .= " | " . $this->makeKnownLink( $wgTitle->getPrefixedText(),
429 wfMsg( "currentrev" ) );
430 }
431
432 if ( $wgUser->getNewtalk() ) {
433 # do not show "You have new messages" text when we are viewing our
434 # own talk page
435
436 if(!(strcmp($wgTitle->getText(),$wgUser->getName()) == 0 &&
437 $wgTitle->getNamespace()==Namespace::getTalk(Namespace::getUser()))) {
438 $n =$wgUser->getName();
439 $tl = $this->makeKnownLink( $wgLang->getNsText(
440 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
441 wfMsg("newmessageslink") );
442 $s.=" | <strong>". wfMsg( "newmessages", $tl ) . "</strong>";
443 }
444 }
445 if( $wgUser->isSysop() &&
446 (($wgTitle->getArticleId() == 0) || ($action == "history")) &&
447 ($n = $wgTitle->isDeleted() ) ) {
448 $s .= " | " . wfMsg( "thisisdeleted",
449 $this->makeKnownLink(
450 $wgLang->SpecialPage( "Undelete/" . $wgTitle->getPrefixedDBkey() ),
451 wfMsg( "restorelink", $n ) ) );
452 }
453 return $s;
454 }
455
456 function printableLink()
457 {
458 global $wgOut, $wgTitle, $oldid, $action;
459
460 $q = "";
461 foreach( $_GET as $var => $val ) {
462 if( $var != "title" && $var != "printable" )
463 $q .= urlencode( $var ) . "=" . urlencode( $val );
464 }
465 if( !empty( $q ) ) $q .= "&";
466
467 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
468 WfMsg( "printableversion" ), "{$q}printable=yes" );
469 return $s;
470 }
471
472 function pageTitle()
473 {
474 global $wgOut, $wgTitle, $wgUser;
475
476 $s = "<h1 class='pagetitle'>" . $wgOut->getPageTitle() . "</h1>";
477 if($wgUser->getOption("editsectiononrightclick") && $wgTitle->userCanEdit()) { $s=$this->editSectionScript(0,$s);}
478 return $s;
479 }
480
481 function pageSubtitle()
482 {
483 global $wgOut,$wgTitle,$wgNamespacesWithSubpages;
484
485 $sub = $wgOut->getSubtitle();
486 if ( "" == $sub ) {
487 global $wgExtraSubtitle;
488 $sub = wfMsg( "fromwikipedia" ) . $wgExtraSubtitle;
489 }
490 if($wgOut->isArticle() && $wgNamespacesWithSubpages[$wgTitle->getNamespace()]) {
491 $ptext=$wgTitle->getPrefixedText();
492 if(preg_match("/\//",$ptext)) {
493 $sub.="</p><p class='subpages'>";
494 $links=explode("/",$ptext);
495 $c=0;
496 $growinglink="";
497 foreach($links as $link) {
498 $c++;
499 if ($c<count($links)) {
500 $growinglink .= $link;
501 $getlink = $this->makeLink( $growinglink, $link );
502 if(preg_match("/class='new'/i",$getlink)) { break; } # this is a hack, but it saves time
503 if ($c>1) {
504 $sub .= " | ";
505 } else {
506 $sub .="&lt; ";
507 }
508 $sub .= $getlink;
509 $growinglink.="/";
510 }
511
512 }
513 }
514 }
515 $s = "<p class='subtitle'>{$sub}\n";
516 return $s;
517 }
518
519 function nameAndLogin()
520 {
521 global $wgUser, $wgTitle, $wgLang, $wgShowIPinHeader;
522
523 $li = $wgLang->specialPage( "Userlogin" );
524 $lo = $wgLang->specialPage( "Userlogout" );
525
526 $s = "";
527 if ( 0 == $wgUser->getID() ) {
528 if( $wgShowIPinHeader ) {
529 $n = getenv( "REMOTE_ADDR" );
530
531 $tl = $this->makeKnownLink( $wgLang->getNsText(
532 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
533 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
534
535 $s .= $n . " (".$tl.")";
536 } else {
537 $s .= wfMsg("notloggedin");
538 }
539
540 $rt = $wgTitle->getPrefixedURL();
541 if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) {
542 $q = "";
543 } else { $q = "returnto={$rt}"; }
544
545 $s .= "\n<br>" . $this->makeKnownLink( $li,
546 wfMsg( "login" ), $q );
547 } else {
548 $n = $wgUser->getName();
549 $rt = $wgTitle->getPrefixedURL();
550 $tl = $this->makeKnownLink( $wgLang->getNsText(
551 Namespace::getTalk( Namespace::getUser() ) ) . ":{$n}",
552 $wgLang->getNsText( Namespace::getTalk( 0 ) ) );
553
554 $tl = " ({$tl})";
555
556 $s .= $this->makeKnownLink( $wgLang->getNsText(
557 Namespace::getUser() ) . ":{$n}", $n ) . "{$tl}<br>" .
558 $this->makeKnownLink( $lo, wfMsg( "logout" ),
559 "returnto={$rt}" ) . " | " .
560 $this->specialLink( "preferences" );
561 }
562 $s .= " | " . $this->makeKnownLink( wfMsg( "helppage" ),
563 wfMsg( "help" ) );
564
565 return $s;
566 }
567
568 function searchForm()
569 {
570 global $search;
571
572 $s = "<form name='search' class='inline' method=get action=\""
573 . wfLocalUrl( "" ) . "\">"
574 . "<input type=text name=\"search\" size=19 value=\""
575 . htmlspecialchars(substr($search,0,256)) . "\">\n"
576 . "<input type=submit name=\"go\" value=\"" . wfMsg ("go") . "\">&nbsp;"
577 . "<input type=submit value=\"" . wfMsg ("search") . "\"></form>";
578
579 return $s;
580 }
581
582 function topLinks()
583 {
584 global $wgOut;
585 $sep = " |\n";
586
587 $s = $this->mainPageLink() . $sep
588 . $this->specialLink( "recentchanges" );
589
590 if ( $wgOut->isArticle() ) {
591 $s .= $sep . $this->editThisPage()
592 . $sep . $this->historyLink();
593 }
594 # Many people don't like this dropdown box
595 #$s .= $sep . $this->specialPagesList();
596
597 return $s;
598 }
599
600 function bottomLinks()
601 {
602 global $wgOut, $wgUser, $wgTitle;
603 $sep = " |\n";
604
605 $s = "";
606 if ( $wgOut->isArticle() ) {
607 $s .= "<strong>" . $this->editThisPage() . "</strong>";
608 if ( 0 != $wgUser->getID() ) {
609 $s .= $sep . $this->watchThisPage();
610 }
611 $s .= $sep . $this->talkLink()
612 . $sep . $this->historyLink()
613 . $sep . $this->whatLinksHere()
614 . $sep . $this->watchPageLinksLink();
615
616 if ( $wgTitle->getNamespace() == Namespace::getUser()
617 || $wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser()) )
618
619 {
620 $id=User::idFromName($wgTitle->getText());
621 $ip=User::isIP($wgTitle->getText());
622
623 if($id || $ip) { # both anons and non-anons have contri list
624 $s .= $sep . $this->userContribsLink();
625 }
626 if ( 0 != $wgUser->getID() ) { # show only to signed in users
627 if($id) { # can only email non-anons
628 $s .= $sep . $this->emailUserLink();
629 }
630 }
631 }
632 if ( $wgUser->isSysop() && $wgTitle->getArticleId() ) {
633 $s .= "\n<br>" . $this->deleteThisPage() .
634 $sep . $this->protectThisPage() .
635 $sep . $this->moveThisPage();
636 }
637 $s .= "<br>\n" . $this->otherLanguages();
638 }
639 return $s;
640 }
641
642 function pageStats()
643 {
644 global $wgOut, $wgLang, $wgArticle;
645 global $oldid, $diff, $wgDisableCounters;
646
647 if ( ! $wgOut->isArticle() ) { return ""; }
648 if ( isset( $oldid ) || isset( $diff ) ) { return ""; }
649 if ( 0 == $wgArticle->getID() ) { return ""; }
650
651 if ( $wgDisableCounters ) {
652 $s = "";
653 } else {
654 $count = $wgArticle->getCount();
655 $s = wfMsg( "viewcount", $count );
656 }
657 $s .= $this->lastModified();
658 $s .= " " . wfMsg( "gnunote" );
659 return "<span id='pagestats'>{$s}</span>";
660 }
661
662 function lastModified()
663 {
664 global $wgLang, $wgArticle;
665
666 $d = $wgLang->timeanddate( $wgArticle->getTimestamp(), true );
667 $s = " " . wfMsg( "lastmodified", $d );
668 return $s;
669 }
670
671 function logoText( $align = "" )
672 {
673 if ( "" != $align ) { $a = " align='{$align}'"; }
674 else { $a = ""; }
675
676 $mp = wfMsg( "mainpage" );
677 $s = "<a href=\"" . wfLocalUrlE( urlencode( $mp ) )
678 . "\"><img{$a} border=0 src=\""
679 . $this->getLogo() . "\" alt=\"" . "[{$mp}]\"></a>";
680 return $s;
681 }
682
683 function quickBar()
684 {
685 global $wgOut, $wgTitle, $wgUser, $action, $wgLang;
686 global $wpPreview, $wgDisableUploads, $wgRemoteUploads;
687
688 $fname = "Skin::quickBar";
689 wfProfileIn( $fname );
690
691 $tns=$wgTitle->getNamespace();
692
693 $s = "\n<div id='quickbar'>";
694 $s .= "\n" . $this->logoText() . "\n<hr class='sep'>";
695
696 $sep = "\n<br>";
697 $s .= $this->mainPageLink()
698 . $sep . $this->specialLink( "recentchanges" )
699 . $sep . $this->specialLink( "randompage" );
700 if ($wgUser->getID()) {
701 $s.= $sep . $this->specialLink( "watchlist" ) ;
702 $s .= $sep .$this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
703 wfMsg( "mycontris" ), "target=" . wfUrlencode($wgUser->getName() ) );
704
705 }
706 // only show watchlist link if logged in
707 if ( wfMsg ( "currentevents" ) != "-" ) $s .= $sep . $this->makeKnownLink( wfMsg( "currentevents" ), "" ) ;
708 $s .= "\n<br><hr class='sep'>";
709 $articleExists = $wgTitle->getArticleId();
710 if ( $wgOut->isArticle() || $action =="edit" || $action =="history" || $wpPreview) {
711 if($wgOut->isArticle()) {
712 $s .= "<strong>" . $this->editThisPage() . "</strong>";
713 } else { # backlink to the article in edit or history mode
714 if($articleExists){ # no backlink if no article
715 switch($tns) {
716 case 0:
717 $text = wfMsg("articlepage");
718 break;
719 case 1:
720 $text = wfMsg("viewtalkpage");
721 break;
722 case 2:
723 $text = wfMsg("userpage");
724 break;
725 case 3:
726 $text = wfMsg("viewtalkpage");
727 break;
728 case 4:
729 $text = wfMsg("wikipediapage");
730 break;
731 case 5:
732 $text = wfMsg("viewtalkpage");
733 break;
734 case 6:
735 $text = wfMsg("imagepage");
736 break;
737 case 7:
738 $text = wfMsg("viewtalkpage");
739 break;
740 default:
741 $text= wfMsg("articlepage");
742 }
743
744 $link = $wgTitle->getText();
745 if ($nstext = $wgLang->getNsText($tns) ) { # add namespace if necessary
746 $link = $nstext . ":" . $link ;
747 }
748
749 $s .= $this->makeLink( $link, $text );
750 } elseif( $wgTitle->getNamespace() != Namespace::getSpecial() ) {
751 # we just throw in a "New page" text to tell the user that he's in edit mode,
752 # and to avoid messing with the separator that is prepended to the next item
753 $s .= "<strong>" . wfMsg("newpage") . "</strong>";
754 }
755
756 }
757
758
759 if( $tns%2 && $action!="edit" && !$wpPreview) {
760 $s.="<br>".$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("postcomment"),"action=edit&section=new");
761 }
762
763 /*
764 watching could cause problems in edit mode:
765 if user edits article, then loads "watch this article" in background and then saves
766 article with "Watch this article" checkbox disabled, the article is transparently
767 unwatched. Therefore we do not show the "Watch this page" link in edit mode
768 */
769 if ( 0 != $wgUser->getID() && $articleExists) {
770 if($action!="edit" && $action!="history" &&
771 $action != "submit" )
772 {
773 $s .= $sep . $this->watchThisPage();
774 }
775 if ( $wgTitle->userCanEdit() )
776 $s .= $sep . $this->moveThisPage();
777 }
778 if ( $wgUser->isSysop() and $articleExists ) {
779 $s .= $sep . $this->deleteThisPage() .
780 $sep . $this->protectThisPage();
781 }
782 $s .= $sep . $this->talkLink();
783 if ($articleExists && $action !="history") {
784 $s .= $sep . $this->historyLink();
785 }
786 $s.=$sep . $this->whatLinksHere();
787
788 if($wgOut->isArticle()) {
789 $s .= $sep . $this->watchPageLinksLink();
790 }
791
792 if ( Namespace::getUser() == $wgTitle->getNamespace()
793 || $wgTitle->getNamespace() == Namespace::getTalk(Namespace::getUser())
794 ) {
795
796 $id=User::idFromName($wgTitle->getText());
797 $ip=User::isIP($wgTitle->getText());
798
799 if($id||$ip) {
800 $s .= $sep . $this->userContribsLink();
801 }
802 if ( 0 != $wgUser->getID() ) {
803 if($id) { # can only email real users
804 $s .= $sep . $this->emailUserLink();
805 }
806 }
807 }
808 $s .= "\n<br><hr class='sep'>";
809 }
810
811 if ( 0 != $wgUser->getID() && ( !$wgDisableUploads || $wgRemoteUploads ) ) {
812 $s .= $this->specialLink( "upload" ) . $sep;
813 }
814 $s .= $this->specialLink( "specialpages" )
815 . $sep . $this->bugReportsLink();
816
817 global $wgSiteSupportPage;
818 if( $wgSiteSupportPage ) {
819 $s .= "\n<br><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
820 "\" class=\"internal\">" . wfMsg( "sitesupport" ) . "</a>";
821 }
822
823 $s .= "\n<br></div>\n";
824 wfProfileOut( $fname );
825 return $s;
826 }
827
828 function specialPagesList()
829 {
830 global $wgUser, $wgOut, $wgLang, $wgServer, $wgRedirectScript;
831 $a = array();
832
833 $validSP = $wgLang->getValidSpecialPages();
834
835 foreach ( $validSP as $name => $desc ) {
836 if ( "" == $desc ) { continue; }
837 $a[$name] = $desc;
838 }
839 if ( $wgUser->isSysop() )
840 {
841 $sysopSP = $wgLang->getSysopSpecialPages();
842
843 foreach ( $sysopSP as $name => $desc ) {
844 if ( "" == $desc ) { continue; }
845 $a[$name] = $desc ;
846 }
847 }
848 if ( $wgUser->isDeveloper() )
849 {
850 $devSP = $wgLang->getDeveloperSpecialPages();
851
852 foreach ( $devSP as $name => $desc ) {
853 if ( "" == $desc ) { continue; }
854 $a[$name] = $desc ;
855 }
856 }
857 $go = wfMsg( "go" );
858 $sp = wfMsg( "specialpages" );
859 $spp = $wgLang->specialPage( "Specialpages" );
860
861 $s = "<form id=\"specialpages\" method=\"get\" class=\"inline\" " .
862 "action=\"{$wgServer}{$wgRedirectScript}\">\n";
863 $s .= "<select name=\"wpDropdown\">\n";
864 $s .= "<option value=\"{$spp}\">{$sp}</option>\n";
865
866 foreach ( $a as $name => $desc ) {
867 $p = $wgLang->specialPage( $name );
868 $s .= "<option value=\"{$p}\">{$desc}</option>\n";
869 }
870 $s .= "</select>\n";
871 $s .= "<input type=submit value=\"{$go}\" name=redirect>\n";
872 $s .= "</form>\n";
873 return $s;
874 }
875
876 function mainPageLink()
877 {
878 $mp = wfMsg( "mainpage" );
879 $s = $this->makeKnownLink( $mp, $mp );
880 return $s;
881 }
882
883 function copyrightLink()
884 {
885 $s = $this->makeKnownLink( wfMsg( "copyrightpage" ),
886 wfMsg( "copyrightpagename" ) );
887 return $s;
888 }
889
890 function aboutLink()
891 {
892 $s = $this->makeKnownLink( wfMsg( "aboutpage" ),
893 wfMsg( "aboutwikipedia" ) );
894 return $s;
895 }
896
897
898 function disclaimerLink()
899 {
900 $s = $this->makeKnownLink( wfMsg( "disclaimerpage" ),
901 wfMsg( "disclaimers" ) );
902 return $s;
903 }
904
905 function editThisPage()
906 {
907 global $wgOut, $wgTitle, $oldid, $redirect, $diff;
908
909 if ( ! $wgOut->isArticle() || $diff ) {
910 $s = wfMsg( "protectedpage" );
911 } else {
912 $n = $wgTitle->getPrefixedText();
913 if ( $wgTitle->userCanEdit() ) {
914 $t = wfMsg( "editthispage" );
915 } else {
916 #$t = wfMsg( "protectedpage" );
917 $t = wfMsg( "viewsource" );
918 }
919 $oid = $red = "";
920
921 if ( $redirect ) { $red = "&redirect={$redirect}"; }
922 if ( $oldid && ! isset( $diff ) ) {
923 $oid = "&oldid={$oldid}";
924 }
925 $s = $this->makeKnownLink( $n, $t, "action=edit{$oid}{$red}" );
926 }
927 return $s;
928 }
929
930 function deleteThisPage()
931 {
932 global $wgUser, $wgOut, $wgTitle, $diff;
933
934 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
935 $n = $wgTitle->getPrefixedText();
936 $t = wfMsg( "deletethispage" );
937
938 $s = $this->makeKnownLink( $n, $t, "action=delete" );
939 } else {
940 $s = "";
941 }
942 return $s;
943 }
944
945 function protectThisPage()
946 {
947 global $wgUser, $wgOut, $wgTitle, $diff;
948
949 if ( $wgTitle->getArticleId() && ( ! $diff ) && $wgUser->isSysop() ) {
950 $n = $wgTitle->getPrefixedText();
951
952 if ( $wgTitle->isProtected() ) {
953 $t = wfMsg( "unprotectthispage" );
954 $q = "action=unprotect";
955 } else {
956 $t = wfMsg( "protectthispage" );
957 $q = "action=protect";
958 }
959 $s = $this->makeKnownLink( $n, $t, $q );
960 } else {
961 $s = "";
962 }
963 return $s;
964 }
965
966 function watchThisPage()
967 {
968 global $wgUser, $wgOut, $wgTitle, $diff;
969
970 if ( $wgOut->isArticle() && ( ! $diff ) ) {
971 $n = $wgTitle->getPrefixedText();
972
973 if ( $wgTitle->userIsWatching() ) {
974 $t = wfMsg( "unwatchthispage" );
975 $q = "action=unwatch";
976 } else {
977 $t = wfMsg( "watchthispage" );
978 $q = "action=watch";
979 }
980 $s = $this->makeKnownLink( $n, $t, $q );
981 } else {
982 $s = wfMsg( "notanarticle" );
983 }
984 return $s;
985 }
986
987 function moveThisPage()
988 {
989 global $wgTitle, $wgLang;
990
991 if ( $wgTitle->userCanEdit() ) {
992 $s = $this->makeKnownLink( $wgLang->specialPage( "Movepage" ),
993 wfMsg( "movethispage" ), "target=" . $wgTitle->getPrefixedURL() );
994 } // no message if page is protected - would be redundant
995 return $s;
996 }
997
998 function historyLink()
999 {
1000 global $wgTitle;
1001
1002 $s = $this->makeKnownLink( $wgTitle->getPrefixedText(),
1003 wfMsg( "history" ), "action=history" );
1004 return $s;
1005 }
1006
1007 function whatLinksHere()
1008 {
1009 global $wgTitle, $wgLang;
1010
1011 $s = $this->makeKnownLink( $wgLang->specialPage( "Whatlinkshere" ),
1012 wfMsg( "whatlinkshere" ), "target=" . $wgTitle->getPrefixedURL() );
1013 return $s;
1014 }
1015
1016 function userContribsLink()
1017 {
1018 global $wgTitle, $wgLang;
1019
1020 $s = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1021 wfMsg( "contributions" ), "target=" . $wgTitle->getURL() );
1022 return $s;
1023 }
1024
1025 function emailUserLink()
1026 {
1027 global $wgTitle, $wgLang;
1028
1029 $s = $this->makeKnownLink( $wgLang->specialPage( "Emailuser" ),
1030 wfMsg( "emailuser" ), "target=" . $wgTitle->getURL() );
1031 return $s;
1032 }
1033
1034 function watchPageLinksLink()
1035 {
1036 global $wgOut, $wgTitle, $wgLang;
1037
1038 if ( ! $wgOut->isArticle() ) {
1039 $s = "(" . wfMsg( "notanarticle" ) . ")";
1040 } else {
1041 $s = $this->makeKnownLink( $wgLang->specialPage(
1042 "Recentchangeslinked" ), wfMsg( "recentchangeslinked" ),
1043 "target=" . $wgTitle->getPrefixedURL() );
1044 }
1045 return $s;
1046 }
1047
1048 function otherLanguages()
1049 {
1050 global $wgOut, $wgLang, $wgTitle, $wgUseNewInterlanguage;
1051
1052 $a = $wgOut->getLanguageLinks();
1053 # TEST THIS @@@
1054 if ( 0 == count( $a ) ) {
1055 if ( !$wgUseNewInterlanguage ) return "";
1056 $ns = $wgLang->getNsIndex ( $wgTitle->getNamespace () ) ;
1057 if ( $ns != 0 AND $ns != 1 ) return "" ;
1058 $pn = "Intl" ;
1059 $x = "mode=addlink&xt=".$wgTitle->getDBkey() ;
1060 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
1061 wfMsg( "intl" ) , $x );
1062 }
1063
1064 if ( !$wgUseNewInterlanguage ) {
1065 $s = wfMsg( "otherlanguages" ) . ": ";
1066 } else {
1067 global $wgLanguageCode ;
1068 $x = "mode=zoom&xt=".$wgTitle->getDBkey() ;
1069 $x .= "&xl=".$wgLanguageCode ;
1070 $s = $this->makeKnownLink( $wgLang->specialPage( "Intl" ),
1071 wfMsg( "otherlanguages" ) , $x ) . ": " ;
1072 }
1073
1074 $s = wfMsg( "otherlanguages" ) . ": ";
1075 $first = true;
1076 if($wgLang->isRTL()) $s .= "<span dir='LTR'>";
1077 foreach( $a as $l ) {
1078 if ( ! $first ) { $s .= " | "; }
1079 $first = false;
1080
1081 $nt = Title::newFromText( $l );
1082 $url = $nt->getFullURL();
1083 $text = $wgLang->getLanguageName( $nt->getInterwiki() );
1084
1085 if ( "" == $text ) { $text = $l; }
1086 $style = $this->getExternalLinkAttributes( $l, $text );
1087 $s .= "<a href=\"{$url}\"{$style}>{$text}</a>";
1088 }
1089 if($wgLang->isRTL()) $s .= "</span>";
1090 return $s;
1091 }
1092
1093 function bugReportsLink()
1094 {
1095 $s = $this->makeKnownLink( wfMsg( "bugreportspage" ),
1096 wfMsg( "bugreports" ) );
1097 return $s;
1098 }
1099
1100 function dateLink()
1101 {
1102 global $wgLinkCache;
1103 $t1 = Title::newFromText( gmdate( "F j" ) );
1104 $t2 = Title::newFromText( gmdate( "Y" ) );
1105
1106 $wgLinkCache->suspend();
1107 $id = $t1->getArticleID();
1108 $wgLinkCache->resume();
1109
1110 if ( 0 == $id ) {
1111 $s = $this->makeBrokenLink( $t1->getText() );
1112 } else {
1113 $s = $this->makeKnownLink( $t1->getText() );
1114 }
1115 $s .= ", ";
1116
1117 $wgLinkCache->suspend();
1118 $id = $t2->getArticleID();
1119 $wgLinkCache->resume();
1120
1121 if ( 0 == $id ) {
1122 $s .= $this->makeBrokenLink( $t2->getText() );
1123 } else {
1124 $s .= $this->makeKnownLink( $t2->getText() );
1125 }
1126 return $s;
1127 }
1128
1129 function talkLink()
1130 {
1131 global $wgLang, $wgTitle, $wgLinkCache;
1132
1133 $tns = $wgTitle->getNamespace();
1134 if ( -1 == $tns ) { return ""; }
1135
1136 $pn = $wgTitle->getText();
1137 $tp = wfMsg( "talkpage" );
1138 if ( Namespace::isTalk( $tns ) ) {
1139 $lns = Namespace::getSubject( $tns );
1140 switch($tns) {
1141 case 1:
1142 $text = wfMsg("articlepage");
1143 break;
1144 case 3:
1145 $text = wfMsg("userpage");
1146 break;
1147 case 5:
1148 $text = wfMsg("wikipediapage");
1149 break;
1150 case 7:
1151 $text = wfMsg("imagepage");
1152 break;
1153 default:
1154 $text= wfMsg("articlepage");
1155 }
1156 } else {
1157
1158 $lns = Namespace::getTalk( $tns );
1159 $text=$tp;
1160 }
1161 $n = $wgLang->getNsText( $lns );
1162 if ( "" == $n ) { $link = $pn; }
1163 else { $link = "{$n}:{$pn}"; }
1164
1165 $wgLinkCache->suspend();
1166 $s = $this->makeLink( $link, $text );
1167 $wgLinkCache->resume();
1168
1169 return $s;
1170 }
1171
1172 function commentLink()
1173 {
1174 global $wgLang, $wgTitle, $wgLinkCache;
1175
1176 $tns = $wgTitle->getNamespace();
1177 if ( -1 == $tns ) { return ""; }
1178
1179 $lns = ( Namespace::isTalk( $tns ) ) ? $tns : Namespace::getTalk( $tns );
1180
1181 # assert Namespace::isTalk( $lns )
1182
1183 $n = $wgLang->getNsText( $lns );
1184 $pn = $wgTitle->getText();
1185
1186 $link = "{$n}:{$pn}";
1187
1188 $wgLinkCache->suspend();
1189 $s = $this->makeKnownLink($link, wfMsg("postcomment"), "action=edit&section=new");
1190 $wgLinkCache->resume();
1191
1192 return $s;
1193 }
1194
1195 # After all the page content is transformed into HTML, it makes
1196 # a final pass through here for things like table backgrounds.
1197 #
1198 function transformContent( $text )
1199 {
1200 return $text;
1201 }
1202
1203 # Note: This function MUST call getArticleID() on the link,
1204 # otherwise the cache won't get updated properly. See LINKCACHE.DOC.
1205 #
1206 function makeLink( $title, $text = "", $query = "", $trail = "" ) {
1207 wfProfileIn( "Skin::makeLink" );
1208 $nt = Title::newFromText( $title );
1209 if ($nt) {
1210 $result = $this->makeLinkObj( Title::newFromText( $title ), $text, $query, $trail );
1211 } else {
1212 wfDebug( "Invalid title passed to Skin::makeLink(): \"$title\"\n" );
1213 $result = $text == "" ? $title : $text;
1214 }
1215
1216 wfProfileOut( "Skin::makeLink" );
1217 return $result;
1218 }
1219
1220 function makeKnownLink( $title, $text = "", $query = "", $trail = "" ) {
1221 $nt = Title::newFromText( $title );
1222 if ($nt) {
1223 return $this->makeKnownLinkObj( Title::newFromText( $title ), $text, $query, $trail );
1224 } else {
1225 wfDebug( "Invalid title passed to Skin::makeKnownLink(): \"$title\"\n" );
1226 return $text == "" ? $title : $text;
1227 }
1228 }
1229
1230 function makeBrokenLink( $title, $text = "", $query = "", $trail = "" ) {
1231 $nt = Title::newFromText( $title );
1232 if ($nt) {
1233 return $this->makeBrokenLinkObj( Title::newFromText( $title ), $text, $query, $trail );
1234 } else {
1235 wfDebug( "Invalid title passed to Skin::makeBrokenLink(): \"$title\"\n" );
1236 return $text == "" ? $title : $text;
1237 }
1238 }
1239
1240 function makeStubLink( $title, $text = "", $query = "", $trail = "" ) {
1241 $nt = Title::newFromText( $title );
1242 if ($nt) {
1243 return $this->makeStubLinkObj( Title::newFromText( $title ), $text, $query, $trail );
1244 } else {
1245 wfDebug( "Invalid title passed to Skin::makeStubLink(): \"$title\"\n" );
1246 return $text == "" ? $title : $text;
1247 }
1248 }
1249
1250 # Pass a title object, not a title string
1251 function makeLinkObj( &$nt, $text= "", $query = "", $trail = "" )
1252 {
1253 global $wgOut, $wgUser;
1254 if ( $nt->isExternal() ) {
1255 $u = $nt->getFullURL();
1256 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1257 $style = $this->getExternalLinkAttributes( $link, $text );
1258
1259 $inside = "";
1260 if ( "" != $trail ) {
1261 if ( preg_match( "/^([a-z]+)(.*)$$/sD", $trail, $m ) ) {
1262 $inside = $m[1];
1263 $trail = $m[2];
1264 }
1265 }
1266 $retVal = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1267 } elseif ( 0 == $nt->getNamespace() && "" == $nt->getText() ) {
1268 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1269 } elseif ( ( -1 == $nt->getNamespace() ) ||
1270 ( Namespace::getImage() == $nt->getNamespace() ) ) {
1271 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1272 } else {
1273 $aid = $nt->getArticleID() ;
1274 if ( 0 == $aid ) {
1275 $retVal = $this->makeBrokenLinkObj( $nt, $text, $query, $trail );
1276 } else {
1277 $threshold = $wgUser->getOption("stubthreshold") ;
1278 if ( $threshold > 0 ) {
1279 $res = wfQuery ( "SELECT HIGH_PRIORITY length(cur_text) AS x, cur_namespace, cur_is_redirect FROM cur WHERE cur_id='{$aid}'", DB_READ ) ;
1280
1281 if ( wfNumRows( $res ) > 0 ) {
1282 $s = wfFetchObject( $res );
1283 $size = $s->x;
1284 if ( $s->cur_is_redirect OR $s->cur_namespace != 0 ) {
1285 $size = $threshold*2 ; # Really big
1286 }
1287 wfFreeResult( $res );
1288 } else {
1289 $size = $threshold*2 ; # Really big
1290 }
1291 } else {
1292 $size = 1 ;
1293 }
1294 if ( $size < $threshold ) {
1295 $retVal = $this->makeStubLinkObj( $nt, $text, $query, $trail );
1296 } else {
1297 $retVal = $this->makeKnownLinkObj( $nt, $text, $query, $trail );
1298 }
1299 }
1300 }
1301 return $retVal;
1302 }
1303
1304 # Pass a title object, not a title string
1305 function makeKnownLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1306 {
1307 global $wgOut, $wgTitle;
1308
1309 $fname = "Skin::makeKnownLinkObj";
1310 wfProfileIn( $fname );
1311
1312 $link = $nt->getPrefixedURL();
1313
1314 if ( "" == $link ) {
1315 $u = "";
1316 if ( "" == $text ) { $text = $nt->getFragment(); }
1317 } else {
1318 $u = wfLocalUrlE( $link, $query );
1319 }
1320 if ( "" != $nt->getFragment() ) {
1321 $u .= "#" . wfEscapeHTML( $nt->getFragment() );
1322 }
1323 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1324 $style = $this->getInternalLinkAttributesObj( $nt, $text );
1325
1326 $inside = "";
1327 if ( "" != $trail ) {
1328 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1329 $inside = $m[1];
1330 $trail = $m[2];
1331 }
1332 }
1333 $r = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1334 wfProfileOut( $fname );
1335 return $r;
1336 }
1337
1338 # Pass a title object, not a title string
1339 function makeBrokenLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1340 {
1341 global $wgOut, $wgUser;
1342
1343 $fname = "Skin::makeBrokenLinkObj";
1344 wfProfileIn( $fname );
1345
1346 $link = $nt->getPrefixedURL();
1347
1348 if ( "" == $query ) { $q = "action=edit"; }
1349 else { $q = "action=edit&{$query}"; }
1350 $u = wfLocalUrlE( $link, $q );
1351
1352 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1353 $style = $this->getInternalLinkAttributesObj( $nt, $text, "yes" );
1354
1355 $inside = "";
1356 if ( "" != $trail ) {
1357 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1358 $inside = $m[1];
1359 $trail = $m[2];
1360 }
1361 }
1362 if ( $wgOut->isPrintable() ||
1363 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1364 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1365 } else {
1366 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>?</a>{$trail}";
1367 }
1368
1369 wfProfileOut( $fname );
1370 return $s;
1371 }
1372
1373 # Pass a title object, not a title string
1374 function makeStubLinkObj( &$nt, $text = "", $query = "", $trail = "" )
1375 {
1376 global $wgOut, $wgUser;
1377
1378 $link = $nt->getPrefixedURL();
1379
1380 $u = wfLocalUrlE( $link, $query );
1381
1382 if ( "" == $text ) { $text = $nt->getPrefixedText(); }
1383 $style = $this->getInternalLinkAttributesObj( $nt, $text, "stub" );
1384
1385 $inside = "";
1386 if ( "" != $trail ) {
1387 if ( preg_match( wfMsg("linktrail"), $trail, $m ) ) {
1388 $inside = $m[1];
1389 $trail = $m[2];
1390 }
1391 }
1392 if ( $wgOut->isPrintable() ||
1393 ( 1 == $wgUser->getOption( "highlightbroken" ) ) ) {
1394 $s = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>{$trail}";
1395 } else {
1396 $s = "{$text}{$inside}<a href=\"{$u}\"{$style}>!</a>{$trail}";
1397 }
1398 return $s;
1399 }
1400
1401 function fnamePart( $url )
1402 {
1403 $basename = strrchr( $url, "/" );
1404 if ( false === $basename ) { $basename = $url; }
1405 else { $basename = substr( $basename, 1 ); }
1406 return wfEscapeHTML( $basename );
1407 }
1408
1409 function makeImage( $url, $alt = "" )
1410 {
1411 global $wgOut;
1412
1413 if ( "" == $alt ) { $alt = $this->fnamePart( $url ); }
1414 $s = "<img src=\"{$url}\" alt=\"{$alt}\">";
1415 return $s;
1416 }
1417
1418 function makeImageLink( $name, $url, $alt = "" ) {
1419 $nt = Title::makeTitle( Namespace::getImage(), $name );
1420 return $this->makeImageLinkObj( $nt, $alt );
1421 }
1422
1423 function makeImageLinkObj( $nt, $alt = "" ) {
1424 global $wgLang, $wgUseImageResize;
1425 $link = $nt->getPrefixedURL();
1426 $name = $nt->getDBKey();
1427 $url = wfImageUrl( $name );
1428 $align = "";
1429
1430 if ( $wgUseImageResize ) {
1431 # Check if the alt text is of the form "options|alt text"
1432 # Options are:
1433 # * thumbnail make a thumbnail with enlarge-icon and caption, alignment depends on lang
1434 # * left no resizing, just left align. label is used for alt= only
1435 # * right same, but right aligned
1436 # * none same, but not aligned
1437 # * ___px scale to ___ pixels width, no aligning. e.g. use in taxobox
1438
1439 $part = explode( "|", $alt);
1440
1441 if ( count($part) > 1 ) {
1442 $mwThumb =& MagicWord::get( MAG_IMG_THUMBNAIL );
1443 $mwLeft =& MagicWord::get( MAG_IMG_LEFT );
1444 $mwRight =& MagicWord::get( MAG_IMG_RIGHT );
1445 $mwNone =& MagicWord::get( MAG_IMG_NONE );
1446 $mwWidth =& MagicWord::get( MAG_IMG_WIDTH );
1447 $alt = $part[count($part)-1];
1448
1449 $thumb=false;
1450
1451 foreach( $part as $key => $val ) {
1452 if ( ! is_null( $mwThumb->matchVariableStartToEnd($val) ) ) {
1453 $thumb=true;
1454 } elseif ( ! is_null( $mwRight->matchVariableStartToEnd($val) ) ) {
1455 # remember to set an alignment, don't render immediately
1456 $align = "right";
1457 } elseif ( ! is_null( $mwLeft->matchVariableStartToEnd($val) ) ) {
1458 # remember to set an alignment, don't render immediately
1459 $align = "left";
1460 } elseif ( ! is_null( $mwNone->matchVariableStartToEnd($val) ) ) {
1461 # remember to set an alignment, don't render immediately
1462 $align = "none";
1463 } elseif ( ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) {
1464 # $match is the image width in pixels
1465 $width = intval($match);
1466 }
1467 }
1468 }
1469
1470 if ( $thumb ) {
1471
1472 # Create a thumbnail. Alignment depends on language
1473 # writing direction, # right aligned for left-to-right-
1474 # languages ("Western languages"), left-aligned
1475 # for right-to-left-languages ("Semitic languages")
1476 #
1477 # If thumbnail width has not been provided, it is set
1478 # here to 180 pixels
1479 if ( $align == "" ) {
1480 $align = $wgLang->isRTL() ? "left" : "right";
1481 }
1482 if ( ! isset($width) ) {
1483 $width = 180;
1484 }
1485 return $this->makeThumbLinkObj( $nt, $alt, $align, $width );
1486
1487 } elseif ( isset($width) ) {
1488
1489 # Create a resized image, without the additional thumbnail
1490 # features
1491 $url = $this->createThumb( $name, $width );
1492 }
1493 } # endif $wgUseImageResize
1494
1495 if ( empty( $alt ) ) {
1496 $alt = preg_replace( '/\.(.+?)^/', '', $name );
1497 }
1498 $alt = htmlspecialchars( $alt );
1499
1500 $u = wfLocalUrlE( $link );
1501 $s = "<a href=\"{$u}\" class='image' title=\"{$alt}\">" .
1502 "<img border=\"0\" src=\"{$url}\" alt=\"{$alt}\"></a>";
1503 if ( "" != $align ) {
1504 $s = "<div class=\"float{$align}\">{$s}</div>";
1505 }
1506 return $s;
1507 }
1508
1509 function createThumb( $name, $width ) {
1510 global $wgUploadDirectory;
1511 global $wgImageMagickConvertCommand;
1512 global $wgUseImageMagick;
1513 $imgPath = wfImagePath( $name );
1514 $thumbName = $width."px-".$icon.$name;
1515 $thumbPath = wfImageArchiveDir( $thumbName, "thumb" )."/".$thumbName;
1516 $thumbUrl = wfImageArchiveUrl( $thumbName, "thumb" );
1517
1518 if ( (! file_exists( $thumbPath ) && file_exists( $imgPath ))
1519 || ( filemtime($thumbPath) < filemtime($imgPath) ) ) {
1520 if ( $wgUseImageMagick ) {
1521 # use ImageMagick
1522 $cmd = $wgImageMagickConvertCommand .
1523 " -quality 95 -geometry {$width}x ".
1524 escapeshellarg($imgPath) . " " .
1525 escapeshellarg($thumbPath);
1526 $conv = shell_exec( $cmd );
1527 } else {
1528 # Use PHP's builtin GD library functions.
1529 #
1530 # First find out what kind of file this is, and select the correct
1531 # input routine for this.
1532 list($src_width, $src_height, $src_type, $src_attr) = getimagesize( $imgPath );
1533 switch( $src_type ) {
1534 case 1: # GIF
1535 $src_image = imagecreatefromgif( $imgPath );
1536 break;
1537 case 2: # JPG
1538 $src_image = imagecreatefromjpeg( $imgPath );
1539 break;
1540 case 3: # PNG
1541 $src_image = imagecreatefrompng( $imgPath );
1542 break;
1543 case 15: # WBMP for WML
1544 $src_image = imagecreatefromwbmp( $imgPath );
1545 break;
1546 case 16: # XBM
1547 $src_image = imagecreatefromxbm( $imgPath );
1548 break;
1549 default:
1550 return "Image type not supported";
1551 break;
1552 }
1553 $height = floor( $src_height * ( $width/$src_width ) );
1554 $dst_image = imagecreatetruecolor( $width, $height );
1555 imagecopyresampled( $dst_image, $src_image,
1556 0,0,0,0,
1557 $width, $height, $src_width, $src_height );
1558 switch( $src_type ) {
1559 case 1: # GIF
1560 case 3: # PNG
1561 case 15: # WBMP
1562 case 16: # XBM
1563 #$thumbUrl .= ".png";
1564 #$thumbPath .= ".png";
1565 imagepng( $dst_image, $thumbPath );
1566 break;
1567 case 2: # JPEG
1568 #$thumbUrl .= ".jpg";
1569 #$thumbPath .= ".jpg";
1570 imageinterlace( $dst_image );
1571 imagejpeg( $dst_image, $thumbPath, 95 );
1572 break;
1573 default:
1574 break;
1575 }
1576 imagedestroy( $dst_image );
1577 imagedestroy( $src_image );
1578
1579
1580 }
1581
1582 }
1583 return $thumbUrl;
1584 }
1585
1586 function makeThumbLinkObj( $nt, $label = "", $align = "right", $boxwidth = 180 ) {
1587 global $wgUploadPath;
1588 $name = $nt->getDBKey();
1589 $image = Title::makeTitle( Namespace::getImage(), $name );
1590 $link = $image->getPrefixedURL();
1591 $url = wfImageUrl( $name );
1592 $path = wfImagePath( $name );
1593
1594 list($width, $height, $type, $attr) = getimagesize( $path );
1595 $cwidth = $boxwidth;
1596 $cheight = intval( $height/($width/$cwidth) );
1597 if ($cheight > $boxwidth*1.5) {
1598 $cheight = $boxwidth*1.3;
1599 $cwidth = intval( $width/($height/$cheight) );
1600 }
1601 if ( $cwidth > $width ) {
1602 $cwidth = $width;
1603 $cheight = $height;
1604 }
1605
1606 $thumbUrl = $this->createThumb( $name, $cwidth );
1607
1608 $u = wfLocalUrlE( $link );
1609
1610 $more = wfMsg( "thumbnail-more" );
1611
1612 $s = "<div class=\"thumbnail-{$align}\" style=\"width:{$boxwidth}px;\">" .
1613 "<a href=\"{$u}\" class=\"internal\" title=\"{$label}\">" .
1614 "<img border=\"0\" src=\"{$thumbUrl}\" alt=\"{$label}\" width=\"{$cwidth}\" height=\"{$cheight}\"></a>" .
1615 "<a href=\"{$u}\" class=\"internal\" title=\"{$more}\">" .
1616 "<img border=\"0\" src=\"{$wgUploadPath}/magnify-clip.png\" width=\"26\" height=\"24\" align=\"right\" alt=\"{$more}\"></a>" .
1617 "<p>{$label}</div></p>";
1618 return $s;
1619 }
1620
1621 function makeMediaLink( $name, $url, $alt = "" ) {
1622 $nt = Title::makeTitle( Namespace::getMedia(), $name );
1623 return $this->makeMediaLinkObj( $nt, $alt );
1624 }
1625
1626 function makeMediaLinkObj( $nt, $alt = "" )
1627 {
1628 $name = $nt->getDBKey();
1629 $url = wfImageUrl( $name );
1630 if ( empty( $alt ) ) {
1631 $alt = preg_replace( '/\.(.+?)^/', '', $name );
1632 }
1633
1634 $u = htmlspecialchars( $url );
1635 $s = "<a href=\"{$u}\" class='internal' title=\"{$alt}\">{$alt}</a>";
1636 return $s;
1637 }
1638
1639 function specialLink( $name, $key = "" )
1640 {
1641 global $wgLang;
1642
1643 if ( "" == $key ) { $key = strtolower( $name ); }
1644 $pn = $wgLang->ucfirst( $name );
1645 return $this->makeKnownLink( $wgLang->specialPage( $pn ),
1646 wfMsg( $key ) );
1647 }
1648
1649 # Called by history lists and recent changes
1650 #
1651
1652 function beginRecentChangesList()
1653 {
1654 $rc_cache = array() ;
1655 $rccc = 0 ;
1656 $this->lastdate = "";
1657 return "";
1658 }
1659
1660 function beginImageHistoryList()
1661 {
1662 $s = "\n<h2>" . wfMsg( "imghistory" ) . "</h2>\n" .
1663 "<p>" . wfMsg( "imghistlegend" ) . "\n<ul>";
1664 return $s;
1665 }
1666
1667 function endRecentChangesList()
1668 {
1669 $s = $this->recentChangesBlock() ;
1670 $s .= "</ul>\n";
1671 return $s;
1672 }
1673
1674 function endImageHistoryList()
1675 {
1676 $s = "</ul>\n";
1677 return $s;
1678 }
1679
1680 function recentChangesBlockLine ( $y ) {
1681 global $wgUploadPath ;
1682
1683 $M = wfMsg( "minoreditletter" );
1684 $N = wfMsg( "newpageletter" );
1685 $r = "" ;
1686 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>" ;
1687 $r .= "<tt>" ;
1688 if ( $y->isnew ) $r .= $N ;
1689 else $r .= "&nbsp;" ;
1690 if ( $y->isminor ) $r .= $M ;
1691 else $r .= "&nbsp;" ;
1692 $r .= " ".$y->timestamp." " ;
1693 $r .= "</tt>" ;
1694 $link = $y->link ;
1695 if ( $y->watched ) $link = "<strong>{$link}</strong>" ;
1696 $r .= $link ;
1697
1698 $r .= " (" ;
1699 $r .= $y->curlink ;
1700 $r .= "; " ;
1701 $r .= $this->makeKnownLink( $y->secureName, wfMsg( "hist" ), "action=history" );
1702
1703 $r .= ") . . ".$y->userlink ;
1704 $r .= $y->usertalklink ;
1705 if ( $y->usercomment != "" )
1706 $r .= " <em>(".wfEscapeHTML($y->usercomment).")</em>" ;
1707 $r .= "<br>\n" ;
1708 return $r ;
1709 }
1710
1711 function recentChangesBlockGroup ( $y ) {
1712 global $wgUploadPath ;
1713
1714 $r = "" ;
1715 $M = wfMsg( "minoreditletter" );
1716 $N = wfMsg( "newpageletter" );
1717 $isnew = false ;
1718 $userlinks = array () ;
1719 foreach ( $y AS $x ) {
1720 $oldid = $x->diffid ;
1721 if ( $x->isnew ) $isnew = true ;
1722 $u = $x->userlink ;
1723 if ( !isset ( $userlinks[$u] ) ) $userlinks[$u] = 0 ;
1724 $userlinks[$u]++ ;
1725 }
1726
1727 krsort ( $userlinks ) ;
1728 asort ( $userlinks ) ;
1729 $users = array () ;
1730 $u = array_keys ( $userlinks ) ;
1731 foreach ( $u as $x ) {
1732 $z = $x ;
1733 if ( $userlinks[$x] > 1 ) $z .= " ({$userlinks[$x]}&times;)" ;
1734 array_push ( $users , $z ) ;
1735 }
1736 $users = " <font size='-1'>[".implode("; ",$users)."]</font>" ;
1737
1738 $e = $y ;
1739 $e = array_shift ( $e ) ;
1740
1741 # Arrow
1742 $rci = "RCI{$this->rccc}" ;
1743 $rcl = "RCL{$this->rccc}" ;
1744 $rcm = "RCM{$this->rccc}" ;
1745 $tl = "<a href='javascript:toggleVisibility(\"{$rci}\",\"{$rcm}\",\"{$rcl}\")'>" ;
1746 $tl .= "<span id='{$rcm}'><img src='{$wgUploadPath}/Arr_r.png' width=12 height=12 border=0></span>" ;
1747 $tl .= "<span id='{$rcl}' style='display:none'><img src='{$wgUploadPath}/Arr_d.png' width=12 height=12 border=0></span>" ;
1748 $tl .= "</a>" ;
1749 $r .= $tl ;
1750
1751 # Main line
1752 $r .= "<tt>" ;
1753 if ( $isnew ) $r .= $N ;
1754 else $r .= "&nbsp;" ;
1755 $r .= "&nbsp;" ; # Minor
1756 $r .= " ".$e->timestamp." " ;
1757 $r .= "</tt>" ;
1758
1759 $link = $e->link ;
1760 if ( $e->watched ) $link = "<strong>{$link}</strong>" ;
1761 $r .= $link ;
1762
1763 if ( !$e->islog ) {
1764 $r .= " (".count($y)." " ;
1765 if ( $isnew ) $r .= wfMsg("changes");
1766 else $r .= $this->makeKnownLink( $e->secureName , wfMsg("changes") , "diff=0&oldid=".$oldid ) ;
1767 $r .= "; " ;
1768 $r .= $this->makeKnownLink( $e->secureName, wfMsg( "history" ), "action=history" );
1769 $r .= ")" ;
1770 }
1771
1772 $r .= $users ;
1773 $r .= "<br>\n" ;
1774
1775 # Sub-entries
1776 $r .= "<div id='{$rci}' style='display:none'>" ;
1777 foreach ( $y AS $x )
1778 {
1779 $r .= "<img src='{$wgUploadPath}/Arr_.png' width=12 height=12 border=0>";
1780 $r .= "<tt>&nbsp; &nbsp; &nbsp; &nbsp;" ;
1781 if ( $x->isnew ) $r .= $N ;
1782 else $r .= "&nbsp;" ;
1783 if ( $x->isminor ) $r .= $M ;
1784 else $r .= "&nbsp;" ;
1785 $r .= "</tt>" ;
1786
1787 $o = "" ;
1788 if ( $x->oldid != 0 ) $o = "oldid=".$x->oldid ;
1789 if ( $x->islog ) $link = $x->timestamp ;
1790 else $link = $this->makeKnownLink( $x->secureName, $x->timestamp , $o ) ;
1791 $link = "<tt>{$link}</tt>" ;
1792
1793
1794 $r .= $link ;
1795 $r .= " (" ;
1796 $r .= $x->curlink ;
1797 $r .= "; " ;
1798 $r .= $x->lastlink ;
1799 $r .= ") . . ".$x->userlink ;
1800 $r .= $x->usertalklink ;
1801 if ( $x->usercomment != "" )
1802 $r .= " <em>(".wfEscapeHTML($x->usercomment).")</em>" ;
1803 $r .= "<br>\n" ;
1804 }
1805 $r .= "</div>\n" ;
1806
1807 $this->rccc++ ;
1808 return $r ;
1809 }
1810
1811 function recentChangesBlock ()
1812 {
1813 global $wgUploadPath ;
1814 if ( count ( $this->rc_cache ) == 0 ) return "" ;
1815 $k = array_keys ( $this->rc_cache ) ;
1816 foreach ( $k AS $x )
1817 {
1818 $y = $this->rc_cache[$x] ;
1819 if ( count ( $y ) < 2 ) {
1820 $r .= $this->recentChangesBlockLine ( array_shift ( $y ) ) ;
1821 } else {
1822 $r .= $this->recentChangesBlockGroup ( $y ) ;
1823 }
1824 }
1825
1826 return "<div align=left>{$r}</div>" ;
1827 }
1828
1829 function recentChangesLine( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1830 {
1831 global $wgUser ;
1832 $usenew = $wgUser->getOption( "usenewrc" );
1833 if ( $usenew )
1834 $r = $this->recentChangesLineNew ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1835 else
1836 $r = $this->recentChangesLineOld ( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched , $oldid , $diffid ) ;
1837 return $r ;
1838 }
1839
1840 function recentChangesLineOld( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0, $diffid = 0 )
1841 {
1842 global $wgTitle, $wgLang, $wgUser;
1843
1844 $d = $wgLang->date( $ts, true);
1845 $s = "";
1846 if ( $d != $this->lastdate ) {
1847 if ( "" != $this->lastdate ) { $s .= "</ul>\n"; }
1848 $s .= "<h4>{$d}</h4>\n<ul>";
1849 $this->lastdate = $d;
1850 }
1851 $h = $wgLang->time( $ts, true );
1852 $t = Title::makeName( $ns, $ttl );
1853 $clink = $this->makeKnownLink( $t , "" );
1854 $nt = Title::newFromText( $t );
1855
1856 if ( $watched ) {
1857 $clink = "<strong>{$clink}</strong>";
1858 }
1859 $hlink = $this->makeKnownLink( $t, wfMsg( "hist" ), "action=history" );
1860 if ( $isnew || $nt->isLog() ) {
1861 $dlink = wfMsg( "diff" );
1862 } else {
1863 $dlink = $this->makeKnownLink( $t, wfMsg( "diff" ),
1864 "diff={$oldid}&oldid={$diffid}" ); # Finagle's law
1865 }
1866 if ( 0 == $u ) {
1867 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1868 $ut, "target=" . $ut );
1869 } else {
1870 $ul = $this->makeLink( $wgLang->getNsText( Namespace::getUser() ) . ":{$ut}", $ut );
1871 }
1872
1873 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1874 global $wgDisableAnonTalk;
1875 if( 0 == $u && $wgDisableAnonTalk ) {
1876 $utl = "";
1877 } else {
1878 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1879 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1880 }
1881 $cr = wfMsg( "currentrev" );
1882
1883 $s .= "<li> ({$dlink}) ({$hlink}) . .";
1884 $M = wfMsg( "minoreditletter" );
1885 $N = wfMsg( "newpageletter" );
1886 if ( $isminor ) { $s .= " <strong>{$M}</strong>"; }
1887 if ( $isnew ) { $s .= "<strong>{$N}</strong>"; }
1888 $s .= " {$clink}; {$h} . . {$ul}";
1889
1890 $blink="";
1891 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1892 $blink = $this->makeKnownLink( $wgLang->specialPage(
1893 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1894
1895 }
1896 if($blink) {
1897 if($utl) $utl .= " | ";
1898 $utl .= $blink;
1899 }
1900 if($utl) $s.=" ({$utl})";
1901
1902 if ( "" != $c && "*" != $c ) {
1903 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
1904 }
1905 $s .= "</li>\n";
1906
1907 return $s;
1908 }
1909
1910 function recentChangesLineNew( $ts, $u, $ut, $ns, $ttl, $c, $isminor, $isnew, $watched = false, $oldid = 0 , $diffid = 0 )
1911 {
1912 global $wgTitle, $wgLang, $wgUser;
1913
1914 $rc = new RecentChangesClass ;
1915
1916 $d = $wgLang->date( $ts, true);
1917 $s = "";
1918 $ret = "" ;
1919 if ( $d != $this->lastdate ) {
1920 $ret = $this->recentChangesBlock () ;
1921 $this->rc_cache = array() ;
1922 $ret .= "<h4>{$d}</h4>\n";
1923 $this->lastdate = $d;
1924 }
1925 $h = $wgLang->time( $ts, true );
1926 $t = Title::makeName( $ns, $ttl );
1927 $clink = $this->makeKnownLink( $t, "" ) ;
1928 if ( $oldid == 0 ) $c2link = $clink ;
1929 else $c2link = $this->makeKnownLink( $t, "" , "oldid={$oldid}" );
1930 $nt = Title::newFromText( $t );
1931
1932 $rc->timestamp = $h ;
1933 $rc->oldid = $oldid ;
1934 $rc->diffid = $diffid ;
1935 $rc->watched = $watched ;
1936 $rc->isnew = $isnew ;
1937 $rc->isminor = $isminor ;
1938 $rc->secureName = $t ;
1939 $rc->displayName = $nt ;
1940 $rc->link = $clink ;
1941 $rc->usercomment = $c ;
1942 $rc->islog = $nt->isLog() ;
1943
1944 if ( ( $isnew && $oldid == 0 ) || $nt->isLog() ) {
1945 $dlink = wfMsg( "cur" );
1946 } else {
1947 $dlink = $this->makeKnownLink( $t, wfMsg( "cur" ),
1948 "diff=0&oldid={$oldid}" );
1949 }
1950
1951 if ( $diffid == 0 || $nt->isLog() ) {
1952 $plink = wfMsg( "last" );
1953 } else {
1954 $plink = $this->makeKnownLink( $t, wfMsg( "last" ),
1955 "diff={$oldid}&oldid={$diffid}" );
1956 }
1957
1958 if ( 0 == $u ) {
1959 $ul = $this->makeKnownLink( $wgLang->specialPage( "Contributions" ),
1960 $ut, "target=" . $ut );
1961 } else { $ul = $this->makeLink( $wgLang->getNsText(
1962 Namespace::getUser() ) . ":{$ut}", $ut ); }
1963
1964 $rc->userlink = $ul ;
1965 $rc->lastlink = $plink ;
1966 $rc->curlink = $dlink ;
1967
1968 $utns=$wgLang->getNsText(Namespace::getTalk(Namespace::getUser()));
1969 $talkname=$wgLang->getNsText(Namespace::getTalk(0)); # use the shorter name
1970 $utl= $this->makeLink($utns . ":{$ut}", $talkname );
1971
1972 global $wgDisableAnonTalk;
1973 if ( ( 0 == $u ) && $wgUser->isSysop() ) {
1974 $blink = $this->makeKnownLink( $wgLang->specialPage(
1975 "Blockip" ), wfMsg( "blocklink" ), "ip={$ut}" );
1976 if( $wgDisableAnonTalk )
1977 $rc->usertalklink = " ({$blink})";
1978 else
1979 $rc->usertalklink = " ({$utl} | {$blink})";
1980 } else {
1981 if( $wgDisableAnonTalk && ($u == 0) )
1982 $rc->usertalklink = "";
1983 else
1984 $rc->usertalklink = " ({$utl})";
1985 }
1986
1987 if ( !isset ( $this->rc_cache[$t] ) ) $this->rc_cache[$t] = array() ;
1988 array_push ( $this->rc_cache[$t] , $rc ) ;
1989 return $ret;
1990 }
1991
1992
1993 function imageHistoryLine( $iscur, $ts, $img, $u, $ut, $size, $c )
1994 {
1995 global $wgUser, $wgLang, $wgTitle;
1996
1997 $dt = $wgLang->timeanddate( $ts, true );
1998 $del = wfMsg( "deleteimg" );
1999 $cur = wfMsg( "cur" );
2000
2001 if ( $iscur ) {
2002 $url = wfImageUrl( $img );
2003 $rlink = $cur;
2004 if ( $wgUser->isSysop() ) {
2005 $link = wfLocalUrlE( $wgTitle->getPrefixedText(), "image=" . $wgTitle->getURL() .
2006 "&action=delete" );
2007 $style = $this->getInternalLinkAttributes( $link, $del );
2008
2009 $dlink = "<a href=\"{$link}\"{$style}>{$del}</a>";
2010 } else {
2011 $dlink = $del;
2012 }
2013 } else {
2014 $url = wfEscapeHTML( wfImageArchiveUrl( $img ) );
2015 if( $wgUser->getID() != 0 ) {
2016 $rlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
2017 wfMsg( "revertimg" ), "action=revert&oldimage=" .
2018 urlencode( $img ) );
2019 $dlink = $this->makeKnownLink( $wgTitle->getPrefixedText(),
2020 $del, "action=delete&oldimage=" . urlencode( $img ) );
2021 } else {
2022 # Having live active links for non-logged in users
2023 # means that bots and spiders crawling our site can
2024 # inadvertently change content. Baaaad idea.
2025 $rlink = wfMsg( "revertimg" );
2026 $dlink = $del;
2027 }
2028 }
2029 if ( 0 == $u ) { $ul = $ut; }
2030 else { $ul = $this->makeLink( $wgLang->getNsText(
2031 Namespace::getUser() ) . ":{$ut}", $ut ); }
2032
2033 $nb = wfMsg( "nbytes", $size );
2034 $style = $this->getInternalLinkAttributes( $url, $dt );
2035
2036 $s = "<li> ({$dlink}) ({$rlink}) <a href=\"{$url}\"{$style}>{$dt}</a>"
2037 . " . . {$ul} ({$nb})";
2038
2039 if ( "" != $c && "*" != $c ) {
2040 $s .= " <em>(" . wfEscapeHTML( $c ) . ")</em>";
2041 }
2042 $s .= "</li>\n";
2043 return $s;
2044 }
2045
2046 function tocIndent($level) {
2047
2048 while($level-->0) $rv.="<div style=\"margin-left:2em;\">\n";
2049 return $rv;
2050
2051 }
2052
2053 function tocUnindent($level) {
2054 $rv = "";
2055 while($level-->0) $rv.="</div>\n";
2056 return $rv;
2057 }
2058
2059 // parameter level defines if we are on an indentation level
2060 function tocLine($anchor,$tocline,$level) {
2061
2062 if($level) {
2063
2064 return "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n";
2065 } else {
2066
2067 return "<div style=\"margin-bottom:0px;\">\n".
2068 "<A CLASS=\"internal\" HREF=\"#".$anchor."\">".$tocline."</A><BR>\n".
2069 "</div>\n";
2070 }
2071
2072 }
2073
2074 function tocTable($toc) {
2075 // note to CSS fanatics: putting this in a div does not work -- div won't auto-expand
2076 global $printable;
2077
2078 if (!$printable) {
2079 $hideline = " <script type='text/javascript'>showTocToggle(\"" . wfMsg("showtoc") . "\",\"" . wfMsg("hidetoc") . "\")</script>";
2080 }
2081 return
2082 "<p><table border=\"0\" id=\"toc\"><tr><td align=\"center\">\n".
2083 "<b>".wfMsg("toc")."</b>" .
2084 $hideline .
2085 "</td></tr><tr id='tocinside'><td align=\"left\">\n".
2086 $toc."</td></tr></table><P>\n";
2087 }
2088
2089 # These two do not check for permissions: check $wgTitle->userCanEdit before calling them
2090 function editSectionScript($section,$head) {
2091
2092 global $wgTitle,$wgUser,$oldid;
2093 if($oldid) return $head;
2094 $url = wfLocalUrlE(urlencode($wgTitle->getPrefixedText()),"action=edit&section=$section");
2095 return "<span onContextMenu='document.location=\"".$url."\";return false;'>{$head}</span>";
2096 }
2097
2098 function editSectionLink($section) {
2099
2100 global $printable;
2101 global $wgTitle,$wgUser,$oldid;
2102 if($oldid) return "";
2103 if ($printable) return "";
2104 $editurl="&section={$section}";
2105 $url=$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg("editsection"),"action=edit".$editurl);
2106 return "<div style=\"float:right;margin-left:5px;\"><small>[".$url."]</small></div>";
2107
2108 }
2109
2110 // This function is called by EditPage.php and shows a bulletin board style
2111 // toolbar for common editing functions. It can be disabled in the user preferences.
2112 // The necsesary JavaScript code can be found in style/wikibits.js.
2113 function getEditToolbar() {
2114
2115 global $wgUploadPath;
2116
2117 // toolarray an array of arrays which each include the filename of
2118 // the button image (without path), the opening tag, the closing tag,
2119 // and optionally a sample text that is inserted between the two when no
2120 // selection is highlighted.
2121 // The tip text is shown when the user moves the mouse over the button.
2122 $toolarray=array(
2123 array( "image"=>"button_bold.gif",
2124 "open"=>"\\'\\'\\'",
2125 "close"=>"\\'\\'\\'",
2126 "sample"=>wfMsg("bold_sample"),
2127 "tip"=>wfMsg("bold_tip")),
2128 array( "image"=>"button_italic.gif",
2129 "open"=>"\\'\\'",
2130 "close"=>"\\'\\'",
2131 "sample"=>wfMsg("italic_sample"),
2132 "tip"=>wfMsg("italic_tip")),
2133 array( "image"=>"button_link.gif",
2134 "open"=>"[[",
2135 "close"=>"]]",
2136 "sample"=>wfMsg("link_sample"),
2137 "tip"=>wfMsg("link_tip")),
2138 array( "image"=>"button_extlink.gif",
2139 "open"=>"[",
2140 "close"=>"]",
2141 "sample"=>wfMsg("extlink_sample"),
2142 "tip"=>wfMsg("extlink_tip")),
2143 array( "image"=>"button_headline.gif",
2144 "open"=>"\\n== ",
2145 "close"=>" ==\\n",
2146 "sample"=>wfMsg("headline_sample"),
2147 "tip"=>wfMsg("headline_tip")),
2148 array( "image"=>"button_math.gif",
2149 "open"=>"\\<math\\>",
2150 "close"=>"\\</math\\>",
2151 "sample"=>wfMsg("math_sample"),
2152 "tip"=>wfMsg("math_tip")),
2153 array( "image"=>"button_image.gif",
2154 "open"=>"[[Image:",
2155 "close"=>"]]",
2156 "sample"=>wfMsg("image_sample"),
2157 "tip"=>wfMsg("image_tip")),
2158 array( "image"=>"button_media.gif",
2159 "open"=>"[[Media:",
2160 "close"=>"]]",
2161 "sample"=>wfMsg("media_sample"),
2162 "tip"=>wfMsg("media_tip")),
2163 array( "image"=>"button_sig.gif",
2164 "open"=>"--~~~~",
2165 "close"=>"",
2166 "sample"=>"",
2167 "tip"=>wfMsg("sig_tip")),
2168 array( "image"=>"button_hr.gif",
2169 "open"=>"\\n----\\n",
2170 "close"=>"",
2171 "sample"=>"",
2172 "tip"=>wfMsg("hr_tip"))
2173 );
2174 $toolbar.="
2175 <div id=\"toolbar\">";
2176 foreach($toolarray as $tool) {
2177
2178 $image=$tool["image"];
2179 $open=$tool["open"];
2180 $close=$tool["close"];
2181 $sample=$tool["sample"];
2182
2183 // Note that we use the tip both for the ALT tag and the TITLE tag of the image.
2184 // Older browsers show a "speedtip" type message only for ALT.
2185 // Ideally these should be different, realistically they
2186 // probably don't need to be.
2187 $tip=$tool["tip"];
2188
2189 $toolbar.=
2190 "<a href=\"#\"".
2191 "onclick=\"javascript:insertTags('$open','$close','$sample');\">".
2192 "<img src=\"$wgUploadPath/$image\" border=\"0\" ALT=\"$tip\" TITLE=\"$tip\">".
2193 "</a>";
2194
2195 }
2196
2197 $toolbar.="</div>";
2198 return $toolbar;
2199
2200 }
2201 }
2202
2203 include_once( "SkinStandard.php" );
2204 include_once( "SkinNostalgia.php" );
2205 include_once( "SkinCologneBlue.php" );
2206
2207 #include_once( "SkinSmarty.php" );
2208
2209 ?>