﻿
var m_CalendarControl;
var m_CalendarFocusElement;
var m_CalendarBoundControl;
var m_BestWindow;

function showPeriscopixCalendar(p_BoundControl)
{
    var l_Window = window;
    var l_BestWindow = null;
    
    while(l_Window != null)
    {
        var l_PeriscopixCalendar = l_Window.document.getElementById("PeriscopixCalendar");
        
        if((l_PeriscopixCalendar != null) && (l_PeriscopixCalendar.value == "v1.01/2009"))
        {
            l_BestWindow = l_Window;
        }
    
        if((l_Window.parent == null) || (l_Window.parent == l_Window))
        {
            l_Window = null;
        }
        else
        {
            l_Window = l_Window.parent;
        }
    }
    
    if(l_BestWindow != null)
    {
        m_CalendarControl = l_BestWindow.showCalendarWithBoundControl(p_BoundControl);
        m_BestWindow = l_BestWindow;
    }
}

function showCalendar(e)
{
    var l_DateElement = getEventTarget(e);
    
    if(l_DateElement != null)
    {
        showCalendarWithBoundControl(l_DateElement);
    }
}

function showCalendarWithBoundControl(p_BoundControl)
{
    m_CalendarControl = document.getElementById("Calendar");
    m_CalendarFocusElement = null;
    
    if(p_BoundControl != null)
    {
        m_CalendarBoundControl = p_BoundControl;
        
        setCalendarDate(m_CalendarBoundControl.value); // we supposed this is a textbox

        var l_Top = getScreenTop(p_BoundControl);
        var l_Left = getScreenLeft(p_BoundControl);
        var l_ClientWidth = calendarGetBrowserWindowWidth();
        var l_CalendarWidth = 200;

        if(l_Left + l_CalendarWidth + 48 > l_ClientWidth)
        {
            l_Left = (l_ClientWidth - l_CalendarWidth - 48);
        }
        
        var l_CalendarTop = (l_Top - 200);
        
        if (l_CalendarTop < 0)
        {
            l_CalendarTop = 0;
        }
        
        m_CalendarControl.style.top = l_CalendarTop + "px";
        m_CalendarControl.style.left = (l_Left + 40) + "px";
        m_CalendarControl.style.display = isIE ? "inline" : "inline-table";
        m_CalendarControl.style.visibility = "visible";
        m_CalendarControl.style.zIndex = "65535";
    }
    
    return m_CalendarControl;
}

function calendarGetBrowserWindowWidth()
{
    var l_DocElement = document.documentElement;
    
    if(l_DocElement != null)
    {
        var l_ClientWidth = l_DocElement.clientWidth;
        
        if((l_ClientWidth != null) && (l_ClientWidth > 0))
        {
            return l_ClientWidth;
        }
    }
    
    return 10000; // oversized/unconstrained width
}

function hideCalendar()
{
    if(m_BestWindow != null)
    {
        if(m_BestWindow.m_CalendarControl != null)
        {
            m_BestWindow.m_CalendarControl.style.display = "none";
            m_BestWindow.m_CalendarControl = null;
        }
        
        m_BestWindow = null;
    }
    
    if(m_CalendarControl != null)
    {
        m_CalendarControl.style.display = "none";
        m_CalendarControl = null;
    }

    m_CalendarBoundControl = null;
}

// CALENDAR BLUR ===================================================


// =================================================================

function processFocusOut(e)
{
    if(e != null)
    {
        if(e.toElement != null)
        {
            var l_Calendar = document.getElementById("Calendar");
        
            var l_Element = e.toElement;
            
            while(l_Element != null)
            {
                if((l_Element == m_CalendarBoundControl) || (l_Element == l_Calendar))
                {
                    return;
                }
                
                l_Element = l_Element.parentNode;            
            }
        }
        else if((m_BestWindow != null) && (m_BestWindow.m_CalendarFocusElement != null))
        {
            return;
        }    
    }

    hideCalendar();
}

function IsSameDate(p_Date1, p_Date2)
{
    return (p_Date1 - p_Date2) == 0;
}

