Stage 2 of war on $wgTitle!! Make OutputPage, Skin and children rely on mTitle rather...
[lhc/web/wiklou.git] / skins / Standard.php
1 <?php
2 /**
3 * Standard (a.k.a. Classic) skin: old MediaWiki default skin
4 *
5 * @file
6 * @ingroup Skins
7 */
8
9 if( !defined( 'MEDIAWIKI' ) )
10 die( -1 );
11
12 /**
13 * @todo document
14 * @ingroup Skins
15 */
16 class SkinStandard extends Skin {
17
18 /**
19 *
20 */
21 function getHeadScripts( $allowUserJs ) {
22 global $wgStylePath, $wgJsMimeType, $wgStyleVersion;
23
24 $s = parent::getHeadScripts( $allowUserJs );
25 if ( 3 == $this->qbSetting() ) { # Floating left
26 $s .= "<script language='javascript' type='$wgJsMimeType' " .
27 "src='{$wgStylePath}/common/sticky.js?$wgStyleVersion'></script>\n";
28 }
29 return $s;
30 }
31
32 /**
33 *
34 */
35 function setupSkinUserCss( OutputPage $out ){
36 if ( 3 == $this->qbSetting() ) { # Floating left
37 $out->addStyle( 'common/quickbar.css' );
38 } else if ( 4 == $this->qbSetting() ) { # Floating right
39 $out->addStyle( 'common/quickbar-right.css' );
40 }
41 parent::setupSkinUserCss( $out );
42 }
43
44 /**
45 *
46 */
47 function reallyGenerateUserStylesheet() {
48 $s = parent::reallyGenerateUserStylesheet();
49 $qb = $this->qbSetting();
50
51 if ( 2 == $qb ) { # Right
52 $s .= "#quickbar { position: absolute; top: 4px; right: 4px; " .
53 "border-left: 2px solid #000000; }\n" .
54 "#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }\n";
55 } else if ( 1 == $qb || 3 == $qb ) {
56 $s .= "#quickbar { position: absolute; top: 4px; left: 4px; " .
57 "border-right: 1px solid gray; }\n" .
58 "#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }\n";
59 } else if ( 4 == $qb) {
60 $s .= "#quickbar { border-right: 1px solid gray; }\n" .
61 "#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }\n";
62 }
63 return $s;
64 }
65
66 /**
67 *
68 */
69 function getBodyOptions() {
70 $a = parent::getBodyOptions();
71
72 if ( 3 == $this->qbSetting() ) { # Floating left
73 $qb = "setup(\"quickbar\")";
74 if( $a['onload'] ) {
75 $a['onload'] .= ";$qb";
76 } else {
77 $a['onload'] = $qb;
78 }
79 }
80 return $a;
81 }
82
83 function doAfterContent() {
84 global $wgContLang, $wgLang;
85 wfProfileIn( __METHOD__ );
86 wfProfileIn( __METHOD__ . '-1' );
87
88 $s = "\n</div><br style=\"clear:both\" />\n";
89 $s .= "\n<div id='footer'>";
90 $s .= '<table border="0" cellspacing="0"><tr>';
91
92 wfProfileOut( __METHOD__ . '-1' );
93 wfProfileIn( __METHOD__ . '-2' );
94
95 $qb = $this->qbSetting();
96 $shove = ( $qb != 0 );
97 $left = ( $qb == 1 || $qb == 3 );
98 if( $wgContLang->isRTL() ) $left = !$left;
99
100 if ( $shove && $left ) { # Left
101 $s .= $this->getQuickbarCompensator();
102 }
103 wfProfileOut( __METHOD__ . '-2' );
104 wfProfileIn( __METHOD__ . '-3' );
105 $l = $wgContLang->isRTL() ? 'right' : 'left';
106 $s .= "<td class='bottom' align='$l' valign='top'>";
107
108 $s .= $this->bottomLinks();
109 $s .= "\n<br />" . $wgLang->pipeList( array(
110 $this->mainPageLink(),
111 $this->aboutLink(),
112 $this->specialLink( 'recentchanges' ),
113 $this->searchForm() ) )
114 . '<br /><span id="pagestats">' . $this->pageStats() . '</span>';
115
116 $s .= '</td>';
117 if ( $shove && !$left ) { # Right
118 $s .= $this->getQuickbarCompensator();
119 }
120 $s .= "</tr></table>\n</div>\n</div>\n";
121
122 wfProfileOut( __METHOD__ . '-3' );
123 wfProfileIn( __METHOD__ . '-4' );
124 if ( 0 != $qb ) {
125 $s .= $this->quickBar();
126 }
127 wfProfileOut( __METHOD__ . '-4' );
128 wfProfileOut( __METHOD__ );
129 return $s;
130 }
131
132 function quickBar() {
133 global $wgOut, $wgUser, $wgRequest, $wgContLang;
134 global $wgEnableUploads, $wgRemoteUploads;
135
136 wfProfileIn( __METHOD__ );
137
138 $action = $wgRequest->getText( 'action' );
139 $wpPreview = $wgRequest->getBool( 'wpPreview' );
140 $tns = $wgOut->getTitle()->getNamespace();
141
142 $s = "\n<div id='quickbar'>";
143 $s .= "\n" . $this->logoText() . "\n<hr class='sep' />";
144
145 $sep = "\n<br />";
146
147 # Use the first heading from the Monobook sidebar as the "browse" section
148 $bar = $this->buildSidebar();
149 unset( $bar['SEARCH'] );
150 unset( $bar['LANGUAGES'] );
151 unset( $bar['TOOLBOX'] );
152 $browseLinks = reset( $bar );
153
154 foreach ( $browseLinks as $link ) {
155 if ( $link['text'] != '-' ) {
156 $s .= "<a href=\"{$link['href']}\">" .
157 htmlspecialchars( $link['text'] ) . '</a>' . $sep;
158 }
159 }
160
161 if( $wgUser->isLoggedIn() ) {
162 $s.= $this->specialLink( 'watchlist' ) ;
163 $s .= $sep . $this->makeKnownLink( $wgContLang->specialPage( 'Contributions' ),
164 wfMsg( 'mycontris' ), 'target=' . wfUrlencode( $wgUser->getName() ) );
165 }
166 // only show watchlist link if logged in
167 $s .= "\n<hr class='sep' />";
168 $articleExists = $wgOut->getTitle()->getArticleId();
169 if ( $wgOut->isArticle() || $action == 'edit' || $action == 'history' || $wpPreview ) {
170 if( $wgOut->isArticle() ) {
171 $s .= '<strong>' . $this->editThisPage() . '</strong>';
172 } else { # backlink to the article in edit or history mode
173 if( $articleExists ){ # no backlink if no article
174 switch( $tns ) {
175 case NS_TALK:
176 case NS_USER_TALK:
177 case NS_PROJECT_TALK:
178 case NS_FILE_TALK:
179 case NS_MEDIAWIKI_TALK:
180 case NS_TEMPLATE_TALK:
181 case NS_HELP_TALK:
182 case NS_CATEGORY_TALK:
183 $text = wfMsg('viewtalkpage');
184 break;
185 case NS_MAIN:
186 $text = wfMsg( 'articlepage' );
187 break;
188 case NS_USER:
189 $text = wfMsg( 'userpage' );
190 break;
191 case NS_PROJECT:
192 $text = wfMsg( 'projectpage' );
193 break;
194 case NS_FILE:
195 $text = wfMsg( 'imagepage' );
196 break;
197 case NS_MEDIAWIKI:
198 $text = wfMsg( 'mediawikipage' );
199 break;
200 case NS_TEMPLATE:
201 $text = wfMsg( 'templatepage' );
202 break;
203 case NS_HELP:
204 $text = wfMsg( 'viewhelppage' );
205 break;
206 case NS_CATEGORY:
207 $text = wfMsg( 'categorypage' );
208 break;
209 default:
210 $text = wfMsg( 'articlepage' );
211 }
212
213 $link = $wgOut->getTitle()->getText();
214 if( $nstext = $wgContLang->getNsText( $tns ) ) { # add namespace if necessary
215 $link = $nstext . ':' . $link;
216 }
217
218 $s .= $this->makeLink( $link, $text );
219 } elseif( $wgOut->getTitle()->getNamespace() != NS_SPECIAL ) {
220 # we just throw in a "New page" text to tell the user that he's in edit mode,
221 # and to avoid messing with the separator that is prepended to the next item
222 $s .= '<strong>' . wfMsg( 'newpage' ) . '</strong>';
223 }
224
225 }
226
227 # "Post a comment" link
228 if( ( $wgOut->getTitle()->isTalkPage() || $wgOut->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
229 $s .= '<br />' . $this->makeKnownLinkObj( $wgOut->getTitle(), wfMsg( 'postcomment' ), 'action=edit&section=new' );
230
231 #if( $tns%2 && $action!='edit' && !$wpPreview) {
232 #$s.= '<br />'.$this->makeKnownLink($wgTitle->getPrefixedText(),wfMsg('postcomment'),'action=edit&section=new');
233 #}
234
235 /*
236 watching could cause problems in edit mode:
237 if user edits article, then loads "watch this article" in background and then saves
238 article with "Watch this article" checkbox disabled, the article is transparently
239 unwatched. Therefore we do not show the "Watch this page" link in edit mode
240 */
241 if ( $wgUser->isLoggedIn() && $articleExists) {
242 if( $action != 'edit' && $action != 'submit' ){
243 $s .= $sep . $this->watchThisPage();
244 }
245 if ( $wgOut->getTitle()->userCan( 'edit' ) )
246 $s .= $sep . $this->moveThisPage();
247 }
248 if ( $wgUser->isAllowed( 'delete' ) and $articleExists ) {
249 $s .= $sep . $this->deleteThisPage() .
250 $sep . $this->protectThisPage();
251 }
252 $s .= $sep . $this->talkLink();
253 if( $articleExists && $action != 'history' ) {
254 $s .= $sep . $this->historyLink();
255 }
256 $s.= $sep . $this->whatLinksHere();
257
258 if( $wgOut->isArticleRelated() ) {
259 $s .= $sep . $this->watchPageLinksLink();
260 }
261
262 if ( NS_USER == $wgOut->getTitle()->getNamespace()
263 || $wgOut->getTitle()->getNamespace() == NS_USER_TALK ) {
264
265 $id = User::idFromName( $wgOut->getTitle()->getText() );
266 $ip = User::isIP( $wgOut->getTitle()->getText() );
267
268 if( $id || $ip ){
269 $s .= $sep . $this->userContribsLink();
270 }
271 if( $this->showEmailUser( $id ) ) {
272 $s .= $sep . $this->emailUserLink();
273 }
274 }
275 $s .= "\n<br /><hr class='sep' />";
276 }
277
278 if ( $wgUser->isLoggedIn() && ( $wgEnableUploads || $wgRemoteUploads ) ) {
279 $s .= $this->specialLink( 'upload' ) . $sep;
280 }
281 $s .= $this->specialLink( 'specialpages' );
282
283 global $wgSiteSupportPage;
284 if( $wgSiteSupportPage ) {
285 $s .= "\n<br /><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
286 '" class="internal">' . wfMsg( 'sitesupport' ) . '</a>';
287 }
288
289 $s .= "\n<br /></div>\n";
290 wfProfileOut( __METHOD__ );
291 return $s;
292 }
293
294 }