aboutsummaryrefslogtreecommitdiffstats
path: root/src/extras
diff options
context:
space:
mode:
authornavid <navid@ef72aa8b-4018-0410-8976-d6e080ef94d8>2007-11-22 10:40:27 +0000
committernavid <navid@ef72aa8b-4018-0410-8976-d6e080ef94d8>2007-11-22 10:40:27 +0000
commite2ea89dbbe1b1731ba4eda7fbe40ea315594a1c9 (patch)
treeaffd667e6f91c207a1c497ad895f336f0f386f59 /src/extras
parente60df25b9b22ec1bf78d8d95ca7673d559f13333 (diff)
downloadsos-e2ea89dbbe1b1731ba4eda7fbe40ea315594a1c9.tar.gz
merged navid-dev back into trunk, see spec file for details
git-svn-id: svn+ssh://svn.fedorahosted.org/svn/sos/trunk@457 ef72aa8b-4018-0410-8976-d6e080ef94d8
Diffstat (limited to 'src/extras')
-rwxr-xr-xsrc/extras/htmlog473
-rw-r--r--src/extras/sos-html-logs/lib/__init__.py0
-rw-r--r--src/extras/sos-html-logs/lib/helpers.py41
-rw-r--r--src/extras/sos-html-logs/lib/logs_abstraction.py415
-rw-r--r--src/extras/sos-html-logs/lib/parsers/__init__.py0
-rw-r--r--src/extras/sos-html-logs/lib/parsers/crazyclock_parser.py24
-rw-r--r--src/extras/sos-html-logs/lib/parsers/dmapper_parser.py106
-rw-r--r--src/extras/sos-html-logs/lib/parsers/simple_parser.py29
-rw-r--r--src/extras/sos-html-logs/lib/parsers/simple_parser.rules38
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/BabelFish.js58
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/ajaxcontentmws.js181
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/arrow.gifbin0 -> 88 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/calendarmws.js621
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/calendarmws_lang.js700
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/cornerBL.gifbin0 -> 205 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/cornerBR.gifbin0 -> 208 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/cornerTL.gifbin0 -> 207 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/cornerTR.gifbin0 -> 206 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/edgeB.gifbin0 -> 47 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/edgeL.gifbin0 -> 48 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/edgeR.gifbin0 -> 48 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/edgeT.gifbin0 -> 47 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/exit.gifbin0 -> 866 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/flower.gifbin0 -> 4255 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/iframecontentmws.js53
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/license.html265
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/loading.gifbin0 -> 674 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/objectcontentmws.js16
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/oval.gifbin0 -> 3662 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibCompat.js30
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibConfig.txt641
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws.js666
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_bubble.js199
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_crossframe.js44
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_debug.js120
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_draggable.js85
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_exclusive.js58
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_filter.js184
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_function.js44
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_hide.js81
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_iframe.js93
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_modal.js149
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_overtwo.js129
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_print.js141
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_regCore.js75
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_scroll.js70
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmws_shadow.js113
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/overlibmwslogo.gifbin0 -> 1403 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/print.gifbin0 -> 866 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/pushpin.gifbin0 -> 1854 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/quotation.gifbin0 -> 1080 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/semitrans.gifbin0 -> 757 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/showCalendar.gifbin0 -> 200 bytes
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/sprintf.js133
-rw-r--r--src/extras/sos-html-logs/share/html/overlib/square.gifbin0 -> 2580 bytes
-rwxr-xr-xsrc/extras/sos-html-logs/sos-html-logs670
-rwxr-xr-xsrc/extras/sysreport/functions4
-rwxr-xr-xsrc/extras/sysreport/sysreport.legacy104
58 files changed, 6342 insertions, 511 deletions
diff --git a/src/extras/htmlog b/src/extras/htmlog
deleted file mode 100755
index 87d9e9c1..00000000
--- a/src/extras/htmlog
+++ /dev/null
@@ -1,473 +0,0 @@
-#!/usr/bin/env python
-
-#from optparse import OptionParser, Option
-import time, sys, os, glob
-import getopt, re
-
-#__cmdParser__ = OptionParser()
-#__cmdParser__.add_option("-i", "--input", action="append",
-# dest="logfiles", type="string", metavar = "FILE",
-# help="system log to parse")
-#__cmdParser__.add_option("-v", "--verbose", action="count",
-# dest="verbosity",
-# help="How obnoxious we're being about telling the user what we're doing.")
-#(__cmdLineOpts__, __cmdLineArgs__)=__cmdParser__.parse_args()
-
-class htmlgen_class:
-
- def __init__(self):
- self.html_fname_base = "/tmp/something"
- self.page_num = 0
- self.page_line = 0
- self.page_fp = None
- self.cur_time = None
- self.old_time = None
-
- self.summary_fp = open(self.html_fname_base + ".html", "w")
- self.summary_fp.write("<html><body><ul>")
-
- def new_page(self):
-
- # close previous page
- if self.page_fp:
- self.close_page()
-
- self.page_fp = open( "%s_%d.html" % (self.html_fname_base, self.page_num), "w")
- self.page_num += 1
- self.page_line = 0
-
- self.page_fp.write("""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
- "http://www.w3.org/TR/html4/strict.dtd">
-
-<html>
-<head>
-<title></title>
-<style type="text/css">
-<!--
-
-body {
- font: normal 11px auto "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
- color: #4f6b72;
- background: #E6EAE9;
-}
-
-a {
- color: #c75f3e;
-}
-
-#mytable {
- width: 97%;
- padding: 0;
- margin: 0;
-}
-
-caption {
- padding: 0 0 5px 0;
- width: 97%;
- font: italic 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
- text-align: right;
-}
-
-th {
- font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
- color: #4f6b72;
- letter-spacing: 2px;
- text-transform: uppercase;
- text-align: left;
- padding: 6px 6px 6px 12px;
- background: #a50000 url(images/bg_header.jpg) no-repeat;
- color: white;
-}
-
-th.nobg {
- border-top: 0;
- border-left: 0;
- border-right: 1px solid #C1DAD7;
- background: none;
- color: black;
-}
-
-td {
- border-right: 1px solid #C1DAD7;
- border-bottom: 1px solid #C1DAD7;
- background: #fff;
- padding: 6px 6px 6px 12px;
- color: #4f6b72;
- letter-spacing: -1px;
- white-space:pre-wrap;
- font-family: monospace;
-}
-
-pre {
- white-space: pre-wrap; /* css-3 */
- white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
- white-space: -pre-wrap; /* Opera 4-6 */
- white-space: -o-pre-wrap; /* Opera 7 */
- word-wrap: break-word; /* Internet Explorer 5.5+ */
-}
-
-td.alt {
- background: #ffbaba;
- color: #797268;
-}
-
-th.newday {
- text-align: right;
- padding: 2px;
-}
-
-th.spec {
- border-left: 1px solid #C1DAD7;
- border-right: 1px solid #C1DAD7;
- border-top: 0;
- background: #fff url(images/bullet1.gif) no-repeat;
- font: bold 10px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
- color: #797268;
-}
-
-th.specalt {
- border-left: 1px solid #C1DAD7;
- border-right: 1px solid #C1DAD7;
- border-top: 0;
- background: #cecfce url(images/bullet2.gif) no-repeat;
- font: bold 10px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
- color: #797268;
-}
-
--->
-</style>
-
-</head>
-<body>
-
-<table id="mytable" cellspacing="0" summary="The technical specifications of the Apple PowerMac G5 series">
-<caption>Generated by SOS htmlogger 1.0 on March 16th 2008</caption>
-""")
-
- def new_line(self, new_time, events = []):
- self.old_time = self.cur_time
- self.cur_time = new_time
-
- # close previous line
- if self.page_line > 0:
- self.page_fp.write("</TR>")
-
- if self.page_line == 0 or self.page_line % 200 == 0:
- self.page_fp.write("""<tr><th scope="col" abbr="Date/Time" class="nobg">Time</th><th scope="col" abbr="node-1">node-1</th><th scope="col" abbr="node-2">node-2</th><th scope="col" abbr="node-3">node-3</th></tr>""")
-
- if self.page_line == 0 or self.page_line % 200 == 0 or time.strftime("%b %d", self.old_time) != time.strftime("%b %d", new_time):
- self.page_fp.write("""<tr><th scope="row" class="newday" colspan=4>%s</th></tr>""" % time.strftime("%A, %B %d", new_time))
-
- if self.page_line % 2 == 0: row_class = "spec"
- else: row_class = "specalt"
-
- if len(events) > 0:
- stime = """<a name="row_%d">%s</a>""" % (self.page_line, time.strftime("%H:%M:%S", new_time))
- for event in events:
- self.summary_fp.write('<li><a href="something_%d.html#row_%s">%s</a>' % (self.page_num-1,self.page_line,event) )
- else:
- stime = time.strftime("%H:%M:%S", new_time)
-
- if not self.old_time or self.old_time != new_time:
- self.page_fp.write("""<TR><th scope="row" class="%s">%s</th>""" % (row_class, stime))
- else:
- self.page_fp.write("""<TR><th scope="row" class="%s" style="color: #cacaca">%s</th>""" % (row_class, stime))
-
- self.page_line+=1
-
- def new_tab(self,msg):
- self.page_fp.write(" <TD>" + msg + "</TD>\n")
-
- def close_page(self):
- self.page_fp.write("</table></html>\n")
- self.page_fp.close()
-
- def finish(self):
- self.close_page()
-
-class host_class:
-
- def __init__(self):
- self.logs = []
-
- self.log_idx = 0 # first log
- self.log_ptr = 0 # first char
-
- self.cur_line = None
-
- def add_log(self, logfile):
-# if not logfile == logfile_class:
-# raise "InvalidLogfile"
-
- for inc in range(0,len(self.logs)):
- if logfile.time_end() < self.logs[inc].time_begin():
- self.logs.insert(inc, logfile)
- break
- else:
- self.logs.append(logfile)
-
- def hostname(self):
- try: return self.logs[0].hostname()
- except: return None
-
- def tell(self):
- sumsize = 0
- if self.log_idx > 0:
- for inc in range(0, self.log_idx):
- sumsize += self.logs[inc].size()
- try:
- sumsize += self.fp().tell()
- except TypeError:
- pass
- return sumsize
-
- def size(self):
- sumsize = 0
- for inc in range(0, len(self.logs)):
- sumsize += self.logs[inc].size()
- return sumsize
-
- def eof(self):
- if self.tell() >= self.size():
- return True
- return False
-
- def seek(self, offset, whence = 0):
- if whence == 1: offset = self.tell() + offset
- elif whence == 2: offset = self.size() + offset
-
- sumsize = 0
- for inc in range(0, len(self.logs)):
- if offset <= sumsize + self.logs[inc].size():
- offset -= sumsize
- self.log_idx = inc
- self.log_ptr = offset
- self.logs[inc].seek(offset)
- return True
- sumsize += self.logs[inc].size()
- raise "Off_Boundaries"
-
- def time(self):
- return time.strptime(self.cur_line[0:15], "%b %d %H:%M:%S")
- pos = self.tell()
- try:
- toret = time.strptime(self.readline()[0:15], "%b %d %H:%M:%S")
- except ValueError:
- toret = None
- self.seek(pos)
- return toret
-
- def fp(self):
- return self.logs[self.log_idx]
-
- def backline(self):
- self.seek(-len(self.cur_line), 1)
-
- def readline(self):
- if self.eof():
- return ""
-
- while True:
- toret = self.fp().readline()
- if len(toret) == 0:
- if self.log_idx < len(self.logs):
- self.log_idx += 1
- self.fp().seek(0)
- continue
- else:
- return ""
-
- if self.validate_line(toret) or toret == "":
- self.cur_line = toret
- return toret
- else:
- print "invalid line"
-
- def validate_line(self, line):
- try:
- time.strptime(line[0:15], "%b %d %H:%M:%S")
- except:
- return False
- return True
-
- def cur_msg(self):
- if not hasattr(self,"_regex_cur_msg"):
- self._regex_cur_msg = re.compile(r"""^.* %s (\S+:.*)$""" % self.hostname())
-
- try: return self._regex_cur_msg.findall(self.cur_line)[0]
- except: return self.cur_line
-
-class logfile_class:
-
- def __init__(self,fname):
- self.events = []
- self.fname = fname
- self.fp = open(fname)
-
- def hostname(self):
- pos = self.fp.tell()
- toret = self.fp.readline()[16:].split(" ")[0]
- self.fp.seek(pos)
- return toret
-
- def time_begin(self):
- pos = self.fp.tell()
- self.fp.seek(0)
- toret = time.strptime(self.fp.readline()[0:15], "%b %d %H:%M:%S")
- self.fp.seek(pos)
- return toret
-
- def time_end(self):
- pos = self.fp.tell()
- bs = 1024
- if self.size() < bs: bs = self.size()
- self.fp.seek(-bs, 2)
- line = self.fp.read(bs)
- toret = time.strptime(line[line.rfind("\n", 0, bs - 1) + 1:][0:15], "%b %d %H:%M:%S")
- self.fp.seek(pos)
- return toret
-
- def size(self):
- return os.path.getsize(self.fname)
-
- def eof(self):
- return self.fp.tell() > self.size()
-
- def readline(self):
- return self.fp.readline()
-
- def seek(self,pos):
- self.fp.seek(pos)
-
- def tell(self):
- return self.fp.tell()
-
- def validate_line(self):
- return self.time_current(self.curmessage())
-
- def time_current(self):
- if len(self.curline) == 0: return None
- try:
- return time.strptime(self.curline[0:15], "%b %d %H:%M:%S")
- except ValueError:
- print "could not parse time", self.curline
- return False
-
-def usage():
- print "ciao"
-
-try:
- opts, args = getopt.getopt(sys.argv[1:], "hi:v", ["help", "input="])
-except getopt.GetoptError:
- # print help information and exit:
- usage()
- sys.exit(2)
-
-cmdline = {}
-cmdline["logfiles"] = []
-
-for o, a in opts:
- if o == "-v":
- verbose = True
- if o in ("-h", "--help"):
- usage()
- sys.exit()
- if o in ("-i", "--input"):
- print o,a
- for fname in sys.argv[2:]:
- cmdline["logfiles"].append(fname)
- sys.stderr.write("adding log %s\n" % fname)
-
-hosts = {}
-
-for logname in cmdline["logfiles"]:
- log = logfile_class(logname)
- hostname = log.hostname()
- sys.stderr.write("log %s for host %s\n" % (logname, hostname))
- if not hosts.has_key(hostname):
- hosts[hostname] = host_class()
- hosts[hostname].add_log(log)
-
-sys.stderr.write("finished adding logs\n")
-
-#print '<ul id="toc">'
-#for log in logs:
-# print logs[idx].fname, logs[idx].events
-# for line, msglen, event in log.events:
-# print ' <li><span>%s</span> <a href="#">Link</a><br /></li>' % event
-
-htmlgen = htmlgen_class()
-
-previous_date = None
-
-while True:
- # who is next ?
- lowest_date = None
- for host in hosts:
- if hosts[host].eof():
- continue
-
- hosts[host].readline()
-
- if lowest_date == None or hosts[host].time() < lowest_date:
- lowest_date = hosts[host].time()
-
- if lowest_date == None:
- # all logs are EOF
- break
-
- events = []
- for host in hosts:
- if hosts[host].time() == lowest_date:
-
- if re.match(r'^kernel: Linux version', hosts[host].cur_msg()):
- events.append("%s rebooted" % host)
-
- elif re.match(r'^.*fencing node', hosts[host].cur_msg()):
- events.append(host + " " + hosts[host].cur_msg())
-
- elif re.match(r'.*fence ".*" success', hosts[host].cur_msg()):
- events.append(host + " " + hosts[host].cur_msg())
-
- elif re.match(r'.*fence ".*" failed', hosts[host].cur_msg()):
- events.append(host + " " + hosts[host].cur_msg())
-
- elif re.match(r'.*quorum lost, blocking activity', hosts[host].cur_msg()):
- events.append(host + " " + hosts[host].cur_msg())
-
- elif re.match(r'.*quorum regained, resuming activity', hosts[host].cur_msg()):
- events.append(host + " " + hosts[host].cur_msg())
-
- elif re.match(r'.*segfault at', hosts[host].cur_msg()):
- events.append(host + " " + hosts[host].cur_msg())
-
- elif not hosts[host].eof():
- hosts[host].backline()
-
- if len(events): print time.strftime("%A %B %d %H:%M:%S", lowest_date), events
-
- if htmlgen.page_line == 0 or htmlgen.page_line > 10000:
- print "creating new page #%d" % htmlgen.page_num
- htmlgen.new_page()
-
- htmlgen.new_line(lowest_date, events)
-
- for host in hosts:
- if hosts[host].time() == lowest_date:
- htmlgen.new_tab(hosts[host].cur_msg())
- else:
- htmlgen.new_tab("")
-
-htmlgen.close_page()
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/extras/sos-html-logs/lib/__init__.py b/src/extras/sos-html-logs/lib/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/__init__.py
diff --git a/src/extras/sos-html-logs/lib/helpers.py b/src/extras/sos-html-logs/lib/helpers.py
new file mode 100644
index 00000000..995cf16b
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/helpers.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+
+def ksort(d, func = None):
+ keys = d.keys()
+ keys.sort(func)
+ return keys
+
+class Memoize:
+ """Memoize(fn) - an instance which acts like fn but memoizes its arguments
+ Will only work on functions with non-mutable arguments
+ """
+ def __init__(self, fn):
+ self.fn = fn
+ self.memo = {}
+ def __call__(self, *args):
+ if not self.memo.has_key(args):
+ self.memo[args] = self.fn(*args)
+ return self.memo[args]
+
+class SQL:
+ def __init__(self):
+ self.dbcon = sqlite.connect(":memory:", check_same_thread=False)
+ self.dbcur = self.dbcon.cursor()
+
+ self.dbcon.execute("create table events(date, host, position, message, css_style)")
+
+ def execute(self, query):
+ return self.dbcon.execute(query)
+
+def color_gradient(src, dst, percent):
+ csrc = [ col for col in src ]
+ cdst = [ col for col in dst ]
+ toret = []
+
+ for inc in range(0,3):
+ toret.append(csrc[inc] + ((cdst[inc] - csrc[inc]) * percent / 100))
+
+ return toret
+
+def rgb_to_hex(rgb):
+ return "%X%X%X" % (rgb[0], rgb[1], rgb[2])
diff --git a/src/extras/sos-html-logs/lib/logs_abstraction.py b/src/extras/sos-html-logs/lib/logs_abstraction.py
new file mode 100644
index 00000000..5708c960
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/logs_abstraction.py
@@ -0,0 +1,415 @@
+#!/usr/bin/env python
+
+import os, sys, time, re, pdb
+from threading import Thread, Lock
+from helpers import *
+from operator import itemgetter
+import traceback
+
+class cluster_class:
+
+ def __init__(self):
+ self.hosts = {}
+ self.index = {}
+ self.daemon_log_counter = []
+ self.parsers = []
+
+ def host_names(self):
+ return ksort(self.hosts)
+
+ def register_parser(self, parser_class):
+ self.parsers.append(parser_class)
+
+ def get_parser(self, parser_name):
+ for parser in self.parsers:
+ if parser.__class__.__name__ == parser_name:
+ return parser
+
+ def get_host(self, host):
+ return self.hosts[host]
+
+ def tell(self):
+ toret = {}
+ for host in self.hosts:
+ toret[host] = self.hosts[host].tell()
+ return toret
+
+ def tell_sum(self):
+ toret = 0
+ for host in self.hosts:
+ toret += self.hosts[host].tell()
+ return toret
+
+ def size(self):
+ toret = 0
+ for host in self.hosts:
+ toret += self.hosts[host].size()
+ return toret
+
+ def seek(self, positions):
+ # make sure positions in argument are valid
+ for host in self.hosts:
+ if host not in positions.keys():
+ print "cannot find", positions
+ raise "Invalid_Positions"
+
+ # seek each host to saved position
+ for host in positions:
+ self.hosts[host].seek(positions[host])
+
+ return True
+
+ def seek_beginning(self):
+ for host in self.hosts:
+ self.hosts[host].seek(0)
+
+ return True
+
+ def add_log(self, logname):
+ log = logfile_class(logname)
+ hostname = log.hostname()
+ sys.stderr.write("""adding log "%s" for host %s\n""" % (logname, hostname))
+ if not self.hosts.has_key(hostname):
+ self.hosts[hostname] = host_class()
+ self.hosts[hostname].add_log(log)
+
+ def get_position_by_date(self, goto_date):
+ try:
+ return self.index[goto_date]["position"]
+ except KeyError:
+ # can't find position in cache, calculate on the fly
+ #
+ for cmp_date in ksort(self.index):
+ if goto_date <= cmp_date:
+ return self.index[cmp_date]["position"]
+ return None
+
+ def parse(self, threaded = False):
+
+ if threaded and (not hasattr(self,"parse_t") or self.parse_t == None):
+ self.parse_t = Thread(target=self.parse, name='parse-thread', args = [True] )
+ self.parse_t.start()
+ return self.parse_t
+
+ print "parsing begins"
+
+ daemon_log_counter = {}
+
+ self.seek_beginning()
+
+ for date in self:
+
+ self.index[date.date] = { "position":date.position, "log_counter":{} }
+
+ for host in self.hosts:
+ self.index[date.date]["log_counter"][host]=0
+
+ try:
+ for log in date[host]:
+ self.index[date.date]["log_counter"][host]+=1
+
+ for parser_class in self.parsers:
+ parser_class.parse_line(date, log)
+
+ # count how many logs per daemon
+ try:
+ daemon_log_counter[log.daemon()]+=1
+ except KeyError:
+ daemon_log_counter[log.daemon()]=1
+
+ except "Eof":
+ # no more logs for this host
+ pass
+
+ self.daemon_log_counter = sorted(daemon_log_counter.items(), key=itemgetter(1), reverse=True)
+
+ print "parsing ends."
+
+ def eof(self):
+ for host in self.hosts:
+ if not self.hosts[host].eof():
+# print "All logs are not EOF yet", host
+ return False
+ print "All logs are EOF!"
+ return True
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ if self.eof():
+ raise StopIteration
+
+ return log_date_class(cluster = self)
+
+ def instance(self):
+ toret = cluster_class()
+
+ for host in self.hosts:
+ toret.hosts[host] = host_class()
+
+ for log in self.hosts[host].logs:
+ toret.hosts[host].logs.append(logfile_class(log.fname))
+
+ toret.index = self.index
+ toret.daemon_log_counter = self.daemon_log_counter
+ toret.parsers = self.parsers
+
+ return toret
+
+class log_date_class:
+ def __init__(self, cluster):
+ self.cluster = cluster
+ self.date = None
+ self.hosts = cluster.hosts.keys()
+
+ self.position = cluster.tell()
+
+ newtime = None
+
+ # 1st run, must find out what is the oldest date for each host
+ for host in self.hosts:
+ while True:
+ try:
+ newtime = time.strptime("2007 " + cluster.hosts[host].readline()[0:15], "%Y %b %d %H:%M:%S")
+ except "Eof":
+ break
+ except ValueError:
+ print "parsing error in line", cluster.hosts[host].tell()
+ else:
+ break
+
+ if newtime:
+ if not self.date or newtime < self.date:
+ self.date = newtime
+
+ if not cluster.hosts[host].eof():
+ cluster.hosts[host].backline()
+
+ # this should almost never happen, but just in case.
+ if not self.date:
+ raise "Strange_Eof"
+
+ def __str__(self):
+ return time.strftime("%b %d %H:%M:%S", self.date)
+
+ def __getitem__(self, host):
+ return log_date_host(self.cluster, self.cluster.hosts[host], self.date)
+
+ def __iter__(self):
+ return self
+
+class log_date_host:
+ def __init__(self, cluster, host, date):
+ self.cluster = cluster
+ self.host = host
+ self.date = date
+
+ self.parent_date = date
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ position = self.host.tell()
+
+ self.host.readline()
+
+ try:
+ if time.strptime("2007 " + self.host.cur_line[0:15], "%Y %b %d %H:%M:%S") <= self.date:
+ return log_line_class(self.parent_date, self.host, position, self.host.cur_line)
+ except:
+ return log_line_class(self.parent_date, self.host, position, self.host.cur_line)
+
+ self.host.backline()
+
+ raise StopIteration
+
+class log_line_class:
+ def __init__(self, date, host, position, line):
+ self.host = host
+ self.position = position
+ self.line = line
+ self.parse = Memoize(self.parse_uncached)
+
+ self.parent_date = date
+ self.parent_host = host
+
+ def parse_uncached(self):
+ try:
+ return re.findall(r"""^(... .. ..:..:..) %s ([-_0-9a-zA-Z \.\/\(\)]+)(\[[0-9]+\])?(:)? (.*)$""" % self.hostname(), self.line)[0]
+ except:
+ return [ None, None, None, None, None ]
+
+ def __str__(self):
+ return self.line
+
+ def date(self):
+ try:
+ return time.strptime("2007 " + self.line[0:15], "%Y %b %d %H:%M:%S")
+ except:
+ return False
+
+ def hostname(self):
+ return self.line[16:].split(" ", 1)[0]
+
+ def daemon(self):
+ return self.parse()[1]
+
+ def message(self):
+ return self.parse()[4]
+
+class host_class:
+
+ def __init__(self):
+ self.logs = []
+
+ self.log_idx = 0 # first log
+ self.log_ptr = 0 # first char
+
+ self.cur_line = None
+
+ def __str__(self):
+ return self.hostname()
+
+ def add_log(self, logfile):
+
+ for inc in range(0,len(self.logs)):
+ if logfile.time_end() < self.logs[inc].time_begin():
+ self.logs.insert(inc, logfile)
+ break
+ else:
+ self.logs.append(logfile)
+
+ def hostname(self):
+ return self.logs[0].hostname()
+# try: return self.logs[0].hostname()
+# except: return None
+
+ def tell(self):
+ sumsize = 0
+ if self.log_idx > 0:
+ for inc in range(0, self.log_idx):
+ sumsize += self.logs[inc].size()
+ try:
+ sumsize += self.fp().tell()
+ except TypeError:
+ pass
+ return sumsize
+
+ def size(self):
+ sumsize = 0
+ for inc in range(0, len(self.logs)):
+ sumsize += self.logs[inc].size()
+ return sumsize
+
+ def eof(self):
+ if self.tell() >= self.size():
+ return True
+ return False
+
+ def seek(self, offset, whence = 0):
+ if whence == 1: offset = self.tell() + offset
+ elif whence == 2: offset = self.size() + offset
+
+ sumsize = 0
+ for inc in range(0, len(self.logs)):
+ if offset <= sumsize + self.logs[inc].size():
+ offset -= sumsize
+ self.log_idx = inc
+ self.log_ptr = offset
+ self.logs[inc].seek(offset)
+ return True
+ sumsize += self.logs[inc].size()
+ raise "Off_Boundaries"
+
+ def seek_and_read(self, offset, whence = 0):
+ self.seek(offset, whence)
+ return self.readline()
+
+ def time(self):
+ return time.strptime("2007 " + self.cur_line[0:15], "%Y %b %d %H:%M:%S")
+
+ def fp(self):
+ return self.logs[self.log_idx]
+
+ def backline(self):
+ self.seek(-len(self.cur_line), 1)
+
+ def readline(self):
+ if self.eof():
+ raise "Eof"
+
+ while True:
+ position = self.fp().tell()
+ fromfile = self.fp().fname
+ toret = self.fp().readline()
+ if len(toret) == 0:
+ if self.log_idx < len(self.logs):
+ self.log_idx += 1
+ self.fp().seek(0)
+ continue
+ else:
+ return ""
+
+ if len(toret) > 0 or toret == "":
+ self.cur_line = toret
+ self.cur_file = fromfile
+ self.cur_pos = position
+ return toret
+ else:
+ print "invalid line", toret
+
+class logfile_class:
+
+ def __init__(self,fname):
+ self.fname = fname
+ self.fp = open(fname)
+
+ def hostname(self):
+ pos = self.fp.tell()
+ self.seek(0)
+ toret = self.fp.readline()[16:].split(" ")[0]
+ self.fp.seek(pos)
+ return toret
+
+ def time_begin(self):
+ pos = self.fp.tell()
+ self.fp.seek(0)
+ toret = time.strptime(self.fp.readline()[0:15], "%b %d %H:%M:%S")
+ self.fp.seek(pos)
+ return toret
+
+ def time_end(self):
+ pos = self.fp.tell()
+ bs = 1024
+ if self.size() < bs: bs = self.size()
+ self.fp.seek(-bs, 2)
+ buf = self.fp.read(bs)
+ bufsplit = buf.split("\n")
+ bufsplit.reverse()
+ for line in bufsplit:
+ if len(line) == 0: continue
+ try: toret = time.strptime(line[0:15], "%b %d %H:%M:%S")
+ except ValueError: print "Error in conversion"; continue
+ else: break
+ self.fp.seek(pos)
+ return toret
+
+ def size(self):
+ return os.path.getsize(self.fname)
+
+ def eof(self):
+ return self.fp.tell() > self.size()
+
+ def readline(self):
+ return self.fp.readline()
+
+ def seek(self,pos):
+# if cmdline["verbose"]:
+# print "seeking to position %d for file %s" % (pos, self.fname)
+# traceback.print_stack()
+ self.fp.seek(pos)
+
+ def tell(self):
+ return self.fp.tell()
diff --git a/src/extras/sos-html-logs/lib/parsers/__init__.py b/src/extras/sos-html-logs/lib/parsers/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/parsers/__init__.py
diff --git a/src/extras/sos-html-logs/lib/parsers/crazyclock_parser.py b/src/extras/sos-html-logs/lib/parsers/crazyclock_parser.py
new file mode 100644
index 00000000..3e794a6f
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/parsers/crazyclock_parser.py
@@ -0,0 +1,24 @@
+import time
+import soshtmllogs.parsers_base as parsers_base
+
+class crazyclock_Parser(parsers_base.base_Parser_class):
+
+ def initialize(self):
+ # in this dict, we store the last date for each host
+ self.last_date = {}
+
+ def parse_line(self, date, log):
+
+ if date.date != log.date():
+ self.add_event(log, "Time skew (%d seconds in the past)" % int(time.mktime(date.date) - time.mktime(log.date())), "color:purple; background-color:yellow")
+
+ self.last_date[log.parent_host] = log.date()
+
+ return
+
+ def analyse_line(self, log):
+
+ yield """The following line matched the rule:<BR>"""
+ yield """<DIV STYLE="margin-top: 10px; padding: 10px 10px 10px 10px; margin-bottom: 10px; background-color: white; border: 1px dotted black;">%s</B></DIV>""" % log.line
+
+ yield "The logged time for this message is before the one for the previous message appearing in the log."
diff --git a/src/extras/sos-html-logs/lib/parsers/dmapper_parser.py b/src/extras/sos-html-logs/lib/parsers/dmapper_parser.py
new file mode 100644
index 00000000..279df50e
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/parsers/dmapper_parser.py
@@ -0,0 +1,106 @@
+import re
+import soshtmllogs.parsers_base as parsers_base
+
+class dmapper_Parser(parsers_base.base_Parser_class):
+ default_css = "color:black; background-color:orange; font-size:larger"
+
+ def initialize(self):
+ self.db.execute("create table dmapper(disk PRIMARY KEY, host INTEGER, channel INTEGER, id INTEGER, lun INTEGER)")
+
+ def parse_line(self, date, logline):
+
+ # kernel: sd 1:0:0:49152: Attached scsi disk sdt
+ found = re.findall(r"""^sd (.+):(.+):(.+):(.+): Attached scsi disk (.+)$""", logline.message())
+ if found:
+ # we can learn a little about the layout
+ found = found[0]
+ self.db.execute("""replace into dmapper(disk,host,channel,id,lun) values ("%s",%d,%d,%d,%d)"""
+ % (found[4], int(found[0]), int(found[1]), int(found[2]), int(found[3]))
+ )
+
+ found = re.findall(r"""^Attached scsi disk (.+) at scsi(.+), channel (.+), id (.+), lun (.+)$""", logline.message())
+ if found:
+ # we can learn a little about the layout
+ found = found[0]
+ self.db.execute("""replace into dmapper(disk,host,channel,id,lun) values ("%s",%d,%d,%d,%d)"""
+ % (found[0], int(found[1]), int(found[2]), int(found[3]), int(found[4]))
+ )
+
+ #Nov 7 12:55:38 itrac415 kernel: SCSI error : <2 0 3 0> return code = 0x20000
+ found = re.findall(r"""^SCSI error : <(.+)> return code = (.+)$""", logline.message())
+ if found:
+ found = found[0]
+ scsi_address_split = [ int(sid) for sid in found[0].split(" ") ]
+ results = self.db.execute_and_fetch("select disk from dmapper where host = %d AND channel = %d AND id = %d AND lun = %d" %
+ (scsi_address_split[0], scsi_address_split[1], scsi_address_split[2], scsi_address_split[3])
+ )
+ for row in results: found[0] = row["disk"]
+ self.add_event(logline, "SCSI error on %s - %s" % (found[0], self._get_did_error(found[1])), self.default_css)
+ return
+
+ found = re.findall(r"""^end_request: I/O error, dev (.*), sector .*$""", logline.message())
+ if found:
+ self.add_event(logline, "I/O error on %s" % (found[0]), self.default_css)
+ return
+
+ if logline.daemon() != "multipathd":
+ return
+
+ found = re.findall(r"""(.*): mark as failed$""", logline.message())
+ if found:
+ disk = self._get_disk_from_majmin(found[0])
+ self.add_event(logline, "Multipath path %s (%s) failed" % (found[0], disk), self.default_css)
+ return
+
+ found = re.findall(r"""(.*): reinstated$""", logline.message())
+ if found:
+ disk = self._get_disk_from_majmin(found[0])
+ self.add_event(logline, "Multipath path %s (%s) reinstated" % (found[0], disk), self.default_css)
+ return
+
+ return
+
+ def _get_disk_from_majmin(self, majmin):
+ major, minor = majmin.split(":")
+ major, minor = int(major), int(minor)
+
+ block_majors = [8, 65, 66, 67, 68, 69, 70, 71, 128, 129, 130, 131, 132, 133, 134, 135]
+
+ disk = (block_majors.index(major) * 16) + int(minor / 16)
+ partition = minor % 16
+
+ # 97 = ord('a')
+ # 25 = ord('z') - ord('a')
+
+ rchar = chr(97 + (disk % 25))
+
+ if disk > 25:
+ lchar = chr(97 - 1 + int(disk / 25))
+ rchar = chr(ord(rchar)-1)
+ else:
+ lchar = ""
+
+ return "sd" + lchar + rchar
+
+ def _get_did_error(self, hexerr):
+ # hexherr = 0x20000
+
+ if not hexerr.startswith("0x"):
+ return "Unknown error code (%s)" % hexerr
+
+ err = hexerr[2]
+
+ if err == "0": return "DID_OK (NO error)"
+ if err == "1": return "DID_NO_CONNECT (Couldn\\'t connect before timeout period)"
+ if err == "2": return "DID_BUS_BUSY (BUS stayed busy through time out period)"
+ if err == "3": return "DID_TIME_OUT (TIMED OUT for other reason)"
+ if err == "4": return "DID_BAD_TARGET (BAD target)"
+ if err == "5": return "DID_ABORT (Told to abort for some other reason)"
+ if err == "6": return "DID_PARITY (Parity error)"
+ if err == "7": return "DID_ERROR (Internal error)"
+ if err == "8": return "DID_RESET (Reset by somebody)"
+ if err == "9": return "DID_BAD_INTR (Got an interrupt we weren't expecting)"
+ if err == "a": return "DID_PASSTHROUGH (Force command past mid-layer)"
+ if err == "b": return "DID_SOFT_ERROR (The low level driver just wish a retry)"
+ if err == "c": return "DID_IMM_RETRY (Retry without decrementing retry count)"
+ if err == "d": return "DID_REQUEUE (Requeue command (no immediate retry) also without decrementing the retry count)"
diff --git a/src/extras/sos-html-logs/lib/parsers/simple_parser.py b/src/extras/sos-html-logs/lib/parsers/simple_parser.py
new file mode 100644
index 00000000..9beb10f8
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/parsers/simple_parser.py
@@ -0,0 +1,29 @@
+import ConfigParser, re
+import soshtmllogs.parsers_base as parsers_base
+
+class simple_Parser(parsers_base.base_Parser_class):
+
+ def initialize(self):
+ self.config = ConfigParser.ConfigParser()
+ self.config.readfp(open('/usr/lib/python2.4/site-packages/soshtmllogs/parsers/simple_parser.rules'))
+
+ def parse_line(self, date, log):
+
+ for section in self.config.sections():
+ match = False
+
+ if self.config.has_option(section, "find"):
+ if log.line.find(self.config.get(section, "find")) >= 0:
+ match = True
+ elif self.config.has_option(section, "regex"):
+ if re.match(self.config.get(section, "regex"), log.line):
+ match = True
+
+ if not match:
+ continue
+
+ self.add_event(log, section, "color:green; background-color:yellow; font-size:larger")
+
+ return
+
+ return None
diff --git a/src/extras/sos-html-logs/lib/parsers/simple_parser.rules b/src/extras/sos-html-logs/lib/parsers/simple_parser.rules
new file mode 100644
index 00000000..724fbfa8
--- /dev/null
+++ b/src/extras/sos-html-logs/lib/parsers/simple_parser.rules
@@ -0,0 +1,38 @@
+[Syslog restart (possible system restart)]
+regex = .*syslogd .*: restart.$
+
+[System reboot]
+regex = ^kernel: Linux version
+
+[Fencing node]
+regex = ^.*fencing node
+
+[Fencing node succeeded]
+regex = .*fence ".*" success
+
+[Fencing node failed]
+regex = .*fence ".*
+
+[Quorum lost]
+find = quorum lost, blocking activity
+
+[Quorum regained]
+find = quorum regained, resuming activity
+
+[Segmentation fault]
+find = segfault at
+
+[Inittab reloaded]
+find = Re-reading inittab
+
+[Init line respawning too fast]
+find = respawning too fast: disabled for
+
+[Ext3 file-system error]
+find = EXT3-fs error
+
+[File-system remounted read-only]
+find = Remounting filesystem read-only
+
+[Shutting down]
+find = shutdown: shutting down
diff --git a/src/extras/sos-html-logs/share/html/overlib/BabelFish.js b/src/extras/sos-html-logs/share/html/overlib/BabelFish.js
new file mode 100644
index 00000000..ed45ecfc
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/BabelFish.js
@@ -0,0 +1,58 @@
+/*
+ BabelFish.js - Script for using the AltaVista BabelFish translation service.
+ Adapted by Foteos Macrides for use with the overlibmws code set.
+ See http://www.macridesweb.com/oltest/BabelFish.html for a demonstration.
+ Initial: October 26, 2003 - Last Revised: April 17, 2004
+*/
+OLtrans_en = new Image();
+OLtrans_en.src = "http://babelfish.altavista.com/static/i/af/trans_en.gif"
+OLtrans_en_off = new Image();
+OLtrans_en_off.src = "http://babelfish.altavista.com/static/i/af/trans_en_off.gif"
+
+var OLbfURL = location.href;
+
+if (location.href.indexOf("babelfish.altavista.com") == -1) {
+var BabelFish =
+'<div class="babelfish">'
++'<p align="center"><strong>Note:</strong> This page can be viewed in a different language by '
++'selecting the corresponding flag below.</p>'
++'<p align="center">'
++'<!--script type="text/javascript" src="http://www.altavista.com/r?entr"></script-->'
++'<Map name="translate_eng">'
++'<AREA COORDS="0,1,129,38" SHAPE="rect" target="translate" '
++'title="Go to Babel Fish home page/" '
++'href="http://babelfish.altavista.com">'
++'<AREA COORDS="5,110,32,126" SHAPE="rect" target="translate" '
++'title="Translate English to Chinese." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_zh">'
++'<AREA COORDS="38,110,65,126" SHAPE="rect" target="translate" '
++'title="Translate English to German." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_de">'
++'<AREA COORDS="70,110,95,126" SHAPE="rect" target="translate" '
++'title="Translate English to Japanese." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_ja">'
++'<AREA COORDS="99,110,123,126" SHAPE="rect" target="translate" '
++'title="Translate English to Korean." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_ko">'
++'<AREA COORDS="8,130,31,146" SHAPE="rect" target="translate" '
++'title="Translate English to French." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_fr">'
++'<AREA COORDS="39,130,65,146" SHAPE="rect" target="translate" '
++'title="Translate English to Italian." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_it">'
++'<AREA COORDS="70,130,93,146" SHAPE="rect" target="translate" '
++'title="Translate English to Portuguese." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_pt">'
++'<AREA COORDS="100,130,125,146" SHAPE="rect" target="translate" '
++'title="Translate English to Spanish." '
++'href="http://babelfish.altavista.com/babelfish/tr?doit=done&url='+OLbfURL+'&lp=en_es">'
++'</Map>'
++'<img src="http://babelfish.altavista.com/static/i/af/trans_en.gif" '
++'width="131" height="156" usemap="#translate_eng" border="0"><br></p>'
++'<p align="center">The translations are done via the AltaVista Babel Fish service.</p></div>';
+}else{
+var BabelFish =
+'<div class="babelfish"><p align="center">'
++'<img src="http://babelfish.altavista.com/static/i/af/trans_en_off.gif" '
++'width="131" height="156" border="0"></p></div>';
+}
diff --git a/src/extras/sos-html-logs/share/html/overlib/ajaxcontentmws.js b/src/extras/sos-html-logs/share/html/overlib/ajaxcontentmws.js
new file mode 100644
index 00000000..e041ae71
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/ajaxcontentmws.js
@@ -0,0 +1,181 @@
+/*
+ ajaxcontentmws.js - Foteos Macrides (author and Copyright holder)
+ Initial: June 22, 2006 - Last Revised: March 2, 2007
+ Wrapper function set for getting and using the responseText and / or
+ responseXML from a GET or POST XMLHttpRequest, which can be used to
+ generate dynamic content for overlib or overlib2 calls, or to modify
+ the content of a displayed STICKY popup dynamically.
+
+ For GET Use:
+ onmouseover="return OLgetAJAX(url, command, delay, css);"
+ onmouseout="OLclearAJAX();" (if delay > 0)
+ or:
+ onclick="OLgetAJAX(url, command, 0, css); return false;"
+ or:
+ onload="OLgetAJAX(url, command, 0, css);
+
+ Where:
+ url (required)
+ is a quoted string, or unquoted string variable name or array entry, with
+ the full, relative, or partial URL for a file or a server-side script (php,
+ asp, or cgi, e.g. perl), and may have a query string appended (e.g.,
+ 'http://my.domain.com/scripts/myScript.php?foo=bar&life=grand').
+ And:
+ command (required)
+ is the function reference (unquoted name without parens) of a function to
+ be called when the server's response has been received (it could instead be
+ an inline function, i.e., defined within the 2nd argument, or a quoted string
+ for a function with parens and any args)
+ And:
+ delay (may be omitted unless css is included)
+ is an unquoted number indicating the number of millisecs to wait before
+ initiating an XMLHttpRequest GET request. It should be 0 when using onclick
+ or onload, but may be a modest value such as 300 for onmouseover to avoid
+ any chatter of requests. When used with onmouseover, include:
+ onmouseout="OLclearAJAX();"
+ to clear the request if the user does not hover for at least that long. If
+ the popup is not STICKY, include an nd or nd2 call, e.g.,
+ onmouseout="OLclearAJAX(); nd();"
+ And:
+ css (may be omitted)
+ is a quoted string with the CSS class (e.g. 'ovfl510' for
+ .ovfl510 {width:510px; height:145px; overflow:auto; ...} ) for a div to
+ encase the responseText and set the width, height and scrollbars in the
+ main text area of the popup, or the unquoted number 0 if no encasing div
+ is to be used.
+
+ For POST substitute OLpostAJAX(url, qry, command, delay, css);
+ Where
+ qry (required)
+ is the string to be posted, typically a query string (without a lead ?)
+ and the other arguments are as above.
+
+ See http://www.macridesweb.com/oltest/AJAX.html for more information.
+*/
+
+// Initialize our global variables for this function set.
+var OLhttp=false,OLcommandAJAX=null,OLdelayidAJAX=0,OLclassAJAX='',
+OLresponseAJAX='',OLdebugAJAX=false;
+
+// Create a series of wrapper functions (e.g. OLcmdT#() for ones which
+// use OLhttp.responseText via the OLresponseAJAX global, and OLcmdX#()
+// for ones which use OLhttp.responseXML) whose reference (unquoted name
+// without parens) is the 2nd argument in OLgetAJAX(url,command,delay,css)
+// calls. This one is for the first example in the AJAX.html support
+// document, to use the OLresponseAJAX global as the lead argument for an
+// overlib popup. Put your functions in the head, or in another imported
+// .js file, so that they will not be affected by updates of this .js file.
+//
+function OLcmdExT1() {
+ return overlib(OLresponseAJAX, TEXTPADDING,0, CAPTIONPADDING,4,
+ CAPTION,'Example with AJAX content via <span '
+ +'class="yellow">responseText</span>.&nbsp; Popup scrolls with the window.',
+ WRAP, BORDER,2, STICKY, CLOSECLICK, SCROLL,
+ MIDX,0, RELY,100,
+ STATUS,'Example with AJAX content via responseText of XMLHttpResponse');
+}
+
+// Alert for old browsers which lack XMLHttpRequest support.
+function OLsorryAJAX() {
+ alert('Sorry, AJAX is not supported by your browser.');
+ return false;
+}
+
+// Check 2nd arg for function
+function OLchkFuncAJAX(ar){
+ var t=typeof ar;return (((t=='function'))||((t=='string')&&(/.+\(.*\)/.test(ar))));
+}
+
+// Alert for bad 2nd argument
+function OLnotFuncAJAX(m) {
+ if(over)cClick();
+ alert('The 2nd arg of OL'+m+'AJAX is not a function reference, nor an inline function, '
+ +'nor a quoted string with a function indicated.');
+ return OLclearAJAX();
+}
+
+// Alert for indicating an XMLHttpRequest network error.
+function OLerrorAJAX() {
+ alert('Network error '+OLhttp.status+'. Try again later.');
+ return false;
+}
+
+// Returns a new XMLHttpRequest object, or false for older browsers
+// which did not yet support it. Called as OLhttp=OLnewXMLHttp() via
+// the OLgetAJAX(url,command,delay,css) wrapper function.
+//
+function OLnewXMLHttp() {
+ var f=false,req=f;
+ if(window.XMLHttpRequest)eval(new Array('try{',
+ 'req=new XMLHttpRequest();','}catch(e){','req=f;','}').join('\n'));
+ /*@cc_on @if(@_jscript_version>=5)if(!req)
+ eval(new Array('try{','req=new ActiveXObject("Msxml2.XMLHTTP");',
+ '}catch(e){','try{','req=new ActiveXObject("Microsoft.XMLHTTP");',
+ '}catch(e){','req=f;','}}').join('\n')); @end @*/
+ return req;
+}
+
+// Handle the OLhttp.responseText string from the XMLHttpRequest object.
+function OLdoAJAX() {
+ if(OLhttp.readyState==4){
+ if(OLdebugAJAX)alert(
+ 'OLhttp.status = '+OLhttp.status+'\n'
+ +'OLhttp.statusText = '+OLhttp.statusText+'\n'
+ +'OLhttp.getAllResponseHeaders() = \n'
+ +OLhttp.getAllResponseHeaders()+'\n'
+ +'OLhttp.getResponseHeader("Content-Type") = '
+ +OLhttp.getResponseHeader("Content-Type")+'\n');
+ if(!OLhttp.status||OLhttp.status==200){
+ OLresponseAJAX=OLclassAJAX?'<div class="'+OLclassAJAX+'">':'';
+ OLresponseAJAX += OLhttp.responseText;
+ OLresponseAJAX += OLclassAJAX?'</div>':'';
+ if(OLdebugAJAX)alert('OLresponseAJAX = \n'+OLresponseAJAX);
+ OLclassAJAX=0;
+ return (typeof OLcommandAJAX=='string')?eval(OLcommandAJAX):OLcommandAJAX();
+ }else{
+ OLclassAJAX=0;
+ return OLerrorAJAX();
+ }
+ }
+}
+
+// Actually make the request initiated via OLgetAJAX or OLpostAJAX, or
+// invoke a "permission denied" alert if a cross-domain URL was used.
+function OLsetAJAX(url,qry) {
+ qry=(qry||null);var s='',m=(qry)?'POST':'GET';
+ OLdelayidAJAX=0;eval(new Array('try{','OLhttp.open(m,url,true);',
+ '}catch(e){','s=e','OLhttp=false;','}').join('\n'));if(!OLhttp){
+ alert(s+'\n(Cross-domain access not permitted)');return false;}if(qry)
+ OLhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
+ OLhttp.onreadystatechange=OLdoAJAX;
+ OLhttp.send(qry);
+}
+
+// Clear or abort any delayed OLsetAJAX call or pending request.
+function OLclearAJAX() {
+ if(OLdelayidAJAX){clearTimeout(OLdelayidAJAX);OLdelayidAJAX=0;}
+ if(OLhttp&&!OLdebugAJAX){OLhttp.abort();OLhttp=false;}
+ return false;
+}
+
+// Load a new XMLHttpRequest object into the OLhttp global, load the
+// OLcommandAJAX and OLclassAJAX globals, and initiate a GET request
+// via OLsetAJAX(url) to populate OLhttp.
+function OLgetAJAX(url,command,delay,css) {
+ if(!OLchkFuncAJAX(command))return OLnotFuncAJAX('get');
+ OLclearAJAX();OLhttp=OLnewXMLHttp();if(!OLhttp)return OLsorryAJAX();
+ OLcommandAJAX=command;delay=(delay||0);css=(css||0);OLclassAJAX=css;
+ if(delay)OLdelayidAJAX=setTimeout("OLsetAJAX('"+url+"')",delay);
+ else OLsetAJAX(url);
+}
+
+// Load a new XMLHttpRequest object into the OLhttp global, load the
+// OLcommandAJAX and OLclassAJAX globals, and initiate a POST request
+// via OLsetAJAX(url,qry) to populate OLhttp.
+function OLpostAJAX(url,qry,command,delay,css) {
+ if(!OLchkFuncAJAX(command))return OLnotFuncAJAX('post');
+ OLclearAJAX();OLhttp=OLnewXMLHttp();if(!OLhttp)return OLsorryAJAX();
+ qry=(qry||0);OLcommandAJAX=command;delay=(delay||0);css=(css||0);OLclassAJAX=css;
+ if(delay)OLdelayidAJAX=setTimeout("OLsetAJAX('"+url+"','"+qry+"')",delay);
+ else OLsetAJAX(url,qry);
+}
diff --git a/src/extras/sos-html-logs/share/html/overlib/arrow.gif b/src/extras/sos-html-logs/share/html/overlib/arrow.gif
new file mode 100644
index 00000000..71b08c1b
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/arrow.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/calendarmws.js b/src/extras/sos-html-logs/share/html/overlib/calendarmws.js
new file mode 100644
index 00000000..3e5aabac
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/calendarmws.js
@@ -0,0 +1,621 @@
+/*
+ calendermws.js - Script for generating calender popups and selecting dates for form
+ submissions. See http://www.macridesweb.com/oltest/calendarmws.html for a demonstration.
+ Initial: November 9, 2003 - Last Revised: November 23, 2006
+
+****
+ Original: Kedar R. Bhave (softricks@hotmail.com)
+ Web Site: http://www.softricks.com
+ (uses window popups)
+
+ Modifications and customizations to work with the overLIB v3.50
+ Author: James B. O'Connor (joconnor@nordenterprises.com)
+ Web Site: http://www.nordenterprises.com
+ Developed for use with http://home-owners-assoc.com
+ Note: while overlib works fine with Netscape 4, this function does not work very
+ well, since portions of the "over" div end up under other fields on the form and
+ cannot be seen. If you want to use this with NS4, you'll need to change the
+ positioning in the overlib() call to make sure the "over" div gets positioned
+ away from all other form fields
+ The O'Connor script and many more are available free online at:
+ The JavaScript Source!! http://javascript.internet.com
+
+ Further modifications made by Foteos Macrides (http://www.macridesweb.com/oltest/)
+ and Bill McCormick (wpmccormick@freeshell.org) for overlibmws
+*/
+
+var ggPosX = -1;
+var ggPosY = -1;
+var ggInactive = 0;
+var ggOnChange = null;
+
+var ggWinContent = "";
+
+var weekend = [0,6];
+var weekendColor = "#e0e0e0";
+var fontface = "Verdana";
+var fontsize = 8; // in "pt" units; used with "font-size" style element
+
+var gNow = new Date();
+
+Calendar.Months = ["January", "February", "March", "April", "May", "June",
+"July", "August", "September", "October", "November", "December"];
+
+// Non-Leap year Month days..
+Calendar.DOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+// Leap year Month days..
+Calendar.lDOMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+function Calendar(p_item, p_month, p_year, p_format) {
+ if ((p_month == null) && (p_year == null)) return;
+
+ if (p_month == null) {
+ this.gMonthName = null;
+ this.gMonth = null;
+ this.gYearly = true;
+ } else {
+ this.gMonthName = Calendar.get_month(p_month);
+ this.gMonth = new Number(p_month);
+ this.gYearly = false;
+ }
+
+ this.gYear = p_year;
+ this.gFormat = p_format;
+ this.gBGColor = "white";
+ this.gFGColor = "black";
+ this.gTextColor = "black";
+ this.gHeaderColor = "black";
+ this.gReturnItem = p_item;
+}
+
+Calendar.get_month = Calendar_get_month;
+Calendar.get_daysofmonth = Calendar_get_daysofmonth;
+Calendar.calc_month_year = Calendar_calc_month_year;
+
+function Calendar_get_month(monthNo) {
+ return Calendar.Months[monthNo];
+}
+
+function Calendar_get_daysofmonth(monthNo, p_year) {
+ /*
+ Check for leap year ..
+ 1.Years evenly divisible by four are normally leap years, except for...
+ 2.Years also evenly divisible by 100 are not leap years, except for...
+ 3.Years also evenly divisible by 400 are leap years.
+ */
+ if ((p_year % 4) == 0) {
+ if ((p_year % 100) == 0 && (p_year % 400) != 0)
+ return Calendar.DOMonth[monthNo];
+
+ return Calendar.lDOMonth[monthNo];
+ } else
+ return Calendar.DOMonth[monthNo];
+}
+
+function Calendar_calc_month_year(p_Month, p_Year, incr) {
+ /*
+ Will return an 1-D array with 1st element being the calculated month
+ and second being the calculated year
+ after applying the month increment/decrement as specified by 'incr' parameter.
+ 'incr' will normally have 1/-1 to navigate thru the months.
+ */
+ var ret_arr = new Array();
+
+ if (incr == -1) {
+ // B A C K W A R D
+ if (p_Month == 0) {
+ ret_arr[0] = 11;
+ ret_arr[1] = parseInt(p_Year) - 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) - 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ } else if (incr == 1) {
+ // F O R W A R D
+ if (p_Month == 11) {
+ ret_arr[0] = 0;
+ ret_arr[1] = parseInt(p_Year) + 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) + 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ }
+ return ret_arr;
+}
+
+function Calendar_calc_month_year(p_Month, p_Year, incr) {
+ /*
+ Will return an 1-D array with 1st element being the calculated month
+ and second being the calculated year
+ after applying the month increment/decrement as specified by 'incr' parameter.
+ 'incr' will normally have 1/-1 to navigate thru the months.
+ */
+ var ret_arr = new Array();
+
+ if (incr == -1) {
+ // B A C K W A R D
+ if (p_Month == 0) {
+ ret_arr[0] = 11;
+ ret_arr[1] = parseInt(p_Year) - 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) - 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ } else if (incr == 1) {
+ // F O R W A R D
+ if (p_Month == 11) {
+ ret_arr[0] = 0;
+ ret_arr[1] = parseInt(p_Year) + 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) + 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ }
+ return ret_arr;
+}
+
+// This is for compatibility with Navigator 3, we have to create and discard one object
+// before the prototype object exists.
+new Calendar();
+
+Calendar.prototype.getMonthlyCalendarCode = function() {
+ var vCode = "";
+ var vHeader_Code = "";
+ var vData_Code = "";
+
+ // Begin Table Drawing code here..
+ vCode += ('<div align="center"><table border="1" bgcolor="' + this.gBGColor +
+ "\" style='font-size:" + fontsize + "pt;'>");
+
+ vHeader_Code = this.cal_header();
+ vData_Code = this.cal_data();
+ vCode += (vHeader_Code + vData_Code);
+
+ vCode += '</table></div>';
+
+ return vCode;
+}
+
+Calendar.prototype.show = function() {
+ var vCode = "";
+
+ var vDate = new Date();
+ vDate.setMonth(this.gMonth);
+ vDate.setFullYear(this.gYear);
+ var vNowMonth = gNow.getMonth();
+ var vNowYear = gNow.getFullYear();
+ var yOK=!ggInactive||vNowYear<vDate.getFullYear()?1:0;
+ var mOK=!ggInactive||(yOK||
+ (vNowYear<=vDate.getFullYear()&&vNowMonth<vDate.getMonth()))?1:0;
+
+ // build content into global var ggWinContent
+ ggWinContent += ('<div style="font-family:\'' + fontface + '\';font-weight:bold;'
+ +'font-size:' + fontsize + 'pt;text-align:center;">');
+ ggWinContent += (this.gMonthName + ' ' + this.gYear);
+ ggWinContent += '</div>';
+
+ // Show navigation buttons
+ var prevMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, -1);
+ var prevMM = prevMMYYYY[0];
+ var prevYYYY = prevMMYYYY[1];
+
+ var nextMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, 1);
+ var nextMM = nextMMYYYY[0];
+ var nextYYYY = nextMMYYYY[1];
+
+ ggWinContent += ('<table width="100%" border="1" cellspacing="0" cellpadding="0" '
+ +'bgcolor="#e0e0e0" style="font-size:' + fontsize
+ +'pt;"><tr><td align="center">');
+ ggWinContent += ('['
+ +(yOK?'<a href="javascript:void(0);" '
+ +'title="Go back one year" '
+ +'onmouseover="window.status=\'Go back one year\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="Build(\'' + this.gReturnItem + '\', \'' + this.gMonth + '\', \''
+ +(parseInt(this.gYear)-1) + '\', \'' + this.gFormat + '\');"'
+ +'>':'')
+ +'&lt;&lt;Year'
+ +(yOK?'</a>':'')
+ +']</td><td align="center">');
+ ggWinContent += ('['
+ +(mOK?'<a href="javascript:void(0);" '
+ +'title="Go back one month" '
+ +'onmouseover="window.status=\'Go back one month\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="Build(\'' + this.gReturnItem + '\', \'' + prevMM + '\', \''
+ +prevYYYY + '\', \'' + this.gFormat + '\');"'
+ +'>':'')
+ +'&lt;Mon'
+ +(mOK?'</a>':'')
+ +']</td><td align="center">');
+ ggWinContent += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td align="center">';
+ ggWinContent += ('[<a href="javascript:void(0);" '
+ +'title="Go forward one month" '
+ +'onmouseover="window.status=\'Go forward one month\'; return true;" '
+ +'onmouseput="window.status=\'\'; return true;" '
+ +'onclick="Build(\'' + this.gReturnItem + '\', \'' + nextMM + '\', \''
+ +nextYYYY + '\', \'' + this.gFormat + '\');"'
+ +'>Mon&gt;</a>]</td><td align="center">');
+ ggWinContent += ('[<a href="javascript:void(0);" '
+ +'title="Go forward one year" '
+ +'onmouseover="window.status=\'Go forward one year\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onClick="Build(\'' + this.gReturnItem + '\', \'' + this.gMonth + '\', \''
+ +(parseInt(this.gYear)+1) + '\', \'' + this.gFormat + '\');"'
+ +'>Year&gt;&gt;</a>]</td></tr></table><div style="font-size:3px;">'
+ +'&nbsp;</div>');
+
+ // Get the complete calendar code for the month, and add it to the content var
+ vCode = this.getMonthlyCalendarCode();
+ ggWinContent += vCode;
+}
+
+Calendar.prototype.showY = function() {
+ var vCode = "";
+ var i;
+
+ ggWinContent += ('<div style="font-family:\'' + fontface + '\';font-weight:bold;'
+ +'font-size:' + (fontsize+1) +'pt;text-align:center;">' + this.gYear +'</div>');
+
+ var vDate = new Date();
+ vDate.setDate(1);
+ vDate.setFullYear(this.gYear);
+ var vNowYear = gNow.getFullYear();
+ var yOK=!ggInactive||vNowYear<vDate.getFullYear()?1:0;
+
+ // Show navigation buttons
+ var prevYYYY = parseInt(this.gYear) - 1;
+ var nextYYYY = parseInt(this.gYear) + 1;
+
+ ggWinContent += ('<table width="100%" border="1" cellspacing="0" cellpadding="0" '
+ +'bgcolor="#e0e0e0" style="font-size:' + fontsize + 'pt;"><tr><td '
+ +'align="center">');
+ ggWinContent += ('['
+ +(yOK?'<a href="javascript:void(0);" '
+ +'title="Go back one year" '
+ +'onmouseover="window.status=\'Go back one year\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="Build(\'' + this.gReturnItem + '\', null, \'' + prevYYYY + '\', \''
+ +this.gFormat + '\');">':'')
+ +'&lt;&lt;Year'
+ +(yOK?'<a>':'')
+ +']</td><td align="center">');
+ ggWinContent += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td align="center">';
+ ggWinContent += ('[<a href="javascript:void(0);" '
+ +'title="Go forward one year" '
+ +'onmouseover="window.status=\'Go forward one year\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="Build(\'' + this.gReturnItem + '\', null, \'' + nextYYYY + '\', \''
+ +this.gFormat + '\');">Year&gt;&gt;</a>]</td></tr></table>');
+
+ // Get the complete calendar code for each month.
+ // start a table and first row in the table
+ ggWinContent += ('<table width="100%" border="0" cellspacing="0" cellpadding="2" '
+ +'style="font-size:' + fontsize + 'pt;"><tr>');
+ for (i=0; i<12; i++) {
+ // start the table cell
+ ggWinContent += '<td align="center" valign="top">';
+ this.gMonth = i;
+ this.gMonthName = Calendar.get_month(this.gMonth);
+ vCode = this.getMonthlyCalendarCode();
+ ggWinContent += (this.gMonthName + '/' + this.gYear + '<div '
+ +'style="font-size:2px;">&nbsp;</div>');
+ ggWinContent += vCode;
+ ggWinContent += '</td>';
+ if (i == 3 || i == 7) ggWinContent += '</tr><tr>';
+ }
+ ggWinContent += '</tr></table>';
+}
+
+Calendar.prototype.cal_header = function() {
+ var vCode = '<tr>';
+ vCode += ('<td width="14%" style="font-family:' + fontface + ';color:'
+ +this.gHeaderColor + ';font-weight:bold;">Sun</td>');
+ vCode += ('<td width="14%" style="font-family:' + fontface + ';color:'
+ +this.gHeaderColor + ';font-weight:bold;">Mon</td>');
+ vCode += ('<td width="14%" style="font-family:' + fontface + ';color:'
+ +this.gHeaderColor + ';font-weight:bold;">Tue</td>');
+ vCode += ('<td width="14%" style="font-family:' + fontface + ';color:'
+ +this.gHeaderColor + ';font-weight:bold;">Wed</td>');
+ vCode += ('<td width="14%" style="font-family:' + fontface + ';color:'
+ +this.gHeaderColor + ';font-weight:bold;">Thu</td>');
+ vCode += ('<td width="14%" style="font-family:' + fontface + ';color:'
+ +this.gHeaderColor + ';font-weight:bold;">Fri</td>');
+ vCode += ('<td width="16%" style="font-family:' + fontface + ';color:'
+ +this.gHeaderColor + ';font-weight:bold;">Sat</td>');
+ vCode += '</tr>';
+ return vCode;
+}
+
+Calendar.prototype.cal_data = function() {
+ var vDate = new Date();
+ vDate.setDate(1);
+ vDate.setMonth(this.gMonth);
+ vDate.setFullYear(this.gYear);
+
+ var vNowDay = gNow.getDate();
+ var vNowMonth = gNow.getMonth();
+ var vNowYear = gNow.getFullYear();
+
+ var yOK=!ggInactive||vNowYear<=vDate.getFullYear()?1:0;
+ var mOK=!ggInactive||vNowYear<vDate.getFullYear()||
+ (vNowYear==vDate.getFullYear()&&vNowMonth<=vDate.getMonth())?1:0;
+ var ymOK=yOK&&mOK?1:0;
+ var dOK=!ggInactive||vNowYear<vDate.getFullYear()||vNowMonth<vDate.getMonth()?1:0;
+
+ var vFirstDay=vDate.getDay();
+ var vDay=1;
+ var vLastDay=Calendar.get_daysofmonth(this.gMonth, this.gYear);
+ var vOnLastDay=0;
+ var vCode = '<tr>';
+ var i,j,k,m;
+ var orig = eval("document." + this.gReturnItem + ".value").toString();
+ /*
+ Get day for the 1st of the requested month/year..
+ Place as many blank cells before the 1st day of the month as necessary.
+ */
+ for (i=0; i<vFirstDay; i++) { vCode +=
+ ('<td width="14%"' + this.write_weekend_string(i)
+ +'style="font-family:\'' + fontface + '\';text-align:center;">&nbsp;</td>');
+ }
+
+ // Write rest of the 1st week
+ for (j=vFirstDay; j<7; j++) { vCode +=
+ ('<td width="14%"' + this.write_weekend_string(j) +'style="font-family:\''
+ + fontface + '\';text-align:center;">'
+ +((ymOK)&&(vDay>=vNowDay||dOK)?'<a href="javascript:void(0);" '
+ +'title="set date to ' + this.format_data(vDay) + '" '
+ +'onmouseover="window.status=\'set date to ' + this.format_data(vDay) + '\'; '
+ +'return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="document.' + this.gReturnItem + '.value=\'' + this.format_data(vDay)
+ +'\';ggPosX= -1;ggPosY= -1;' + OLfnRef + 'cClick();'
+ +'if((ggOnChange)&&(document.' + this.gReturnItem + '.value!=\'' + orig
+ +'\'))ggOnChange();">':'')
+ + this.format_day(vDay)
+ +((ymOK)&&(vDay>=vNowDay||dOK)?'</a>':'')
+ +'</td>');
+ vDay += 1;
+ }
+ vCode += '</tr>';
+
+ // Write the rest of the weeks
+ for (k=2; k<7; k++) {
+ vCode += '<tr>';
+ for (j=0; j<7; j++) { vCode +=
+ ('<td width="14%"' + this.write_weekend_string(j)
+ +'style="font-family:\'' + fontface + '\';text-align:center;">'
+ +((ymOK)&&(vDay>=vNowDay||dOK)?'<a '
+ +'href="javascript:void(0);" '
+ +'title="set date to ' + this.format_data(vDay) + '" '
+ +'onmouseover="window.status=\'set date to ' + this.format_data(vDay)
+ +'\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="document.' + this.gReturnItem + '.value=\''
+ + this.format_data(vDay) + '\';ggPosX= -1;ggPosY= -1;'
+ + OLfnRef + 'cClick();'
+ +'if((ggOnChange)&&(document.' + this.gReturnItem + '.value!=\''
+ +orig + '\'))ggOnChange();">':'')
+ + this.format_day(vDay)
+ +((ymOK)&&(vDay>=vNowDay||dOK)?'</a>':'')
+ +'</td>');
+ vDay += 1;
+ if (vDay > vLastDay) {
+ vOnLastDay = 1;
+ break;
+ }
+ }
+ if (j == 6) vCode += '</tr>';
+ if (vOnLastDay == 1) break;
+ }
+
+ // Fill up the rest of last week with proper blanks, so that we get proper square blocks
+ for (m=1; m<(7-j); m++) { vCode +=
+ ('<td width="14%"' + this.write_weekend_string(j+m) + 'style="font-family:\''
+ + fontface + '\';color:gray;text-align:center;">&nbsp;</td>');
+ }
+ return vCode;
+}
+
+Calendar.prototype.format_day = function(vday) {
+ var vNowDay = gNow.getDate();
+ var vNowMonth = gNow.getMonth();
+ var vNowYear = gNow.getFullYear();
+
+ if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == vNowYear)
+ return ('<span style="color:red;font-weight:bold;">' + vday + '</span>');
+ else
+ return (vday);
+}
+
+Calendar.prototype.write_weekend_string = function(vday) {
+ var i;
+
+ // Return special formatting for the weekend day.
+ for (i=0; i<weekend.length; i++) {
+ if (vday == weekend[i])
+ return (' bgcolor="' + weekendColor + '"');
+ }
+
+ return "";
+}
+
+Calendar.prototype.format_data = function(p_day) {
+ var vData;
+ var vMonth = 1 + this.gMonth;
+ vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
+ var vMon = Calendar.get_month(this.gMonth).substr(0,3).toUpperCase();
+ var vFMon = Calendar.get_month(this.gMonth).toUpperCase();
+ var vY4 = new String(this.gYear);
+ var vY2 = new String(this.gYear.substr(2,2));
+ var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;
+
+ switch (this.gFormat) {
+ case "MM\/DD\/YYYY" :
+ vData = vMonth + "\/" + vDD + "\/" + vY4;
+ break;
+ case "MM\/DD\/YY" :
+ vData = vMonth + "\/" + vDD + "\/" + vY2;
+ break;
+ case "MM-DD-YYYY" :
+ vData = vMonth + "-" + vDD + "-" + vY4;
+ break;
+ case "YYYY-MM-DD" :
+ vData = vY4 + "-" + vMonth + "-" + vDD;
+ break;
+ case "MM-DD-YY" :
+ vData = vMonth + "-" + vDD + "-" + vY2;
+ break;
+ case "DD\/MON\/YYYY" :
+ vData = vDD + "\/" + vMon + "\/" + vY4;
+ break;
+ case "DD\/MON\/YY" :
+ vData = vDD + "\/" + vMon + "\/" + vY2;
+ break;
+ case "DD-MON-YYYY" :
+ vData = vDD + "-" + vMon + "-" + vY4;
+ break;
+ case "DD-MON-YY" :
+ vData = vDD + "-" + vMon + "-" + vY2;
+ break;
+ case "DD\/MONTH\/YYYY" :
+ vData = vDD + "\/" + vFMon + "\/" + vY4;
+ break;
+ case "DD\/MONTH\/YY" :
+ vData = vDD + "\/" + vFMon + "\/" + vY2;
+ break;
+ case "DD-MONTH-YYYY" :
+ vData = vDD + "-" + vFMon + "-" + vY4;
+ break;
+ case "DD-MONTH-YY" :
+ vData = vDD + "-" + vFMon + "-" + vY2;
+ break;
+ case "DD\/MM\/YYYY" :
+ vData = vDD + "\/" + vMonth + "\/" + vY4;
+ break;
+ case "DD\/MM\/YY" :
+ vData = vDD + "\/" + vMonth + "\/" + vY2;
+ break;
+ case "DD-MM-YYYY" :
+ vData = vDD + "-" + vMonth + "-" + vY4;
+ break;
+ case "DD-MM-YY" :
+ vData = vDD + "-" + vMonth + "-" + vY2;
+ break;
+ case "DD.MM.YYYY" :
+ vData = vDD + "." + vMonth + "." + vY4;
+ break;
+ case "DD.MM.YY" :
+ vData = vDD + "." + vMonth + "." + vY2;
+ break;
+ default :
+ vData = vMonth + "\/" + vDD + "\/" + vY4;
+ }
+
+ return vData;
+}
+
+function Build(p_item, p_month, p_year, p_format) {
+ var gCal = new Calendar(p_item, p_month, p_year, p_format);
+
+ // Customize your Calendar here..
+ gCal.gBGColor="white";
+ gCal.gLinkColor="black";
+ gCal.gTextColor="black";
+ gCal.gHeaderColor="darkgreen";
+
+ // initialize the content string
+ ggWinContent = "";
+
+ // Check for DRAGGABLE support
+ if (typeof ol_draggable == 'undefined') DRAGGABLE = DONOTHING;
+
+ // Choose appropriate show function
+ if (gCal.gYearly) {
+ // Note: you can set ggPosX and ggPosY as part of the onclick javascript
+ // code before you call the show_yearly_calendar function:
+ // onclick="ggPosX=20;ggPosY=5;show_yearly_calendar(...);"
+ if (OLns6) {
+ if (ggPosX == -1) ggPosX = 20;
+ if (ggPosY == -1) ggPosY = 10;
+ }
+ if (fontsize == 8) fontsize = 6;
+ // generate the calendar
+ gCal.showY();
+ } else {
+ if (fontsize == 6) fontsize = 8;
+ gCal.show();
+ }
+
+ // Clear any previous EXCLUSIVE setting
+ o3_exclusive=0;
+ // If X and Y positions are not specified use MIDX and RELY
+ if (ggPosX == -1 && ggPosY == -1) {
+ overlib(ggWinContent, AUTOSTATUSCAP, STICKY, EXCLUSIVE, DRAGGABLE,
+ CLOSECLICK, TEXTSIZE,'8pt', CAPTIONSIZE,'8pt', CLOSESIZE,'8pt',
+ CAPTION,'Select a date', MIDX,0, RELY,10);
+ // Otherwise use FIXX and FIXY
+ } else {
+ // Make sure popup is on screen
+ var X = ((ggPosX < 10)?0:ggPosX - 10), Y = ((ggPosY < 10)?0:ggPosY - 10);
+ window.scroll(X, Y);
+ // Put up the calendar
+ overlib(ggWinContent, AUTOSTATUSCAP, STICKY, EXCLUSIVE, DRAGGABLE,
+ CLOSECLICK, TEXTSIZE,'8pt', CAPTIONSIZE,'8pt', CLOSESIZE,'8pt',
+ CAPTION,'Select a date', FIXX,ggPosX, FIXY,ggPosY);
+ // Reset the position variables
+ ggPosX = -1; ggPosY = -1;
+ }
+}
+
+function show_calendar() {
+ var p_item // Return Item.
+ var p_month // 0-11 for Jan-Dec; 12 for All Months.
+ var p_year // 4-digit year
+ var p_format // Date format (YYYY-MM-DD, DD/MM/YYYY, ...)
+ fontsize = 8;
+
+ p_item = arguments[0];
+ if (arguments[1] == "" || arguments[1] == null || arguments[1] == '12')
+ p_month = new String(gNow.getMonth());
+ else
+ p_month = arguments[1];
+ if (arguments[2] == "" || arguments[2] == null)
+ p_year = new String(gNow.getFullYear().toString());
+ else
+ p_year = arguments[2];
+ if (arguments[3] == "" || arguments[3] == null)
+ p_format = "YYYY-MM-DD";
+ else
+ p_format = arguments[3];
+
+ if (OLns4) return overlib('Sorry, your browser does not support this feature. '
+ +'Manually enter<br>' + p_format,
+ FGCOLOR,'#ffffcc', TEXTSIZE,2, STICKY, NOCLOSE, OFFSETX,-10, OFFSETY,-10,
+ WIDTH,110, BASE,2);
+
+ Build(p_item, p_month, p_year, p_format);
+}
+
+function show_yearly_calendar() {
+ var p_item // Return Item.
+ var p_year // 4-digit year
+ var p_format // Date format (YYYY-MM-DD, DD/MM/YYYY, ...)
+
+ p_item = arguments[0];
+ if (arguments[1] == "" || arguments[1] == null)
+ p_year = new String(gNow.getFullYear().toString());
+ else
+ p_year = arguments[1];
+ if (arguments[2] == "" || arguments[2] == null)
+ p_format = "YYYY-MM-DD";
+ else
+ p_format = arguments[2];
+
+ if (OLns4) return overlib('Sorry, your browser does not support this feature. '
+ +'Manually enter<br>' + p_format,
+ FGCOLOR,'#ffffcc', TEXTSIZE,2, STICKY, NOCLOSE, OFFSETX,-10, OFFSETY,-10,
+ WIDTH,110, BASE,2);
+
+ Build(p_item, null, p_year, p_format);
+}
diff --git a/src/extras/sos-html-logs/share/html/overlib/calendarmws_lang.js b/src/extras/sos-html-logs/share/html/overlib/calendarmws_lang.js
new file mode 100644
index 00000000..6232e789
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/calendarmws_lang.js
@@ -0,0 +1,700 @@
+/*
+ calendermws_lang.js - Script with multi-language support for generating calender popups
+ and selecting dates for form submissions.
+ See http://www.macridesweb.com/oltest/calendarmws_lang.html for a demonstration.
+ Initial (calendarmws.js): November 9, 2003 - Last Revised: November 23, 2006
+
+****
+ Original: Kedar R. Bhave (softricks@hotmail.com)
+ Web Site: http://www.softricks.com
+ (uses window popups)
+
+ Modifications and customizations to work with the overLIB v3.50
+ Author: James B. O'Connor (joconnor@nordenterprises.com)
+ Web Site: http://www.nordenterprises.com
+ Developed for use with http://home-owners-assoc.com
+ Note: while overlib works fine with Netscape 4, this function does not work very
+ well, since portions of the "over" div end up under other fields on the form and
+ cannot be seen. If you want to use this with NS4, you'll need to change the
+ positioning in the overlib() call to make sure the "over" div gets positioned
+ away from all other form fields
+ The O'Connor script and many more are available free online at:
+ The JavaScript Source!! http://javascript.internet.com
+
+ Further modifications made by Foteos Macrides (http://www.macridesweb.com/oltest/),
+ Bodo Hantschmann (http://www.hantschmann.org) - multi-language support, and
+ Bill McCormick (wpmccormick@freeshell.org) - draggable support, for overlibmws.
+
+ Requires sprintf.js from the overlibmws distribution.
+*/
+
+var ggPosX = -1;
+var ggPosY = -1;
+var ggInactive = 0;
+var ggOnChange = null;
+var ggLang = 'eng';
+
+var ggWinContent = "";
+
+var weekend = [0,6];
+var weekendColor = "#e0e0e0";
+var fontface = "Verdana";
+var fontsize = 8; // in "pt" units; used with "font-size" style element
+
+var calmsg = new Array();
+var datFormat = new Array();
+var CalendarMonths = new Array();
+var CalendarWeekdays = new Array();
+
+/* -----------------------------------------------------------------------------------------
+ Languages (set via the value of the ggLang global)
+
+ 'eng' - English
+ 'ger' - German
+ 'esp' - Spanish
+ 'dut' - Dutch / Netherlands
+
+ for more languages:
+ greetings from babelfish ;-) (Hint: Use always english as base, that gives the best
+ results.
+ ----------------------------------------------------------------------------------------- */
+
+/* -------------------------------
+ English
+ ------------------------------- */
+calmsg["eng"] = new Array;
+calmsg["eng"][0] = "One year backward";
+calmsg["eng"][1] = "One year forward";
+calmsg["eng"][2] = "One month backward";
+calmsg["eng"][3] = "One month forward";
+calmsg["eng"][4] = "Set date";
+calmsg["eng"][5] = "Select date";
+calmsg["eng"][6] = "Your Browser does NOT support this feature. Update asap, please!<br />";
+calmsg["eng"][7] = "Year";
+calmsg["eng"][8] = "Click to close";
+datFormat["eng"] = "MM/DD/YYYY";
+CalendarMonths["eng"] = new Array("January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December");
+CalendarWeekdays["eng"] = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
+
+/* -------------------------------
+ German
+ ------------------------------- */
+calmsg["ger"] = new Array;
+calmsg["ger"][0] = "Ein Jahr zur&uuml;ck";
+calmsg["ger"][1] = "Ein Jahr vorw&auml;rts";
+calmsg["ger"][2] = "Einen Monat zur&uuml;ck";
+calmsg["ger"][3] = "Einen Monat vorw&auml;rts";
+calmsg["ger"][4] = "Datum setzen";
+calmsg["ger"][5] = "Datum w&auml;hlen";
+calmsg["ger"][6] = "Leider unterst&uuml;tzt Ihr Browser dieses Feature nicht. "
+ +"Bitte updaten!<br />";
+calmsg["ger"][7] = "Jahr";
+calmsg["ger"][8] = "Zum schlie&szlig;en klicken";
+datFormat["ger"] = "DD.MM.YYYY";
+CalendarMonths["ger"] = new Array("Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni",
+ "Juli", "August", "September", "Oktober", "November", "Dezember");
+CalendarWeekdays["ger"] = new Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa");
+
+/* -------------------------------
+ Spanish
+ ------------------------------- */
+calmsg["esp"] = new Array;
+calmsg["esp"][0] = "Un año atras";
+calmsg["esp"][1] = "Un año adelante";
+calmsg["esp"][2] = "Un mes atras";
+calmsg["esp"][3] = "Un mes adelante";
+calmsg["esp"][4] = "Fije la fecha";
+calmsg["esp"][5] = "Seleccione la fecha";
+calmsg["esp"][6] = "Su browser no apoya esta característica. ¡Actualización cuanto antes, "
+ +"por favor!<br />";
+calmsg["esp"][7] = "Año";
+calmsg["esp"][8] = "Tecleo a cerrarse";
+datFormat["esp"] = "DD.MM.YYYY";
+CalendarMonths["esp"] = new Array("Enero", "Febrero", "Marcha", "Abril", "Puede", "Junio",
+ "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
+CalendarWeekdays["esp"] = new Array("Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa");
+
+/* -------------------------------
+ Dutch
+ ------------------------------- */
+calmsg["dut"] = new Array;
+calmsg["dut"][0] = "Één jaar achteruit";
+calmsg["dut"][1] = "Één jaar voorwaarts";
+calmsg["dut"][2] = "Één maand achteruit";
+calmsg["dut"][3] = "Één maand voorwaarts";
+calmsg["dut"][4] = "Overname datum";
+calmsg["dut"][5] = "Selecteer datum";
+calmsg["dut"][6] = "Uw Browser steunt deze eigenschap niet. Update zo vlug mogelijk, "
+ +"tevreden!<br />";
+calmsg["dut"][7] = "Jaar";
+calmsg["dut"][8] = "klik aan het sluiten";
+datFormat["dut"] = "DD.MM.YYYY";
+CalendarMonths["dut"] = new Array("Januari", "Februari", "Maart", "April", "Mei", "Juni",
+ "Juli", "Augustus", "September", "Oktober", "November", "December");
+CalendarWeekdays["dut"] = new Array("Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za");
+
+var gNow = new Date();
+
+Calendar.CellWidth = ["14%", "14%", "14%", "14%", "14%", "14%", "16%"];
+
+// Non-Leap year Month days..
+Calendar.DOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+// Leap year Month days..
+Calendar.lDOMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+function Calendar(p_item, p_month, p_year, p_format) {
+ if ((p_month == null) && (p_year == null)) return;
+
+ if (p_month == null) {
+ this.gMonthName = null;
+ this.gMonth = null;
+ this.gYearly = true;
+ } else {
+ this.gMonthName = Calendar.get_month(p_month);
+ this.gMonth = new Number(p_month);
+ this.gYearly = false;
+ }
+
+ this.gYear = p_year;
+ this.gFormat = p_format;
+ this.gBGColor = "white";
+ this.gFGColor = "black";
+ this.gTextColor = "black";
+ this.gHeaderColor = "black";
+ this.gReturnItem = p_item;
+}
+
+Calendar.get_month = Calendar_get_month;
+Calendar.get_daysofmonth = Calendar_get_daysofmonth;
+Calendar.calc_month_year = Calendar_calc_month_year;
+
+function Calendar_get_month(monthNo) {
+ return Calendar.Months[monthNo];
+}
+
+function Calendar_get_daysofmonth(monthNo, p_year) {
+ /*
+ Check for leap year ..
+ 1.Years evenly divisible by four are normally leap years, except for...
+ 2.Years also evenly divisible by 100 are not leap years, except for...
+ 3.Years also evenly divisible by 400 are leap years.
+ */
+ if ((p_year % 4) == 0) {
+ if ((p_year % 100) == 0 && (p_year % 400) != 0)
+ return Calendar.DOMonth[monthNo];
+
+ return Calendar.lDOMonth[monthNo];
+ } else
+ return Calendar.DOMonth[monthNo];
+}
+
+function Calendar_calc_month_year(p_Month, p_Year, incr) {
+ /*
+ Will return an 1-D array with 1st element being the calculated month
+ and second being the calculated year
+ after applying the month increment/decrement as specified by 'incr' parameter.
+ 'incr' will normally have 1/-1 to navigate thru the months.
+ */
+ var ret_arr = new Array();
+
+ if (incr == -1) {
+ // B A C K W A R D
+ if (p_Month == 0) {
+ ret_arr[0] = 11;
+ ret_arr[1] = parseInt(p_Year) - 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) - 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ } else if (incr == 1) {
+ // F O R W A R D
+ if (p_Month == 11) {
+ ret_arr[0] = 0;
+ ret_arr[1] = parseInt(p_Year) + 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) + 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ }
+ return ret_arr;
+}
+
+function Calendar_calc_month_year(p_Month, p_Year, incr) {
+ /*
+ Will return an 1-D array with 1st element being the calculated month
+ and second being the calculated year
+ after applying the month increment/decrement as specified by 'incr' parameter.
+ 'incr' will normally have 1/-1 to navigate thru the months.
+ */
+ var ret_arr = new Array();
+
+ if (incr == -1) {
+ // B A C K W A R D
+ if (p_Month == 0) {
+ ret_arr[0] = 11;
+ ret_arr[1] = parseInt(p_Year) - 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) - 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ } else if (incr == 1) {
+ // F O R W A R D
+ if (p_Month == 11) {
+ ret_arr[0] = 0;
+ ret_arr[1] = parseInt(p_Year) + 1;
+ } else {
+ ret_arr[0] = parseInt(p_Month) + 1;
+ ret_arr[1] = parseInt(p_Year);
+ }
+ }
+ return ret_arr;
+}
+
+// This is for compatibility with Navigator 3, we have to create and discard one object
+// before the prototype object exists.
+new Calendar();
+
+Calendar.prototype.getMonthlyCalendarCode = function() {
+ var vCode = "";
+ var vHeader_Code = "";
+ var vData_Code = "";
+
+ // Begin Table Drawing code here..
+ vCode += ('<div align="center"><table border="1" bgcolor="' + this.gBGColor
+ +'" style="font-size:' + fontsize + 'pt;">');
+
+ vHeader_Code = this.cal_header();
+ vData_Code = this.cal_data();
+ vCode += (vHeader_Code + vData_Code);
+
+ vCode += '</table></div>';
+
+ return vCode;
+}
+
+Calendar.prototype.show = function() {
+ var vCode = "";
+
+ var vDate = new Date();
+ vDate.setMonth(this.gMonth);
+ vDate.setFullYear(this.gYear);
+ var vNowMonth = gNow.getMonth();
+ var vNowYear = gNow.getFullYear();
+ var yOK=!ggInactive||vNowYear<vDate.getFullYear()?1:0;
+ var mOK=!ggInactive||(yOK||
+ (vNowYear<=vDate.getFullYear()&&vNowMonth<vDate.getMonth()))?1:0;
+
+ // build content into global var ggWinContent
+ ggWinContent += sprintf('<div style="font-family:\'%s\';font-weight:bold;'
+ +'font-size:%spt;text-align:center;">%s %s</div>',
+ fontface, fontsize, this.gMonthName, this.gYear);
+
+ // Show navigation buttons
+ var prevMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, -1);
+ var prevMM = prevMMYYYY[0];
+ var prevYYYY = prevMMYYYY[1];
+
+ var nextMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, 1);
+ var nextMM = nextMMYYYY[0];
+ var nextYYYY = nextMMYYYY[1];
+
+ var nav_cell = '<td align="%s">&nbsp;[<a href="javascript:void(0);" title="%s" '
+ +'onmouseover="window.status=\'%s\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="Build(\'%s\',\'%s\',\'%s\',\'%s\');">%s%s%s<\/a>]&nbsp;</td>';
+ var nav_cell_inactive = '<td align="%s">&nbsp;[%s%s]&nbsp;</td>'
+
+ ggWinContent += '<table width="100%" border="0" cellspacing="0" cellpadding="0" '
+ +'bgcolor="#e0e0e0" style="font-size:' + fontsize + 'pt;">';
+ ggWinContent += '<tr>';
+ ggWinContent += yOK?sprintf(nav_cell,
+ 'left', calmsg[ggLang][0], calmsg[ggLang][0],
+ this.gReturnItem, this.gMonth, (parseInt(this.gYear)-1), this.gFormat,
+ '&lt;&lt;', (parseInt(this.gYear)-1), ''):
+ sprintf(nav_cell_inactive, 'left', '&lt;&lt;', (parseInt(this.gYear)-1));
+ ggWinContent += sprintf(nav_cell,
+ 'right', calmsg[ggLang][1], calmsg[ggLang][1],
+ this.gReturnItem, this.gMonth, (parseInt(this.gYear)+1), this.gFormat,
+ '', (parseInt(this.gYear)+1), '&gt;&gt;');
+ ggWinContent += '</tr><tr>';
+ ggWinContent += mOK?sprintf(nav_cell,
+ 'left', calmsg[ggLang][2], calmsg[ggLang][2],
+ this.gReturnItem, prevMM, prevYYYY, this.gFormat, '&lt;',
+ Calendar.Months[prevMM], ''):
+ sprintf(nav_cell_inactive, '&lt;', Calendar.Months[prevMM]);
+ ggWinContent += sprintf(nav_cell,
+ 'right', calmsg[ggLang][3], calmsg[ggLang][3],
+ this.gReturnItem, nextMM, nextYYYY, this.gFormat, '',
+ Calendar.Months[nextMM], '&gt;');
+ ggWinContent += '</tr></table><div style="font-size:3px;">&nbsp;</div>';
+
+ // Get the complete calendar code for the month, and add it to the content var
+ vCode = this.getMonthlyCalendarCode();
+ ggWinContent += vCode;
+}
+
+Calendar.prototype.showY = function() {
+ var vCode = "";
+ var i;
+
+ ggWinContent += sprintf(
+ '<div style="font-family:\'%s\';font-weight:bold;font-size:%spt;'
+ +'text-align:center;">%s</div>', fontface, fontsize+1, this.gYear);
+ // Show navigation buttons
+ var prevYYYY = parseInt(this.gYear) - 1;
+ var nextYYYY = parseInt(this.gYear) + 1;
+
+ var vDate = new Date();
+ vDate.setFullYear(this.gYear);
+ var vCode = "";
+ var vNowYear = gNow.getFullYear();
+ var yOK=!ggInactive||vNowYear<vDate.getFullYear()?1:0;
+
+ ggWinContent += '<table width="100%" ' + sprintf(
+ 'border="1" cellspacing="0" cellpadding="0" bgcolor="%s" '
+ +'style="font-size:%spt;">', '#e0e0e0', fontsize);
+ ggWinContent += '<tr>';
+ ggWinContent += yOK?sprintf(
+ '<td align="center">[<a href="javascript:void(0);" title="%s" '
+ +'onmouseover="window.status=\'%s\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="Build(\'%s\', null, \'%s\', \'%s\');">&lt;&lt;%s</a>]</td>',
+ calmsg[ggLang][0], calmsg[ggLang][0], this.gReturnItem,
+ prevYYYY, this.gFormat, (parseInt(this.gYear)-1)):
+ sprintf('<td align="center">[&lt;&lt;%s]</td>',(parseInt(this.gYear)-1));
+ ggWinContent += '<td align="center">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>';
+ ggWinContent += sprintf(
+ '<td align="center">[<a href="javascript:void(0);" title="%s" '
+ +'onmouseover="window.status=\'%s\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="Build(\'%s\', null, \'%s\', \'%s\');">%s&gt;&gt;</a>]</td>',
+ calmsg[ggLang][1], calmsg[ggLang][1], this.gReturnItem,
+ nextYYYY, this.gFormat, (parseInt(this.gYear)+1));
+ ggWinContent += '</tr></table>';
+
+ // Get the complete calendar code for each month.
+ // start a table and first row in the table
+ ggWinContent += '<table width="100%" border="0" cellspacing="0" cellpadding="2" '
+ +'style="font-size:' + fontsize + 'pt;"><tr>';
+ for (i=0; i<12; i++) {
+ // start the table cell
+ ggWinContent += '<td align="center" valign="top">';
+ this.gMonth = i;
+ this.gMonthName = Calendar.get_month(this.gMonth);
+ vCode = this.getMonthlyCalendarCode();
+ ggWinContent += (this.gMonthName + '/' + this.gYear+ '<div '
+ +'style="font-size:2px;">&nbsp;</div>');
+ ggWinContent += vCode;
+ ggWinContent += '</td>';
+ if (i == 3 || i == 7) ggWinContent += '</tr><tr>';
+ }
+ ggWinContent += '</tr></table>';
+}
+
+Calendar.prototype.cal_header = function() {
+ var vCode = '<tr>';
+ for (i=0; i<7; i++) { vCode += sprintf(
+ '<td width="%s" style="font-family:\'%s\';font-weight:bold;color:%s; '
+ +'text-align:center;">%s</td>',
+ Calendar.CellWidth[i], fontface, this.gHeaderColor, Calendar.Weekdays[i]);
+ }
+ return (vCode + '</tr>');
+}
+
+Calendar.prototype.cal_data = function() {
+ var vDate = new Date();
+ vDate.setDate(1);
+ vDate.setMonth(this.gMonth);
+ vDate.setFullYear(this.gYear);
+
+ var vNowDay = gNow.getDate();
+ var vNowMonth = gNow.getMonth();
+ var vNowYear = gNow.getFullYear();
+
+ var yOK=!ggInactive||vNowYear<=vDate.getFullYear()?1:0;
+ var mOK=!ggInactive||vNowYear<vDate.getFullYear()||
+ (vNowYear==vDate.getFullYear()&&vNowMonth<=vDate.getMonth())?1:0;
+ var ymOK=yOK&&mOK?1:0;
+ var dOK=!ggInactive||vNowYear<vDate.getFullYear()||vNowMonth<vDate.getMonth()?1:0;
+
+ var vFirstDay=vDate.getDay();
+ var vDay=1;
+ var vLastDay=Calendar.get_daysofmonth(this.gMonth, this.gYear);
+ var vOnLastDay=0;
+ var vCode = '<tr>';
+ var i,j,k,m;
+ var orig = eval("document." + this.gReturnItem + ".value").toString();
+ /*
+ Get day for the 1st of the requested month/year..
+ Place as many blank cells before the 1st day of the month as necessary.
+ */
+ for (i=0; i<vFirstDay; i++) { vCode += sprintf(
+ '<td width="%s" %s style="font-family:\'%s\';text-align:center;">&nbsp;</td>',
+ Calendar.CellWidth[0], this.write_weekend_string(i),fontface);
+ }
+ // Write rest of the 1st week
+ for (j=vFirstDay; j<7; j++) { vCode += (ymOK)&&(vDay>=vNowDay||dOK)?sprintf(
+ '<td width="%s" %s style="font-family:\'%s\';text-align:center;"><a '
+ +'href="javascript:void(0);" title="%s: %s" '
+ +'onmouselver="window.status=\'%s: %s\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="document.%s.value=\'%s\';ggPosX= -1;ggPosY= -1;%scClick();'
+ +'if((ggOnChange)&&(document.%s.value!=\'%s\'))ggOnChange();">%s</a></td>',
+ Calendar.CellWidth[j+1], this.write_weekend_string(j), fontface,
+ calmsg[ggLang][4], this.format_data(vDay), calmsg[ggLang][4],
+ this.format_data(vDay), this.gReturnItem, this.format_data(vDay), OLfnRef,
+ this.gReturnItem, orig, this.format_day(vDay)):
+ sprintf('<td width="%s" %s style="font-family:\'%s\';text-align:center;">'
+ +'%s</td>', Calendar.CellWidth[j+1], this.write_weekend_string(j), fontface,
+ this.format_day(vDay));
+ vDay += 1;
+ }
+ vCode += '</tr>';
+
+ // Write the rest of the weeks
+ for (k=2; k<7; k++) {
+ vCode += '<tr>';
+ for (j=0; j<7; j++) { vCode += (ymOK)&&(vDay>=vNowDay||dOK)?sprintf(
+ '<td width="%s" %s style="font-family:\'%s\';text-align:center;"><a '
+ +'href="javascript:void(0);" title="%s: %s" '
+ +'onmouseover="window.status=\'%s: %s\'; return true;" '
+ +'onmouseout="window.status=\'\'; return true;" '
+ +'onclick="document.%s.value=\'%s\';ggPosX= -1;ggPosY= -1;%scClick();if'
+ +'((ggOnChange)&&(document.%s.value!=\'%s\'))ggOnChange();">%s</a></td>',
+ Calendar.CellWidth[j+1], this.write_weekend_string(j), fontface,
+ calmsg[ggLang][4], this.format_data(vDay),calmsg[ggLang][4],
+ this.format_data(vDay), this.gReturnItem, this.format_data(vDay),
+ OLfnRef, this.gReturnItem, orig, this.format_day(vDay)):sprintf(
+ '<td width="%s" %s style="font-family:\'%s\';text-align:center;">'
+ +'%s</td>', Calendar.CellWidth[j+1], this.write_weekend_string(j),
+ fontface, this.format_day(vDay));
+ vDay += 1;
+ if (vDay > vLastDay) {
+ vOnLastDay = 1;
+ break;
+ }
+ }
+ if (j == 6) vCode += '</tr>';
+ if (vOnLastDay == 1) break;
+ }
+
+ // Fill up the rest of last week with proper blanks, so that we get proper square blocks
+ for (m=1; m<(7-j); m++) { vCode += sprintf(
+ '<td width="%s" %s style="font-family:\'%s\';color:gray;text-align:center;"'
+ +'>&nbsp;</td>',
+ Calendar.CellWidth[m+1], this.write_weekend_string(j+m), fontface);
+ }
+ return vCode;
+}
+
+Calendar.prototype.format_day = function(vday) {
+ var vNowDay = gNow.getDate();
+ var vNowMonth = gNow.getMonth();
+ var vNowYear = gNow.getFullYear();
+
+ if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == vNowYear)
+ return ('<span style="color:red;font-weight:bold;">' + vday + '</span>');
+ else
+ return (vday);
+}
+
+Calendar.prototype.write_weekend_string = function(vday) {
+ var i;
+
+ // Return special formatting for the weekend day.
+ for (i=0; i<weekend.length; i++) {
+ if (vday == weekend[i])
+ return (' bgcolor="' + weekendColor + '"');
+ }
+
+ return "";
+}
+
+Calendar.prototype.format_data = function(p_day) {
+ var vData;
+ var vMonth = 1 + this.gMonth;
+ vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
+ var vMon = Calendar.get_month(this.gMonth).substr(0,3).toUpperCase();
+ var vFMon = Calendar.get_month(this.gMonth).toUpperCase();
+ var vY4 = new String(this.gYear);
+ var vY2 = new String(this.gYear.substr(2,2));
+ var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;
+
+ switch (this.gFormat) {
+ case "MM\/DD\/YYYY" :
+ vData = vMonth + "\/" + vDD + "\/" + vY4;
+ break;
+ case "MM\/DD\/YY" :
+ vData = vMonth + "\/" + vDD + "\/" + vY2;
+ break;
+ case "MM-DD-YYYY" :
+ vData = vMonth + "-" + vDD + "-" + vY4;
+ break;
+ case "YYYY-MM-DD" :
+ vData = vY4 + "-" + vMonth + "-" + vDD;
+ break;
+ case "MM-DD-YY" :
+ vData = vMonth + "-" + vDD + "-" + vY2;
+ break;
+ case "DD\/MON\/YYYY" :
+ vData = vDD + "\/" + vMon + "\/" + vY4;
+ break;
+ case "DD\/MON\/YY" :
+ vData = vDD + "\/" + vMon + "\/" + vY2;
+ break;
+ case "DD-MON-YYYY" :
+ vData = vDD + "-" + vMon + "-" + vY4;
+ break;
+ case "DD-MON-YY" :
+ vData = vDD + "-" + vMon + "-" + vY2;
+ break;
+ case "DD\/MONTH\/YYYY" :
+ vData = vDD + "\/" + vFMon + "\/" + vY4;
+ break;
+ case "DD\/MONTH\/YY" :
+ vData = vDD + "\/" + vFMon + "\/" + vY2;
+ break;
+ case "DD-MONTH-YYYY" :
+ vData = vDD + "-" + vFMon + "-" + vY4;
+ break;
+ case "DD-MONTH-YY" :
+ vData = vDD + "-" + vFMon + "-" + vY2;
+ break;
+ case "DD\/MM\/YYYY" :
+ vData = vDD + "\/" + vMonth + "\/" + vY4;
+ break;
+ case "DD\/MM\/YY" :
+ vData = vDD + "\/" + vMonth + "\/" + vY2;
+ break;
+ case "DD-MM-YYYY" :
+ vData = vDD + "-" + vMonth + "-" + vY4;
+ break;
+ case "DD-MM-YY" :
+ vData = vDD + "-" + vMonth + "-" + vY2;
+ break;
+ case "DD.MM.YYYY" :
+ vData = vDD + "." + vMonth + "." + vY4;
+ break;
+ case "DD.MM.YY" :
+ vData = vDD + "." + vMonth + "." + vY2;
+ break;
+ default :
+ vData = vMonth + "\/" + vDD + "\/" + vY4;
+ }
+
+ return vData;
+}
+
+function Build(p_item, p_month, p_year, p_format) {
+ var gCal = new Calendar(p_item, p_month, p_year, p_format);
+
+ // Customize your Calendar here..
+ gCal.gBGColor="white";
+ gCal.gLinkColor="black";
+ gCal.gTextColor="black";
+ gCal.gHeaderColor="darkgreen";
+
+ // initialize the content string
+ ggWinContent = "";
+
+ // Check for DRAGGABLE support
+ if (typeof ol_draggable == 'undefined') DRAGGABLE = DONOTHING;
+
+ // Choose appropriate show function
+ if (gCal.gYearly) {
+ // Note: you can set ggPosX and ggPosY as part of the onclick javascript
+ // code before you call the show_yearly_calendar function:
+ // onclick="ggPosX=20;ggPosY=5;show_yearly_calendar(...);"
+ if (OLns6) {
+ if (ggPosX == -1) ggPosX = 20;
+ if (ggPosY == -1) ggPosY = 10;
+ }
+ if (fontsize == 8) fontsize = 6;
+ // generate the calendar
+ gCal.showY();
+ } else {
+ if (fontsize == 6) fontsize = 8;
+ gCal.show();
+ }
+
+ // Clear any previous EXCLUSIVE setting
+ o3_exclusive=0;
+ // If X and Y positions are not specified use MIDX and RELY
+ if (ggPosX == -1 && ggPosY == -1) {
+ overlib(ggWinContent, AUTOSTATUSCAP, STICKY, EXCLUSIVE, DRAGGABLE,
+ CLOSECLICK, TEXTSIZE,'8pt', CAPTIONSIZE,'8pt', CLOSESIZE,'8pt',
+ CAPTION,calmsg[ggLang][5], CLOSETITLE,calmsg[ggLang][8],CLOSETEXT,
+ '<span style="background:#e0e0e0;color:#000000;text-decoration:none;'
+ +'font-weight:bold;">&nbsp;X&nbsp;</span>', MIDX,0, RELY,10);
+ // Otherwise use FIXX and FIXY
+ } else {
+ // Make sure popup is on screen
+ var X = ((ggPosX < 10)?0:ggPosX - 10), Y = ((ggPosY < 10)?0:ggPosY - 10);
+ window.scroll(X, Y);
+ // Put up the calendar
+ overlib(ggWinContent, AUTOSTATUSCAP, STICKY, EXCLUSIVE, DRAGGABLE,
+ CLOSECLICK, TEXTSIZE,'8pt', CAPTIONSIZE,'8pt', CLOSESIZE,'8pt',
+ CAPTION,calmsg[ggLang][5], CLOSETITLE,calmsg[ggLang][8],CLOSETEXT,
+ '<span style="background:#e0e0e0;color:#000000;text-decoration:none;'
+ +'font-weight:bold;">&nbsp;X&nbsp;</span>', FIXX,ggPosX, FIXY,ggPosY);
+ // Reset the position variables
+ ggPosX = -1; ggPosY = -1;
+ }
+}
+
+function show_calendar() {
+ var p_item // Return Item.
+ var p_month // 0-11 for Jan-Dec; 12 for All Months.
+ var p_year // 4-digit year
+ var p_format // Date format (YYYY-MM-DD, DD/MM/YYYY, ...)
+ fontsize = 8;
+
+ Calendar.Months = CalendarMonths[ggLang];
+ Calendar.Weekdays = CalendarWeekdays[ggLang];
+
+ p_item = arguments[0];
+ if (arguments[1] == "" || arguments[1] == null || arguments[1] == '12')
+ p_month = new String(gNow.getMonth());
+ else
+ p_month = arguments[1];
+ if (arguments[2] == "" || arguments[2] == null)
+ p_year = new String(gNow.getFullYear().toString());
+ else
+ p_year = arguments[2];
+ if (arguments[3] == "" || arguments[3] == null)
+ p_format = datFormat[ggLang];
+ else
+ p_format = arguments[3];
+
+ if (OLns4) return overlib(calmsg[ggLang][6]+p_format,
+ FGCOLOR,'#ffffcc', TEXTSIZE,2, STICKY, NOCLOSE, OFFSETX,-10, OFFSETY,-10,
+ WIDTH,110, BASE,2);
+
+ Build(p_item, p_month, p_year, p_format);
+}
+
+function show_yearly_calendar() {
+ var p_item // Return Item.
+ var p_year // 4-digit year
+ var p_format // Date format (YYYY-MM-DD, DD/MM/YYYY, ...)
+
+ Calendar.Months = CalendarMonths[ggLang];
+ Calendar.Weekdays = CalendarWeekdays[ggLang];
+
+ p_item = arguments[0];
+ if (arguments[1] == "" || arguments[1] == null)
+ p_year = new String(gNow.getFullYear().toString());
+ else
+ p_year = arguments[1];
+ if (arguments[2] == "" || arguments[2] == null)
+ p_format = datFormat[ggLang];
+ else
+ p_format = arguments[2];
+
+ if (OLns4) return overlib(calmsg[ggLang][6]+p_format,
+ FGCOLOR,'#ffffcc', TEXTSIZE,2, STICKY, NOCLOSE, OFFSETX,-10, OFFSETY,-10,
+ WIDTH,110, BASE,2);
+
+ Build(p_item, null, p_year, p_format);
+}
diff --git a/src/extras/sos-html-logs/share/html/overlib/cornerBL.gif b/src/extras/sos-html-logs/share/html/overlib/cornerBL.gif
new file mode 100644
index 00000000..e5af971f
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/cornerBL.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/cornerBR.gif b/src/extras/sos-html-logs/share/html/overlib/cornerBR.gif
new file mode 100644
index 00000000..7f970708
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/cornerBR.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/cornerTL.gif b/src/extras/sos-html-logs/share/html/overlib/cornerTL.gif
new file mode 100644
index 00000000..242b06f7
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/cornerTL.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/cornerTR.gif b/src/extras/sos-html-logs/share/html/overlib/cornerTR.gif
new file mode 100644
index 00000000..9d7cc784
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/cornerTR.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/edgeB.gif b/src/extras/sos-html-logs/share/html/overlib/edgeB.gif
new file mode 100644
index 00000000..cef34c0f
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/edgeB.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/edgeL.gif b/src/extras/sos-html-logs/share/html/overlib/edgeL.gif
new file mode 100644
index 00000000..592c1b1f
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/edgeL.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/edgeR.gif b/src/extras/sos-html-logs/share/html/overlib/edgeR.gif
new file mode 100644
index 00000000..d3d66351
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/edgeR.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/edgeT.gif b/src/extras/sos-html-logs/share/html/overlib/edgeT.gif
new file mode 100644
index 00000000..416a31d0
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/edgeT.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/exit.gif b/src/extras/sos-html-logs/share/html/overlib/exit.gif
new file mode 100644
index 00000000..9f9bc80e
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/exit.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/flower.gif b/src/extras/sos-html-logs/share/html/overlib/flower.gif
new file mode 100644
index 00000000..101275eb
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/flower.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/iframecontentmws.js b/src/extras/sos-html-logs/share/html/overlib/iframecontentmws.js
new file mode 100644
index 00000000..ffcebf38
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/iframecontentmws.js
@@ -0,0 +1,53 @@
+/*
+ iframecontentmws.js - Foteos Macrides (author and copyright holder)
+ Initial: October 10, 2004 - Last Revised: November 11, 2006
+ Scripts for using HTML documents as iframe content in overlibmws popups.
+
+ See http://www.macridesweb.com/oltest/IFRAME.html
+ and http://www.macridesweb.com/oltest/AJAX.html#ajaxex3
+ for more information.
+*/
+
+/*
+ Use as lead argument in overlib or overlb2 calls. Include WRAP and
+ TEXTPADDING,0 in the call to ensure that the width arg is respected (unless
+ the CAPTION plus CLOSETEXT widths add up to more than the width arg, in which
+ case you should increase the width arg). The name arg should be a unique
+ string for each popup with iframe content in the document. The frameborder
+ arg should be 1 (browser default if omitted) or 0. The scrolling arg should
+ be 'auto' (default if omitted), 'yes' or 'no'.
+*/
+function OLiframeContent(src, width, height, name, frameborder, scrolling) {
+ return ('<iframe src="'+src+'" width="'+width+'" height="'+height+'"'
+ +(name!=null?' name="'+name+'" id="'+name+'"':'')
+ +(frameborder!=null?' frameborder="'+frameborder+'"':'')
+ +' scrolling="'+(scrolling!=null?scrolling:'auto')
+ +'"><div>[iframe not supported]</div></iframe>');
+}
+
+/*
+ Swap the src if we are iframe content. The name arg should be the same
+ string as in the OLiframeContent function for the popup. The src arg is
+ a partial, relative, or complete URL for the document to be swapped in.
+*/
+function OLswapIframeSrc(name, src){
+ if(parent==self){
+ alert(src+'\n\n is only for iframe content');
+ return;
+ }
+ var o=parent.OLgetRef(name);
+ if(o)o.src=src;
+ else alert(src+'\n\n is not available');
+}
+
+/*
+ Emulate the Back button if we are iframe content. Use only in documents
+ which are swapped in by using the OLswapIframeSrc function.
+*/
+function OLiframeBack(){
+ if(parent==self){
+ alert('This feature is only for iframe content');
+ return;
+ }
+ history.back();
+}
diff --git a/src/extras/sos-html-logs/share/html/overlib/license.html b/src/extras/sos-html-logs/share/html/overlib/license.html
new file mode 100644
index 00000000..1cf6457a
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/license.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="content-Type" content="text/html; charset=iso-8859-1">
+<meta name="keywords" content="overlib, overlibmws, DHTML popups, DHTML tooltips, DHTML, popup, tooltip, Macrides Web Services, Macrides">
+<meta name="description" content="Open source license for the overlibmws DHTML popup and tooltip software package.">
+<meta name="author" content="Foteos Macrides">
+<title>overLIB - License for the overlibmws package</title>
+
+<script type="text/javascript">
+<!--
+var OLbubbleImageDir='http://www.macridesweb.com/oltest/';
+var OLbubbleImages='flower';
+//-->
+</script>
+
+<script type="text/javascript"
+ src="http://www.macridesweb.com/oltest/overlibmws.js"></script>
+<script type="text/javascript"
+ src="http://www.macridesweb.com/oltest/overlibmws_filter.js"></script>
+<script type="text/javascript"
+ src="http://www.macridesweb.com/oltest/overlibmws_bubble.js"></script>
+<script type="text/javascript"
+ src="http://www.macridesweb.com/oltest/overlibmws_shadow.js"></script>
+
+<script type="text/javascript">
+<!--
+OLpageDefaults(TEXTPADDING,6,CAPTIONPADDING,6,WRAP,
+ FILTER,FILTERSHADOW,1,FILTERSHADOWCOLOR,'#cf33cf',
+ SHADOW,SHADOWCOLOR,'#cf33cf',SHADOWOPACITY,100);
+
+// Preload backgound images.
+rainbowline=new Image();
+rainbowline.src="http://www.macridesweb.com/image/rainbowline.gif"
+rb=new Image();
+rb.src="http://www.macridesweb.com/image/rb.jpg"
+// -->
+</script>
+
+<style type="text/css">
+<!--
+.oltxt14 {font-family:Verdana;font-size:14px;font-weight:bold;color:#330033;}
+a {color:#338855;font-weight:bold;}
+a:hover {color:#FF00FF}
+.txtb12 {font-family:Verdana,Arial,sans-serif;font-size:12px;font-weight:bold;}
+.text14 {font-family:Verdana,Arial,sans-serif;font-size:14px;}
+.text20 {font-family:Verdana,Arial,sans-serif;font-size:20px;font-weight:bold;}
+.text22 {font-family:Verdana,Arial,sans-serif;font-size:22px;font-weight:bold;}
+.myText {font-family:Verdana,Arial,Helvetica,sans-serif;font-size:13px;color:#000000;}
+.snip {font-family:Verdana,Arial,Helvetica;font-size:10px;}
+.purple14 {font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;color:purple;
+ font-weight:bold;}
+.purple22 {font-family:Verdana,Arial,Helvetica,sans-serif;font-size:22px;color:purple;
+ font-weight:bold;font-style:italic;}
+.comic20 {font-family:'Comic Sans MS';font-size:20px;}
+-->
+</style>
+</head>
+
+<body text="#000000" bgcolor="#ddeeff">
+
+<table width="90%" cellpadding="0" cellspacing="0" align="center">
+ <tr>
+ <td align="center" class="text22">
+ Open Source License for the <span class="purple22">overlibmws</span> Package
+ </td>
+ </tr>
+ <tr>
+ <td class="text14">
+ <br>
+ <span class="text20">1. License coverage</span>
+ <br><br>
+ Note that this license only covers the script library (javascript core and plugin modules)
+ and not any supporting material such as the <span class="purple14">overlibmws</span> <a
+ href="http://www.macridesweb.com/oltest/"
+ onmouseover="return overlib('Link to the Download and Test Directory for '
+ +'&lt;span class=\'purple14\'&gt;&lt;i&gt;overlibmws&lt;/i&gt;&lt;/span&gt;',
+ TEXTFONTCLASS,'myText', VAUTO, OFFSETY,20, CENTER, FGCOLOR,'#cceeff');"
+ onmouseout="nd();">website</a> or its online documentation and support files. You may not
+ reproduce the website or its online material without explicit written permission from the
+ author, but can freely incorporate scripts and procedures which are demonstrated in that
+ material into your own HTML or XML documents.
+ <br><br>
+ <span class="text20">2. License (Artistic)</span>
+ <ul>
+ <li>
+ <b>Preamble</b><br>
+ The intent of this document is to state the conditions under which a Package may be
+ copied, such that the Copyright Holder maintains some semblance of artistic control over
+ the development of the package, while giving the users of the package the right to use
+ and distribute the Package in a more-or-less customary fashion, plus the right to make
+ reasonable modifications.
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <b>Definitions:</b><br>
+ "Package" refers to the collection of files distributed by the Copyright Holder, and
+ derivatives of that collection of files created through textual modification.
+ <br><br>
+ "Standard Version" refers to such a Package if it has not been modified, or has been
+ modified in accordance with the wishes of the Copyright Holder.
+ <br><br>
+ "Copyright Holder" is whoever is named in the copyright or copyrights for the package.
+ <br><br>
+ "You" is you, if you're thinking about copying or distributing this Package.
+ <br><br>
+ "Reasonable copying fee" is whatever you can justify on the basis of media cost,
+ duplication charges, time of people involved, and so on. (You will not be required to
+ justify it to the Copyright Holder, but only to the computing community at large as a
+ market that must bear the fee.)
+ <br><br>
+ "Freely Available" means that no fee is charged for the item itself, though there may be
+ fees involved in handling the item. It also means that recipients of the item may
+ redistribute it under the same conditions they received it.
+ </li>
+ </ul>
+ <ol>
+ <li>
+ You may make and give away verbatim copies of the source form of the Standard Version
+ of this Package without restriction, provided that you duplicate all of the original
+ copyright notices and associated disclaimers.
+ </li>
+ <li>
+ You may apply bug fixes, portability fixes and other modifications derived from the
+ Public Domain or from the Copyright Holder. A Package modified in such a way shall still
+ be considered the Standard Version.
+ </li>
+ <li>
+ You may otherwise modify your copy of this Package in any way, provided that you insert
+ a prominent notice in each changed file stating how and when you changed that file, and
+ provided that you do at least ONE of the following:
+ <ol>
+ <li>
+ place your modifications in the Public Domain or otherwise make them Freely Available,
+ such as by posting said modifications to Usenet or an equivalent medium, or placing the
+ modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright
+ Holder to include your modifications in the Standard Version of the Package.
+ </li>
+ <li>
+ use the modified Package only within your corporation or organization.
+ </li>
+ <li>
+ rename any non-standard executables so the names do not conflict with standard
+ executables, which must also be provided, and provide a separate manual page for each
+ non-standard executable that clearly documents how it differs from the Standard Version.
+ </li>
+ <li>
+ make other distribution arrangements with the Copyright Holder.
+ </li>
+ </ol>
+ </li>
+ <li>
+ You may distribute the programs of this Package in object code or executable form,
+ provided that you do at least ONE of the following:
+ <ol>
+ <li>
+ distribute a Standard Version of the executables and library files, together with
+ instructions (in the manual page or equivalent) on where to get the Standard Version.
+ </li>
+ <li>
+ accompany the distribution with the machine-readable source of the Package with your
+ modifications.
+ </li>
+ <li>
+ accompany any non-standard executables with their corresponding Standard Version
+ executables, giving the non-standard executables non-standard names, and clearly
+ documenting the differences in manual pages (or equivalent), together with instructions
+ on where to get the Standard Version.
+ </li>
+ <li>
+ make other distribution arrangements with the Copyright Holder.
+ </li>
+ </ol>
+ </li>
+ <li>
+ You may charge a reasonable copying fee for any distribution of this Package. You may
+ charge any fee you choose for support of this Package. You may not charge a fee for this
+ Package itself. However, you may distribute this Package in aggregate with other (possibly
+ commercial) programs as part of a larger (possibly commercial) software distribution
+ provided that you do not advertise this Package as a product of your own.
+ </li>
+ <li>
+ The scripts and library files supplied as input to or produced as output from the programs
+ of this Package do not automatically fall under the copyright of this Package, but belong
+ to whomever generated them, and may be sold commercially, and may be aggregated with this
+ Package.
+ </li>
+ <li>
+ C or perl subroutines supplied by you and linked into this Package shall not be considered
+ part of this Package.
+ </li>
+ <li>
+ The name of the Copyright Holder may not be used to endorse or promote products derived
+ from this software without specific prior written permission.
+ </li>
+ <li>
+ THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+ WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE.
+ </li>
+ </ol>
+ <br>
+ </td>
+ </tr>
+</table>
+
+<table align="center" cellpadding="0" cellspacing="0" border="0" bgcolor="#ccddff">
+ <tr>
+ <td width="90" align="right" valign="middle" class="myText">
+ <a
+ href="http://www.macridesweb.com/oltest/"
+ onmousemove="if(OLie55)self.status=this.href;"
+ onmouseover="return overlib(
+ 'Popups by &lt;span class=\'purple14\'&gt;&lt;i&gt;overlibmws&lt;/i&gt;&lt;/span&gt;',
+ REF,'logo',REFX,96,REFY,-4,BORDER,3,BASE,3,TEXTPADDING,4,TEXTFONTCLASS,'oltxt14',
+ FGBACKGROUND,'http://www.macridesweb.com/image/rb.jpg',
+ BGBACKGROUND,'http://www.macridesweb.com/image/rainbowline.gif');"
+ onmouseout="nd();"><img
+ name='logo' id="logo"
+ width="88" height="31" hspace="10" vspace="10" align="right" border="0" alt=""
+ src="http://www.macridesweb.com/image/overlibmwslogo.gif"></a><br>
+ </td>
+ <td valign="middle" class="snip">
+ Copyright Foteos Macrides<br>
+ &nbsp;&nbsp;2002-2007.<br>
+ &nbsp;&nbsp;All rights reserved.<br>
+ </td>
+ <td width="72" align="right" valign="middle" class="myText">
+ <a
+ target="_blank"
+ href="https://www.paypal.com/xclick/business=overlibmws%40macridesweb.com&amp;item_name=Donation+for+overlibmws&amp;no_note=1&amp;tax=0&amp;currency_code=USD"
+ onmousemove="if(OLie55)self.status=this.href;"
+ onmouseover="return overlib(
+ 'The &lt;span class=\'purple14\'&gt;&lt;i&gt;overlibmws&lt;/i&gt;&lt;/span&gt; library '
+ +'and its support materials at this site are &lt;br&gt;free to download and use, but '
+ +'voluntary donations via PayPal are&lt;br&gt;appreciated (donations via PayPal are fast, '
+ +'simple, and secure).',TEXTPADDING,8,FGCOLOR,'#bbddff',
+ FGBACKGROUND,'http://www.macridesweb.com/image/rb.jpg',
+ REF,'logo',REFC,'UL',REFP,'LL',REFX,-10,REFY,-10,TEXTFONTCLASS,'txtb12',BORDER,6,BASE,6,
+ BGBACKGROUND,'http://www.macridesweb.com/image/rainbowline.gif');"
+ onmouseout="nd();"><img
+ src="http://www.macridesweb.com/image/PayPalDonate.gif"
+ width="62" height="31" border="0"
+ alt=""></a><br>
+ </td>
+ <td width="110" align="right" valign="middle" class="myText">
+ <a
+ onmousemove="if(OLie55)self.status=this.href;"
+ onmouseover="return overlib('&nbsp;Valid&nbsp;HTML&nbsp;4.01',BUBBLE,
+ TEXTFONTCLASS,'comic20',REF,'w3c',REFC,'UR',REFP,'LR',REFX,73,REFY,2,
+ FILTERSHADOW,1,FILTERSHADOWCOLOR,'#00B000');"
+ onmouseout="nd();"
+ href="http://validator.w3.org/check?uri=http%3A%2F%2Fwww.macridesweb.com%2Foltest%2Flicense.html"><img
+ name="w3c" id="w3c"
+ border="0" height="31" width="88" alt="" hspace="6"
+ src="http://www.macridesweb.com/image/valid-html401.gif"></a><br>
+ </td>
+ </tr>
+</table>
+<br>
+
+</body>
+</html>
diff --git a/src/extras/sos-html-logs/share/html/overlib/loading.gif b/src/extras/sos-html-logs/share/html/overlib/loading.gif
new file mode 100644
index 00000000..5c8f1ef5
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/loading.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/objectcontentmws.js b/src/extras/sos-html-logs/share/html/overlib/objectcontentmws.js
new file mode 100644
index 00000000..94d1e4f3
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/objectcontentmws.js
@@ -0,0 +1,16 @@
+/*
+ objectcontentmws.js - Foteos Macrides
+ Initial: October 10, 2004 - Last Revised: November 22, 2004
+ Simple script for using an HTML file as object content in overlibmws popups.
+ Include WRAP and TEXTPADDING,0 in the overlib call to ensure that the width
+ argument is respected (unless the CAPTION plus CLOSETEXT widths add up to more
+ than the width argument, in which case you should increase the width argument).
+
+ See http://www.macridesweb.com/oltest/overflow.html for demonstrations.
+*/
+
+function OLobjectContent(data, width, height, name) {
+ return ('<object data="'+data+'" width="'+width+'" height="'+height+'"'
+ +(name?' name="'+name+'" id="'+name+'"':'')+' type="text/html">'
+ +'<div>[object not supported]</div></object>');
+}
diff --git a/src/extras/sos-html-logs/share/html/overlib/oval.gif b/src/extras/sos-html-logs/share/html/overlib/oval.gif
new file mode 100644
index 00000000..7e1af22f
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/oval.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibCompat.js b/src/extras/sos-html-logs/share/html/overlib/overlibCompat.js
new file mode 100644
index 00000000..f8fb88d4
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibCompat.js
@@ -0,0 +1,30 @@
+////////////////////////////////////////////////////////////////////////////////////
+// OVERLIB 2 COMPATABILITY FUNCTIONS
+// Include this if you are upgrading from overlib v2.x. Otherwise, forget it.
+////////////////////////////////////////////////////////////////////////////////////
+// Converts old 0=left, 1=right and 2=center into constants.
+function vpos_convert(d){if(d==0){d=LEFT;}else{if(d==1){d=RIGHT;}else{d=CENTER;}}return d;}
+// Simple popup
+function dts(d,text){o3_hpos=vpos_convert(d);overlib(text,o3_hpos,CAPTION,"");}
+// Caption popup
+function dtc(d,text,title){o3_hpos=vpos_convert(d);overlib(text,CAPTION,title,o3_hpos);}
+// Sticky
+function stc(d,text,title){o3_hpos=vpos_convert(d);overlib(text,CAPTION,title,o3_hpos,STICKY);}
+// Simple popup right
+function drs(text){dts(1,text);}
+// Caption popup right
+function drc(text,title){dtc(1,text,title);}
+// Sticky caption right
+function src(text,title){stc(1,text,title);}
+// Simple popup left
+function dls(text){dts(0,text);}
+// Caption popup left
+function dlc(text,title){dtc(0,text,title);}
+// Sticky caption left
+function slc(text,title){stc(0,text,title);}
+// Simple popup center
+function dcs(text){dts(2,text);}
+// Caption popup center
+function dcc(text,title){dtc(2,text,title);}
+// Sticky caption center
+function scc(text,title){stc(2,text,title);}
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibConfig.txt b/src/extras/sos-html-logs/share/html/overlib/overlibConfig.txt
new file mode 100644
index 00000000..d1059303
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibConfig.txt
@@ -0,0 +1,641 @@
+
+Below are described the configuration variables and arrays associated with the
+overlib commands, and their defaults as set in the
+ overlibmws.js
+core module and the
+ overlibmws_bubble.js, overlibmws_crossframe.js, overlibmws_debug.js,
+ overlibmws_draggable.js, overlibmws_exclusive.js, overlib_filter.js,
+ overlibmws_function.js, overlibmws_hide.js, overlibmws_modal.js,
+ overlibmws_overtwo.js, overlibmws_print.js, overlibmws_scroll.js and
+ overlibmws_shadow.js
+plugin modules. The
+ overlibmws_iframe.js and overlib_regCore.js
+plugin modules do not have configuration variables or arrays.
+
+You can change any of the configuration default values for all pages by making
+the modifications in overlibmws.js or the plugin modules, or for individual HTML
+pages by declaring any of these variables with the values you prefer in a SCRIPT
+block or imported js file for those pages.
+
+You instead can change the configuration default values for individual HTML pages by
+calling the OLpageDefaults(arguments) function in a SCRIPT block or imported js file
+with "arguments" consisting of a comma-separated list of uppercase command names and
+their parameters if any, homologously to the arguments for an overlib() call.
+
+The overlibmws_overtwo.js module is used by calling overlib2() and nd2() from within
+an overlib() call that invokes a primary popup, to invoke and close secondary popups.
+Its LABLE2 command and its configuration variable are specific to the secondary popups,
+and are complementary to the core module's LABLEL command and its configuration variable
+for primary popups.
+
+The overlibmws_iframe.js module has no additional commands, and thus no configuration
+variables. It should be imported when a page has system controls (e.g., some form
+elements, flash objects, applets) which obscure overlib popups. It corrects this
+problem for IE v5.5 or higher. For versions of IE lower than v5.5 and for other browsers,
+you can use commands in the overlibmws_hide.js plugin module. See the examples in
+http://www.macridesweb.com/oltest/hide.html and http://www.macridesweb.com/oltest/flash.html
+on how to use those command to hide the system controls when overlib popups are invoked.
+
+The overlibmws_regCore.js module has no overlib() or overlib2() commands, and thus
+no configuration variables. It should be imported in frames which will not themselves
+import the core module and any plugin modules, but instead will use those in another
+frame. See its header for more information. Examples of its use are in
+http://www.macridesweb.com/oltest/testFrame.html
+
+See the overlibmws Command Reference (http://www.macridesweb.com/oltest/commandRef.html)
+for more information about the commands, configuration variables, and plugin modules.
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR CORE MODULE overlibmws.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// FGCOLOR - Main background color (the large area).
+// Usually a bright color (white, yellow etc).
+var ol_fgcolor = "#CCCCFF";
+
+// BGCOLOR - Border color.
+// Usually a dark color (black, brown etc).
+var ol_bgcolor = "#333399";
+
+// CGCOLOR - Caption background color (typically same as border color).
+// Usually a dark color (black, brown etc).
+var ol_cgcolor = "#333399";
+
+// TEXTCOLOR - Text color.
+// Usually a dark color.
+var ol_textcolor = "#000000";
+
+// CAPCOLOR - Color of the caption text.
+// Usually a bright color
+var ol_capcolor = "#FFFFFF";
+
+// CLOSECOLOR - Color of "Close" when using Sticky.
+// Usually a semi-bright color.
+var ol_closecolor = "#9999FF";
+
+// TEXTFONT - Font face for the main text.
+var ol_textfont = "Verdana,Arial,Helvetica";
+
+// CAPTIONFONT - Font face for the caption.
+var ol_captionfont = "Verdana,Arial,Helvetica";
+
+// CLOSEFONT - Font face for the close text.
+var ol_closefont = "Verdana,Arial,Helvetica";
+
+// TEXTSIZE - Font size for the main text.
+var ol_textsize = "1";
+
+// CAPTIONSIZE - Font size for the caption.
+var ol_captionsize = "1";
+
+// CLOSESIZE - Font size for the close text.
+var ol_closesize = "1";
+
+// FGCLASS - Main background class.
+var ol_fgclass = "";
+
+// BGCLASS - Frame background class.
+var ol_bgclass = "";
+
+// CGCLASS - Caption background class.
+var ol_cgclass = "";
+
+// TEXTPADDING - Padding for main text.
+var ol_textpadding = "2";
+
+// TEXTFONTCLASS - Main font class.
+var ol_textfontclass = "";
+
+// CAPTIONPADDING - Padding for caption (including Close text if present).
+var ol_captionpadding = "2";
+
+// CAPTIONFONTCLASS - Caption font class.
+var ol_captionfontclass = "";
+
+// CLOSEFONTCLASS - Close font class.
+var ol_closefontclass = "";
+
+// CLOSECLICK - If the user has to click to close stickies.
+var ol_closeclick = 0;
+
+// CLOSETEXT - Text for the closing sticky popups. Normal is "Close".
+var ol_close = "Close";
+
+// CLOSETITLE - Text to use as value of TITLE attribute for browser-generated TooTips
+// with the "Close" link in captions of stickies when CLOSECLICK is changed to 1;
+var ol_closetitle = "Click to Close";
+
+// Default text for popups
+// Should you forget to pass something to overLIB this will be displayed.
+var ol_text = "Default Text";
+
+// Default caption
+// You should leave this blank or you will have problems making non caps popups.
+var ol_cap = "";
+
+// CAPBELOW - Whether the caption should appear below the main text area. Default is
+// off (0) such that the caption appears above.
+var ol_capbelow=0;
+
+// BACKGROUND - Default background image. Better left empty unless you always want one.
+var ol_background = "";
+
+// WIDTH - Default width of the popups in pixels. 100-300 pixels is typical.
+// This value is simply a suggestion to the browser, which may change the
+// actual width depending on the content.
+var ol_width = "200";
+
+// WRAP - Intended to keep the popup no wider than its content plus normal padding, but
+// to wrap the content if it would exceed the window width, or if it would exceed WRAPMAX
+// when that has been set to a value greater than zero.
+// Overrides the o3_width setting. Default is no wrap (0).
+var ol_wrap = 0;
+
+// WRAPMAX - If set to a value greater than 0, sets the maximum width of the popup, up to
+// the window width, before wrapping occurs when the WRAP command is set.
+var ol_wrapmax = 0;
+
+// HEIGHT - Default height for popup. Often best left alone.
+var ol_height = -1;
+
+// BORDER - How thick the ol_border should be in pixels.
+// 1-3 pixels is typical.
+var ol_border = "1";
+
+// BASE - Any additional thickening of the border's base in pixels.
+var ol_base = "0";
+
+// OFFSETX - How many pixels to the right (positive values) or left (negative values)
+// of the cursor to show the popup. Values between 3 and 12 are best.
+var ol_offsetx = 10;
+
+// OFFSETY - How many pixels below (positive values) or above (negative values) the
+// cursor to show the popup. Values between 3 and 20 are best.
+var ol_offsety = 10;
+
+// STICKY - Decides if sticky popups are default. 0 for non, 1 for stickies.
+var ol_sticky = 0;
+
+// NOFOLLOW - Should non-sticky popups not follow cursor movements (i.e., remain
+// stationary where initially positioned on invocation, like title-based tooltips).
+var ol_nofollow = 0;
+
+// NOCLOSE - Omit Close text in stickies with captions, for all stickies use mouse off
+// after mouse over sticky to close, and cancel any timeout while over sticky.
+var ol_noclose = 0;
+
+// MOUSEOFF - For stickies which do have a caption with a CLOSETEXT, also use mouse off
+// after mouse over sticky to close, and cancel any timeout while over sticky.
+var ol_mouseoff = 0;
+
+// OFFDELAY - Default delay for closing NOCLOSE or MOUSEOFF popups. If a mouse over the
+// sticky occurs during this delay, the close is cancelled.
+var ol_delay = 300;
+
+// RIGHT - Default vertical alignment for popups.
+// It's best to leave RIGHT here. Other options are LEFT and CENTER.
+var ol_hpos = RIGHT;
+
+// BELOW - Default vertical position of the popups.
+// It's best to leave BELOW here. Other options are ABOVE and VCENTER.
+var ol_vpos = BELOW;
+
+// Default status bar text when a popup is invoked.
+var ol_status = "";
+
+// AUTOSTATUS, AUTOSTATUSCAP - If the status bar automatically should load either
+// text or caption. 0=nothing, 1=text, 2=caption
+var ol_autostatus = 0;
+
+// SNAPX - Horizontal grid spacing that popups will snap to.
+// 0 makes no grid, anything else will cause a snap to that grid spacing.
+var ol_snapx = 0;
+
+// SNAPY - Vertical grid spacing that popups will snap to.
+// 0 makes no grid, anything else will cause a snap to that grid spacing.
+var ol_snapy = 0;
+
+// FIXX - Sets the popup horizontal position to a fixed column.
+// Numbers greater than -1 will cause fixed position.
+var ol_fixx = -1;
+
+// FIXY - Sets the popup vertical position to a fixed row.
+// Numbers greater than -1 will cause fixed position.
+var ol_fixy = -1;
+
+// RELX - Sets the popup horizontal position to a column relative to the window display.
+// Anything numeric (non-null) will cause relative position. Positive and 0 is to
+// the right from left window margin for left margin of popup. Negative is to the
+// left from right window margin for right margin of popup.
+var ol_relx = null;
+
+// RELY - Sets the popup vertical position to a row relative to the window display.
+// Anything numeric (non-null) will cause relative position. Positive and 0 is down
+// from top window margin for top margin of popup. Negaive is up from bottom window
+// margin for bottom margin of popup.
+var ol_rely = null;
+
+// MIDX - Sets the popup horizontal midpoint to a column relative to the window horizontal
+// midpoint. Anything numeric (non-null) will cause midpoint position. Positive and
+// 0 is to the right from the window midpoint. Negative is to the left.
+var ol_midx = null;
+
+// MIDY - Sets the popup vertical midpoint to a row relative to the window vertical midpoint.
+// Anything numeric (non-null) will cause midpoint position. Positive and 0 is down from
+// the window midpoint. Negative is up.
+var ol_midy = null;
+
+// REF - The NAME of an anchor or image, or ID of a layer, to serve as a reference object such
+// that a corner of the popup will be positioned relative to a corner of the object.
+var ol_ref = "";
+
+// REFC - Corner of the reference object for positioning.
+// Value can be: 'UL' (Upper Left), 'UR', 'LR', or 'LL'.
+var ol_refc = 'UL';
+
+// REFP - Corner of the popup for positioning.
+// Value can be: 'UL' (Upper Left), 'UR', 'LR', or 'LL'.
+var ol_refp = 'UL';
+
+// REFX - X displacement from the reference point. Positive to the right,
+// negative left.
+var ol_refx = 0;
+
+// REFY - Y displacement from the reference point. Positive down, negative up.
+var ol_refy = 0;
+
+// FGBACKGROUND - Background image for the popup's inside.
+var ol_fgbackground = "";
+
+// BGBACKGROUND - Background image for the popup's frame (border).
+var ol_bgbackground = "";
+
+// CGBACKGROUND - Background image for the caption.
+var ol_cgbackground = "";
+
+// PADX
+// How much horizontal left padding text should get by default when BACKGROUND is used.
+var ol_padxl = 1;
+// How much horizontal right padding text should get by default when BACKGROUND is used.
+var ol_padxr = 1;
+
+// PADY
+// How much vertical top padding text should get by default when BACKGROUND is used.
+var ol_padyt = 1;
+// How much vertical bottom padding text should get by default when BACKGROUND is used.
+var ol_padyb = 1;
+
+// FULLHTML - If the user by default must supply all html for complete control of popup content.
+// Set to 1 to activate, 0 otherwise.
+var ol_fullhtml = 0;
+
+// CAPICON - Default icon to place next to the popups caption.
+var ol_capicon = "";
+
+// FRAME - Default frame. We default to current frame if there is no frame defined.
+var ol_frame = self;
+
+// TIMEOUT - Default timeout. By default there is no timeout.
+var ol_timeout = 0;
+
+// DELAY - Default delay for onset of popup. By default there is no delay.
+var ol_delay = 0;
+
+// HAUTO - If overLIB should decide the horizontal placement.
+var ol_hauto = 0;
+
+// VAUTO - If overLIB should decide the vertical placement.
+var ol_vauto = 0;
+
+// NOJUSTX - If overLIB should let popups overrun the left or right window margins.
+var ol_nojustx = 0;
+
+// NOJUSTY - If overLIB should let popups overrun the top or bottom window margins.
+var ol_nojusty = 0;
+
+// LABEL - A labeling string for the primary popup while it is displayed (visible).
+var ol_label = "";
+
+// DECODE - If overLIB should automatically decode any URL-encoded characters in
+// lead argument and/or caption.
+var ol_decode = "";
+
+////////////////////////////////////////////////////////////////////////////////////
+// ARRAY CONFIGURATION FOR CORE MODULE overlibmws.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// INARRAY - Array with texts.
+var ol_texts = new Array(
+ "Text 0",
+ "Text 1");
+
+// CAPARRAY - Array with captions.
+var ol_caps = new Array(
+ "Caption 0",
+ "Caption 1");
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_bubble.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// BUBBLE - Whether to use a bubble type popup. Default is no (0).
+var ol_bubble = 0;
+
+// BUBBLETYPE - Type of bubble image to use. Default is 'flower'. Other options are
+// 'oval', 'square', 'pushpin', 'quotation', or 'roundedcorners'. Specify directory
+// for images via the last parameter of registerImages() near the top of the plugin
+// module (default value is './').
+var ol_bubbletype = 'flower';
+
+// ADJBUBBLE - Whether to resize the image in relation to the content.
+// Default is no (0).
+var ol_adjbubble = 0;
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_bubble.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_crossframe.js
+////////////////////////////////////////////////////////////////////////////////////
+
+You must import this plugin module to use the FRAME command, but its configuration
+variable, ol_frame, is set in the core module.
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_crossframe.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_debug.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// ALLOWDEBUG - The ID or a comma-separated list of IDs for debug layers which, if
+// invoked following an overlib call and then made hidden via the close link at
+// upper right, should be made visible again whenever that overlib call occurs.
+var ol_allowdebug = "";
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_debug.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_draggable.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// DRAGGABLE - If sticky should be draggable.
+var ol_draggable = 0;
+
+// DRAGCAP - Restrict dragging handle to the caption.
+var ol_dragcap = 0;
+
+// DRAGID - The id of a container div with a CSS class that uses overflow:auto
+// for a DRAGGABLE popup that doesn't have iframe content and doesn't use DRAGCAP.
+var ol_dragid = '';
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_draggable.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_exclusive.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// EXCLUSIVE - Decides if a sticky primary popup should be exclusive, such that no other
+// primry popup can be invoked and replace it before the sticky is closed by the user or
+// a timeout (secondary popups can still be invoked from within the exclusive primary).
+var ol_exclusive = 0;
+
+// EXCLUSIVESTATUS - Status line string to use for exclusive stickies
+var ol_exclusivestatus = 'Please act on or close the open popup.';
+
+// EXCLUSIVEOVERRIDE = If a displayed exclusive sticky should be overridden by the
+// current overlib call for a popup.
+var ol_exclusiveoverride=0;
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_exclusive.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_filter.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// FILTER - Toggles on the filter feature set for IE v5.5+ browsers. Defualt is off.
+var ol_filter=0;
+
+// FADEIN - Filter type for stylinzed fadein. Value can be 0 - 50 for the 51 types,
+// or 51 (default) for random selections of the type across successive occurrences
+// of the popup.
+var ol_fadein=51;
+
+// FADETIME - Duration of fadein (millisec).
+var ol_fadetime=800;
+
+// FILTEROPACITY - Opacity of entire popup. The higher the number in the range of 1-99,
+// the more more opaque (less transparent) the popup will be. But 0 is handled as
+// equivalent to 100 (no transparency). This feature also is implemented for Mozilla
+// and Netscape v6+ browsers.
+var ol_filteropacity=100;
+
+// FILTERSHADOW - Type of filter-based shadow. Default is off (0).
+// Dropshadow is 1. Shadow (tapers from corners) is 2.
+var ol_filtershadow=0;
+
+// FILTERSHADOWCOLOR - Color of filter-based shadow.
+var ol_filtershadowcolor="#cccccc";
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_filter.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_function.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// FUNCTION - Default javascript function. By default there is none.
+var ol_function = null;
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_function.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_hide.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// HIDESELECTBOXES - Whether to hide any select boxes which overlap the popup
+// while the popup is being displayed.
+var ol_hideselectboxes=0;
+
+// HIDEBYID - An id or comma-separated list of id's to be hidden while the popup
+// is displayed. Is intended for form elements and is ignored for any browsers
+// using HIDESELECTBOXES and for Opera v7+.
+var ol_hidebyid='';
+
+// HIDEBYIDALL - An id or comma=separated list of id's to be hidden while the popup
+// is displayed. Is intended for non-form elements with system controls, e.g.,
+// flash objects and applets.
+var ol_hidebyidall='';
+
+// HIDEBYIDNS4 - An id or comma-separated list of id's for positioned div's to be
+// hidden while the popup is being displayed by Netscape v4.x browsers.
+var ol_hidebyidns4='';
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_hide.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_modal.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// MODAL - Whether to make the popup modal (block access to any other items in the
+// document via a shield until the popup is acted upon and closed).
+var ol_modal = 0;
+
+// MODALCOLOR - The color of the modal shield.
+var ol_modalcolor = '#bbbbbb';
+
+// MODALOPACITY - The opacity of the modal shield.
+var ol_modalopacity = 40;
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_overtwo.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_overtwo.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// LABEL - A labeling string for the secondary popup while it is displayed (visible).
+var ol_label = "";
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_overtwo.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_print.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// PRINT - Whether sticky should include a Print link or button.
+var ol_print = 0;
+
+// PRINTBUTTON - Whether to use button in main text area even if caption area is present.
+var ol_printbutton=0;
+
+// NOAUTOPRINT - Whether to block automatic printing and deletion of temporary printing window.
+var ol_noautoprint=0;
+
+// PRINTCOLOR - Color of "Print" link in caption area of sticky.
+var ol_printcolor="#eeeeff";
+
+// PRINTFONT - Font face for the print text.
+var ol_printfont="Verdana,Arial,Helvetica";
+
+// PRINTSIZE - Font size for the print text.
+var ol_printsize=1;
+
+// PRINTTEXT - Text for the sticky popup print link. Normal is "Print".
+var ol_printtext='Print';
+
+// PRINTBUTTONTEXT - Text for the sticky popup print button. Normal is "Print".
+var ol_printbuttontext='Print';
+
+// PRINTTITLE - Text to use as value of TITLE attribute for browser-generated TooTips
+// with the "Print" link in captions of stickies or "Print" button in main text area.
+var ol_printtitle="Click to Print";
+
+// PRINTFONTCLASS - Print font class.
+var ol_printfontclass="";
+
+// PRINTCSSFILE - URL for .ccs file with CSS rules for styling the popup.
+var ol_printcssfile="";
+
+// PRINTXML - String for (optional) xml tag for temporary printing window.
+var ol_printxml="";
+
+// PRINTDOCTYPE - String for DOCTYPE declaration for temporary printing window.
+var ol_printdoctype=
+ '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" '
++'"http://www.w3.org/TR/html4/loose.dtd">';
+
+// PRINTROOT - String for root tag for temporary printing window.
+var ol_printroot="<html>";
+
+// PRINTTYPE - String for MIME type for temporary printing window.
+var ol_printtype="text/html";
+
+// PRINTCHARSET - String for charset for temporary printing window.
+var ol_printcharset="iso-8859-1";
+
+// PRINTURL - URL for a document to be printed via the temporary printing window.
+var ol_printurl="";
+
+// PRINTJOB - string for an external function to be used for the temporary printing window.
+var ol_printjob="";
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_print.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_scroll.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// SCROLL - Whether sticky should scroll with the document when positioned via
+// RELX or MIDX, and RELY or MIDY.
+var ol_scroll = 0;
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_scroll.js
+////////////////////////////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// DEFAULT CONFIGURATION FOR PLUGIN MODULE overlibmws_shadow.js
+////////////////////////////////////////////////////////////////////////////////////
+
+// SHADOW - Whether to add a dropshadow. Default is no (0).
+var ol_shadow = 0;
+
+// SHADOWX - Horizontal dropshadow displacement in pixels.
+// Positive is to the right and negative is to the left.
+var ol_shadowx = 5;
+
+// SHADOWY - Vertical dropshadow displacement in pixels.
+// Positive is downward and negative is upward.
+var ol_shadowy = 5;
+
+// SHADOWCOLOR - Dropshadow color.
+var ol_shadowcolor = "#666666";
+
+// SHADOWIMAGE - Dropshadow background image. Default is none.
+var ol_shadowimage = "";
+
+// SHADOWOPACITY - Dropshadow opacity (100 is solid; 0 turns off this feature and
+// thus also yields a solid shadow). Default is 60.
+var ol_shadowopacity = 60;
+
+////////////////////////////////////////////////////////////////////////////////////
+// END CONFIGURATION FOR overlibmws_shadow.js
+////////////////////////////////////////////////////////////////////////////////////
+
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws.js
new file mode 100644
index 00000000..454a306a
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws.js
@@ -0,0 +1,666 @@
+/*
+ Do not remove or change this notice.
+ overlibmws.js core module - Copyright Foteos Macrides 2002-2007. All rights reserved.
+ Initial: August 18, 2002 - Last Revised: October 8, 2007
+ This module is subject to the same terms of usage as for Erik Bosrup's overLIB,
+ though only a minority of the code and API now correspond with Erik's version.
+ See the overlibmws Change History and Command Reference via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+ Give credit on sites that use overlibmws and submit changes so others can use them as well.
+ You can get Erik's version via: http://www.bosrup.com/web/overlib/
+*/
+
+// PRE-INIT -- Ignore these lines, configuration is below.
+var OLloaded=0,pmCnt=1,pMtr=new Array(),OLcmdLine=new Array(),OLrunTime=new Array(),OLv,OLudf,
+OLpct=new Array("83%","67%","83%","100%","117%","150%","200%","267%"),OLrefXY,OLbubblePI=0,
+OLcrossframePI=0,OLdebugPI=0,OLdraggablePI=0,OLexclusivePI=0,OLfilterPI=0,OLfunctionPI=0,
+OLhidePI=0,OLiframePI=0,OLmodalPI=0,OLovertwoPI=0,OLscrollPI=0,OLshadowPI=0,OLprintPI=0;
+if(typeof OLgateOK=='undefined')var OLgateOK=1;
+var OLp1or2c='inarray,caparray,caption,closetext,right,left,center,autostatuscap,padx,pady,'
++'below,above,vcenter,donothing',OLp1or2co='nofollow,background,offsetx,offsety,fgcolor,'
++'bgcolor,cgcolor,textcolor,capcolor,width,wrap,wrapmax,height,border,base,status,autostatus,'
++'snapx,snapy,fixx,fixy,relx,rely,midx,midy,ref,refc,refp,refx,refy,fgbackground,bgbackground,'
++'cgbackground,fullhtml,capicon,textfont,captionfont,textsize,captionsize,timeout,delay,hauto,'
++'vauto,nojustx,nojusty,fgclass,bgclass,cgclass,capbelow,textpadding,textfontclass,'
++'captionpadding,captionfontclass,sticky,noclose,mouseoff,offdelay,closecolor,closefont,'
++'closesize,closeclick,closetitle,closefontclass,decode',OLp1or2o='text,cap,close,hpos,vpos,'
++'padxl,padxr,padyt,padyb',OLp1co='label',OLp1or2=OLp1or2co+','+OLp1or2o,OLp1=OLp1co+','+'frame';
+OLregCmds(OLp1or2c+','+OLp1or2co+','+OLp1co);
+function OLud(v){return eval('typeof ol_'+v+'=="undefined"')?1:0;}
+
+// DEFAULT CONFIGURATION -- See overlibConfig.txt for descriptions
+if(OLud('fgcolor'))var ol_fgcolor="#ccccff";
+if(OLud('bgcolor'))var ol_bgcolor="#333399";
+if(OLud('cgcolor'))var ol_cgcolor="#333399";
+if(OLud('textcolor'))var ol_textcolor="#000000";
+if(OLud('capcolor'))var ol_capcolor="#ffffff";
+if(OLud('closecolor'))var ol_closecolor="#eeeeff";
+if(OLud('textfont'))var ol_textfont="Verdana,Arial,Helvetica";
+if(OLud('captionfont'))var ol_captionfont="Verdana,Arial,Helvetica";
+if(OLud('closefont'))var ol_closefont="Verdana,Arial,Helvetica";
+if(OLud('textsize'))var ol_textsize=1;
+if(OLud('captionsize'))var ol_captionsize=1;
+if(OLud('closesize'))var ol_closesize=1;
+if(OLud('fgclass'))var ol_fgclass="";
+if(OLud('bgclass'))var ol_bgclass="";
+if(OLud('cgclass'))var ol_cgclass="";
+if(OLud('textpadding'))var ol_textpadding=2;
+if(OLud('textfontclass'))var ol_textfontclass="";
+if(OLud('captionpadding'))var ol_captionpadding=2;
+if(OLud('captionfontclass'))var ol_captionfontclass="";
+if(OLud('closefontclass'))var ol_closefontclass="";
+if(OLud('close'))var ol_close="Close";
+if(OLud('closeclick'))var ol_closeclick=0;
+if(OLud('closetitle'))var ol_closetitle="Click to Close";
+if(OLud('text'))var ol_text="Default Text";
+if(OLud('cap'))var ol_cap="";
+if(OLud('capbelow'))var ol_capbelow=0;
+if(OLud('background'))var ol_background="";
+if(OLud('width'))var ol_width=200;
+if(OLud('wrap'))var ol_wrap=0;
+if(OLud('wrapmax'))var ol_wrapmax=0;
+if(OLud('height'))var ol_height= -1;
+if(OLud('border'))var ol_border=1;
+if(OLud('base'))var ol_base=0;
+if(OLud('offsetx'))var ol_offsetx=10;
+if(OLud('offsety'))var ol_offsety=10;
+if(OLud('sticky'))var ol_sticky=0;
+if(OLud('nofollow'))var ol_nofollow=0;
+if(OLud('noclose'))var ol_noclose=0;
+if(OLud('mouseoff'))var ol_mouseoff=0;
+if(OLud('offdelay'))var ol_offdelay=300;
+if(OLud('hpos'))var ol_hpos=RIGHT;
+if(OLud('vpos'))var ol_vpos=BELOW;
+if(OLud('status'))var ol_status="";
+if(OLud('autostatus'))var ol_autostatus=0;
+if(OLud('snapx'))var ol_snapx=0;
+if(OLud('snapy'))var ol_snapy=0;
+if(OLud('fixx'))var ol_fixx= -1;
+if(OLud('fixy'))var ol_fixy= -1;
+if(OLud('relx'))var ol_relx=null;
+if(OLud('rely'))var ol_rely=null;
+if(OLud('midx'))var ol_midx=null;
+if(OLud('midy'))var ol_midy=null;
+if(OLud('ref'))var ol_ref="";
+if(OLud('refc'))var ol_refc='UL';
+if(OLud('refp'))var ol_refp='UL';
+if(OLud('refx'))var ol_refx=0;
+if(OLud('refy'))var ol_refy=0;
+if(OLud('fgbackground'))var ol_fgbackground="";
+if(OLud('bgbackground'))var ol_bgbackground="";
+if(OLud('cgbackground'))var ol_cgbackground="";
+if(OLud('padxl'))var ol_padxl=1;
+if(OLud('padxr'))var ol_padxr=1;
+if(OLud('padyt'))var ol_padyt=1;
+if(OLud('padyb'))var ol_padyb=1;
+if(OLud('fullhtml'))var ol_fullhtml=0;
+if(OLud('capicon'))var ol_capicon="";
+if(OLud('frame'))var ol_frame=self;
+if(OLud('timeout'))var ol_timeout=0;
+if(OLud('delay'))var ol_delay=0;
+if(OLud('hauto'))var ol_hauto=0;
+if(OLud('vauto'))var ol_vauto=0;
+if(OLud('nojustx'))var ol_nojustx=0;
+if(OLud('nojusty'))var ol_nojusty=0;
+if(OLud('label'))var ol_label="";
+if(OLud('decode'))var ol_decode=0;
+// ARRAY CONFIGURATION - See overlibConfig.txt for descriptions.
+if(OLud('texts'))var ol_texts=new Array("Text 0","Text 1");
+if(OLud('caps'))var ol_caps=new Array("Caption 0","Caption 1");
+// END CONFIGURATION -- Don't change anything below, all configuration is above.
+
+// INIT -- Runtime variables.
+var o3_text="",o3_cap="",o3_sticky=0,o3_nofollow=0,o3_background="",o3_noclose=0,o3_mouseoff=0,
+o3_offdelay=300,o3_hpos=RIGHT,o3_offsetx=10,o3_offsety=10,o3_fgcolor="",o3_bgcolor="",
+o3_cgcolor="",o3_textcolor="",o3_capcolor="",o3_closecolor="",o3_width=200,o3_wrap=0,
+o3_wrapmax=0,o3_height= -1,o3_border=1,o3_base=0,o3_status="",o3_autostatus=0,o3_snapx=0,
+o3_snapy=0,o3_fixx= -1,o3_fixy= -1,o3_relx=null,o3_rely=null,o3_midx=null,o3_midy=null,o3_ref="",
+o3_refc='UL',o3_refp='UL',o3_refx=0,o3_refy=0,o3_fgbackground="",o3_bgbackground="",
+o3_cgbackground="",o3_padxl=0,o3_padxr=0,o3_padyt=0,o3_padyb=0,o3_fullhtml=0,o3_vpos=BELOW,
+o3_capicon="",o3_textfont="Verdana,Arial,Helvetica",o3_captionfont="",o3_closefont="",
+o3_textsize=1,o3_captionsize=1,o3_closesize=1,o3_frame=self,o3_timeout=0,o3_delay=0,o3_hauto=0,
+o3_vauto=0,o3_nojustx=0,o3_nojusty=0,o3_close="",o3_closeclick=0,o3_closetitle="",o3_fgclass="",
+o3_bgclass="",o3_cgclass="",o3_textpadding=2,o3_textfontclass="",o3_captionpadding=2,
+o3_captionfontclass="",o3_closefontclass="",o3_capbelow=0,o3_label="",o3_decode=0,
+CSSOFF=DONOTHING,CSSCLASS=DONOTHING,OLdelayid=0,OLtimerid=0,OLshowid=0,OLndt=0,over=null,
+OLfnRef="",OLhover=0,OLx=0,OLy=0,OLshowingsticky=0,OLallowmove=0,OLcC=null,
+OLua=(OLv=navigator.userAgent)?OLv.toLowerCase():'',
+OLns4=(navigator.appName=='Netscape'&&parseInt(navigator.appVersion)==4)?1:0,
+OLns6=(document.getElementById)?1:0,
+OLie4=(document.all)?1:0,
+OLgek=(OLv=OLua.match(/gecko\/(\d{8})/i))?parseInt(OLv[1]):0,
+OLmac=(OLua.indexOf('mac')>=0)?1:0,
+OLsaf=(OLua.indexOf('safari')>=0)?1:0,
+OLkon=(OLua.indexOf('konqueror')>=0)?1:0,
+OLkht=(OLsaf||OLkon)?1:0,
+OLopr=(OLua.indexOf('opera')>=0)?1:0,
+OLop7=(OLopr&&document.createTextNode)?1:0;
+if(OLopr){OLns4=OLns6=OLgek=0;if(!OLop7)OLie4=0;}
+var OLieM=((OLie4&&OLmac)&&!(OLkht||OLopr))?1:0,
+OLie5=0,OLie55=0;OLie7=0;if(OLie4&&!OLop7){
+if((OLv=OLua.match(/msie (\d\.\d+)\.*/i))&&(OLv=parseFloat(OLv[1]))>=5.0){
+OLie5=1;OLns6=0;if(OLv>=5.5)OLie55=1;if(OLv>=7.0)OLie7=1;}if(OLns6)OLie4=0;}
+if(OLns4)window.onresize=function(){location.reload();};var OLchkMh=1,OLdw;
+if(OLns4||OLie4||OLns6){OLmh();if(window.addEventListener)window.addEventListener("unload",
+OLulCl,false);}else{overlib=nd=cClick=OLpageDefaults=no_overlib;}
+function OLulCl(){if(over)cClick();window.removeEventListener("unload",OLulCl,false);}
+
+/*
+ PUBLIC FUNCTIONS
+*/
+// Loads defaults then args into runtime variables.
+function overlib(){
+if(!(OLloaded&&OLgateOK))return;if((OLexclusivePI)&&OLisExclusive(arguments))return true;
+if(OLchkMh)OLmh();if(OLndt&&!OLtimerid)OLndt=0;if(over)cClick();OLload(OLp1or2);OLload(OLp1);
+OLfnRef="";OLhover=0;OLsetRunTimeVar();OLparseTokens('o3_',arguments);
+if(!(over=OLmkLyr()))return false;if(o3_decode)OLdecode();if(OLprintPI)OLchkPrint();
+if(OLbubblePI)OLchkForBubbleEffect();if(OLdebugPI)OLsetDebugCanShow();
+if(OLshadowPI)OLinitShadow();if(OLiframePI)OLinitIfs();if(OLfilterPI)OLinitFilterLyr();
+if(OLexclusivePI&&o3_exclusive&&o3_exclusivestatus!="")o3_status=o3_exclusivestatus;
+else if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;
+else if(o3_autostatus==1&&o3_text!="")o3_status=o3_text;if(!o3_delay){return OLmain();
+}else{OLdelayid=setTimeout("OLmain()",o3_delay);if(o3_status!=""){self.status=o3_status;
+return true;}else if(!(OLop7&&event&&event.type=='mouseover'))return false;}
+}
+
+// Clears popups if appropriate
+function nd(time){
+if(OLloaded&&OLgateOK){if(!((OLexclusivePI)&&OLisExclusive())){if(time&&over&&!o3_delay){
+if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=(OLhover&&o3_frame==self&&!OLcursorOff())?0:
+setTimeout("cClick()",(o3_timeout=OLndt=time));}else{if(!OLshowingsticky){OLallowmove=0;
+if(over)OLhideObject(over);}}}}return false;
+}
+
+// Close function for stickies
+function cClick(){
+if(OLloaded&&OLgateOK){OLhover=0;if(over){if(OLovertwoPI&&over==over2)cClick2();
+OLhideObject(over);OLshowingsticky=0;}if(OLmodalPI)OLclearModal();}return false;
+}
+
+// Sets page-specific defaults.
+function OLpageDefaults(){
+OLparseTokens('ol_',arguments);
+}
+
+// Gets object referenced by its id or name
+function OLgetRef(l,d){var r=OLgetRefById(l,d);return (r)?r:OLgetRefByName(l,d);}
+
+// For unsupported browsers.
+function no_overlib(){return false;}
+
+/*
+ OVERLIB MAIN FUNCTION SET
+*/
+function OLmain(){
+o3_delay=0;
+if(o3_frame==self){if(o3_noclose)OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);}
+if(o3_sticky)OLshowingsticky=1;OLdoLyr();OLallowmove=0;if(o3_timeout>0){
+if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("cClick()",o3_timeout);}
+if(o3_ref){OLrefXY=OLgetRefXY(o3_ref);if(OLrefXY[0]==null){o3_ref="";o3_midx=0;o3_midy=0;}}
+OLdisp(o3_status);if(OLdraggablePI)OLcheckDrag();
+if(o3_status!="")return true;else if(!(OLop7&&event&&event.type=='mouseover'))return false;
+}
+
+// Loads o3_ variables
+function OLload(c){var i,m=c.split(',');for(i=0;i<m.length;i++)eval('o3_'+m[i]+'=ol_'+m[i]);}
+
+// Chooses LGF
+function OLdoLGF(){
+return (o3_background!=''||o3_fullhtml)?OLcontentBackground(o3_text,o3_background,o3_fullhtml):
+(o3_cap=="")?OLcontentSimple(o3_text):
+(o3_sticky)?OLcontentCaption(o3_text,o3_cap,o3_close):OLcontentCaption(o3_text,o3_cap,'');
+}
+
+// Makes Layer
+function OLmkLyr(id,f,z){
+id=(id||'overDiv');f=(f||o3_frame);z=(z||1000);var fd=f.document,d=OLgetRefById(id,fd);
+if(!d){if(OLns4)d=fd.layers[id]=new Layer(1024,f);else if(OLie4&&!document.getElementById){
+fd.body.insertAdjacentHTML('BeforeEnd','<div id="'+id+'"></div>');d=fd.all[id];
+}else{d=fd.createElement('div');if(d){d.id=id;fd.body.appendChild(d);}}if(!d)return null;
+if(OLns4)d.zIndex=z;else{var o=d.style;o.position='absolute';o.visibility='hidden';o.zIndex=z;}}
+return d;
+}
+
+// Creates and writes layer content
+function OLdoLyr(){
+if(o3_sticky&&OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}
+if(o3_background==''&&!o3_fullhtml){
+if(o3_fgbackground!='')o3_fgbackground=' background="'+o3_fgbackground+'"';
+if(o3_bgbackground!='')o3_bgbackground=' background="'+o3_bgbackground+'"';
+if(o3_cgbackground!='')o3_cgbackground=' background="'+o3_cgbackground+'"';
+if(o3_fgcolor!='')o3_fgcolor=' bgcolor="'+o3_fgcolor+'"';
+if(o3_bgcolor!='')o3_bgcolor=' bgcolor="'+o3_bgcolor+'"';
+if(o3_cgcolor!='')o3_cgcolor=' bgcolor="'+o3_cgcolor+'"';
+if(o3_height>0)o3_height=' height="'+o3_height+'"';else o3_height='';}
+if(!OLns4)OLrepositionTo(over,(OLns6?20:0),0);var lyrHtml=OLdoLGF();
+if(o3_wrap&&!o3_fullhtml){OLlayerWrite(lyrHtml);
+o3_width=(OLns4?over.clip.width:over.offsetWidth);if(OLie4){var w=OLfd().clientWidth;
+if(o3_width>=w){if(OLop7){if(OLovertwoPI&&over==over2){var z=over2.style.zIndex;
+o3_frame.document.body.removeChild(over);over2=OLmkLyr('overDiv2',o3_frame,z);over=over2;
+}else{o3_frame.document.body.removeChild(over);over=OLmkLyr();}}o3_width=w-20;}}
+if(o3_wrapmax<1&&o3_frame.innerWidth)o3_wrapmax=o3_frame.innerWidth-40;
+if(o3_wrapmax>0&&o3_width>o3_wrapmax)o3_width=o3_wrapmax;o3_wrap=0;lyrHtml=OLdoLGF();}
+OLlayerWrite(lyrHtml);o3_width=(OLns4?over.clip.width:over.offsetWidth);
+if(OLbubblePI)OLgenerateBubble(lyrHtml);
+}
+
+/*
+ LAYER GENERATION FUNCTIONS
+*/
+// Makes simple table without caption
+function OLcontentSimple(txt){
+var t=OLbgLGF()+OLfgLGF(txt)+OLbaseLGF();OLsetBackground('');return t;
+}
+
+// Makes table with caption and optional close link
+function OLcontentCaption(txt,title,close){
+var closing=(OLprintPI?OLprintCapLGF():''),closeevent='onmouseover',caption,t,
+cC='javascript:return '+OLfnRef+(OLovertwoPI&&over==over2?'cClick2();':'cClick();');
+if(o3_closeclick)closeevent=(o3_closetitle?'title="'+o3_closetitle+'" ':'')+'onclick';
+if(o3_capicon!=''&&o3_capicon.indexOf('<img')!=0)o3_capicon='<img src="'+o3_capicon+'" /> ';
+if(close){closing+='<td align="right"><a href="'+cC+'" '+closeevent+'="'+cC+'"'
++(o3_closefontclass?' class="'+o3_closefontclass+'">':(OLns4?'><':'')
++OLlgfUtil(0,1,'','a',o3_closecolor,o3_closefont,o3_closesize))+close+
+(o3_closefontclass?'':(OLns4?OLlgfUtil(1,1,'','a'):''))+'</a></td>';}
+caption='<table id="overCap'+(OLovertwoPI&&over==over2?'2':'')+'"'+OLwd(0)
++' border="0" cellpadding="'+o3_captionpadding+'" cellspacing="0"'+(o3_cgclass?' class="'
++o3_cgclass+'"':o3_cgcolor+o3_cgbackground)+'><tr><td'+OLwd(0)+(o3_cgclass?' class="'
++o3_cgclass+'">':'>')+(o3_captionfontclass?'<div class="'+o3_captionfontclass
++'">':OLlgfUtil(0,1,'','div',o3_capcolor,o3_captionfont,o3_captionsize))+o3_capicon+title
++OLlgfUtil(1,1,'','div')+'</td>'+closing+'</tr></table>';
+t=OLbgLGF()+(o3_capbelow?OLfgLGF(txt)+caption:caption+OLfgLGF(txt))+OLbaseLGF();
+OLsetBackground('');return t;
+}
+
+// For BACKGROUND and FULLHTML commands
+function OLcontentBackground(txt,image,hasfullhtml){
+var t;if(hasfullhtml){t=txt;}else{t='<table'+OLwd(1)+' border="0" cellpadding="0" '
++'cellspacing="0" '+'height="'+o3_height+'"><tr><td colspan="3" height="'+o3_padyt
++'"></td></tr><tr><td width="'+o3_padxl+'"></td><td valign="top"'+OLwd(2)+'>'
++OLlgfUtil(0,0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+txt+
+OLlgfUtil(1,0,'','div')+'</td><td width="'+o3_padxr+'"></td></tr><tr><td colspan="3" height="'
++o3_padyb+'"></td></tr></table>';}OLsetBackground(image);return t;
+}
+
+// LGF utilities
+function OLbgLGF(){
+return '<table'+OLwd(1)+o3_height+' border="0" cellpadding="'+o3_border+'" cellspacing="0"'
++(o3_bgclass?' class="'+o3_bgclass+'"':o3_bgcolor+o3_bgbackground)+'><tr><td>';
+}
+function OLfgLGF(t){
+return '<table'+OLwd(0)+o3_height+' border="0" cellpadding="'+o3_textpadding
++'" cellspacing="0"'+(o3_fgclass?' class="'+o3_fgclass+'"':o3_fgcolor+o3_fgbackground)
++'><tr><td valign="top"'+(o3_fgclass?' class="'+o3_fgclass+'"':'')+'>'
++OLlgfUtil(0,0,o3_textfontclass,'div',o3_textcolor,o3_textfont,o3_textsize)+t
++(OLprintPI?OLprintFgLGF():'')+OLlgfUtil(1,0,'','div')+'</td></tr></table>';
+}
+function OLlgfUtil(end,stg,tfc,ele,col,fac,siz){
+if(end)return('</'+(OLns4?'font'+(stg?'></strong':''):ele)+'>');
+else return(tfc?'<div class="'+tfc+'">':((ele=='a'?'':'<')+(OLns4?(stg?'strong><':'')
++'font color="'+col+'" face="'+OLquoteMultiNameFonts(fac)+'" size="'+siz:(ele=='a'?'':ele)
++' style="color:'+col+(stg?';font-weight:bold':'')+';font-family:'+OLquoteMultiNameFonts(fac)
++';font-size:'+siz+';'+(ele=='span'?'text-decoration:underline;':''))+'">'));
+}
+function OLquoteMultiNameFonts(f){
+var i,v,pM=f.split(',');
+for(i=0;i<pM.length;i++){v=pM[i];v=v.replace(/^\s+/,'').replace(/\s+$/,'');
+if(/\s/.test(v) && !/['"]/.test(v)){v="\'"+v+"\'";pM[i]=v;}}return pM.join();
+}
+function OLbaseLGF(){
+return ((o3_base>0&&!o3_wrap)?('<table width="100%" border="0" cellpadding="0" cellspacing="0"'
++(o3_bgclass?' class="'+o3_bgclass+'"':'')+'><tr><td height="'+o3_base
++'"></td></tr></table>'):'')+'</td></tr></table>';
+}
+function OLwd(a){
+return(o3_wrap?'':' width="'+(!a?'100%':(a==1?o3_width:(o3_width-o3_padxl-o3_padxr)))+'"');
+}
+
+// Loads image into the div.
+function OLsetBackground(i){
+if(i==''){if(OLns4)over.background.src=null;else{if(OLns6)over.style.width='';
+over.style.backgroundImage='none';}}else{if(OLns4)over.background.src=i;else{
+if(OLns6)over.style.width=o3_width+'px';over.style.backgroundImage='url('+i+')';}}
+}
+
+/*
+ HANDLING FUNCTIONS
+*/
+// Displays layer
+function OLdisp(s){
+if(OLmodalPI)OLchkModal();if(!OLallowmove){if(OLshadowPI)OLdispShadow();
+if(OLiframePI)OLdispIfs();OLplaceLayer();if(OLndt)OLshowObject(over);
+else OLshowid=setTimeout("OLshowObject(over)",1);
+OLallowmove=(o3_sticky||o3_nofollow)?0:1;}OLndt=0;if(s!="")self.status=s;
+}
+
+// Decides placement of layer.
+function OLplaceLayer(){
+var snp,X,Y,pgLeft,pgTop,pWd=o3_width,pHt,iWd=100,iHt=100,SB=0,LM=0,CX=0,TM=0,BM=0,CY=0,
+o=OLfd(),nsb=(OLgek>=20010505&&!o3_frame.scrollbars.visible)?1:0;
+if(!OLkht&&o&&o.clientWidth)iWd=o.clientWidth;
+else if(o3_frame.innerWidth){SB=Math.ceil(1.4*(o3_frame.outerWidth-o3_frame.innerWidth));
+if(SB>20)SB=20;iWd=o3_frame.innerWidth;}
+pgLeft=(OLie4)?o.scrollLeft:o3_frame.pageXOffset;
+if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)SB=CX=5;else
+if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){SB+=((o3_shadowx>0)?o3_shadowx:0);
+LM=((o3_shadowx<0)?Math.abs(o3_shadowx):0);CX=Math.abs(o3_shadowx);}
+if(o3_ref!=""||o3_fixx> -1||o3_relx!=null||o3_midx!=null){
+if(o3_ref!=""){X=OLrefXY[0];if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow){
+if(o3_refp=='UR'||o3_refp=='LR')X-=5;}
+else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowx){
+if(o3_shadowx<0&&(o3_refp=='UL'||o3_refp=='LL'))X-=o3_shadowx;else
+if(o3_shadowx>0&&(o3_refp=='UR'||o3_refp=='LR'))X-=o3_shadowx;}
+}else{if(o3_midx!=null){
+X=parseInt(pgLeft+((iWd-pWd-SB-LM)/2)+o3_midx);
+}else{if(o3_relx!=null){
+if(o3_relx>=0)X=pgLeft+o3_relx+LM;else X=pgLeft+o3_relx+iWd-pWd-SB;
+}else{X=o3_fixx+LM;}}}
+}else{
+if(o3_hauto){
+if(o3_hpos==LEFT&&OLx-pgLeft<iWd/2&&OLx-pWd-o3_offsetx<pgLeft+LM)o3_hpos=RIGHT;else
+if(o3_hpos==RIGHT&&OLx-pgLeft>iWd/2&&OLx+pWd+o3_offsetx>pgLeft+iWd-SB)o3_hpos=LEFT;}
+X=(o3_hpos==CENTER)?parseInt(OLx-((pWd+CX)/2)+o3_offsetx):
+(o3_hpos==LEFT)?OLx-o3_offsetx-pWd:OLx+o3_offsetx;
+if(o3_snapx>1){
+snp=X % o3_snapx;
+if(o3_hpos==LEFT){X=X-(o3_snapx+snp);}else{X=X+(o3_snapx-snp);}}}
+if(!o3_nojustx&&X+pWd>pgLeft+iWd-SB)
+X=iWd+pgLeft-pWd-SB;if(!o3_nojustx&&X-LM<pgLeft)X=pgLeft+LM;
+pgTop=OLie4?o.scrollTop:o3_frame.pageYOffset;
+if(!OLkht&&!nsb&&o&&o.clientHeight)iHt=o.clientHeight;
+else if(o3_frame.innerHeight)iHt=o3_frame.innerHeight;
+if(OLbubblePI&&o3_bubble)pHt=OLbubbleHt;else pHt=OLns4?over.clip.height:over.offsetHeight;
+if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){TM=(o3_shadowy<0)?Math.abs(o3_shadowy):0;
+if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow)BM=CY=5;else
+BM=(o3_shadowy>0)?o3_shadowy:0;CY=Math.abs(o3_shadowy);}
+if(o3_ref!=""||o3_fixy> -1||o3_rely!=null||o3_midy!=null){
+if(o3_ref!=""){Y=OLrefXY[1];if(OLie55&&OLfilterPI&&o3_filter&&o3_filtershadow){
+if(o3_refp=='LL'||o3_refp=='LR')Y-=5;}else if((OLshadowPI)&&bkdrop&&o3_shadow&&o3_shadowy){
+if(o3_shadowy<0&&(o3_refp=='UL'||o3_refp=='UR'))Y-=o3_shadowy;else
+if(o3_shadowy>0&&(o3_refp=='LL'||o3_refp=='LR'))Y-=o3_shadowy;}
+}else{if(o3_midy!=null){
+Y=parseInt(pgTop+((iHt-pHt-CY)/2)+o3_midy);
+}else{if(o3_rely!=null){
+if(o3_rely>=0)Y=pgTop+o3_rely+TM;else Y=pgTop+o3_rely+iHt-pHt-BM;}else{
+Y=o3_fixy+TM;}}}
+}else{
+if(o3_vauto){
+if(o3_vpos==ABOVE&&OLy-pgTop<iHt/2&&OLy-pHt-o3_offsety<pgTop)o3_vpos=BELOW;else
+if(o3_vpos==BELOW&&OLy-pgTop>iHt/2&&OLy+pHt+o3_offsety+((OLns4||OLkht)?17:0)>pgTop+iHt-BM)
+o3_vpos=ABOVE;}Y=(o3_vpos==VCENTER)?parseInt(OLy-((pHt+CY)/2)+o3_offsety):
+(o3_vpos==ABOVE)?OLy-(pHt+o3_offsety+BM):OLy+o3_offsety+TM;
+if(o3_snapy>1){
+snp=Y % o3_snapy;
+if(pHt>0&&o3_vpos==ABOVE){Y=Y-(o3_snapy+snp);}else{Y=Y+(o3_snapy-snp);}}}
+if(!o3_nojusty&&Y+pHt+BM>pgTop+iHt)Y=pgTop+iHt-pHt-BM;if(!o3_nojusty&&Y-TM<pgTop)Y=pgTop+TM;
+OLrepositionTo(over,X,Y);
+if(OLshadowPI)OLrepositionShadow(X,Y);if(OLiframePI)OLrepositionIfs(X,Y);
+if(OLns6&&o3_frame.innerHeight){iHt=o3_frame.innerHeight;OLrepositionTo(over,X,Y);}
+if(OLscrollPI)OLchkScroll(X-pgLeft,Y-pgTop);
+}
+
+// Chooses body or documentElement
+function OLfd(f){
+var fd=((f)?f:o3_frame).document,fdc=fd.compatMode,fdd=fd.documentElement;
+return (!OLop7&&fdc&&fdc!='BackCompat'&&fdd&&fdd.clientWidth)?fd.documentElement:fd.body;
+}
+
+// Gets location of REFerence object
+function OLgetRefXY(r,d){
+var o=OLgetRef(r,d),ob=o,rXY=[o3_refx,o3_refy],of;if(!o)return [null,null];
+if(OLns4){if(typeof o.length!='undefined'&&o.length>1){ob=o[0];
+rXY[0]+=o[0].x+o[1].pageX;rXY[1]+=o[0].y+o[1].pageY;}else{
+if((o.toString().indexOf('Image')!= -1)||(o.toString().indexOf('Anchor')!= -1)){
+rXY[0]+=o.x;rXY[1]+=o.y;}else{rXY[0]+=o.pageX;rXY[1]+=o.pageY;}}
+}else{rXY[0]+=OLpageLoc(o,'Left');rXY[1]+=OLpageLoc(o,'Top');}
+of=OLgetRefOffsets(ob);rXY[0]+=of[0];rXY[1]+=of[1];return rXY;
+}
+
+// Seeks REFerence by id
+function OLgetRefById(l,d){
+l=(l||'overDiv');d=(d||o3_frame.document);var j,r;if(OLie4&&d.all)return d.all[l];
+if(d.getElementById)return d.getElementById(l);if(d.layers&&d.layers.length>0){
+if(d.layers[l])return d.layers[l];for(j=0;j<d.layers.length;j++){
+r=OLgetRefById(l,d.layers[j].document);if(r)return r;}}return null;
+}
+
+// Seeks REFerence by name
+function OLgetRefByName(l,d){
+d=(d||o3_frame.document);var j,r,v=OLie4?d.all.tags('iframe'):
+OLns6?d.getElementsByTagName('iframe'):null;
+if(typeof d.images!='undefined'&&d.images[l])return d.images[l];
+if(typeof d.anchors!='undefined'&&d.anchors[l])return d.anchors[l];
+if(v)for(j=0;j<v.length;j++)if(v[j].name==l)return v[j];
+if(d.layers&&d.layers.length>0)for(j=0;j<d.layers.length;j++){
+r=OLgetRefByName(l,d.layers[j].document);
+if(r&&r.length>0)return r;else if(r)return [r,d.layers[j]];}return null;
+}
+
+// Gets layer vs REFerence offsets
+function OLgetRefOffsets(o){
+var c=o3_refc.toUpperCase(),p=o3_refp.toUpperCase(),W=0,H=0,pW=0,pH=0,of=[0,0];
+pW=(OLbubblePI&&o3_bubble)?o3_width:OLns4?over.clip.width:over.offsetWidth;
+pH=(OLbubblePI&&o3_bubble)?OLbubbleHt:OLns4?over.clip.height:over.offsetHeight;
+if((!OLop7)&&o.toString().indexOf('Image')!= -1){W=o.width;H=o.height;
+}else if((!OLop7)&&o.toString().indexOf('Anchor')!= -1){c=o3_refc='UL';}else{
+W=(OLns4)?o.clip.width:o.offsetWidth;H=(OLns4)?o.clip.height:o.offsetHeight;}
+if((OLns4||(OLns6&&OLgek))&&o.border){W+=2*parseInt(o.border);H+=2*parseInt(o.border);}
+if(c=='UL'){of=(p=='UR')?[-pW,0]:(p=='LL')?[0,-pH]:(p=='LR')?[-pW,-pH]:[0,0];
+}else if(c=='UR'){of=(p=='UR')?[W-pW,0]:(p=='LL')?[W,-pH]:(p=='LR')?[W-pW,-pH]:[W,0];
+}else if(c=='LL'){of=(p=='UR')?[-pW,H]:(p=='LL')?[0,H-pH]:(p=='LR')?[-pW,H-pH]:[0,H];
+}else if(c=='LR'){of=(p=='UR')?[W-pW,H]:(p=='LL')?[W,H-pH]:(p=='LR')?[W-pW,H-pH]:[W,H];}
+return of;
+}
+
+// Gets x or y location of object
+function OLpageLoc(o,t){
+var l=0,s=o;while(o.offsetParent&&o.offsetParent.tagName.toLowerCase()!='html'){
+l+=o['offset'+t];o=o.offsetParent;}l+=o['offset'+t];while(s=s.parentNode){
+if((s['scroll'+t]>0)&&s.tagName.toLowerCase()=='div')l-=s['scroll'+t];}return l;
+}
+
+// Moves layer
+function OLmouseMove(e){
+var e=(e||event);OLcC=(OLovertwoPI&&over2&&over==over2?cClick2:cClick);
+OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);
+if((OLallowmove&&over)&&(o3_frame==self||over==OLgetRefById()
+||(OLovertwoPI&&over2==over&&over==OLgetRefById('overDiv2')))){
+OLplaceLayer();if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}
+if(OLhover&&over&&o3_frame==self&&OLcursorOff())if(o3_offdelay<1)OLcC();else
+{if(OLtimerid>0)clearTimeout(OLtimerid);OLtimerid=setTimeout("OLcC()",o3_offdelay);}
+}
+
+// Capture mouse and chain other scripts.
+function OLmh(){
+var fN,f,j,k,s,mh=OLmouseMove,w=(OLns4&&window.onmousemove),re=/function[ ]*(\w*)\(/;
+OLdw=document;if(document.onmousemove||w){if(w)OLdw=window;f=OLdw.onmousemove.toString();
+fN=f.match(re);if(!fN||fN[1]=='anonymous'||fN[1]=='OLmouseMove'){OLchkMh=0;return;}
+if(fN[1])s=fN[1]+'(e)';else{j=f.indexOf('{');k=f.lastIndexOf('}')+1;s=f.substring(j,k);}
+s+=';OLmouseMove(e);';mh=new Function('e',s);}
+OLdw.onmousemove=mh;if(OLns4)OLdw.captureEvents(Event.MOUSEMOVE);
+}
+
+/*
+ PARSING
+*/
+function OLparseTokens(pf,ar){
+var i,v,md= -1,par=(pf!='ol_'),p=OLpar,q=OLparQuo,t=OLtoggle;OLudf=(par&&!ar.length?1:0);
+for(i=0;i<ar.length;i++){if(md<0){if(typeof ar[i]=='number'){OLudf=(par?1:0);i--;}
+else{switch(pf){case 'ol_':ol_text=ar[i];break;default:o3_text=ar[i];}}md=0;}else{
+if(ar[i]==INARRAY){OLudf=0;eval(pf+'text=ol_texts['+ar[++i]+']');continue;}
+if(ar[i]==CAPARRAY){eval(pf+'cap=ol_caps['+ar[++i]+']');continue;}
+if(ar[i]==CAPTION){q(ar[++i],pf+'cap');continue;}
+if(Math.abs(ar[i])==STICKY){t(ar[i],pf+'sticky');continue;}
+if(Math.abs(ar[i])==NOFOLLOW){t(ar[i],pf+'nofollow');continue;}
+if(ar[i]==BACKGROUND){q(ar[++i],pf+'background');continue;}
+if(Math.abs(ar[i])==NOCLOSE){t(ar[i],pf+'noclose');continue;}
+if(Math.abs(ar[i])==MOUSEOFF){t(ar[i],pf+'mouseoff');continue;}
+if(ar[i]==OFFDELAY){p(ar[++i],pf+'offdelay');continue;}
+if(ar[i]==RIGHT||ar[i]==LEFT||ar[i]==CENTER){p(ar[i],pf+'hpos');continue;}
+if(ar[i]==OFFSETX){p(ar[++i],pf+'offsetx');continue;}
+if(ar[i]==OFFSETY){p(ar[++i],pf+'offsety');continue;}
+if(ar[i]==FGCOLOR){q(ar[++i],pf+'fgcolor');continue;}
+if(ar[i]==BGCOLOR){q(ar[++i],pf+'bgcolor');continue;}
+if(ar[i]==CGCOLOR){q(ar[++i],pf+'cgcolor');continue;}
+if(ar[i]==TEXTCOLOR){q(ar[++i],pf+'textcolor');continue;}
+if(ar[i]==CAPCOLOR){q(ar[++i],pf+'capcolor');continue;}
+if(ar[i]==CLOSECOLOR){q(ar[++i],pf+'closecolor');continue;}
+if(ar[i]==WIDTH){p(ar[++i],pf+'width');continue;}
+if(Math.abs(ar[i])==WRAP){t(ar[i],pf+'wrap');continue;}
+if(ar[i]==WRAPMAX){p(ar[++i],pf+'wrapmax');continue;}
+if(ar[i]==HEIGHT){p(ar[++i],pf+'height');continue;}
+if(ar[i]==BORDER){p(ar[++i],pf+'border');continue;}
+if(ar[i]==BASE){p(ar[++i],pf+'base');continue;}
+if(ar[i]==STATUS){q(ar[++i],pf+'status');continue;}
+if(Math.abs(ar[i])==AUTOSTATUS){v=pf+'autostatus';
+eval(v+'=('+ar[i]+'<0)?('+v+'==2?2:0):('+v+'==1?0:1)');continue;}
+if(Math.abs(ar[i])==AUTOSTATUSCAP){v=pf+'autostatus';
+eval(v+'=('+ar[i]+'<0)?('+v+'==1?1:0):('+v+'==2?0:2)');continue;}
+if(ar[i]==CLOSETEXT){q(ar[++i],pf+'close');continue;}
+if(ar[i]==SNAPX){p(ar[++i],pf+'snapx');continue;}
+if(ar[i]==SNAPY){p(ar[++i],pf+'snapy');continue;}
+if(ar[i]==FIXX){p(ar[++i],pf+'fixx');continue;}
+if(ar[i]==FIXY){p(ar[++i],pf+'fixy');continue;}
+if(ar[i]==RELX){p(ar[++i],pf+'relx');continue;}
+if(ar[i]==RELY){p(ar[++i],pf+'rely');continue;}
+if(ar[i]==MIDX){p(ar[++i],pf+'midx');continue;}
+if(ar[i]==MIDY){p(ar[++i],pf+'midy');continue;}
+if(ar[i]==REF){q(ar[++i],pf+'ref');continue;}
+if(ar[i]==REFC){q(ar[++i],pf+'refc');continue;}
+if(ar[i]==REFP){q(ar[++i],pf+'refp');continue;}
+if(ar[i]==REFX){p(ar[++i],pf+'refx');continue;}
+if(ar[i]==REFY){p(ar[++i],pf+'refy');continue;}
+if(ar[i]==FGBACKGROUND){q(ar[++i],pf+'fgbackground');continue;}
+if(ar[i]==BGBACKGROUND){q(ar[++i],pf+'bgbackground');continue;}
+if(ar[i]==CGBACKGROUND){q(ar[++i],pf+'cgbackground');continue;}
+if(ar[i]==PADX){p(ar[++i],pf+'padxl');p(ar[++i],pf+'padxr');continue;}
+if(ar[i]==PADY){p(ar[++i],pf+'padyt');p(ar[++i],pf+'padyb');continue;}
+if(Math.abs(ar[i])==FULLHTML){t(ar[i],pf+'fullhtml');continue;}
+if(ar[i]==BELOW||ar[i]==ABOVE||ar[i]==VCENTER){p(ar[i],pf+'vpos');continue;}
+if(ar[i]==CAPICON){q(ar[++i],pf+'capicon');continue;}
+if(ar[i]==TEXTFONT){q(ar[++i],pf+'textfont');continue;}
+if(ar[i]==CAPTIONFONT){q(ar[++i],pf+'captionfont');continue;}
+if(ar[i]==CLOSEFONT){q(ar[++i],pf+'closefont');continue;}
+if(ar[i]==TEXTSIZE){q(ar[++i],pf+'textsize');continue;}
+if(ar[i]==CAPTIONSIZE){q(ar[++i],pf+'captionsize');continue;}
+if(ar[i]==CLOSESIZE){q(ar[++i],pf+'closesize');continue;}
+if(ar[i]==TIMEOUT){p(ar[++i],pf+'timeout');continue;}
+if(ar[i]==DELAY){p(ar[++i],pf+'delay');continue;}
+if(Math.abs(ar[i])==HAUTO){t(ar[i],pf+'hauto');continue;}
+if(Math.abs(ar[i])==VAUTO){t(ar[i],pf+'vauto');continue;}
+if(Math.abs(ar[i])==NOJUSTX){t(ar[i],pf+'nojustx');continue;}
+if(Math.abs(ar[i])==NOJUSTY){t(ar[i],pf+'nojusty');continue;}
+if(Math.abs(ar[i])==CLOSECLICK){t(ar[i],pf+'closeclick');continue;}
+if(ar[i]==CLOSETITLE){q(ar[++i],pf+'closetitle');continue;}
+if(ar[i]==FGCLASS){q(ar[++i],pf+'fgclass');continue;}
+if(ar[i]==BGCLASS){q(ar[++i],pf+'bgclass');continue;}
+if(ar[i]==CGCLASS){q(ar[++i],pf+'cgclass');continue;}
+if(ar[i]==TEXTPADDING){p(ar[++i],pf+'textpadding');continue;}
+if(ar[i]==TEXTFONTCLASS){q(ar[++i],pf+'textfontclass');continue;}
+if(ar[i]==CAPTIONPADDING){p(ar[++i],pf+'captionpadding');continue;}
+if(ar[i]==CAPTIONFONTCLASS){q(ar[++i],pf+'captionfontclass');continue;}
+if(ar[i]==CLOSEFONTCLASS){q(ar[++i],pf+'closefontclass');continue;}
+if(Math.abs(ar[i])==CAPBELOW){t(ar[i],pf+'capbelow');continue;}
+if(ar[i]==LABEL){q(ar[++i],pf+'label');continue;}
+if(Math.abs(ar[i])==DECODE){t(ar[i],pf+'decode');continue;}
+if(ar[i]==DONOTHING){continue;}
+i=OLparseCmdLine(pf,i,ar);}}
+if((OLfunctionPI)&&OLudf&&o3_function)o3_text=o3_function();
+if(pf=='o3_')OLfontSize();
+}
+function OLpar(a,v){eval(v+'='+a);}
+function OLparQuo(a,v){eval(v+"='"+OLescSglQt(a)+"'");}
+function OLescSglQt(s){return s.toString().replace(/\\/g,"\\\\").replace(/'/g,"\\'");}
+function OLtoggle(a,v){eval(v+'=('+v+'==0&&'+a+'>=0)?1:0');}
+function OLhasDims(s){return /[%\-a-z]+$/.test(s);}
+function OLfontSize(){
+var i;if(OLhasDims(o3_textsize)){if(OLns4)o3_textsize="2";}else
+if(!OLns4){i=parseInt(o3_textsize);o3_textsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
+if(OLhasDims(o3_captionsize)){if(OLns4)o3_captionsize="2";}else
+if(!OLns4){i=parseInt(o3_captionsize);o3_captionsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
+if(OLhasDims(o3_closesize)){if(OLns4)o3_closesize="2";}else
+if(!OLns4){i=parseInt(o3_closesize);o3_closesize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
+if(OLprintPI)OLprintDims();
+}
+function OLdecode(){
+var re=/%[0-9A-Fa-f]{2,}/,t=o3_text,c=o3_cap,u=unescape,d=!OLns4&&(!OLgek||OLgek>=20020826)
+&&typeof decodeURIComponent?decodeURIComponent:u;if(typeof(window.TypeError)=='function'){
+if(re.test(t)){eval(new Array('try{','o3_text=d(t);','}catch(e){','o3_text=u(t);',
+'}').join('\n'))};if(c&&re.test(c)){eval(new Array('try{','o3_cap=d(c);','}catch(e){',
+'o3_cap=u(c);','}').join('\n'))}}else{if(re.test(t))o3_text=u(t);if(c&&re.test(c))o3_cap=u(c);}
+}
+
+/*
+ LAYER FUNCTIONS
+*/
+// Writes to layer
+function OLlayerWrite(t){
+t+="\n";if(OLns4){over.document.write(t);over.document.close();}
+else if(typeof over.innerHTML!='undefined'){if(OLieM)over.innerHTML='';over.innerHTML=t;
+}else{var range=o3_frame.document.createRange();range.setStartAfter(over);
+var domfrag=range.createContextualFragment(t);while(over.hasChildNodes()){
+over.removeChild(over.lastChild);}over.appendChild(domfrag);}
+if(OLprintPI)over.print=o3_print?t:null;
+}
+
+// Makes object visible
+function OLshowObject(o){
+OLshowid=0;o=(OLns4)?o:o.style;
+if(((OLfilterPI)&&!OLchkFilter(o))||!OLfilterPI)o.visibility="visible";
+if(OLshadowPI)OLshowShadow();if(OLiframePI)OLshowIfs();if(OLhidePI)OLhideUtil(1,1,0);
+}
+
+// Hides object
+function OLhideObject(o){
+if(OLshowid>0){clearTimeout(OLshowid);OLshowid=0;}
+if(OLtimerid>0)clearTimeout(OLtimerid);if(OLdelayid>0)clearTimeout(OLdelayid);
+OLtimerid=0;OLdelayid=0;self.status="";o3_label=ol_label;if(o3_frame!=self)o=OLgetRefById();
+if(o){if(o.onmouseover)o.onmouseover=null;if(OLscrollPI&&o==over)OLclearScroll();
+if(OLdraggablePI)OLclearDrag();if(OLfilterPI)OLcleanupFilter(o);if(OLshadowPI)OLhideShadow();
+var os=(OLns4)?o:o.style;if(((OLfilterPI)&&!OLchkFadeOut(os))||!OLfilterPI){
+os.visibility="hidden";if(!OLie55||!OLfilterPI||!o3_filter||o3_fadeout<0)o.innerHTML='';}
+if(OLhidePI&&o==over)OLhideUtil(0,0,1);if(OLiframePI)OLhideIfs(o);}
+}
+
+// Moves layer
+function OLrepositionTo(o,xL,yL){
+o=(OLns4)?o:o.style;o.left=(OLns4?xL:xL+'px');o.top=(OLns4?yL:yL+'px');
+}
+
+// Handle NOCLOSE-MOUSEOFF
+function OLoptMOUSEOFF(c){
+if(!c)o3_close="";
+over.onmouseover=function(){OLhover=1;if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}}
+}
+function OLcursorOff(){
+var o=(OLns4?over:over.style),pHt=OLns4?over.clip.height:over.offsetHeight,
+left=parseInt(o.left),top=parseInt(o.top),
+right=left+o3_width,bottom=top+((OLbubblePI&&o3_bubble)?OLbubbleHt:pHt);
+if(OLx<left||OLx>right||OLy<top||OLy>bottom)return true;return false;
+}
+
+/*
+ REGISTRATION
+*/
+function OLsetRunTimeVar(){
+if(OLrunTime.length)for(var k=0;k<OLrunTime.length;k++)OLrunTime[k]();
+}
+function OLparseCmdLine(pf,i,ar){
+if(OLcmdLine.length){for(var k=0;k<OLcmdLine.length;k++){
+var j=OLcmdLine[k](pf,i,ar);if(j>-1){i=j;break;}}}return i;
+}
+function OLregCmds(c){
+if(typeof c!='string')return;var pM=c.split(',');pMtr=pMtr.concat(pM);
+for(var i=0;i<pM.length;i++)eval(pM[i].toUpperCase()+'='+pmCnt++);
+}
+function OLregRunTimeFunc(f){
+if(typeof f=='object')OLrunTime=OLrunTime.concat(f);else OLrunTime[OLrunTime.length++]=f;
+}
+function OLregCmdLineFunc(f){
+if(typeof f=='object')OLcmdLine=OLcmdLine.concat(f);else OLcmdLine[OLcmdLine.length++]=f;
+}
+
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_bubble.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_bubble.js
new file mode 100644
index 00000000..94f1c796
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_bubble.js
@@ -0,0 +1,199 @@
+/*
+ overlibmws_bubble.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For support of the BUBBLE feature.
+ Initial: July 26, 2003 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLbubbleCmds='bubble,bubbletype,adjbubble';
+OLregCmds(OLbubbleCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('bubble'))var ol_bubble=0;
+if(OLud('bubbletype'))var ol_bubbletype='';
+if(OLud('adjbubble'))var ol_adjbubble=0;
+// END CONFIGURATION
+
+if(typeof OLbubbleImages=='undefined')
+var OLbubbleImages='flower,oval,square,pushpin,quotation,roundcorners';
+if(typeof OLbubbleImageDir=='undefined')var OLbubbleImageDir='./';
+OLregisterImages('flower,oval,square,pushpin,quotation,roundcorners',OLbubbleImageDir);
+var OLimgWidth=[250,330,144,202,200];
+var OLimgHeight=[150,160,190,221,66];
+var OLcontentWidth=[200,250,130,184,190];
+var OLcontentHeight=[80,85,150,176,46];
+var OLpadLeft=[30,40,7,9,5];
+var OLpadTop=[25,48,10,34,4];
+var OLarwTipX=[180,50,51,9,19];
+var OLarwTipY=[148,5,180,221,64];
+var OLbI,OLbContentWd=OLcontentWidth;
+
+var o3_bubble=0,o3_bubbletype='',o3_adjbubble=0,OLbubbleHt=0;
+
+function OLloadBubble(){
+OLload(OLbubbleCmds);OLbubbleHt=0;
+}
+
+function OLparseBubble(pf,i,ar){
+var k=i,t=OLtoggle;
+if(k<ar.length){
+if(Math.abs(ar[k])==BUBBLE){t(ar[k],pf+'bubble');return k;}
+if(ar[k]==BUBBLETYPE){OLparQuo(ar[++k],pf+'bubbletype');return k;}
+if(Math.abs(ar[k])==ADJBUBBLE){t(ar[k],pf+'adjbubble');return k;}}
+return -1;
+}
+
+function OLchkForBubbleEffect() {
+if(o3_bubble){o3_bubbletype=(o3_bubbletype)?o3_bubbletype:'flower';
+for(var i=0;i<OLbTypes.length;i++){if(OLbTypes[i]==o3_bubbletype){OLbI=i;break;}}
+// disable inappropriate parameters
+o3_bgcolor=o3_fgcolor='';
+o3_border=o3_base=0;
+o3_fgbackground=o3_bgbackground=o3_cgbackground=o3_background='';
+o3_cap='';
+if(o3_sticky)o3_noclose=1;
+o3_fullhtml=0;
+if(OLshadowPI)o3_shadow=0;
+if(o3_bubbletype!='roundcorners'){
+o3_width=OLbContentWd[OLbI];
+o3_hpos=RIGHT;
+o3_vpos=BELOW;
+o3_vauto=0;
+o3_hauto=0;
+o3_wrap=0;
+o3_nojusty=1;}}
+return true;
+}
+
+function OLregisterImages(imgStr,path) {
+if(typeof imgStr!='string')return;
+path=(path&&typeof path=='string')?path:'.';
+if(path.charAt(path.length-1)=='/')path=path.substring(0,path.length-1);
+if(typeof OLbTypes=='undefined')OLbTypes=imgStr.split(',');
+if(typeof OLbubbleImg=='undefined'){
+OLbubbleImg=new Array();
+for(var i=0;i<OLbTypes.length;i++){
+if(OLbubbleImages.indexOf(OLbTypes[i])<0)continue;
+if(OLbTypes[i]=='roundcorners'){
+OLbubbleImg[i]=new Array();
+var o=OLbubbleImg[i];
+o[0]=new Image();o[0].src=path+'/cornerTL.gif';
+o[1]=new Image();o[1].src=path+'/edgeT.gif';
+o[2]=new Image();o[2].src=path+'/cornerTR.gif';
+o[3]=new Image();o[3].src=path+'/edgeL.gif';
+o[4]=new Image();o[4].src=path+'/edgeR.gif';
+o[5]=new Image();o[5].src=path+'/cornerBL.gif';
+o[6]=new Image();o[6].src=path+'/edgeB.gif';
+o[7]=new Image();o[7].src=path+'/cornerBR.gif';
+}else{
+OLbubbleImg[i]=new Image();OLbubbleImg[i].src=path+'/'+OLbTypes[i]+'.gif';}}}
+}
+
+function OLgenerateBubble(content) {
+if(!o3_bubble)return;
+if(o3_bubbletype=='roundcorners')return OLdoRoundCorners(content);
+var ar,X,Y,fc=1.0,txt,sY,bHtDiff,bPadDiff=0,bLobj,bCobj;
+var bTopPad=OLpadTop,bLeftPad=OLpadLeft;
+var bContentHt=OLcontentHeight,bHt=OLimgHeight;
+var bWd=OLimgWidth,bArwTipX=OLarwTipX,bArwTipY=OLarwTipY;
+bHtDiff=fc*bContentHt[OLbI]-(OLns4?over.clip.height:over.offsetHeight);
+if(o3_adjbubble){
+fc=OLresizeBubble(bHtDiff,0.5,fc);
+ar=OLgetHeightDiff(fc);
+bHtDiff=ar[0];
+content=ar[1];}
+if(bHtDiff>0)bPadDiff=(bHtDiff<2)?0:parseInt(0.5*bHtDiff);
+Y=(bHtDiff<0)?fc*bTopPad[OLbI]:fc*bTopPad[OLbI]+bPadDiff;
+X=fc*bLeftPad[OLbI];
+Y=Math.round(Y);
+X=Math.round(X);
+o3_width=fc*bWd[OLbI];
+OLbubbleHt=fc*bHt[OLbI];
+txt='<img src="'+OLbubbleImg[OLbI].src+'" width="'+o3_width+'" height="'
++(bHtDiff<0?OLbubbleHt-bHtDiff:OLbubbleHt)+'" />'+(OLns4?'<div id="bContent">':
+'<div id="bContent" style="position:absolute; top:'+Y+'px; left:'+X+'px; width:'
++fc*OLbContentWd[OLbI]+'px; z-index:1;">')+content+'</div>';
+OLlayerWrite(txt);
+if(OLns4){
+bCobj=over.document.layers['bContent'];
+if(typeof bCobj=='undefined')return;
+bCobj.top=Y;
+bCobj.left=X;
+bCobj.clip.width=fc*OLbContentWd[OLbI];
+bCobj.zIndex=1;}
+if(fc*bArwTipY[OLbI]<0.5*fc*bHt[OLbI])sY=fc*bArwTipY[OLbI];
+else sY= -(fc*bHt[OLbI]+20);
+o3_offsetx -=fc*bArwTipX[OLbI];
+o3_offsety +=sY;
+}
+
+function OLdoRoundCorners(content) {
+var txt,wd,ht,o=OLbubbleImg[OLbI];
+wd=(OLns4)?over.clip.width:over.offsetWidth;
+ht=(OLns4)?over.clip.height:over.offsetHeight;
+txt='<table cellpadding="0" cellspacing="0" border="0">'
++'<tr><td align="right" valign="bottom"><img src="'+o[0].src+'" width="14" height="14"'
++(OLns6?' style="display:block;"':'')+' /></td><td valign="bottom"><img src="'+o[1].src
++'" height="14" width="'+wd+'"'+(OLns6?' style="display:block;"':'')
++' /></td><td align="left" valign="bottom"><img src="'+o[2].src+'" width="14" height="14"'
++(OLns6?' style="display:block;"':'')+' /></td></tr>'
++'<tr><td align="right"><img src="'+o[3].src+'" width="14" height="'+ht+'"'
++(OLns6?' style="display:block;"':'')+' /></td><td bgcolor="#ffffcc">'+content
++'</td><td align="left"><img src="'+o[4].src+'" width="14" height="'+ht+'"'
++(OLns6?' style="display:block;"':'')+ '/></td></tr>'+'<tr><td align="right" valign="top">'
++'<img src="'+o[5].src+'" width="14" height="14" /></td><td valign="top"><img src="'+o[6].src
++'" height="14" width="'+wd+'" /></td><td align="left" valign="top"><img src="'+o[7].src
++'" width="14" height="14" /></td></tr></table>';
+OLlayerWrite(txt);
+o3_width=wd+28;
+OLbubbleHt=ht+28;
+}
+
+function OLresizeBubble(h1,dF,fold){
+var df,h2,fnew,alpha,cnt=0;
+while(cnt<2){
+df= -OLsignOf(h1)*dF;
+fnew=fold+df;
+h2=OLgetHeightDiff(fnew)[0];
+if(Math.abs(h2)<11)break;
+if(OLsignOf(h1)!=OLsignOf(h2)){
+alpha=Math.abs(h1)/(Math.abs(h1)+Math.abs(h2));
+if(h1<0)fnew=alpha*fnew+(1.0-alpha)*fold;
+else fnew=(1.0-alpha)*fnew+alpha*fold;
+}else{
+alpha=Math.abs(h1)/(Math.abs(h2)-Math.abs(h1));
+if(h1<0)fnew=(1.0+alpha)*fold-alpha*fnew;
+else fnew=(1.0+alpha)*fnew-alpha*fold;}
+fold=fnew;
+h1=h2;
+dF*=0.5;
+cnt++;}
+return fnew;
+}
+
+function OLgetHeightDiff(f){
+var lyrhtml;
+o3_width=f*OLcontentWidth[OLbI];
+lyrhtml=OLcontentSimple(o3_text);
+OLlayerWrite(lyrhtml)
+return [f*OLcontentHeight[OLbI]-((OLns4)?over.clip.height:over.offsetHeight),lyrhtml];
+}
+
+function OLsignOf(x){
+return (x<0)? -1:1;
+}
+
+OLregRunTimeFunc(OLloadBubble);
+OLregCmdLineFunc(OLparseBubble);
+
+if(OLns4)
+document.write(
+'<style type="text/css">\n<!--\n#bContent{position:absolute;left:0px;top:0px;width:1024}\n'
++'-->\n<'+'\/style>');
+OLbubblePI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_crossframe.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_crossframe.js
new file mode 100644
index 00000000..beb468fa
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_crossframe.js
@@ -0,0 +1,44 @@
+/*
+ overlibmws_crossframe.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For support of FRAME.
+ Initial: August 3, 2003 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+OLregCmds('frame');
+
+function OLparseCrossframe(pf,i,ar){
+var k=i,v;
+if(k<ar.length){
+if(ar[k]==FRAME){v=ar[++k];if(pf=='ol_')ol_frame=v;else OLoptFRAME(v);return k;}}
+return -1;
+}
+
+function OLgetFrameRef(thisFrame,ofrm){
+var i,v,retVal='';for(i=0;i<thisFrame.length;i++){if((((thisFrame[i].length>0)))&&(((OLns4))||
+((OLie4)&&(v=thisFrame[i].document.all.tags('iframe'))!=null&&v.length==0)||
+((OLns6)&&(v=thisFrame[i].document.getElementsByTagName('iframe'))!=null&&v.length==0))){
+retVal=OLgetFrameRef(thisFrame[i],ofrm);if(retVal=='')continue;}
+else if(thisFrame[i]!=ofrm)continue;retVal='['+i+']'+retVal;break;}
+return retVal;
+}
+
+function OLoptFRAME(frm){
+o3_frame=OLmkLyr('overDiv',frm)?frm:self;if(o3_frame!=self){
+var l,tFrm=OLgetFrameRef(top.frames,o3_frame),sFrm=OLgetFrameRef(top.frames,ol_frame);
+if(sFrm.length==tFrm.length) {l=tFrm.lastIndexOf('[');if(l){
+while(sFrm.substring(0,l)!=tFrm.substring(0,l))l=tFrm.lastIndexOf('[',l-1);
+tFrm=tFrm.substr(l);sFrm=sFrm.substr(l);}}var i,k,cnt=0,p='',str=tFrm;
+while((k=str.lastIndexOf('['))!= -1){cnt++;str=str.substring(0,k);}
+for(i=0;i<cnt;i++)p=p+'parent.';OLfnRef=p+'frames'+sFrm+'.';}
+}
+
+OLregCmdLineFunc(OLparseCrossframe);
+
+OLcrossframePI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_debug.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_debug.js
new file mode 100644
index 00000000..125b290d
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_debug.js
@@ -0,0 +1,120 @@
+/*
+ overlibmws_debug.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For support of the OLshowProperties() debugging function.
+ Initial: July 26, 2003 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLzIndex;
+OLregCmds('allowdebug');
+
+// DEFAULT CONFIGURATION
+if(OLud('allowdebug'))var ol_allowdebug='';
+// END CONFIGURATION
+
+var o3_allowdebug='';
+
+function OLloadDebug(){
+OLload('allowdebug');
+}
+
+function OLparseDebug(pf,i,ar){
+var k=i;
+if(ar[k]==ALLOWDEBUG){
+if(k<(ar.length-1)&&typeof ar[k+1]=='string')OLparQuo(ar[++k],pf+'allowdebug');return k;}
+return -1;
+}
+
+function OLshowProperties(){
+var ar=arguments,sho,shoS,vis,lvl=0,istrt=0,theDiv='showProps',txt='',
+fac='Verdana,Arial,Helvetica',siz=(OLns4?'1':'67%'),
+fon='><font color="#000000" face="'+fac+'" size="'+siz,
+stl=' style="font-family:'+fac+';font-size:'+siz+';',
+sty=stl+'color:#000000;',clo=(OLns4?'</font>':'');
+if(ar.length==0)return;
+if(ar.length%2&&typeof ar[0]=='string'){istrt=1;theDiv=ar[0];}
+if(!(sho=OLmkLyr(theDiv,self)))return;
+shoS=(OLns4)?sho:sho.style;
+lvl=OLgetLayerLevel(theDiv);
+if(typeof sho.position=='undefined'){
+sho.position=new OLpageLocDebug(10+lvl*20,10,1);
+if(typeof OLzIndex=='undefined')OLzIndex=OLgetDivZindex('overDiv',self);
+shoS.zIndex=OLzIndex+1+lvl;}
+txt='<table cellpadding="1" cellspacing="0" border="0" bgcolor="#000000"><tr><td>'
++'<table cellpadding="5" border="0" cellspacing="0" bgcolor="#ffffcc">'
++'<tr><td><strong><a href="javascript:OLmoveToBack(\''+theDiv+'\');" title="Move to back"'
++(OLns4?fon:stl)+'">'+theDiv+clo
++'</a></strong></td><td align="right"><strong><a href="javascript:OLcloseLayer(\''+theDiv
++'\');" title="Close Layer"'+(OLns4?fon:stl
++'background-color:#cccccc;border:1px #333369 outset;padding:0px;')+'">X'+clo
++'</a></strong></td></tr><tr><td'+(OLns4?fon:sty)+'">'+'<strong><em>Item</em></strong>'
++clo+'</td><td'+(OLns4?fon:sty)+'">'+'<strong><em>Value</em></strong>'+clo+'</td></tr>';
+for(var i=istrt;i<ar.length-1;i++)
+txt+='<tr><td align="right"'+(OLns4?fon:sty)+'">'+'<strong>'+ar[i]+':&nbsp;</strong>'
++clo+'</td><td'+(OLns4?fon:sty)+'">'+ar[++i]+clo+'</td></tr>';
+txt+='</table></td></tr></table>';
+if(OLns4){sho.document.open();sho.document.write(txt);sho.document.close();
+}else{if(OLie4&&OLieM)sho.innerHTML='';sho.innerHTML=txt;}
+OLshowAllVisibleLayers();
+}
+
+function OLgetLayerLevel(lyr){
+var i=0;
+if(typeof document.popups=='undefined'){document.popups=new Array(lyr);
+}else{var l=document.popups;for(i=0;i<l.length;i++)if(lyr==l[i])break;
+if(i==l.length)l[l.length++]=lyr;}
+return i;
+}
+
+function OLgetDivZindex(id,f){
+if(!id)id='overDiv';if(!f)f=o3_frame;
+var o=OLgetRefById(id,f.document);
+if(o){o=OLns4?o:o.style;return o.zIndex;}
+else return 1000;
+}
+
+function OLsetDebugCanShow(){
+if(o3_allowdebug!=''){
+var i,lyr,pLyr=o3_allowdebug.replace(/[ ]/ig,'').split(',');
+for(i=0;i<pLyr.length;i++){lyr=OLgetRefById(pLyr[i],self.document);
+if(lyr&&typeof lyr.position!='undefined')lyr.position.canShow=1;}}
+}
+
+function OLpageLocDebug(x,y,canShow){
+this.x=x;this.y=y;this.canShow=(canShow==null)?0:canShow;
+}
+
+function OLshowAllVisibleLayers(){
+var i,lyr,o,l=document.popups;
+for(i=0;i<l.length;i++){if((lyr=OLgetRefById(l[i],self.document))&&lyr.position.canShow){
+o=OLns4?lyr:lyr.style;OLpositionLayer(o,lyr.position.x,lyr.position.y);o.visibility='visible';}}
+}
+
+function OLpositionLayer(o,x,y){
+o.left=x+(OLie4?OLfd(self).scrollLeft:self.pageXOffset)+(OLns4?0:'px');
+o.top=y+(OLie4?OLfd(self).scrollTop:self.pageYOffset)+(OLns4?0:'px');
+}
+
+function OLcloseLayer(id){
+var lyr=OLgetRefById(id,self.document);
+if(lyr){lyr.position.canShow=0;lyr=OLns4?lyr:lyr.style;lyr.visibility='hidden';}
+}
+
+function OLmoveToBack(layer){
+var l=document.popups,lyr,o,i,x=10,dx=20,z=OLzIndex+1;if(l.length==1)return;
+if(lyr=OLgetRefById(layer,self.document)){lyr.position.x=x;o=OLns4?lyr:lyr.style;o.zIndex=z;
+for(i=0;i<l.length;i++){if(layer==l[i])continue;
+if(!(lyr=OLgetRefById(l[i],self.document))||lyr.position.canShow==0)continue;
+o=OLns4?lyr:lyr.style;o.zIndex+=1;lyr.position.x+=dx;}OLshowAllVisibleLayers();}
+}
+
+OLregRunTimeFunc(OLloadDebug);
+OLregCmdLineFunc(OLparseDebug);
+
+OLdebugPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_draggable.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_draggable.js
new file mode 100644
index 00000000..a5696ab9
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_draggable.js
@@ -0,0 +1,85 @@
+/*
+ overlibmws_draggable.js plug-in module - Copyright Foteos Macrides 2002-2007. All rights reserved.
+ For support of the DRAGGABLE feature.
+ Initial: August 24, 2002 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLdraggableCmds='draggable,dragcap,dragid';
+OLregCmds(OLdraggableCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('draggable'))var ol_draggable=0;
+if(OLud('dragcap'))var ol_dragcap=0;
+if(OLud('dragid'))var ol_dragid='';
+// END CONFIGURATION
+
+var o3_draggable=0,o3_dragcap=0,o3_dragid='',o3_dragging=0,OLdrg=null,OLmMv,
+OLcX,OLcY,OLcbX,OLcbY;function OLloadDraggable(){OLload(OLdraggableCmds);}
+function OLparseDraggable(pf,i,ar){var t=OLtoggle,k=i;if(k<ar.length){
+if(Math.abs(ar[k])==DRAGGABLE){t(ar[k],pf+'draggable');return k;}
+if(Math.abs(ar[k])==DRAGCAP){t(ar[k],pf+'dragcap');return k;}
+if(ar[k]==DRAGID){OLparQuo(ar[++k],pf+'dragid');return k;}}return -1;
+}
+
+function OLcheckDrag(){
+if(o3_draggable){if(o3_sticky&&(o3_frame==self))OLinitDrag();else o3_draggable=0;}
+}
+function OLinitDrag(){
+OLmMv=OLdw.onmousemove;o3_dragging=0;
+if(OLns4){document.captureEvents(Event.MOUSEDOWN|Event.CLICK);
+document.onmousedown=OLgrabEl;document.onclick=function(e){return routeEvent(e);}}
+else{var dvido=(o3_dragid)?OLgetRef(o3_dragid):null,capid=(OLovertwoPI&&over==over2?
+'overCap2':'overCap');if(dvido)dvido.onscroll=function(){OLdw.onmousemove=OLmMv;
+OLinitDrag();};OLdrg=(o3_cap&&o3_dragcap)?OLgetRef(capid):over;
+if(!OLdrg||!OLdrg.style)OLdrg=over;OLdrg.onmousedown=OLgrabEl;OLsetDrgCur(1);}
+}
+function OLsetDrgCur(d){if(!OLns4&&OLdrg)OLdrg.style.cursor=(d?'move':'auto');}
+
+function OLgrabEl(e){
+var e=(e||event);
+var cKy=(OLns4?e.modifiers&Event.ALT_MASK:(e.altKey||(OLop7&&e.ctrlKey)));o3_dragging=1;
+if(cKy){OLsetDrgCur(0);document.onmouseup=function(){OLsetDrgCur(1);o3_dragging=0;}
+return(OLns4?routeEvent(e):true);}
+OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);
+if(OLie4)over.onselectstart=function(){return false;}
+if(OLns4){OLcX=OLx;OLcY=OLy;document.captureEvents(Event.MOUSEUP)}else{
+OLcX=OLx-(OLns4?over.left:parseInt(over.style.left));
+OLcY=OLy-(OLns4?over.top:parseInt(over.style.top));
+if((OLshadowPI)&&bkdrop&&o3_shadow){OLcbX=OLx-(parseInt(bkdrop.style.left));
+OLcbY=OLy-(parseInt(bkdrop.style.top));}}OLdw.onmousemove=OLmoveEl;
+document.onmouseup=function(){
+if(OLie4)over.onselectstart=null;o3_dragging=0;OLdw.onmousemove=OLmMv;}
+return(OLns4?routeEvent(e):false);
+}
+
+function OLmoveEl(e){
+var e=(e||event);
+OLx=(e.pageX||e.clientX+OLfd().scrollLeft);OLy=(e.pageY||e.clientY+OLfd().scrollTop);
+if(o3_dragging){if(OLns4){over.moveBy(OLx-OLcX,OLy-OLcY);
+if(OLshadowPI&&bkdrop&&o3_shadow)bkdrop.moveBy(OLx-OLcX,OLy-OLcY);}
+else{OLrepositionTo(over,OLx-OLcX,OLy-OLcY);
+if((OLiframePI)&&OLie55&&OLifsP1)OLrepositionTo(OLifsP1,OLx-OLcX,OLy-OLcY);
+if((OLshadowPI)&&bkdrop&&o3_shadow){OLrepositionTo(bkdrop,OLx-OLcbX,OLy-OLcbY);
+if((OLiframePI)&&OLie55&&OLifsSh)OLrepositionTo(OLifsSh,OLx-OLcbX,OLy-OLcbY);}}
+if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}if(OLns4){OLcX=OLx;OLcY=OLy;}
+return false;
+}
+
+function OLclearDrag(){
+if(OLns4){document.releaseEvents(Event.MOUSEDOWN|Event.MOUSEUP|Event.CLICK);
+document.onmousedown=document.onclick=null;}else{
+if(OLdrg)OLdrg.onmousedown=null;over.onmousedown=null;OLsetDrgCur(0);}
+document.onmouseup=null;o3_dragging=0;
+}
+
+OLregRunTimeFunc(OLloadDraggable);
+OLregCmdLineFunc(OLparseDraggable);
+
+OLdraggablePI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_exclusive.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_exclusive.js
new file mode 100644
index 00000000..8caf3959
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_exclusive.js
@@ -0,0 +1,58 @@
+/*
+ overlibmws_exclusive.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For support of the EXCLUSIVE feature.
+ Initial: November 7, 2003 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLexclusiveCmds='exclusive,exclusivestatus,exclusiveoverride';
+OLregCmds(OLexclusiveCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('exclusive'))var ol_exclusive=0;
+if(OLud('exclusivestatus'))var ol_exclusivestatus='Please act on or close the open popup.';
+if(OLud('exclusiveoverride'))var ol_exclusiveoverride=0;
+// END CONFIGURATION
+
+var o3_exclusive=0,o3_exclusivestatus='',o3_exclusiveoverride=0;
+
+function OLloadExclusive(){
+OLload(OLexclusiveCmds);
+}
+
+function OLparseExclusive(pf,i,ar){
+var k=i,t=OLtoggle;
+if(k<ar.length){
+if(Math.abs(ar[k])==EXCLUSIVE){t(ar[k],pf+'exclusive');return k;}
+if(ar[k]==EXCLUSIVESTATUS){OLparQuo(ar[++k],pf+'exclusivestatus');return k;}
+if(Math.abs(ar[k])==EXCLUSIVEOVERRIDE){t(ar[k],pf+'exclusiveoverride');return k;}}
+return -1;
+}
+
+function OLisExclusive(args){
+if((args!=null)&&OLhasOverRide(args))o3_exclusiveoverride=(ol_exclusiveoverride==0)?1:0;
+else o3_exclusiveoverride=ol_exclusiveoverride;
+var rtnVal=(o3_exclusive&&!o3_exclusiveoverride&&OLshowingsticky&&
+over==OLgetRefById('overDiv'));
+if(rtnVal)self.status=o3_exclusivestatus;
+return rtnVal;
+}
+
+function OLhasOverRide(args){
+var rtnFlag=0;
+for(var i=0;i<args.length;i++){
+if(typeof args[i]=='number'&&args[i]==EXCLUSIVEOVERRIDE){
+rtnFlag=1;break;}}
+return rtnFlag;
+}
+
+OLregRunTimeFunc(OLloadExclusive);
+OLregCmdLineFunc(OLparseExclusive);
+
+OLexclusivePI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_filter.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_filter.js
new file mode 100644
index 00000000..160151f8
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_filter.js
@@ -0,0 +1,184 @@
+/*
+ overlibmws_filter.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For support of the FILTER feature.
+ Initial: November 27, 2003 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLfilterCmds='filter,fadein,fadeout,fadetime,filteropacity,filtershadow,filtershadowcolor';
+OLregCmds(OLfilterCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('filter'))var ol_filter=0;
+if(OLud('fadein'))var ol_fadein=52;
+if(OLud('fadeout'))var ol_fadeout=52;
+if(OLud('fadetime'))var ol_fadetime=800;
+if(OLud('filteropacity'))var ol_filteropacity=100;
+if(OLud('filtershadow'))var ol_filtershadow=0;
+if(OLud('filtershadowcolor'))var ol_filtershadowcolor="#cccccc";
+// END CONFIGURATION
+
+var o3_filter=0,o3_fadein=52,o3_fadeout=52,o3_fadetime=800,o3_filteropacity=100,
+o3_filtershadow=0,o3_filtershadowcolor="#cccccc",OLfiIdx= -1,OLfInc=5,OLfTmInc=40,OLfOp=1,
+OLfiId=0,OLfoId=0,OLfOp2=1,OLfiId2=0,OLfoId2=0,OLfInc2=5,OLfTmInc2=40;
+
+function OLloadFilter(){
+OLload(OLfilterCmds);
+}
+
+function OLparseFilter(pf,i,ar){
+var k=i,p=OLpar;
+if(k<ar.length){
+if(Math.abs(ar[k])==FILTER){OLtoggle(ar[k],pf+'filter');return k;}
+if(ar[k]==FADEIN){p(ar[++k],pf+'fadein');return k;}
+if(ar[k]==FADEOUT){p(ar[++k],pf+'fadeout');return k;}
+if(ar[k]==FADETIME){p(ar[++k],pf+'fadetime');return k;}
+if(ar[k]==FILTEROPACITY){p(ar[++k],pf+'filteropacity');return k;}
+if(ar[k]==FILTERSHADOW){p(ar[++k],pf+'filtershadow');return k;}
+if(ar[k]==FILTERSHADOWCOLOR){OLparQuo(ar[++k],pf+'filtershadowcolor');return k;}}
+return -1;
+}
+
+function OLhasOp(){
+var op=0;if(OLns4||OLieM)return op;var os=over.style,u='undefined';if(os)op=
+(typeof os.opacity!=u||typeof os.MozOpacity!=u||typeof os.KhtmlOpacity!=u||OLie4&&!OLopr)?1:0;
+return(op);
+}
+
+function OLinitFilterLyr(o2){
+if(!OLie55){if(!OLhasOp()){o3_filter=0;return;}if(parent!=self)o3_fadeout=0;}
+if(OLie55){o3_fadein-=1;o3_fadeout-=1;OLfiIdx= -1;
+if(over.style.filter){var p,s,ob=over.filters[28];for(p=28;p<31;p++){
+over.filters[p].enabled=0;}for(s=0;s<28;s++){if(over.filters[s].status)over.filters[s].stop();
+over.filters[s].enabled=0;}ob.enabled=0;ob.opacity=ol_filteropacity;return;}}
+if(OLie55&&(!o3_filter||(OLshadowPI&&o3_shadow)))return;if(!OLie55){
+var b=(OLshadowPI)?OLgetRef('backdrop2'):null;if(o2){if(OLfiId2)clearTimeout(OLfiId2);
+if(OLfoId2)clearInterval(OLfoId2);OLfiId2=OLfoId2=0;if(b)b.style.visibility='hidden';
+over2.style.visibility='hidden';OLopOv(ol_filteropacity,2);
+if(o3_filter&&(o3_fadein||o3_fadeout)){OLfInc2=o3_filteropacity/20;
+OLfOp2=(o3_fadein?1:o3_filteropacity);OLfTmInc2=parseInt(o3_fadetime/20);}}else{
+if(OLfiId)clearTimeout(OLfiId);if(OLfoId)clearInterval(OLfoId);OLfiId=OLfoId=0;
+if(OLshadowPI&&bkdrop)bkdrop.style.visibility='hidden';over.style.visibility='hidden';
+OLopOv(ol_filteropacity);if(o3_filter&&(o3_fadein||o3_fadeout)){OLfInc=o3_filteropacity/20;
+OLfOp=(o3_fadein?1:o3_filteropacity);OLfTmInc=parseInt(o3_fadetime/20);}}return;}
+var d=" progid:DXImageTransform.Microsoft.";over.style.filter="revealTrans()"
++d+"Fade(Overlap=1.00 enabled=0)"+d+"Inset(enabled=0)"
++d+"Iris(irisstyle=PLUS,motion=in enabled=0)"+d+"Iris(irisstyle=PLUS,motion=out enabled=0)"
++d+"Iris(irisstyle=DIAMOND,motion=in enabled=0)"+d+"Iris(irisstyle=DIAMOND,motion=out enabled=0)"
++d+"Iris(irisstyle=CROSS,motion=in enabled=0)"+d+"Iris(irisstyle=CROSS,motion=out enabled=0)"
++d+"Iris(irisstyle=STAR,motion=in enabled=0)"+d+"Iris(irisstyle=STAR,motion=out enabled=0)"
++d+"RadialWipe(wipestyle=CLOCK enabled=0)"+d+"RadialWipe(wipestyle=WEDGE enabled=0)"
++d+"RadialWipe(wipestyle=RADIAL enabled=0)"+d+"Pixelate(MaxSquare=35,enabled=0)"
++d+"Slide(slidestyle=HIDE,Bands=25 enabled=0)"+d+"Slide(slidestyle=PUSH,Bands=25 enabled=0)"
++d+"Slide(slidestyle=SWAP,Bands=25 enabled=0)"+d+"Spiral(GridSizeX=16,GridSizeY=16 enabled=0)"
++d+"Stretch(stretchstyle=HIDE enabled=0)"+d+"Stretch(stretchstyle=PUSH enabled=0)"
++d+"Stretch(stretchstyle=SPIN enabled=0)"+d+"Wheel(spokes=16 enabled=0)"
++d+"GradientWipe(GradientSize=1.00,wipestyle=0,motion=forward enabled=0)"
++d+"GradientWipe(GradientSize=1.00,wipestyle=0,motion=reverse enabled=0)"
++d+"GradientWipe(GradientSize=1.00,wipestyle=1,motion=forward enabled=0)"
++d+"GradientWipe(GradientSize=1.00,wipestyle=1,motion=reverse enabled=0)"
++d+"Zigzag(GridSizeX=8,GridSizeY=8 enabled=0)"+d+"Alpha(enabled=0)"
++d+"Dropshadow(OffX=5,OffY=5,Positive=true,enabled=0)"
++d+"Shadow(strength=5,direction=135,enabled=0)";
+}
+
+function OLchkFilter(o,o2){
+if(!o3_filter||o!=over.style||(OLie55&&OLshadowPI&&o3_shadow))return false;
+if(!OLie55){var op=o3_filteropacity;if(op>0&&op<100){if(o2)OLopOv(op,2);else OLopOv(op);}
+if(o3_fadein||o3_fadeout){var p=(o3_fadein)?(o2?OLfOp2:OLfOp):o3_filteropacity;if(o2){
+OLopOv(p,2);if(o3_fadein&&!OLfiId2)OLfadeIn2();}else{OLopOv(p);
+if(o3_fadein&&!OLfiId)OLfadeIn();}}return false;}
+var fi=o3_fadein,fo=o3_fadeout,fp=1,ft=o3_fadetime/1000;if(fi<0||fi>51){fi=fo;fp=0;}
+if(fi==51)fi=parseInt(Math.random()*50);var at=fi>-1&&fi<24&&ft>0,af=fi>23&&fi<51&&ft>0;
+OLfiIdx=(af?fi-23:0);var p,s,e,ob,t=over.filters[OLfiIdx];
+for(p=28;p<31;p++){over.filters[p].enabled=0;}for(s=0;s<28;s++){
+if(over.filters[s].status)over.filters[s].stop();over.filters[s].enabled=0;}
+for(e=1;e<3;e++){if(o3_filtershadowcolor&&o3_filtershadow==e){
+ob=over.filters[28+e];ob.enabled=1;ob.color=o3_filtershadowcolor;}}
+if(o3_filteropacity>0&&o3_filteropacity<100){ob=over.filters[28];
+ob.enabled=1;ob.opacity=o3_filteropacity;}if(fp&&(at||af)){if(at)over.filters[0].transition=fi;
+t.duration=ft;t.apply();o.visibility='visible';t.play();return true;}
+return false;
+}
+
+function OLopOv(op,o2){
+var o=(o2?over2:over),os=o.style;
+if(OLie4&&typeof os.filter=='string')os.filter='Alpha(opacity='+op+')';
+else if(typeof os.opacity!='undefined')os.opacity=op/100;
+else if(typeof os.MozOpacity!='undefined')os.MozOpacity=op/100;
+else if(typeof os.KhtmlOpacity!='undefined')os.KhtmlOpacity=op/100;
+}
+
+function OLopOvSh(op,o){
+if(!bkdrop&&!o)return;var os=(o)?o.style:bkdrop.style;
+if(OLie4&&typeof os.filter=='string')os.filter='Alpha(opacity='+op+')';
+else if(typeof os.opacity!='undefined')os.opacity=op/100;
+else if(typeof os.MozOpacity!='undefined')os.MozOpacity=op/100;
+else if(typeof os.KhtmlOpacity!='undefined')os.KhtmlOpacity=op/100;
+}
+
+function OLcleanupFilter(o,o2){
+if(!o3_filter||!over||o!=over||(OLie55&&OLshadowPI&&o3_shadow))return;if(!OLie55){
+if(o2){if(OLfiId2)clearTimeout(OLfiId2);if(OLfoId2)clearInterval(OLfoId2);
+OLfiId2=OLfoId2=0;var op=o3_filteropacity;if(op>0&&op<100)OLopOv(ol_filteropacity,2);}else{
+if(OLfiId)clearTimeout(OLfiId);if(OLfoId)clearInterval(OLfoId);OLfiId=OLfoId=0;
+var op=o3_filteropacity;if(op>0&&op<100)OLopOv(ol_filteropacity);}return;}
+if(typeof over.filters!='object')return;
+var os=over.style,fi=o3_fadein,fo=o3_fadeout;
+if(fi>=0&&fi<=51&&fo==fi){if(OLfiIdx<0)return;var t=over.filters[OLfiIdx];
+if(t.status)t.stop();os.visibility='visible';t.apply();
+os.visibility='hidden';t.play();
+}else{if(fo>=0&&fo<=51){fi=fo;if(fi==51)fi=parseInt(Math.random()*50);
+var ft=o3_fadetime;var at=fi>-1&&fi<24&&ft>0; var af=fi>23&&fi<51&&ft>0;
+OLfiIdx=(af?fi-23:0);t=over.filters[OLfiIdx];if(at||af){
+if(at)over.filters[0].transition=fi;if(t.status)t.stop();
+os.visibility='visible';t.apply();os.visibility='hidden';t.play();}}}
+OLfiIdx=-1;
+}
+
+function OLfadeIn(){
+if(OLfOp>=o3_filteropacity){if(OLshadowPI&&o3_shadow&&bkdrop)OLopOvSh(o3_shadowopacity);
+OLopOv(o3_filteropacity);clearTimeout(OLfiId);OLfiId=0;}else{OLopOv(OLfOp);
+if(!OLfOp&&over.style.visibility=='hidden')over.style.visibility='visible';var ops=0.3*OLfOp;
+if(OLfOp>40&&OLshadowPI&&o3_shadow&&bkdrop&&ops<o3_shadowopacity)OLopOvSh(ops);OLfOp+=OLfInc;
+OLfiId=setTimeout("OLfadeIn()",OLfTmInc);}
+}
+function OLfadeIn2(){
+if(OLfOp2>=o3_filteropacity){if(OLshadowPI&&o3_shadow&&bkdrop)OLopOvSh(o3_shadowopacity);
+OLopOv(o3_filteropacity,2);clearTimeout(OLfiId2);OLfiId2=0;}else{OLopOv(OLfOp2,2);
+if(!OLfOp2&&over2&&over2.style.visibility=='hidden')over2.style.visibility='visible';
+var ops=0.3*OLfOp2;if(OLfOp2>40&&OLshadowPI&&o3_shadow&&bkdrop&&ops<o3_shadowopacity)
+OLopOvSh(ops);OLfOp2+=OLfInc2;OLfiId2=setTimeout("OLfadeIn2()",OLfTmInc2);}
+}
+
+function OLchkFadeOut(o){
+if(OLie55||!o3_filter||!o3_fadeout||o!=over.style)return false;
+OLfoId=setInterval('OLfadeOut()',OLfTmInc);return true;
+}
+function OLfadeOut(){
+if(OLfOp<0){clearInterval(OLfoId);OLfoId=0;o3_fadeout=0;if(OLshadowPI&&o3_shadow&&bkdrop){
+bkdrop.style.visibility="hidden";OLcleanUpShadow();}OLhideObject(over);}else{var ops=0.3*OLfOp;
+if(OLfOp>40&&OLshadowPI&&o3_shadow&&bkdrop&&ops<o3_shadowopacity)OLopOvSh(ops);OLopOv(OLfOp);
+OLfOp-=OLfInc;}
+}
+function OLchkFadeOut2(o){
+if(OLie55||!o3_filter||!o3_fadeout||o!=over.style)return false;
+OLfoId2=setInterval('OLfadeOut2()',OLfTmInc2);return true;
+}
+function OLfadeOut2(){
+var b=(OLshadowPI)?OLgetRef('backdrop2'):null;if(OLfOp2<0){clearInterval(OLfoId2);if(b){
+b.style.visibility="hidden";if(over==over2)OLcleanUpShadow();}OLfoId2=0;OLhideObjectP2(over);
+over2.style.visibility='hidden';}else{var ops=0.3*OLfOp2;if(b){if(OLfOp2>40)OLopOvSh(ops,b);
+else OLopOvSh(1,b);}OLopOv(OLfOp2,2);OLfOp2-=OLfInc2;}
+}
+
+OLregRunTimeFunc(OLloadFilter);
+OLregCmdLineFunc(OLparseFilter);
+
+OLfilterPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_function.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_function.js
new file mode 100644
index 00000000..3de9ea0b
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_function.js
@@ -0,0 +1,44 @@
+/*
+ overlibmws_function.js plug-in module - Copyright Foteos Macrides 2002-2007. All rights reserved.
+ For support of the FUNCTION feature.
+ Initial: August 18, 2002 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+OLregCmds('function');
+
+// DEFAULT CONFIGURATION
+if(OLud('function'))var ol_function=null;
+// END CONFIGURATION
+
+var o3_function=null;
+
+function OLloadFunction(){
+OLload('function');
+}
+
+function OLparseFunction(pf,i,ar){
+var k=i,v=null;
+if(k<ar.length){
+if(ar[k]==FUNCTION){if(pf=='ol_'){if(typeof ar[k+1]!='number'){v=ar[++k];
+ol_function=(typeof v=='function'?v:null);}}
+else{OLudf=0;v=null;if(typeof ar[k+1]!='number')v=ar[++k];OLoptFUNCTION(v);}return k;}}
+return -1;
+}
+
+function OLoptFUNCTION(callme){
+o3_text=(callme?(typeof callme=='string'?(/.+\(.*\)/.test(callme)?eval(callme):
+callme):callme()):(o3_function?o3_function():'No Function'));
+return 0;
+}
+
+OLregRunTimeFunc(OLloadFunction);
+OLregCmdLineFunc(OLparseFunction);
+
+OLfunctionPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_hide.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_hide.js
new file mode 100644
index 00000000..08b9a0b4
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_hide.js
@@ -0,0 +1,81 @@
+/*
+ overlibmws_hide.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For hiding elements.
+ Initial: November 13, 2003 - Last Revised: March 10, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLhideCmds='hideselectboxes,hidebyid,hidebyidall,hidebyidns4';
+OLregCmds(OLhideCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('hideselectboxes'))var ol_hideselectboxes=0;
+if(OLud('hidebyid'))var ol_hidebyid='';
+if(OLud('hidebyidall'))var ol_hidebyidall='';
+if(OLud('hidebyidns4'))var ol_hidebyidns4='';
+// END CONFIGURATION
+
+var o3_hideselectboxes=0,o3_hidebyid='',o3_hidebyidall='',o3_hidebyidns4='',
+OLselectOK=(OLie7||OLop7||OLgek>=20030624)?1:0;
+
+function OLloadHide(){
+OLload(OLhideCmds);
+}
+
+function OLparseHide(pf,i,ar){
+var k=i,q=OLparQuo;
+if(k<ar.length){
+if(Math.abs(ar[k])==HIDESELECTBOXES){OLtoggle(ar[k],pf+'hideselectboxes');return k;}
+if(ar[k]==HIDEBYID){q(ar[++k],pf+'hidebyid');return k;}
+if(ar[k]==HIDEBYIDALL){q(ar[++k],pf+'hidebyidall');return k;}
+if(ar[k]==HIDEBYIDNS4){q(ar[++k],pf+'hidebyidns4');return k;}}
+return -1;
+}
+
+function OLchkHide(hide){
+if(OLiframePI&&OLie55)return;if(OLmodalPI&&o3_modal)o3_hideselectboxes=0;var id,o,i;
+if(o3_hidebyid&&typeof o3_hidebyid=='string'&&!(o3_hideselectboxes&&OLns6)&&!OLop7&&!OLns4){
+id=o3_hidebyid.replace(/[ ]/ig,'').split(',');for(i=0;i<id.length;i++){
+o=(OLie4?o3_frame.document.all[id[i]]:OLns6?o3_frame.document.getElementById(id[i]):null);
+if(o)o.style.visibility=(hide?'hidden':'visible');}}
+if(o3_hidebyidall&&typeof o3_hidebyidall=='string'){
+id=o3_hidebyidall.replace(/[ ]/ig,'').split(',');for(i=0;i<id.length;i++){
+o=OLgetRefById(id[i]);if(o){o=(OLns4)?o:o.style;
+o.visibility=(hide?'hidden':'visible');}}}
+if(o3_hidebyidns4&&OLns4&&typeof o3_hidebyidns4=='string'){
+id=o3_hidebyidns4.replace(/[ ]/ig,'').split(',');for(i=0;i<id.length;i++){
+o=eval('o3_frame.document.'+id[i]);if(o)o.visibility=(hide?'hidden':'visible');}}
+}
+
+function OLselectBoxes(hide,all){
+if((OLiframePI&&OLie55)||OLselectOK||OLns4)return;var sel=OLie4?
+o3_frame.document.all.tags('select'):o3_frame.document.getElementsByTagName('select'),
+px=over.offsetLeft,py=over.offsetTop,pw=over.offsetWidth,ph=over.offsetHeight,bx=px,by=py,
+bw=pw,bh=ph,sx,sy,sw,sh,i,sp,si;if((OLshadowPI)&&bkdrop&&o3_shadow){bx=bkdrop.offsetLeft;
+by=bkdrop.offsetTop;bw=bkdrop.offsetWidth;bh=bkdrop.offsetHeight;}for(i=0;i<sel.length;i++){
+sx=0;sy=0;si=0;if(sel[i].offsetParent){sp=sel[i];while(sp.offsetParent&&
+sp.offsetParent.tagName.toLowerCase()!='body'){if(sp.offsetParent.id=='overDiv'||
+sp.offsetParent.id=='overDiv2')si=1;sp=sp.offsetParent;sx+=sp.offsetLeft;sy+=sp.offsetTop;}
+sx+=sel[i].offsetLeft;sy+=sel[i].offsetTop;sw=sel[i].offsetWidth;sh=sel[i].offsetHeight;
+if(si||(!OLie4&&sel[i].size<2))continue;else if(hide){if((px+pw>sx&&px<sx+sw&&py+ph>sy&&
+py<sy+sh)||(bx+bw>sx&&bx<sx+sw&&by+bh>sy&&by<sy+sh)){if(sel[i].style.visibility!="hidden")
+sel[i].style.visibility="hidden";}}else{if(all||(!(OLovertwoPI&&over==over2)&&(px+pw<sx||
+px>sx+sw||py+ph<sy||py>sy+sh)&&(bx+bw<sx||bx>sx+sw||by+bh<sy||by>sy+sh))){
+if(sel[i].style.visibility!="visible")sel[i].style.visibility="visible";}}}}
+}
+
+function OLhideUtil(a1,a2,a3,a4,a5,a6){
+if(a4==null){OLchkHide(a1);if(o3_hideselectboxes)OLselectBoxes(a2,a3);}else{OLchkHide(a1);
+OLchkHide(a2);if(o3_hideselectboxes){OLselectBoxes(a3,a4);OLselectBoxes(a5,a6);}}
+}
+
+OLregRunTimeFunc(OLloadHide);
+OLregCmdLineFunc(OLparseHide);
+
+OLhidePI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_iframe.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_iframe.js
new file mode 100644
index 00000000..06a59114
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_iframe.js
@@ -0,0 +1,93 @@
+/*
+ overlibmws_iframe.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ Masks system controls to prevent obscuring of popops for IE v5.5 or higher.
+ Initial: October 19, 2003 - Last Revised: April 22, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+
+var OLifsP1=null,OLifsSh=null,OLifsP2=null;
+
+// IFRAME SHIM SUPPORT FUNCTIONS
+function OLinitIfs(){
+if(!OLie55)return;
+if((OLovertwoPI)&&over2&&over==over2){
+var o=o3_frame.document.all['overIframeOvertwo'];
+if(!o||OLifsP2!=o){OLifsP2=null;OLgetIfsP2Ref();}return;}
+o=o3_frame.document.all['overIframe'];
+if(!o||OLifsP1!=o){OLifsP1=null;OLgetIfsRef();}
+if((OLshadowPI)&&o3_shadow){o=o3_frame.document.all['overIframeShadow'];
+if(!o||OLifsSh!=o){OLifsSh=null;OLgetIfsShRef();}}
+}
+
+function OLsetIfsRef(o,i,z){
+o.id=i;o.src='javascript:false;';o.scrolling='no';var os=o.style;os.position='absolute';
+os.top='0px';os.left='0px';os.width='1px';os.height='1px';os.visibility='hidden';
+os.zIndex=over.style.zIndex-z;os.filter='Alpha(style=0,opacity=0)';
+}
+
+function OLgetIfsRef(){
+if(OLifsP1||!OLie55)return;
+OLifsP1=o3_frame.document.createElement('iframe');
+OLsetIfsRef(OLifsP1,'overIframe',2);
+o3_frame.document.body.appendChild(OLifsP1);
+}
+
+function OLgetIfsShRef(){
+if(OLifsSh||!OLie55)return;
+OLifsSh=o3_frame.document.createElement('iframe');
+OLsetIfsRef(OLifsSh,'overIframeShadow',3);
+o3_frame.document.body.appendChild(OLifsSh);
+}
+
+function OLgetIfsP2Ref(){
+if(OLifsP2||!OLie55)return;
+OLifsP2=o3_frame.document.createElement('iframe');
+OLsetIfsRef(OLifsP2,'overIframeOvertwo',1);
+o3_frame.document.body.appendChild(OLifsP2);
+}
+
+function OLsetDispIfs(o,w,h){
+var os=o.style;
+os.width=w+'px';os.height=h+'px';os.clip='rect(0px '+w+'px '+h+'px 0px)';
+o.filters.alpha.enabled=true;
+}
+
+function OLdispIfs(){
+if(!OLie55)return;
+var wd=over.offsetWidth,ht=over.offsetHeight;
+if(OLfilterPI&&o3_filter&&o3_filtershadow){wd+=5;ht+=5;}
+if((OLovertwoPI)&&over2&&over==over2){
+if(!OLifsP2)return;
+OLsetDispIfs(OLifsP2,wd,ht);return;}
+if(!OLifsP1)return;
+OLsetDispIfs(OLifsP1,wd,ht);
+if((!OLshadowPI)||!o3_shadow||!OLifsSh)return;
+OLsetDispIfs(OLifsSh,wd,ht);
+}
+
+function OLshowIfs(){
+if(OLifsP1){OLifsP1.style.visibility="visible";
+if((OLshadowPI)&&o3_shadow&&OLifsSh)OLifsSh.style.visibility="visible";}
+}
+
+function OLhideIfs(o){
+if(!OLie55||o!=over)return;
+if(OLifsP1)OLifsP1.style.visibility="hidden";
+if((OLshadowPI)&&o3_shadow&&OLifsSh)OLifsSh.style.visibility="hidden";
+}
+
+function OLrepositionIfs(X,Y){
+if(OLie55){if((OLovertwoPI)&&over2&&over==over2){
+if(OLifsP2)OLrepositionTo(OLifsP2,X,Y);}
+else{if(OLifsP1){OLrepositionTo(OLifsP1,X,Y);if((OLshadowPI)&&o3_shadow&&OLifsSh)
+OLrepositionTo(OLifsSh,X+o3_shadowx,Y+o3_shadowy);}}}
+}
+
+OLiframePI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_modal.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_modal.js
new file mode 100644
index 00000000..394c3dac
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_modal.js
@@ -0,0 +1,149 @@
+/*
+ overlibmws_modal.js plug-in module - Copyright Foteos Macrides 2006-2007. All rights reserved.
+ For support of the MODAL feature.
+ Initial: November 15, 2006 - Last Revised: September 22, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;var OLmodalCmds='modal,modalcolor,modalopacity';OLregCmds(OLmodalCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('modal'))var ol_modal=0;
+if(OLud('modalcolor'))var ol_modalcolor="#bbbbbb";
+if(OLud('modalopacity'))var ol_modalopacity=40;
+// END CONFIGURATION
+
+var o3_modal=0,o3_modalcolor="#bbbbbb",o3_modalopacity=40;
+
+function OLloadModal(){
+OLload(OLmodalCmds);
+}
+
+function OLparseModal(pf,i,ar){
+var k=i;if(k<ar.length){
+if(Math.abs(ar[k])==MODAL){OLtoggle(ar[k],pf+'modal');return k;}
+if(ar[k]==MODALCOLOR){OLparQuo(ar[++k],pf+'modalcolor');return k;}
+if(ar[k]==MODALOPACITY){OLpar(ar[++k],pf+'modalopacity');return k;}}
+return -1;
+}
+
+var OLmMask=null,OLmIframe=null,OLmMaskOn=0,OLmSelectOK=(OLie55||OLop7||OLgek>=20030624)?1:0,
+OLmRoot='html',OLmGotSc=0,OLmScLeft=0,OLmScTop=0,OLmKDH=null,OLmTI=new Array(),
+OLmTT=new Array("a","button","iframe","input","select","textarea"),OLmEdit=0;
+
+function OLchkModal(){
+if(o3_modal){if(o3_sticky&&!OLns4)OLmInitMask();else o3_modal=0;}
+}
+function OLclearModal(){
+if(OLmMaskOn)OLmHideMask();
+}
+
+function OLsetModalIframe(o,i,z){
+o.id=i;o.src='javascript:false;';o.scrolling='no';var os=o.style;
+os.position='absolute';os.zIndex=z;os.filter='Alpha(style=0,opacity=0)';
+}
+
+function OLmInitMask(){
+OLmRoot=(o3_frame.document.compatMode&&o3_frame.document.compatMode=='BackCompat')?'body':'html';
+var doCss=(!OLgetRef('modalMask'))?1:0,zI=(over)?over.style.zIndex-2:998;OLmMask=OLmkLyr('modalMask',o3_frame);
+OLmMask.style.zIndex=zI;if(OLie55){if(!OLgetRef('modalIframe')){OLmIframe=o3_frame.document.createElement('iframe');
+OLsetModalIframe(OLmIframe,'modalIframe',(zI-1));o3_frame.document.body.appendChild(OLmIframe);}
+else OLmIframe.style.zIndex=(zI-1);}var o=OLmMask.style,op=o3_modalopacity;op=(op<=100&&op>0?op:100);
+o.backgroundColor=o3_modalcolor;if(doCss){o.display='none';o.top='0px';o.left='0px';o.width='100%';o.height='100%';
+o.visibility='visible';if(OLie55){var oi=o3_frame.document.all['modalIframe'].style;oi.display='none';oi.top='0px';
+oi.left='0px';oi.width='100%';oi.height='100%';oi.visibility='visible';}}if(OLie4&&!OLieM&&typeof o.filter=='string'){
+o.filter='Alpha(opacity='+op+')';if(OLie55)OLmMask.filters.alpha.enabled=1;}else{op=op/100;if(typeof o.opacity!='undefined')
+o.opacity=op;else if(typeof o.MozOpacity!='undefined')o.MozOpacity=op;else if(typeof o.KhtmlOpacity!='undefined')
+o.KhtmlOpacity=op;}OLmAddEv(window,"resize",OLmHandleMask);OLmShowMask();
+}
+function OLmShowMask(){
+OLmMaskOn=1;if(!OLie4||OLop7){OLmKDH=document.onkeypress?document.onkeypress.toString():null;
+document.onkeypress=OLmKeyDownHandler;}else OLmDisableTI();OLmMask.style.display="block";
+if(OLie55)OLmIframe.style.display="block";OLmHandleMask();OLmSetMaskSize();
+if(!OLmSelectOK)OLmHideSB();
+}
+function OLmHandleMask(){
+if(OLmMaskOn){if(!OLmGotSc){OLmScLeft=parseInt((OLie4&&!OLop7?OLfd(o3_frame).scrollLeft:
+o3_frame.pageXOffset),10);OLmScTop=parseInt((OLie4&&!OLop7?OLfd(o3_frame).scrollTop:
+o3_frame.pageYOffset),10);OLmGotSc=1;}
+var root=o3_frame.document.getElementsByTagName(OLmRoot)[0];if(root.style.overflow!=
+'hidden')root.style.overflow='hidden';var scLeft=parseInt((OLie4&&!OLop7?
+OLfd(o3_frame).scrollLeft:o3_frame.pageXOffset),10),scTop=parseInt((OLie4&&!OLop7?
+OLfd(o3_frame).scrollTop:o3_frame.pageYOffset),10),o=OLmMask.style,oi=(OLie55&&OLmIframe)?
+OLmIframe.style:null;o.top=scTop+"px";o.left=scLeft+"px";o.top=scTop+"px";o.left=scLeft+"px";
+if(oi){oi.top=scTop+"px";oi.left=scLeft+"px";oi.top=scTop+"px";oi.left=scLeft+"px";}
+OLmSetMaskSize();}
+}
+function OLmSetMaskSize(){
+var root=o3_frame.document.getElementsByTagName(OLmRoot)[0],mHt,fullWd=OLmViewportWd(),
+fullHt=OLmViewportHt();if(fullHt>root.scrollHeight)mHt=fullHt;else mHt=root.scrollHeight;
+OLmMask.style.height=mHt+'px';OLmMask.style.width=root.scrollWidth+'px';if(OLie55&&OLmIframe){
+OLmIframe.style.height=mHt+'px';OLmIframe.style.width=root.scrollWidth+'px';}
+}
+function OLmHideMask(){
+OLmMaskOn=0;var root=o3_frame.document.getElementsByTagName(OLmRoot)[0];root.style.overflow=
+(OLop7?'auto':'');if(!OLie4||OLop7){document.onkeypress=OLmKDH;OLmKDH=null;}else OLmRestoreTI();
+if(!OLmSelectOK)OLmShowSB();OLmRemoveEv(window,"resize",OLmHandleMask);
+if(o3_frame.scrollTo&&OLmGotSc){o3_frame.scrollTo(OLmScLeft,OLmScTop);OLmGotSc=0;}
+if(OLgetRef('modalMask')&&OLmMask){OLmMask.style.display='none';if(OLie55)
+OLmIframe.style.display='none';}OLmEdit=0;
+}
+
+function OLmKeyDownHandler(e){
+var ev=(e||event),k=ev.keyCode,c=ev.charCode;
+if(OLmMaskOn&&!OLmEdit&&(k==9||c==32||(OLgek&&k==13)||(k>=32&&k<=40)))return false;
+}
+
+function OLmAddEv(obj,evType,fn){
+if(obj.addEventListener){obj.addEventListener(evType,fn,false);return true;}
+else if(obj.attachEvent){var r=obj.attachEvent("on"+evType,fn);return r;}else return false;
+}
+function OLmRemoveEv(obj,evType,fn){
+if(obj.removeEventListener){obj.removeEventListener(evType,fn,false);return true;}
+else if(obj.detachEvent){var r=obj.detachEvent("on"+evType,fn);return r;}else return false;
+}
+
+function OLmViewportWd(){
+if(o3_frame.innerWidth!=o3_frame.undefined){return o3_frame.innerWidth;}
+if(o3_frame.document.compatMode=='CSS1Compat'){
+return o3_frame.document.documentElement.clientWidth;}
+if(o3_frame.document.body)return o3_frame.document.body.clientWidth;return o3_frame.undefined;
+}
+function OLmViewportHt(){
+if(o3_frame.innerHeight!=o3_frame.undefined)return o3_frame.innerHeight;
+if(o3_frame.document.compatMode=='CSS1Compat')
+return o3_frame.document.documentElement.clientHeight;
+if(o3_frame.document.body)return o3_frame.document.body.clientHeight;return o3_frame.undefined;
+}
+
+function OLmHideSB(){
+var s=over.innerHTML;over.innerHTML='';var sel=OLie4?o3_frame.document.all.tags('select'):
+o3_frame.document.getElementsByTagName('select');for(i=0;i<sel.length;i++)
+sel[i].style.visibility="hidden";over.innerHTML=s;
+}
+function OLmShowSB(){
+var s=over.innerHTML;over.innerHTML='';var sel=OLie4?o3_frame.document.all.tags('select'):
+o3_frame.document.getElementsByTagName('select');for(i=0;i<sel.length;i++)
+sel[i].style.visibility="visible";over.innerHTML=s;
+}
+
+function OLmDisableTI(){
+if(OLie4&&!OLop7){var i=0;for(var j=0;j<OLmTT.length;j++){
+var tagE=o3_frame.document.getElementsByTagName(OLmTT[j]);for(var k=0;k<tagE.length; k++){
+OLmTI[i]=tagE[k].tabIndex;tagE[k].tabIndex="-1";i++;}}}
+}
+function OLmRestoreTI(){
+if(OLie4&&!OLop7){var i=0;for(var j=0;j<OLmTT.length;j++){
+var tagE=o3_frame.document.getElementsByTagName(OLmTT[j]);for(var k=0;k<tagE.length;k++){
+tagE[k].tabIndex=OLmTI[i];tagE[k].tabEnabled=true;i++;}}}
+}
+
+OLregRunTimeFunc(OLloadModal);
+OLregCmdLineFunc(OLparseModal);
+
+OLmodalPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_overtwo.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_overtwo.js
new file mode 100644
index 00000000..72ba9dfc
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_overtwo.js
@@ -0,0 +1,129 @@
+/*
+ overlibmws_overtwo.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For support of the popups-within-a-popup feature.
+ Initial: July 14, 2003 - Last Revised: July 7, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+OLregCmds('label2');
+
+// DEFAULT CONFIGURATION
+if(OLud('label2'))var ol_label2="";
+// END CONFIGURATION
+
+var o3_label2="",OLshowingsticky2=0,over2=null,OLp1over=null,bkdrop2=null,OLp1bkdrop=null,
+OLp1scroll=0,OLp1X=0,OLp1Y=0,OLp1If=null,OLp1IfShadow=null,OLp1bubbleHt=0,OLp1exclusive=0,
+OLp1modal=0,OLp1fiIdx= -1,OLp1Hover=0;
+
+function OLloadOvertwo(){
+OLload('label2');
+}
+
+function OLparseOvertwo(pf,i,ar){
+var k=i,q=OLparQuo;
+if(k<ar.length){
+if(ar[k]==LABEL2){q(ar[++k],pf+'label2');return k;}}
+return -1;
+}
+
+// PUBLIC FUNCTIONS
+function overlib2(){
+var ar=arguments;if(over2)cClick2();if(!OLshowingsticky||ar.length==0)return false;
+if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;};if(OLshowid>0){clearTimeout(OLshowid);
+OLshowid=0;}if(OLdelayid>0){clearTimeout(OLdelayid);OLdelayid=0;}
+if(typeof over.onmouseover!='undefined'&&over.onmouseover!=null){OLp1Hover=1;OLhover=0;
+over.onmouseover=null;}else OLp1Hover=0;OLp1over=null;OLp1scroll=(OLscrollPI&&o3_scroll?1:0);
+if(OLp1scroll){OLp1X=over.scroll.x;OLp1Y=over.scroll.y;OLclearScroll();o3_scroll=0;}
+if(OLfunctionPI)o3_function=ol_function;if(OLdraggablePI&&o3_draggable)OLclearDrag();
+OLp1exclusive=(OLexclusivePI&&o3_exclusive?1:0);OLp1modal=(OLmodalPI&&o3_modal?1:0);
+if((OLiframePI)&&OLifsP1){OLp1If=OLifsP1;OLifsP1=null;if(OLifsSh){OLp1IfShadow=OLifsSh;
+OLifsSh=null;}}else{OLp1If=null;OLp1IfSh=null}OLpullP1(OLo2c(1));
+if(OLbubblePI)OLp1bubbleHt=OLbubbleHt;if(OLfilterPI){OLp1fiIdx=OLfiIdx;
+if(!OLie55&&o3_filter)OLopOv(o3_filteropacity);}
+OLload(OLo2c(0));o3_label2=ol_label2;OLparseTokens('o3_',ar);OLpushP1(OLp1co);
+if(OLexclusivePI)o3_exclusive=OLp1exclusive;if(o3_decode)OLdecode();
+if(OLbubblePI)OLchkForBubbleEffect();if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;
+else if(o3_autostatus==1&&o3_text!="")o3_status=o3_text;
+if(o3_delay==0)OLdispP2();else OLdelayid=setTimeout("OLdispP2()",o3_delay);
+if(o3_status!=""){self.status=o3_status;return true;}
+else if(!(OLop7&&event&&event.type=='mouseover'))return false;
+}
+
+function nd2(){
+if(OLshowingsticky2)return false;return cClick2();
+}
+
+function cClick2(){
+if(!over2||over!=over2)return false;
+if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}
+if(OLshowid>0){clearTimeout(OLshowid);OLshowid=0;}
+if(OLp1over&&OLp1over!=OLmkLyr()){OLp1over=null;over2=null;return false;}
+OLhover=0;over.onmouseover=null;OLhideObjectP2(over);
+OLshowingsticky2=0;if(OLp1bkdrop){bkdrop=OLp1bkdrop;OLp1bkdrop=null;}
+if(OLp1over){over=OLp1over;OLp1over=null;}
+if((OLiframePI)&&OLp1If){OLifsP1=OLp1If;OLp1If=null;
+if(OLp1IfShadow){OLifsSh=OLp1IfShadow;OLp1IfShadow=null;}}
+OLpushP1(OLo2c(1));if(OLbubblePI){OLbubbleHt=OLp1bubbleHt;OLp1BubbleHt=0;}
+if(OLfilterPI)OLfiIdx=OLp1fiIdx;var o=OLgetRefById();if(o&&o==over){
+if(OLp1scroll){o3_scroll=1;OLp1scroll=0;OLchkScroll(OLp1X,OLp1Y);}else o3_scroll=0;
+if(OLdraggablePI)OLcheckDrag();if(OLp1exclusive){o3_exclusive=1;OLp1exclusive=0;}
+if(OLhidePI)OLhideUtil(0,1,1,0,0,0);
+if(o3_autostatus==2&&o3_cap!="")o3_status=o3_cap;
+else if(o3_autostatus==1&&o3_text!="")o3_status=o3_text;
+if(OLp1Hover){OLoptMOUSEOFF(1);OLp1Hover=0;OLhover=1;}
+if(o3_status!="")self.status=o3_status;}
+if(OLmodalPI&&!OLp1modal)OLclearModal();OLp1modal=0;
+return false;
+}
+
+// SUPPORT FUNCTIONS
+function OLpullP1(c){var i,m=c.split(',');for(i=0;i<m.length;i++)eval('OLp1'+m[i]+'=o3_'+m[i]);}
+function OLpushP1(c){var i,m=c.split(',');for(i=0;i<m.length;i++)eval('o3_'+m[i]+'=OLp1'+m[i]);}
+function OLo2c(a){return OLp1or2+(a?','+OLp1:'')+(OLbubblePI?','+OLbubbleCmds:'')
++(OLdraggablePI?','+OLdraggableCmds:'')+(OLfilterPI?','+OLfilterCmds:'')+(OLmodalPI?','
++OLmodalCmds:'')+(OLprintPI?','+OLprintCmds:'')+(OLshadowPI?','+OLshadowCmds:'');}
+
+function OLdispP2(){
+var o=(OLns4?over:over.style),zI=parseInt(o.zIndex)+2;
+o3_delay=0;if(!(over2=OLmkLyr('overDiv2',o3_frame,zI)))return;
+OLp1over=over;over=over2;if(OLmodalPI&&!OLp1modal)OLchkModal();if(OLbubblePI)OLbubbleHt=0;
+if(o3_frame==self){if(o3_noclose)OLoptMOUSEOFF(0);else if(o3_mouseoff)OLoptMOUSEOFF(1);}
+if(o3_sticky)OLshowingsticky2=1;OLdoLyr();
+if(o3_timeout>0){if(OLtimerid>0)clearTimeout(OLtimerid);
+OLtimerid=setTimeout("cClick2()",o3_timeout);o3_timeout=0;}
+if(o3_ref){OLrefXY=OLgetRefXY(o3_ref);if(OLrefXY[0]==null){o3_ref='';o3_midx=0;o3_midy=0;}}
+if(OLshadowPI&&o3_shadow){OLp1bkdrop=bkdrop;bkdrop=bkdrop2;OLinitShadow();}
+if(OLiframePI){OLinitIfs();OLdispIfs();}if(OLfilterPI)OLinitFilterLyr(2);
+if(OLshadowPI&&o3_shadow)OLdispShadow();OLplaceLayer();
+OLshowid=setTimeout("OLshowObjectP2(over2)",1);OLallowmove=(o3_sticky||o3_nofollow)?0:1;
+}
+
+function OLshowObjectP2(o){
+OLshowid=0;if(o)o=(OLns4?o:o.style);
+if(((OLfilterPI)&&!OLchkFilter(o,2))||!OLfilterPI)o.visibility="visible";
+if(OLshadowPI)OLshowShadow();if(OLiframePI&&OLifsP2)OLifsP2.style.visibility="visible";
+if(OLhidePI)OLhideUtil(1,1,0);if(OLdraggablePI)OLcheckDrag();
+}
+
+function OLhideObjectP2(o){
+if(OLshowid>0){clearTimeout(OLshowid);OLshowid=0;}
+if(OLtimerid>0){clearTimeout(OLtimerid);OLtimerid=0;}o3_timeout=0;
+if(OLdelayid>0){clearTimeout(OLdelayid);OLdelayid=0;}o3_delay=0;
+if(o&&o==OLgetRefById('overDiv2')){if(OLscrollPI)OLclearScroll();if(OLdraggablePI)OLclearDrag();
+if(OLfilterPI)OLcleanupFilter(o,2);if(OLshadowPI)OLhideShadow();var os=(OLns4)?o:o.style;
+if(((OLfilterPI)&&!OLchkFadeOut2(os))||!OLfilterPI){os.visibility="hidden";
+if(!OLie55||!OLfilterPI||!o3_filter||o3_fadeout<0)o.innerHTML='';}
+if(OLiframePI&&OLifsP2)OLifsP2.style.visibility="hidden";}
+OLallowmove=o3_nofollow=0;o3_label2=ol_label2;
+}
+
+OLregRunTimeFunc(OLloadOvertwo);
+OLregCmdLineFunc(OLparseOvertwo);
+
+OLovertwoPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_print.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_print.js
new file mode 100644
index 00000000..75659c46
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_print.js
@@ -0,0 +1,141 @@
+/*
+ overlibmws_print.js plug-in module - Copyright Foteos Macrides 2002-2007. All rights reserved.
+ For support of the PRINT feature.
+ Initial: April 25, 2005 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLprintCmds='print,printbutton,noautoprint,printcolor,printfont,printsize,printtext,'
++'printbuttontext,printtitle,printfontclass,printcssfile,printxml,printdoctype,printroot,'
++'printtype,printcharset,printurl,printjob',OLprJob=null;OLregCmds(OLprintCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('print'))var ol_print=0;
+if(OLud('printbutton'))var ol_printbutton=0;
+if(OLud('noautoprint'))var ol_noautoprint=0;
+if(OLud('printcolor'))var ol_printcolor="#eeeeff";
+if(OLud('printfont'))var ol_printfont="Verdana,Arial,Helvetica";
+if(OLud('printsize'))var ol_printsize=1;
+if(OLud('printtext'))var ol_printtext='Print';
+if(OLud('printbuttontext'))var ol_printbuttontext='Print';
+if(OLud('printtitle'))var ol_printtitle="Click to Print";
+if(OLud('printfontclass'))var ol_printfontclass="";
+if(OLud('printcssfile'))var ol_printcssfile="";
+if(OLud('printxml'))var ol_printxml="";
+if(OLud('printdoctype'))var ol_printdoctype=
+ '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" '
++'"http://www.w3.org/TR/html4/loose.dtd">';
+if(OLud('printroot'))var ol_printroot="<html>";
+if(OLud('printtype'))var ol_printtype="text/html";
+if(OLud('printcharset'))var ol_printcharset="iso-8859-1";
+if(OLud('printurl'))var ol_printurl="";
+if(OLud('printjob'))var ol_printjob="";
+// END CONFIGURATION
+
+var o3_print=0,o3_printbutton=0,o3_noautoprint,o3_printcolor="",o3_printfont="",o3_printsize=1,
+o3_printtext="",o3_printbuttontext="",o3_printtitle="",o3_printfontclass="",o3_printcssfile="",
+o3_printxml="",o3_printdoctype="",o3_printroot="",o3_printtype="",o3_printcharset="",
+o3_printurl="",o3_printjob="";
+
+function OLloadPrint(){
+OLload(OLprintCmds);
+}
+
+function OLparsePrint(pf,i,ar){
+var k=i,t=OLtoggle,q=OLparQuo;
+if(k<ar.length){
+if(Math.abs(ar[k])==PRINT){t(ar[k],pf+'print');return k;}
+if(Math.abs(ar[k])==PRINTBUTTON){t(ar[k],pf+'printbutton');return k;}
+if(Math.abs(ar[k])==NOAUTOPRINT){t(ar[k],pf+'noautoprint');return k;}
+if(ar[k]==PRINTCOLOR){q(ar[++k],pf+'printcolor');return k;}
+if(ar[k]==PRINTFONT){q(ar[++k],pf+'printfont');return k;}
+if(ar[k]==PRINTSIZE){q(ar[++k],pf+'printsize');return k;}
+if(ar[k]==PRINTTEXT){q(ar[++k],pf+'printtext');return k;}
+if(ar[k]==PRINTBUTTONTEXT){q(ar[++k],pf+'printbuttontext');return k;}
+if(ar[k]==PRINTTITLE){q(ar[++k],pf+'printtitle');return k;}
+if(ar[k]==PRINTFONTCLASS){q(ar[++k],pf+'printfontclass');return k;}
+if(ar[k]==PRINTCSSFILE){q(ar[++k],pf+'printcssfile');return k;}
+if(ar[k]==PRINTXML){q(ar[++k],pf+'printxml');return k;}
+if(ar[k]==PRINTDOCTYPE){q(ar[++k],pf+'printdoctype');return k;}
+if(ar[k]==PRINTROOT){q(ar[++k],pf+'printroot');return k;}
+if(ar[k]==PRINTTYPE){q(ar[++k],pf+'printtype');return k;}
+if(ar[k]==PRINTCHARSET){q(ar[++k],pf+'printcharset');return k;}
+if(ar[k]==PRINTURL){q(ar[++k],pf+'printurl');return k;}
+if(ar[k]==PRINTJOB){q(ar[++k],pf+'printjob');return k;}}
+return -1;
+}
+
+function OLprintDims(){
+if(OLhasDims(o3_printsize)){if(OLns4)o3_printsize="2";}else
+if(!OLns4){var i=parseInt(o3_printsize);o3_printsize=(i>0&&i<8)?OLpct[i]:OLpct[0];}
+}
+
+function OLchkPrint(){if(!o3_sticky)o3_print=0;else over.print=null;}
+
+function OLprintCapLGF(){
+var n=(OLovertwoPI&&over2&&over==over2)?2:1;
+return(o3_print&&!o3_printbutton?'<td align="right"><a href="javascript:'+OLfnRef
++'return OLprint('+n+');" '+(o3_printtitle?'title="'+o3_printtitle+'" ':'')+'onclick="'
++OLfnRef+'return OLprint('+n+');"'+(o3_printfontclass?' class="'+o3_printfontclass+'">':
+(OLns4?'><':'')+OLlgfUtil(0,1,'','a',o3_printcolor,o3_printfont,o3_printsize))+o3_printtext
++(o3_printfontclass?'':(OLns4?OLlgfUtil(1,1,'','a'):''))+'</a></td>':'');
+}
+
+function OLprintFgLGF(){
+var n=(OLovertwoPI&&over2&&over==over2)?2:1;return (o3_print&&(!o3_cap||o3_printbutton)?
+'<div align="center"><form action="javascript:void(0);"><input type="button" '
++(OLns4?'':'style="font-family:Verdana;font-size:11px;color:#000000;" ')+'value="'
++o3_printbuttontext+'" title="'+o3_printtitle+'" '+(OLgek?'autocomplete="off" ':'')
++'onclick="'+OLfnRef+'return OLprint('+n+');" /></form></div>':'');
+}
+
+function OLprint(n){
+if(n!=2&&OLovertwoPI&&over2&&over==over2)cClick2();
+if(!(over&&over.print))return false;if(o3_printjob){eval(o3_printjob);return false;}
+if(o3_printurl){if(!window.print||o3_noautoprint)
+alert('Print (Control-P) the OLprint Window when it appears, then close it.');OLprJob=
+window.open(o3_printurl,'OLurlJob','resizable=1,status=1,screenX=0,left=0,screenY=0,top=0');
+OLprJob.focus();if(OLprJob){if(window.print&&!o3_noautoprint){OLprJob.print();
+setTimeout("OLprJob.close();OLprJob=null;",2);}}return false;}
+var sx=(OLshadowPI&&o3_shadow?o3_shadowx:0),sy=(OLshadowPI&&o3_shadow?o3_shadowy:0),
+lm=20+(sx<0?Math.abs(sx):0),rm=20+(sx>0?sx:0),tm=20+(sy<0?Math.abs(sy):0),bm=20+(sy>0?sy:0),
+pWd=o3_width,pHt=(OLns4?over.clip.height:over.offsetHeight),iWd=pWd+lm+rm,iHt=pHt+tm+bm,
+fs=(OLfilterPI&&OLie55&&o3_filter?o3_filtershadow:0),Fn='{return false;}',
+o2=(OLovertwoPI?OLp1or2c+','+OLp1or2co+','+OLp1co+',scroll,function':'');
+t=o3_printxml+o3_printdoctype+o3_printroot+'<head><meta http-equiv="content-Type" content="'
++o3_printtype+'; charset='+o3_printcharset+'" /><title>OLprint Job</title>'
++(o3_printcssfile?'<link rel="stylesheet" type="text/css" href="'+o3_printcssfile+'" />':'')
++'<script type="text/javascript">var OLfnRef="",OLna='+o3_noautoprint+',OLo2="'+o2+'";'
++'function OLprintAndClose(){if(window.print&&!OLna){self.print();setTimeout("self.close()",2);}'
++'else{alert("Print (Control-P) the OLprint Window, then close it.");}}'
++'function OLprint(){if(window.print)self.print();}function cClick(){self.close();}'
++'function nd()'+Fn+'function overlib2()'+Fn+'function nd2()'+Fn+'if(OLo2){'
++'var i,m=OLo2.split(",");for(i=0;i<m.length;i++)eval(m[i].toUpperCase()+"="+0);}</script>'
++'</head><body onLoad="self.focus();OLprintAndClose()">'
++(sx||sy?'<div id="printBackdrop" style="position:absolute;z-index:999;visibility:visible;'
++'width:'+o3_width+(OLns4?';':'px;')+'height:'+pHt+(OLns4?';':'px;')
++(o3_shadowimage?'background-image:url('+o3_shadowimage+');':'background-color:'
++o3_shadowcolor+';')+'left:'+(lm+sx).toString()+(OLns4?';':'px;')+'top:'+(tm+sy).toString()
++(OLns4?';':'px;')+'"></div>':'')
++'<div id="overPrintDiv" style="position:absolute;z-index:1000;visibility:visible;width:'
++o3_width+(OLns4?';':'px;')+(o3_background?'background-image:url('+o3_background+');':'')
++'left:'+lm.toString()+(OLns4?';':'px;')+'top:'+tm.toString()+(OLns4?';':'px;')
++(fs?'filter:progid:DXImageTransform.Microsoft.':'')
++(fs==2?'Shadow(color=\''+o3_filtershadowcolor+'\',direction=135,strength=5);':'')
++(fs==1?'Dropshadow(color=\''+o3_filtershadowcolor+'\');':'')+'">'+over.print
++'</div></body></html>';
+OLprJob=window.open('','OLprintJob','resizable=0,width='+iWd+',height='+iHt
++',status=0,location=0,toolbar=0,menubar=0,scrolling=0,screenX=0,left=0,screenY=0,top=0');
+OLprJob.document.write(t);OLprJob.document.close();return false;
+}
+
+OLregRunTimeFunc(OLloadPrint);
+OLregCmdLineFunc(OLparsePrint);
+
+OLprintPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_regCore.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_regCore.js
new file mode 100644
index 00000000..3c079f71
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_regCore.js
@@ -0,0 +1,75 @@
+/*
+ overlibmws_regCore.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ Import this file to declare the core command constants in frame documents which do not
+ import the core module, overlibmws.js, but point to the overlib() and nd() commands in
+ another document of the frameset, e.g. parent.scene.overlib(...) and parent.scene.nd()
+ in a frame document named "scene" which does import the core module. You can then use
+ this file's OLregisterPlugins() function via a script block to declare pre-existing
+ plugin modules, or it's OLregisterCommands() function for new plugins whose
+ commands are not yet defined as string variables in this file. The order of
+ entries in those functions should parallel the order of importing the plugins.
+ Initial: August 3, 2003 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+var OLloaded=0,OLpmCnt=1,OLpMtr=new Array();
+OLregisterCommands('inarray,caparray,caption,closetext,right,left,center,autostatuscap,padx,'
++'pady,below,above,vcenter,donothing,nofollow,background,offsetx,offsety,fgcolor,bgcolor,'
++'cgcolor,textcolor,capcolor,width,wrap,wrapmax,height,border,base,status,autostatus,snapx,'
++'snapy,fixx,fixy,relx,rely,midx,midy,ref,refc,refp,refx,refy,fgbackground,bgbackground,'
++'cgbackground,fullhtml,capicon,textfont,captionfont,textsize,captionsize,timeout,delay,hauto,'
++'vauto,nojustx,nojusty,fgclass,bgclass,cgclass,capbelow,textpadding,textfontclass,'
++'captionpadding,captionfontclass,sticky,noclose,mouseoff,offdelay,closecolor,closefont,'
++'closesize,closeclick,closetitle,closefontclass,decode,label');
+
+var CSSOFF=DONOTHING,CSSCLASS=DONOTHING;
+var OLpluginBUBBLE='bubble,bubbletype,adjbubble';
+var OLpluginCROSSFRAME='frame';
+var OLpluginDEBUG='allowdebug';
+var OLpluginDRAGGABLE='draggable,dragcap,dragid';
+var OLpluginEXCLUSIVE='exclusive,exclusivestatus,exclusiveoverride';
+var OLpluginFILTER='filter,fadein,fadeout,fadetime,filteropacity,filtershadow,filtershadowcolor';
+var OLpluginFUNCTION='function';
+var OLpluginHIDE='hideselectboxes,hidebyid,hidebyidall,hidebyidns4';
+var OLpluginMODAL='modal';
+var OLpluginOVERTWO='label2';
+var OLpluginPRINT='print,printbutton,noautoprint,printcolor,printfont,printsize,printtext,'
++'printbuttontext,printtitle,printfontclass,printcssfile,printxml,printdoctype,printroot,'
++'printtype,printcharset,printurl,printjob';
+var OLpluginSCROLL='scroll';
+var OLpluginSHADOW='shadow,shadowx,shadowy,shadowcolor,shadowimage,shadowopacity';
+
+// PUBLIC FUNCTIONS
+function OLregisterCommands(cmdStr){
+if(typeof cmdStr!='string')return;
+var pM=cmdStr.split(',');
+OLpMtr=OLpMtr.concat(pM);
+for(var i=0;i<pM.length;i++)
+eval(pM[i].toUpperCase()+'='+OLpmCnt++);
+}
+
+function OLregisterPlugins(){
+var ar=arguments;
+for(var i=0;i<ar.length;i++){
+if(ar[i].toUpperCase()=='BUBBLE'){OLregisterCommands(OLpluginBUBBLE);continue;}
+if(ar[i].toUpperCase()=='CROSSFRAME'){OLregisterCommands(OLpluginCROSSFRAME);continue;}
+if(ar[i].toUpperCase()=='DEBUG'){OLregisterCommands(OLpluginDEBUG);continue;}
+if(ar[i].toUpperCase()=='DRAGGABLE'){OLregisterCommands(OLpluginDRAGGABLE);continue;}
+if(ar[i].toUpperCase()=='EXCLUSIVE'){OLregisterCommands(OLpluginEXCLUSIVE);continue;}
+if(ar[i].toUpperCase()=='FILTER'){OLregisterCommands(OLpluginFILTER);continue;}
+if(ar[i].toUpperCase()=='FUNCTION'){OLregisterCommands(OLpluginFUNCTION);continue;}
+if(ar[i].toUpperCase()=='HIDE'){OLregisterCommands(OLpluginHIDE);continue;}
+if(ar[i].toUpperCase()=='IFRAME')continue;
+if(ar[i].toUpperCase()=='MODAL'){OLregisterCommands(OLpluginMODAL);continue;}
+if(ar[i].toUpperCase()=='OVERTWO'){OLregisterCommands(OLpluginOVERTWO);continue;}
+if(ar[i].toUpperCase()=='PRINT'){OLregisterCommands(OLpluginPRINT);continue;}
+if(ar[i].toUpperCase()=='REGCORE')continue;
+if(ar[i].toUpperCase()=='SCROLL'){OLregisterCommands(OLpluginSCROLL);continue;}
+if(ar[i].toUpperCase()=='SHADOW'){OLregisterCommands(OLpluginSHADOW);continue;}}
+}
+
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_scroll.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_scroll.js
new file mode 100644
index 00000000..40f344eb
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_scroll.js
@@ -0,0 +1,70 @@
+/*
+ overlibmws_scroll.js plug-in module - Copyright Foteos Macrides 2002-2007. All rights reserved.
+ For support of the SCROLL feature.
+ Initial: October 20, 2002 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+OLregCmds('scroll');
+
+// DEFAULT CONFIGURATION
+if(OLud('scroll'))var ol_scroll=0;
+// END CONFIGURATION
+
+var o3_scroll=0,OLscrollRefresh=100;
+
+function OLloadScroll(){
+OLload('scroll');
+}
+
+function OLparseScroll(pf,i,ar){
+var k=i;
+if(k<ar.length){if(Math.abs(ar[k])==SCROLL){OLtoggle(ar[k],pf+'scroll');return k;}}
+return -1;
+}
+
+function OLchkScroll(X,Y){
+if(o3_scroll){if(!OLshowingsticky||
+(OLovertwoPI&&over==over2&&!OLshowingsticky2)||
+(OLdraggablePI&&o3_draggable&&o3_frame==self)||
+(o3_relx==null&&o3_midx==null)||(o3_rely==null&&o3_midy==null))o3_scroll=0;
+else if(typeof over.scroll=='undefined'||over.scroll.canScroll)
+over.scroll=new OLsetScroll(X,Y,OLscrollRefresh);}
+}
+
+function OLsetScroll(X,Y,refresh){
+if(o3_scroll){this.canScroll=0;this.refresh=refresh;this.x=X;this.y=Y;
+this.timer=setTimeout("OLscrollReposition()",this.refresh);}
+}
+
+function OLclearScroll(){
+if(o3_scroll){if(typeof over.scroll=='undefined'){o3_scroll=0;return;}
+over.scroll.canScroll=1;if(over.scroll.timer){
+clearTimeout(over.scroll.timer);over.scroll.timer=null;}}
+}
+
+function OLscrollReposition(){
+var o=over,oD=(OLovertwoPI&&over==over2?'overDiv2':'overDiv');
+if(o3_scroll&&o&&o==OLgetRefById(oD)){var X,Y,pgLeft,pgTop;
+pgLeft=(OLie4)?OLfd().scrollLeft:o3_frame.pageXOffset;
+pgTop=(OLie4)?OLfd().scrollTop:o3_frame.pageYOffset;
+X=(o.pageX?o.pageX:o.style.left?o.style.left:0)-pgLeft;
+Y=(o.pageY?o.pageY:o.style.top?o.style.top:0)-pgTop;
+if(X!=o.scroll.x||Y!=o.scroll.y){
+OLrepositionTo(o,pgLeft+o.scroll.x,pgTop+o.scroll.y);
+if(OLshadowPI)OLrepositionShadow(pgLeft+o.scroll.x,pgTop+o.scroll.y);
+if(OLiframePI)OLrepositionIfs(pgLeft+o.scroll.x,pgTop+o.scroll.y);
+if(OLhidePI)OLhideUtil(0,1,1,0,0,0);}
+o.scroll.timer=setTimeout("OLscrollReposition()",o.scroll.refresh);}
+}
+
+OLregRunTimeFunc(OLloadScroll);
+OLregCmdLineFunc(OLparseScroll);
+
+OLscrollPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmws_shadow.js b/src/extras/sos-html-logs/share/html/overlib/overlibmws_shadow.js
new file mode 100644
index 00000000..a85f98e0
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmws_shadow.js
@@ -0,0 +1,113 @@
+/*
+ overlibmws_shadow.js plug-in module - Copyright Foteos Macrides 2003-2007. All rights reserved.
+ For support of the SHADOW feature.
+ Initial: July 14, 2003 - Last Revised: January 1, 2007
+ See the Change History and Command Reference for overlibmws via:
+
+ http://www.macridesweb.com/oltest/
+
+ Published under an open source license: http://www.macridesweb.com/oltest/license.html
+*/
+
+OLloaded=0;
+var OLshadowCmds='shadow,shadowx,shadowy,shadowcolor,shadowimage,shadowopacity';
+OLregCmds(OLshadowCmds);
+
+// DEFAULT CONFIGURATION
+if(OLud('shadow'))var ol_shadow=0;
+if(OLud('shadowx'))var ol_shadowx=5;
+if(OLud('shadowy'))var ol_shadowy=5;
+if(OLud('shadowcolor'))var ol_shadowcolor="#666666";
+if(OLud('shadowimage'))var ol_shadowimage="";
+if(OLud('shadowopacity'))var ol_shadowopacity=60;
+// END CONFIGURATION
+
+var o3_shadow=0,o3_shadowx=5,o3_shadowy=5,o3_shadowcolor="#666666",o3_shadowimage="";
+var o3_shadowopacity=60,bkdrop=null;
+
+function OLloadShadow(){
+OLload(OLshadowCmds);
+}
+
+function OLparseShadow(pf,i,ar){
+var k=i,p=OLpar,q=OLparQuo;
+if(k<ar.length){
+if(Math.abs(ar[k])==SHADOW){OLtoggle(ar[k],pf+'shadow');return k;}
+if(ar[k]==SHADOWX){p(ar[++k],pf+'shadowx');return k;}
+if(ar[k]==SHADOWY){p(ar[++k],pf+'shadowy');return k;}
+if(ar[k]==SHADOWCOLOR){q(ar[++k],pf+'shadowcolor');return k;}
+if(ar[k]==SHADOWIMAGE){q(ar[++k],pf+'shadowimage');return k;}
+if(ar[k]==SHADOWOPACITY){p(ar[++k],pf+'shadowopacity');return k;}}
+return -1;
+}
+
+function OLdispShadow(){
+if(o3_shadow){OLgetShadowLyrRef();if(bkdrop)OLgenerateShadowLyr();}
+}
+
+function OLinitShadow(){
+if(OLie55&&OLfilterPI&&o3_filter){if(o3_shadow){o3_shadow=0;
+if(!o3_filtershadow){o3_filtershadow=2;o3_filtershadowcolor=o3_shadowcolor;}}return;}
+var o;if(!(o=OLmkLyr((OLovertwoPI&&over2&&over==over2?'backdrop2':'backdrop'),
+o3_frame,999))||bkdrop!=o){bkdrop=null;OLgetShadowLyrRef();}
+}
+
+function OLgetShadowLyrRef(){
+if(bkdrop||!o3_shadow)return;
+bkdrop=OLgetRefById((OLovertwoPI&&over2&&over==over2?'backdrop2':'backdrop'));
+if(!bkdrop){o3_shadow=0;bkdrop=null;}
+}
+
+function OLgenerateShadowLyr(){
+var wd=(OLns4?over.clip.width:over.offsetWidth),hgt=(OLns4?over.clip.height:over.offsetHeight);
+if(OLns4){bkdrop.clip.width=wd;bkdrop.clip.height=hgt;
+if(o3_shadowimage)bkdrop.background.src=o3_shadowimage;
+else{bkdrop.bgColor=o3_shadowcolor;bkdrop.zIndex=over.zIndex -1;}
+}else{var o=bkdrop.style;o.width=wd+'px';o.height=hgt+'px';
+if(o3_shadowimage)o.backgroundImage="url("+o3_shadowimage+")";
+else o.backgroundColor=o3_shadowcolor;
+o.clip='rect(0px '+wd+'px '+hgt+'px 0px)';o.zIndex=over.style.zIndex -1;
+if(o3_shadowopacity){var op=o3_shadowopacity;op=(op<=100&&op>0?op:100);
+if(OLie4&&!OLieM&&typeof o.filter=='string'){
+o.filter='Alpha(opacity='+op+')';if(OLie55&&typeof bkdrop.filters=='object')
+bkdrop.filters.alpha.enabled=1;}else{op=op/100;OLopBk(op);}}}
+}
+
+function OLopBk(op){
+var o=bkdrop.style;
+if(typeof o.opacity!='undefined')o.opacity=op;
+else if(typeof o.MozOpacity!='undefined')o.MozOpacity=op;
+else if(typeof o.KhtmlOpacity!='undefined')o.KhtmlOpacity=op;
+}
+
+function OLcleanUpShadow(){
+if(!bkdrop)return;
+if(OLns4){bkdrop.bgColor=null;bkdrop.background.src=null;}else{
+var o=bkdrop.style;o.backgroundColor='transparent';o.backgroundImage='none';
+if(OLie4&&!OLieM&&typeof o.filter=='string'){
+o.filter='Alpha(opacity=100)';if(OLie55&&typeof bkdrop.filters=='object')
+bkdrop.filters.alpha.enabled=0;}else OLopBk(1.0);
+if(OLns6){o.width=1+'px';o.height=1+'px';
+OLrepositionTo(bkdrop,o3_frame.pageXOffset,o3_frame.pageYOffset);}}
+}
+
+function OLshowShadow(){if(bkdrop&&o3_shadow){var o=(OLns4?bkdrop:bkdrop.style);
+if(!OLns4&&!OLieM&&(OLfilterPI&&o3_filter&&o3_fadein))OLopOvSh(1);o.visibility="visible";}
+}
+
+function OLhideShadow(){
+if(bkdrop&&o3_shadow){var o=OLgetRefById((OLovertwoPI&&over2&&over==over2?
+'backdrop2':'backdrop'));if(o&&o==bkdrop){var os=(OLns4?bkdrop:bkdrop.style);
+if(OLns4||OLieM||!OLfilterPI||((OLfilterPI)&&(!o3_filter||!o3_fadeout||!OLhasOp()))){
+os.visibility="hidden";OLcleanUpShadow();}}}
+}
+
+function OLrepositionShadow(X,Y){
+if(bkdrop&&o3_shadow)OLrepositionTo(bkdrop,X+o3_shadowx,Y+o3_shadowy);
+}
+
+OLregRunTimeFunc(OLloadShadow);
+OLregCmdLineFunc(OLparseShadow);
+
+OLshadowPI=1;
+OLloaded=1;
diff --git a/src/extras/sos-html-logs/share/html/overlib/overlibmwslogo.gif b/src/extras/sos-html-logs/share/html/overlib/overlibmwslogo.gif
new file mode 100644
index 00000000..f7b55084
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/overlibmwslogo.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/print.gif b/src/extras/sos-html-logs/share/html/overlib/print.gif
new file mode 100644
index 00000000..f1270a2f
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/print.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/pushpin.gif b/src/extras/sos-html-logs/share/html/overlib/pushpin.gif
new file mode 100644
index 00000000..79c0dbdb
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/pushpin.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/quotation.gif b/src/extras/sos-html-logs/share/html/overlib/quotation.gif
new file mode 100644
index 00000000..45a01edc
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/quotation.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/semitrans.gif b/src/extras/sos-html-logs/share/html/overlib/semitrans.gif
new file mode 100644
index 00000000..df1bc223
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/semitrans.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/showCalendar.gif b/src/extras/sos-html-logs/share/html/overlib/showCalendar.gif
new file mode 100644
index 00000000..68d10f1b
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/showCalendar.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/share/html/overlib/sprintf.js b/src/extras/sos-html-logs/share/html/overlib/sprintf.js
new file mode 100644
index 00000000..f5170ab3
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/sprintf.js
@@ -0,0 +1,133 @@
+ /* Function printf(format_string,arguments...)
+ * Javascript emulation of the C printf function (modifiers and argument types
+ * "p" and "n" are not supported due to language restrictions)
+ *
+ * Copyright 2003 K&L Productions. All rights reserved
+ * http://www.klproductions.com
+ *
+ * Terms of use: This function can be used free of charge IF this header is not
+ * modified and remains with the function code.
+ *
+ * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility
+ * for anything.
+ ********************************************************************************/
+function sprintf(fstring)
+ { var pad = function(str,ch,len)
+ { var ps='';
+ for(var i=0; i<Math.abs(len); i++) ps+=ch;
+ return len>0?str+ps:ps+str;
+ }
+ var processFlags = function(flags,width,rs,arg)
+ { var pn = function(flags,arg,rs)
+ { if(arg>=0)
+ { if(flags.indexOf(' ')>=0) rs = ' ' + rs;
+ else if(flags.indexOf('+')>=0) rs = '+' + rs;
+ }
+ else
+ rs = '-' + rs;
+ return rs;
+ }
+ var iWidth = parseInt(width,10);
+ if(width.charAt(0) == '0')
+ { var ec=0;
+ if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) ec++;
+ if(rs.length<(iWidth-ec)) rs = pad(rs,'0',rs.length-(iWidth-ec));
+ return pn(flags,arg,rs);
+ }
+ rs = pn(flags,arg,rs);
+ if(rs.length<iWidth)
+ { if(flags.indexOf('-')<0) rs = pad(rs,' ',rs.length-iWidth);
+ else rs = pad(rs,' ',iWidth - rs.length);
+ }
+ return rs;
+ }
+ var converters = new Array();
+ converters['c'] = function(flags,width,precision,arg)
+ { if(typeof(arg) == 'number') return String.fromCharCode(arg);
+ if(typeof(arg) == 'string') return arg.charAt(0);
+ return '';
+ }
+ converters['d'] = function(flags,width,precision,arg)
+ { return converters['i'](flags,width,precision,arg);
+ }
+ converters['u'] = function(flags,width,precision,arg)
+ { return converters['i'](flags,width,precision,Math.abs(arg));
+ }
+ converters['i'] = function(flags,width,precision,arg)
+ { var iPrecision=parseInt(precision);
+ var rs = ((Math.abs(arg)).toString().split('.'))[0];
+ if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
+ return processFlags(flags,width,rs,arg);
+ }
+ converters['E'] = function(flags,width,precision,arg)
+ { return (converters['e'](flags,width,precision,arg)).toUpperCase();
+ }
+ converters['e'] = function(flags,width,precision,arg)
+ { iPrecision = parseInt(precision);
+ if(isNaN(iPrecision)) iPrecision = 6;
+ rs = (Math.abs(arg)).toExponential(iPrecision);
+ if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
+ return processFlags(flags,width,rs,arg);
+ }
+ converters['f'] = function(flags,width,precision,arg)
+ { iPrecision = parseInt(precision);
+ if(isNaN(iPrecision)) iPrecision = 6;
+ rs = (Math.abs(arg)).toFixed(iPrecision);
+ if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs + '.';
+ return processFlags(flags,width,rs,arg);
+ }
+ converters['G'] = function(flags,width,precision,arg)
+ { return (converters['g'](flags,width,precision,arg)).toUpperCase();
+ }
+ converters['g'] = function(flags,width,precision,arg)
+ { iPrecision = parseInt(precision);
+ absArg = Math.abs(arg);
+ rse = absArg.toExponential();
+ rsf = absArg.toFixed(6);
+ if(!isNaN(iPrecision))
+ { rsep = absArg.toExponential(iPrecision);
+ rse = rsep.length < rse.length ? rsep : rse;
+ rsfp = absArg.toFixed(iPrecision);
+ rsf = rsfp.length < rsf.length ? rsfp : rsf;
+ }
+ if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
+ if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) rsf = rsf + '.';
+ rs = rse.length<rsf.length ? rse : rsf;
+ return processFlags(flags,width,rs,arg);
+ }
+ converters['o'] = function(flags,width,precision,arg)
+ { var iPrecision=parseInt(precision);
+ var rs = Math.round(Math.abs(arg)).toString(8);
+ if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
+ if(flags.indexOf('#')>=0) rs='0'+rs;
+ return processFlags(flags,width,rs,arg);
+ }
+ converters['X'] = function(flags,width,precision,arg)
+ { return (converters['x'](flags,width,precision,arg)).toUpperCase();
+ }
+ converters['x'] = function(flags,width,precision,arg)
+ { var iPrecision=parseInt(precision);
+ arg = Math.abs(arg);
+ var rs = Math.round(arg).toString(16);
+ if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
+ if(flags.indexOf('#')>=0) rs='0x'+rs;
+ return processFlags(flags,width,rs,arg);
+ }
+ converters['s'] = function(flags,width,precision,arg)
+ { var iPrecision=parseInt(precision);
+ var rs = arg;
+ if(rs.length > iPrecision) rs = rs.substring(0,iPrecision);
+ return processFlags(flags,width,rs,0);
+ }
+ farr = fstring.split('%');
+ retstr = farr[0];
+ fpRE = /^([-+ #]*)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
+ for(var i=1; i<farr.length; i++)
+ { fps=fpRE.exec(farr[i]);
+ if(!fps) continue;
+ if(arguments[i]!=null) retstr+=converters[fps[4]](fps[1],fps[2],fps[3],arguments[i]);
+ retstr += fps[5];
+ }
+ return retstr;
+ }
+/* Function sprintf() END */ \ No newline at end of file
diff --git a/src/extras/sos-html-logs/share/html/overlib/square.gif b/src/extras/sos-html-logs/share/html/overlib/square.gif
new file mode 100644
index 00000000..9d43ad7e
--- /dev/null
+++ b/src/extras/sos-html-logs/share/html/overlib/square.gif
Binary files differ
diff --git a/src/extras/sos-html-logs/sos-html-logs b/src/extras/sos-html-logs/sos-html-logs
new file mode 100755
index 00000000..aca754b5
--- /dev/null
+++ b/src/extras/sos-html-logs/sos-html-logs
@@ -0,0 +1,670 @@
+#!/usr/bin/env python
+
+#from optparse import OptionParser, Option
+import time, sys, os, glob
+import getopt, traceback
+try: import cherrypy
+except: print "python-cherrypy is missing. Exiting."; sys.exit(1)
+from cherrypy.lib import cptools
+import pdb
+
+sys.path.append("lib")
+
+import soshtmllogs.database
+from soshtmllogs.logs_abstraction import *
+
+class Root:
+ def header(self):
+ return """
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+
+<html>
+<head>
+<title></title>
+<script type="text/javascript" src="overlib/overlibmws.js"></script>
+<script type="text/javascript" src="overlib/overlibmws_draggable.js"></script>
+<script type="text/javascript" src="overlib/overlibmws_filter.js"></script>
+<script type="text/javascript" src="overlib/overlibmws_overtwo.js"></script>
+<script type="text/javascript" src="overlib/overlibmws_shadow.js"></script>
+<script type="text/javascript" src="overlib/overlibmws_scroll.js"></script>
+
+<script TYPE="text/javascript">
+<!--
+var ol_width=300;
+var ol_fgcolor='#ffffcc';
+var ol_bgcolor='#666666';
+//-->
+</script>
+
+<script type="text/javascript">
+<!--
+OLpageDefaults(BGCLASS,'olbg', CGCLASS,'olcg', FGCLASS,'olfg',
+ CAPTIONFONTCLASS,'olcap', CLOSEFONTCLASS,'olclo', TEXTFONTCLASS,'oltxt');
+
+function OLiframeContent(src, width, height, name, frameborder, scrolling) {
+ return ('<iframe src="'+src+'" width="'+width+'" height="'+height+'"'
+ +(name!=null?' name="'+name+'" id="'+name+'"':'')
+ +(frameborder!=null?' frameborder="'+frameborder+'"':'')
+ +' scrolling="'+(scrolling!=null?scrolling:'auto')+'">'
+ +'<div>[iframe not supported]</div></iframe>');
+}
+//-->
+</script>
+
+<style type="text/css">
+<!--
+.olbg {background-color:#333399;}
+.olcg {background-color:#aa0000; text-align:center;} # title
+.olcgif {background-color:#333399; text-align:center;}
+.olfg {background-color:#ecf5ff; text-align:center;} # body bg
+.olfgif {background-color:#bbddff; text-align:center;}
+.olcap {font-family:Arial; font-size:12px; font-weight:bold; color:#ffffff;}
+a.olclo {font-family:Verdana; font-size:11px; font-weight:bold; color:#ddddff;}
+a.olclo:hover {color:#ffffff;}
+.oltxt {font-family:Arial; font-size:12px; color:#000000;}
+-->
+</style>
+
+<script type="text/javascript">
+<!--
+
+function log_toggle_color(obj) {
+ if (obj.style.color == '') {
+ obj.style.color = 'red';
+ obj.style.fontWeight='bolder';
+ } else {
+ obj.style.color = '';
+ obj.style.fontWeight='normal';
+ }
+ return True;
+}
+
+function get_selection_text() {
+ var txt = '';
+ if (window.getSelection) {
+ txt = window.getSelection();
+ } else if (document.getSelection) {
+ txt = document.getSelection();
+ } else if (document.selection) {
+ txt = document.selection.createRange().text;
+ } else return;
+ return txt;
+}
+
+//-->
+</script>
+
+<style type="text/css">
+<!--
+
+body {
+ font: normal 11px auto "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+ color: #4f6b72;
+ background: #E6EAE9;
+}
+
+a {
+ color: #c75f3e;
+}
+
+#mytable {
+ width: 97%;
+ padding: 0;
+ margin: 0;
+}
+
+caption {
+ padding: 0 0 5px 0;
+ width: 97%;
+ font: italic 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+ text-align: right;
+}
+
+th {
+ font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+ color: #4f6b72;
+ letter-spacing: 2px;
+ text-transform: uppercase;
+ text-align: left;
+ padding: 6px 6px 6px 12px;
+ background: #a50000;
+ color: white;
+}
+
+th.nobg {
+ border-top: 0;
+ border-left: 0;
+ border-right: 1px solid #C1DAD7;
+ background: none;
+ color: black;
+}
+
+td {
+ border-right: 1px solid #C1DAD7;
+ border-bottom: 1px solid #C1DAD7;
+ background: #fff;
+ color: #4f6b72;
+ letter-spacing: -1px;
+ white-space:pre-wrap;
+ font-family: monospace;
+}
+
+pre {
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+}
+
+td.alt {
+ background: #ffbaba;
+ color: #797268;
+}
+
+th.newday {
+ text-align: right;
+ padding: 2px;
+}
+
+th.spec {
+ border-left: 1px solid #C1DAD7;
+ border-right: 1px solid #C1DAD7;
+ border-top: 0;
+ background: #fff;
+ font: bold 10px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+ color: #797268;
+ vertical-align: top;
+}
+
+th.specalt {
+ border-left: 1px solid #C1DAD7;
+ border-right: 1px solid #C1DAD7;
+ border-top: 0;
+ background: #cecfce;
+ font: bold 10px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+ color: #797268;
+ vertical-align: top;
+}
+
+.log_invalid_date {
+ color: dark green;
+ font-weight: bold;
+ background-color: yellow;
+}
+
+input {
+ border: 1px solid #cc0000;
+ background: red;
+ color: white;
+}
+
+#fixme { position: fixed; right: 0px; top: 0px; z-index: 2; }
+
+#navigation_enabled {
+ border: 1px solid #cc0000;
+ background: red;
+ color: white;
+ cursor: pointer;
+}
+
+#navigation_disabled {
+ border: 1px solid #cc0000;
+ background: gray;
+ color: white;
+ cursor: not-allowed;
+}
+
+.progressbar {
+ border: 2px solid black;
+ background: #ffa;
+ position: relative;
+ width: 500px;
+ height: 4.5em;
+ margin-bottom: 4px;
+ -moz-border-radius-topright: 2em;
+ -moz-border-radius-bottomright: 2em;
+}
+
+.progressbar div {
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ height: 99%;
+ background-color: #cf5;
+}
+
+.progressbar div p {
+ white-space: nowrap;
+ display: block;
+ height: 100%;
+ margin: 0;
+ padding: 0 1em;
+ line-height: 2em;
+ font-weight: bold;
+ font-size: x-large;
+}
+
+.progressbar p span {
+ display: none;
+}
+
+A:link { font-weight: normal; text-decoration: none; }
+A:visited { font-weight: normal; text-decoration: none; }
+
+-->
+</style>
+
+</head>
+<body>
+
+<a href="/">Index</a> <a href="/browse">Browse</a><p>
+
+"""
+ def footer(self):
+ return """</body></html>"""
+
+ def browse(self):
+ position = cherrypy.session.get('position')
+ dates_per_page = cherrypy.session.get('dates_per_page', 300)
+ filter_daemons = cherrypy.session.get('filter_daemons', [])
+
+ cluster = cluster_master.instance()
+
+ if position:
+ cluster.seek(position)
+ else:
+ cluster.seek_beginning()
+ position = cluster.tell()
+
+ yield self.header()
+
+ yield """<table id="mytable" cellspacing="0" summary="">
+<caption>Generated by sos-logs2html 1.0 on %s</caption>
+<ul id="toc">
+</ul>""" % (time.strftime("%B %d %H:%M:%S"))
+
+ first_date = None
+ prev_date = None
+ line = 0
+ log_lines = 0
+
+ for date in cluster:
+
+ events = myDB.execute_and_fetch("""select host, position, message, css_style from events where date = %d""" % (time.mktime(date.date)))
+
+ lines = {}
+ line_has_content = False
+
+ for host in cluster.host_names():
+ lines[host] = []
+ try:
+ for log in date[host]:
+
+ if log.daemon() in filter_daemons:
+ continue
+
+ lines[host].append(log)
+ line_has_content = True
+
+ except "Eof":
+ pass
+
+ if not line_has_content:
+ continue
+
+ if line == 0 or line % 200 == 0:
+ yield """<tr><th scope="col" abbr="Date/Time" class="nobg">Time</th>"""
+
+ for host in cluster.host_names():
+ yield """<th scope="col" abbr="%s">%s</th>""" % (host, host)
+
+ yield """</tr>"""
+
+ if line == 0 or line % 200 == 0 or time.strftime("%b %d", prev_date) != time.strftime("%b %d", date.date):
+ yield("""<tr><th scope="row" class="newday" colspan=%d>%s</th></tr>""" % (len(cluster.hosts) + 2, time.strftime("%A, %B %d", date.date)))
+
+ if line % 2 == 0: row_class = "spec"
+ else: row_class = "specalt"
+
+ color_shades = [(181,193,255), (76,102,236), (255,191,100), (255,232,200)]
+ color_shades.append(color_shades[0])
+
+ if date.date[3] in range(0, 6):
+ shade_idx, shade_div = 0, 6
+ elif date.date[3] in range(6, 12):
+ shade_idx, shade_div = 1, 12
+ elif date.date[3] in range(12, 18):
+ shade_idx, shade_div = 2, 18
+ elif date.date[3] in range(18, 24):
+ shade_idx, shade_div = 3, 24
+
+ color_hour = rgb_to_hex(color_gradient(color_shades[shade_idx], color_shades[shade_idx+1], (date.date[3] + (date.date[4]/60)) * 100 / shade_div))
+
+ yield("""<TR><th scope="row" class="%s" style="background-color: #%s"><a href="/goto/%s">%s</a></th>""" % (row_class, color_hour, time.strftime("%Y%m%d%H%M%S", date.date), time.strftime("%H:%M:%S", date.date)))
+
+ for host in cluster.host_names():
+ yield """<td style="vertical-align:top">"""
+ if lines.has_key(host):
+ for log in lines[host]:
+ css_class = None
+ css_style = None
+
+ for event_host, event_position, message, event_css_style in events:
+ if event_host == host and event_position == log.position:
+ css_style = event_css_style
+
+ yield """<span style="cursor:pointer;%s" """ % css_style
+
+ if not log.date() or log.date() != date.date:
+ yield """class="log_invalid_date" """
+
+ yield """onclick="javascript:log_toggle_color(this);">%s</span><br>""" % log.message()
+
+ yield "</td>\n"
+
+ yield "</tr>"
+
+ line += 1
+ prev_date = date.date
+
+ if not first_date:
+ first_date = date.date
+
+ if line > dates_per_page:
+ break
+
+ yield "</table>"
+
+ cherrypy.session['first_date_on_page'] = first_date
+ cherrypy.session['last_date_on_page'] = date.date
+
+ cherrypy.session['position'] = position
+ cherrypy.session['dates_per_page'] = dates_per_page
+
+ yield self.navigation()
+
+ yield self.footer()
+
+ def draw_progressbar(self, percent):
+ yield """<div class="progressbar"><div style="width: %d%%;"><p>Parsing in progress (%d%% done)</p></div></div>""" % (percent, percent)
+
+ def index(self):
+
+ cluster = cluster_master.instance()
+
+ yield self.header()
+
+ percent = 100 * cluster_master.tell_sum() / cluster_master.size()
+ if percent < 100:
+ yield self.draw_progressbar(100 * cluster_master.tell_sum() / cluster_master.size())
+
+ yield """<table id="mytable" cellspacing="0" summary="">
+<caption>Generated by sos-logs2html 1.0 on %s</caption>
+""" % (time.strftime("%B %d %H:%M:%S"))
+
+ line = 0
+ prev_date = None
+ prev_host = None
+
+ results = myDB.execute_and_fetch("""select eid, parser, date, host, message, css_style, count(message) as count_m from events group by date, host, message order by date, host""")
+
+ html_row = {}
+
+ for row in results:
+
+ date = time.localtime(row["date"])
+
+ if prev_date and prev_date != date:
+
+ if line == 0 or line % 200 == 0:
+ yield """<tr><th scope="col" abbr="Date/Time" class="nobg" style="width: 100px">Time</th>"""
+
+ for host in cluster.host_names():
+ yield """<th scope="col" abbr="%s">%s</th>""" % (host, host)
+
+ yield """</tr>"""
+
+ if line == 0 or line % 200 == 0 or time.strftime("%b %d", prev_date) != time.strftime("%b %d", prev_prev_date):
+ yield("""<tr><th scope="row" class="newday" colspan=%d>%s</th></tr>""" % (len(cluster.hosts) + 1, time.strftime("%A, %B %d", prev_date)))
+
+ if line % 2 == 0: row_class = "spec"
+ else: row_class = "specalt"
+
+ color_shades = [(181,193,255), (76,102,236), (255,191,100), (255,232,200)]
+ color_shades.append(color_shades[0])
+
+ if prev_date[3] in range(0, 6):
+ shade_idx, shade_div = 0, 6
+ elif prev_date[3] in range(6, 12):
+ shade_idx, shade_div = 1, 12
+ elif prev_date[3] in range(12, 18):
+ shade_idx, shade_div = 2, 18
+ elif prev_date[3] in range(18, 24):
+ shade_idx, shade_div = 3, 24
+
+ color_hour = rgb_to_hex(color_gradient(color_shades[shade_idx], color_shades[shade_idx+1], (prev_date[3] + (prev_date[4]/60)) * 100 / shade_div))
+
+ yield("""<TR><th scope="row" class="%s" style="background-color: #%s"><a style="font-weight:normal;color:black;font-size:larger" href="/goto/%s">%s</a></th>""" % (row_class, color_hour, time.strftime("%Y%m%d%H%M%S", prev_date), time.strftime("%H:%M:%S", prev_date)))
+
+ tab = 0
+ while tab < len(cluster.host_names()):
+ yield "<td><ul>"
+ if html_row.has_key(tab):
+ for out in html_row[tab]:
+ yield "<li>" + out + "</li>"
+ yield "</ul></td>"
+ tab+=1
+
+ line += 1
+
+ html_row = {}
+ prev_prev_date = prev_date
+
+ if not html_row.has_key(cluster.host_names().index(row["host"])):
+ html_row[cluster.host_names().index(row["host"])] = []
+
+ toadd = '<a href="javascript:void(0);"'
+ toadd+= ' name="sample%d"' % line
+ toadd+= ' id="sample" style="cursor:pointer;%s"' % row["css_style"]
+ toadd+= """ onclick="overlib(OLiframeContent('/event_tooltip?eid=%d', 510, 145, 'if1', 0, 'auto'), TEXTPADDING,6, CAPTION,'Event #%d - %s',""" % (row["eid"], row["eid"], row["message"])
+ toadd+= """ SCROLL, STICKY, BASE,2, REF,'sample%d', REFC,'UR', REFX,10, REFY,-25,""" % line
+ toadd+= """ DRAGGABLE, SHADOW, SHADOWX,3, SHADOWY,3, STATUS,'Example of Secondary Popups');" onmouseout="nd(); return false;">%s</a>""" % row["message"]
+
+ if row["count_m"] > 1:
+ toadd+= " (repeated %d times)" % row["count_m"]
+
+ html_row[cluster.host_names().index(row["host"])].append(toadd)
+
+ prev_date = date
+
+ if not len(results):
+ yield """<tr><td>No event logged yet, click <a href="/browse">here</a> to start viewing the logs or <a href="/">refresh this page</a>.</td></tr>"""
+
+ yield "</table>"
+
+ yield self.footer()
+
+ def event_tooltip(self, eid):
+ cluster = cluster_master.instance()
+
+ results = myDB.execute_and_fetch("""select eid, host, position, parser, message from events where eid = %d""" % int(eid))
+
+ yield """<html><body>"""
+
+ for row in results:
+ line = cluster.get_host(row["host"]).seek_and_read(row["position"])
+
+ parser = cluster.get_parser(row["parser"])
+ yield parser.analyse_line(log_line_class(None, row["host"], row["position"], line))
+
+ yield """</body></html>"""
+
+ cherrypy.config.update({'logDebugInfoFilter.logBuildTime': False})
+ cherrypy.config.update({'logDebugInfoFilter.logPageSize': False})
+
+ def navigation(self):
+ yield """<a href="/previous">Previous</a> <a href="/next">Next</a>"""
+
+ def previous(self):
+ cluster = cluster_master.instance()
+ dates = ksort(cluster.index)
+ idx = dates.index(cherrypy.session.get('first_date_on_page'))
+ idx = idx - cherrypy.session.get('dates_per_page')
+ if idx < 0: idx = 0
+ cherrypy.session['position'] = cluster.get_position_by_date(dates[idx])
+ raise cherrypy.HTTPRedirect('/browse')
+
+ def next(self):
+ cluster = cluster_master.instance()
+ cherrypy.session['position'] = cluster.get_position_by_date(cherrypy.session.get('last_date_on_page'))
+ raise cherrypy.HTTPRedirect('/browse')
+
+ def _goto(self, goto_date):
+ cluster = cluster_master.instance()
+
+ try:
+ cherrypy.session['position'] = cluster.get_position_by_date(time.strptime(goto_date, "%Y%m%d%H%M%S"))
+ except:
+ # some other exception, redirect to /
+ raise cherrypy.HTTPRedirect('/browse')
+
+ yield self.browse()
+
+ def default(self, url, value):
+ if url == "goto":
+ yield self._goto(value)
+
+ index.exposed = True
+ browse.exposed = True
+ previous.exposed = True
+ next.exposed = True
+ event_tooltip.exposed = True
+ default.exposed = True
+
+class Filters:
+ def index(self):
+
+ cluster = cluster_master.instance()
+
+ filter_daemons = cherrypy.session.get('filter_daemons', [])
+
+ yield cherrypy.root.header()
+
+ # Daemons to filter out
+ #
+
+ yield """<DIV>Filter out the following daemons from the output"""
+
+ yield """<FORM action="update_filters" method="POST">"""
+
+ yield """<SELECT STYLE="width: 200px" MULTIPLE="true" SIZE=10 NAME="daemons">"""
+ for daemon, occurs in cluster.daemon_log_counter:
+ if daemon in filter_daemons: continue
+ yield """<OPTION VALUE="%s">%s (%d lines)""" % (daemon, daemon, occurs)
+ yield """</SELECT>"""
+
+ yield """<SELECT STYLE="width: 200px" MULTIPLE="true" SIZE=10 NAME="daemons_ex">"""
+ for daemon in filter_daemons:
+ yield """<OPTION VALUE="%s">%s""" % (daemon, daemon)
+ yield """</SELECT>"""
+
+ yield """<INPUT TYPE="submit" VALUE="Update">"""
+
+ yield """</FORM>"""
+
+ yield """</DIV>"""
+
+ yield cherrypy.root.footer()
+
+ def update_filters(self, daemons = None, daemons_ex = None):
+ filter_daemons = cherrypy.session.get('filter_daemons', [])
+
+ if daemons:
+ if type(daemons) == str:
+ filter_daemons.append(daemons)
+ else:
+ for daemon in daemons:
+ filter_daemons.append(daemon)
+
+ if daemons_ex:
+ if type(daemons_ex) == str:
+ filter_daemons.remove(daemons_ex)
+ else:
+ for daemon in daemons_ex:
+ filter_daemons.remove(daemon)
+
+ cherrypy.session['filter_daemons'] = filter_daemons
+
+ raise cherrypy.HTTPRedirect('/')
+
+ index.exposed = True
+ update_filters.exposed = True
+
+def usage():
+ print "ciao"
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "hve:", ["help", "input="])
+except getopt.GetoptError:
+ # print help information and exit:
+ usage()
+ sys.exit(2)
+
+cmdline = {}
+cmdline["exclude_regex"] = []
+cmdline["include_regex"] = []
+cmdline["verbose"] = 0
+
+for o, a in opts:
+ if o == "-v":
+ cmdline["verbose"] += 1
+ if o in ("-h", "--help"):
+ usage()
+ sys.exit()
+ if o in ("-e", "--exclude-regex"):
+ cmdline["exclude_regex"].append(re.compile(a))
+ if o in ("-i", "--include-regex"):
+ cmdline["include_regex"].append(re.compile(a))
+
+if __name__ != "__main__":
+ sys.exit()
+
+myDB = soshtmllogs.database.myDB_class()
+
+cluster_master = cluster_class()
+
+sys.stderr.write("adding logs\n")
+for log in args:
+ cluster_master.add_log(log)
+
+from soshtmllogs.parsers.simple_parser import *
+from soshtmllogs.parsers.dmapper_parser import *
+from soshtmllogs.parsers.crazyclock_parser import *
+
+cluster_master.register_parser(simple_Parser(cluster_master, myDB))
+cluster_master.register_parser(dmapper_Parser(cluster_master, myDB))
+#cluster_master.register_parser(crazyclock_Parser(cluster_master, myDB))
+
+cluster_master.parse(threaded = True)
+
+sys.stderr.write("finished adding logs\n")
+
+if len(cluster_master.hosts) == 0:
+ sys.stderr.write("no valid data to parse was found. exiting.\n")
+ sys.exit(1)
+
+cherrypy.root = Root()
+cherrypy.root.filters = Filters()
+cherrypy.config.update({'session_filter.on': True})
+cherrypy.config.update({'autoreload.on': False})
+#cherrypy.config.update({'server.environment': "production"})
+
+cherrypy.config.update({
+ "/":{'static_filter.root': "/usr/share/sos-html-logs"},
+ "/overlib":{'static_filter.on': True, "static_filter.dir":"html/overlib"}
+})
+
+cherrypy.server.start()
+
diff --git a/src/extras/sysreport/functions b/src/extras/sysreport/functions
index 74061d18..fff52ccd 100755
--- a/src/extras/sysreport/functions
+++ b/src/extras/sysreport/functions
@@ -48,14 +48,14 @@ getpciinfo() {
catiffile() {
if [ -d $1 ]; then
- /bin/cp -x --parents -R $1 $ROOT 2>>$ROOT/$log
+ /bin/cp -p -x --parents -R $1 $ROOT 2>>$ROOT/$log
find $ROOT/$1 -type b -o -type c | xargs rm -f 2>/dev/null || :
echo -n $STATUS
echo_success
return 1
fi
if [ -f $1 ]; then
- /bin/cp --parents $1 $ROOT 2>>$ROOT/$log
+ /bin/cp -p --parents $1 $ROOT 2>>$ROOT/$log
echo -n $STATUS
echo_success
return 1
diff --git a/src/extras/sysreport/sysreport.legacy b/src/extras/sysreport/sysreport.legacy
index 4a41f803..043ba026 100755
--- a/src/extras/sysreport/sysreport.legacy
+++ b/src/extras/sysreport/sysreport.legacy
@@ -13,6 +13,7 @@ umask 0077
UTILDIR=/usr/share/sysreport
VER=`/bin/uname -r`
PATH=""
+PROGNAME="sysreport"
DATE=`/bin/date -u +%G%m%d%k%M%S | /usr/bin/tr -d ' '`
function usage {
@@ -26,17 +27,24 @@ function usage {
echo " -help : show help"
echo " -norpm : omit collecting information about currently installed packages"
echo " -dmidecode: enable dmidecode, getting information about the hardware"
+ echo " -firewall : collecting the system firewall rules"
+ echo " -home : place sysreport outputs within home directory"
+ echo " -usesysrq : collecting information about sysrq-trigger"
echo
exit 0
}
-[ $# -lt 3 ] || usage
+[ $# -lt 6 ] || usage
for i
do
case "$i" in
-help) usage;;
-norpm) NORPM=yes;;
-dmidecode) DMIDECODE=yes;;
+ -firewall) FIREWALL=yes;;
+ -home) HOMEDIR=yes;;
+ -sysrq) SYSRQ_TRIGGER=yes;;
+ -usesysrq) SYSRQ_TRIGGER=yes;;
*) usage;;
esac
done
@@ -52,8 +60,15 @@ if [ $UID != 0 ]; then
exit 1
fi
-ROOT=$HOME/sysreport-$DATE
-if ( ! mkdir $ROOT >& /dev/null ) ; then
+if [ "$HOMEDIR" = yes ] ; then
+ TEMPDIR=$HOME
+ ROOT=$HOME/sysreport-$DATE
+ /bin/mkdir $ROOT >& /dev/null
+else
+ TEMPDIR=/tmp
+ ROOT=`/bin/mktemp -dq /tmp/sysreport.XXXXXXXX`
+fi
+if [ $? != 0 ] ; then
echo "Cannot make temp dir"
exit 1
fi
@@ -197,7 +212,7 @@ STATUS="Collecting information about X:"
catiffile "/etc/X11"
STATUS="Gathering sysctl information (/proc/sys):"
-catiffile "/proc/sys"
+catifexec "/sbin/sysctl" "-a"
STATUS="Gathering sysctl information (/etc/sysctl.conf):"
catiffile "/etc/sysctl.conf"
@@ -380,6 +395,9 @@ catiffile "/etc/auto.net"
STATUS="Collecting LVM information:"
catifexec "/usr/sbin/vgdisplay" "-vv"
+STATUS="Gathering LVM setup"
+catiffile "/etc/lvm"
+
STATUS="Collecting SCSI Tape information (/etc/stinit.def)"
catiffile "/etc/stinit.def"
@@ -424,23 +442,25 @@ done
STATUS="Collecting information about ypbind configuration:"
catiffile "/etc/yp.conf"
-KERNELMIN=`/bin/uname -r | /bin/sed -e 's,[^\.]*\.,,' -e 's,\..*,,'`
-ipchainsmod=`/sbin/lsmod 2>/dev/null| /bin/grep ipchains`
-
-if [ "$KERNELMIN" -lt 3 ] || [ -n "${ipchainsmod}" ] ; then
- STATUS="Getting ipchains information:"
- catifexec "/sbin/ipchains" "-nvL"
-elif [ "$KERNELMIN" -gt 3 ]; then
- STATUS="Getting iptables information:"
- if [ -f /etc/sysconfig/iptables-config ] ; then
- catiffile "/etc/sysconfig/iptables-config"
+if [ "$FIREWALL" == "yes" ]; then
+ KERNELMIN=`/bin/uname -r | /bin/sed -e 's,[^\.]*\.,,' -e 's,\..*,,'`
+ ipchainsmod=`/sbin/lsmod 2>/dev/null| /bin/grep ipchains`
+
+ if [ "$KERNELMIN" -lt 3 ] || [ -n "${ipchainsmod}" ] ; then
+ STATUS="Getting ipchains information:"
+ catifexec "/sbin/ipchains" "-nvL"
+ elif [ "$KERNELMIN" -gt 3 ]; then
+ STATUS="Getting iptables information:"
+ if [ -f /etc/sysconfig/iptables-config ] ; then
+ catiffile "/etc/sysconfig/iptables-config"
+ fi
+ STATUS="Getting iptables information (filter):"
+ catifexec "/sbin/iptables" "-t filter -nvL"
+ STATUS="Getting iptables information (mangle):"
+ catifexec "/sbin/iptables" "-t mangle -nvL"
+ STATUS="Getting iptables information (nat):"
+ catifexec "/sbin/iptables" "-t nat -nvL"
fi
- STATUS="Getting iptables information (filter):"
- catifexec "/sbin/iptables" "-t filter -nvL"
- STATUS="Getting iptables information (mangle):"
- catifexec "/sbin/iptables" "-t mangle -nvL"
- STATUS="Getting iptables information (nat):"
- catifexec "/sbin/iptables" "-t nat -nvL"
fi
# ldap client and server config
@@ -583,23 +603,22 @@ for x in `/bin/ls -d /etc/cups/*.conf 2>/dev/null` ; do
catiffile "$x"
done
-STATUS="Getting information about printcap"
-catiffile "/etc/printcap"
-
echo
echo "Gathering information from system logs"
echo
STATUS="Collecting information from dmesg:"
catiffile "/var/log/dmesg"
-STATUS="Collecting information from /proc/sysrq-trigger"
-if [ -f /proc/sysrq-trigger -a -f /proc/sys/kernel/sysrq ] ; then
- sysr_state="$(/bin/cat /proc/sys/kernel/sysrq)"
- echo 1 > /proc/sys/kernel/sysrq
- for key in m p t ; do
- echo $key > /proc/sysrq-trigger
- done
- echo $sysr_state > /proc/sys/kernel/sysrq
+if [ "$SYSRQ_TRIGGER" == "yes" ]; then
+ STATUS="Collecting information from /proc/sysrq-trigger"
+ if [ -f /proc/sysrq-trigger -a -f /proc/sys/kernel/sysrq ] ; then
+ sysr_state="$(/bin/cat /proc/sys/kernel/sysrq)"
+ echo 1 > /proc/sys/kernel/sysrq
+ for key in m p t ; do
+ echo $key > /proc/sysrq-trigger
+ done
+ echo $sysr_state > /proc/sys/kernel/sysrq
+ fi
fi
for x in `/bin/ls /var/log/messages*` ; do
@@ -683,6 +702,7 @@ if [ -f $RHNDIR/systemid ] ; then
catiffile "$RHNDIR/systemid"
fi
fi
+
# Get hardware profile information (for verification with system state and RHN)
if [ -x /usr/share/rhn/up2date_client/hardware.py ] ; then
STATUS="Gathering RHN hardware profile information"
@@ -697,6 +717,7 @@ if [ -x /usr/bin/rhn-charsets ] ; then
catifexec "/usr/bin/rhn-charsets"
fi
+# Get SELinux information
echo
echo "Gathering information on SELinux setup"
echo
@@ -705,14 +726,25 @@ catifexec "/usr/sbin/sestatus"
catifexec "rpm" "-q -V selinux-policy-targeted"
catifexec "rpm" "-q -V selinux-policy-strict"
-cd $HOME
+cd $TEMPDIR
/bin/echo
/bin/echo -n "Please enter your case number (if you have one): "
-read CASENUM
+
+while read CASENUM
+do
+ case $CASENUM in
+ *[^0-9]*)
+ /bin/echo -e "\nError: Your input contains non-numeric characters!"
+ /bin/echo -e "Please enter your case number (if you have one): "
+ ;;
+ *)
+ break ;;
+ esac
+done
if [ ! $CASENUM ]; then
- NAME=$HOSTNAME.$DATE
+ NAME=$PROGNAME-$HOSTNAME.$DATE
else
- NAME="$HOSTNAME-$CASENUM.$DATE"
+ NAME="$PROGNAME-$HOSTNAME-$CASENUM.$DATE"
fi
/bin/rm -Rf $NAME
/bin/mv $ROOT $NAME
@@ -727,7 +759,7 @@ fi
/bin/rm -Rf $NAME
/bin/echo
-/bin/echo "Please send $HOME/${NAME}.${SUFFIX} to your support"
+/bin/echo "Please send $TEMPDIR/${NAME}.${SUFFIX} to your support"
/bin/echo "representative."
/bin/echo