From 78a6aeb15ad85c8be4a7e39307b7d9aa0512742c Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Sat, 29 Oct 2005 20:52:22 +0200
Subject: [PATCH] More work on Javascript and CSS dispatchers

darcs-hash:20051029185222-7ad00-c184ab3496539f3027407c7d17e8770a1849546a.gz
---
 ...press.test.php => js_js_compress.test.php} |   4 +-
 conf/dokuwiki.php                             |   1 +
 inc/init.php                                  |   4 +
 inc/pluginutils.php                           |   2 +
 inc/template.php                              |  94 +---------
 inc/toolbar.php                               |  37 ++--
 lib/exe/css.php                               | 165 ++++++++++++++++++
 lib/exe/{jscss.php => js.php}                 |  80 ++++++---
 lib/scripts/script.js                         |  50 +++---
 lib/tpl/default/detail.php                    |  10 --
 lib/tpl/default/main.php                      |  16 --
 lib/tpl/default/media.php                     |  11 +-
 lib/tpl/default/mediaedit.php                 |   2 -
 lib/tpl/default/mediaref.php                  |  11 +-
 14 files changed, 292 insertions(+), 195 deletions(-)
 rename _test/cases/lib/exe/{jscss_js_compress.test.php => js_js_compress.test.php} (94%)
 create mode 100644 lib/exe/css.php
 rename lib/exe/{jscss.php => js.php} (80%)

diff --git a/_test/cases/lib/exe/jscss_js_compress.test.php b/_test/cases/lib/exe/js_js_compress.test.php
similarity index 94%
rename from _test/cases/lib/exe/jscss_js_compress.test.php
rename to _test/cases/lib/exe/js_js_compress.test.php
index 3d9a8b627..0bfb62056 100644
--- a/_test/cases/lib/exe/jscss_js_compress.test.php
+++ b/_test/cases/lib/exe/js_js_compress.test.php
@@ -1,9 +1,9 @@
 <?php
 
