[ Mini Kiebo ]
Server: Windows NT DESKTOP-5B8S0D4 6.2 build 9200 (Windows 8 Professional Edition) i586
Path:
D:
/
xampp182
/
htdocs
/
simpeg
/
zapatec
/
zptime
/
zptime
/
jsdocs
/
[
Home
]
File: overview-summary-zptime-core.js.html
<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd"> <html> <head> <title> Zapatec Time Overview </title> <link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style"> <script> function asd() { parent.document.title="zptime-core.js Overview"; } </script> </head> <body bgcolor="white" onload="asd();"> <!-- ========== START OF NAVBAR ========== --> <a name="navbar_top"><!-- --></a> <table border="0" width="100%" cellpadding="1" cellspacing="0"> <tr> <td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1"> <a name="navbar_top_firstrow"><!-- --></a> <table border="0" cellpadding="0" cellspacing="3"> <tr align="center" valign="top"> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td> <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td> <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td> </tr> </table> </td> <td bgcolor="#EEEEFF" align="right" valign="top"> <em> <b>Zapatec Time</b></em> </td> </tr> <tr> <td bgcolor="white" class="NavBarCell2"><font size="-2"> PREV NEXT</font></td> <td bgcolor="white" class="NavBarCell2"><font size="-2"> <a href="index.html" target="_top"><b>FRAMES</b></a> <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a> <script> <!-- if(window==top) { document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>'); } //--> </script> <noscript> <a href="allclasses-noframe.html" target=""><b>All Classes</b></a> </noscript> </font></td> </tr> </table> <!-- =========== END OF NAVBAR =========== --> <hr> <center> <h2>zptime-core.js</h2> </center> <h4>Summary</h4> <p> No overview generated for 'zptime-core.js'<BR/><BR/> </p> <hr> <!-- ========== METHOD SUMMARY =========== --> <!-- ========== END METHOD SUMMARY =========== --> <pre class="sourceview"><span class="comment">// $Id: zptime-core.js 7198 2007-05-21 08:21:08Z slip $</span> <span class="comment">/** * * Copyright (c) 2004-2006 by Zapatec, Inc. * http://www.zapatec.com * 1700 MLK Way, Berkeley, California, * 94709, U.S.A. * All rights reserved. * * The TimeSelector object constructor. Call it, for example, like this: * * \code * var selector = new Zapatec.TimeSelector({ * showSeconds : false * }); * \endcode * * The above creates a new TimeSelector object. The TimeSelector isn't displayed * instantly; using the "selector" variable, the programmer can now set certain * configuration variables, hook his own event handlers and then display the * window using Zapatec.TimeSelector.create() and Zapatec.TimeSelector.show(). * * <span class="attrib">@param</span> config [object] - all parameters are passed as the properties of this object. * * Constructor recognizes the following properties of the config object * \code * prop. name | description * ------------------------------------------------------------------------------------------------- * parent | {HTML element or string} element or its id where the time selector * | will be placed. Default document.body * showHours | {boolean} if true hours selector will be shown, otherwise omitted. * | Default true. * showMinutes | {boolean} if true minutes selector will be shown, otherwise omitted. * | Default true. * showSeconds | {boolean} if true seconds selector will be shown, otherwise omitted. * | Default false. * timeFormat | {string} "12" or "24", determines whether it is 24 or 12 hours format. * | default "12". * timeStatus | {function} callback to disable certain time selection. * separator | {string} string to be used as separator. Default ":". * date | {Date object} Date object to be controlled, parsed and printed. * | Default "new Date()" expression. * timeInterval | {number} a number of minutes to which the time can be increased or decreased. * | Can be - 1, 2, 3, 4, 5, 6, 10, 15, 30, 60, 120, 180, 240, 300, 360. * | If omitted, minute arrows increment for five and all others for 1. */</span> Zapatec.TimeSelect = <span class="reserved">function</span>(config) { <span class="comment">//container of all HTML part</span> <span class="reserved">this</span>.container = null; <span class="comment">//area filled with string "Time"</span> <span class="reserved">this</span>.timeText = null; <span class="comment">//a button to select hours</span> <span class="reserved">this</span>.hoursSelect = null; <span class="comment">//a button to increase hours</span> <span class="reserved">this</span>.hoursUp = null; <span class="comment">//a button to decrease hours</span> <span class="reserved">this</span>.hoursDown = null; <span class="comment">//a button to select minutes</span> <span class="reserved">this</span>.minutesSelect = null; <span class="comment">//a button to increase minutes</span> <span class="reserved">this</span>.minutesUp = null; <span class="comment">//a button to decrease minutes</span> <span class="reserved">this</span>.minutesDown = null; <span class="comment">//a button to select seconds</span> <span class="reserved">this</span>.secondsSelect = null; <span class="comment">//a button to increase seconds</span> <span class="reserved">this</span>.secondsUp = null; <span class="comment">//a button to decrease seconds</span> <span class="reserved">this</span>.secondsDown = null; <span class="comment">//ampm selector button</span> <span class="reserved">this</span>.ampmSelect = null; <span class="comment">//array of separator elements</span> <span class="reserved">this</span>.createProperty(<span class="reserved">this</span>, <span class="literal">"separators"</span>, []); <span class="comment">//empty separator between ampm control and las select</span> <span class="reserved">this</span>.emptySeparator = null; <span class="comment">//type of the widget - time-selector in our case :)</span> <span class="reserved">this</span>.widgetType = <span class="literal">"time-selector"</span>; <span class="comment">//this variable points the state of the widget in general.</span> <span class="comment">//The widget has a set of states 4 of them should go one after another ('created' -> 'inited' -> 'loaded' -> 'ready')</span> <span class="comment">//and point to the stage of creation of widget. Last one should be 'ready', </span> <span class="comment">//which means a fully ready for work widget. Each of the methods can require</span> <span class="comment">//the state to be not lower than it needs. So we will also define a method</span> <span class="comment">//to work with this variable - stateReached(state) - to get true if state reached or passed.</span> <span class="reserved">this</span>.widgetState = <span class="literal">"created"</span>; <span class="comment">//array of priorities for states, in other words its the number which points the order</span> <span class="comment">// of states to be passed.</span> <span class="reserved">this</span>.priorities = { <span class="comment">//the number of states supported</span> count : 7, <span class="comment">//states priorities</span> destroyed : 0, created : 1, inited : 2, loaded : 3, ready : 4, hidden : 5, shown : 6 }; <span class="comment">//state of the time select</span> <span class="reserved">this</span>.state = { shiftKey : false, overSelect : null }; <span class="comment">//calling super constructor</span> Zapatec.TimeSelect.SUPERconstructor.call(<span class="reserved">this</span>, config); <span class="comment">//need a restorer object</span> <span class="reserved">this</span>.restorer = new Zapatec.SRProp(<span class="reserved">this</span>); }; Zapatec.TimeSelect.id = <span class="literal">"Zapatec.TimeSelect"</span>; <span class="comment">//Inheriting Zapatec.Widget class</span> Zapatec.inherit(Zapatec.TimeSelect, Zapatec.Widget); <span class="comment">/** * This function inits the config object and loads HTML structure * of the time selector, not to waste time :) * <span class="attrib">@param</span> config [object] - object which holds the configuration, same as for constructor */</span> Zapatec.TimeSelect.<span class="reserved">prototype</span>.init = <span class="reserved">function</span>(config) { <span class="comment">// processing Widget functionality</span> Zapatec.TimeSelect.SUPERclass.init.call(<span class="reserved">this</span>, config); <span class="comment">//changing state to "inited"</span> <span class="reserved">this</span>.changeState(<span class="literal">"inited"</span>); <span class="comment">//loading template for TimeSelector</span> <span class="reserved">this</span>.loadData({object : <span class="reserved">this</span>, action : <span class="literal">"loadTemplate"</span>}); }; <span class="comment">/** * Sets the default configuration of the object and * inits it with user defined values. * <span class="attrib">@param</span> config {object} configuration parameters. */</span> Zapatec.TimeSelect.<span class="reserved">prototype</span>.configure = <span class="reserved">function</span>(config) { <span class="comment">//parent element for the object</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"parent"</span>, document.body); <span class="comment">//if we show hours</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"showHours"</span>, true); <span class="comment">//if we show minutes</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"showMinutes"</span>, true); <span class="comment">//if we show seconds</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"showSeconds"</span>, false); <span class="comment">//time format 24 or 12 hours</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"timeFormat"</span>, <span class="literal">"12"</span>); <span class="comment">//callback for disabling time</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"timeStatus"</span>, null); <span class="comment">//separator charackter</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"separator"</span>, <span class="literal">":"</span>); <span class="comment">//date object to control</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"date"</span>, new Date()); <span class="comment">//time interval</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"timeInterval"</span>, null); <span class="comment">//we need the HTML part of our window to be loaded, so defining the source and sourceType</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"template"</span>, Zapatec.TimeSelect.path + <span class="literal">"struc.html"</span>); <span class="comment">//callback source function</span> <span class="reserved">this</span>.defineConfigOption(<span class="literal">"callbackSource"</span>, <span class="reserved">function</span>(args) { <span class="comment">//getting time-selector object that requested the load</span> var selector = args.object; <span class="comment">//not a Zapatec.TimeSelect - no load</span> <span class="reserved">if</span> (!selector || selector.widgetType != <span class="literal">"time-selector"</span>) { <span class="reserved">return</span> null; } switch (args.action) { <span class="comment">//action is loading template</span> case <span class="literal">"loadTemplate"</span> : { <span class="reserved">return</span> {source : selector.getConfiguration().template, sourceType : <span class="literal">"html/url"</span>}; } } <span class="reserved">return</span> null; }); <span class="comment">// processing Widget functionality</span> Zapatec.TimeSelect.SUPERclass.configure.call(<span class="reserved">this</span>, config); config = <span class="reserved">this</span>.getConfiguration(); <span class="comment">//checking time interval.</span> <span class="reserved">if</span> (config.timeInterval) { <span class="reserved">if</span> ((config.timeInterval !== Math.floor(config.timeInterval)) || ((60 % config.timeInterval !== 0) && (config.timeInterval % 60 !== 0)) || (config.timeInterval > 360)) { Zapatec.Log({description : <span class="literal">"timeInterval option can only have the following number of minutes:\n1, 2, 3, 4, 5, 6, 10, 15, 30, 60, 120, 180, 240, 300, 360!"</span>}); config.timeInterval = null; } } <span class="comment">//checking date</span> <span class="reserved">if</span> (!Zapatec.isDate(config.date)) { Zapatec.Log({description : <span class="literal">"Wrong date object passed!"</span>}); config.date = new Date(); } <span class="comment">//checking time status function</span> <span class="reserved">if</span> (config.timeStatus && typeof config.timeStatus != <span class="literal">"function"</span>) { Zapatec.Log({description : <span class="literal">"Wrong timeStatus parameter passed!"</span>}); config.timeStatus = null; } <span class="comment">//checking time format</span> <span class="reserved">if</span> (config.timeFormat != <span class="literal">"24"</span>) { config.timeFormat = <span class="literal">"12"</span>; } }; <span class="comment">/** * Reconfigures the object with new parameters. * <span class="attrib">@param</span> config {object} new configuration parameters. */</span> Zapatec.TimeSelect.<span class="reserved">prototype</span>.reconfigure = <span class="reserved">function</span>(config) { <span class="comment">// Call parent method</span> Zapatec.TimeSelect.SUPERclass.reconfigure.call(<span class="reserved">this</span>, config); }; <span class="comment">/** * We overwrite the zpwidgets loadDataHtml method to parse * needed values from given HTML source. * <span class="attrib">@param</span> el [HTML element] - DOM representation of or HTML part. */</span> Zapatec.TimeSelect.<span class="reserved">prototype</span>.loadDataHtml = <span class="reserved">function</span>(el) { var self = <span class="reserved">this</span>; var toggleShift = <span class="reserved">function</span>() { self._toggleShift(); }; <span class="comment">//a button to replace element with button.</span> <span class="reserved">function</span> replaceButton(but, idPrefix, func, select) { var button = new Zapatec.Button({ <span class="comment">//copying class name</span> className : but.className, <span class="comment">//if its is not selector using internal </span> <span class="comment">//possibility of Zapatec.Button for hovering</span> overClass : !select ? <span class="literal">"zpTimeSelectHovered"</span> : null, <span class="comment">//active class</span> downClass : <span class="literal">"zpTimeSelectActive"</span>, <span class="comment">//if it is selector we need to implement tricky behaviour</span> <span class="comment">//when button can be disabled if shift is not pressed, but</span> <span class="comment">//is enabled when it is pressed, and vice versa</span> overAction : !select ? null : <span class="reserved">function</span>(ev) { self.state.shiftKey = ev.shiftKey; self.state.overSelect = button; toggleShift(); }, outAction : !select ? null : <span class="reserved">function</span>() { self.state.overSelect = null; Zapatec.Utils.removeClass(button.getInternalContainer(), <span class="literal">"zpTimeSelectHovered"</span>); }, <span class="comment">//we use internal classes for making theme</span> theme : null, <span class="comment">//ids for teting</span> idPrefix : idPrefix, <span class="comment">//simple click action</span> clickAction : func }); <span class="comment">//if it is selector we need to fully enable it first</span> <span class="reserved">if</span> (select) { button.shiftEnabled = true; button.noShiftEnabled = true; button.getInternalContainer = <span class="reserved">function</span>() { <span class="reserved">return</span> <span class="reserved">this</span>.internalContainer; }; Zapatec.Utils.addEvent(button.getContainer(), <span class="literal">"mouseout"</span>, <span class="reserved">function</span>() { button.enable(); self.state.overSelect = null; Zapatec.Utils.removeClass(button.getInternalContainer(), <span class="literal">"zpTimeSelectHovered"</span>); }); } <span class="comment">//replacing</span> var nxtSbl = but.nextSibling; var par = but.parentNode; par.removeChild(but); par.insertBefore(button.getContainer(), nxtSbl); <span class="reserved">return</span> button; } <span class="comment">//el is an DOM element created from the struct.html file, which contains HTML part of this widget.</span> <span class="reserved">if</span> (<span class="reserved">this</span>.parseDom(el)) { <span class="comment">//replacing buttons</span> <span class="reserved">this</span>.hoursSelect = replaceButton(<span class="reserved">this</span>.hoursSelect, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"HoursSelect"</span>, <span class="reserved">function</span>(ev) { var step = ev.shiftKey ? -1 : 1; self.setHours(self.getHours() + step); }, true); <span class="reserved">this</span>.hoursUp = replaceButton(<span class="reserved">this</span>.hoursUp, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"HoursUpButton"</span>, <span class="reserved">function</span>(ev) { self.setHours(self.getHours() + self._getStep(<span class="literal">"hours"</span>, <span class="literal">"plus"</span>)); }); <span class="reserved">this</span>.hoursDown = replaceButton(<span class="reserved">this</span>.hoursDown, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"HoursDownButton"</span>, <span class="reserved">function</span>(ev) { self.setHours(self.getHours() - self._getStep(<span class="literal">"hours"</span>, <span class="literal">"minus"</span>)); }); <span class="reserved">this</span>.minutesSelect = replaceButton(<span class="reserved">this</span>.minutesSelect, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"MinutesSelect"</span>, <span class="reserved">function</span>(ev) { var step = ev.shiftKey ? -1 : 1; self.setMinutes(self.getMinutes() + step); }, true); <span class="reserved">this</span>.minutesUp = replaceButton(<span class="reserved">this</span>.minutesUp, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"MinutesUpButton"</span>, <span class="reserved">function</span>(ev) { self.setMinutes(self.getMinutes() + self._getStep(<span class="literal">"minutes"</span>, <span class="literal">"plus"</span>)); }); <span class="reserved">this</span>.minutesDown = replaceButton(<span class="reserved">this</span>.minutesDown, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"MinutesDownButton"</span>, <span class="reserved">function</span>(ev) { self.setMinutes(self.getMinutes() - self._getStep(<span class="literal">"minutes"</span>, <span class="literal">"minus"</span>)); }); <span class="reserved">this</span>.secondsSelect = replaceButton(<span class="reserved">this</span>.secondsSelect, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"SecondsSelect"</span>, <span class="reserved">function</span>(ev) { var step = ev.shiftKey ? -1 : 1; self.setSeconds(self.getSeconds() + step); }, true); <span class="reserved">this</span>.secondsUp = replaceButton(<span class="reserved">this</span>.secondsUp, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"SecondsUpButton"</span>, <span class="reserved">function</span>(ev) { self.setSeconds(self.getSeconds() + self._getStep(<span class="literal">"seconds"</span>, <span class="literal">"plus"</span>)); }); <span class="reserved">this</span>.secondsDown = replaceButton(<span class="reserved">this</span>.secondsDown, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"SecondsDownButton"</span>, <span class="reserved">function</span>(ev) { self.setSeconds(self.getSeconds() - self._getStep(<span class="literal">"seconds"</span>, <span class="literal">"minus"</span>)); }); <span class="reserved">this</span>.ampmSelect = replaceButton(<span class="reserved">this</span>.ampmSelect, <span class="literal">"zpTime"</span> + <span class="reserved">this</span>.id + <span class="literal">"AMPMSelect"</span>, <span class="reserved">function</span>(ev) { var val = self.ampmSelect.getText(); self.setHours(self.getHours() + (val.toLowerCase() == <span class="literal">"am"</span> ? 12 : -12)); }); <span class="comment">//we need to trace shift key</span> Zapatec.Utils.addEvent(document, <span class="literal">"keydown"</span>, <span class="reserved">function</span>() { self.state.shiftKey = true; toggleShift(); }); Zapatec.Utils.addEvent(document, <span class="literal">"keyup"</span>, <span class="reserved">function</span>() { self.state.shiftKey = false; toggleShift(); }); <span class="reserved">this</span>.changeState(<span class="literal">"loaded"</span>); } }; <span class="comment">/** * Gets the container. */</span> Zapatec.TimeSelect.<span class="reserved">prototype</span>.getContainer = <span class="reserved">function</span>() { <span class="reserved">return</span> <span class="reserved">this</span>.container; }; <span class="comment">/** * This function appends the loaded structure to the parent element, * sets all the parameters of the visual elements. * All its actions are closely connected with config options. */</span> Zapatec.TimeSelect.<span class="reserved">prototype</span>.create = <span class="reserved">function</span>() { <span class="reserved">if</span> (!<span class="reserved">this</span>.fireOnState(<span class="literal">"body_loaded"</span>, <span class="reserved">function</span>() {<span class="reserved">this</span>.create();}) || !<span class="reserved">this</span>.fireOnState(<span class="literal">"loaded"</span>, <span class="reserved">function</span>() {<span class="reserved">this</span>.create();})) { <span class="reserved">return</span>; } <span class="comment">//getting configuration</span> var config = <span class="reserved">this</span>.getConfiguration(); <span class="comment">//checking parent option</span> config.parent = Zapatec.Widget.getElementById(config.parent); <span class="reserved">if</span> (!Zapatec.isHtmlElement(config.parent)) { Zapatec.Log({description : <span class="literal">"Wrong parent specified!"</span>}); <span class="reserved">return</span> false } <span class="comment">//adding theme selector class namme</span> Zapatec.Utils.addClass(<span class="reserved">this</span>.getContainer(), <span class="reserved">this</span>.getClassName({prefix : <span class="literal">"zpTimeSelect"</span>, suffix : <span class="literal">"Container"</span>})); <span class="comment">//reconfigurating</span> <span class="reserved">this</span>.reconfig(); <span class="comment">//setting default time</span> <span class="reserved">this</span>.setFirstEnabledTime(); <span class="comment">//appending element</span> config.parent.appendChild(<span class="reserved">this</span>.getContainer()); <span class="comment">//changing state to ready</span> <span class="reserved">this</span>.changeState(<span class="literal">"ready"</span>); };</pre> <hr> <!-- ========== START OF NAVBAR ========== --> <a name="navbar_top"><!-- --></a> <table border="0" width="100%" cellpadding="1" cellspacing="0"> <tr> <td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1"> <a name="navbar_top_firstrow"><!-- --></a> <table border="0" cellpadding="0" cellspacing="3"> <tr align="center" valign="top"> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a> </td> <td bgcolor="#FFFFFF" class="NavBarCell1Rev"> <font class="NavBarFont1Rev"><b>File</b></font> </td> <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font> </td> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a> </td> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a> </td> <td bgcolor="#EEEEFF" class="NavBarCell1"> <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a> </td> </tr> </table> </td> <td bgcolor="#EEEEFF" align="right" valign="top"><em> <b>Zapatec Time</b></em> </td> </tr> <tr> <td bgcolor="white" class="NavBarCell2"><font size="-2"> PREV NEXT</font></td> <td bgcolor="white" class="NavBarCell2"><font size="-2"> <a href="index.html" target="_top"><b>FRAMES</b></a> <a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a> <script> <!-- if(window==top) { document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>'); } //--> </script> <noscript> <a href="allclasses-noframe.html" target=""><b>All Classes</b></a> </noscript> </font></td> </tr> </table> <!-- =========== END OF NAVBAR =========== --> <hr> <font size="-1"> </font> <div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Thu Aug 16 12:19:05 2007</div> </body> </html>