        var unitmonths = "months";
        var unitmonth = "month";
        var unitdays = "days";
        var unitday = "day";
        var unithours = "hours";
        var unithour = "hour";
        var unitminutes = "minutes";
        var unitminute = "minute";
        var unitseconds = "seconds";
        var unitsecond = "second";
        var unitand = "and";
        var millisecperhour = 60 * 60 * 1000;
        var millisecperday = 24 * millisecperhour;
        var millisecpermon = 30 * millisecperday;

        function countdown() {

            if (DisplayEvents.length == 0) {
                setTimeout("countdown()", 1000);
                return;
            };

            var smsg = '';
            var timemsg = '';
            var datediff = 0;
            var dmon = 0;
            var dday = 0;
            var dleft = 0;
            var dhour = 0;
            var hleft = 0;
            var dmin = 0;
            var mleft = 0;
            var dsec = 0;
            var secdiff = 0;
            var displaycode = 0;
            var processcode = 0;
            var during = 0;
            for (var iEvent = 0; iEvent < DisplayEvents.length; iEvent++) {
                displaycode = DisplayEvents[iEvent].DisplayCode;
                processcode = DisplayEvents[iEvent].ProcessCode;
                var today = new Date();
                datediff = DisplayEvents[iEvent].EventDate - today;
                if ((processcode & 8) != 0) {
                    secdiff = Math.floor(datediff / 1000);
                    if (secdiff <= 0 && secdiff > -DisplayEvents[iEvent].Duration) {
                        datediff = (DisplayEvents[iEvent].EventDate - today) + (DisplayEvents[iEvent].Duration * 1000);
                        during = 1;
                    }
                };
                if (datediff > 0) {
                    secdiff = Math.floor(datediff / 1000);
                    if ((displaycode & 1) != 0) {
                        dmon = Math.floor(datediff / millisecpermon);
                        datediff = Math.floor(datediff % millisecpermon);
                    };
                    dday = Math.floor(datediff / millisecperday);
                    dleft = Math.floor(datediff % millisecperday);
                    dhour = Math.floor(dleft / millisecperhour);
                    hleft = Math.floor(dleft % millisecperhour);
                    dmin = Math.floor(hleft / 60000);
                    mleft = Math.floor(hleft % 60000);
                    dsec = Math.floor(mleft / 1000);
                }
                else {
                    secdiff = Math.ceil(datediff / 1000);
                    if (Math.abs(secdiff) > DisplayEvents[iEvent].Duration) {
                        datediff = datediff + (DisplayEvents[iEvent].Duration * 1000);
                    };
                    if ((displaycode & 1) != 0) {
                        dmon = Math.floor(datediff / millisecpermon);
                        datediff = Math.ceil(datediff % millisecpermon);
                    };
                    dday = Math.ceil(datediff / millisecperday);
                    dleft = Math.ceil(datediff % millisecperday);
                    dhour = Math.ceil(dleft / millisecperhour);
                    hleft = Math.ceil(dleft % millisecperhour);
                    dmin = Math.ceil(hleft / 60000);
                    mleft = Math.ceil(hleft % 60000);
                    dsec = Math.ceil(mleft / 1000);
                };
                if ((dday == 0) && (displaycode < 4)) displaycode += 4;
                if ((dday == 0) && (dhour == 0) && (displaycode < 8)) displaycode += 8;
                if ((dday == 0) && (dhour == 0) && (dmin == 0) && (displaycode < 16)) displaycode += 16;
                if (secdiff <= -DisplayEvents[iEvent].Duration) {
                    timemsg = DisplayEvents[iEvent].AfterMsg;
                    if ((processcode & 1) != 0) {
                        if (DisplayEvents[iEvent].Clear == 0) {
                            DisplayEvents[iEvent].Span.innerHTML = '';
                            DisplayEvents[iEvent].Clear = 1;
                        };
                        return;
                    };
                    if ((processcode & 2) != 0) {
                        timemsg = BuildDisplay(displaycode, -dmon, -dday, -dhour, -dmin, -dsec, -secdiff);
                        timemsg = BuildTimeMsg(timemsg, DisplayEvents[iEvent].AfterMsg);
                    };
                    if ((processcode & 4) != 0) {
                        timemsg = '<font color=red>' + timemsg + '</font>';
                    }
                }
                else if (during == 1 || (secdiff <= 0 && secdiff > -DisplayEvents[iEvent].Duration)) {
                    if ((processcode & 8) != 0) {
                        if (secdiff < 0) {
                            timemsg = BuildDisplay(displaycode, -dmon, -dday, -dhour, -dmin, -dsec, -secdiff);
                        }
                        else {
                            timemsg = BuildDisplay(displaycode, dmon, dday, dhour, dmin, dsec, secdiff);

                        };
                        timemsg = BuildTimeMsg(timemsg, DisplayEvents[iEvent].DuringMsg);
                    }
                    else {
                        timemsg = DisplayEvents[iEvent].DuringMsg + ' ' + RepeatStr('.', (Math.abs(secdiff) % 4));
                    }
                }
                else {
                    timemsg = BuildDisplay(displaycode, dmon, dday, dhour, dmin, dsec, -secdiff);
                    timemsg = BuildTimeMsg(timemsg, DisplayEvents[iEvent].BeforeMsg);
                };
                DisplayEvents[iEvent].Span.innerHTML = DisplayEvents[iEvent].PrefixTags + timemsg + DisplayEvents[iEvent].SuffixTags;
            };
            setTimeout("countdown()", 1000);

        };

        function BuildDisplay(iDisplay, iMonths, iDays, iHours, iMins, iSecs, iTotalSecs) {
            var smsg;
            displayed = 0;
            smsg = "<div>";
            iTotalSecs = Math.abs(iTotalSecs);
            if (((iDisplay & 1) != 0) && (iMonths > 0)) {
                smsg = smsg + "<div class=\"tmDiv\"><div class=\"tmNumber\">";
                if (iMonths == 1) smsg = smsg + iMonths + "</div><div class=\"tmText\">" + unitmonth;
                else smsg = smsg + iMonths + "</div><div class=\"tmText\">" + unitmonths;
                smsg = smsg + "</div></div>"
                displayed = 1;
            };
            if (((iDisplay & 2) != 0) && (iDays > 0)) {
                if (smsg.length > 0) {
					smsg = smsg + "<div class=\"tmDiv\"><div class=\"tmNumber\">";
                };
                if (iDays == 1) smsg = smsg + iDays + "</div><div class=\"tmText\">" + unitday;
                else smsg = smsg + iDays + "</div><div class=\"tmText\">" + unitdays;
                smsg = smsg + "</div></div>"
                displayed += 1;
            };
            if (((iDisplay & 4) != 0) && ((iDays > 0) || (iHours > 0))) {
                if (smsg.length > 0) {
					smsg = smsg + "<div class=\"tmDiv\"><div class=\"tmNumber\">";
                };
                if (iHours == 1) smsg = smsg + iHours + "</div><div class=\"tmText\">" + unithour;
                else smsg = smsg + iHours + "</div><div class=\"tmText\">" + unithours;
                smsg = smsg + "</div></div>"
                displayed += 1;
            };
            if (((iDisplay & 8) != 0) && ((iDays > 0) || (iHours > 0) || (iMins > 0))) {
                if (smsg.length > 0) {
                    smsg = smsg + "<div class=\"tmDiv\"><div class=\"tmNumber\">";
                };
                if (iMins == 1) smsg = smsg + iMins + "</div><div class=\"tmText\">" + unitminute;
                else smsg = smsg + iMins + "</div><div class=\"tmText\">" + unitminutes;
                smsg = smsg + "</div></div>"
                displayed += 1;
            };
            if ((iDisplay & 16) != 0) {
                if (displayed > 1) {
                    smsg = smsg + "<div class=\"tmDiv1\"><div class=\"tmNumber\">";
                };
                if (iSecs == 1) smsg = smsg + iSecs + "</div><div class=\"tmText\">" + unitsecond;
                else smsg = smsg + iSecs + "</div><div class=\"tmText\">" + unitseconds;
                smsg = smsg + "</div></div>"
                displayed += 1;
            };
            if ((iDisplay & 32) != 0) {
                smsg = iTotalSecs + " " + unitseconds;
            };
            if ((iDisplay & 64) != 0) {
                itemp = Math.floor(iTotalSecs / 60);
                smsg = itemp + " " + unitminutes;
            };
            if ((iDisplay & 128) != 0) {
                itemp = Math.floor(iTotalSecs / 3600);
                smsg = itemp + " " + unithours;
            };
            if ((iDisplay & 256) != 0) {
                itemp = Math.floor(iTotalSecs / 86400);
                smsg = itemp + " " + unitdays;
            };
            smsg = smsg + "</div>"
            return smsg;
        };

        function BuildTimeMsg(TimeMsg, UserMsg) {
            var iptr;
            var result;
            var pattern = "[TimeMsg]";
            iptr = UserMsg.indexOf(pattern);
            if (iptr > 0) {
                result = UserMsg.substring(0, iptr - 1);
                result += " " + TimeMsg;
                iptr += pattern.length;
                result += " " + UserMsg.substring(iptr, UserMsg.length);
            }
            else {
                result = TimeMsg + " " + UserMsg;
            };
            return result;
        };

        function RepeatStr(thestr, itimes) {
            var result = '';
            for (var i = 0; i < itimes; i++) {
                result += thestr;
            };
            return result;
        };

        function start_countdown() {
            countdown();
        };

        function DisplayEvent(SpanName, EventDate, Duration, DisplayCode, ProcessCode, PrefixTags, SuffixTags, BeforeMsg, DuringMsg, AfterMsg) {
            this.Span = document.getElementById(SpanName);
            this.Clear = 0;
            this.EventDate = EventDate;
            this.Duration = Duration;
            this.DisplayCode = DisplayCode;
            this.ProcessCode = ProcessCode;
            this.PrefixTags = PrefixTags;
            this.SuffixTags = SuffixTags;
            this.BeforeMsg = BeforeMsg;
            this.DuringMsg = DuringMsg;
            this.AfterMsg = AfterMsg;
        };

        function DefineEvent(theSpan, theYear, theMonth, theDay, theHour, theMinute, theSecond, theDuration, theDisplay, theProcess, thePrefix, theSuffix, theBeforeMsg, theDuringMsg, theAfterMsg) {
            var eventdate = new Date();
            var eventyear = 0;
            var eventmonth = 0;
            var eventday = 0;
            var eventhour = 0;
            var eventminute = 0;
            var eventsecond = 0;
            var eventduration = 0;
            var prefixtags = "";
            var suffixtags = "";
            var beforemsg = "";
            var aftermsg = "";
            var duringmsg = "";
            eventyear = theYear;
            eventmonth = theMonth;
            eventday = theDay;
            eventhour = theHour;
            eventminute = theMinute;
            eventsecond = theSecond;
            eventduration = theDuration;
            displaycode = theDisplay;
            processcode = theProcess;
            prefixtags = TagFix(thePrefix);
            suffixtags = TagFix(theSuffix);
            beforemsg = TagFix(theBeforeMsg);
            duringmsg = TagFix(theDuringMsg);
            aftermsg = TagFix(theAfterMsg);
            if ((processcode & 1024) != 0) {
                eventdate.setUTCFullYear(eventyear, eventmonth - 1, eventday);
                eventdate.setUTCHours(eventhour, eventminute, eventsecond, 0);
            }
            else {
                eventdate.setFullYear(eventyear, eventmonth - 1, eventday);
                eventdate.setHours(eventhour, eventminute, eventsecond, 0);
            };
            DisplayEvents[DisplayEvents.length] = new DisplayEvent(theSpan, eventdate, theDuration, theDisplay, theProcess, prefixtags, suffixtags, beforemsg, duringmsg, aftermsg);
        };

        function TagFix(intag) {
            outtag = intag;
            outtag = outtag.replace(/&lt;/gi, "<");
            outtag = outtag.replace(/&gt;/gi, ">");
            outtag = outtag.replace(/&quot;/gi, '"');
            outtag = outtag.replace(/&amp;/gi, "&");
            return outtag;
        };

        var DisplayEvents = new Array(); //window.onload = start_countdown;
