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