
function Cal_TableClick(ctl, evt)
{
    var targetCell = tic_Utilities.GetTargetCtl(evt) ;
    if (targetCell.className == "otherMonth" || targetCell.tagName != "TD" || targetCell.parentNode.tagName != "TR" || targetCell.parentNode.parentNode.tagName != "TBODY")
        return ;

    var selectedDate = new Date(ctl.getAttribute("currentMonth")) ;
    selectedDate.setDate(selectedDate.getDate() + Number(targetCell.innerHTML) - 1) ;

    ctl.setAttribute("selectedDate", selectedDate) ; 
    Cal_ResetSelection(ctl) ; 
}

function Cal_ResetSelection(calTable)
{
    var firstDay=-1, lastDay=-1, selectedDay=-1 ;
    var currentMonth = new Date(calTable.getAttribute("currentMonth")) ;
    var selectedDate = new Date(calTable.getAttribute("selectedDate")) ;
    if (currentMonth.getMonth() == selectedDate.getMonth() &&
        currentMonth.getFullYear() == selectedDate.getFullYear())
    {
        selectedDay = selectedDate.getDate() ;
        switch (calTable.getAttribute("dateRange"))
        {
            default:
            case "day":
                firstDay = lastDay = selectedDay
                break ;
            case "month":
                firstDay = 1 ;
                lastDay = 31 ;
                break ;
            case "week": 
                firstDay = selectedDay - selectedDate.getDay() ;
                lastDay  = selectedDay + 6 - selectedDate.getDay() ;
                break ;
        } 
    }   

    var dateRows = Cal_GetDateRows(calTable) ;
    var searchRow = 0, searchCol = 0 ;
    for (searchCol=0 ; searchCol<7 ; ++searchCol)
        if (dateRows[searchRow][searchCol].className != "otherMonth")
            break ;
                
    for (var rows=searchRow; rows<6 ; ++rows)
        for (var cols=(rows?0:searchCol); cols<7 ; ++cols)
        {
            var cell = dateRows[rows][cols] ;
            if (cell.className == "otherMonth")
                break ;
            
            var cellDate = Number(cell.innerHTML) ;                
            cell.className = "" ;
            if (cellDate >= firstDay && cellDate <= lastDay)
                cell.className = "selected" ;
            if (cellDate == selectedDay)
                cell.className += " selectedDate" ;
        }     
        
   Cal_ReloadAjaxData(calTable.id) ;                       
}

function Cal_SwitchRange(anchor, calID, range)
{
    var calTable = document.getElementById(calID) ;
    if (calTable.getAttribute("dateRange") == range)
        return ;

    var container = anchor.parentNode ;
    while (container && container.tagName != "DIV")
        container = container.parentNode ;
    if (container.className != 'calendarNav')
        return ;        
        
    var anchors = container.getElementsByTagName("SPAN") ;        
    for (var ii=0 ; ii<anchors.length ; ii++)
        anchors[ii].className = "" ;        
    anchor.className = "selected" ;             
    
    calTable.setAttribute("dateRange", range) ;
    Cal_ResetSelection(calTable) ;
}

function Cal_InitCalendar(calID)
{
    var calTable = document.getElementById(calID) ;
    
    var today = new Date(), firstOfMonth = new Date() ;
    
    firstOfMonth.setDate(1) ;
    var lastOfMonth = Cal_FindLastOfMonth(new Date()) ;

    Cal_ResetCalendar(calTable, firstOfMonth) ;
}

function Cal_FindLastOfMonth(dayInMonth)
{
    var maxDaysToEnd = 31 - dayInMonth.getDate() ;
    
    var lastOfMonth = new Date() ;
    lastOfMonth.setDate(dayInMonth.getDate() + maxDaysToEnd) ; 
    while (lastOfMonth.getDate() < 10)
        lastOfMonth.setDate(lastOfMonth.getDate() - 1) ;
        
    return lastOfMonth ;            
}

