﻿//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
// Miscellaneous functionality
//*

function WtCalculateClientTimeOffset()
{
    var d = new Date();
    WtClientTimeOffsetSeconds = Math.floor(d.getTime()/1000) - WtServerUtcSeconds;
}

function _WtUtcStringFromDateObject(oDate)
{
    var s = "";
    s += oDate.getUTCFullYear();
    s += "-";
    s += oDate.getUTCMonth() + 1;
    s += "-";
    s += oDate.getUTCDate();
    s += " ";
    s += oDate.getUTCHours();
    s += ":";
    s += oDate.getUTCMinutes();
    s += ":";
    s += oDate.getUTCSeconds();    
    s += " GMT";
    
    return s;
}

function _WtDateObjectFromUtcString(utc)
{
    var aDateParts = utc.split("-");
    var aTimeParts = aDateParts[2].substr(2).split(":");

    var oDate = new Date();
    oDate.setUTCFullYear(aDateParts[0], aDateParts[1]-1, aDateParts[2].substr(0, 2));
    oDate.setUTCHours(aTimeParts[0]);
    oDate.setUTCMinutes(aTimeParts[1]);
    oDate.setUTCSeconds(aTimeParts[2].substr(0, 2));
    return oDate;
}

function _WtNiceDayAndMonthFromDate(oDate)
{
    var dayMonth = oDate.getDate();
    
    switch (oDate.getDate())
    {
        case 1:
        case 21:
        case 31:
            dayMonth += "st";
            break;
        case 2:
        case 22:
            dayMonth += "nd";
            break;
        case 3:
        case 23:
            dayMonth += "rd";
            break;
        default:
            dayMonth += "th";
            break;
    }
    dayMonth += " ";
    
    switch (oDate.getMonth())
    {
        case 0:
            dayMonth += "January";
            break;
        case 1:
            dayMonth += "February";
            break;
        case 2:
            dayMonth += "March";
            break;
        case 3:
            dayMonth += "April";
            break;
        case 4:
            dayMonth += "May";
            break;
        case 5:
            dayMonth += "June";
            break;
        case 6:
            dayMonth += "July";
            break;
        case 7:
            dayMonth += "August";
            break;
        case 8:
            dayMonth += "September";
            break;
        case 9:
            dayMonth += "October";
            break;
        case 10:
            dayMonth += "November";
            break;
        case 11:
            dayMonth += "December";
            break;
    }
    return dayMonth;
}

function _WtDayofWeekFromDayIndex(dayOfWeek)
{
    var day;
    
    switch (dayOfWeek)
    {
    case 0:
        day = "Sunday";
        break;
    case 1:
        day = "Monday";
        break;
    case 2:
        day = "Tuesday";
        break;
    case 3:
        day = "Wednesday";
        break;
    case 4:
        day = "Thursday";
        break;
    case 5:
        day = "Friday";
        break;
    case 6:
        day = "Saturday";
        break;
    }
    
    return day;
}

function _WtNiceTimeFromDate(oDate)
{
    var amPM = "am";
    var hours = oDate.getHours();
    if (hours > 12)
    {
        hours -= 12;
        amPM = "pm";
    }
    else if (hours == 0)
    {
        hours = 12;
    }
    
    var minutes = oDate.getMinutes();
    if (minutes < 10)
    {
        minutes = "0" + minutes;
    }
    
    return " " + hours + ":" + minutes + " " + amPM;
}

function _WtExplicitLocalTimeFromUtc(utc)
{
    var oDate = _WtDateObjectFromUtcString(utc);

    var date = "";
    date += _WtDayofWeekFromDayIndex(oDate.getDay());
    date += ", ";
    date += _WtNiceDayAndMonthFromDate(oDate);
    date += " ";
    date += oDate.getFullYear();
    date += " at ";
    date += _WtNiceTimeFromDate(oDate);
    
    return date;
}

