1<?php 2/** 3 * HTML output functions 4 * 5 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6 * @author Andreas Gohr <andi@splitbrain.org> 7 */ 8 9 if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); 10 require_once(DOKU_INC.'inc/format.php'); 11 12/** 13 * Convenience function to quickly build a wikilink 14 * 15 * @author Andreas Gohr <andi@splitbrain.org> 16 */ 17function html_wikilink($url,$name='',$search=''){ 18 global $conf; 19 $link = array(); 20 $link['url'] = $url; 21 $link['name'] = $name; 22 $link = format_link_wiki($link); 23 24 if($search){ 25 ($conf['userewrite']) ? $link['url'].='?s=' : $link['url'].='&s='; 26 $link['url'] .= urlencode($search); 27 } 28 29 return format_link_build($link); 30} 31 32/** 33 * Helps building long attribute lists 34 * 35 * @author Andreas Gohr <andi@splitbrain.org> 36 */ 37function html_attbuild($attributes){ 38 $ret = ''; 39 foreach ( $attributes as $key => $value ) { 40 $ret .= $key.'="'.formtext($value).'" '; 41 } 42 return trim($ret); 43} 44 45/** 46 * The loginform 47 * 48 * @author Andreas Gohr <andi@splitbrain.org> 49 */ 50function html_login(){ 51 global $lang; 52 global $conf; 53 global $ID; 54 55 print parsedLocale('login'); 56 ?> 57 <div align="center"> 58 <form action="<?=script()?>" accept-charset="<?=$lang['encoding']?>" method="post"> 59 <fieldset> 60 <legend><?=$lang['btn_login']?></legend> 61 <input type="hidden" name="id" value="<?=$ID?>" /> 62 <input type="hidden" name="do" value="login" /> 63 <label> 64 <span><?=$lang['user']?></span> 65 <input type="text" name="u" value="<?=formText($_REQUEST['u'])?>" class="edit" /> 66 </label><br /> 67 <label> 68 <span><?=$lang['pass']?></span> 69 <input type="password" name="p" class="edit" /> 70 </label><br /> 71 <input type="submit" value="<?=$lang['btn_login']?>" class="button" /> 72 <label for="remember" class="simple"> 73 <input type="checkbox" name="r" id="remember" value="1" /> 74 <span><?=$lang['remember']?></span> 75 </label> 76 </fieldset> 77 </form> 78 <? 79 if($conf['openregister']){ 80 print '<p>'; 81 print $lang['reghere']; 82 print ': <a href="'.wl($ID,'do=register').'" class="wikilink1">'.$lang['register'].'</a>'; 83 print '</p>'; 84 } 85 ?> 86 </div> 87 <? 88 if(@file_exists('includes/login.txt')){ 89 print io_cacheParse('includes/login.txt'); 90 } 91} 92 93/** 94 * shows the edit/source/show button dependent on current mode 95 * 96 * @author Andreas Gohr <andi@splitbrain.org> 97 */ 98function html_editbutton(){ 99 global $ID; 100 global $REV; 101 global $ACT; 102 global $INFO; 103 104 if($ACT == 'show' || $ACT == 'search'){ 105 if($INFO['writable']){ 106 if($INFO['exists']){ 107 $r = html_btn('edit',$ID,'e',array('do' => 'edit','rev' => $REV),'post'); 108 }else{ 109 $r = html_btn('create',$ID,'e',array('do' => 'edit','rev' => $REV),'post'); 110 } 111 }else{ 112 $r = html_btn('source',$ID,'v',array('do' => 'edit','rev' => $REV),'post'); 113 } 114 }else{ 115 $r = html_btn('show',$ID,'v',array('do' => 'show')); 116 } 117 return $r; 118} 119 120/** 121 * prints a section editing button 122 * 123 * @author Andreas Gohr <andi@splitbrain.org> 124 */ 125function html_secedit_button($section,$p){ 126 global $ID; 127 global $lang; 128 $secedit = ''; 129 if($p) $secedit .= "</p>\n"; 130 $secedit .= '<div class="secedit">'; 131 $secedit .= html_btn('secedit',$ID,'', 132 array('do' => 'edit', 133 'lines' => "$section"), 134 'post'); 135 $secedit .= '</div>'; 136 if($p) $secedit .= "\n<p>"; 137 return $secedit; 138} 139 140/** 141 * inserts section edit buttons if wanted or removes the markers 142 * 143 * @author Andreas Gohr <andi@splitbrain.org> 144 */ 145function html_secedit($text,$show=true){ 146 global $INFO; 147 if($INFO['writable'] && $show){ 148 $text = preg_replace('#<!-- SECTION \[(\d+-\d+)\] -->#e', 149 "html_secedit_button('\\1',true)", 150 $text); 151 $text = preg_replace('#<!-- SECTION \[(\d+-)\] -->#e', 152 "html_secedit_button('\\1',false)", 153 $text); 154 }else{ 155 $text = preg_replace('#<!-- SECTION \[(\d*-\d*)\] -->#e','',$text); 156 } 157 return $text; 158} 159 160/** 161 * Just the back to top button (in it's own form) 162 * 163 * @author Andreas Gohr <andi@splitbrain.org> 164 */ 165function html_topbtn(){ 166 global $lang; 167 168 $ret = ''; 169 $ret .= '<form class="button" method="get" action="#top" onsubmit="return svchk()">'; 170 $ret .= '<input type="submit" value="'.htmlspecialchars($lang['btn_top']).'" class="button" />'; 171 $ret .= '</form>'; 172 return $ret; 173} 174 175/** 176 * Displays a button (using it's own form) 177 * 178 * @author Andreas Gohr <andi@splitbrain.org> 179 */ 180function html_btn($name,$id,$akey,$params,$method='get'){ 181 global $conf; 182 global $lang; 183 184 $label = $lang['btn_'.$name]; 185 186 $ret = ''; 187 188 //filter id (without urlencoding) 189 $id = idfilter($id,false); 190 191 //make nice URLs even for buttons 192 if(!$conf['userewrite']){ 193 $script = DOKU_BASE.DOKU_SCRIPT; 194 $params['id'] = $id; 195 }else{ 196 $script = DOKU_BASE.$id; 197 } 198 199 $ret .= '<form class="button" method="'.$method.'" action="'.$script.'" onsubmit="return svchk()">'; 200 201 reset($params); 202 while (list($key, $val) = each($params)) { 203 $ret .= '<input type="hidden" name="'.$key.'" '; 204 $ret .= 'value="'.htmlspecialchars($val).'" />'; 205 } 206 207 $ret .= '<input type="submit" value="'.htmlspecialchars($label).'" class="button" '; 208 if($akey){ 209 $ret .= 'title="ALT+'.strtoupper($akey).'" '; 210 $ret .= 'accesskey="'.$akey.'" '; 211 } 212 $ret .= '/>'; 213 $ret .= '</form>'; 214 215 return $ret; 216} 217 218/** 219 * Print the table of contents 220 * 221 * @author Andreas Gohr <andi@splitbrain.org> 222 */ 223function html_toc($toc){ 224 global $lang; 225 $ret = ''; 226 $ret .= '<div class="toc">'; 227 $ret .= '<div class="tocheader">'; 228 $ret .= $lang['toc']; 229 $ret .= ' <script type="text/javascript">'; 230 $ret .= 'showTocToggle("+","-")'; 231 $ret .= '</script>'; 232 $ret .= '</div>'; 233 $ret .= '<div id="tocinside">'; 234 $ret .= html_buildlist($toc,'toc','html_list_toc'); 235 $ret .= '</div>'; 236 $ret .= '</div>'; 237 return $ret; 238} 239 240/** 241 * TOC item formatter 242 * 243 * User function for html_buildlist() 244 * 245 * @author Andreas Gohr <andi@splitbrain.org> 246 */ 247function html_list_toc($item){ 248 $ret = ''; 249 $ret .= '<a href="#'.$item['id'].'" class="toc">'; 250 $ret .= $item['name']; 251 $ret .= '</a>'; 252 return $ret; 253} 254 255/** 256 * show a wiki page 257 * 258 * @author Andreas Gohr <andi@splitbrain.org> 259 */ 260function html_show($text=''){ 261 global $ID; 262 global $REV; 263 global $HIGH; 264 //disable section editing for old revisions or in preview 265 if($text || $REV){ 266 global $parser; 267 $parser['secedit'] = false; 268 } 269 270 if ($text){ 271 //PreviewHeader 272 print parsedLocale('preview'); 273 print '<div class="preview">'; 274 print html_secedit(parse($text),false); 275 print '</div>'; 276 }else{ 277 if ($REV) print parsedLocale('showrev'); 278 $html = parsedWiki($ID,$REV,true); 279 $html = html_secedit($html); 280 print html_hilight($html,$HIGH); 281 } 282} 283 284/** 285 * Highlights searchqueries in HTML code 286 * 287 * @author Andreas Gohr <andi@splitbrain.org> 288 */ 289function html_hilight($html,$query){ 290 $queries = preg_split ("/\s/",$query,-1,PREG_SPLIT_NO_EMPTY); 291 foreach ($queries as $q){ 292 $q = preg_quote($q,'/'); 293 $html = preg_replace("/((<[^>]*)|$q)/ie", '"\2"=="\1"? "\1":"<span class=\"search_hit\">\1</span>"', $html); 294 } 295 return $html; 296} 297 298/** 299 * Run a search and display the result 300 * 301 * @author Andreas Gohr <andi@splitbrain.org> 302 */ 303function html_search(){ 304 require_once(DOKU_INC.'inc/search.php'); 305 global $conf; 306 global $QUERY; 307 global $ID; 308 global $lang; 309 310 print parsedLocale('searchpage'); 311 flush(); 312 313 //show progressbar 314 print '<div align="center">'; 315 print '<script language="JavaScript" type="text/javascript">'; 316 print 'showLoadBar();'; 317 print '</script>'; 318 print '<br /></div>'; 319 320 //do quick pagesearch 321 $data = array(); 322 search($data,$conf['datadir'],'search_pagename',array(query => cleanID($QUERY))); 323 if(count($data)){ 324 sort($data); 325 print '<div class="search_quickresult">'; 326 print '<b>'.$lang[quickhits].':</b><br />'; 327 foreach($data as $row){ 328 print '<div class="search_quickhits">'; 329 print html_wikilink(':'.$row['id'],$row['id']); 330 print '</div> '; 331 } 332 //clear float (see http://www.complexspiral.com/publications/containing-floats/) 333 print '<div class="clearer"> </div>'; 334 print '</div>'; 335 } 336 flush(); 337 338 //do fulltext search 339 $data = array(); 340 search($data,$conf['datadir'],'search_fulltext',array(query => utf8_strtolower($QUERY))); 341 if(count($data)){ 342 usort($data,'sort_search_fulltext'); 343 foreach($data as $row){ 344 print '<div class="search_result">'; 345 print html_wikilink(':'.$row['id'],$row['id'],$QUERY); 346 print ': <span class="search_cnt">'.$row['count'].' '.$lang['hits'].'</span><br />'; 347 print '<div class="search_snippet">'.$row['snippet'].'</div>'; 348 print '</div>'; 349 } 350 }else{ 351 print '<div class="nothing">'.$lang['nothingfound'].'</div>'; 352 } 353 354 //hide progressbar 355 print '<script language="JavaScript" type="text/javascript">'; 356 print 'hideLoadBar();'; 357 print '</script>'; 358} 359 360/** 361 * Display error on locked pages 362 * 363 * @author Andreas Gohr <andi@splitbrain.org> 364 */ 365function html_locked($ip){ 366 global $ID; 367 global $conf; 368 global $lang; 369 370 $locktime = filemtime(wikiFN($ID).'.lock'); 371 $expire = @date($conf['dformat'], $locktime + $conf['locktime'] ); 372 $min = round(($conf['locktime'] - (time() - $locktime) )/60); 373 374 print parsedLocale('locked'); 375 print '<ul>'; 376 print '<li><b>'.$lang['lockedby'].':</b> '.$ip.'</li>'; 377 print '<li><b>'.$lang['lockexpire'].':</b> '.$expire.' ('.$min.' min)</li>'; 378 print '</ul>'; 379} 380 381/** 382 * list old revisions 383 * 384 * @author Andreas Gohr <andi@splitbrain.org> 385 */ 386function html_revisions(){ 387 global $ID; 388 global $INFO; 389 global $conf; 390 global $lang; 391 $revisions = getRevisions($ID); 392 $date = @date($conf['dformat'],$INFO['lastmod']); 393 394 print parsedLocale('revisions'); 395 print '<ul>'; 396 if($INFO['exists']){ 397 print '<li>'; 398 print $date.' <a class="wikilink1" href="'.wl($ID).'">'.$ID.'</a> '; 399 400 print $INFO['sum']; 401 print ' <span class="user">('; 402 print $INFO['ip']; 403 if($INFO['user']) print ' '.$INFO['user']; 404 print ')</span> '; 405 406 print '('.$lang['current'].')'; 407 print '</li>'; 408 } 409 410 foreach($revisions as $rev){ 411 $date = date($conf['dformat'],$rev); 412 $info = getRevisionInfo($ID,$rev); 413 414 print '<li>'; 415 print $date.' <a class="wikilink1" href="'.wl($ID,"rev=$rev").'">'.$ID.'</a> '; 416 print $info['sum']; 417 print ' <span class="user">('; 418 print $info['ip']; 419 if($info['user']) print ' '.$info['user']; 420 print ')</span> '; 421 422 print '<a href="'.wl($ID,"rev=$rev,do=diff").'">'; 423 print '<img src="'.DOKU_BASE.'images/diff.png" border="0" width="15" height="11" title="'.$lang['diff'].'" />'; 424 print '</a>'; 425 print '</li>'; 426 } 427 print '</ul>'; 428} 429 430/** 431 * display recent changes 432 * 433 * @author Andreas Gohr <andi@splitbrain.org> 434 */ 435function html_recent(){ 436 global $conf; 437 $recents = getRecents(0,true); 438 439 print parsedLocale('recent'); 440 print '<ul>'; 441 foreach(array_keys($recents) as $id){ 442 $date = date($conf['dformat'],$recents[$id]['date']); 443 print '<li>'; 444 print $date.' '.html_wikilink($id,$id); 445 print ' '.htmlspecialchars($recents[$id]['sum']); 446 print ' <span class="user">('; 447 print $recents[$id]['ip']; 448 if($recents[$id]['user']) print ' '.$recents[$id]['user']; 449 print ')</span>'; 450 print '</li>'; 451 } 452 print '</ul>'; 453} 454 455/** 456 * Display page index 457 * 458 * @author Andreas Gohr <andi@splitbrain.org> 459 */ 460function html_index($ns){ 461 require_once(DOKU_INC.'inc/search.php'); 462 global $conf; 463 global $ID; 464 $dir = $conf['datadir']; 465 $ns = cleanID($ns); 466 if(empty($ns)){ 467 $ns = dirname(str_replace(':','/',$ID)); 468 if($ns == '.') $ns =''; 469 } 470 $ns = utf8_encodeFN(str_replace(':','/',$ns)); 471 472 print parsedLocale('index'); 473 474 $data = array(); 475 search($data,$conf['datadir'],'search_index',array('ns' => $ns)); 476 print html_buildlist($data,'idx','html_list_index','html_li_index'); 477} 478 479/** 480 * Index item formatter 481 * 482 * User function for html_buildlist() 483 * 484 * @author Andreas Gohr <andi@splitbrain.org> 485 */ 486function html_list_index($item){ 487 $ret = ''; 488 $base = ':'.$item['id']; 489 $base = substr($base,strrpos($base,':')+1); 490 if($item['type']=='d'){ 491 $ret .= '<a href="'.wl($ID,'idx='.$item['id']).'" class="idx_dir">'; 492 $ret .= $base; 493 $ret .= '</a>'; 494 }else{ 495 $ret .= html_wikilink(':'.$item['id']); 496 } 497 return $ret; 498} 499 500/** 501 * Index List item 502 * 503 * This user function is used in html_build_lidt to build the 504 * <li> tags for namespaces when displaying the page index 505 * it gives different classes to opened or closed "folders" 506 * 507 * @author Andreas Gohr <andi@splitbrain.org> 508 */ 509function html_li_index($item){ 510 if($item['type'] == "f"){ 511 return '<li class="level'.$item['level'].'">'; 512 }elseif($item['open']){ 513 return '<li class="open">'; 514 }else{ 515 return '<li class="closed">'; 516 } 517} 518 519/** 520 * Default List item 521 * 522 * @author Andreas Gohr <andi@splitbrain.org> 523 */ 524function html_li_default($item){ 525 return '<li class="level'.$item['level'].'">'; 526} 527 528/** 529 * Build an unordered list 530 * 531 * Build an unordered list from the given $data array 532 * Each item in the array has to have a 'level' property 533 * the item itself gets printed by the given $func user 534 * function. The second and optional function is used to 535 * print the <li> tag. Both user function need to accept 536 * a single item. 537 * 538 * @author Andreas Gohr <andi@splitbrain.org> 539 */ 540function html_buildlist($data,$class,$func,$lifunc='html_li_default'){ 541 $level = 0; 542 $opens = 0; 543 $ret = ''; 544 545 foreach ($data as $item){ 546 547 if( $item['level'] > $level ){ 548 //open new list 549 for($i=0; $i<($item['level'] - $level); $i++){ 550 if ($i) $ret .= "<li class=\"clear\">\n"; 551 $ret .= "\n<ul class=\"$class\">\n"; 552 } 553 }elseif( $item['level'] < $level ){ 554 //close last item 555 $ret .= "</li>\n"; 556 for ($i=0; $i<($level - $item['level']); $i++){ 557 //close higher lists 558 $ret .= "</ul>\n</li>\n"; 559 } 560 }else{ 561 //close last item 562 $ret .= "</li>\n"; 563 } 564 565 //remember current level 566 $level = $item['level']; 567 568 //print item 569 $ret .= $lifunc($item); //user function 570 $ret .= '<span class="li">'; 571 $ret .= $func($item); //user function 572 $ret .= '</span>'; 573 } 574 575 //close remaining items and lists 576 for ($i=0; $i < $level; $i++){ 577 $ret .= "</li></ul>\n"; 578 } 579 580 return $ret; 581} 582 583/** 584 * display backlinks 585 * 586 * @author Andreas Gohr <andi@splitbrain.org> 587 */ 588function html_backlinks(){ 589 require_once(DOKU_INC.'inc/search.php'); 590 global $ID; 591 global $conf; 592 593 if(preg_match('#^(.*):(.*)$#',$ID,$matches)){ 594 $opts['ns'] = $matches[1]; 595 $opts['name'] = $matches[2]; 596 }else{ 597 $opts['ns'] = ''; 598 $opts['name'] = $ID; 599 } 600 601 print parsedLocale('backlinks'); 602 603 $data = array(); 604 search($data,$conf['datadir'],'search_backlinks',$opts); 605 sort($data); 606 607 print '<ul class="idx">'; 608 foreach($data as $row){ 609 print '<li>'; 610 print html_wikilink(':'.$row['id'],$row['id']); 611 print '</li>'; 612 } 613 print '</ul>'; 614} 615 616/** 617 * show diff 618 * 619 * @author Andreas Gohr <andi@splitbrain.org> 620 */ 621function html_diff($text='',$intro=true){ 622 require_once(DOKU_INC.'inc/DifferenceEngine.php'); 623 global $ID; 624 global $REV; 625 global $lang; 626 global $conf; 627 if($text){ 628 $df = new Diff(split("\n",htmlspecialchars(rawWiki($ID,''))), 629 split("\n",htmlspecialchars(cleanText($text)))); 630 $left = '<a class="wikilink1" href="'.wl($ID).'">'. 631 $ID.' '.date($conf['dformat'],@filemtime(wikiFN($ID))).'</a>'. 632 $lang['current']; 633 $right = $lang['yours']; 634 }else{ 635 $df = new Diff(split("\n",htmlspecialchars(rawWiki($ID,$REV))), 636 split("\n",htmlspecialchars(rawWiki($ID,'')))); 637 $left = '<a class="wikilink1" href="'.wl($ID,"rev=$REV").'">'. 638 $ID.' '.date($conf['dformat'],$REV).'</a>'; 639 $right = '<a class="wikilink1" href="'.wl($ID).'">'. 640 $ID.' '.date($conf['dformat'],@filemtime(wikiFN($ID))).'</a> '. 641 $lang['current']; 642 } 643 $tdf = new TableDiffFormatter(); 644 if($intro) print parsedLocale('diff'); 645 ?> 646 <table class="diff" width="100%"> 647 <tr> 648 <td colspan="2" width="50%" class="diff-header"> 649 <?=$left?> 650 </td> 651 <td colspan="2" width="50%" class="diff-header"> 652 <?=$right?> 653 </td> 654 </tr> 655 <?=$tdf->format($df)?> 656 </table> 657 <? 658} 659 660/** 661 * show warning on conflict detection 662 * 663 * @author Andreas Gohr <andi@splitbrain.org> 664 */ 665function html_conflict($text,$summary){ 666 global $ID; 667 global $lang; 668 669 print parsedLocale('conflict'); 670 ?> 671 <form name="editform" method="post" action="<?=script()?>" accept-charset="<?=$lang['encoding']?>"> 672 <input type="hidden" name="id" value="<?=$ID?>" /> 673 <input type="hidden" name="wikitext" value="<?=formText($text)?>" /> 674 <input type="hidden" name="summary" value="<?=formText($summary)?>" /> 675 676 <div align="center"> 677 <input class="button" type="submit" name="do" value="<?=$lang['btn_save']?>" accesskey="s" title="[ALT+S]" /> 678 <input class="button" type="submit" name="do" value="<?=$lang['btn_cancel']?>" /> 679 </div> 680 </form> 681 <br /><br /><br /><br /> 682 <? 683} 684 685/** 686 * Prints the global message array 687 * 688 * @author Andreas Gohr <andi@splitbrain.org> 689 */ 690function html_msgarea(){ 691 global $MSG; 692 693 if(!isset($MSG)) return; 694 695 foreach($MSG as $msg){ 696 print '<div class="'.$msg['lvl'].'">'; 697 print $msg['msg']; 698 print '</div>'; 699 } 700} 701 702/** 703 * Prints the registration form 704 * 705 * @author Andreas Gohr <andi@splitbrain.org> 706 */ 707function html_register(){ 708 global $lang; 709 global $ID; 710 711 print parsedLocale('register'); 712?> 713 <div align="center"> 714 <form name="register" method="post" action="<?=wl($ID)?>" accept-charset="<?=$lang['encoding']?>"> 715 <input type="hidden" name="do" value="register" /> 716 <input type="hidden" name="save" value="1" /> 717 <fieldset> 718 <legend><?=$lang['register']?></legend> 719 <label> 720 <?=$lang['user']?> 721 <input type="text" name="login" class="edit" size="50" value="<?=formText($_POST['login'])?>" /> 722 </label><br /> 723 <label> 724 <?=$lang['fullname']?> 725 <input type="text" name="fullname" class="edit" size="50" value="<?=formText($_POST['fullname'])?>" /> 726 </label><br /> 727 <label> 728 <?=$lang['email']?> 729 <input type="text" name="email" class="edit" size="50" value="<?=formText($_POST['email'])?>" /> 730 </label><br /> 731 <input type="submit" class="button" value="<?=$lang['register']?>" /> 732 </fieldset> 733 </form> 734 </div> 735<? 736} 737 738/** 739 * This displays the edit form (lots of logic included) 740 * 741 * @author Andreas Gohr <andi@splitbrain.org> 742 */ 743function html_edit($text=null,$include='edit'){ //FIXME: include needed? 744 global $ID; 745 global $REV; 746 global $DATE; 747 global $RANGE; 748 global $PRE; 749 global $SUF; 750 global $INFO; 751 global $SUM; 752 global $lang; 753 global $conf; 754 755 //set summary default 756 if(!$SUM){ 757 if($REV){ 758 $SUM = $lang['restored']; 759 }elseif(!$INFO['exists']){ 760 $SUM = $lang['created']; 761 } 762 } 763 764 //no text? Load it! 765 if(!isset($text)){ 766 $pr = false; //no preview mode 767 if($RANGE){ 768 list($PRE,$text,$SUF) = rawWikiSlices($RANGE,$ID,$REV); 769 }else{ 770 $text = rawWiki($ID,$REV); 771 } 772 }else{ 773 $pr = true; //preview mode 774 } 775 776 $wr = $INFO['writable']; 777 if($wr){ 778 if ($REV) print parsedLocale('editrev'); 779 print parsedLocale($include); 780 }else{ 781 print parsedLocale('read'); 782 $ro='readonly="readonly"'; 783 } 784 if(!$DATE) $DATE = $INFO['lastmod']; 785?> 786 <form name="editform" method="post" action="<?=script()?>" accept-charset="<?=$lang['encoding']?>" onsubmit="return svchk()"> 787 <input type="hidden" name="id" value="<?=$ID?>" /> 788 <input type="hidden" name="rev" value="<?=$REV?>" /> 789 <input type="hidden" name="date" value="<?=$DATE?>" /> 790 <input type="hidden" name="prefix" value="<?=formText($PRE)?>" /> 791 <input type="hidden" name="suffix" value="<?=formText($SUF)?>" /> 792 <table style="width:99%"> 793 <tr> 794 <td class="toolbar" colspan="3"> 795 <?if($wr){?> 796 <script language="JavaScript" type="text/javascript"> 797 <?/* sets changed to true when previewed */?> 798 textChanged = <? ($pr) ? print 'true' : print 'false' ?>; 799 800 formatButton('images/bold.png','<?=$lang['qb_bold']?>','**','**','<?=$lang['qb_bold']?>','b'); 801 formatButton('images/italic.png','<?=$lang['qb_italic']?>',"\/\/","\/\/",'<?=$lang['qb_italic']?>','i'); 802 formatButton('images/underline.png','<?=$lang['qb_underl']?>','__','__','<?=$lang['qb_underl']?>','u'); 803 formatButton('images/code.png','<?=$lang['qb_code']?>','\'\'','\'\'','<?=$lang['qb_code']?>','c'); 804 805 formatButton('images/fonth1.png','<?=$lang['qb_h1']?>','====== ',' ======\n','<?=$lang['qb_h1']?>','1'); 806 formatButton('images/fonth2.png','<?=$lang['qb_h2']?>','===== ',' =====\n','<?=$lang['qb_h2']?>','2'); 807 formatButton('images/fonth3.png','<?=$lang['qb_h3']?>','==== ',' ====\n','<?=$lang['qb_h3']?>','3'); 808 formatButton('images/fonth4.png','<?=$lang['qb_h4']?>','=== ',' ===\n','<?=$lang['qb_h4']?>','4'); 809 formatButton('images/fonth5.png','<?=$lang['qb_h5']?>','== ',' ==\n','<?=$lang['qb_h5']?>','5'); 810 811 formatButton('images/link.png','<?=$lang['qb_link']?>','[[',']]','<?=$lang['qb_link']?>','l'); 812 formatButton('images/extlink.png','<?=$lang['qb_extlink']?>','[[',']]','http://www.example.com|<?=$lang['qb_extlink']?>'); 813 814 formatButton('images/list.png','<?=$lang['qb_ol']?>',' - ','\n','<?=$lang['qb_ol']?>'); 815 formatButton('images/list_ul.png','<?=$lang['qb_ul']?>',' * ','\n','<?=$lang['qb_ul']?>'); 816 817 insertButton('images/rule.png','<?=$lang['qb_hr']?>','----\n'); 818 mediaButton('images/image.png','<?=$lang['qb_media']?>','m','<?=$INFO['namespace']?>'); 819 820 <? 821 if($conf['useacl'] && $_SERVER['REMOTE_USER']){ 822 echo "insertButton('images/sig.png','".$lang['qb_sig']."','".html_signature()."','y');"; 823 } 824 ?> 825 </script> 826 <?}?> 827 </td> 828 </tr> 829 <tr> 830 <td colspan="3"> 831 <textarea name="wikitext" id="wikitext" <?=$ro?> cols="80" rows="10" class="edit" onchange="textChanged = true;" onkeyup="summaryCheck();" tabindex="1"><?="\n".formText($text)?></textarea> 832 </td> 833 </tr> 834 <tr> 835 <td> 836 <?if($wr){?> 837 <input class="button" type="submit" name="do" value="<?=$lang['btn_save']?>" accesskey="s" title="[ALT+S]" onclick="textChanged=false" onkeypress="textChanged=false" tabindex="3" /> 838 <input class="button" type="submit" name="do" value="<?=$lang['btn_preview']?>" accesskey="p" title="[ALT+P]" onclick="textChanged=false" onkeypress="textChanged=false" tabindex="4" /> 839 <input class="button" type="submit" name="do" value="<?=$lang['btn_cancel']?>" tabindex="5" /> 840 <?}?> 841 </td> 842 <td> 843 <?if($wr){?> 844 <?=$lang['summary']?>: 845 <input type="text" class="edit" name="summary" id="summary" size="50" onkeyup="summaryCheck();" value="<?=formText($SUM)?>" tabindex="2" /> 846 <?}?> 847 </td> 848 <td align="right"> 849 <script type="text/javascript"> 850 showSizeCtl(); 851 <?if($wr){?> 852 init_locktimer(<?=$conf['locktime']-60?>,'<?=$lang['willexpire']?>'); 853 document.editform.wikitext.focus(); 854 <?}?> 855 </script> 856 </td> 857 </tr> 858 </table> 859 </form> 860<? 861} 862 863/** 864 * prepares the signature string as configured in the config 865 * 866 * @author Andreas Gohr <andi@splitbrain.org> 867 */ 868function html_signature(){ 869 global $conf; 870 global $INFO; 871 872 $sig = $conf['signature']; 873 $sig = strftime($sig); 874 $sig = str_replace('@USER@',$_SERVER['REMOTE_USER'],$sig); 875 $sig = str_replace('@NAME@',$INFO['userinfo']['name'],$sig); 876 $sig = str_replace('@MAIL@',$INFO['userinfo']['mail'],$sig); 877 $sig = str_replace('@DATE@',date($conf['dformat']),$sig); 878 return $sig; 879} 880 881/** 882 * prints some debug info 883 * 884 * @author Andreas Gohr <andi@splitbrain.org> 885 */ 886function html_debug(){ 887 global $conf; 888 global $lang; 889 //remove sensitive data 890 $cnf = $conf; 891 $cnf['auth']='***'; 892 $cnf['notify']='***'; 893 $cnf['ftp']='***'; 894 895 print '<html><body>'; 896 897 print '<p>When reporting bugs please send all the following '; 898 print 'output as a mail to andi@splitbrain.org '; 899 print 'The best way to do this is to save this page in your browser</p>'; 900 901 print '<b>$_SERVER:</b><pre>'; 902 print_r($_SERVER); 903 print '</pre>'; 904 905 print '<b>$conf:</b><pre>'; 906 print_r($cnf); 907 print '</pre>'; 908 909 print '<b>DOKU_BASE:</b><pre>'; 910 print DOKU_BASE; 911 print '</pre>'; 912 913 print '<b>abs DOKU_BASE:</b><pre>'; 914 print DOKU_URL; 915 print '</pre>'; 916 917 print '<b>rel DOKU_BASE:</b><pre>'; 918 print dirname($_SERVER['PHP_SELF']).'/'; 919 print '</pre>'; 920 921 print '<b>PHP Version:</b><pre>'; 922 print phpversion(); 923 print '</pre>'; 924 925 print '<b>locale:</b><pre>'; 926 print setlocale(LC_ALL,0); 927 print '</pre>'; 928 929 print '<b>encoding:</b><pre>'; 930 print $lang['encoding']; 931 print '</pre>'; 932 933 print '<b>Environment:</b><pre>'; 934 print_r($_ENV); 935 print '</pre>'; 936 937 print '<b>PHP settings:</b><pre>'; 938 $inis = ini_get_all(); 939 print_r($inis); 940 print '</pre>'; 941 942 print '</body></html>'; 943} 944 945/** 946 * Print the admin overview page 947 * 948 * @author Andreas Gohr <andi@splitbrain.org> 949 */ 950function html_admin(){ 951 global $ID; 952 global $lang; 953 954 print parsedLocale('admin'); 955 956 ptln('<ul class="admin">'); 957 958 // currently ACL only - more to come 959 ptln('<li><a href="'.wl($ID,'do=admin&page=acl').'">'.$lang['admin_acl'].'</a></li>'); 960 961 ptln('</ul>'); 962} 963 964?> 965