function IsToday(p_Date)
{
    var l_Today = new Date(Date());
    l_Today = Date(l_Today.getFullYear(), l_Today.getMonth(), l_Today.getDate())

    return (p_Date - l_Today) == 0;
}

function IsWeekend(p_Date)
{
    var l_Weekday = p_Date.getDay()
    return (l_Weekday == 0) || (l_Weekday == 6);
}

function getCalendarDate()
{
    var l_PreviousPosition = document.getElementById("CalendarCurrentPosition").value;
    var l_PreviousDate = document.getElementById("CalendarRow" + l_PreviousPosition.substring(0, 1)).value;
    l_PreviousDate = new Date(l_PreviousDate);
    l_PreviousDate = new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth(), l_PreviousDate.getDate() + Number(l_PreviousPosition.substring(1, 2)));
    return l_PreviousDate;
}

function setCalendarDate(p_Date)
{
    var l_DateValue = parseDateValue(p_Date);

    if(!isNaN(l_DateValue))
    {
        calendarRebuild(new Date(l_DateValue));
    }
    else
    {
        calendarRebuild(new Date());
    }
}

function calendarClick(e)
{
    var l_TargetId = getEventTarget(e).id;
    var l_NewPosition;
    
    switch(l_TargetId.length)
    {
        case 14:
            l_NewPosition = l_TargetId.substring(12, 14);
            break;
            
        case 12:
            l_NewPosition = l_TargetId.substring(10, 12);
            break;
    }
    
    var l_PreviousPosition = document.getElementById("CalendarCurrentPosition").value;
    var l_CalendarMonth = Number(document.getElementById("CalendarMonth").value) - 1;

    if (l_PreviousPosition != l_NewPosition)
    {
        var l_PreviousDate = document.getElementById("CalendarRow" + l_PreviousPosition.substring(0, 1)).value;
        l_PreviousDate = new Date(l_PreviousDate);
        l_PreviousDate = new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth(), l_PreviousDate.getDate() + Number(l_PreviousPosition.substring(1, 2)));
        
        var l_ColumnElement = document.getElementById("CalendarTd" + l_PreviousPosition);
        var l_LinkElement = document.getElementById("CalendarLink" + l_PreviousPosition);

        if(IsToday(l_PreviousDate))
        {
            l_ColumnElement.className = "CalendarTdToday";
        }
        else if(IsWeekend(l_PreviousDate))
        {
            l_ColumnElement.className = "CalendarTdWeekend";
        }
        else
        {
            l_ColumnElement.className = "CalendarTdWeekday";
        }
        
        if(IsToday(l_PreviousDate))
        {
            l_LinkElement.className = "CalendarLinkToday";
        }
        else if(l_PreviousDate.getMonth() == l_CalendarMonth)
        {
            l_LinkElement.className = "CalendarLinkNormal";
        }
        else
        {
            l_LinkElement.className = "CalendarLinkOtherMonth";
        }
        
        l_ColumnElement = document.getElementById("CalendarTd" + l_NewPosition);
        l_LinkElement = document.getElementById("CalendarLink" + l_NewPosition);

        l_ColumnElement.className = "CalendarTdCurrentDate";
        l_LinkElement.className = "CalendarLinkCurrentDate";
        
        document.getElementById("CalendarCurrentPosition").value = l_NewPosition;
    }
    
    if(m_CalendarBoundControl != null)
    {
        m_CalendarBoundControl.value = dateToString(getCalendarDate());

        hideCalendar();
    }
}

function getMonthName(p_Month)
{
    var l_MonthNames = new Array(12);
        
    l_MonthNames[0] = "January";
    l_MonthNames[1] = "February";
    l_MonthNames[2] = "March";
    l_MonthNames[3] = "April";
    l_MonthNames[4] = "May";
    l_MonthNames[5] = "June";
    l_MonthNames[6] = "July";
    l_MonthNames[7] = "August";
    l_MonthNames[8] = "September";
    l_MonthNames[9] = "October";
    l_MonthNames[10] = "November";
    l_MonthNames[11] = "December";
    
    var l_MonthName = l_MonthNames[p_Month]
    
    return l_MonthName;
}