function Cal_ResetCalendar(calTable, firstOfMonth) 
{    
    var becauseMacsDontPlayFair = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] ;
    Cal_GetHeaderCell(calTable).innerHTML = becauseMacsDontPlayFair[firstOfMonth.getMonth()] + " " + firstOfMonth.getFullYear() ;

    var dateRows = Cal_GetDateRows(calTable) ;
    var dateToFill = new Date(firstOfMonth.toString()) ;
    dateToFill.setDate(firstOfMonth.getDate() - (firstOfMonth.getDay()==0?7:firstOfMonth.getDay())) ;
    
    for (var rows=0 ; rows<6 ; ++rows)
        for (var cols=0 ; cols<7 ; ++cols, dateToFill.setDate(dateToFill.getDate() + 1))
        {
            var cell = dateRows[rows][cols] ;
            cell.innerHTML = dateToFill.getDate() ; 
            cell.className = (dateToFill.getMonth() != firstOfMonth.getMonth())?"otherMonth":"" ;
        }
        
    calTable.setAttribute("currentMonth", firstOfMonth.toString()) ;          
    Cal_ResetSelection(calTable) ;
}

function Cal_JumpSelection(selectedDate, newFirstOfMonth)
{
    var newDate = new Date(newFirstOfMonth) ;
    newDate.setDate(selectedDate.getDate()) ;
    
    while (newDate.getMonth() != newFirstOfMonth.getMonth())
        newDate.setDate(newDate.getDate() - 1) ;

    return newDate ;
}

function Cal_NextMonth(calID)
{
    var calTable = document.getElementById(calID) ;
    if (!calTable)
        return ;
    
    var calDate = new Date(calTable.getAttribute("currentMonth")) ;
    calDate.setMonth(calDate.getMonth() + 1) ;

    var selectedDate = new Date(calTable.getAttribute("selectedDate")) ;
    calTable.setAttribute("selectedDate", Cal_JumpSelection(selectedDate, calDate).toString()) ;
    
    Cal_ResetCalendar(calTable, calDate) ;    
}

function Cal_PrevMonth(calID)
{
    var calTable = document.getElementById(calID) ;
    if (!calTable)
        return ;
    var calDate = new Date(calTable.getAttribute("currentMonth")) ;
    calDate.setMonth(calDate.getMonth() - 1) ;    

    var selectedDate = new Date(calTable.getAttribute("selectedDate")) ;
    calTable.setAttribute("selectedDate", Cal_JumpSelection(selectedDate, calDate).toString()) ;
    
    Cal_ResetCalendar(calTable, calDate) ;
}

function Cal_GetDateRows(calTable)
{
    var allRows = calTable.getElementsByTagName("TR") ;     
    var retArray = new Array(6) ;
    for (var ii=0 ; ii<6 ; ++ii)
        retArray[ii] = allRows[ii+2].getElementsByTagName("TD") ;
        
    return retArray ;        
}

function Cal_GetHeaderCell(calTable) 
{
    return document.getElementById('calTitle' + calTable.getAttribute("blockId")) ; 
}

function Cal_PrevRange(calID)
{
    var calTable = document.getElementById(calID) ;
    if (!calTable)
        return ;

    var selectedDate = new Date(calTable.getAttribute("selectedDate")) ;
    switch (calTable.getAttribute("dateRange"))
    {
        default:
        case 'day':
            selectedDate.setDate(selectedDate.getDate() - 1) ;
            break ;
        case 'week':
            selectedDate.setDate(selectedDate.getDate() - 7) ;
            break ;
        case 'month':
            return Cal_PrevMonth(calID) ;
            break ;
    }
    
    var firstOfMonth = new Date(selectedDate.toString()) ;
    firstOfMonth.setDate(1) ;
    calTable.setAttribute("selectedDate", selectedDate) ;
    Cal_ResetCalendar(calTable, firstOfMonth) ;
}

function Cal_NextRange(calID)
{
    var calTable = document.getElementById(calID) ;
    if (!calTable)
        return ;

    var selectedDate = new Date(calTable.getAttribute("selectedDate")) ;
    switch (calTable.getAttribute("dateRange"))
    {
        default:
        case 'day':
            selectedDate.setDate(selectedDate.getDate() + 1) ;
            break ;
        case 'week':
            selectedDate.setDate(selectedDate.getDate() + 7) ;
            break ;
        case 'month':
            return Cal_NextMonth(calID) ;
            break ;
    }
    
    var firstOfMonth = new Date(selectedDate.toString()) ;
    firstOfMonth.setDate(1) ;
    calTable.setAttribute("selectedDate", selectedDate) ;
    Cal_ResetCalendar(calTable, firstOfMonth) ;
}

