<?php if (!defined('PmWiki')) exit(); /* Copyright 2009 Hans Bracker. This file is toggle.php; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. (:toggle id=divname :) creates a toggle link, which can show or hide a division or other object on the page, for instance a div created with >>id=divisionname<< text can be hidden/shown >><< Necessary parameters: (:toggle id=divname:) Alternative: (:toggle divname:) Alternative with options: (:toggle hide divname:) initial hide (:toggle hide divname button:) initial hide, button (:toggle name1 name2:) toggle between name1 and name2 Optional parameters: init=hide hides the division initially (default is show) show=labelname label of link or button when div is hidden (default is Show) hide=labelname label of link or button when div is shown (default is Hide) label=labelname label of link or button for both toggle states id2=objname second object (div), for toggling betwen first and second object set=1 sets a cookie to remember toggle state */ # Version date $RecipeInfo['Toggle']['Version'] = '2015-12-23'; # SteP's interim bug fix # declare $Toggle for (:if enabled $Toggle:) recipe installation check global $Toggle; $Toggle = 1; Markup_e('toggle', 'directives', '/\\(:toggle\\s*(.*?):\\)/i', "ToggleMarkup(\$pagename, \$m[1])"); # all in one function function ToggleMarkup($pagename, $opt) { # javascript for toggling and cookie setting global $HTMLFooterFmt, $HTMLStylesFmt, $ToggleConfig, $ToggleLinks, $UploadUrlFmt, $UploadPrefixFmt; SDVA($ToggleConfig, array( 'init' => 'show', //show div 'show' => XL("Show"), //link text 'Show' 'hide' => XL("Hide"), //link text 'Hide' 'ttshow' => XL("Show"), //tooltip text 'Show' 'tthide' => XL("Hide"), //tooltip text 'Hide' 'id' => '', //no default div name 'id2' => '', //no default div2 name 'set' => false, //set no cookie to remember toggle state 'printhidden' => true, // hidden divs get printed 'nojs' => false, //in no jsbrowser links are not shown, initial hidden divs are shown )); $HTMLStylesFmt['toggle'] = " @media print{.toggle{display:none;}} .toggle img{border:none;} "; $HTMLFooterFmt['toggleobj'] = " <script type=\"text/javascript\"><!-- function toggleObj(obj, tog, show, hide, tts, tth, swap, set, cook, button, group) { var tspan = document.getElementById(obj + \"-tog\"); var el = document.getElementById(obj); if (hide && swap != '') var e2 = document.getElementById(swap); if (set == '1') document.cookie = cook+'='+tog+'; path=/'; if (group) { var allHTMLTags = document.getElementsByTagName('DIV'); for (i=0; i<allHTMLTags.length; i++) { var ei = allHTMLTags[i]; var tc = ei.getAttribute('class'); if (tc == null) continue; if (!tc.match(group)) continue; ei.style.display = 'none'; var eid = ei.getAttribute('id'); var ispan = document.getElementById(eid + \"-tog\"); // Parse show and hide from HTML script tag as 3rd and 4th args of setToggleLink's var act. var iact = ispan.innerHTML.split(','); var re = /([\\x22\\x27])(.*)\\1/; var ishow = iact[2].replace(re, '$2'); var ihide = iact[3].replace(re, '$2'); setToggleLink(ispan, ishow, tts, eid, 'show', ishow, ihide, tts, tth, swap, set, cook, button, group); } } if (tog == 'show') { el.style.display = 'block'; if(swap != '') e2.style.display = 'none'; var label = hide; var ttip = tth; tog = 'hide'; } else { el.style.display = 'none'; if (swap != '') e2.style.display = 'block'; var label = show; var ttip = tts; tog = 'show'; } setToggleLink(tspan, label, ttip, obj, tog, show, hide, tts, tth, swap, set, cook, button, group); } function setToggleLink(tspan, label, ttip, obj, tog, show, hide, tts, tth, swap, set, cook, button, group) { var act = '\"javascript:toggleObj(\''+obj+'\',\''+tog+'\',\''+show+'\',\''+hide+'\',\''+tts+'\',\''+tth+'\',\''+swap+'\',\''+set+'\',\''+cook+'\',\''+button+'\',\''+group+'\');\"'; tspan.innerHTML = (button==1) ? '<input type=\"button\" class=\"inputbutton togglebutton\" value=\"'+label+'\" onclick='+act+' />' : '<a class=\"togglelink\" title=\"'+ttip+'\" href='+act+'>'+label+'</a>'; return ''; } --></script>"; $opt = ParseArgs($opt); if ($opt['group'] && $opt['init']!='show') $opt['init'] = 'hide'; //get parameters without keys if(is_array($opt[''])) { while (count($opt['']) > 0) { $par = array_shift($opt['']); if($par == 'button') $opt['button'] = 1; elseif($par == 'hide') $opt['init'] = 'hide'; elseif($par == 'show') $opt['init'] = 'show'; elseif(!isset($opt['id'])) $opt['id'] = $par; elseif(!isset($opt['id2'])) $opt['id2'] = $par; } } $opt = array_merge($ToggleConfig, $opt); $id = (isset($opt['div'])) ? $opt['div'] : $opt['id']; $id2 = (isset($opt['div2'])) ? $opt['div2'] : $opt['id2']; if ($id == '') return "//!Error:// no object id specified!"; $ts = array(); if(isset($opt['label'])) $ts['show'] = $ts['hide'] = $opt['label']; else { $ts['show'] = (isset($opt['lshow'])) ? $opt['lshow'] : $opt['show']; $ts['hide'] = (isset($opt['lhide'])) ? $opt['lhide'] : $opt['hide']; } $ipat = "/\.png|\.gif|\.jpg|\.jpeg|\.ico/"; foreach($ts as $k => $val) { //check for image, make image tag if(preg_match($ipat, $val)) { $prefix = (strstr($val, '/')) ? '/' : $UploadPrefixFmt; $path = FmtPageName($UploadUrlFmt.$prefix, $pagename); $ts[$k] = "<img src=$path/$val title={$opt['tt'.$k]} $id />"; $opt['button'] = ''; } //apostrophe encoding else $ts[$k] = str_replace("'","’",$val); } $show = $ts['show']; $hide = $ts['hide']; $tog = $opt['init']; //check cookie if set=1 if($opt['set'] == 1) { global $CookiePrefix, $SkinName; $cook = $CookiePrefix.$SkinName.'_toggle_'.$id; if (isset($_COOKIE[$cook])) $tog = $_COOKIE[$cook]; } //toggle state if($tog == 'show') { $style = 'block'; $altstyle = 'none'; $label = $hide; $tooltip = $opt['tthide']; $tog = 'hide'; } else { $style = 'none'; $altstyle = 'block'; $label = $show; $tooltip = $opt['ttshow']; $tog = 'show'; } //set initial toggle link or button (later it is build with javascript) $act = "javascript:toggleObj('{$id}','{$tog}','{$show}','{$hide}','{$opt['ttshow']}','{$opt['tthide']}','{$id2}','{$opt['set']}','{$cook}','{$opt['button']}','{$opt['group']}')"; $out = "<span id='{$id}-tog' class='toggle'>"; if ($opt['button']==1) { $out .= '<script type="text/javascript">document.write("<input type=\'button\' class=\'inputbutton togglebutton\' value=\''.$label.'\' onclick=\"'.$act.'\" />")</script>'; if ($opt['nojs']>=1) $out .= '<noscript><input type=\'button\' class=\'inputbutton togglebutton\' value=\''.$label.'\' onclick="'.$act.'" /></noscript>'; } else { $out .= '<script type="text/javascript">document.write("<a class=\'togglelink\' title=\''.$tooltip.'\' href=\"'.$act.'\">'.$label.'</a>")</script> '; if ($opt['nojs']>=1) $out .= '<noscript><a class=\'togglelink\' >'.$label.'</a></noscript>'; } $out .= "</span>"; $HTMLFooterFmt[] = "<script type=\"text/javascript\">document.getElementById(\"{$id}\").style.display = '{$style}';</script>"; if ($style=='none') if ($id2 || $opt['nojs']>1) $HTMLStylesFmt[] = " #$id {display:none;}"; if ($opt['printhidden']==1) $HTMLStylesFmt[] = " @media print{ #{$id}{ display:block; } } "; if ($id2) { $HTMLStylesFmt[] = " #{$id2}{display:{$altstyle};} "; $HTMLFooterFmt[] = "<script type=\"text/javascript\">document.getElementById(\"{$id2}\").style.display = '{$altstyle}';</script>"; if ($opt['printhidden'] == 1) $HTMLStylesFmt[] = " @media print { #{$id2}{ display:block; } } "; } return Keep($out); } #EOF