function _WtShortLocalTimeFromUtc(utc)
{
    // Load UTC datetime
    var oDate = _WtDateObjectFromUtcString(utc);

    // Set days month and year in default format
    var date = _WtNiceDayAndMonthFromDate(oDate);
    date += " ";
    
    // Get time now AND adjust for server/client differences
    var oNow = new Date();
    oNow.setTime(oNow.getTime() - (WtClientTimeOffsetSeconds*1000));
        
    // Record year
    if (oDate.getFullYear() != oNow.getFullYear())
    {
        date += oDate.getFullYear();
        date += " ";
    }
    
    // Sanity check - before continuing, check that the date is not in the future! If it is
    // then something has gone wrong: WtClientTimeOffsetSeconds has not been calculated for
    // example, or, the date was created on the server while it's clock was wrong. All we can
    // do is report the date and time recorded
    if (oNow.getTime() < oDate.getTime())
    {
        return date + _WtNiceTimeFromDate(oDate);
    }    
    
    // Make default date format more friendly if possible
    if (oDate.getFullYear() == oNow.getFullYear() &&
        oDate.getMonth() == oNow.getMonth() &&
        oDate.getDate() == oNow.getDate())
    {
        date = "Today";
    }
    else
    {
        var adjDay = oDate.getDate();
        var adjMonth = oDate.getMonth();
        var adjYear = oDate.getFullYear();                
        var backDays = 6;
        while (backDays--)
        {
            adjDay++;
            switch (adjMonth)
            {
                case 0:
                case 2:
                case 4:
                case 6:
                case 7:
                case 9:
                case 11:
                    if (adjDay > 31)
                    {
                        adjDay = 1;
                        adjMonth++;
                    }
                    break;
                case 1:
                    if (adjDay > 28)
                    {
                        adjDay = 1;
                        adjMonth++;
                    }
                    break;
                case 3:
                case 5:
                case 8:
                case 10:
                    if (adjDay > 30)
                    {
                        adjDay = 1;
                        adjMonth++;
                    }
                    break;
            }
            if (adjMonth > 11)
            {
                adjMonth = 0;
                adjYear++;
            }
            
            if (oNow.getFullYear() == adjYear &&
                oNow.getMonth() == adjMonth &&
                oNow.getDate() == adjDay)     
            {
                var daysBefore = 6 - backDays;
                
                if (daysBefore == 1)
                {
                    date = "Yesterday";
                    break;
                }
                else
                {
                    var dayOfWeek = oNow.getDay();
                    dayOfWeek -= daysBefore;
                    if (dayOfWeek < 0)
                    {
                        dayOfWeek = 7 + dayOfWeek;
                    }
                    date = _WtDayofWeekFromDayIndex(dayOfWeek);
                    break;
                }                           
            }
        }          
    }
    
    // See if can report as minutes/seconds span
    var minutesSince;
    if (date == "Yesterday")
    {
        minutesSince = 1440 - (oDate.getHours()*60 + oDate.getMinutes());
        minutesSince += oNow.getHours()*60 + oNow.getMinutes();
    }
    
    if (date == "Today")
    {
        minutesSince = (oNow.getHours()*60 + oNow.getMinutes()) - (oDate.getHours()*60 + oDate.getMinutes());
    }
    
    if ((date == "Yesterday" && minutesSince <= 239) // if yesterday, must be less than 4 hours to report as min/sec span
        || (date == "Today" && minutesSince <= 359)) // if today, must be less than 6 hours to report as min/sec span
    {
        var hoursElapsed = Math.floor(minutesSince / 60);
        var minutesElapsed = minutesSince % 60;
                
        if (hoursElapsed == 0)
        {
            if (minutesElapsed == 0)
            {
                date = " seconds ago";
            }
            else if (minutesElapsed == 1)
            {
                date = "1 minute ago";
            }
            else {
                date = "" + minutesElapsed + " minutes ago";
            }
         }
         else
         {  
            date = "";
            if (hoursElapsed == 1)
            {
                date += "1 hour ";
            }
            else
            {
                date += hoursElapsed + " hours ";
            }
            
            if (minutesElapsed == 0)
            {
                date += "ago exactly";
            }
            else
            {
                date += minutesElapsed + " minutes ago";
            }
         }  
    }
    else
    {
        // otherwise, just report time in nice format
        date += " ";
        date += _WtNiceTimeFromDate(oDate);   
    }
    
    return date;
}

