# HG changeset patch # User Dan # Date 1183313319 14400 # Node ID 4d87aad3c4c02e771d8cc9ef4c3a9403326fd30d # Parent dc8741857bdeb86ddc90893c3c9e028dd36a80e7 Finished everything on the TODO list (yay!); several CSS cleanups; tons more changes in this commit - see the patch for details diff -r dc8741857bde -r 4d87aad3c4c0 TODO --- a/TODO Thu Jun 28 15:26:40 2007 -0400 +++ b/TODO Sun Jul 01 14:08:39 2007 -0400 @@ -5,13 +5,18 @@ [x] Add in Moderators group [x] Create default ACL rule for mods [x] Fix invalid HTML in SF.net logo -[ ] Clean up the wikitext parser - a lot. It needs some serious work. +[x] Clean up the wikitext parser - a lot. It needs some serious work. We need a way to detect whether the text is mostly HTML, and if so, then leave stuff like automatic adding of
and Access to this page requires a password. Please enter the password for this page below: The password you entered for this page was incorrect. Please enter the password for this page below: ' . $name . ': Review any warnings above, and then click here to finish the installation.';
+ // unset($session);
+ // $session = new sessionManager();
+ // $session->start();
+
+ PageUtils::flushlogs('Main_Page', 'Article');
+
+ echo 'done! Review any warnings above, and then click here to finish the installation.';
// echo '';
diff -r dc8741857bde -r 4d87aad3c4c0 plugins/SpecialUserFuncs.php
--- a/plugins/SpecialUserFuncs.php Thu Jun 28 15:26:40 2007 -0400
+++ b/plugins/SpecialUserFuncs.php Sun Jul 01 14:08:39 2007 -0400
@@ -167,6 +167,10 @@
{
echo 'tabindex="1" ';
}
+ else
+ {
+ echo 'tabindex="3" ';
+ }
if ( $session->user_logged_in )
{
echo 'value="' . $session->username . '"';
@@ -192,7 +196,7 @@
Session API returned error: ' . $result . ' The following errors were encountered while saving your e-mail address:
out
of the picture. Continue to parse wikilinks.
+ [x] Probably the way to do this is to have a wrapper for (or modified version of) sanitize_html that uses the existing
+ XML pseudo-parser. Have it look for certain key block-level elements (div, p, table, blockquote, pre), and wrap
';
+ if ( in_array($tag_name, $block_tags) )
+ {
+ if ( $block_tagname == $tag_name )
+ {
+ $in_blocksec -= 1;
+ if ( $in_blocksec == 0 )
+ {
+ $block_tagname = '';
+ $i += 2;
+ // echo 'Finished wiki litewiki wraparound calc at pos: ' . $i;
+ $full_litewiki = substr($html, $block_start, ( $i - $block_start ));
+ $new_text = "{$tok1}{$full_litewiki}{$tok2}";
+ $html = substr($html, 0, $block_start) . $new_text . substr($html, $i);
+
+ $i += ( strlen($tok1) + strlen($tok2) ) - 1;
+ $len = strlen($html);
+
+ //die('' . htmlspecialchars($html) . '
');
+ }
+ }
+ }
+
+ $in_tag = false;
+ $in_quote = false;
+ $tag_name = '';
+
+ continue;
+ }
+ else if ( $chr == '<' && !$in_tag && $next != '/' )
+ {
+ // start of a tag
+ $tag_start = $i;
+ $in_tag = true;
+ $trk_name = true;
+ }
+ else if ( !$in_quote && $in_tag && $chr == '>' )
+ {
+ if ( !in_array($tag_name, $block_tags) )
+ {
+ // Inline tag - reset and go to the next one
+ // echo '<inline ' . $tag_name . '> ';
+
+ $in_tag = false;
+ $tag_name = '';
+ continue;
+ }
+ else
+ {
+ // echo '<block: ' . $tag_name . ' @ ' . $i . '>
';
+ if ( $in_blocksec == 0 )
+ {
+ //die('Found a starting tag for a block element: ' . $tag_name . ' at pos ' . $tag_start);
+ $block_tagname = $tag_name;
+ $block_start = $tag_start;
+ $in_blocksec++;
+ }
+ else if ( $block_tagname == $tag_name )
+ {
+ $in_blocksec++;
+ }
+
+ $in_tag = false;
+ $tag_name = '';
+ continue;
+ }
+ }
+ elseif ( $in_tag && $trk_name )
+ {
+ $is_alphabetical = ( strtolower($chr) != strtoupper($chr) || in_array($chr, array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) || $chr == '?' || $chr == '!' || $chr == '-' );
+ if ( $is_alphabetical )
+ $tag_name .= $chr;
+ else
+ {
+ $trk_name = false;
+ }
+ }
+
+ // Tokenization complete
+
+ }
+
+ $regex = '/' . str_replace('/', '\\/', preg_quote($tok2)) . '([\s]*)' . preg_quote($tok1) . '/is';
+ // die(htmlspecialchars($regex));
+ $html = preg_replace($regex, '\\1', $html);
+
+ return $html;
+
+}
+
function htmlalternatives($string)
{
$ret = '';
@@ -2102,6 +2254,21 @@
}
}
+/**
+ * Injects a string into another string at the specified position.
+ * @param string The haystack
+ * @param string The needle
+ * @param int Position at which to insert the needle
+ */
+
+function inject_substr($haystack, $needle, $pos)
+{
+ $str1 = substr($haystack, 0, $pos);
+ $pos++;
+ $str2 = substr($haystack, $pos);
+ return "{$str1}{$needle}{$str2}";
+}
+
//die('Original: 01010101010100101010100101010101011010'."\nProcessed: ".uncompress_bitfield(compress_bitfield('01010101010100101010100101010101011010')).'
');
?>
diff -r dc8741857bde -r 4d87aad3c4c0 includes/pageprocess.php
--- a/includes/pageprocess.php Thu Jun 28 15:26:40 2007 -0400
+++ b/includes/pageprocess.php Sun Jul 01 14:08:39 2007 -0400
@@ -60,6 +60,13 @@
var $perms = null;
/**
+ * The SHA1 hash of the user-inputted password for the page
+ * @var string
+ */
+
+ var $password = '';
+
+ /**
* Switch to track if redirects are allowed. Defaults to true.
* @var bool
*/
@@ -143,6 +150,15 @@
$this->send_headers = false;
$strict_no_headers = true;
}
+ if ( $paths->pages[$pathskey]['password'] != '' && $paths->pages[$pathskey]['password'] != sha1('') )
+ {
+ $password =& $paths->pages[$pathskey]['password'];
+ if ( $this->password != $password )
+ {
+ $this->err_wrong_password();
+ return false;
+ }
+ }
}
if ( $this->namespace == 'Special' || $this->namespace == 'Admin' )
{
@@ -472,6 +488,7 @@
function _handle_userpage()
{
global $db, $session, $paths, $template, $plugins; // Common objects
+ global $email;
if ( $this->page_id == $paths->cpage['urlname_nons'] && $this->namespace == $paths->namespace )
{
@@ -689,7 +706,6 @@
if ( $userdata['email_public'] == 1 )
{
$class = ( $class == 'row1' ) ? 'row3' : 'row1';
- global $email;
$email_link = $email->encryptEmail($userdata['email']);
echo ' ';
}
@@ -808,6 +824,36 @@
}
/**
+ * Inform the user of an incorrect or absent password
+ * @access private
+ */
+
+ function err_wrong_password()
+ {
+ global $db, $session, $paths, $template, $plugins; // Common objects
+
+ $title = 'Password required';
+ $message = ( empty($this->password) ) ? 'E-mail address: ' . $email_link . ' $title
+ $message";
+ }
+ }
+
+ /**
* Send the error message to the user complaining that there weren't any rows.
* @access private
*/
diff -r dc8741857bde -r 4d87aad3c4c0 includes/pageutils.php
--- a/includes/pageutils.php Thu Jun 28 15:26:40 2007 -0400
+++ b/includes/pageutils.php Sun Jul 01 14:08:39 2007 -0400
@@ -1240,14 +1240,20 @@
{
global $db, $session, $paths, $template, $plugins; // Common objects
if(!$session->get_permissions('clear_logs')) die('Administrative privileges are required to flush logs, you loser.');
- $e = $db->sql_query('DELETE FROM '.table_prefix.'logs WHERE page_id=\''.$page_id.'\' AND namespace=\''.$namespace.'\';');
+ $e = $db->sql_query('DELETE FROM '.table_prefix.'logs WHERE page_id=\''.$db->escape($page_id).'\' AND namespace=\''.$db->escape($namespace).'\';');
if(!$e) $db->_die('The log entries could not be deleted.');
- $e = $db->sql_query('SELECT page_text,char_tag FROM '.table_prefix.'page_text WHERE page_id=\''.$page_id.'\' AND namespace=\''.$namespace.'\';');
- if(!$e) $db->_die('The current page text could not be selected; as a result, creating the backup of the page failed. Please make a backup copy of the page by clicking Edit this page and then clicking Save Changes.');
- $row = $db->fetchrow();
- $db->free_result();
- $q='INSERT INTO '.table_prefix.'logs(log_type,action,time_id,date_string,page_id,namespace,page_text,char_tag,author,edit_summary,minor_edit) VALUES(\'page\', \'edit\', '.time().', \''.date('d M Y h:i a').'\', \''.$page_id.'\', \''.$namespace.'\', \''.$db->escape($row['page_text']).'\', \''.$row['char_tag'].'\', \''.$session->username.'\', \''."Automatic backup created when logs were purged".'\', '.'false'.');';
- if(!$db->sql_query($q)) $db->_die('The history (log) entry could not be inserted into the logs table.');
+
+ // If the page exists, make a backup of it in case it gets spammed/vandalized
+ // If not, the admin's probably deleting a trash page
+ if ( isset($paths->pages[ $paths->nslist[$namespace] . $page_id ]) )
+ {
+ $e = $db->sql_query('SELECT page_text,char_tag FROM '.table_prefix.'page_text WHERE page_id=\''.$page_id.'\' AND namespace=\''.$namespace.'\';');
+ if(!$e) $db->_die('The current page text could not be selected; as a result, creating the backup of the page failed. Please make a backup copy of the page by clicking Edit this page and then clicking Save Changes.');
+ $row = $db->fetchrow();
+ $db->free_result();
+ $q='INSERT INTO '.table_prefix.'logs(log_type,action,time_id,date_string,page_id,namespace,page_text,char_tag,author,edit_summary,minor_edit) VALUES(\'page\', \'edit\', '.time().', \''.date('d M Y h:i a').'\', \''.$page_id.'\', \''.$namespace.'\', \''.$db->escape($row['page_text']).'\', \''.$row['char_tag'].'\', \''.$session->username.'\', \''."Automatic backup created when logs were purged".'\', '.'false'.');';
+ if(!$db->sql_query($q)) $db->_die('The history (log) entry could not be inserted into the logs table.');
+ }
return('The logs for this page have been cleared. A backup of this page has been added to the logs table so that this page can be restored in case of vandalism or spam later.');
}
diff -r dc8741857bde -r 4d87aad3c4c0 includes/sessions.php
--- a/includes/sessions.php Thu Jun 28 15:26:40 2007 -0400
+++ b/includes/sessions.php Sun Jul 01 14:08:39 2007 -0400
@@ -712,6 +712,7 @@
{
eval($cmd);
}
+
return 'success';
}
else
@@ -771,32 +772,50 @@
function register_session($user_id, $username, $password, $level = USER_LEVEL_MEMBER)
{
+ // Random key identifier
$salt = md5(microtime() . mt_rand());
+
+ // SHA1 hash of password, stored in the key
$passha1 = sha1($password);
+
+ // Unencrypted session key
$session_key = "u=$username;p=$passha1;s=$salt";
+
+ // Encrypt the key
$aes = new AESCrypt(AES_BITS, AES_BLOCKSIZE);
$session_key = $aes->encrypt($session_key, $this->private_key, ENC_HEX);
+
+ // If we're registering an elevated-privilege key, it needs to be on GET
if($level > USER_LEVEL_MEMBER)
{
+ // Reverse it - cosmetic only ;-)
$hexkey = strrev($session_key);
$this->sid_super = $hexkey;
$_GET['auth'] = $hexkey;
}
else
{
+ // Stash it in a cookie
+ // For now, make the cookie last forever, we can change this in 1.1.x
setcookie( 'sid', $session_key, time()+315360000, scriptPath.'/' );
$_COOKIE['sid'] = $session_key;
}
+ // $keyhash is stored in the database, this is for compatibility with the older DB structure
$keyhash = md5($session_key);
+ // Record the user's IP
$ip = ip2hex($_SERVER['REMOTE_ADDR']);
if(!$ip)
die('$session->register_session: Remote-Addr was spoofed');
+ // The time needs to be stashed to enforce the 15-minute limit on elevated session keys
$time = time();
+
+ // Sanity check
if(!is_int($user_id))
die('Somehow an SQL injection attempt crawled into our session registrar! (1)');
if(!is_int($level))
die('Somehow an SQL injection attempt crawled into our session registrar! (2)');
+ // All done!
$query = $this->sql('INSERT INTO '.table_prefix.'session_keys(session_key, salt, user_id, auth_level, source_ip, time) VALUES(\''.$keyhash.'\', \''.$salt.'\', '.$user_id.', '.$level.', \''.$ip.'\', '.$time.');');
return true;
}
@@ -1564,7 +1583,7 @@
}
elseif(is_string($user))
{
- $q = $this->sql('SELECT user_id,username,email FROM '.table_prefix.'users WHERE username=\''.$db->escape($user).'\';');
+ $q = $this->sql('SELECT user_id,username,email FROM '.table_prefix.'users WHERE lcase(username)=lcase(\''.$db->escape($user).'\');');
}
else
{
@@ -1664,25 +1683,47 @@
/**
* For a given user level identifier (USER_LEVEL_*), returns a string describing that user level.
* @param int User level
+ * @param bool If true, returns a shorter string. Optional.
* @return string
*/
- function userlevel_to_string($user_level)
+ function userlevel_to_string($user_level, $short = false)
{
- switch ( $user_level )
+ if ( $short )
{
- case USER_LEVEL_GUEST:
- return 'Low - guest privileges';
- case USER_LEVEL_MEMBER:
- return 'Standard - normal member level';
- case USER_LEVEL_CHPREF:
- return 'Medium - user can change his/her own e-mail address and password';
- case USER_LEVEL_MOD:
- return 'High - moderator privileges';
- case USER_LEVEL_ADMIN:
- return 'Highest - administrative privileges';
- default:
- return "Unknown ($user_level)";
+ switch ( $user_level )
+ {
+ case USER_LEVEL_GUEST:
+ return 'Guest';
+ case USER_LEVEL_MEMBER:
+ return 'Member';
+ case USER_LEVEL_CHPREF:
+ return 'Sensitive preferences changeable';
+ case USER_LEVEL_MOD:
+ return 'Moderator';
+ case USER_LEVEL_ADMIN:
+ return 'Administrative';
+ default:
+ return "Level $user_level";
+ }
+ }
+ else
+ {
+ switch ( $user_level )
+ {
+ case USER_LEVEL_GUEST:
+ return 'Low - guest privileges';
+ case USER_LEVEL_MEMBER:
+ return 'Standard - normal member level';
+ case USER_LEVEL_CHPREF:
+ return 'Medium - user can change his/her own e-mail address and password';
+ case USER_LEVEL_MOD:
+ return 'High - moderator privileges';
+ case USER_LEVEL_ADMIN:
+ return 'Highest - administrative privileges';
+ default:
+ return "Unknown ($user_level)";
+ }
}
}
@@ -1784,7 +1825,7 @@
if(is_string($email))
{
// I didn't write this regex.
- if(!preg_match('/^(?:[\w\d]+\.?)+@(?:(?:[\w\d]\-?)+\.)+\w{2,4}$/', $email))
+ if(!preg_match('/^(?:[\w\d]+\.?)+@((?:(?:[\w\d]\-?)+\.)+\w{2,4}|localhost)$/', $email))
$errors[] = 'The e-mail address you entered is invalid.';
$strs[] = 'email=\''.$db->escape($email).'\'';
}
@@ -2340,7 +2381,6 @@
alert(\'The key is messed up\\nType: \'+typeof(cryptkey)+len);
}
}
- if(frm.username) frm.username.focus();
function runEncryption()
{
if(testpassed)
diff -r dc8741857bde -r 4d87aad3c4c0 includes/wikiengine/Parse/Mediawiki/Newline.php
--- a/includes/wikiengine/Parse/Mediawiki/Newline.php Thu Jun 28 15:26:40 2007 -0400
+++ b/includes/wikiengine/Parse/Mediawiki/Newline.php Sun Jul 01 14:08:39 2007 -0400
@@ -70,6 +70,55 @@
$this->wiki->addToken($this->rule) .
$matches[2];
}
+
+ /**
+ *
+ * Abstrct method to parse source text for matches.
+ *
+ * Applies the rule's regular expression to the source text, passes
+ * every match to the process() method, and replaces the matched text
+ * with the results of the processing.
+ *
+ * @access public
+ *
+ * @see Text_Wiki_Parse::process()
+ *
+ */
+
+ function parse()
+ {
+ $source =& $this->wiki->source;
+
+ // This regex attempts to find HTML tags that can be safely compacted together without formatting loss
+ // The idea is to make it easier for the HTML parser to find litewiki elements
+ //$source = preg_replace('/<\/([a-z0-9:-]+?)>([\s]*[\n]+[\s]+|[\s]+[\n]+[\s]*|[\n]+)<([a-z0-9:-]+)(.*?)>/i', '\\1><\\3\\4>', $source);
+ $source = wikiformat_process_block($source);
+
+ $rand_key = md5( str_rot13(strval(dechex(time()))) . microtime() . strval(mt_rand()) );
+ preg_match_all('/<(litewiki|pre)([^>]*?)>(.*?)<\/\\1>/is', $this->wiki->source, $matches);
+
+ $poslist = array();
+
+ foreach ( $matches[0] as $i => $match )
+ {
+ $source = str_replace($match, "{LITEWIKI:$i:$rand_key}", $source);
+ }
+
+ $this->wiki->source = preg_replace_callback(
+ $this->regex,
+ array(&$this, 'process'),
+ $this->wiki->source
+ );
+
+ foreach ( $matches[3] as $i => $match )
+ {
+ $source = str_replace("{LITEWIKI:$i:$rand_key}", $match, $source);
+ }
+
+ // die(''.htmlspecialchars($source).'
');
+
+ unset($matches, $source, $rand_key);
+ }
}
?>
\ No newline at end of file
diff -r dc8741857bde -r 4d87aad3c4c0 includes/wikiengine/Parse/Mediawiki/Paragraph.php
--- a/includes/wikiengine/Parse/Mediawiki/Paragraph.php Thu Jun 28 15:26:40 2007 -0400
+++ b/includes/wikiengine/Parse/Mediawiki/Paragraph.php Sun Jul 01 14:08:39 2007 -0400
@@ -56,7 +56,8 @@
'deflist',
'table',
'list',
- 'toc'
+ 'toc',
+ 'pre'
)
);
@@ -142,5 +143,37 @@
return $start . trim($matches[0]) . $end;
}
}
+
+ /**
+ *
+ * Abstrct method to parse source text for matches.
+ *
+ * Applies the rule's regular expression to the source text, passes
+ * every match to the process() method, and replaces the matched text
+ * with the results of the processing.
+ *
+ * @access public
+ *
+ * @see Text_Wiki_Parse::process()
+ *
+ */
+
+ function parse()
+ {
+ $source =& $this->wiki->source;
+ $source = wikiformat_process_block($source);
+
+ $source = preg_replace('/' . htmlspecialchars($source) . '
');
+
+ $this->wiki->source = preg_replace_callback(
+ $this->regex,
+ array(&$this, 'process'),
+ $this->wiki->source
+ );
+
+ $source = preg_replace('/'.htmlspecialchars($this->source).'
');
}
}
}
diff -r dc8741857bde -r 4d87aad3c4c0 index.php
--- a/index.php Thu Jun 28 15:26:40 2007 -0400
+++ b/index.php Sun Jul 01 14:08:39 2007 -0400
@@ -54,6 +54,8 @@
$rev_id = ( (isset($_GET['oldid'])) ? intval($_GET['oldid']) : 0 );
$page = new PageProcessor( $paths->cpage['urlname_nons'], $paths->namespace, $rev_id );
$page->send_headers = true;
+ $pagepass = ( isset($_REQUEST['pagepass']) ) ? sha1($_REQUEST['pagepass']) : '';
+ $page->password = $pagepass;
$page->send();
break;
case 'comments':
@@ -187,7 +189,7 @@
break;
case 'moreoptions':
$template->header();
- echo ' ';
+ echo ' ';
$template->footer();
break;
case 'protect':
diff -r dc8741857bde -r 4d87aad3c4c0 install.php
--- a/install.php Thu Jun 28 15:26:40 2007 -0400
+++ b/install.php Sun Jul 01 14:08:39 2007 -0400
@@ -1128,13 +1128,43 @@
fwrite($cf_handle, $config_file);
fclose($cf_handle);
+ echo 'done!
Starting the Enano API...';
+
+ $template_bak = $template;
+
+ // Get Enano loaded
+ $_GET['title'] = 'Main_Page';
+ require('includes/common.php');
+
+ // We need to be logged in (with admin rights) before logs can be flushed
+ $session->login_without_crypto($_POST['admin_user'], $dec, false);
+
+ // Now that login cookies are set, initialize the session manager and ACLs
+ $session->start();
+ $paths->init();
+
+ unset($template);
+ $template =& $template_bak;
+
echo 'done!
Initializing logs...';
- $q = mysql_query('INSERT INTO ' . $_POST['table_prefix'] . 'logs(log_type,action,time_id,date_string,author,page_text,edit_summary) VALUES(\'security\', \'install_enano\', ' . time() . ', \'' . date('d M Y h:i a') . '\', \'' . mysql_real_escape_string($_POST['admin_user']) . '\', \'' . mysql_real_escape_string(ENANO_VERSION) . '\', \'' . mysql_real_escape_string($_SERVER['REMOTE_ADDR']) . '\');', $conn);
+ $q = $db->sql_query('INSERT INTO ' . $_POST['table_prefix'] . 'logs(log_type,action,time_id,date_string,author,page_text,edit_summary) VALUES(\'security\', \'install_enano\', ' . time() . ', \'' . date('d M Y h:i a') . '\', \'' . mysql_real_escape_string($_POST['admin_user']) . '\', \'' . mysql_real_escape_string(ENANO_VERSION) . '\', \'' . mysql_real_escape_string($_SERVER['REMOTE_ADDR']) . '\');', $conn);
if ( !$q )
- err('Error setting up logs: '.mysql_error());
+ err('Error setting up logs: '.$db->get_error());
+
+ if ( !$session->get_permissions('clear_logs') )
+ {
+ echo '
Error: session manager won\'t permit flushing logs, these is a bug.';
+ break;
+ }
- echo 'done!Installation of Enano is complete.
Installation of Enano is complete.
-
@@ -201,6 +205,15 @@
+
+
+
+
+
aes_javascript('loginform', 'pass', 'use_crypt', 'crypt_key', 'crypt_data', 'challenge_data');
diff -r dc8741857bde -r 4d87aad3c4c0 plugins/SpecialUserPrefs.php
--- a/plugins/SpecialUserPrefs.php Thu Jun 28 15:26:40 2007 -0400
+++ b/plugins/SpecialUserPrefs.php Sun Jul 01 14:08:39 2007 -0400
@@ -165,7 +165,9 @@
$result = $session->update_user($session->user_id, false, $old_pass, false, $new_email);
if ( $result != 'success' )
{
- die_friendly('Error updating e-mail address', '
+
';
+ die_friendly('Error updating e-mail address', $message);
}
$email_changed = true;
}
@@ -192,27 +194,30 @@
if ( strlen($newpass) < 6 )
$errors .= '
-
+
+
+
diff -r dc8741857bde -r 4d87aad3c4c0 themes/stpatty/css/shamrock.css
--- a/themes/stpatty/css/shamrock.css Thu Jun 28 15:26:40 2007 -0400
+++ b/themes/stpatty/css/shamrock.css Sun Jul 01 14:08:39 2007 -0400
@@ -223,12 +223,12 @@
* jBox menu system
*/
-div.menu {
+div.menu, div.menu_nojs {
background-color: #93e058;
font-size: 7pt;
border-width: 0;
}
-div.menu a, div.menu div.label {
+div.menu a, div.menu_nojs a, div.menu div.label, div.menu_nojs div.label {
padding: 2.5pt 5px;
margin-right: 3px;
text-decoration: none;
@@ -237,51 +237,51 @@
color: #235000;
border-bottom-width: 0 !important;
}
-div.menu div.label {
+div.menu div.label, div.menu_nojs div.label {
color: #002010;
cursor: default;
}
-div.menu span.sep {
+div.menu span.sep, div.menu_nojs span.sep {
display: block;
float: left;
width: 5px;
}
-div.menu div.multopts {
+div.menu div.multopts, div.menu_nojs div.multopts {
line-height: 17pt;
}
-div.menu div.multopts a, div.menu div.multopts div.label {
+div.menu div.multopts a, div.menu_nojs div.multopts a, div.menu div.multopts div.label, div.menu_nojs div.multopts div.label {
float: none;
display: inline;
}
-div.menu a.liteselected, div.menu a.liteselected:hover, div.menu a:hover {
+div.menu a.liteselected, div.menu_nojs a.liteselected, div.menu a.liteselected:hover, div.menu_nojs a.liteselected:hover, div.menu a:hover, div.menu_nojs a:hover {
color: #235000;
background-color: #A3F068;
}
-div.menu input[type ^="text"], div.menu input[type ^="password"] {
+div.menu input[type ^="text"], div.menu_nojs input[type ^="text"], div.menu input[type ^="password"], div.menu_nojs input[type ^="password"] {
border-width: 0;
font-size: 9pt;
padding: 4px 5px;
max-width: 70px;
background-color: #A3F068;
}
-div.menu input[type ^="text"]:hover, div.menu input[type ^="password"]:hover {
+div.menu input[type ^="text"]:hover, div.menu_nojs input[type ^="text"]:hover, div.menu input[type ^="password"]:hover, div.menu_nojs input[type ^="password"]:hover {
background-color: #AAF870;
}
-div.menu input[type ^="text"]:focus, div.menu input[type ^="password"]:focus {
+div.menu input[type ^="text"]:focus, div.menu_nojs input[type ^="text"]:focus, div.menu input[type ^="password"]:focus, div.menu_nojs input[type ^="password"]:focus {
background-color: #B3FF78;
}
-div.menu input[type ^="button"], div.menu input[type ^="submit"] {
+div.menu input[type ^="button"], div.menu_nojs input[type ^="button"], div.menu input[type ^="submit"], div.menu_nojs input[type ^="submit"] {
border-width: 0;
font-size: 9pt;
padding: 3px 5px;
max-width: 70px;
}
-div.menu a.current, div.menu a.current:hover, div.menu a.selected, div.menu a.selected:hover {
+div.menu a.current, div.menu_nojs a.current, div.menu a.current:hover, div.menu_nojs a.current:hover, div.menu a.selected, div.menu_nojs a.selected, div.menu a.selected:hover, div.menu_nojs a.selected:hover {
color: #000040;
background-color: #f4fff7;
font-weight: bold;
}
-div.menu ul {
+div.menu ul, div.menu_nojs ul {
display: none;
position: absolute;
padding: 0;
@@ -290,10 +290,15 @@
border-width: 0;
min-width: 120px;
}
-div.menu ul li {
+/*
+div.menu_nojs ul {
+ display: block !important;
+}
+*/
+div.menu ul li, div.menu_nojs ul li {
list-style: none;
}
-div.menu ul a {
+div.menu ul a, div.menu_nojs ul a {
float: none;
margin: 0;
}