1<?php 2 3/** 4 * Main file of the "vector" template for DokuWiki 5 * 6 * 7 * LICENSE: This file is open source software (OSS) and may be copied under 8 * certain conditions. See COPYING file for details or try to contact 9 * the author(s) of this file in doubt. 10 * 11 * @license GPLv2 (http://www.gnu.org/licenses/gpl2.html) 12 * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> 13 * @link http://andreas-haerter.com/projects/dokuwiki-template-vector 14 * @link http://www.dokuwiki.org/template:vector 15 * @link http://www.dokuwiki.org/devel:templates 16 * @link http://www.dokuwiki.org/devel:coding_style 17 * @link http://www.dokuwiki.org/devel:environment 18 * @link http://www.dokuwiki.org/devel:action_modes 19 */ 20 21 22//check if we are running within the DokuWiki environment 23if (!defined("DOKU_INC")){ 24 die(); 25} 26 27 28/** 29 * Stores the template wide action 30 * 31 * Different DokuWiki actions requiring some template logic. Therefore the 32 * template has to know, what we are doing right now - and that is what this 33 * var is for. 34 * 35 * Please have a look at the "mediamanager.php" and "detail.php" file in the 36 * same folder, they are also influencing the var's value. 37 * 38 * @var string 39 * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> 40 */ 41$vector_action = "article"; 42//note: I used $_REQUEST before (cause DokuWiki controls and fills it. Normally, 43// using $_REQUEST is a possible security threat. For details, see 44// <http://www.suspekt.org/2008/10/01/php-53-and-delayed-cross-site-request-forgerieshijacking/> 45// and <http://forum.dokuwiki.org/post/16524>), but it did not work as 46// expected by me (maybe it is a reference and setting $vector_action 47// also changed the contents of $_REQUEST?!). That is why I switched back, 48// checking $_GET and $_POST like I did it before. 49if (!empty($_GET["vecdo"])){ 50 $vector_action = (string)$_GET["vecdo"]; 51}elseif (!empty($_POST["vecdo"])){ 52 $vector_action = (string)$_POST["vecdo"]; 53} 54if (!empty($vector_action) && 55 $vector_action !== "article" && 56 $vector_action !== "print" && 57 $vector_action !== "detail" && 58 $vector_action !== "mediamanager" && 59 $vector_action !== "cite"){ 60 //ignore unknown values 61 $vector_action = "article"; 62} 63 64 65/** 66 * Stores the template wide context 67 * 68 * This template offers discussion pages via common articles, which should be 69 * marked as "special". DokuWiki does not know any "special" articles, therefore 70 * we have to take care about detecting if the current page is a discussion 71 * page or not. 72 * 73 * @var string 74 * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> 75 */ 76$vector_context = "article"; 77if (preg_match("/^".tpl_getConf("vector_discuss_ns")."?$|^".tpl_getConf("vector_discuss_ns").".*?$/i", ":".getNS(getID()))){ 78 $vector_context = "discuss"; 79} 80 81 82/** 83 * Stores the name the current client used to login 84 * 85 * @var string 86 * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> 87 */ 88$loginname = ""; 89if (!empty($conf["useacl"])){ 90 if (isset($_SERVER["REMOTE_USER"]) && //no empty() but isset(): "0" may be a valid username... 91 $_SERVER["REMOTE_USER"] !== ""){ 92 $loginname = $_SERVER["REMOTE_USER"]; //$INFO["client"] would not work here (-> e.g. if 93 //current IP differs from the one used to login) 94 } 95} 96 97 98//get needed language array 99include DOKU_TPLINC."lang/en/lang.php"; 100//overwrite English language values with available translations 101if (!empty($conf["lang"]) && 102 $conf["lang"] !== "en" && 103 file_exists(DOKU_TPLINC."/lang/".$conf["lang"]."/lang.php")){ 104 //get language file (partially translated language files are no problem 105 //cause non translated stuff is still existing as English array value) 106 include DOKU_TPLINC."/lang/".$conf["lang"]."/lang.php"; 107} 108 109 110//detect revision 111$rev = (int)$INFO["rev"]; //$INFO comes from the DokuWiku core 112if ($rev < 1){ 113 $rev = (int)$INFO["lastmod"]; 114} 115 116 117//get tab config 118include DOKU_TPLINC."/conf/tabs.php"; //default 119if (file_exists(DOKU_TPLINC."/user/tabs.php")){ 120 include DOKU_TPLINC."/user/tabs.php"; //add user defined 121} 122 123 124//get boxes config 125include DOKU_TPLINC."/conf/boxes.php"; //default 126if (file_exists(DOKU_TPLINC."/user/boxes.php")){ 127 include DOKU_TPLINC."/user/boxes.php"; //add user defined 128} 129 130 131//get button config 132include DOKU_TPLINC."/conf/buttons.php"; //default 133if (file_exists(DOKU_TPLINC."/user/buttons.php")){ 134 include DOKU_TPLINC."/user/buttons.php"; //add user defined 135} 136 137 138/** 139 * Helper to render the tabs (like a dynamic XHTML snippet) 140 * 141 * @param array The tab data to render within the snippet. Each element 142 * is represented through an subarray: 143 * $array = array("tab1" => array("text" => "hello world!", 144 * "href" => "http://www.example.com" 145 * "nofollow" => true), 146 * "tab2" => array("text" => "I did it again", 147 * "href" => DOKU_BASE."doku.php?id=foobar", 148 * "class" => "foobar-css"), 149 * "tab3" => array("text" => "I did it again and again", 150 * "href" => wl("start", false, false, "&"), 151 * "class" => "foobar-css"), 152 * "tab4" => array("text" => "Home", 153 * "wiki" => ":start" 154 * "accesskey" => "H")); 155 * Available keys within the subarrays: 156 * - "text" (mandatory) 157 * The text/label of the element. 158 * - "href" (optional) 159 * URL the element should point to (as link). Please submit raw, 160 * unencoded URLs, the encoding will be done by this function for 161 * security reasons. If the URL is not relative 162 * (= starts with http(s)://), the URL will be treated as external 163 * (=a special style will be used if "class" is not set). 164 * - "wiki" (optional) 165 * ID of a WikiPage to link (like ":start" or ":wiki:foobar"). 166 * - "class" (optional) 167 * Name of an additional CSS class to use for the element content. 168 * Works only in combination with "text" or "href", NOT with "wiki" 169 * (will be ignored in this case). 170 * - "nofollow" (optional) 171 * If set to TRUE, rel="nofollow" will be added to the link if "href" 172 * is set (otherwise this flag will do nothing). 173 * - "accesskey" (optional) 174 * accesskey="<value>" will be added to the link if "href" is set 175 * (otherwise this option will do nothing). 176 * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> 177 * @see _vector_renderButtons() 178 * @see _vector_renderBoxes() 179 * @link http://www.wikipedia.org/wiki/Nofollow 180 * @link http://de.selfhtml.org/html/verweise/tastatur.htm#kuerzel 181 * @link http://www.dokuwiki.org/devel:environment 182 * @link http://www.dokuwiki.org/devel:coding_style 183 */ 184function _vector_renderTabs($arr) 185{ 186 //is there something useful? 187 if (empty($arr) || 188 !is_array($arr)){ 189 return false; //nope, break operation 190 } 191 192 //array to store the created tabs into 193 $elements = array(); 194 195 //handle the tab data 196 foreach($arr as $li_id => $element){ 197 //basic check 198 if (empty($element) || 199 !is_array($element) || 200 !isset($element["text"]) || 201 (empty($element["href"]) && 202 empty($element["wiki"]))){ 203 continue; //ignore invalid stuff and go on 204 } 205 $li_created = true; //flag to control if we created any list element 206 $interim = ""; 207 //do we have an external link? 208 if (!empty($element["href"])){ 209 //add URL 210 $interim = "<a href=\"".hsc($element["href"])."\""; //@TODO: real URL encoding 211 //add rel="nofollow" attribute to the link? 212 if (!empty($element["nofollow"])){ 213 $interim .= " rel=\"nofollow\""; 214 } 215 //mark external link? 216 if (substr($element["href"], 0, 4) === "http" || 217 substr($element["href"], 0, 3) === "ftp"){ 218 $interim .= " class=\"urlextern\""; 219 } 220 //add access key? 221 if (!empty($element["accesskey"])){ 222 $interim .= " accesskey=\"".hsc($element["accesskey"])."\" title=\"[ALT+".hsc(strtoupper($element["accesskey"]))."]\""; 223 } 224 $interim .= "><span>".hsc($element["text"])."</span></a>"; 225 //internal wiki link 226 }else if (!empty($element["wiki"])){ 227 $interim = "<a href=\"".hsc(wl(cleanID($element["wiki"])))."\"><span>".hsc($element["text"])."</span></a>"; 228 } 229 //store it 230 $elements[] = "\n <li id=\"".hsc($li_id)."\"".(!empty($element["class"]) 231 ? " class=\"".hsc($element["class"])."\"" 232 : "").">".$interim."</li>"; 233 } 234 235 //show everything created 236 if (!empty($elements)){ 237 foreach ($elements as $element){ 238 echo $element; 239 } 240 } 241 return true; 242} 243 244 245/** 246 * Helper to render the boxes (like a dynamic XHTML snippet) 247 * 248 * @param array The box data to render within the snippet. Each box is 249 * represented through an subarray: 250 * $array = array("box-id1" => array("headline" => "hello world!", 251 * "xhtml" => "I am <i>here</i>.")); 252 * Available keys within the subarrays: 253 * - "xhtml" (mandatory) 254 * The content of the Box you want to show as XHTML. Attention: YOU 255 * HAVE TO TAKE CARE ABOUT FILTER EVENTUALLY USED INPUT/SECURITY. Be 256 * aware of XSS and stuff. 257 * - "headline" (optional) 258 * Headline to show above the box. Leave empty/do not set for none. 259 * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> 260 * @see _vector_renderButtons() 261 * @see _vector_renderTabs() 262 * @link http://www.wikipedia.org/wiki/Nofollow 263 * @link http://www.wikipedia.org/wiki/Cross-site_scripting 264 * @link http://www.dokuwiki.org/devel:coding_style 265 */ 266function _vector_renderBoxes($arr) 267{ 268 //is there something useful? 269 if (empty($arr) || 270 !is_array($arr)){ 271 return false; //nope, break operation 272 } 273 274 //array to store the created boxes into 275 $boxes = array(); 276 277 //handle the box data 278 foreach($arr as $div_id => $contents){ 279 //basic check 280 if (empty($contents) || 281 !is_array($contents) || 282 !isset($contents["xhtml"])){ 283 continue; //ignore invalid stuff and go on 284 } 285 $interim = " <div id=\"".hsc($div_id)."\" class=\"portal\">\n"; 286 if (isset($contents["headline"]) 287 && $contents["headline"] !== ""){ 288 $interim .= " <h5>".hsc($contents["headline"])."</h5>\n"; 289 } 290 $interim .= " <div class=\"body\">\n" 291 ." <div class=\"dokuwiki\">\n" //dokuwiki CSS class needed cause we might have to show rendered page content 292 .$contents["xhtml"]."\n" 293 ." </div>\n" 294 ." </div>\n" 295 ." </div>\n"; 296 //store it 297 $boxes[] = $interim; 298 } 299 //show everything created 300 if (!empty($boxes)){ 301 echo "\n"; 302 foreach ($boxes as $box){ 303 echo $box; 304 } 305 echo "\n"; 306 } 307 308 return true; 309} 310 311 312/** 313 * Helper to render the footer buttons (like a dynamic XHTML snippet) 314 * 315 * @param array The button data to render within the snippet. Each element 316 * is represented through an subarray: 317 * $array = array("btn1" => array("img" => DOKU_TPL."static/img/button-vector.png", 318 * "href" => "http://andreas-haerter.com/projects/dokuwiki-template-vector", 319 * "width" => 80, 320 * "height" => 15, 321 * "title" => "vector for DokuWiki", 322 * "nofollow" => false), 323 * "btn2" => array("img" => DOKU_TPL."user/mybutton1.png", 324 * "href" => wl("start", false, false, "&")), 325 * "btn3" => array("img" => DOKU_TPL."user/mybutton2.png", 326 * "href" => "http://www.example.com"); 327 * Available keys within the subarrays: 328 * - "img" (mandatory) 329 * The relative or full path of an image/button to show. Users may 330 * place own images within the /user/ dir of this template. 331 * - "href" (mandatory) 332 * URL the element should point to (as link). Please submit raw, 333 * unencoded URLs, the encoding will be done by this function for 334 * security reasons. 335 * - "width" (optional) 336 * width="<value>" will be added to the image tag if both "width" and 337 * "height" are set (otherwise, this will be ignored). 338 * - "height" (optional) 339 * height="<value>" will be added to the image tag if both "height" and 340 * "width" are set (otherwise, this will be ignored). 341 * - "nofollow" (optional) 342 * If set to TRUE, rel="nofollow" will be added to the link. 343 * - "nofollow" (optional) 344 * If set to TRUE, rel="nofollow" will be added to the link. 345 * - "title" (optional) 346 * title="<value>" will be added to the link and image if "title" 347 * is set + alt="<value>". 348 * @author Andreas Haerter <andreas.haerter@dev.mail-node.com> 349 * @see _vector_renderButtons() 350 * @see _vector_renderBoxes() 351 * @link http://www.wikipedia.org/wiki/Nofollow 352 * @link http://www.dokuwiki.org/devel:coding_style 353 */ 354function _vector_renderButtons($arr) 355{ 356 //array to store the created buttons into 357 $elements = array(); 358 359 //handle the button data 360 foreach($arr as $li_id => $element){ 361 //basic check 362 if (empty($element) || 363 !is_array($element) || 364 !isset($element["img"]) || 365 !isset($element["href"])){ 366 continue; //ignore invalid stuff and go on 367 } 368 $interim = ""; 369 370 //add URL 371 $interim = "<a href=\"".hsc($element["href"])."\""; //@TODO: real URL encoding 372 //add rel="nofollow" attribute to the link? 373 if (!empty($element["nofollow"])){ 374 $interim .= " rel=\"nofollow\""; 375 } 376 //add title attribute to the link? 377 if (!empty($element["title"])){ 378 $interim .= " title=\"".hsc($element["title"])."\""; 379 } 380 $interim .= " target=\"_blank\"><img src=\"".hsc($element["img"])."\""; 381 //add width and height attribute to the image? 382 if (!empty($element["width"]) && 383 !empty($element["height"])){ 384 $interim .= " width=\"".(int)$element["width"]."\" height=\"".(int)$element["height"]."\""; 385 } 386 //add title and alt attribute to the image? 387 if (!empty($element["title"])){ 388 $interim .= " title=\"".hsc($element["title"])."\" alt=\"".hsc($element["title"])."\""; 389 } else { 390 $interim .= " alt=\"\""; //alt is a mandatory attribute for images 391 } 392 $interim .= " border=\"0\" /></a>"; 393 394 //store it 395 $elements[] = " ".$interim."\n"; 396 } 397 398 //show everything created 399 if (!empty($elements)){ 400 echo "\n"; 401 foreach ($elements as $element){ 402 echo $element; 403 } 404 } 405 return true; 406} 407 408//workaround for the "jumping textarea" IE bug. CSS only fix not possible cause 409//some DokuWiki JavaScript is triggering this bug, too. See the following for 410//info: 411//- <http://blog.andreas-haerter.com/2010/05/28/fix-msie-8-auto-scroll-textarea-css-width-percentage-bug> 412//- <http://msdn.microsoft.com/library/cc817574.aspx> 413if ($ACT === "edit" && 414 !headers_sent()){ 415 header("X-UA-Compatible: IE=EmulateIE7"); 416} 417 418?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 419 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 420<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo hsc($conf["lang"]); ?>" lang="<?php echo hsc($conf["lang"]); ?>" dir="<?php echo hsc($lang["direction"]); ?>"> 421<head> 422<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 423<title><?php tpl_pagetitle(); echo " - ".hsc($conf["title"]); ?></title> 424<?php 425//show meta-tags 426tpl_metaheaders(); 427 428//manually load needed CSS? this is a workaround for PHP Bug #49642. In some 429//version/os combinations PHP is not able to parse INI-file entries if there 430//are slashes "/" used for the keynames (see bugreport for more information: 431//<http://bugs.php.net/bug.php?id=49692>). to trigger this workaround, simply 432//delete/rename vector's style.ini. 433if (!file_exists(DOKU_TPLINC."style.ini")){ 434 echo "<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"".DOKU_TPL."bug49642.php".((!empty($lang["direction"]) && $lang["direction"] === "rtl") ? "?langdir=rtl" : "")."\" />\n"; //var comes from DokuWiki core 435} 436 437//include default or userdefined favicon 438if (file_exists(DOKU_TPLINC."user/favicon.ico")) { 439 //user defined - you might find http://tools.dynamicdrive.com/favicon/ 440 //useful to generate one 441 echo "\n<link rel=\"shortcut icon\" href=\"".DOKU_TPL."user/favicon.ico\" />\n"; 442} elseif (file_exists(DOKU_TPLINC."user/favicon.png")) { 443 //note: I do NOT recommend PNG for favicons (cause it is not supported by 444 //all browsers), but some users requested this feature. 445 echo "\n<link rel=\"shortcut icon\" href=\"".DOKU_TPL."user/favicon.png\" />\n"; 446}else{ 447 //default 448 echo "\n<link rel=\"shortcut icon\" href=\"".DOKU_TPL."static/3rd/dokuwiki/favicon.ico\" />\n"; 449} 450 451//load userdefined js? 452if (tpl_getConf("vector_loaduserjs")){ 453 echo "<script type=\"text/javascript\" charset=\"utf-8\" src=\"".DOKU_TPL."user/user.js\"></script>\n"; 454} 455 456//show printable version? 457if ($vector_action === "print"){ 458 //note: this is just a workaround for people searching for a print version. 459 // don't forget to update the styles.ini, this is the really important 460 // thing! BTW: good text about this: http://is.gd/5MyG5 461 echo "<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"".DOKU_TPL."static/3rd/dokuwiki/print.css\" />\n" 462 ."<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"".DOKU_TPL."static/css/print.css\" />\n" 463 ."<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"".DOKU_TPL."user/print.css\" />\n"; 464} 465//load language specific css hacks? 466if (file_exists(DOKU_TPLINC."lang/".$conf["lang"]."/style.css")){ 467 $interim = trim(file_get_contents(DOKU_TPLINC."lang/".$conf["lang"]."/style.css")); 468 if (!empty($interim)){ 469 echo "<style type=\"text/css\" media=\"all\">\n".hsc($interim)."\n</style>\n"; 470 } 471} 472?> 473<!--[if lt IE 7]><style type="text/css">body{behavior:url("<?php echo DOKU_TPL; ?>static/3rd/vector/csshover.htc")}</style><![endif]--> 474</head> 475<body class="<?php 476 //different styles/backgrounds for different page types 477 switch (true){ 478 //special: tech 479 case ($vector_action === "detail"): 480 case ($vector_action === "mediamanager"): 481 case ($vector_action === "cite"): 482 case ($ACT === "search"): //var comes from DokuWiki 483 echo "mediawiki ltr ns-1 ns-special "; 484 break; 485 //special: wiki 486 case (preg_match("/^wiki$|^wiki:.*?$/i", getNS(getID()))): 487 case "mediawiki ltr capitalize-all-nouns ns-4 ns-subject "; 488 break; 489 //discussion 490 case ($vector_context === "discuss"): 491 echo "mediawiki ltr capitalize-all-nouns ns-1 ns-talk "; 492 break; 493 //"normal" content 494 case ($ACT === "edit"): //var comes from DokuWiki 495 case ($ACT === "draft"): //var comes from DokuWiki 496 case ($ACT === "revisions"): //var comes from DokuWiki 497 case ($vector_action === "print"): 498 default: 499 echo "mediawiki ltr capitalize-all-nouns ns-0 ns-subject "; 500 break; 501 } 502 //add additional CSS class to hide some elements when 503 //we have to show the (not) embedded mediamanager 504 if ($vector_action === "mediamanager" && 505 !tpl_getConf("vector_mediamanager_embedded")){ 506 echo "mmanagernotembedded "; 507 } ?>skin-vector"> 508<div id="page-base" class="noprint"></div> 509<div id="head-base" class="noprint"></div> 510 511<!-- start div id=content --> 512<div id="content"> 513 <a name="top" id="top"></a> 514 <a name="dokuwiki__top" id="dokuwiki__top"></a> 515 516 <!-- start main content area --> 517 <?php 518 //show messages (if there are any) 519 html_msgarea(); 520 //show site notice 521 if (tpl_getConf("vector_sitenotice")){ 522 //we have to show a custom sitenotice 523 if (empty($conf["useacl"]) || 524 auth_quickaclcheck(cleanID(tpl_getConf("vector_sitenotice_location"))) >= AUTH_READ){ //current user got access? 525 echo "\n <div id=\"siteNotice\" class=\"noprint\">\n"; 526 //get the rendered content of the defined wiki article to use as 527 //custom sitenotice. 528 $interim = tpl_include_page(tpl_getConf("vector_sitenotice_location"), false); 529 if ($interim === "" || 530 $interim === false){ 531 //show creation/edit link if the defined page got no content 532 echo "[ "; 533 tpl_pagelink(tpl_getConf("vector_sitenotice_location"), hsc($lang["vector_fillplaceholder"]." (".tpl_getConf("vector_sitenotice_location").")")); 534 echo " ]<br />"; 535 }else{ 536 //show the rendered page content 537 echo " <div class=\"dokuwiki\">\n" //dokuwiki CSS class needed cause we are showing rendered page content 538 .$interim."\n " 539 ."</div>"; 540 } 541 echo "\n </div>\n"; 542 } 543 } 544 //show breadcrumps if enabled and position = top 545 if ($conf["breadcrumbs"] == true && 546 tpl_getConf("vector_breadcrumbs_position") === "top"){ 547 echo "\n <div class=\"catlinks noprint\"><p>\n "; 548 tpl_breadcrumbs(); 549 echo "\n </p></div>\n"; 550 } 551 //show hierarchical breadcrumps if enabled and position = top 552 if ($conf["youarehere"] == true && 553 tpl_getConf("vector_youarehere_position") === "top"){ 554 echo "\n <div class=\"catlinks noprint\"><p>\n "; 555 tpl_youarehere(); 556 echo "\n </p></div>\n"; 557 } 558 ?> 559 560 <!-- start div id bodyContent --> 561 <div id="bodyContent" class="dokuwiki"> 562 <!-- start rendered wiki content --> 563 <?php 564 //flush the buffer for faster page rendering, heaviest content follows 565 flush(); 566 //decide which type of pagecontent we have to show 567 switch ($vector_action){ 568 //"image details" 569 case "detail": 570 include DOKU_TPLINC."inc_detail.php"; 571 break; 572 //file browser/"mediamanager" 573 case "mediamanager": 574 include DOKU_TPLINC."inc_mediamanager.php"; 575 break; 576 //"cite this article" 577 case "cite": 578 include DOKU_TPLINC."inc_cite.php"; 579 break; 580 //show "normal" content 581 default: 582 tpl_content(((tpl_getConf("vector_toc_position") === "article") ? true : false)); 583 break; 584 } 585 ?> 586 <!-- end rendered wiki content --> 587 <div class="clearer"></div> 588 </div> 589 <!-- end div id bodyContent --> 590 591 <?php 592 //show breadcrumps if enabled and position = bottom 593 if ($conf["breadcrumbs"] == true && 594 tpl_getConf("vector_breadcrumbs_position") === "bottom"){ 595 echo "\n <div class=\"catlinks noprint\"><p>\n "; 596 tpl_breadcrumbs(); 597 echo "\n </p></div>\n"; 598 } 599 //show hierarchical breadcrumps if enabled and position = bottom 600 if ($conf["youarehere"] == true && 601 tpl_getConf("vector_youarehere_position") === "bottom"){ 602 echo "\n <div class=\"catlinks noprint\"><p>\n "; 603 tpl_youarehere(); 604 echo "\n </p></div>\n"; 605 } 606 ?> 607 608</div> 609<!-- end div id=content --> 610 611 612<!-- start div id=head --> 613<div id="head" class="noprint"> 614 <?php 615 //show personal tools 616 if (!empty($conf["useacl"])){ //...makes only sense if there are users 617 echo "\n" 618 ." <div id=\"p-personal\">\n" 619 ." <ul>\n"; 620 //login? 621 if ($loginname === ""){ 622 echo " <li id=\"pt-login\"><a href=\"".wl(cleanID(getId()), array("do" => "login"))."\" rel=\"nofollow\">".hsc($lang["btn_login"])."</a></li>\n"; //language comes from DokuWiki core 623 }else{ 624 //username and userpage 625 echo " <li id=\"pt-userpage\">".(tpl_getConf("vector_userpage") 626 ? html_wikilink(tpl_getConf("vector_userpage_ns").$loginname, hsc($loginname)) 627 : hsc($loginname))."</li>"; 628 //personal discussion 629 if (tpl_getConf("vector_discuss") && 630 tpl_getConf("vector_userpage")){ 631 echo " <li id=\"pt-mytalk\">".html_wikilink(tpl_getConf("vector_discuss_ns").ltrim(tpl_getConf("vector_userpage_ns"), ":").$loginname, hsc($lang["vector_mytalk"]))."</li>"; 632 } 633 //admin 634 if (!empty($INFO["isadmin"]) || 635 !empty($INFO["ismanager"])){ 636 echo " <li id=\"pt-admin\"><a href=\"".wl(cleanID(getId()), array("do" => "admin"))."\" rel=\"nofollow\">".hsc($lang["btn_admin"])."</a></li>\n"; //language comes from DokuWiki core 637 } 638 //profile 639 echo " <li id=\"pt-preferences\"><a href=\"".wl(cleanID(getId()), array("do" => "profile"))."\" rel=\"nofollow\">".hsc($lang["btn_profile"])."</a></li>\n"; //language comes from DokuWiki core 640 //logout 641 echo " <li id=\"pt-logout\"><a href=\"".wl(cleanID(getId()), array("do" => "logout"))."\" rel=\"nofollow\">".hsc($lang["btn_logout"])."</a></li>\n"; //language comes from DokuWiki core 642 } 643 echo " </ul>\n" 644 ." </div>\n"; 645 } 646 ?> 647 648 <!-- start div id=left-navigation --> 649 <div id="left-navigation"> 650 <div id="p-namespaces" class="vectorTabs"> 651 <ul><?php 652 //show tabs: left. see vector/user/tabs.php to configure them 653 if (!empty($_vector_tabs_left) && 654 is_array($_vector_tabs_left)){ 655 _vector_renderTabs($_vector_tabs_left); 656 } 657 ?> 658 659 </ul> 660 </div> 661 </div> 662 <!-- end div id=left-navigation --> 663 664 <!-- start div id=right-navigation --> 665 <div id="right-navigation"> 666 <div id="p-views" class="vectorTabs"> 667 <ul><?php 668 //show tabs: right. see vector/user/tabs.php to configure them 669 if (!empty($_vector_tabs_right) && 670 is_array($_vector_tabs_right)){ 671 _vector_renderTabs($_vector_tabs_right); 672 } 673 ?> 674 675 </ul> 676 </div> 677 <div id="p-search"> 678 <h5> 679 <label for="qsearch__in"><?php echo hsc($lang["vector_search"]); ?></label> 680 </h5> 681 <form action="<?php echo wl(); ?>" accept-charset="utf-8" id="dw__search" name="dw__search"> 682 <input type="hidden" name="do" value="search" /> 683 <div id="simpleSearch"> 684 <input id="qsearch__in" name="id" type="text" accesskey="f" value="" /> 685 <button id="searchButton" type="submit" name="button" title="<?php echo hsc($lang["vector_btn_search_title"]); ?>"> </button> 686 </div> 687 <div id="qsearch__out" class="ajax_qsearch JSpopup"></div> 688 </form> 689 </div> 690 </div> 691 <!-- end div id=right-navigation --> 692 693</div> 694<!-- end div id=head --> 695 696<!-- start panel/sidebar --> 697<div id="panel" class="noprint"> 698 <!-- start logo --> 699 <div id="p-logo"> 700 <?php 701 //include default or userdefined logo 702 echo "<a href=\"".wl()."\" "; 703 if (file_exists(DOKU_TPLINC."user/logo.png")){ 704 //user defined PNG 705 echo "style=\"background-image:url(".DOKU_TPL."user/logo.png);\""; 706 }elseif (file_exists(DOKU_TPLINC."user/logo.gif")){ 707 //user defined GIF 708 echo "style=\"background-image:url(".DOKU_TPL."user/logo.gif);\""; 709 }elseif (file_exists(DOKU_TPLINC."user/logo.jpg")){ 710 //user defined JPG 711 echo "style=\"background-image:url(".DOKU_TPL."user/logo.jpg);\""; 712 }else{ 713 //default 714 echo "style=\"background-image:url(".DOKU_TPL."static/3rd/dokuwiki/logo.png);\""; 715 } 716 echo " accesskey=\"h\" title=\"[ALT+H]\"></a>\n"; 717 ?> 718 </div> 719 <!-- end logo --> 720 721 <?php 722 //show boxes, see vector/user/boxes.php to configure them 723 if (!empty($_vector_boxes) && 724 is_array($_vector_boxes)){ 725 _vector_renderBoxes($_vector_boxes); 726 } 727 ?> 728 729</div> 730<!-- end panel/sidebar --> 731 732<!-- start footer --> 733<div id="footer"> 734 <ul id="footer-info"> 735 <li id="footer-info-lastmod"> 736 <?php tpl_pageinfo()?><br /> 737 </li> 738 <?php 739 //copyright notice 740 if (tpl_getConf("vector_copyright")){ 741 //show dokuwikis default notice? 742 if (tpl_getConf("vector_copyright_default")){ 743 echo "<li id=\"footer-info-copyright\">\n <div class=\"dokuwiki\">"; //dokuwiki CSS class needed cause we have to show DokuWiki content 744 tpl_license(false); 745 echo "</div>\n </li>\n"; 746 //show custom notice. 747 }else{ 748 if (empty($conf["useacl"]) || 749 auth_quickaclcheck(cleanID(tpl_getConf("vector_copyright_location"))) >= AUTH_READ){ //current user got access? 750 echo "<li id=\"footer-info-copyright\">\n "; 751 //get the rendered content of the defined wiki article to use as custom notice 752 $interim = tpl_include_page(tpl_getConf("vector_copyright_location"), false); 753 if ($interim === "" || 754 $interim === false){ 755 //show creation/edit link if the defined page got no content 756 echo "[ "; 757 tpl_pagelink(tpl_getConf("vector_copyright_location"), hsc($lang["vector_fillplaceholder"]." (".tpl_getConf("vector_copyright_location").")")); 758 echo " ]<br />"; 759 }else{ 760 //show the rendered page content 761 echo "<div class=\"dokuwiki\">\n" //dokuwiki CSS class needed cause we are showing rendered page content 762 .$interim."\n " 763 ."</div>"; 764 } 765 echo "\n </li>\n"; 766 } 767 } 768 } 769 ?> 770 </ul> 771 <ul id="footer-places" class="noprint"> 772 <li><?php 773 //show buttons, see vector/user/buttons.php to configure them 774 if (!empty($_vector_btns) && 775 is_array($_vector_btns)){ 776 _vector_renderButtons($_vector_btns); 777 } 778 ?> 779 </li> 780 </ul> 781 <div style="clearer"></div> 782</div> 783<!-- end footer --> 784<?php 785//provide DokuWiki housekeeping, required in all templates 786tpl_indexerWebBug(); 787?> 788 789</body> 790</html> 791