1 <?php
2 
3 class IckeNavigationElement {}
4 
5 class IckeNavigationSeparator extends IckeNavigationElement {}
6 
7 class IckeNavigationItem extends IckeNavigationElement {
8 
9     public $id;
10     public $link;
11     public $exists;
12     public $isNamespace;
13     public $class;
14 
15     function __construct($id, $link, $isNamespace) {
16         $this->id = $id;
17         $this->link = $link;
18         $this->isNamespace = $isNamespace;
19         $this->class = $this->buildClass($id);
20         $this->exists = page_exists($this->link);
21     }
22 
23     private function buildClass($id) {
24         $id = ltrim($id, ':');
25         $pos = strpos($id, ':');
26         if ($pos === false) return $id;
27         return substr($id, 0, $pos);
28     }
29 
30     public function getNamespace() {
31         if (!$this->isNamespace) return $this->id;
32         return getNS($this->id);
33     }
34 }
35 
36 class IckeNavigation {
37 
38     public $navigation;
39 
40     public function __construct() {
41         $navigationConfig = tpl_getConf('namespaces');
42         $this->loadNavigation($navigationConfig);
43     }
44 
45     public function loadNavigation($navigationConfig) {
46         global $conf;
47 
48         $navigation = explode(',',$navigationConfig);
49         $navigation = array_map('trim', $navigation);
50 
51         $this->navigation = array();
52         foreach ($navigation as $id) {
53             if ($id === '') {
54                 // add separator
55                 $this->navigation[] = new IckeNavigationSeparator();
56                 continue;
57             }
58 
59             $link = $this->replaceUserPlaceholder($id);
60             if ($link === false) continue;
61 
62             resolve_pageid('',$link,$exists); // create full links
63             if (auth_quickaclcheck($link) < AUTH_READ) continue;
64 
65             $isNamespace = false;
66             if (substr($link, -1) === ':') {
67                 $isNamespace = true;
68                 $link = $link . $conf['start'];
69             }
70 
71             $link = $this->translateId($link);
72             $link = cleanID($link);
73 
74             $this->navigation[] = new IckeNavigationItem($id, $link, $isNamespace);
75         }
76         return $this->navigation;
77     }
78 
79     private function replaceUserPlaceholder($id) {
80         if(strstr($id,'%USER%') === false) {
81             return $id;
82         }
83 
84         if(empty($_SERVER['REMOTE_USER'])) {
85             return false;
86         }
87 
88         $id = str_replace('%USER%',$_SERVER['REMOTE_USER'],$id);
89         return $id;
90     }
91 
92     private function translateId($id) {
93         $translation = $this->getCurrentTranslation();
94 
95         $translatedId = $translation . ":$id";
96         if (page_exists($translatedId)) {
97             return $translatedId;
98         }
99         return $id;
100     }
101 
102     private function getCurrentTranslation() {
103         if (!isset($_SESSION[DOKU_COOKIE]['translationlc']) || empty($_SESSION[DOKU_COOKIE]['translationlc'])) {
104             return '';
105         }
106         return $_SESSION[DOKU_COOKIE]['translationlc'];
107     }
108 
109     public function drawSidebar() {
110         global $ID;
111 
112         $firstItem = true;
113         $separator = false;
114         foreach($this->navigation as $item){
115             if ($item instanceof IckeNavigationSeparator) {
116                 $separator = !$firstItem;
117                 $firstItem = false;
118                 continue;
119             }
120             $firstItem = false;
121             if ($item instanceof IckeNavigationItem) {
122 
123                 $namespace = $this->replaceUserPlaceholder(getNS($item->id));
124 
125                 $popup  = p_wiki_xhtml($this->getLocalizedPopup($namespace.':quick'),'',false);
126                 $translationNs = preg_quote($this->getCurrentTranslation().':', '/');
127                 $active = (bool) preg_match('/^('.$translationNs.')?'.preg_quote($namespace,'/').':/',$ID);
128                 $class = 'qnav_'.explode(':',$item->class)[0]; // first ns part
129                 icke_navi($item->link, '', $class, $popup, $active, $separator);
130 
131                 $separator = false;
132             }
133         }
134 
135         // Add toolbox
136         icke_navi('','Settings','qnav_einstellungen',icke_toolbox(),false,false);
137     }
138 
139     private function getLocalizedPopup($id) {
140         $lang = $this->getCurrentTranslation();
141         if ($lang === '') return $id;
142 
143         $local = "$lang:$id";
144         if (page_exists($local)) {
145             return $local;
146         }
147         return $id;
148     }
149 
150     public function buildPageCss() {
151         echo "<style type=\"text/css\">\n";
152 
153         // $navi[] = "einstellungen";
154 
155         foreach($this->navigation as $navigationItem){
156 
157             if (!($navigationItem instanceof IckeNavigationItem)) {
158                 continue;
159             }
160 
161             /*$processed = icke_processFancySearchItem($id);
162             if (!$processed) continue;
163             $class = $processed['class'];
164             $ns = $processed['ns'];
165             $imgClass = $processed['imgClass'];*/
166 
167 
168 
169             $bigInactive = $this->getImage($navigationItem, 60, 'icon_off.png', '_inaktiv.png');
170             $bigActive = $this->getImage($navigationItem, 60, 'icon_on.png', '_aktiv.png');
171             $iconActive = $this->getImage($navigationItem, 30, 'icon_on.png', '_aktiv.png');
172 
173             echo $this->cssEntry($navigationItem->class, $bigInactive, $bigActive, $iconActive);
174         }
175 
176         echo $this->cssEntry('einstellungen', DOKU_TPL . '/images/icons/60x60/einstellungen_inaktiv.png', DOKU_TPL . '/images/icons/60x60/einstellungen_aktiv.png', '');
177         echo "#fancysearch__ns_custom li.fancysearch_ns_icke {";
178         echo 'text-indent: -10000px; width:30px; height:30px;';
179         echo 'background-image: url('.DOKU_TPL.'/images/icons/30x30/icke.png)';
180         echo "}\n";
181 
182         echo "</style>\n";
183     }
184 
185     private function getImage(IckeNavigationItem $navigationItem, $size, $nsPostFix, $pathPostFix) {
186         if (file_exists(mediaFN($navigationItem->getNamespace() . $nsPostFix))) {
187             return ml($navigationItem->getNamespace() . $nsPostFix, array('w'=>$size,'h'=>$size), true, '&');
188         }
189 
190         $path = "/images/icons/{$size}x$size/".$navigationItem->class.$pathPostFix;
191         if (file_exists(DOKU_TPLINC . $path)) {
192             return DOKU_TPL . $path;
193         }
194         return DOKU_TPL . "/images/icons/{$size}x$size/fail.png";
195     }
196 
197     private function cssEntry($name, $bigInactive, $bigActive, $iconActive) {
198         $css = '
199             #icke__quicknav a.qnav_%1$s {
200                 background-image: url(%2$s)
201             }
202             #icke__quicknav li.active a.qnav_%1$s,
203             #icke__quicknav li:hover a.qnav_%1$s {
204                 background-image: url(%3$s)
205             }
206             #fancysearch__ns_custom li.fancysearch_ns_%1$s {
207                 text-indent: -10000px;
208                 width:30px;
209                 height:30px;
210                 background-image: url(%4$s)
211             }';
212         return sprintf($css, $name, $bigInactive, $bigActive, $iconActive);
213     }
214 
215 }
216 
217 function icke_getNavigation() {
218     static $navigation = null;
219     if ($navigation === null) {
220         $navigation = new IckeNavigation();
221     }
222     return $navigation;
223 }