<?php
/**
 * DokuWiki Template Masa Functions
 *
 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author  Michael Klier <chi@chimeric.de>, Kirill Bezrukov <kirbez@mail.ru>
 */

if(!defined('DOKU_LF')) define('DOKU_LF',"\n");

// load sidebar contents
$sbl   = explode(',',tpl_getConf('left_sidebar_content'));
$sbpos = tpl_getConf('sidebar');

// set notoc option and toolbar regarding the sitebar setup
$notoc = (in_array('toc',$sbl)) ? true : false;
$toolb = (in_array('toolbox',$sbl)) ? true : false;

/**
 * Prints the action menu
 * 
 * @author Kirill Bezrukov <kirbez@mail.ru>
 */
function tpl_actionmenu() {
    global $lang;
    global $conf;
		
		include_once (dirname(__FILE__) . '/lang/en/lang.php');
		@include_once (dirname(__FILE__) . '/lang/' . $conf['lang'] . '/lang.php');
		
    $am_order   = explode(',', tpl_getConf('actionmenu_order'));
    $am_content = explode(',', tpl_getConf('actionmenu_content'));

    // process contents by given order
    
    print '<select name="actionmenu" class="edit" onchange=
    			"if ((this.selectedIndex != 0) &&
       					(this.options[this.selectedIndex].disabled == false)) {
            				location.href = this.options[this.selectedIndex].value;
      			}
          this.selectedIndex = 0;" >';
    print '  <option value="show">'.$lang['caption'].'</option>';
		
    // process contents by given order
    foreach($am_order as $am) {
        if(in_array($am,$am_content) || $am == '---') {
            $key = array_search($am,$am_content);
            unset($am_content[$key]);
            tpl_actionmenu_dispatch($am);
        }
    }

    // check for left content not specified by order
    if(is_array($am_content) && !empty($am_content) > 0) {
        foreach($am_content as $am) {
            tpl_actionmenu_dispatch($am);
        }
    }

    print '</select>';
}


/**
 * Dispatches the given sidebar type to return the right content
 *
 * @author Michael Klier <chi@chimeric.de>
 */
function tpl_actionmenu_dispatch($am) {
    global $lang;
    global $conf;

		include_once (dirname(__FILE__) . '/lang/en/lang.php');
		@include_once (dirname(__FILE__) . '/lang/' . $conf['lang'] . '/lang.php');


    switch($am) {
       case 'export_raw':
            print '   <option value="?do=export_raw">'.$lang['export_raw'].'</option>';
            break;
       case 'export_html':
            print '   <option value="?do=export_html">'.$lang['export_html'].'</option>';
            break;
       case 'export_htmlbody':
            print '   <option value="?do=export_htmlbody">'.$lang['export_htmlbody'].'</option>';
            break;
       case 'export_odt':
            print '   <option value="?do=export_odt">'.$lang['export_odt'].'</option>';
            break;
       case 'backlink':
            print '   <option value="?do=backlink">'.$lang['backlink'].'</option>';
            break;
       case 'pagemove':
            print '   <option value="?do=admin&page=pagemove">'.$lang['pagemove'].'</option>';
            break;
       case 'config':
            print '   <option value="?do=admin&page=config">'.$lang['config'].'</option>';
            break;
       case 'purge':
            print '   <option value="?purge=true">'.$lang['purge'].'</option>';
            break;
       case '---':
            print '   <option value="show" disabled="disabled" class="disabled">------------------------</option>';
            break;
       default:
            print '   <option value="?do='.$am.'">'.$am.'</option>';
            break;
    }

}

/**
 * Prints the sidebars
 *
 * @author Kirill Bezrukov <kirbez@mail.ru>
 */
function tpl_sidebar() {

    $sb_order   = explode(',', tpl_getConf('left_sidebar_order'));
    $sb_content = explode(',', tpl_getConf('left_sidebar_content'));

    // process contents by given order
    foreach($sb_order as $sb) {
        if(in_array($sb,$sb_content)) {
            $key = array_search($sb,$sb_content);
            unset($sb_content[$key]);
            tpl_sidebar_dispatch($sb,$pos);
        }
    }

    // check for left content not specified by order
    if(is_array($sb_content) && !empty($sb_content) > 0) {
        foreach($sb_content as $sb) {
            tpl_sidebar_dispatch($sb,$pos);
        }
    }
}


/**
 * Dispatches the given sidebar type to return the right content
 *
 * @author Michael Klier <chi@chimeric.de>
 */
