<#--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
<script type="text/javascript">
    jQuery(document).ready(function () {
        window.setInterval(function () {
            clock()
        }, 1000);
        var serverTimestamp = 0;
        var date;

        function clock() {
            if (jQuery("#${clockField}").text() === "${uiLabelMap.CommonServerHour}:") {
                waitSpinnerShow();
                serverTimestamp = getServiceResult("getServerTimestampAsLong")['serverTimestamp'];
                serverTimeZone = getServiceResult("getServerTimeZone")['serverTimeZone'];
                ;
                initTimeZone();
                date = new timezoneJS.Date(serverTimestamp, serverTimeZone);
                waitSpinnerHide();
            } else {
                date.setSeconds(date.getSeconds() + 1);
            }
            // dateFormat does not respect the timezone :/ Fortunately toString is what we want :)
            //jQuery("#${clockField}
            ").text("${uiLabelMap.CommonServerHour}
            : "  + dateFormat(date, "yyyy-mm-dd HH:MM:ss"));
            jQuery("#${clockField}").text("${uiLabelMap.CommonServerHour}: " + date.toString());
        }
    })
</script>