function Cal_Return(calID)
{
    Cal_ReloadAjaxData(calID) ;                           
}

function Cal_ClassificationCheck(calID, allID)
{
    FilterBlock_UncheckAll(allID) ;
    Cal_ReloadAjaxData(calID) ;                           
}

function Cal_ClassificationCheckAll(allCtl, calID, blockID, classID)
{
    FilterBlock_CheckAll(allCtl, blockID, classID)
    Cal_ReloadAjaxData(calID) ;                           
}

function Cal_KeywordFilter(calID)
{
    Cal_ReloadAjaxData(calID) ;    
}

function Cal_FormatClassifications(calTable, blockID)
{
    var blockPrefix = FilterBlock_MakePrefix(blockID) ; 
    var allInputs = document.getElementsByTagName("INPUT") ;

    var classArgs = "";    
    for (var ii=0 ; ii<allInputs.length ; ++ii)
    {
        var myId = allInputs[ii].id ;
    
        if (allInputs[ii].type == "checkbox" &&   // may be a filter checkbox
            allInputs[ii].checked &&              // it is checked
            myId.indexOf(blockPrefix) == 0)       // and it is mine, all mine
            classArgs += myId + "!" ;
    }
    
    return  classArgs ;   
}

function Cal_ReloadAjaxData(calID) 
{
    var calTable = document.getElementById(calID) ;
    var blockID = calTable.getAttribute("blockID") ;
    
    var selectedDate = new Date(calTable.getAttribute("selectedDate")) ;    
    
    var ajaxArgs = new Array() ;
    ajaxArgs[ajaxArgs.length] = calTable.getAttribute("docID") ;
    ajaxArgs[ajaxArgs.length] = blockID ; 
    ajaxArgs[ajaxArgs.length] = String(selectedDate.getMonth()+1) + "/" + String(selectedDate.getDate()) + "/" + String(selectedDate.getFullYear()) ; 
    ajaxArgs[ajaxArgs.length] = calTable.getAttribute("dateRange") ;
    if (document.getElementById("keywordFilter" + blockID))
        ajaxArgs[ajaxArgs.length] = document.getElementById("keywordFilter" + blockID).value ;
    else        
        ajaxArgs[ajaxArgs.length] = "" ;
    ajaxArgs[ajaxArgs.length] = Cal_FormatClassifications(calTable, blockID) ;

    document.getElementById("CalendarResults_" + blockID).className += " waiting" ;
    RadDisplayServiceWrapper.MakeWebServiceCall("Calendar_Main" + blockID, CalendarAjax.GetResultsData, ajaxArgs, Cal_AjaxComplete, [blockID], true) ;
}

function Cal_ViewCalItem(calID, itemNumber)
{
    var calTable = document.getElementById(calID) ;
    var blockID = calTable.getAttribute("blockID") ;

    var ajaxArgs = new Array() ;
    ajaxArgs[ajaxArgs.length] = calTable.getAttribute("docID") ;
    ajaxArgs[ajaxArgs.length] = blockID ; 
    ajaxArgs[ajaxArgs.length] = itemNumber ; 
    
    document.getElementById("CalendarResults_" + blockID).className += " waiting" ;
    RadDisplayServiceWrapper.MakeWebServiceCall("Calendar_Main" + blockID, CalendarAjax.GetEventItem, ajaxArgs, Cal_AjaxComplete, [blockID], true) ;    
}

function Cal_AjaxComplete(blockID, responseAsJSON, responseAsXml, responseAsText)
{
    var resultsArea = document.getElementById("CalendarResults_" + blockID) ;
    if (!resultsArea)
        return window.alert("Lost results") ;
    resultsArea.className = "CalendarResults" ;                

    resultsArea.innerHTML = responseAsJSON ;
}