function tpl_sidebar_dispatch($sb,$pos) {
    global $lang;
    global $conf;
    global $ID;
    global $REV;
    global $INFO;

    $svID  = $ID;   // save current ID
    $svREV = $REV;  // save current REV 

    $pname   = tpl_getConf('pagename');

    switch($sb) {

        case 'main':
            $main_sb = $pname;
            if(@file_exists(wikiFN($main_sb)) && auth_quickaclcheck($main_sb) >= AUTH_READ) {
                print '<div class="main_sidebar sidebar_box">' . DOKU_LF;
                print p_sidebar_xhtml($main_sb,$pos) . DOKU_LF;
                print '</div>' . DOKU_LF;
            }
            break;

        case 'namespace':
            $user_ns  = tpl_getConf('user_sidebar_namespace');
            $group_ns = tpl_getConf('group_sidebar_namespace');
            if(!preg_match("/^".$user_ns.":.*?$|^".$group_ns.":.*?$/", $svID)) { // skip group/user sidebars and current ID
                $ns_sb = _getNsSb($svID);
                if($ns_sb && auth_quickaclcheck($ns_sb) >= AUTH_READ) {
                    print '<div class="namespace_sidebar sidebar_box">' . DOKU_LF;
                    print p_sidebar_xhtml($ns_sb,$pos) . DOKU_LF;
                    print '</div>' . DOKU_LF;
                }
            }
            break;

        case 'user':
            $user_ns = tpl_getConf('user_sidebar_namespace');
            if(isset($INFO['userinfo']['name'])) {
                $user = $_SERVER['REMOTE_USER'];
                $user_sb = $user_ns . ':' . $user . ':' . $pname;
                if(@file_exists(wikiFN($user_sb))) {
                    print '<div class="user_sidebar sidebar_box">' . DOKU_LF;
                    print p_sidebar_xhtml($user_sb,$pos) . DOKU_LF;
                    print '</div>';
                }
                // check for namespace sidebars in user namespace too
                if(preg_match('/'.$user_ns.':'.$user.':.*/', $svID)) {
                    $ns_sb = _getNsSb($svID); 
                    if($ns_sb && $ns_sb != $user_sb && auth_quickaclcheck($ns_sb) >= AUTH_READ) {
                        print '<div class="namespace_sidebar sidebar_box">' . DOKU_LF;
                        print p_sidebar_xhtml($ns_sb,$pos) . DOKU_LF;
                        print '</div>' . DOKU_LF;
                    }
                }

            }
            break;

        case 'group':
            $group_ns = tpl_getConf('group_sidebar_namespace');
            if(isset($INFO['userinfo']['name'], $INFO['userinfo']['grps'])) {
                foreach($INFO['userinfo']['grps'] as $grp) {
                    $group_sb = $group_ns.':'.$grp.':'.$pname;
                    if(@file_exists(wikiFN($group_sb)) && auth_quickaclcheck(cleanID($group_sb)) >= AUTH_READ) {
                        print '<div class="group_sidebar sidebar_box">' . DOKU_LF;
                        print p_sidebar_xhtml($group_sb,$pos) . DOKU_LF;
                        print '</div>' . DOKU_LF;
                    }
                }
            }
            break;

        case 'index':
            print '<div class="index_sidebar sidebar_box">' . DOKU_LF;
            print '  ' . p_index_xhtml($svID,$pos) . DOKU_LF;
            print '</div>' . DOKU_LF;
            break;

        case 'toc':
            if(auth_quickaclcheck($svID) >= AUTH_READ) {
                $instructions = p_cached_instructions(wikiFN($svID));
                if(!empty($instructions)) {
                    // FIXME - there's another way - read your todo list
                    foreach($instructions as $instruction) {
                        // ~~NOTOC~~ is set - do nothing
                        if($instruction[0] == 'notoc') return;
                    }
                }
                @require_once(DOKU_INC.'inc/parser/xhtml.php');
                // replace ids to keep XHTML compliance
                $meta = p_get_metadata($svID,'description tableofcontents');
                if(!empty($meta)) {
                    $toc = preg_replace('/id="(.*?)"/', 'id="sb__' . $pos . '__\1"', Doku_Renderer_xhtml::render_TOC($meta));
                    if(!empty($toc)) {
                        print '<div class="toc_sidebar sidebar_box">' . DOKU_LF;
                        print ($toc);
                        print '</div>' . DOKU_LF;
                    }
                }
            }
            break;
        
        case 'toolbox':
            $actions = array('admin', 'edit', 'history', 'recent', 'backlink', 'subscription', 'index', 'login', 'profile');

            print '<div class="toolbox_sidebar sidebar_box">' . DOKU_LF;
            print '  <div class="level1">' . DOKU_LF;
            print '    <ul>' . DOKU_LF;

            foreach($actions as $action) {
                if(!actionOK($action)) continue;
                // start output buffering
                ob_start();
                print '     <li><div class="li">';
                if(tpl_actionlink($action)) {
                    print '     </div></li>' . DOKU_LF;
                    ob_end_flush();
                } else {
                    ob_end_clean();
                }
            }

            print '    </ul>' . DOKU_LF;
            print '  </div>' . DOKU_LF;
            print '</div>' . DOKU_LF;
            break;

        case 'trace':
            print '<div class="trace_sidebar sidebar_box">' . DOKU_LF;
            print '  <h1>'.$lang['breadcrumb'].'</h1>' . DOKU_LF;
            print '  <div class="breadcrumbs">' . DOKU_LF;
            ($conf['youarehere'] != 1) ? tpl_breadcrumbs() : tpl_youarehere();
            print '  </div>' . DOKU_LF;
            print '</div>' . DOKU_LF;
            break;

        case 'extra':
            print '<div class="extra_sidebar sidebar_box">' . DOKU_LF;
            @include(dirname(__FILE__).'/' . $pos .'_sidebar.html');
            print '</div>' . DOKU_LF;
            break;

        default:
            // check for user defined sidebars
            if(@file_exists(DOKU_TPLINC.'sidebars/'.$sb.'/sidebar.php')) {
                print '<div class="'.$sb.'_sidebar sidebar_box">' . DOKU_LF;
                @require_once(DOKU_TPLINC.'sidebars/'.$sb.'/sidebar.php');
                print '</div>' . DOKU_LF;
            }
            break;
    }

    // restore ID and REV
    $ID  = $svID;
    $REV = $svREV;
}

