<html>
<body text="#000080" bgcolor="#ffffff">
<center>
<h1>QuickTemplate</h1>
<h3>Version 2.3</h3>
<b><i>this version has some <a href="#restriction">restrictions</a> for php4.0.4pl1!</i></b><br>
<i>Author:
Stefan Bocskai <a href="mailto:stefanbocskai@hotmail.com"><stefanbocskai@hotmail.com></a></i><br>
<i>Romania,
Cluj-Napoca / France, Paris - August 2001</i>
</center>
<hr>
<br>
<h2><u>ABOUT</u></h2>
<p>
<b><i>QuickTemplate</i></b> is a PHP extension for mananging templates and
performing multi level variable and block interpolation.
</p>
<p><b>What is a template?</b><br>
A template is a text file in html format (or other). The
templates are very usefull because you can define dynamic parts of a page by
blocks and sub-blocks. So, for example, you could create tables with multiple
rows by defining the row as a block. These blocks accept variables defined by
user or predefined (as the current time or date), which are interpolated in the
context of the block when the block is parsed.
</p>
<p><b>Why QuickTemplate ?</b><br>
QuickTemplate class can manage a <b>multi-level template</b>. So, you can define blocks and multi-level nested
blocks. There is a real objectual structure of the blocks. You must specify the
root of the template (the block that contains the others blocks), but it's not
necessary to be the top level block of the template. You can choose other (lower
level) block as the root of the template, and the parsing is started from this
point.<br>
<b>Multi-level variables</b>
can be defined by the user. A variable like {MYDATA.NAME} or {MYDATA.AGE} means
that with "MYDATA" is associated an array with the keys
"NAME" or "AGE" etc.. But there are no limits to the number
of levels.<br>
Some <b>defaults
variables</b> are defined: like date, time, self url, auto-increment etc.
</p>
<p>
<a name="restriction"></a>
<b><FONT face="" size=5>§ What's new in V2.3?</b> </FONT> <br>
Some bugs are fixed, now working on PHP >= 4.0.4! <br>
For PHP version 4.0.4pl1 are some bugs, so <b>is not recomanded</b> to use with this version if your
templates file size is greater than 10k! cause of bug(?) in regex functions of this version of php!
</p><B></B><B></B>
<p><b><FONT face="" size=5>§ What's new in V2.1?</b> </FONT> <br>
Your
scripts are faster using the <b><FONT face=Courier>AssignLocal </FONT></b>method.<br>
Some
bugs are fixed, now working on PHP4.0.3! <br>
You can insert
now a file using the tag: <font face="Courier">{HTML_SOURCE:url}</font> directly in
template.
</p>
<p>
</p>
<h2><u>Public functions</u></h2>
<p>
<b><font size=+1>Constructor :</font></b>
<br><br>
<font face="courier" color="#000000" size=+1>function
QuickTemplate($misc, $part="main", $flag=0)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
The constructor of the class. This
function creates an instance of the class and initialises the
incapsulated data. For <i>external use</i> do not
use the flag <i>flag</i>, this flag is used in <i>internal call</i> of the function.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$misc</b> (<i>string</i>)<br>
The name of the
template (text file) which need to be parsed.<br><br>
<b>$part</b> (<i>string</i>)<br>
The first block of the template,
the <b>root</b> of the block's structure. It's not
necessary to be the first level block. The template is parsed begining
from this block. If not sent the default value is <i>"main"</i><br><br>
<b>$flag</b><br>
Not used.
(For internal use only)
</blockquote>
</blockquote>
<blockquote>
<b>Returned value:</b>
<blockquote>
As a constructor, returns nothing :-(^)
</blockquote>
</blockquote>
<blockquote>
<b>Example:</b>
<blockquote>
<font face="arial">
$tpl = new QuickTemplate("./templates/main.tpl",
"main");
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<b><font size=+1>Assignements :</font></b>
<br><br>
<font face="courier" color="#000000" size=+1>function
Assign($name, $val)
</font>
<br>
or<br>
<font face="courier" color="#000000" size=+1>function
Assign($name)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
There are two ways to assign a value to
the varioable that apperas in the template.<b>First</b>,by specifying the name and the value as arguments of the
function. The value could be a simple value or an array (see ex. 1).
<br>The <b>second</b> way is to
specifyng as a single argument of the this function an assciative array
(see ex. 2). The result is the same as making more simple assignements.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$name</b> (<i>string</i>)<br>
The name of the
variable that appears in the template or an associative array.<br><br>
<b>$val</b> (<i>string / array</i>)<br>
This value must be specified if the first argument <i>$name</i> is not an associative array. If this is
a simple value (string) the name $name is associated with this value. If
this argument is an associative array, a complex association is made
(see ex. 3).
</blockquote>
</blockquote>
<blockquote>
<b>Returned value:</b>
<blockquote>
Nothing to return. :-(^)
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<b>example 1:</b>
<font face="arial">
$tpl->Assign("TITLE_OF_PAGE","First
Example");
</font><br>
<b>example 2:</b>
<font face="arial">
$tpl->Assign(array("TITLE_OF_PAGE" => "Second
examle","MY_NAME" => "John Smith"));
</font><br>
<b>example 3:</b>
<font face="arial">
$tpl->Assign("FULL_NAME", array("FIRST_NAME"
=> "John", "LAST_NAME" => "Smith"));
</font><br><br>
In the last
example the variables that should appear in the template are:
{FULL_NAME.FIRST_NAME} or {FULL_NAME.LAST_NAME}. (See <b>variables</b> for more information)
</blockquote>
</blockquote><br>
<font face="courier" color="#000000" size=+1>function AssignLocal($part, $name, $val)
</font>
<br>
or<br>
<font face="courier" color="#000000" size=+1>function AssignLocal($part, $name)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
See <FONT color=#000000 face=Courier
size=4><STRONG>Assign</FONT>
</STRONG>function. Difference betwen Assign and AssignLocal is that the
last function doesn't perfrm a recursive assign, the variables are
asigned just in the specified block. Now your scripts are <STRONG>faster</STRONG> than a rocket :-)
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b></b>
<b>$part</b> (<i>string</i>)<br>
The name of the block where you want to make the
assign.<br>
</blockquote>
<blockquote>
<b>$name</b> (<i>string</i>)<br>
The name of the
variable that appears in the template or an associative array.<br><br>
<b>$val</b> (<i>string / array</i>)<br>
This value must be specified if the first argument <i>$name</i> is not an associative array. If this is
a simple value (string) the name $name is associated with this value. If
this argument is an associative array, a complex association is made
(see ex.).
</blockquote>
</blockquote>
<blockquote>
<b>Returned value:</b>
<blockquote>
Nothing to return. :-(^)
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<b>example 1:</b>
<font face="arial">
$tpl->AssignLocal("main.table.row",
"STUDENT_NAME", "Smith");
</font><br>
</blockquote>
</blockquote>
<P></P>
<p>
<b><font size=+1>Null strings and blocks:</font></b>
<br><br>
<font face="courier" color="#000000" size=+1>
function SetNullString($nullstring)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
With this function you can set the
String that will appear if any variable is empty. You can set the
"NullString" runtime as "Empty value",
"0.00%", "&nbsp;" or "";
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$nullstring</b>
(<i>string</i>)<br>
Any string
that you want.
</blockquote>
</blockquote>
<blockquote>
<b>Returned value:</b>
<blockquote>
Nothing to return. :-(^)
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
$tpl->SetNullString("");<br>
$tpl->SetNullString("0");<br>
$tpl->SetNullString("0.00%");<br>
$tpl->SetNullString("Empty value");<br>
$tpl->SetNullString("&nbsp;");<br>
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<br><br>
<font face="courier" color="#000000" size=+1>
function
DefaultBlockValue($part, $value="&nbsp;")
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
You can set the text that you want to
appear if a block of template is not parsed, is cleared or is empty.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
This is a
refernce to a block. (see <b>Block Reference</b> for
more info.)<br>
<b>$value</b> (<i>string</i>)<br>
The text that
will appear if the conntent of block is empty.
</blockquote>
</blockquote>
<blockquote>
<b>Returned value:</b>
<blockquote>
Nothing to return. :-(^)
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
$tpl->DefaultBlockValue("main.table.rows", "There
are no rows!");<br>
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<b><font size=+1>Resetting the blocks:</font></b>
<br><br>
<font face="courier" color="#000000" size=+1>
function
Reset($part)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
This function sets to empty the text
associated with a block; There's no need to Reset a unparsed block.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
$part is a
refference to a block (See <b>Block Refference</b>
for more info.)
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
$tpl->Reset("main.table.rows");<br>
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<b><font size=+1>Auto-increment:</font></b>
<br><br>
<font face="courier" color="#000000" size=+1>
function
SetAutoincrement($part, $start_value, $increment=1)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
Sets the start value and the increment
value of the auto-increment variable of the block. (see <b>Defaults variables</b> for more details)
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
$part is a
refference to a block (See <b>Block Refference</b>
for more info.)<br><br>
<b>$start_value</b> (<i>integer</i>)<br>
Value from which start the
incrementation of specified block.
<b>$increment</b>
(<i>integer</i>)<br>
Value with
wich is incremented the auto-increment variable.
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
$tpl->SetAutoincrement("main.table.rows",1);</font><br>
That means that the incrementation begin with 1
(each value encreased with 1 by default)<br><br>
<font face="arial">
$tpl->SetAutoincrement("main.table.rows",0,100);</font><br>
That means that the incrementation begin with 0
(each value encreased with 100)<br><br>
</blockquote>
</blockquote>
<P></P>
<p>
<br><br>
<font face="courier" color="#000000" size=+1>
function
GetAutoincrement($part)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
Gets the current value of the
incrementation. (see <b>Defaults variables</b> for
more details)
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
$part is a
refference to a block (See <b>Block Refference</b>
for more info.)<br><br>
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
$increment_value =
$tpl->GetAutoincrement("main.table.rows");<br>
</font>The function will return the current value of
incrementation for specified block.
</blockquote>
</blockquote>
<P></P>
<p>
<b><font size=+1>Parse:</font></b>
<br><br>
<font face="courier" color="#000000" size=+1>
function parse($part)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
This function replaces the current
values of the variables of a block, and the child blocks; the results
are stored into a value associated with the block (in append mode).
After parsing a block all of associated values of his child-blocks are
reseted. If any child-block has an empty value associated it is replaced
with the value set for this block by
<i>DefaultBlockValue</i> function. Any other value from a block that
is not a child-block is replaced with the current setting of <i>NullString</i>
<br><b>TODO: </b>a specific "NullString" for
every variable of the template.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
$part is a
refference to a block (See <b>Block Refference</b>
for more info.)
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
This example creates from a template a
page that contains two tables with 2 and 3 rows.
<font face="arial">
<br>... assignements ... <br>
$tpl->parse("main.table.rows"); //first
row of first table<br>
... assignements ... <br>
$tpl->parse("main.table.rows");
//second row of first table<br>
$tpl->parse("main.table"); //parsing first table <br>
... assignements ... <br>
$tpl->parse("main.table.rows"); //firs row of second
table<br>
... assignements ... <br>
$tpl->parse("main.table.rows"); //second row of second
table<br>
... assignements ... <br>
$tpl->parse("main.table.rows"); //third row of second
table<br>
$tpl->parse("main.table");
//parsing second table <br>
$tpl->parse("main");<br>
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<br><br>
<font face="courier" color="#000000" size=+1>
function Parsed($part)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
<b>Parsed</b>
returns <b>true</b> if the specified block was
already parsed, otherwise returns <b>false</b>.
Parse returns <b>false</b> if his parent was parsed
before the call of this function. Returns <b>false</b> if the block was reseted.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
$part is a
refference to a block (See <b>Block Refference</b>
for more info.)
</blockquote>
</blockquote>
<b>Returns:</b>
<blockquote>
The function returns <b>TRUE</b> or <b>FALSE</b>.
</blockquote>
<BLOCKQUOTE></BLOCKQUOTE>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
if
($tpl->Parsed("main.table.rows");<br>
$tpl->Parse("main.table.error");
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<b><font size=+1>Printing templates / blocks:</font></b>
<br><br>
<font face="courier" color="#000000" size=+1>
function quickText($part)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
<b>quickText</b>
returns the content of a value associated with a specified block by <i>$part</i>. You can refer directly to a sub-block or
to the main block of the template. The function is usually used after
the block is parsed at least once. If the value is empty the result is
not affected by the value set with <i>DefaultBlockValue</i> function.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
$part is a
refference to a block (See <b>Block Refference</b>
for more info.)
</blockquote>
</blockquote>
<b>Returns:</b>
<blockquote>
The function returns the current content of
the value associated with the block.
</blockquote>
<BLOCKQUOTE></BLOCKQUOTE>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
echo $tpl->quickText("main.table.rows");<br>
echo $tpl->quickText("main");<br>
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<br><br>
<font face="courier" color="#000000" size=+1>
function
quickPrint($part)
</font>
<br>
<blockquote>
<b>Description:</b>
<blockquote>
<b>quickPrint</b>
print the result of quickText of a specified block. See <i>quickText</i>.
</blockquote>
</blockquote>
<blockquote>
<b>Parameters:</b>
<blockquote>
<b>$part</b> (<i>string</i>)<br>
$part is a
refference to a block (See <b>Block Refference</b>
for more info.)
</blockquote>
</blockquote>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
$tpl->quickPrint("main.table.rows");<br>
$tpl->quickPrint("main");<br>
</font>
</blockquote>
</blockquote>
<P></P>
<p>
<b><font size=+1>Variables:</font></b>
<br><br>
<blockquote>
The <i>variables</i> of
a template must be between brackets (<b>ex.:</b>"{TITLE}"). Allowed chars for the name of a variable
are:
<b>a-z, A-Z, 0-9, _</b>.<br>But
there are some new rules for this class. If the variable is associated with
a <b>simple value</b> (<i>string,
number</i>) the variable appears in the template between breackets:
<blockquote>{TITLE_OF_THE_PAGE}</blockquote>There are no
limits of the lenght of a variable name.<br>
<br>
If with a variable is associated an <b>array</b> then the variable cannot appear in the template. But here are
the best point: you can refer directly the key of the array in the template.
So, we made the next assign :
<blockquote>
$data = array("NAME" =>
"John Smith", "AGE" => 23, "ADDRESS"
=> "Romania ...");<br>
$tpl->Assign("MYDATA", $data);<br>
<br>
You can use now in the template this
variables:<br>
{MYDATA.NAME}<br>
{MYDATA.AGE}<br>
{MYDATA.ADDRESS}<br>
</blockquote>
</blockquote>
<blockquote>
You can insert a other file by using the
following tag: {HTML_SOURCE: <EM>url</EM>} where the url could be a local
file (relative or absolute path) or a url like " http://www.bebe.home.ro/" etc...<br>
<b>NOTE:</b> Any file included are not parsed by QuickTemplate!
</blockquote>
<blockquote>
There are some default values. This values
are prefixed by "DEFAULTS". For now are available the following
values:
<li>{DEFAULTS.DATE}
<li>{DEFAULTS.TIME}
<li>{DEFAULTS.SELFURL}
<li>{DEFAULTS.AUTOINCREMENT} (see <b>Auto-increment</b>)
<li>{DEFAULTS.VERSION} // Version of class
<br>
<i>(I'm wainting for any other
suggestions ...)</i></li>
</blockquote>
<P></P>
<p>
<b><font size=+1>Block Reference:</font></b>
<br><br>
<blockquote>
Any block can be refered directly. Let's say
that a block named <b>"row"</b> is a child of
a block <b>"table"</b> and this block is a
child of the block named <b>"main"</b>. We can
refer now the row block by the following string
<b>"main.table.row"</b>. If the reference string is not
correctly formated the function that processes the refernce will verify the
structure and will return an error.
<br>
<blockquote>
<b>Examples:</b>
<blockquote>
<font face="arial">
$tpl->SetAutoincrement("main.table.rows",
1,10);<br>
$tpl->parse("main.table.rows");<br>
$tpl->quickPrint("main.table.rows");<br>
</font>
</blockquote>
</blockquote>
</blockquote>
<P></P>
<hr>
<p>
<b><font size=+1>Short Example:</font></b>
<br><br>
<blockquote>
<b>The Template :</b><i>(file name: first_example.tpl)</i>
<blockquote>
<pre><!-- BEGIN BLOCK: main -->
{HTML_SOURCE: some/local/directory/header.html}
{HTML_SOURCE: http://server/some/remote/directory/page.html}
<h1>This is a test of {DEFAULTS.VERSION}.Author: {MYNAME}</h1>
The location of this file is: {DEFAULTS.SELFURL}<br>
<hr>
<!-- BEGIN BLOCK: table -->
<table border="1">
<tr>
<td>Crt.no.</td><td>Name</td>
<td>Mark</td><td>Class room</td>
</tr>
<!-- BEGIN BLOCK: row -->
<tr>
<td>{DEFAULTS.AUTOINCREMENT}</td>
<td>{DATA.NAME}</td>
<td align="right">{DATA.MARK}</td>
<td>{CLASSROOM}</td>
</tr>
<!-- END BLOCK: row -->
<!-- BEGIN BLOCK: error -->
<tr><td colspan="4"><font color="red">
No students in class {CLASSROOM}
</font></td></tr>
<!-- END BLOCK: error -->
</table>
<!-- END BLOCK: table -->
<p align="right">
Current time <b>{DEFAULTS.TIME}</b><br>
Date: <b>{DEFAULTS.DATE}</b><br>
<p>
{HTML_SOURCE: some/local/directory/footer.html}
<!-- END BLOCK: main -->
</pre>
</blockquote>
<b>The source file :</b>
<blockquote>
<pre><?
require ("class.QuickTemplate.php3");
$tpl = new QuickTemplate("first_example.tpl");
$MARKS["John"] = 10;
$MARKS["Michael"] = 9;
$MARKS["Bob"] = 7;
$MARKS["Robert"] = 8;
$MARKS["Jane"] = 7;
$MARKS["Alice"] = 9;
$MARKS["David"] = 10;
$MARKS["James"] = 8;
$MARKS["Toni"] = 7;
$MARKS["Bebe"] = 9;
$CLASSES["101A"] = array("John", "Robert", "Jane");
$CLASSES["101B"] = array("Bob", "Alice", "Bebe", "Toni");
$CLASSES["100C"] = array("Michael", "David", "James");
$CLASSES["100D"] = array();
$tpl->SetNullString(" <b>-</b>");
$tpl->SetAutoincrement("main.table.row", 1);
$tpl->Assign("MYNAME", "Stefan Bocskai");
while (list($Class, $Members) = each($CLASSES))
{
$tpl->Assign("CLASSROOM",$Class);
if (gettype($Members) == "array")
while (list($k, $member) = each($Members))
{
$MEMBERDATA = array(NAME => $member,
MARK => $MARKS[$member]);
$tpl->AssignLocal("main.table.row", "DATA", $MEMBERDATA);
$tpl->parse("main.table.row");
}
if (!$tpl->Parsed("main.table.row"))
$tpl->parse("main.table.error");
$tpl->parse("main.table");
}
$tpl->parse("main");
$tpl->quickPrint("main");
?>
</pre>
</blockquote>
</blockquote>
<P></P>
<blockquote>
<b>Results: </b>
<blockquote>
<h1>This is a test of QuickTemplate V2.3. Author: Stefan Bocskai
</h1>The location of this file is:
/group/testes/teste_bebe1.phtml<br>
<hr>
<table border="1">
<tr>
<td>Crt.no.</td><td>Name</td><td>Mark</td><td>Class room</td>
</tr>
<tr>
<td>1</td>
<td>John</td>
<td align="right">10</td>
<td>101A</td>
</tr>
<tr>
<td>2</td>
<td>Robert</td>
<td align="right">8</td>
<td>101A</td>
</tr>
<tr>
<td>3</td>
<td>Jane</td>
<td align="right">7</td>
<td>101A</td>
</tr>
</table>
<table border="1">
<tr>
<td>Crt.no.</td><td>Name</td><td>Mark</td><td>Class room</td>
</tr>
<tr>
<td>1</td>
<td>Bob</td>
<td align="right">7</td>
<td>101B</td>
</tr>
<tr>
<td>2</td>
<td>Alice</td>
<td align="right">9</td>
<td>101B</td>
</tr>
<tr>
<td>3</td>
<td>Bebe</td>
<td align="right">9</td>
<td>101B</td>
</tr>
<tr>
<td>4</td>
<td>Toni</td>
<td align="right">7</td>
<td>101B</td>
</tr>
</table>
<table border="1">
<tr>
<td>Crt.no.</td><td>Name</td><td>Mark</td><td>Class room</td>
</tr>
<tr>
<td>1</td>
<td>Michael</td>
<td align="right">9</td>
<td>100C</td>
</tr>
<tr>
<td>2</td>
<td>David</td>
<td align="right">10</td>
<td>100C</td>
</tr>
<tr>
<td>3</td>
<td>James</td>
<td align="right">8</td>
<td>100C</td>
</tr>
</table>
<table border="1">
<tr>
<td>Crt.no.</td><td>Name</td><td>Mark</td><td>Class room</td>
</tr>
<tr><td colspan="4"><font color="red">No students in class 100D
</font></td></tr>
</table>
<p align="right">
Current time <b>13:41 PM</b><br>
Date: <b>Tuesday 09 May 2000</b><br>
<p></p>
</blockquote>
</blockquote>
</body>
</html>
|