function calendarGotoPreviousMonth(e)
{
    m_CalendarFocusElement = getEventTarget(e);

    var l_PreviousDate = getCalendarDate();
    var l_NewDate = new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth() - 1, l_PreviousDate.getDate());
    var l_FirstDayofMonth = new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth() - 1, 1);
    
    if(l_NewDate.getMonth() != l_FirstDayofMonth.getMonth())
    {
        l_NewDate = new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth(), 0);
    }
    
    calendarRebuild(l_NewDate);
}

function calendarGotoNextMonth(e)
{
    m_CalendarFocusElement = getEventTarget(e);

    var l_PreviousDate = getCalendarDate();
    
    l_NewDate = new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth() + 1, l_PreviousDate.getDate());

    if(l_NewDate.getMonth() != new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth() + 1, 1).getMonth())
    {
        l_NewDate = new Date(l_PreviousDate.getFullYear(), l_PreviousDate.getMonth() + 2, 0);
    }
    
    calendarRebuild(l_NewDate);
}

function calendarRebuild(p_CurrentDate)
{
    p_CurrentDate.setHours(0);
    p_CurrentDate.setMinutes(0);
    p_CurrentDate.setSeconds(0);
    p_CurrentDate.setMilliseconds(0);

    var l_FirstDayofMonth = new Date(p_CurrentDate.getFullYear(), p_CurrentDate.getMonth(), 1);
    var l_CalendarMonth = p_CurrentDate.getMonth();
    var l_Offset = l_FirstDayofMonth.getDay() > 0 ? l_FirstDayofMonth.getDay() - 2 : 5;
    var l_DateToShow = new Date(l_FirstDayofMonth.getFullYear(), l_FirstDayofMonth.getMonth(), -l_Offset);
    
    var l_CurrentX = 0; 
    var l_CurrentY = 0;

    for(l_WeekOff = 0; l_WeekOff < 6; l_WeekOff++)
    {
        var l_CalendarRow = document.getElementById("CalendarRow" + l_WeekOff);
        l_CalendarRow.value = l_DateToShow.getFullYear() + "/" + (l_DateToShow.getMonth() + 1) + "/" + l_DateToShow.getDate();

        for(l_DayOff = 0; l_DayOff < 7; l_DayOff++)
        {
            var l_CellElement = document.getElementById("CalendarTd" + l_WeekOff + "" + l_DayOff);
            var l_LinkElement = document.getElementById("CalendarLink" + l_WeekOff + "" + l_DayOff);

            if(IsSameDate(l_DateToShow, p_CurrentDate))
            {
                l_CellElement.className = "CalendarTdCurrentDate";
                l_CurrentX = l_DayOff;
                l_CurrentY = l_WeekOff;
            }
            else if(IsToday(l_DateToShow))            
            {
                l_CellElement.className = "CalendarTdToday";
            }
            else if(IsWeekend(l_DateToShow))
            {
                l_CellElement.className = "CalendarTdWeekend";
            }
            else
            {
                l_CellElement.className = "CalendarTdWeekday";
            }
            
            if(IsSameDate(l_DateToShow, p_CurrentDate))
            {
                l_LinkElement.className = "CalendarLinkCurrentDate";
            }
            else if(IsToday(l_DateToShow))
            {
                l_LinkElement.className = "CalendarLinkToday";
            }
            else if(l_DateToShow.getMonth() == l_CalendarMonth)
            {
                l_LinkElement.className = "CalendarLinkNormal";
            }
            else
            {
                l_LinkElement.className = "CalendarLinkOtherMonth";
            }

            l_LinkElement.innerText = l_DateToShow.getDate();
            l_LinkElement.title = l_DateToShow.getDate() + " " + getMonthName(l_DateToShow.getMonth());
            
            l_DateToShow = new Date(l_DateToShow.getFullYear(), l_DateToShow.getMonth(), l_DateToShow.getDate() + 1);
        }        
    }

    setElementValue("CalendarMonth", l_CalendarMonth);
    setElementValue("CalendarCurrentPosition", l_CurrentY + "" + l_CurrentX);
        
    setInnerText("CalendarTitle", getMonthName(l_CalendarMonth) + " " + p_CurrentDate.getFullYear());
}