/**
 * Removes the TOC of the sidebar pages and 
 * shows a edit button if the user has enough rights
 *
 * TODO sidebar caching
 * 
 * @author Michael Klier <chi@chimeric.de>
 */
function p_sidebar_xhtml($sb,$pos) {
    $data = p_wiki_xhtml($sb,'',false);
    if(auth_quickaclcheck($sb) >= AUTH_EDIT) {
        $data .= '<div class="secedit">'.html_btn('secedit',$sb,'',array('do'=>'edit','rev'=>'','post')).'</div>';
    }
    // strip TOC
    $data = preg_replace('/<div class="toc">.*?(<\/div>\n<\/div>)/s', '', $data);
    // replace headline ids for XHTML compliance
    $data = preg_replace('/(<h.*?><a.*?id=")(.*?)(">.*?<\/a><\/h.*?>)/','\1sb_'.$pos.'_\2\3', $data);
    return ($data);
}

/**
 * Renders the Index
 *
 * copy of html_index located in /inc/html.php
 *
 * TODO update to new AJAX index possible?
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 * @author Michael Klier <chi@chimeric.de>
 */
function p_index_xhtml($ns,$pos) {
  require_once(DOKU_INC.'inc/search.php');
  global $conf;
  global $ID;
  $dir = $conf['datadir'];
  $ns  = cleanID($ns);
  #fixme use appropriate function
  if(empty($ns)){
    $ns = dirname(str_replace(':','/',$ID));
    if($ns == '.') $ns ='';
  }
  $ns  = utf8_encodeFN(str_replace(':','/',$ns));

  // extract only the headline
  preg_match('/<h1>.*?<\/h1>/', p_locale_xhtml('index'), $match);
  print preg_replace('#<h1(.*?id=")(.*?)(".*?)h1>#', '<h1\1sidebar_'.$pos.'_\2\3h1>', $match[0]);

  $data = array();
  search($data,$conf['datadir'],'search_index',array('ns' => $ns));
  print html_buildlist($data,'idx','_html_list_index','html_li_index');
}

/**
 * Index item formatter
 *
 * User function for html_buildlist()
 *
 * @author Andreas Gohr <andi@splitbrain.org>
 * @author Michael Klier <chi@chimeric.de>
 */
function _html_list_index($item){
  global $ID;
  global $conf;
  $ret = '';
  $base = ':'.$item['id'];
  $base = substr($base,strrpos($base,':')+1);
  if($item['type']=='d'){
    if(@file_exists(wikiFN($item['id'].':'.$conf['start']))) {
      $ret .= '<a href="'.wl($item['id'].':'.$conf['start']).'" class="idx_dir">';
      $ret .= $base;
      $ret .= '</a>';
    } else {
      $ret .= '<a href="'.wl($ID,'idx='.$item['id']).'" class="idx_dir">';
      $ret .= $base;
      $ret .= '</a>';
    }
  }else{
    $ret .= html_wikilink(':'.$item['id']);
  }
  return $ret;
}

/**
 * searches for namespace sidebars
 *
 * @author Michael Klier <chi@chimeric.de>
 */
function _getNsSb($id) {
    $pname = tpl_getConf('pagename');
    $ns_sb = '';
    $path  = explode(':', $id);
    $found = false;

    while(count($path) > 0) {
        $ns_sb = implode(':', $path).':'.$pname;
        if(@file_exists(wikiFN($ns_sb))) return $ns_sb;
        array_pop($path);
    }
    
    // nothing found
    return false;
}

//Setup vim: ts=4 sw=4:
?>