-require_once DOKU_INC.'lib/exe/jscss.php';
+require_once DOKU_INC.'lib/exe/js.php';
 
 
-class jscss_js_compress_test extends UnitTestCase {
+class js_js_compress_test extends UnitTestCase {
 
     function test_mlcom1(){
         $text = '/**
diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index d12fb27fc..2d89d1cde 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -78,6 +78,7 @@ $conf['im_convert']  = '';               //path to ImageMagicks convert (will be
 $conf['spellchecker']= 0;                //enable Spellchecker (needs PHP >= 4.3.0 and aspell installed)
 $conf['subscribers'] = 0;                //enable change notice subscription support
 $conf['pluginmanager'] = 0;              //enable automated plugin management (requires plugin)
+$conf['compress']    = 1;                //Strip whitespaces and comments from Styles and JavaScript? 1|0
 $conf['rss_type']    = 'rss1';           //type of RSS feed to provide, by default:
                                          //  'rss'  - RSS 0.91
                                          //  'rss1' - RSS 1.0
diff --git a/inc/init.php b/inc/init.php
index 41363f63d..44154a039 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -42,6 +42,10 @@
   if(!defined('DOKU_TPL')) define('DOKU_TPL',
                                   DOKU_BASE.'lib/tpl/'.$conf['template'].'/');
 
+  // define real Template directory
+  if(!defined('DOKU_TPLINC')) define('DOKU_TPLINC',
+                                  DOKU_INC.'lib/tpl/'.$conf['template'].'/');
+
   // make session rewrites XHTML compliant
   @ini_set('arg_separator.output', '&amp;');
 
diff --git a/inc/pluginutils.php b/inc/pluginutils.php
index d35b0dbc2..4c81f9abb 100644
--- a/inc/pluginutils.php
+++ b/inc/pluginutils.php
@@ -8,6 +8,8 @@
 
 /**
  * prints needed HTML to include plugin CSS and JS files
+ *
+ * @deprecated - now handled by the style and script loader in lib/exe
  */
 function plugin_printCSSJS(){
     global $conf;
diff --git a/inc/template.php b/inc/template.php
index 7401c3e62..be0d2f193 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -176,7 +176,6 @@ function tpl_metaheaders(){
   ptln('<link rel="alternate" type="application/rss+xml" title="Current Namespace" href="'.DOKU_BASE.'feed.php?mode=list&amp;ns='.$INFO['namespace'].'" />',$it);
   ptln('<link rel="alternate" type="text/html" title="Plain HTML" href="'.wl($ID,'do=export_html').'" />',$it);
   ptln('<link rel="alternate" type="text/plain" title="Wiki Markup" href="'.wl($ID, 'do=export_raw').'" />',$it);
-  ptln('<link rel="stylesheet" media="screen" type="text/css" href="'.DOKU_BASE.'lib/styles/style.css" />',$it);
 
   // setup robot tags apropriate for different modes
   if( ($ACT=='show' || $ACT=='export_html') && !$REV){
@@ -195,97 +194,16 @@ function tpl_metaheaders(){
     ptln('<meta name="robots" content="noindex,nofollow" />',$it);
   }
 
-/*
-
-  // include some JavaScript language strings #FIXME still needed?
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8">',$it);
-  ptln("  var alertText   = '".str_replace('\\\\n','\\n',addslashes($lang['qb_alert']))."'",$it);
-  ptln("  var notSavedYet = '".str_replace('\\\\n','\\n',addslashes($lang['notsavedyet']))."'",$it);
-  ptln("  var DOKU_BASE   = '".DOKU_BASE."'",$it);
-
-  ptln('</script>',$it);
- 
-  // load the default JavaScript files
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-       DOKU_BASE.'lib/scripts/events.js"></script>',$it);
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-       DOKU_BASE.'lib/scripts/script.js"></script>',$it);
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-       DOKU_BASE.'lib/scripts/tw-sack.js"></script>',$it);
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-       DOKU_BASE.'lib/scripts/ajax.js"></script>',$it);
-
-  
-  // dom tool tip library, for insitu footnotes
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-       DOKU_BASE.'lib/scripts/domLib.js"></script>',$it);
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-       DOKU_BASE.'lib/scripts/domTT.js"></script>',$it);
-
-  ptln('<script language="javascript" type="text/javascript" charset="utf-8">',$it);
-  ptln("addEvent(window,'load',function(){ajax_qsearch.init('qsearch_in','qsearch_out');});",$it);
-  ptln("addEvent(window,'load',function(){addEvent(document,'click',closePopups);});",$it);
-  ptln('</script>',$it);
-
-  // editing functions
-  if($ACT=='edit' || $ACT=='preview'){
-    // add size control
-    ptln('<script language="javascript" type="text/javascript" charset="utf-8">',$it);
-    ptln("addEvent(window,'load',function(){initSizeCtl('sizectl','wikitext')});",$it+2);
-    ptln('</script>',$it);
-
-    if($INFO['writable']){
-      // load toolbar functions
-      ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-           DOKU_BASE.'lib/scripts/edit.js"></script>',$it);
-
-      // load spellchecker functions if wanted
-      if($conf['spellchecker']){
-        ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-             DOKU_BASE.'lib/scripts/spellcheck.js"></script>',$it+2);
-      }
- 
-      ptln('<script language="javascript" type="text/javascript" charset="utf-8">',$it);
-
-      // add toolbar
-      require_once(DOKU_INC.'inc/toolbar.php');
-      toolbar_JSdefines('toolbar');
-      ptln("addEvent(window,'load',function(){initToolbar('toolbar','wikitext',toolbar);});",$it+2);
-
-      // add pageleave check
-      ptln("addEvent(window,'load',function(){initChangeCheck('".
-           str_replace('\\\\n','\\n',addslashes($lang['notsavedyet']))."');});",$it);
-
-      // add lock timer
-      ptln("addEvent(window,'load',function(){init_locktimer(".
-           ($conf['locktime']-60).",'".
-           str_replace('\\\\n','\\n',addslashes($lang['willexpire']))."');});",$it);
-
-      // add spellchecker
-      if($conf['spellchecker']){
-        //init here
-        ptln("addEvent(window,'load',function(){ ajax_spell.init('".
-                                       $lang['spell_start']."','".
-                                       $lang['spell_stop']."','".
-                                       $lang['spell_wait']."','".
-                                       $lang['spell_noerr']."','".
-                                       $lang['spell_nosug']."','".
-                                       $lang['spell_change']."'); });");
-      }
-      ptln('</script>',$it);
-    }
-  }
-*/
+  // load stylesheets
+  ptln('<link rel="stylesheet" media="screen" type="text/css" href="'.DOKU_BASE.'lib/exe/css.php" />',$it);
+  ptln('<link rel="stylesheet" media="print" type="text/css" href="'.DOKU_BASE.'lib/exe/css.php?print=1" />',$it);
 
+  // load javascript
   $js_edit  = ($ACT=='edit' || $ACT=='preview') ? 1 : 0;
   $js_write = ($INFO['writable']) ? 1 : 0;
-
+  $js_sig   = ($conf['useacl'] && $_SERVER['REMOTE_USER']) ? 1 : 0;
   ptln('<script language="javascript" type="text/javascript" charset="utf-8" src="'.
-       DOKU_BASE.'lib/exe/jscss.php?type=js&amp;edit='.$js_edit.'&amp;write='.$js_write.'"></script>',$it);
-
-
-  // plugin stylesheets and Scripts
-  plugin_printCSSJS();
+       DOKU_BASE.'lib/exe/js.php?edit='.$js_edit.'&amp;write='.$js_write.'&amp;sig='.$js_sig.'"></script>',$it);
 }
 
 /**
diff --git a/inc/toolbar.php b/inc/toolbar.php
index aa52868d0..27e91ee47 100644
--- a/inc/toolbar.php
+++ b/inc/toolbar.php
@@ -164,17 +164,6 @@ function toolbar_JSdefines($varname){
            ),
     );
     
-    // if logged in add sig button
-    if($conf['useacl'] && $_SERVER['REMOTE_USER']){
-        $menu[] = array(
-            'type'   => 'insert',
-            'title'  => $lang['qb_sig'],
-            'icon'   => 'sig.png',
-            'key'    => 'y',
-            'insert' => toolbar_signature(),
-            );
-    }
-
     // use JSON to build the JavaScript array
     $json = new JSON();
     print "var $varname = ".$json->encode($menu).";\n";
@@ -187,16 +176,36 @@ function toolbar_JSdefines($varname){
  */
 function toolbar_signature(){
   global $conf;
-  global $INFO;
 
   $sig = $conf['signature'];
   $sig = strftime($sig);
   $sig = str_replace('@USER@',$_SERVER['REMOTE_USER'],$sig);
-  $sig = str_replace('@NAME@',$INFO['userinfo']['name'],$sig);
-  $sig = str_replace('@MAIL@',$INFO['userinfo']['mail'],$sig);
+  $sig = str_replace('@NAME@',$_SESSION[$conf[title]]['auth']['info']['name'],$sig);
+  $sig = str_replace('@MAIL@',$_SESSION[$conf[title]]['auth']['info']['mail'],$sig);
   $sig = str_replace('@DATE@',date($conf['dformat']),$sig);
   return $sig;
 }
 
+/**
+ * Adds the signature button to the already prepared Javascript array
+ * @param  string $varname Name of the JS variable to fill
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function toolbar_addsigbutton($varname){
+    global $lang;
+
+    $menu = array(
+                'type'   => 'insert',
+                'title'  => $lang['qb_sig'],
+                'icon'   => 'sig.png',
+                'key'    => 'y',
+                'insert' => toolbar_signature(),
+              );
+    // use JSON to build the JavaScript array
+    $json = new JSON();
+    print $varname.'['.$varname.'.length] = '.$json->encode($menu).";\n";
+
+}
+
 
 //Setup VIM: ex: et ts=4 enc=utf-8 :
diff --git a/lib/exe/css.php b/lib/exe/css.php
new file mode 100644
index 000000000..7b6523b41
--- /dev/null
+++ b/lib/exe/css.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * DokuWiki StyleSheet creator
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
+define('NOSESSION',true); // we do not use a session or authentication here (better caching)
+require_once(DOKU_INC.'inc/init.php');
+require_once(DOKU_INC.'inc/pageutils.php');
+require_once(DOKU_INC.'inc/io.php');
+
+// Main (don't run when UNIT test)
+if(!defined('SIMPLE_TEST')){
+    header('Content-Type: text/css; charset=utf-8');
+    css_out();
+}
+
+
+// ---------------------- functions ------------------------------
+
+/**
+ * Output all needed Styles
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function css_out(){
+    global $conf;
+    global $lang;
+    $print = (bool) $_REQUEST['print'];   //print mode?
+
+    // The generated script depends on some dynamic options
+    $cache = getCacheName('styles'.$print,'.css');
+
+    // Array of needed files and their web locations, the latter ones
+    // are needed to fix relative paths in the stylesheets
+    $files   = array();
+    if($print){
+        $files[DOKU_TPLINC.'print.css'] = DOKU_TPL;
+        // load plugin styles
+        $files = array_merge($files, css_pluginstyles('print'));
+        $files[DOKU_CONF.'userprint.css'] = '';
+    }else{
+        $files[DOKU_INC.'lib/styles/style.css'] = DOKU_BASE.'lib/styles/';
+        //fixme spellchecker style
+        $files[DOKU_TPLINC.'layout.css'] = DOKU_TPL;
+        $files[DOKU_TPLINC.'design.css'] = DOKU_TPL;
+        if($lang['direction'] == 'rtl'){
+            $files[DOKU_TPLINC.'rtl.css'] = DOKU_TPL;
+        }
+        // load plugin styles
+        $files = array_merge($files, css_pluginstyles('screen'));
+        $files[DOKU_CONF.'userstyle.css'] = '';
+    }
+
+    // check cache age 
+    if(css_cacheok($cache,array_keys($files))){
+        readfile($cache);
+        return;
+    }
+
+    // start output buffering and build the stylesheet
+    ob_start();
+
+    // load files
+    foreach($files as $file => $location){
+        print css_loadfile($file, $location);
+    }
+
+    // end output buffering and get contents
+    $css = ob_get_contents();
+    ob_end_clean();
+
+    // compress whitespace and comments
+    if($conf['compress']){
+        $css = css_compress($css);
+    }
+
+    // save cache file
+    io_saveFile($cache,$css);
+
+    // finally send output
+    print $css;
+}
+
+/**
+ * Checks if a CSS Cache file still is valid
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function css_cacheok($cache,$files){
+    $ctime = @filemtime($cache);
+    if(!$ctime) return false; //There is no cache
+
+    // some additional files to check
+    $files[] = DOKU_CONF.'dokuwiki.conf';
+    $files[] = DOKU_CONF.'local.conf';
+    $files[] = __FILE__;
+
+    // now walk the files
+    foreach($files as $file){
+        if(@filemtime($file) > $ctime){
+            return false;
+        }
+    }
+    return true;
+}
+
+/**
+ * Loads a given file and fixes relative URLs with the
+ * given location prefix
+ */
+function css_loadfile($file,$location=''){
+    if(!@file_exists($file)) return '';
+    $css = io_readFile($file);
+    if(!$location) return $css;
+
+    $css = preg_replace('!(url\( *)([^/])!','\\1'.$location.'\\2',$css);
+    return $css;
+}
+
+/**
+ * Returns a list of possible Plugin Styles (no existance check here)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function css_pluginstyles($mode='screen'){
+    $list = array();
+    $plugins = plugin_list();
+    foreach ($plugins as $p){
+        if($mode == 'print'){
+            $list[DOKU_PLUGIN."$p/print.css"]  = DOKU_BASE."lib/plugins/$p/";
+        }else{
+            $list[DOKU_PLUGIN."$p/style.css"]  = DOKU_BASE."lib/plugins/$p/";
+            $list[DOKU_PLUGIN."$p/screen.css"] = DOKU_BASE."lib/plugins/$p/";
+        }
+    }
+    return $list;
+}
+
+/**
+ * Very simple CSS optimizer
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function css_compress($css){
+    // strip whitespaces
+    $css = preg_replace('![\r\n\t ]+!',' ',$css);
+    $css = preg_replace('/ ?([:;,{}]) ?/','\\1',$css);
+
+    // strip comments (ungreedy)
+    // We keep very small comments to maintain typical browser hacks
+    $css = preg_replace('!(/\*)(.{4,})(\*/)!U','',$css);
+
+    // shorten colors
+    $css = preg_replace("/#([0-9a-fA-F]{1})\\1([0-9a-fA-F]{1})\\2([0-9a-fA-F]{1})\\3/", "#\\1\\2\\3",$css);
+
+    return $css;
+}
+
+
+//Setup VIM: ex: et ts=4 enc=utf-8 :
+?>
diff --git a/lib/exe/jscss.php b/lib/exe/js.php
similarity index 80%
rename from lib/exe/jscss.php
rename to lib/exe/js.php
index 33d67eece..9708dbc0d 100644
--- a/lib/exe/jscss.php
+++ b/lib/exe/js.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * DokuWiki JavaScript and CSS creator
+ * DokuWiki JavaScript creator
  *
  * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
  * @author     Andreas Gohr <andi@splitbrain.org>
@@ -14,12 +14,9 @@ require_once(DOKU_INC.'inc/io.php');
 
 // Main (don't run when UNIT test)
 if(!defined('SIMPLE_TEST')){
-    if($_REQUEST['type'] == 'css'){
-        css_out();
-    }else{
-        header('Content-Type: text/javascript; charset=utf-8');
-        js_out();
-    }
+    header('Content-Type: text/javascript; charset=utf-8');
+    js_out();
+    js_dynamicout();
 }
 
 
@@ -28,7 +25,6 @@ if(!defined('SIMPLE_TEST')){
 /**
  * Output all needed JavaScript
  *
- * @todo   Add Whitespace and Comment Compression
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function js_out(){
@@ -38,7 +34,7 @@ function js_out(){
     $write = (bool) $_REQUEST['write'];  // writable?
 
     // The generated script depends on some dynamic options
-    $cache = getCacheName($conf['lang'].$edit.$write,$ext='.js'); 
+    $cache = getCacheName('scripts'.$edit.$write,'.js'); 
 
     // Array of needed files
     $files = array(
@@ -56,10 +52,11 @@ function js_out(){
         }
     }
 
-    // FIXME load plugin scripts
+    // get possible plugin scripts
+    $plugins = js_pluginscripts();
 
     // check cache age here
-    if(js_cacheok($cache,$files)){
+    if(js_cacheok($cache,array_merge($files,$plugins))){
         readfile($cache);
         return;
     }
@@ -109,18 +106,22 @@ function js_out(){
         }
     }
 
+    // load plugin scripts (suppress warnings for missing ones)
+    foreach($plugins as $plugin){
+        @readfile($plugin);
+    }
 
     // load user script
-    if(@file_exists(DOKU_INC.'conf/userscript.js')){
-      readfile(DOKU_INC.'conf/userscript.js');
-    }
+    @readfile(DOKU_CONF.'userscript.js');
 
     // end output buffering and get contents
     $js = ob_get_contents();
     ob_end_clean();
 
     // compress whitespace and comments
-    $js = js_compress($js);
+    if($conf['compress']){
+        $js = js_compress($js);
+    }
 
     // save cache file
     io_saveFile($cache,$js);
@@ -129,6 +130,21 @@ function js_out(){
     print $js;
 }
 
+/**
+ * Adds some dynamic JavaScript using the readonly Session
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function js_dynamicout(){
+    $edit  = (bool) $_REQUEST['edit'];   // edit or preview mode?
+    $write = (bool) $_REQUEST['write'];  // writable?
+    $sig   = (bool) $_REQUEST['sig'];    // show sig button?
+    if($edit && $write && $sig){
+        require_once(DOKU_INC.'inc/toolbar.php');
+        toolbar_addsigbutton('toolbar');
+    }
+}
+
 /**
  * Checks if a JavaScript Cache file still is valid
  *
@@ -139,9 +155,10 @@ function js_cacheok($cache,$files){
     if(!$ctime) return false; //There is no cache
 
     // some additional files to check
-    $files[] = DOKU_INC.'conf/dokuwiki.conf';
-    $files[] = DOKU_INC.'conf/local.conf';
-    $files[] = DOKU_INC.'conf/userscript.js';
+    $files[] = DOKU_CONF.'dokuwiki.conf';
+    $files[] = DOKU_CONF.'local.conf';
+    $files[] = DOKU_CONF.'userscript.js';
+    $files[] = __FILE__;
 
     // now walk the files
     foreach($files as $file){
@@ -152,6 +169,20 @@ function js_cacheok($cache,$files){
     return true;
 }
 
+/**
+ * Returns a list of possible Plugin Scripts (no existance check here)
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function js_pluginscripts(){
+    $list = array();
+    $plugins = plugin_list();
+    foreach ($plugins as $p){
+        $list[] = DOKU_PLUGIN."$p/script.js";
+    }
+    return $list;
+}
+
 /**
  * Escapes a String to be embedded in a JavaScript call, keeps \n
  * as newline
@@ -171,7 +202,16 @@ function js_runonstart($func){
     print "addEvent(window,'load',function(){ $func; });";
 }
 
-//http://modp.com/release/jsstrip/jsstrip.py
+/**
+ * Strip comments and whitespaces from given JavaScript Code
+ *
+ * This is a rewrite of Nick Galbreaths python tool jsstrip.py which is
+ * released under BSD license. See link for original code.
+ *
+ * @author Nick Galbreath <nickg@modp.com>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @link http://modp.com/release/jsstrip/
+ */
 function js_compress($s){
     $i = 0;
     $line = 0;
@@ -287,7 +327,5 @@ function js_compress($s){
     return $out;
 }
 
-//http://csstidy.sourceforge.net/download.php
-
 //Setup VIM: ex: et ts=4 enc=utf-8 :
 ?>
diff --git a/lib/scripts/script.js b/lib/scripts/script.js
index 180f2dcd5..b91859265 100644
--- a/lib/scripts/script.js
+++ b/lib/scripts/script.js
@@ -6,8 +6,8 @@
  * Some browser detection
  */
 var clientPC  = navigator.userAgent.toLowerCase(); // Get client info
-var is_gecko  = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1)
-                && (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
+var is_gecko  = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')==-1) &&
+                (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
 var is_safari = ((clientPC.indexOf('AppleWebKit')!=-1) && (clientPC.indexOf('spoofer')==-1));
 var is_khtml  = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
 if (clientPC.indexOf('opera')!=-1) {
@@ -23,10 +23,11 @@ if (clientPC.indexOf('opera')!=-1) {
  */
 function findPosX(object){
   var curleft = 0;
+  var obj;
   if(typeof(object) == 'object'){
-    var obj = object;
+    obj = object;
   }else{
-    var obj = document.getElementById(object);
+    obj = document.getElementById(object);
   }
   if (obj.offsetParent){
     while (obj.offsetParent){
@@ -47,10 +48,11 @@ function findPosX(object){
  */
 function findPosY(object){
   var curtop = 0;
+  var obj;
   if(typeof(object) == 'object'){
-    var obj = object;
+    obj = object;
   }else{
-    var obj = document.getElementById(object);
+    obj = document.getElementById(object);
   }
   if (obj.offsetParent){
     while (obj.offsetParent){
@@ -72,7 +74,7 @@ function findPosY(object){
 function jsEscape(text){
     var re=new RegExp("\\\\","g");
     text=text.replace(re,"\\\\");
-    var re=new RegExp("'","g");
+    re=new RegExp("'","g");
     text=text.replace(re,"\\'");
     re=new RegExp('"',"g");
     text=text.replace(re,'&quot;');
@@ -150,8 +152,8 @@ function showTocToggle(showtxt,hidetxt) {
 
     document.writeln('<div class=\'toctoggle\'><a href="javascript:toggleToc()" class="toc">' +
     '<span id="showlink" style="display:none;">' + show + '</span>' +
-    '<span id="hidelink">' + hide + '</span>'
-    + '</a></div>');
+    '<span id="hidelink">' + hide + '</span>' +
+    '</a></div>');
   }
 }
 
@@ -200,12 +202,14 @@ function getCookie(name) {
   var begin = dc.indexOf("; " + prefix);
   if (begin == -1) {
     begin = dc.indexOf(prefix);
-    if (begin != 0) return null;
-  } else
+    if (begin !== 0){ return null; }
+  } else {
     begin += 2;
+  }
   var end = document.cookie.indexOf(";", begin);
-  if (end == -1)
+  if (end == -1){
     end = dc.length;
+  }
   return unescape(dc.substring(begin + prefix.length, end));
 }
 
@@ -217,8 +221,9 @@ function getCookie(name) {
 function fixDate(date) {
   var base = new Date(0);
   var skew = base.getTime();
-  if (skew > 0)
+  if (skew > 0){
     date.setTime(date.getTime() - skew);
+  }
 }
 
 /*
@@ -258,16 +263,17 @@ function fnt(id, e, evt) {
     }
     
     // does the footnote tooltip already exist?
-    var fnt = document.getElementById('insitu-fn'+id);
-    if (!fnt) {
+    var fnote = document.getElementById('insitu-fn'+id);
+    var footnote;
+    if (!fnote) {
         // if not create it...
     
         // locate the footnote anchor element
         var a = document.getElementById( "fn"+id );    
-        if (!a) return;
+        if (!a){ return; }
         
         // anchor parent is the footnote container, get its innerHTML
-        var footnote = new String (a.parentNode.innerHTML);
+        footnote = new String (a.parentNode.innerHTML);
         
         // strip the leading footnote anchors and their comma separators
         footnote = footnote.replace(/<a\s.*?href=\".*\#fnt\d+\".*?<\/a>/gi, '');
@@ -276,7 +282,7 @@ function fnt(id, e, evt) {
         // prefix ids on any elements with "insitu-" to ensure they remain unique
         footnote = footnote.replace(/\bid=\"(.*?)\"/gi,'id="insitu-$1');
    	} else {
-        var footnote = new String(fnt.innerHTML);
+        footnote = new String(fnt.innerHTML);
     }
     
     // activate the tooltip
@@ -289,13 +295,13 @@ function fnt(id, e, evt) {
  * Add the edit window size controls
  */
 function initSizeCtl(ctlid,edid){
-		if(!document.getElementById) return;
+		if(!document.getElementById){ return; }
 
     var ctl      = document.getElementById(ctlid);
     var textarea = document.getElementById(edid);
 
     var hgt = getCookie('DokuWikisizeCtl');
-    if(hgt == null){
+    if(hgt === null || hgt === ''){
       textarea.style.height = '300px';
     }else{
       textarea.style.height = hgt;
@@ -319,7 +325,7 @@ function sizeCtl(edid,val){
   var height = parseInt(textarea.style.height.substr(0,textarea.style.height.length-2));
   height += val;
   textarea.style.height = height+'px';
-  
+
   var now = new Date();
   fixDate(now);
   now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); //expire in a year
@@ -330,7 +336,7 @@ function sizeCtl(edid,val){
  * Handler to close all open Popups
  */
 function closePopups(){
-  if(!document.getElementById) return;
+  if(!document.getElementById){ return; }
 
   var divs = document.getElementsByTagName('div');
   for(var i=0; i < divs.length; i++){
diff --git a/lib/tpl/default/detail.php b/lib/tpl/default/detail.php
index 70865c933..5a59e0305 100644
--- a/lib/tpl/default/detail.php
+++ b/lib/tpl/default/detail.php
@@ -24,16 +24,6 @@
   <?php tpl_metaheaders()?>
 
   <link rel="shortcut icon" href="<?php echo DOKU_BASE?>lib/images/favicon.ico" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>layout.css" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>design.css" />
-
-  <!--[if gte IE 5]>
-  <style type="text/css">
-    /* that IE 5+ conditional comment makes this only visible in IE 5+ */
-    /* IE bugfix for transparent PNGs */
-    //DISABLED img { behavior: url("<?php echo DOKU_BASE?>lib/scripts/pngbehavior.htc"); }
-  </style>
-  <![endif]-->
 </head>
 
 <body>
diff --git a/lib/tpl/default/main.php b/lib/tpl/default/main.php
index afa0b5534..bb32def6b 100644
--- a/lib/tpl/default/main.php
+++ b/lib/tpl/default/main.php
@@ -23,22 +23,6 @@
   <?php tpl_metaheaders()?>
 
   <link rel="shortcut icon" href="<?php echo DOKU_BASE?>lib/images/favicon.ico" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>layout.css" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>design.css" />
-
-  <?php if($lang['direction'] == 'rtl') {?>
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>rtl.css" />
-  <?php } ?>
-
-  <link rel="stylesheet" media="print" type="text/css" href="<?php echo DOKU_TPL?>print.css" />
-
-  <!--[if gte IE 5]>
-  <style type="text/css">
-    /* that IE 5+ conditional comment makes this only visible in IE 5+ */
-    /* IE bugfix for transparent PNGs */
-    //DISABLED   img { behavior: url("<?php echo DOKU_BASE?>lib/scripts/pngbehavior.htc"); }
-  </style>
-  <![endif]-->
 
   <?php /*old includehook*/ @include(dirname(__FILE__).'/meta.html')?>
 </head>
diff --git a/lib/tpl/default/media.php b/lib/tpl/default/media.php
index f6fb66750..b3738e39a 100644
--- a/lib/tpl/default/media.php
+++ b/lib/tpl/default/media.php
@@ -21,16 +21,7 @@
   <?php tpl_metaheaders()?>
 
   <link rel="shortcut icon" href="<?php echo DOKU_BASE?>lib/images/favicon.ico" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>layout.css" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>design.css" />
-
-  <!--[if gte IE 5]>
-  <style type="text/css">
-    /* that IE 5+ conditional comment makes this only visible in IE 5+ */
-    /* IE bugfix for transparent PNGs */
-    //DISABLED img { behavior: url("<?php echo DOKU_BASE?>lib/scripts/pngbehavior.htc"); }
-  </style>
-  <![endif]-->
+
 </head>
 
 <body>
diff --git a/lib/tpl/default/mediaedit.php b/lib/tpl/default/mediaedit.php
index c7b7e2e53..92d1db8db 100644
--- a/lib/tpl/default/mediaedit.php
+++ b/lib/tpl/default/mediaedit.php
@@ -22,8 +22,6 @@
   <?php tpl_metaheaders()?>
 
   <link rel="shortcut icon" href="<?php echo DOKU_BASE?>images/favicon.ico" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>layout.css" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>design.css" />
 </head>
 
 <body>
diff --git a/lib/tpl/default/mediaref.php b/lib/tpl/default/mediaref.php
index 61254c9ce..47752a571 100644
--- a/lib/tpl/default/mediaref.php
+++ b/lib/tpl/default/mediaref.php
@@ -22,16 +22,7 @@
   <?php tpl_metaheaders()?>
 
   <link rel="shortcut icon" href="<?php echo DOKU_BASE?>images/favicon.ico" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>layout.css" />
-  <link rel="stylesheet" media="screen" type="text/css" href="<?php echo DOKU_TPL?>design.css" />
-
-  <!--[if gte IE 5]>
-  <style type="text/css">
-    /* that IE 5+ conditional comment makes this only visible in IE 5+ */
-    /* IE bugfix for transparent PNGs */
-    //img { behavior: url("<?php echo DOKU_BASE?>/pngbehavior.htc"); }
-  </style>
-  <![endif]-->
+
 </head>
 
 <body>
-- 
GitLab