function _WtTransformUtcToLocaltime(classes)
{
    var oWykiThreading = document.getElementById("wykiThreadingRoot");
    if (oWykiThreading)
    {
        var aSpans = oWykiThreading.getElementsByTagName("span");
        
        for (var s = 0, oSpan; oSpan = aSpans[s]; s++)
        {
            for (var c = 0; c < classes.length; c++)
            {
                if (hasCssClass(oSpan, classes[c]))
                {
                    var utcStr = oSpan.innerHTML;
                    if (utcStr.toLowerCase().indexOf("draft") == -1)
                    {
                        oSpan.innerHTML = _WtShortLocalTimeFromUtc(utcStr);
                        oSpan.title = _WtExplicitLocalTimeFromUtc(utcStr);
                        setAttribute(oSpan, "UTC", utcStr);
                    }
                }
            }
        }
    }   
}

function _WtUpdateStoredUtcToLocaltime(classes)
{
    var oWykiThreading = document.getElementById("wykiThreadingRoot");
    if (oWykiThreading)
    {
        var aSpans = oWykiThreading.getElementsByTagName("span");
        
        for (var s = 0, oSpan; oSpan = aSpans[s]; s++)
        {
            for (var c = 0; c < classes.length; c++)
            {
                if (hasCssClass(oSpan, classes[c]))
                {
                    var origUTC = oSpan.getAttribute("UTC");
                    if (origUTC)
                    {
                        oSpan.innerHTML = _WtShortLocalTimeFromUtc(origUTC);
                        oSpan.title = _WtExplicitLocalTimeFromUtc(origUTC);
                    }
                }
            }
        }
    }   
}

function _WtWriteCssInclude(cssFilename)
{
    document.write("<link type=\"text/css\" href=\"" + _WtSysBase + "_wykiThreading/css/" +  cssFilename + ".css\" rel=\"stylesheet\" />");
}

function _WtIncludeBrowserSpecificCss()
{
    if (browser.isSI || browser.isCR)
    {
        _WtWriteCssInclude("safari");
        
        if (browser.version < 2)
        {
            _WtWriteCssInclude("safariOld");
        }
        else {
            _WtWriteCssInclude("safariModern");
        }
    }
    else if (browser.isFF)
    {
        _WtWriteCssInclude("firefox");
        
        if (browser.version < 2)
        {
            _WtWriteCssInclude("firefoxOld");
        }
        else {
            _WtWriteCssInclude("firefoxModern");
        }        
    }
    else if (browser.isIE)
    {
        _WtWriteCssInclude("msie");
        
        if (browser.version <= 6)
        {
            _WtWriteCssInclude("msie6");     
        }
        else if (browser.version == 7)
        {
            _WtWriteCssInclude("msie7");
        }
        else if (browser.version == 8)
        {
            _WtWriteCssInclude("msie8");
        }        
        else {
            _WtWriteCssInclude("msieModern");
        }
    } 
}

_WtIncludeBrowserSpecificCss();

function _WtResetEventCounterRowAltBackgrounds(oEventList)
{
    var itemCount = getChildElemCount(oEventList);
    var oCurrItem = getFirstChildElem(oEventList);
    
    for (var i = 0; i < itemCount; i++)
    {
        if (i % 2 == 1)
        {
            oCurrItem.className = "wt_alertItem";
        }
        else
        {
            oCurrItem.className = "wt_alertItem wt_alertItemAltBackground";
        }
        
        oCurrItem = getNextSiblingElem(oCurrItem);
    }
}
