xref: /template/wikiweko/main.php (revision 766a7074ccd08c3dc6ee1914515a0b8d06f7e0d3)
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 <development@andreas-haerter.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 <development@andreas-haerter.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 <development@andreas-haerter.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 <development@andreas-haerter.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 DokuWiki 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 a 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 <development@andreas-haerter.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 a 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 <development@andreas-haerter.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 a 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 *        - "title" (optional)
344 *          title="<value>"  will be added to the link and image if "title"
345 *          is set + alt="<value>".
346 * @author Andreas Haerter <development@andreas-haerter.com>
347 * @see _vector_renderButtons()
348 * @see _vector_renderBoxes()
349 * @link http://www.wikipedia.org/wiki/Nofollow
350 * @link http://www.dokuwiki.org/devel:coding_style
351 */
352function _vector_renderButtons($arr)
353{
354    //array to store the created buttons into
355    $elements = array();
356
357    //handle the button data
358    foreach($arr as $li_id => $element){
359        //basic check
360        if (empty($element) ||
361            !is_array($element) ||
362            !isset($element["img"]) ||
363            !isset($element["href"])){
364            continue; //ignore invalid stuff and go on
365        }
366        $interim = "";
367
368        //add URL
369        $interim = "<a href=\"".hsc($element["href"])."\""; //@TODO: real URL encoding
370        //add rel="nofollow" attribute to the link?
371        if (!empty($element["nofollow"])){
372            $interim .= " rel=\"nofollow\"";
373        }
374        //add title attribute to the link?
375        if (!empty($element["title"])){
376            $interim .= " title=\"".hsc($element["title"])."\"";
377        }
378        $interim .= " target=\"_blank\"><img src=\"".hsc($element["img"])."\"";
379        //add width and height attribute to the image?
380        if (!empty($element["width"]) &&
381            !empty($element["height"])){
382            $interim .= " width=\"".(int)$element["width"]."\" height=\"".(int)$element["height"]."\"";
383        }
384        //add title and alt attribute to the image?
385        if (!empty($element["title"])){
386            $interim .= " title=\"".hsc($element["title"])."\" alt=\"".hsc($element["title"])."\"";
387        } else {
388            $interim .= " alt=\"\""; //alt is a mandatory attribute for images
389        }
390        $interim .= " border=\"0\" /></a>";
391
392        //store it
393        $elements[] = "      ".$interim."\n";
394    }
395
396    //show everything created
397    if (!empty($elements)){
398        echo  "\n";
399        foreach ($elements as $element){
400            echo $element;
401        }
402    }
403    return true;
404}
405
406//workaround for the "jumping textarea" IE bug. CSS only fix not possible cause
407//some DokuWiki JavaScript is triggering this bug, too. See the following for
408//info:
409//- <http://blog.andreas-haerter.com/2010/05/28/fix-msie-8-auto-scroll-textarea-css-width-percentage-bug>
410//- <http://msdn.microsoft.com/library/cc817574.aspx>
411if ($ACT === "edit" &&
412    !headers_sent()){
413    header("X-UA-Compatible: IE=EmulateIE7");
414}
415
416?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
417    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
418<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"]); ?>">
419<head>
420<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
421<title><?php tpl_pagetitle(); echo " - ".hsc($conf["title"]); ?></title>
422<?php
423//show meta-tags
424tpl_metaheaders();
425echo "<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />";
426
427//manually load needed CSS? this is a workaround for PHP Bug #49642. In some
428//version/os combinations PHP is not able to parse INI-file entries if there
429//are slashes "/" used for the keynames (see bugreport for more information:
430//<http://bugs.php.net/bug.php?id=49692>). to trigger this workaround, simply
431//delete/rename vector's style.ini.
432if (!file_exists(DOKU_TPLINC."style.ini")){
433    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
434}
435
436//include default or userdefined favicon
437//
438//note: since 2011-04-22 "Rincewind RC1", there is a core function named
439//      "tpl_getFavicon()". But its functionality is not really fitting the
440//      behaviour of this template, therefore I don't use it here.
441if (file_exists(DOKU_TPLINC."user/favicon.ico")) {
442    //user defined - you might find http://tools.dynamicdrive.com/favicon/
443    //useful to generate one
444    echo "\n<link rel=\"shortcut icon\" href=\"".DOKU_TPL."user/favicon.ico\" />\n";
445} elseif (file_exists(DOKU_TPLINC."user/favicon.png")) {
446    //note: I do NOT recommend PNG for favicons (cause it is not supported by
447    //all browsers), but some users requested this feature.
448    echo "\n<link rel=\"shortcut icon\" href=\"".DOKU_TPL."user/favicon.png\" />\n";
449}else{
450    //default
451    echo "\n<link rel=\"shortcut icon\" href=\"".DOKU_TPL."static/3rd/dokuwiki/favicon.ico\" />\n";
452}
453
454//load userdefined js?
455if (tpl_getConf("vector_loaduserjs")){
456    echo "<script type=\"text/javascript\" charset=\"utf-8\" src=\"".DOKU_TPL."user/user.js\"></script>\n";
457}
458
459//show printable version?
460if ($vector_action === "print"){
461  //note: this is just a workaround for people searching for a print version.
462  //      don't forget to update the styles.ini, this is the really important
463  //      thing! BTW: good text about this: http://is.gd/5MyG5
464  echo  "<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"".DOKU_TPL."static/3rd/dokuwiki/print.css\" />\n"
465       ."<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"".DOKU_TPL."static/css/print.css\" />\n"
466       ."<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"".DOKU_TPL."user/print.css\" />\n";
467}
468//load language specific css hacks?
469if (file_exists(DOKU_TPLINC."lang/".$conf["lang"]."/style.css")){
470  $interim = trim(file_get_contents(DOKU_TPLINC."lang/".$conf["lang"]."/style.css"));
471  if (!empty($interim)){
472      echo "<style type=\"text/css\" media=\"all\">\n".hsc($interim)."\n</style>\n";
473  }
474}
475?>
476<!--[if lt IE 7]><style type="text/css">body{behavior:url("<?php echo DOKU_TPL; ?>static/3rd/vector/csshover.htc")}</style><![endif]-->
477</head>
478<body class="<?php
479             //different styles/backgrounds for different page types
480             switch (true){
481                  //special: tech
482                  case ($vector_action === "detail"):
483                  case ($vector_action === "mediamanager"):
484                  case ($vector_action === "cite"):
485                  case ($ACT === "search"): //var comes from DokuWiki
486                    echo "mediawiki ltr ns-1 ns-special ";
487                    break;
488                  //special: wiki
489                  case (preg_match("/^wiki$|^wiki:.*?$/i", getNS(getID()))):
490                    case "mediawiki ltr capitalize-all-nouns ns-4 ns-subject ";
491                    break;
492                  //discussion
493                  case ($vector_context === "discuss"):
494                    echo "mediawiki ltr capitalize-all-nouns ns-1 ns-talk ";
495                    break;
496                  //"normal" content
497                  case ($ACT === "edit"): //var comes from DokuWiki
498                  case ($ACT === "draft"): //var comes from DokuWiki
499                  case ($ACT === "revisions"): //var comes from DokuWiki
500                  case ($vector_action === "print"):
501                  default:
502                    echo "mediawiki ltr capitalize-all-nouns ns-0 ns-subject ";
503                    break;
504              }
505              //add additional CSS class to hide some elements when
506              //we have to show the (not) embedded mediamanager
507              if ($vector_action === "mediamanager" &&
508                  !tpl_getConf("vector_mediamanager_embedded")){
509                  echo "mmanagernotembedded ";
510              } ?>skin-vector">
511<div id="page-container">
512<div id="page-base" class="noprint"></div>
513<div id="head-base" class="noprint"></div>
514
515<!-- start div id=content -->
516<div id="content">
517  <a name="top" id="top"></a>
518  <a name="dokuwiki__top" id="dokuwiki__top"></a>
519
520  <!-- start main content area -->
521  <?php
522  //show messages (if there are any)
523  html_msgarea();
524  //show site notice
525  if (tpl_getConf("vector_sitenotice")){
526      //we have to show a custom sitenotice
527      if (empty($conf["useacl"]) ||
528          auth_quickaclcheck(cleanID(tpl_getConf("vector_sitenotice_location"))) >= AUTH_READ){ //current user got access?
529          echo "\n  <div id=\"siteNotice\" class=\"noprint\">\n";
530          //get the rendered content of the defined wiki article to use as
531          //custom sitenotice.
532          $interim = tpl_include_page(tpl_getConf("vector_sitenotice_location"), false);
533          if ($interim === "" ||
534              $interim === false){
535              //show creation/edit link if the defined page got no content
536              echo "[&#160;";
537              tpl_pagelink(tpl_getConf("vector_sitenotice_location"), hsc($lang["vector_fillplaceholder"]." (".tpl_getConf("vector_sitenotice_location").")"));
538              echo "&#160;]<br />";
539          }else{
540              //show the rendered page content
541              echo  "    <div class=\"dokuwiki\">\n" //dokuwiki CSS class needed cause we are showing rendered page content
542                   .$interim."\n    "
543                   ."</div>";
544          }
545          echo "\n  </div>\n";
546      }
547  }
548  //show breadcrumps if enabled and position = top
549  if ($conf["breadcrumbs"] == true &&
550      $vector_action !== "mediamanager" &&
551      (empty($conf["useacl"]) || //are there any users?
552       $loginname !== "" || //user is logged in?
553       !tpl_getConf("vector_closedwiki")) &&
554      tpl_getConf("vector_breadcrumbs_position") === "top"){
555      echo "\n  <div class=\"catlinks noprint\"><p>\n    ";
556      tpl_breadcrumbs();
557      echo "\n  </p></div>\n";
558  }
559  //show hierarchical breadcrumps if enabled and position = top
560  if ($conf["youarehere"] == true &&
561      $vector_action !== "mediamanager" &&
562      (empty($conf["useacl"]) || //are there any users?
563       $loginname !== "" || //user is logged in?
564       !tpl_getConf("vector_closedwiki")) &&
565      tpl_getConf("vector_youarehere_position") === "top"){
566      echo "\n  <div class=\"catlinks noprint\"><p>\n    ";
567      tpl_youarehere();
568      echo "\n  </p></div>\n";
569  }
570  ?>
571
572  <!-- start div id bodyContent -->
573  <div id="bodyContent" class="dokuwiki">
574    <!-- start rendered wiki content -->
575    <?php
576    //flush the buffer for faster page rendering, heaviest content follows
577    if (function_exists("tpl_flush")) {
578        tpl_flush(); //exists since 2010-11-07 "Anteater"...
579    } else {
580        flush(); //...but I won't loose compatibility to 2009-12-25 "Lemming" right now.
581    }
582    //decide which type of pagecontent we have to show
583    switch ($vector_action){
584        //"image details"
585        case "detail":
586            include DOKU_TPLINC."inc_detail.php";
587            break;
588        //file browser/"mediamanager"
589        case "mediamanager":
590            include DOKU_TPLINC."inc_mediamanager.php";
591            break;
592        //"cite this article"
593        case "cite":
594            include DOKU_TPLINC."inc_cite.php";
595            break;
596        //show "normal" content
597        default:
598            tpl_content(((tpl_getConf("vector_toc_position") === "article") ? true : false));
599            break;
600    }
601    ?>
602    <!-- end rendered wiki content -->
603    <div class="clearer"></div>
604  </div>
605  <!-- end div id bodyContent -->
606
607  <?php
608  //show breadcrumps if enabled and position = bottom
609  if ($conf["breadcrumbs"] == true &&
610      $vector_action !== "mediamanager" &&
611      (empty($conf["useacl"]) || //are there any users?
612       $loginname !== "" || //user is logged in?
613       !tpl_getConf("vector_closedwiki")) &&
614      tpl_getConf("vector_breadcrumbs_position") === "bottom"){
615      echo "\n  <div class=\"catlinks noprint\"><p>\n    ";
616      tpl_breadcrumbs();
617      echo "\n  </p></div>\n";
618  }
619  //show hierarchical breadcrumps if enabled and position = bottom
620  if ($conf["youarehere"] == true &&
621      $vector_action !== "mediamanager" &&
622      (empty($conf["useacl"]) || //are there any users?
623       $loginname !== "" || //user is logged in?
624       !tpl_getConf("vector_closedwiki")) &&
625      tpl_getConf("vector_youarehere_position") === "bottom"){
626      echo "\n  <div class=\"catlinks noprint\"><p>\n    ";
627      tpl_youarehere();
628      echo "\n  </p></div>\n";
629  }
630  ?>
631
632</div>
633<!-- end div id=content -->
634
635
636<!-- start div id=head -->
637<div id="head" class="noprint">
638  <?php
639  //show personal tools
640  if (!empty($conf["useacl"])){ //...makes only sense if there are users
641      echo  "\n"
642           ."  <div id=\"p-personal\">\n"
643           ."    <ul>\n";
644      //login?
645      if ($loginname === ""){
646          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
647      }else{
648          //username and userpage
649          echo "      <li id=\"pt-userpage\">".(tpl_getConf("vector_userpage")
650                                                ? html_wikilink(tpl_getConf("vector_userpage_ns").$loginname, hsc($loginname))
651                                                : hsc($loginname))."</li>";
652          //personal discussion
653          if (tpl_getConf("vector_discuss") &&
654              tpl_getConf("vector_userpage")){
655              echo "      <li id=\"pt-mytalk\">".html_wikilink(tpl_getConf("vector_discuss_ns").ltrim(tpl_getConf("vector_userpage_ns"), ":").$loginname, hsc($lang["vector_mytalk"]))."</li>";
656          }
657          //admin
658          if (!empty($INFO["isadmin"]) ||
659              !empty($INFO["ismanager"])){
660              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
661          }
662          //profile
663          if (actionOK("profile")){ //check if action is disabled
664              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
665          }
666          //logout
667          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
668      }
669      echo  "    </ul>\n"
670           ."  </div>\n";
671  }
672  ?>
673
674  <!-- start div id=left-navigation -->
675  <div id="left-navigation">
676    <div id="p-namespaces" class="vectorTabs">
677      <ul><?php
678          //show tabs: left. see vector/user/tabs.php to configure them
679          if (!empty($_vector_tabs_left) &&
680              is_array($_vector_tabs_left)){
681              _vector_renderTabs($_vector_tabs_left);
682          }
683          ?>
684
685      </ul>
686    </div>
687  </div>
688  <!-- end div id=left-navigation -->
689
690  <!-- start div id=right-navigation -->
691  <div id="right-navigation">
692    <div id="p-views" class="vectorTabs">
693      <ul><?php
694          //show tabs: right. see vector/user/tabs.php to configure them
695          if (!empty($_vector_tabs_right) &&
696              is_array($_vector_tabs_right)){
697              _vector_renderTabs($_vector_tabs_right);
698          }
699          ?>
700
701      </ul>
702    </div>
703<?php if (actionOK("search")){ ?>
704    <div id="p-search">
705      <h5>
706        <label for="qsearch__in"><?php echo hsc($lang["vector_search"]); ?></label>
707      </h5>
708      <form action="<?php echo wl(); ?>" accept-charset="utf-8" id="dw__search" name="dw__search">
709        <input type="hidden" name="do" value="search" />
710        <div id="simpleSearch">
711          <input id="qsearch__in" name="id" type="text" accesskey="f" value="" />
712          <button id="searchButton" type="submit" name="button" title="<?php echo hsc($lang["vector_btn_search_title"]); ?>">&nbsp;</button>
713        </div>
714        <div id="qsearch__out" class="ajax_qsearch JSpopup"></div>
715      </form>
716    </div>
717<?php } ?>
718  </div>
719  <!-- end div id=right-navigation -->
720
721</div>
722<!-- end div id=head -->
723
724<!-- start panel/sidebar -->
725<div id="panel" class="noprint">
726  <!-- start logo -->
727  <div id="p-logo">
728      <?php
729      //include default or userdefined logo
730      echo "<a href=\"".wl()."\" ";
731      if (file_exists(DOKU_TPLINC."user/logo.png")){
732          //user defined PNG
733          echo "style=\"background-image:url(".DOKU_TPL."user/logo.png);\"";
734      }elseif (file_exists(DOKU_TPLINC."user/logo.gif")){
735          //user defined GIF
736          echo "style=\"background-image:url(".DOKU_TPL."user/logo.gif);\"";
737      }elseif (file_exists(DOKU_TPLINC."user/logo.jpg")){
738          //user defined JPG
739          echo "style=\"background-image:url(".DOKU_TPL."user/logo.jpg);\"";
740      }else{
741          //default
742          echo "style=\"background-image:url(".DOKU_TPL."static/3rd/dokuwiki/logo.png);\"";
743      }
744      echo " accesskey=\"h\" title=\"[ALT+H]\"></a>\n";
745      ?>
746  </div>
747  <!-- end logo -->
748
749  <?php
750  //show boxes, see vector/user/boxes.php to configure them
751  if (!empty($_vector_boxes) &&
752      is_array($_vector_boxes)){
753      _vector_renderBoxes($_vector_boxes);
754  }
755  ?>
756
757</div>
758<!-- end panel/sidebar -->
759</div>
760<!-- end page-container -->
761
762<!-- start footer -->
763<div id="footer">
764  <ul id="footer-info">
765    <li id="footer-info-lastmod">
766      <?php tpl_pageinfo()?><br />
767    </li>
768    <?php
769    //copyright notice
770    if (tpl_getConf("vector_copyright")){
771        //show dokuwiki's default notice?
772        if (tpl_getConf("vector_copyright_default")){
773            echo "<li id=\"footer-info-copyright\">\n      <div class=\"dokuwiki\">";  //dokuwiki CSS class needed cause we have to show DokuWiki content
774            tpl_license(false);
775            echo "</div>\n    </li>\n";
776        //show custom notice.
777        }else{
778            if (empty($conf["useacl"]) ||
779                auth_quickaclcheck(cleanID(tpl_getConf("vector_copyright_location"))) >= AUTH_READ){ //current user got access?
780                echo "<li id=\"footer-info-copyright\">\n        ";
781                //get the rendered content of the defined wiki article to use as custom notice
782                $interim = tpl_include_page(tpl_getConf("vector_copyright_location"), false);
783                if ($interim === "" ||
784                    $interim === false){
785                    //show creation/edit link if the defined page got no content
786                    echo "[&#160;";
787                    tpl_pagelink(tpl_getConf("vector_copyright_location"), hsc($lang["vector_fillplaceholder"]." (".tpl_getConf("vector_copyright_location").")"));
788                    echo "&#160;]<br />";
789                }else{
790                    //show the rendered page content
791                    echo  "<div class=\"dokuwiki\">\n" //dokuwiki CSS class needed cause we are showing rendered page content
792                         .$interim."\n        "
793                         ."</div>";
794                }
795                echo "\n    </li>\n";
796            }
797        }
798    }
799    ?>
800  </ul>
801  <ul id="footer-places" class="noprint">
802    <li><?php
803        //show buttons, see vector/user/buttons.php to configure them
804        if (!empty($_vector_btns) &&
805            is_array($_vector_btns)){
806            _vector_renderButtons($_vector_btns);
807        }
808        ?>
809    </li>
810  </ul>
811  <div style="clearer"></div>
812</div>
813<!-- end footer -->
814<?php
815//provide DokuWiki housekeeping, required in all templates
816tpl_indexerWebBug();
817
818//include web analytics software
819if (file_exists(DOKU_TPLINC."/user/tracker.php")){
820    include DOKU_TPLINC."/user/tracker.php";
821}
822?>
823
824</body>
825</html>
826