903 lines
24 KiB
PHP
Executable File
903 lines
24 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Library Functions for page output.
|
|
* translator ready
|
|
* addnews ready
|
|
* mail ready
|
|
*
|
|
* @author core_module
|
|
*/
|
|
|
|
$nestedtags=array();
|
|
$output="";
|
|
|
|
$block_new_output = false;
|
|
|
|
/**
|
|
* Block any output statements temporarily
|
|
*
|
|
* @param bool $block should output be blocked
|
|
*/
|
|
function set_block_new_output($block)
|
|
{
|
|
global $block_new_output;
|
|
$block_new_output = $block;
|
|
}
|
|
|
|
/**
|
|
* Raw output (unprocessed) appended to the output buffer
|
|
*
|
|
* @param string $indata
|
|
*/
|
|
function rawoutput($indata) {
|
|
global $output, $block_new_output;
|
|
|
|
if ($block_new_output) return;
|
|
|
|
$output .= $indata . "\n";
|
|
}
|
|
|
|
/**
|
|
* Handles color and style encoding, and appends to the output buffer ($output)
|
|
*
|
|
* @param string|array $indata If an array is passed then the format for sprintf is assumed otherwise a simple string is assumed
|
|
*
|
|
* @see sprintf, apponencode
|
|
*/
|
|
function output_notl($indata){
|
|
global $output, $block_new_output;
|
|
|
|
if ($block_new_output) return;
|
|
|
|
$args = func_get_args();
|
|
//pop true off the end if we have it
|
|
$last = array_pop($args);
|
|
if ($last!==true){
|
|
array_push($args,$last);
|
|
$priv = false;
|
|
}else{
|
|
$priv = true;
|
|
}
|
|
$out = $indata;
|
|
$args[0]=&$out;
|
|
//apply variables
|
|
if (count($args)>1){
|
|
//special case since we use `% as a color code so often.
|
|
$out = str_replace("`%","`%%",$out);
|
|
$out = call_user_func_array("sprintf",$args);
|
|
}
|
|
//holiday text
|
|
if ($priv==false) $out = holidayize($out,'output');
|
|
//`1`2 etc color & formatting
|
|
$out = appoencode($out,$priv);
|
|
//apply to the page.
|
|
$output.=tlbutton_pop().$out;
|
|
$output.="\n";
|
|
}
|
|
|
|
/**
|
|
* Outputs a translated, color/style encoded string to the browser.
|
|
*
|
|
* @param string|array What to output. If an array is passed then the format used by sprintf is assumed
|
|
*
|
|
* @see output_notl
|
|
*
|
|
*/
|
|
function output(){
|
|
global $block_new_output;
|
|
|
|
if ($block_new_output) return;
|
|
$args = func_get_args();
|
|
if (is_array($args[0])) $args = $args[0];
|
|
if (is_bool($args[0]) && array_shift($args)) {
|
|
$schema= array_shift($args);
|
|
$args[0] = translate($args[0],$schema);
|
|
} else {
|
|
$args[0] = translate($args[0]);
|
|
}
|
|
call_user_func_array("output_notl",$args);
|
|
}
|
|
|
|
/**
|
|
* Generate debug output for players who have the SU_DEBUG_OUTPUT flag set in the superuser mask
|
|
*
|
|
* @param string $text The string to output
|
|
* @param bool $force If true, force debug output even for non SU/non flagged
|
|
*/
|
|
function debug($text, $force=false){
|
|
global $session, $block_new_output;
|
|
$temp = $block_new_output;
|
|
set_block_new_output(false);
|
|
if ($force || $session['user']['superuser'] & SU_DEBUG_OUTPUT){
|
|
if (is_array($text)){
|
|
require_once("lib/dump_item.php");
|
|
$text = appoencode(dump_item($text),true);
|
|
}
|
|
rawoutput("<div class='debug'>$text</div>");
|
|
}
|
|
set_block_new_output($temp);
|
|
}
|
|
|
|
/**
|
|
* Generates the appropriate output based on the LOGD coding system (ie: `b: Bold, `i: Italic)
|
|
*
|
|
* @param string $data The string to be output
|
|
* @param bool $priv Indicates if the passed string ($data) contains HTML
|
|
* @return string An output (HTML) formatted string
|
|
*/
|
|
function appoencode($data,$priv=false){
|
|
global $nestedtags,$session;
|
|
$start = 0;
|
|
$out="";
|
|
if( ($pos = strpos($data, "`")) !== false) {
|
|
global $nestedtags;
|
|
if (!isset($nestedtags['font'])) $nestedtags['font']=false;
|
|
if (!isset($nestedtags['div'])) $nestedtags['div']=false;
|
|
if (!isset($nestedtags['i'])) $nestedtags['i']=false;
|
|
if (!isset($nestedtags['b'])) $nestedtags['b']=false;
|
|
if (!isset($nestedtags['<'])) $nestedtags['<']=false;
|
|
if (!isset($nestedtags['>'])) $nestedtags['>']=false;
|
|
if (!isset($nestedtags['h'])) $nestedtags['h']=false;
|
|
|
|
static $colors = array(
|
|
"1" => "colDkBlue",
|
|
"2" => "colDkGreen",
|
|
"3" => "colDkCyan",
|
|
"4" => "colDkRed",
|
|
"5" => "colDkMagenta",
|
|
"6" => "colDkYellow",
|
|
"7" => "colDkWhite",
|
|
"~" => "colBlack",
|
|
"!" => "colLtBlue",
|
|
"@" => "colLtGreen",
|
|
"#" => "colLtCyan",
|
|
"\$" => "colLtRed",
|
|
"%" => "colLtMagenta",
|
|
"^" => "colLtYellow",
|
|
"&" => "colLtWhite",
|
|
")" => "colLtBlack",
|
|
"e" => "colDkRust",
|
|
"E" => "colLtRust",
|
|
"g" => "colXLtGreen",
|
|
"G" => "colXLtGreen",
|
|
"j" => "colMdGrey",
|
|
"J" => "colMdBlue",
|
|
"k" => "colaquamarine",
|
|
"K" => "coldarkseagreen",
|
|
"l" => "colDkLinkBlue",
|
|
"L" => "colLtLinkBlue",
|
|
"m" => "colwheat",
|
|
"M" => "coltan",
|
|
"p" => "collightsalmon",
|
|
"P" => "colsalmon",
|
|
"q" => "colDkOrange",
|
|
"Q" => "colLtOrange",
|
|
"R" => "colRose",
|
|
"T" => "colDkBrown",
|
|
"t" => "colLtBrown",
|
|
"V" => "colBlueViolet",
|
|
"v" => "coliceviolet",
|
|
"x" => "colburlywood",
|
|
"X" => "colbeige",
|
|
"y" => "colkhaki",
|
|
"Y" => "coldarkkhaki",
|
|
);
|
|
do {
|
|
++$pos;
|
|
if ($priv === false){
|
|
$out .= HTMLEntities(substr($data, $start, $pos - $start - 1), ENT_COMPAT, getsetting("charset", "ISO-8859-1"));
|
|
} else {
|
|
$out .= substr($data, $start, $pos - $start - 1);
|
|
}
|
|
$start = $pos + 1;
|
|
if(isset($colors[$data[$pos]])) {
|
|
if ($nestedtags['font']) $out.="</span>";
|
|
else $nestedtags['font']=true;
|
|
$out.="<span class='".$colors[$data[$pos]]."'>";
|
|
} else {
|
|
switch($data[$pos]){
|
|
case "n":
|
|
$out.="<br>\n";
|
|
break;
|
|
case "0":
|
|
if ($nestedtags['font']) $out.="</span>";
|
|
$nestedtags['font'] = false;
|
|
break;
|
|
case "b":
|
|
if ($nestedtags['b']){
|
|
$out.="</b>";
|
|
$nestedtags['b']=false;
|
|
}else{
|
|
$nestedtags['b']=true;
|
|
$out.="<b>";
|
|
}
|
|
break;
|
|
case "i":
|
|
if ($nestedtags['i']) {
|
|
$out.="</i>";
|
|
$nestedtags['i']=false;
|
|
}else{
|
|
$nestedtags['i']=true;
|
|
$out.="<i>";
|
|
}
|
|
break;
|
|
case "c":
|
|
if ($nestedtags['div']) {
|
|
$out.="</div>";
|
|
$nestedtags['div']=false;
|
|
}else{
|
|
$nestedtags['div']=true;
|
|
$out.="<div align='center'>";
|
|
}
|
|
break;
|
|
case "h":
|
|
if ($nestedtags['h']) {
|
|
$out.="</em>";
|
|
$nestedtags['h']=false;
|
|
}else{
|
|
$nestedtags['h']=true;
|
|
$out.="<em>";
|
|
}
|
|
break;
|
|
case ">":
|
|
if ($nestedtags['>']){
|
|
$nestedtags['>']=false;
|
|
$out.="</div>";
|
|
}else{
|
|
$nestedtags['>']=true;
|
|
$out.="<div style='float: right; clear: right;'>";
|
|
}
|
|
break;
|
|
case "<":
|
|
if ($nestedtags['<']){
|
|
$nestedtags['<']=false;
|
|
$out.="</div>";
|
|
}else{
|
|
$nestedtags['<']=true;
|
|
$out.="<div style='float: left; clear: left;'>";
|
|
}
|
|
break;
|
|
case "H":
|
|
if ($nestedtags['div']) {
|
|
$out.="</span>";
|
|
$nestedtags['div']=false;
|
|
}else{
|
|
$nestedtags['div']=true;
|
|
$out.="<span class='navhi'>";
|
|
}
|
|
break;
|
|
case "w":
|
|
global $session;
|
|
if(!isset($session['user']['weapon']))
|
|
$session['user']['weapon']="";
|
|
$out.=appoencode($session['user']['weapon'],$priv);
|
|
break;
|
|
case "`":
|
|
$out.="`";
|
|
++$pos;
|
|
break;
|
|
default:
|
|
$out.="`".$data[$pos];
|
|
}
|
|
}
|
|
} while( ($pos = strpos($data, "`", $pos)) !== false);
|
|
}
|
|
if ($priv === false){
|
|
$out .= HTMLEntities(substr($data, $start), ENT_COMPAT, getsetting("charset", "ISO-8859-1"));
|
|
} else {
|
|
$out .= substr($data, $start);
|
|
}
|
|
return $out;
|
|
}
|
|
|
|
$blockednavs = array(
|
|
'blockpartial'=>array(),
|
|
'blockfull'=>array(),
|
|
'blockcat'=>array(),
|
|
'unblockpartial'=>array(),
|
|
'unblockfull'=>array()
|
|
);
|
|
|
|
/**
|
|
* Called to block the display of a nav
|
|
* if $partial is true, it will block any nav that begins with the given $link.
|
|
* if $partial is false, it will block only navs that have exactly the given $link.
|
|
*
|
|
* @param string $link The URL to block
|
|
* @param bool $partial
|
|
*/
|
|
function blocknav($link,$partial=false){
|
|
//prevents a script from being able to generate navs on the given $link.
|
|
global $blockednavs;
|
|
$p = ($partial?'partial':'full');
|
|
$blockednavs["block$p"][$link] = true;
|
|
//eliminate any unblocked navs that match this description.
|
|
if (isset($blockednavs["unblock$p"][$link])) {
|
|
unset($blockednavs["unblock$p"][$link]);
|
|
}
|
|
if ($partial){
|
|
reset($blockednavs['unblockpartial']);
|
|
while (list($key,$val)=each($blockednavs['unblockpartial'])){
|
|
if (substr($link,0,strlen($val))==$val ||
|
|
substr($val,0,strlen($link))==$link){
|
|
unset($blockednavs['unblockpartial'][$val]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Unlocks a nav from the blocked navs Array
|
|
* if $partial is true, it will unblock any nav that begins with the given $link.
|
|
* if $partial is false, it will unblock only navs that have exactly the given $link.
|
|
*
|
|
* @param string $link The nav to unblock
|
|
* @param bool $partial If the passed nav is partial or not
|
|
*/
|
|
function unblocknav($link,$partial=false){
|
|
//prevents a link that was otherwise blocked with blocknav() from
|
|
//actually being blocked.
|
|
global $blockednavs;
|
|
$p = ($partial?'partial':'full');
|
|
$blockednavs["unblock$p"][$link] = true;
|
|
//eliminate any blocked navs that match this description.
|
|
if (isset($blockednavs["block$p"][$link])) {
|
|
unset($blockednavs["block$p"][$link]);
|
|
}
|
|
if ($partial){
|
|
reset($blockednavs['blockpartial']);
|
|
while (list($key,$val)=each($blockednavs['blockpartial'])){
|
|
if (substr($link,0,strlen($val))==$val ||
|
|
substr($val,0,strlen($link))==$link){
|
|
unset($blockednavs['blockpartial'][$val]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Called to block the display of an entire category of navs
|
|
*
|
|
* @param string $cat The category to block
|
|
*/
|
|
function blocknavcat($cat){
|
|
//prevents a script from being able to generate navs on the given $cat.
|
|
global $blockednavs;
|
|
if(!isset($blockednavs["blockcat"][$cat])) $blockednavs["blockcat"][$cat] = true;
|
|
}
|
|
|
|
/**
|
|
* Unlocks a nav category from the blocked navs Array
|
|
*
|
|
* @param string $cat The category to unblock
|
|
*/
|
|
function unblocknavcat($cat){
|
|
//prevents a category that was otherwise blocked with blocknavcat() from
|
|
//actually being blocked.
|
|
global $blockednavs;
|
|
//eliminate any blocked nav cats that match this description.
|
|
$blockednavs["blockcat"][$cat] = false;
|
|
}
|
|
|
|
function appendcount($link) {
|
|
global $session;
|
|
return appendlink($link, "c=" . $session['counter'] . "-" . date("His"));
|
|
}
|
|
|
|
function appendlink($link, $new)
|
|
{
|
|
if (strpos($link, "?") !== false) {
|
|
return $link . '&' . $new;
|
|
} else {
|
|
return $link . '?' . $new;
|
|
}
|
|
}
|
|
|
|
$navsection="";
|
|
$navbysection = array();
|
|
$navschema = array();
|
|
$navnocollapse = array();
|
|
$block_new_navs = false;
|
|
|
|
/**
|
|
* Allow header/footer code to block/unblock additional navs
|
|
*
|
|
* @param bool $block should new navs be blocked
|
|
*/
|
|
function set_block_new_navs($block)
|
|
{
|
|
global $block_new_navs;
|
|
$block_new_navs = $block;
|
|
}
|
|
|
|
/**
|
|
* Generate and/or store a nav banner for the player
|
|
*
|
|
* @param string $text the display string for the nav banner
|
|
* @param collapse $collapse (default true) can the nav section collapse
|
|
*/
|
|
function addnavheader($text, $collapse=true,$translate=TRUE)
|
|
{
|
|
global $navsection,$navbysection,$translation_namespace;
|
|
global $navschema,$navnocollapse, $block_new_navs,$notranslate;
|
|
|
|
if ($block_new_navs) return;
|
|
|
|
if (is_array($text)){
|
|
$text = "!array!".serialize($text);
|
|
}
|
|
$navsection=$text;
|
|
if (!array_key_exists($text,$navschema))
|
|
$navschema[$text] = $translation_namespace;
|
|
//So we can place sections with out adding navs to them.
|
|
if (!isset($navbysection[$navsection]))
|
|
$navbysection[$navsection] = array();
|
|
if ($collapse === false) {
|
|
$navnocollapse[$text] = true;
|
|
}
|
|
if ($translate === false) {
|
|
if (!isset($notranslate))
|
|
$notranslate = array();
|
|
array_push($notranslate,array($text,""));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generate and/or store the allowed navs or nav banners for the player.
|
|
* If $link is missing - then a banner will be displayed in the nav list
|
|
* If $text is missing - the nav will be stored in the allowed navs for the player but not displayed
|
|
* <B>ALL</B> internal site links that are displayed <B>MUST</B> also call addnav or badnav will occur.
|
|
*
|
|
* @param string $text (optional) The display string for the nav or nav banner
|
|
* @param string $link (optional) The URL of the link
|
|
* @param bool $priv Indicates if the name contains HTML
|
|
* @param bool $pop Indicates if the URL should generate a popup
|
|
* @param string $popsize If a popup - the size of the popup window
|
|
*
|
|
* @see badnav, apponencode
|
|
*/
|
|
|
|
function addnav_notl($text,$link=false,$priv=false,$pop=false,$popsize="500x300"){
|
|
global $navsection,$navbysection,$navschema,$notranslate;
|
|
global $block_new_navs;
|
|
|
|
if ($block_new_navs) return;
|
|
|
|
if ($link===false) {
|
|
// Don't do anything if text is ""
|
|
if ($text != "") {
|
|
addnavheader($text,TRUE,FALSE);
|
|
}
|
|
}else{
|
|
$args = func_get_args();
|
|
if ($text==""){
|
|
//if there's no text to display, may as well just stick this on
|
|
//the nav stack now.
|
|
call_user_func_array("private_addnav",$args);
|
|
}else{
|
|
if (!isset($navbysection[$navsection]))
|
|
$navbysection[$navsection] = array();
|
|
if (!isset($notranslate))
|
|
$notranslate = array();
|
|
array_push($navbysection[$navsection],$args);
|
|
array_push($notranslate,$args);
|
|
}
|
|
}
|
|
}
|
|
function addnav($text,$link=false,$priv=false,$pop=false,$popsize="500x300"){
|
|
global $navsection,$navbysection,$translation_namespace,$navschema;
|
|
global $block_new_navs;
|
|
|
|
if ($block_new_navs) return;
|
|
|
|
if ($link===false) {
|
|
// Don't do anything if text is ""
|
|
if ($text != "") {
|
|
addnavheader($text);
|
|
}
|
|
}else{
|
|
$args = func_get_args();
|
|
if ($text==""){
|
|
//if there's no text to display, may as well just stick this on
|
|
//the nav stack now.
|
|
call_user_func_array("private_addnav",$args);
|
|
}else{
|
|
if (!isset($navbysection[$navsection]))
|
|
$navbysection[$navsection] = array();
|
|
$t = $args[0];
|
|
if (is_array($t)) {
|
|
$t = $t[0];
|
|
}
|
|
if (!array_key_exists($t,$navschema))
|
|
$navschema[$t] = $translation_namespace;
|
|
array_push($navbysection[$navsection],array_merge($args,array("translate"=>false)));
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Determine if a nav/URL is blocked
|
|
*
|
|
* @param string $link The nav to check
|
|
* @return bool
|
|
*/
|
|
function is_blocked($link)
|
|
{
|
|
global $blockednavs;
|
|
if (isset($blockednavs['blockfull'][$link])) return true;
|
|
reset($blockednavs['blockpartial']);
|
|
while (list($l,$dummy)=each($blockednavs['blockpartial'])){
|
|
$shouldblock = false;
|
|
if (substr($link,0,strlen($l))==$l) {
|
|
if (isset($blockednavs['unblockfull'][$link]) &&
|
|
$blockednavs['unblockfull'][$link]) return false;
|
|
reset($blockednavs['unblockpartial']);
|
|
while (list($l2,$dummy)= each($blockednavs['unblockpartial'])){
|
|
if (substr($link,0,strlen($l2))==$l2){
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
/**
|
|
* Determine how many navs are available
|
|
*
|
|
* @param string $section The nav section to check
|
|
* @return int
|
|
*/
|
|
function count_viable_navs($section)
|
|
{
|
|
global $navbysection, $blockednavs;
|
|
|
|
if (isset($blockednavs['blockcat'][$section]) && $blockednavs['blockcat'][$section] == true) {
|
|
return 0;
|
|
}
|
|
$count = 0;
|
|
$val = $navbysection[$section];
|
|
reset($val);
|
|
if (count($val) > 0) {
|
|
while(list($k, $nav) = each($val)) {
|
|
if (is_array($nav) && count($nav) > 0) {
|
|
$link = $nav[1]; // [0] is the text, [1] is the link
|
|
if (!is_blocked($link)) $count++;
|
|
}
|
|
}
|
|
}
|
|
return $count;
|
|
}
|
|
|
|
|
|
/**
|
|
* Determins if there are any navs for the player
|
|
*
|
|
* @return bool
|
|
*/
|
|
function checknavs() {
|
|
global $navbysection, $session;
|
|
|
|
// If we already have navs entered (because someone stuck raw links in)
|
|
// just return true;
|
|
if (is_array($session['allowednavs']) &&
|
|
count($session['allowednavs']) > 0) return true;
|
|
|
|
// If we have any links which are going to be stuck in, return true
|
|
reset($navbysection);
|
|
while(list($key, $val) = each($navbysection)) {
|
|
if (count_viable_navs($key) > 0) {
|
|
reset($val);
|
|
while(list($k, $v) = each($val)) {
|
|
if (is_array($v) && count($v) > 0) return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// We have no navs.
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Builds navs for display
|
|
*
|
|
* @return string Output formatted navs
|
|
*/
|
|
function buildnavs(){
|
|
global $navbysection, $navschema, $session, $navnocollapse;
|
|
reset($navbysection);
|
|
$builtnavs="";
|
|
while (list($key,$val)=each($navbysection)){
|
|
$tkey = $key;
|
|
$navbanner="";
|
|
if (count_viable_navs($key)>0){
|
|
if ($key>"") {
|
|
if ($session['loggedin']) tlschema($navschema[$key]);
|
|
if (substr($key,0,7)=="!array!"){
|
|
$key = unserialize(substr($key,7));
|
|
}
|
|
$navbanner = private_addnav($key);
|
|
if ($session['loggedin']) tlschema();
|
|
}
|
|
|
|
$style = "default";
|
|
$collapseheader = "";
|
|
$collapsefooter = "";
|
|
|
|
if ($tkey > "" && (!array_key_exists($tkey,$navnocollapse) || !$navnocollapse[$tkey])) {
|
|
// Generate the collapsable section header
|
|
$args = array("name"=>"nh-{$key}",
|
|
"title"=>($key ? $key : "Unnamed Navs"));
|
|
$args = modulehook("collapse-nav{", $args);
|
|
if (isset($args['content']))
|
|
$collapseheader = $args['content'];
|
|
if (isset($args['style']))
|
|
$style = $args['style'];
|
|
if (!($key > "") && $style == "classic") {
|
|
$navbanner = "<TR><TD>";
|
|
}
|
|
}
|
|
|
|
reset($val);
|
|
$sublinks = "";
|
|
while (list($k,$v)=each($val)){
|
|
if (is_array($v) && count($v)>0){
|
|
$sublinks .= call_user_func_array("private_addnav",$v);
|
|
}//end if
|
|
}//end while
|
|
|
|
// Generate the enclosing collapsable section footer
|
|
if ($tkey > "" && (!array_key_exists($tkey,$navnocollapse) || !$navnocollapse[$tkey])) {
|
|
$args = modulehook("}collapse-nav");
|
|
if (isset($args['content']))
|
|
$collapsefooter = $args['content'];
|
|
}
|
|
|
|
switch ($style) {
|
|
case "classic":
|
|
$navbanner = str_replace("</tr>","",$navbanner);
|
|
$navbanner = str_replace("</td>","",$navbanner);
|
|
// Build the nav section
|
|
$builtnavs .= "{$navbanner}{$collapseheader}<TABLE align='left'>{$sublinks}</TABLE>{$collapsefooter}</TR></TD>\n";
|
|
break;
|
|
case "default":
|
|
default:
|
|
// Is style isn't set (should the module not be active)
|
|
// - this catches it
|
|
// Build the nav section
|
|
$builtnavs .= "{$navbanner}{$collapseheader}{$sublinks}{$collapsefooter}\n";
|
|
break;
|
|
}
|
|
}//end if
|
|
}//end while
|
|
$navbysection = array();
|
|
return $builtnavs;
|
|
}//end function
|
|
|
|
$accesskeys=array();
|
|
$quickkeys=array();
|
|
/**
|
|
* Private functions (Undocumented)
|
|
*
|
|
* @param string $text
|
|
* @param string $link
|
|
* @param bool $priv
|
|
* @param bool $pop
|
|
* @param bool $popsize
|
|
* @return mixed
|
|
*/
|
|
function private_addnav($text,$link=false,$priv=false,$pop=false,$popsize="500x300"){
|
|
//don't call this directly please. I'll break your thumbs if you do.
|
|
global $nav,$session,$accesskeys,$REQUEST_URI,$quickkeys,$navschema,$notranslate;
|
|
|
|
if (is_blocked($link)) return false;
|
|
|
|
$thisnav = "";
|
|
$unschema = 0;
|
|
$translate=true;
|
|
if (isset($notranslate))
|
|
if (in_array(array($text,$link),$notranslate)) $translate=false;
|
|
|
|
if (is_array($text)){
|
|
if ($text[0] && $session['loggedin']) {
|
|
if ($link === false) $schema = "!array!" . serialize($text);
|
|
else $schema = $text[0];
|
|
if ($translate) {
|
|
tlschema($navschema[$schema]);
|
|
$unschema = 1;
|
|
}
|
|
}
|
|
if ($link != "!!!addraw!!!") {
|
|
if ($translate) $text[0] = translate($text[0]);
|
|
$text = call_user_func_array("sprintf",$text);
|
|
} else {
|
|
$text = call_user_func_array("sprintf",$text);
|
|
}
|
|
}else{
|
|
if ($text && $session['loggedin'] && $translate) {
|
|
tlschema($navschema[$text]);
|
|
$unschema = 1;
|
|
}
|
|
if ($link != "!!!addraw!!!" && $text>"" && $translate) $text = translate($text); //leave the hack in here for now, use addnav_notl please
|
|
}
|
|
|
|
$extra="";
|
|
$ignoreuntil="";
|
|
if ($link===false){
|
|
$text = holidayize($text,'nav');
|
|
$thisnav.=tlbutton_pop().templatereplace("navhead",array("title"=>appoencode($text,$priv)));
|
|
}elseif ($link === "") {
|
|
$text = holidayize($text,'nav');
|
|
$thisnav.=tlbutton_pop().templatereplace("navhelp",array("text"=>appoencode($text,$priv)));
|
|
} elseif ($link == "!!!addraw!!!") {
|
|
$thisnav .= $text;
|
|
}else{
|
|
if ($text!=""){
|
|
$extra="";
|
|
if (strpos($link,"?")){
|
|
$extra="&c={$session['counter']}";
|
|
}else{
|
|
$extra="?c={$session['counter']}";
|
|
}
|
|
|
|
$extra.="-".date("His");
|
|
//hotkey for the link.
|
|
$key="";
|
|
if ($text[1]=="?") {
|
|
// check to see if a key was specified up front.
|
|
$hchar = strtolower($text[0]);
|
|
if ($hchar==' ' || array_key_exists($hchar,$accesskeys) && $accesskeys[$hchar]==1){
|
|
$text = substr($text,2);
|
|
$text = holidayize($text,'nav');
|
|
if ($hchar == ' ') $key = " ";
|
|
}else{
|
|
$key = $text[0];
|
|
$text = substr($text,2);
|
|
$text = holidayize($text,'nav');
|
|
$found=false;
|
|
$text_len = strlen($text);
|
|
for ($i=0;$i<$text_len; ++$i){
|
|
$char = $text[$i];
|
|
if ($ignoreuntil == $char){
|
|
$ignoreuntil="";
|
|
}else{
|
|
if ($ignoreuntil<>""){
|
|
if ($char=="<") $ignoreuntil=">";
|
|
if ($char=="&") $ignoreuntil=";";
|
|
if ($char=="`") $ignoreuntil=$text[$i+1];
|
|
}else{
|
|
if ($char==$key) {
|
|
$found=true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($found==false) {
|
|
//the hotkey for this link wasn't actually in the
|
|
//text, prepend it in parens.
|
|
if (strpos($text, "__") !== false) {
|
|
$text=str_replace("__", "(".$key.") ", $text);
|
|
}else{
|
|
$text="(".strtoupper($key).") ".$text;
|
|
}
|
|
$i=strpos($text, $key);
|
|
}
|
|
}
|
|
} else {
|
|
$text = holidayize($text,'nav');
|
|
}
|
|
|
|
if ($key==""){
|
|
//we have no previously defined key. Look for a new one.
|
|
for ($i=0;$i<strlen($text); $i++){
|
|
$char = substr($text,$i,1);
|
|
if ($ignoreuntil == $char) {
|
|
$ignoreuntil="";
|
|
}else{
|
|
if ((isset($accesskeys[strtolower($char)]) && $accesskeys[strtolower($char)]==1) || (strpos("abcdefghijklmnopqrstuvwxyz0123456789", strtolower($char)) === false) || $ignoreuntil<>"") {
|
|
if ($char=="<") $ignoreuntil=">";
|
|
if ($char=="&") $ignoreuntil=";";
|
|
if ($char=="`") $ignoreuntil=substr($text,$i+1,1);
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!isset($i)) $i=0;
|
|
if ($i<strlen($text) && $key != ' '){
|
|
$key=substr($text,$i,1);
|
|
$accesskeys[strtolower($key)]=1;
|
|
$keyrep=" accesskey=\"$key\" ";
|
|
}else{
|
|
$key="";
|
|
$keyrep="";
|
|
}
|
|
|
|
if ($key=="" || $key==" "){
|
|
}else{
|
|
$pattern1 = "/^" . preg_quote($key, "/") . "/";
|
|
$pattern2 = "/([^`])" . preg_quote($key, "/") . "/";
|
|
$rep1 = "`H$key`H";
|
|
$rep2 = "\$1`H$key`H";
|
|
$text = preg_replace($pattern1, $rep1, $text, 1);
|
|
if (strpos($text, "`H") === false) {
|
|
$text = preg_replace($pattern2, $rep2, $text, 1);
|
|
}
|
|
if ($pop){
|
|
if ($popsize==""){
|
|
$quickkeys[$key]="window.open('$link')";
|
|
}else{
|
|
$quickkeys[$key]=popup($link,$popsize);
|
|
}
|
|
}else{
|
|
$quickkeys[$key]="window.location='$link$extra'";
|
|
}
|
|
}
|
|
$n= templatereplace("navitem",array(
|
|
"text"=>appoencode($text,$priv),
|
|
"link"=>HTMLEntities($link.($pop!=true?$extra:""), ENT_COMPAT, getsetting("charset", "ISO-8859-1")),
|
|
"accesskey"=>$keyrep,
|
|
"popup"=>($pop==true ? "target='_blank'".($popsize>""?" onClick=\"".popup($link,$popsize)."; return false;\"":"") : "")
|
|
));
|
|
$n = str_replace("<a ",tlbutton_pop()."<a ",$n);
|
|
$thisnav.=$n;
|
|
}
|
|
$session['allowednavs'][$link.$extra]=true;
|
|
$session['allowednavs'][str_replace(" ", "%20", $link).$extra]=true;
|
|
$session['allowednavs'][str_replace(" ", "+", $link).$extra]=true;
|
|
if (($pos = strpos($link, "#")) !== false) {
|
|
$sublink = substr($link, 0, $pos);
|
|
$session['allowednavs'][$sublink.$extra]=true;
|
|
}
|
|
|
|
}
|
|
if ($unschema) tlschema();
|
|
$nav .= $thisnav;
|
|
return $thisnav;
|
|
}
|
|
|
|
/**
|
|
* Determine how many navs are available
|
|
*
|
|
* @return int The number of legal navs
|
|
*/
|
|
function navcount(){
|
|
//returns count of total navs added, be it they are pending addition or
|
|
//actually added.
|
|
global $session,$navbysection;
|
|
$c=count($session['allowednavs']);
|
|
reset($navbysection);
|
|
while (list($key,$val)=each($navbysection)){
|
|
if (is_array($val)) $c+=count($val);
|
|
}
|
|
reset($navbysection);
|
|
return $c;
|
|
}
|
|
|
|
/**
|
|
* Reset and wipe the navs
|
|
*
|
|
*/
|
|
function clearnav(){
|
|
$session['allowednavs']=array();
|
|
}
|
|
|
|
/**
|
|
* Reset the output and wipe the navs
|
|
*
|
|
*/
|
|
function clearoutput(){
|
|
global $output,$nestedtags,$header,$nav,$session;
|
|
|
|
clearnav();
|
|
$output="";
|
|
unset($nestedtags);
|
|
$header="";
|
|
$nav="";
|
|
}
|
|
|
|
?>
|