var clockIncrementMillis = 60000;
var localTime;
var clockOffset;
var clockExpirationLocal;
var clockTimerID = null;

function simpleFindObj(name, inLayer) {
	return document[name] || (document.all && document.all[name])
		|| (document.getElementById && document.getElementById(name))
		|| (document.layers && inLayer && document.layers[inLayer].document[name]);
}

function clockInit(localDateObject, serverDateObject)
{
    var origRemoteClock = parseInt(clockGetCookieData("remoteClock"));
    var origLocalClock = parseInt(clockGetCookieData("localClock"));
    var newRemoteClock = serverDateObject.getTime();
    var newLocalClock = localDateObject.getTime();
    var maxClockAge = 60 * 60 * 1000;   

    if (newRemoteClock != origRemoteClock) {
        document.cookie = "remoteClock=" + newRemoteClock;
        document.cookie = "localClock=" + newLocalClock;
        clockOffset = newRemoteClock - newLocalClock;
        clockExpirationLocal = newLocalClock + maxClockAge;
        localTime = newLocalClock;
    }
    else if (origLocalClock != origLocalClock) {
        clockOffset = null;
        clockExpirationLocal = null;
    }
    else {
        clockOffset = origRemoteClock - origLocalClock;
        clockExpirationLocal = origLocalClock + maxClockAge;
        localTime = origLocalClock;
    }
    var nextDayLocal = (new Date(serverDateObject.getFullYear(),
            serverDateObject.getMonth(),
            serverDateObject.getDate() + 1)).getTime() - clockOffset;
    if (nextDayLocal < clockExpirationLocal) {
        clockExpirationLocal = nextDayLocal;
    }
}

function clockOnLoad()
{
    clockUpdate();
}

function clockOnUnload() {
    clockClearTimeout();
}

function clockClearTimeout() {
    if (clockTimerID) {
        clearTimeout(clockTimerID);
        clockTimerID = null;
    }
}

function clockToggleSeconds()
{
    clockClearTimeout();
    if (clockShowsSeconds) {
        clockShowsSeconds = false;
        clockIncrementMillis = 60000;
    }
    else {
        clockShowsSeconds = true;
        clockIncrementMillis = 1000;
    }
    clockUpdate();
}

function clockTimeString(inHours, inMinutes, inSeconds) {
	/*formato inglese
    return inHours == null ? "-:--" : ((inHours == 0
                   ? "12" : (inHours <= 12 ? inHours : inHours - 12))
                + (inMinutes < 10 ? ":0" : ":") + inMinutes
                + (clockShowsSeconds ? ((inSeconds < 10 ? ":0" : ":") + inSeconds) : "")
                + (inHours < 12 ? " AM" : " PM"));
    */
    //formato italiano
    return inHours == null ? "-:--" : ((inHours == 0
                   ? "12" : (inHours <= 12 ? inHours : inHours))
                + (inMinutes < 10 ? ":0" : ":") + inMinutes
                + (clockShowsSeconds ? ((inSeconds < 10 ? ":0" : ":") + inSeconds) : "")
                + (inHours < 12 ? "" : ""));
}
function clockDateString(inDate) {
	/*english format
	return ["Sunday, ","Monday, ","Tuesday, ","Wednesday, ",
            "Thursday, ","Friday, ","Saturday, "][inDate.getDay()]
        + ["January ","February ","March ","April ","May ","June ",
            "July ", "August ","September ","October ","November ","December "]
            [inDate.getMonth()]
         + inDate.getDate() + ", " + inDate.getFullYear();
    */
    //italian format
    return ["domenica<br>","lunedì<br>", "martedì<br>","mercoledì<br>",
            "giovedì<br>","venerdì<br>","sabato<br>"][inDate.getDay()]
         + inDate.getDate() + " "  
         + ["gennaio ","febbraio ","marzo ","aprile ","maggio ","giugno ",
            "luglio ", "agosto ","settembre ","ottobre ","novembre ","dicembre "]
            [inDate.getMonth()]
         + inDate.getFullYear();
}

function clockDisplayTime(inHours, inMinutes, inSeconds) {
    
    clockWriteToDiv("ClockTime",  "sono le "+clockTimeString(inHours, inMinutes, inSeconds));
}

function clockWriteToDiv(divName, newValue) 
{
    var divObject = simpleFindObj(divName);
    newValue = '<p>' + newValue + '<' + '/p>';
    if (divObject && divObject.innerHTML) {
        divObject.innerHTML = newValue;
    }
    else if (divObject && divObject.document) {
        divObject.document.writeln(newValue);
        divObject.document.close();
    }
}

function clockGetCookieData(label) {
    var c = document.cookie;
    if (c) {
        var labelLen = label.length, cEnd = c.length;
        while (cEnd > 0) {
            var cStart = c.lastIndexOf(';',cEnd-1) + 1;
            while (cStart < cEnd && c.charAt(cStart)==" ") cStart++;
            if (cStart + labelLen <= cEnd && c.substr(cStart,labelLen) == label) {
                if (cStart + labelLen == cEnd) {                
                    return ""; 
                }
                else if (c.charAt(cStart+labelLen) == "=") {
                    return unescape(c.substring(cStart + labelLen + 1,cEnd));
                }
            }
            cEnd = cStart - 1;  
        }
    }
    return null;
}

function clockUpdate()
{
    var lastLocalTime = localTime;
    localTime = (new Date()).getTime();
    if (clockOffset == null) {
        clockDisplayTime(null, null, null);
    }
    else if (localTime < lastLocalTime || clockExpirationLocal < localTime) {
        document.cookie = 'remoteClock=-';
        document.cookie = 'localClock=-';
        location.reload();      
    }
    else {
        var serverTime = new Date(localTime + clockOffset);
        clockDisplayTime(serverTime.getHours(), serverTime.getMinutes(),
            serverTime.getSeconds());
        clockTimerID = setTimeout("clockUpdate()",
            clockIncrementMillis - (serverTime.getTime() % clockIncrementMillis));
    }
}