﻿//kill right-click

//function IEclick() 
//{
//    if (document.all) return false;
//}
//function NSclick(e) 
//{
//    if (document.layers||(document.getElementById&&!document.all)) 
//    { 
//	    if (e.which==2||e.which==3) return false;
//    }
//}
//if (document.layers) 
//{
//    document.captureEvents(Event.MOUSEDOWN);
//    document.onmousedown=NSclick;
//}
//else
//{
//    document.onmouseup=NSclick;
//    document.oncontextmenu=IEclick;
//}
//document.oncontextmenu=new Function("return false")


//cookies//
function createCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name, "", -1);
}


// -------------------------------- AVAILABILITY -------------------------------- //


//Constants
var DAYMS = 86400000;// the number of miliseconds in 24 hours
var TBMS = 1800000;// the number of miliseconds in 1 timeblock (30 minutes)
var MINDISPLAYDAYS = 4;

//server-side
var gRangeMeetingStartMS;// the UTC timecode in millisenconds when the meeting range starts
var gRangeMeetingEndMS;// the UTC timecode in millisenconds when the meeting range starts
var gRangeDisplayStartMS;// the UTC timecode in millisenconds when the meeting range starts
var gRangeDisplayEndMS;// the UTC timecode in millisenconds when the meeting range starts
var arrSelected = new Array();
   
//client-side
var gClientPerfMon; //used to time the blit duration
var gClientAnchorDate; //for now, this takes the current client calendar day
var gClientDisplayDays; // number of days to display on screen (calendar columns)
var gTzOffsetMS=(new Date()).getTimezoneOffset() * 60000; //clients default timezone offset from UTC in miliseconds
var gDisplayTimeFormatOption = ''; //'military', 'normal' or ''; used by "setTimeFormat()"
var gDisplayStartTimeIndex=18; //9:00am; client calendar's first time position by indexPos of 30min increments;could eventually be set by cookie
var gDisplayEndTimeIndex=36; //6:00pm; client calendar's last time position by indexPos of 30min increments;could eventually be set by cookie
var gTempSelectionArray = new Array();
var gTempSelectionState;
var gIsClickAndDrag = false;
    
//design preference
gCarrotOutlineSize = 5; // the thickness of the border in pixels of the highlight carrot
gTimeblockHeight = 26; // hardcoded to present design
gTimeblockWidth = 116; // hardcoded to present design
gClientDisplayDays = 5; //see above

// mouse down flag
var gVarMouseDownFlag = false;
var gVarMouseDownAction = 'Add';
var gVarCleanupArray = new Array();
var gIsConfirmation = false;


// TIMEZONE //

function checkTimeZone(strElementID) {
    var hdTimeZone = document.getElementById(strElementID);
    var rightNow = new Date();
    var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
    var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
    var temp = date1.toGMTString();
    var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1));
    var temp = date2.toGMTString();
    var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1));
    var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
    var hoursDiffDaylightTime = (date2 - date4) / (1000 * 60 * 60);

    if (hoursDiffDaylightTime == hoursDiffStdTime) {
        hdTimeZone.value = hoursDiffStdTime;
    } else {
        hdTimeZone.value = hoursDiffDaylightTime;
    }
    var now = new Date();
    hdTimeZone.value = (now.getTimezoneOffset() / 60) * (-1);
    createCookie("CurTimezone", (now.getTimezoneOffset() / 60) * (-1), 1)
}

// AVAILABILITY DISPLAY AND INPUT //

//this function is called by Step 4'sw Body tag onload() event
    
function initSelection(){
    gClientAnchorDate = new Date(gRangeDisplayStartMS); //init anchor date is hardcoded to first day or valid meeting range
    document.body.onmouseup = function (){ MMOnMouseUp('') };
    
    MM_SetHourRange();
    callDrawCalendar();
}

function initSolutions(){
    gClientPerfMon = new Date();
    gClientAnchorDate = new Date(gRangeDisplayStartMS); //init anchor date is hardcoded to first day or valid meeting range
    document.body.onmouseup = function (){ MMOnMouseUp('') };
    //MM_SetHourRange();
    //need to check if solutions fall outside of gDisplayStartTimeIndex,gDisplayEndTimeIndex
    //need to first generate arrAttendee from solution. see class in step 4.
    //snoopdog
    MM_SetHourRange();
    ValidateStartTimeIndex();
    ValidateEndTimeIndex();
    DrawAvailability(gClientAnchorDate,gDisplayStartTimeIndex,gDisplayEndTimeIndex,gClientDisplayDays);
    bindSolutionTimeblocks();
    bindSolutions();
   
    
    window.status = "Time to render=" + (new Date().getTime() - gClientPerfMon.getTime()) + "ms."; //, gRangeDisplayStartMS=" + new Date(gRangeDisplayStartMS) + ", gRangeMeetingStartMS=" + new Date(gRangeMeetingStartMS) + ", AnchorDate="+gClientAnchorDate + ", gRangeMeetingEndMS=" + new Date(gRangeMeetingEndMS)+ ", gRangeDisplayEndMS=" + new Date(gRangeDisplayEndMS);
}

function MM_TipSolution(i){
    var sb = new StringBuilder('');
    
    var starttime = gSolutionArray[i][0];
    var endtime = gSolutionArray[i][1];
    var full = gSolutionArray[i][2];
    var partial = gSolutionArray[i][3];
    
    sb.append('<div style="padding-bottom: 2px; border-bottom: 1px solid #000;"><b>Participants in Full Attendance:</b></div>');
    sb.append('<div>');
    for (var j=0;j<full.length;j++){
        var participant = getParticipantByID(full[j]);
        
        if(participant != '') sb.append(participant + '<br />');
    }
    sb.append('</div>');
    
    if (partial.length >0){
        sb.append('<br /><div style="padding-bottom: 2px; border-bottom: 1px solid #000;"><b>Participants who are only partially available:</b></div>');
        sb.append('<div>');
        for (var j=0;j<partial.length;j++){
            var participant = getParticipantByID(partial[j]);
            
            if(participant != '') sb.append(participant + '<br />');
        }
        sb.append('</div>');
	}
    
    return sb.toString();
}

function getParticipantByID(id){
    var participant = '';
    
    for (var i=0; i<gSolutionUserArray.length;i++){
        if(gSolutionUserArray[i][0] == parseInt(id)){
            participant = gSolutionUserArray[i][1] + ' ' + gSolutionUserArray[i][2];
            if (gSolutionUserArray[i][3] == 0){
                participant += ' (optional)';
            }
        }
    }
    
    if (id == 0) participant += ' (Organizer)';
    
    return participant;
}
function AvailabilityNavDay(dayIndexPos){
    var testDate = new Date(gClientAnchorDate.getTime());
    var DisplayDateStart = new Date(gRangeDisplayStartMS);
    var ScreenDateEnd = new Date(gRangeDisplayEndMS - ((gClientDisplayDays-1) * DAYMS));
    
    var prevButtonState = false;
    var nextButtonState = false;
    
    testDate.addDays(dayIndexPos);
    testDate.setHours(0,0,0,0);
    
    if (dayIndexPos == -1 && testDate < DisplayDateStart) return void(0);
    if (dayIndexPos == 1 && testDate > ScreenDateEnd) return void(0);
    
    if(DisplayDateStart.getTime() == testDate.getTime()){
        prevButtonState = true;
    }
    
    if(testDate.getTime() == ScreenDateEnd.getTime()){
        nextButtonState = true;
    }
    
    if (dayIndexPos == 0 && testDate > ScreenDateEnd) nextButtonState = true;;
    
    document.getElementById("btnNavPrevDay").disabled = prevButtonState;
    document.getElementById("btnNavNextDay").disabled = nextButtonState;
    
    gClientAnchorDate = testDate;
    callDrawCalendar();
}
        
function callDrawCalendar()
{
    gClientPerfMon = new Date();
    //added by frank 
    ValidateStartTimeIndex();
    ValidateEndTimeIndex();
    
    DrawAvailability(gClientAnchorDate,gDisplayStartTimeIndex,gDisplayEndTimeIndex,gClientDisplayDays);
    bindStartTimeFilterDDL(gDisplayStartTimeIndex);
    bindEndTimeFilterDDL(gDisplayEndTimeIndex);
    bindTimeblocks();
    bindAggregate();
    bindSelections();
    bindCalendar();
    
    window.status = "Time to render=" + (new Date().getTime() - gClientPerfMon.getTime()) + "ms."; //, gRangeDisplayStartMS=" + new Date(gRangeDisplayStartMS) + ", gRangeMeetingStartMS=" + new Date(gRangeMeetingStartMS) + ", AnchorDate="+gClientAnchorDate + ", gRangeMeetingEndMS=" + new Date(gRangeMeetingEndMS)+ ", gRangeDisplayEndMS=" + new Date(gRangeDisplayEndMS);
}

function MM_ApplyCarrotOffset(px){
    px = parseInt(px.substring(0,px.indexOf('px')));
    px -= gCarrotOutlineSize;
    return px;
}

function MM_SetHourRange()
{
    //this function checks to see if any select timeblocks exist before or after the display starttime 
    //and endtime and changes to bounds accordingly.
    var MinHour = 48, MaxHour = 0;        
    var i = 0;
    var date = null, hour = 0;

    if (arrSelected.length>0)
    {
        for(i=0;i<arrSelected.length;i++)
        {
            date = new Date();
            date.setTime(parseInt(arrSelected[i][0]));
            hour = date.getHours() * 2;
            if (MinHour > hour) MinHour = hour;

            date = new Date();
            date.setTime(parseInt(arrSelected[i][1]));
            hour = date.getHours() * 2;
            if (MaxHour < hour) MaxHour = hour;
        }
    }
    if (arrAggregate.length>0)
    {
        for(i=0;i<arrAggregate.length;i++)
        {
            date = new Date();
            date.setTime(parseInt(arrAggregate[i][0]));
            hour = date.getHours() * 2;
            if (MinHour > hour) MinHour = hour;
            if (MaxHour < hour) MaxHour = hour;
        }
    }
    
    if(MinHour > 18) MinHour = 18;
    if(MaxHour < 34) MaxHour = 34;

    gDisplayStartTimeIndex = MinHour;
    gDisplayEndTimeIndex = MaxHour;
}

function bindStartTimeFilterDDL(selectedIndex){
    var ddlStartHour = document.getElementById("ddlStartHour");
    if(ddlStartHour!=null) ddlStartHour.selectedIndex = selectedIndex;
}

function bindEndTimeFilterDDL(selectedIndex){
    
    var ddlEndHour = document.getElementById("ddlEndHour");
    if(ddlEndHour!=null) ddlEndHour.selectedIndex = selectedIndex - 34;
        
    
}

function bindCalendar()
{
    // draw calendar in "divDate" 
    ChooseDate(document.getElementById("divCalendar"), gClientAnchorDate);
    
    // Startbound, endbound, selectiondate array, display days ______________________> tbs from server?
    SetCalendarVarible(gRangeMeetingStartMS - DAYMS + 1, gRangeMeetingEndMS, arrSelected, gClientDisplayDays);
    
    // Set current selected days: start date, length
    SelectWeek(gClientAnchorDate,gClientDisplayDays);
}

function CalendarOnClick(selectedDate)
{
    gClientAnchorDate = selectedDate;
    callDrawCalendar();
    AvailabilityNavDay(0);
}

function findPosY(obj)
  {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
  }

function DrawAvailability(startDate,gDisplayStartTimeIndex,gDisplayEndTimeIndex,gClientDisplayDays)
{
    // Set Scheduler height
    var divheight = (gDisplayEndTimeIndex - gDisplayStartTimeIndex)*26 + 55;
    document.getElementById('divAvailability').style.height = divheight + 'px';
    document.getElementById('divAvailabilityFoundation').style.height = (divheight - 2) + 'px';
    
    var sectHeight = findPosY(document.getElementById('divAvailability')) - findPosY(document.getElementById('boxInsideLeft')) + divheight + 45;
    document.getElementById('boxInsideLeft').style.height = sectHeight + 'px';
    
    // create a StringBuilder
    var sb = new StringBuilder('');
    
    //Column Headers
    sb.append('<div id="tbTimeHeader"></div>');

    var curDay = new Date(startDate.getTime()); curDay.setHours(0,0,0,0);
    for(var i=0;i<gClientDisplayDays;i++)
    {
        sb.append('<div id="co' + curDay.getTime() +'" style="left: ' + (73 + 116 * parseInt(i)) + 'px;" onclick="AvailabilityOnClickColumn(this);" action="Add" class="tbDayHeader"><div unselectable="on" class="tbTextOffsetDay">' + setDayFormat(curDay) + '</div></div>');
        curDay.addHours(24);
    }
    
    //Row Headers
    var curHour, curClass;
    for(i = gDisplayStartTimeIndex; i < gDisplayEndTimeIndex; i++)
    {
        if (parseInt(i)/2 == parseInt(parseInt(i)/2))
        {
            curClass = 'tbTimeRowTop';
            curHour = parseInt(i)/2;
            if(curHour <= 12){
                if(curHour == 0){
                    curHour = '12 am';
                }else{
                    curHour = curHour + ' am';
                    if(curHour == '12 am') curHour = '12 pm';
                }
            }else{
                curHour = parseInt(curHour)-12 + ' pm';
            }
        }
        else 
        {
            curClass = 'tbTimeRowBottom';
            curHour = '';
        }
        sb.append('<div unselectable="on" id="tr' + i + '" style="top: ' + (53 + parseInt(i - gDisplayStartTimeIndex) * 26) + 'px;" onclick="AvailabilityOnClickRow(this);" action="Add" class="' + curClass + '"><div class="tbTextOffsetHour">' + curHour + '</div></div>');
    }
    //Timeblocks
    startDate = new Date(startDate.getTime()); startDate.setHours(0,0,0,0);
    var xPo = 0, yPo = 0, tid = 0;
    for (var colNum=0; colNum<gClientDisplayDays; colNum++)
    {
        for (var rowNum=gDisplayStartTimeIndex; rowNum < gDisplayEndTimeIndex; rowNum++)
        {
            xPo = 73 + parseInt(116 * colNum);
            yPo = 53 + parseInt(26 * parseInt(rowNum-gDisplayStartTimeIndex));
            curDay = startDate.getTime() + parseInt(colNum) * DAYMS + parseInt(rowNum) * TBMS;
            
            sb.append('<div id="tb' + curDay + '" style="left: ' + xPo + 'px; top: ' + yPo + 'px;"');
            sb.append(' onmouseover="AvailabilityOnMouseOver(this)" onmouseout="AvailabilityOnMouseOut(this);" onmousedown="AvailabilityOnMouseDown(this);" class="tb">');
            
                // Layer 1: state
                if (curDay < gRangeMeetingStartMS || curDay > gRangeMeetingEndMS){
                    // Out of bound
                    sb.append('<div id="tb' + curDay + '_1" class="tbStateOutOfBounds"></div>');
                } else {
                    var Unavailable=false;
                    for(var i=0;i<arrUnavailable.length;i++)
                    {
                        UnavailableStartTime = arrUnavailable[i][0];
                        UnavailableEndTime = arrUnavailable[i][1];
                        if(curDay>=UnavailableStartTime && curDay<UnavailableEndTime)
                        {
                            Unavailable=true;
                            break;
                        }
                    }
                
                    // State Layer
                    if(Unavailable)
                        sb.append('<div id="tb' + curDay + '_1" class="tbStateUnavailable"></div>');
                    else
                        sb.append('<div id="tb' + curDay + '_1" class="tbState"></div>');
                }
                
                // Layer 2: Parity
                if (rowNum/2 == parseInt(rowNum/2)){
                    // top of the hour
                    sb.append('<div id="tb' + curDay + '_2" class="tbParityTop"></div>');
                } else {
                    // Bottom of the hour
                    sb.append('<div id="tb' + curDay + '_2" class="tbParityBottom"></div>');
                }
                
                // Layer 3: Selection
                sb.append('<div id="tb' + curDay + '_3" class="tbSelection"></div>');
                
                // Layer 4: Availability
                sb.append('<div id="tb' + curDay + '_4" class="tbAvailability"></div>');
                
                // Layer 5: Callout
                sb.append('<div id="tb' + curDay + '_5" class="tbCallout"></div>');

            sb.append('</div>');
        }
    }
    
    //Carrot
    sb.append('<div id="carrot"></div>');
    
    document.getElementById('divSchedulerBody').innerHTML = sb.toString();
}

function bindTimeblocks()
{
    //Selections
    if(arrSelected.length >0)
    {
        var SelectStartTime, SelectEndTime;
        var objLayer, objSelection;
        for(var i=0;i<arrSelected.length;i++)
        {
            SelectStartTime = arrSelected[i][0];
            SelectEndTime = arrSelected[i][1];
            for(var curTimeblockTicks=parseInt(SelectStartTime); curTimeblockTicks<=parseInt(SelectEndTime); curTimeblockTicks = parseInt(curTimeblockTicks) + parseInt(TBMS))
            {
                objSelection = document.getElementById('tb' + curTimeblockTicks + '_3');
                objLayer = document.getElementById('tb' + curTimeblockTicks + '_4');

                if(objSelection!=null && objLayer!=null)
                {
                    // Clear selection
                    objSelection.className = 'tbSelection';
                    
                    // Set Availability
                    if(SelectStartTime == parseInt(SelectEndTime)) 
                    {
                        // one block 
                        objLayer.className = 'tbAvailabilityOne';
                        objLayer.innerHTML = '<div unselectable="on" class="tbTextOffsetRange">' + setTimeFormat(parseInt(arrSelected[i][0])) + ' - ' + setTimeFormat(parseInt(arrSelected[i][1]) + parseInt(TBMS)) + '</div>'
                    }
                    else if(curTimeblockTicks == SelectStartTime) 
                    {
                        objLayer.className = 'tbAvailabilityStart';
                        objLayer.innerHTML = '<div unselectable="on" class="tbTextOffsetRange">' + setTimeFormat(parseInt(arrSelected[i][0])) + ' - ' + setTimeFormat(parseInt(arrSelected[i][1]) + parseInt(TBMS)) + '</div>';
                    }
                    else if(curTimeblockTicks == parseInt(SelectEndTime)) 
                    {
                        objLayer.className = 'tbAvailabilityEnd'; 
                        objLayer.innerHTML = '';
                    }
                    else
                    { 
                        objLayer.className = 'tbAvailabilityMiddle'; 
                        objLayer.innerHTML = '';
                    }
                }    
            }
        }
    }
    
    for(var i=0;i<gVarCleanupArray.length;i++){
        var objSelection = document.getElementById(gVarCleanupArray[i] + '_3');
        var objAvailability = document.getElementById(gVarCleanupArray[i] + '_4');    
        
        objSelection.className = 'tbSelection';
        objAvailability.className = 'tbAvailability';   
    }
    
    gVarCleanupArray = new Array();
}

function bindAggregate()
{
    if(arrAggregate.length > 0)
    {
        var objLayer;
        for(var i=0; i<arrAggregate.length; i++)
        {
            objLayer = document.getElementById('tb' + arrAggregate[i][0] + '_1');
            if(objLayer != null)
            {
                if (objLayer.className != 'bStateOutOfBounds')
                {
                    // Add Tooltip & opacity
                    var objBlock = document.getElementById("tb" + arrAggregate[i][0]);
                    if(objBlock!=null)
                    {
                        var arrTip = arrAggregate[i][2].toString().split('|');
                        if(arrTip.length > 0)
                        {
                            var sTip = "";
                            for(var j=0;j<arrTip.length;j++)
                            {
                                if(sTip=="") sTip = getTooltiprow(arrTip[j]);
                                else sTip += "\r\n" + getTooltiprow(arrTip[j]);
                            }
                            
                            var value = Math.round(10*(arrTip.length/(arrAttendee.length - 1)));
                            objLayer.className = 'tbStateAggregate';
                            objLayer.style.opacity = value/10;
                            objLayer.style.filter = 'alpha(opacity=' + value*10 + ')';
                            //debugging
                            //sTip = sTip + '\r\nvalue=' + value;
                            //sTip = sTip + '\r\narrTip.length=' + arrTip.length;
                            //sTip = sTip + '\r\n(arrAttendee.length - 1)=' + (arrAttendee.length - 1);
                            //end debugging
                            objBlock.title = sTip;
                        } 
                    }
                }
            }
        }
    }
}

function bindSolutionTimeblocks()
{
    if(gSolutionUnitArray.length > 0)
    {
        var objLayer;
        for(var i=0; i<gSolutionUnitArray.length; i++)
        {
            objLayer = document.getElementById('tb' + gSolutionUnitArray[i][0] + '_1');
            if(objLayer != null)
            {
                if (objLayer.className != 'bStateOutOfBounds')
                {
                    // Add Tooltip & opacity
                    var objBlock = document.getElementById("tb" + gSolutionUnitArray[i][0]);
                    if(objBlock!=null)
                    {
                        if(gSolutionUnitArray[i][1].length > 0)
                        {
                            var sTip = "";
                            for(var j=0;j<gSolutionUnitArray[i][1].length;j++)
                            {
                                if(sTip=="") sTip = getTooltiprow(gSolutionUnitArray[i][1][j]);
                                else sTip += "\r\n" + getTooltiprow(gSolutionUnitArray[i][1][j]);
                            }
                            
                            var value = Math.ceil(10*( gSolutionUnitArray[i][2]/gCellMatchDenominator ));
                            objLayer.className = 'tbStateAggregate';
                            objLayer.style.opacity = value/10;
                            objLayer.style.filter = 'alpha(opacity=' + value*10 + ')';
                            //debugging
                            //sTip = sTip + '\r\nvalue=' + value;
                            //sTip = sTip + '\r\narrTip.length=' + arrTip.length;
                            //sTip = sTip + '\r\n(arrAttendee.length - 1)=' + (arrAttendee.length - 1);
                            //end debugging
                            objBlock.title = sTip;
                        } 
                    }
                }
            }
        }
    }
}

function getTooltiprow(aid)
{
    var row = "";
    if(arrAttendee.length>0)
    {
        for(var i=0;i<arrAttendee.length;i++)
        {
            if(aid == arrAttendee[i][0])
            {
                row = arrAttendee[i][1] + " " + arrAttendee[i][2];
                break;
            }
        }
    }
    return row;
}

function navToTimeblock(tbStartTime){
    gClientAnchorDate = new Date(tbStartTime);
    
    var testIndexPos = gClientAnchorDate.getHours() * 2;
    
    if(testIndexPos < gDisplayStartTimeIndex) gDisplayStartTimeIndex = testIndexPos;
    callDrawCalendar();
}

// AVAILABILITY TIMEBLOCK EVENTS //

function AvailabilityOnMouseOver(obj){
    //only do this if the time is selectable
    var curClassName = document.getElementById(obj.id).getElementsByTagName("div")[0].className;
    var carrotObj = document.getElementById('carrot');
    
    if (curClassName == 'tbState' || curClassName == 'tbStateAggregate'){
        carrotObj.style.display = 'block';
        carrotObj.style.visibility = 'visible';
        carrotObj.style.left = MM_ApplyCarrotOffset(obj.style.left) + 'px';
        carrotObj.style.top = MM_ApplyCarrotOffset(obj.style.top) + 'px';
        carrotObj.style.width = (gTimeblockWidth + gCarrotOutlineSize * 2) + 'px';
        carrotObj.style.height = (gTimeblockHeight * gCarrotDurationInBlocks) + (gCarrotOutlineSize * 2) + 'px';
        carrotObj.style.zIndex = 5;
    
        var objTime = parseInt(obj.id.substr(2));
        var displayErrors = 0;
        
        for (var i=0;i<gCarrotDurationInBlocks;i++){
            var curMilliseconds = objTime + (i * TBMS)
            var curObjRef = 'tb' + curMilliseconds;
            var curObj = document.getElementById(curObjRef);
            
            try {
                curObj.style.zIndex = 10;
            } catch(err) {
                displayErrors++;
            }
        }
        carrotObj.style.height = ((gTimeblockHeight * (gCarrotDurationInBlocks - displayErrors)) + (gCarrotOutlineSize * 2)) + 'px';
        document.getElementById(obj.id).style.cursor = 'pointer';
        
        //selection
        if(gVarMouseDownFlag)
        {
            MM_ApplyTimeblockSelection(obj);
        }
    }
    else
    {
        document.getElementById(obj.id).style.cursor = 'not-allowed';
    }
}

function AvailabilityOnMouseDown(obj){

    if(gIsConfirmation == true){
        //snoopdog
    }else{
        var curClassName = document.getElementById(obj.id + '_1').className;

        if (curClassName == 'tbState' || curClassName == 'tbStateAggregate')
        {
            MM_ConvertFromSelection();
            gVarMouseDownFlag = true;
            gVarMouseDownAction = 'Add';
            
            var objSelection = document.getElementById(obj.id + '_3');
            var objAvailable = document.getElementById(obj.id + '_4');

            if (objAvailable.className.length > 14){
                gVarMouseDownAction = 'Remove';
            }
            
            MM_ApplyTimeblockSelection(obj);
        }
    }
}

function AvailabilityOnMouseOut(obj){
    var carrotObj = document.getElementById('carrot');
    carrotObj.style.display = 'none';
    carrotObj.style.visibility = 'hidden';
    
    var objTime = parseInt(obj.id.substr(2));
    
    for (var i=0;i<gCarrotDurationInBlocks;i++){
        var curMilliseconds = objTime + (i * TBMS)
        var curObjRef = 'tb' + curMilliseconds;
        var curObj = document.getElementById(curObjRef);
        
        try {
            curObj.style.zIndex = 1;
        } catch(err) {
        }
    }
}

function MMOnMouseUp(obj)
{
    if (gVarMouseDownFlag)
    {
        var b = false;
        var objState = document.getElementById(obj.id + '_1');
        if (obj == '') b = true;
        else if (objState!=null)
        { 
            if(objState.className == 'tbState' || objState.className == 'tbStateAggregate')
            { 
                b = true;
            }
        }
        if (b)
        {
            gVarMouseDownFlag = false;
            
            MM_ConvertToSelection();
            bindTimeblocks();
            bindSelections();
            bindCalendar();
        }
    }
}

function MM_ApplyTimeblockSelection(obj)
{
    if(gVarMouseDownFlag)
    {
        var objSelection = document.getElementById(obj.id + '_3');
        var objAvailable = document.getElementById(obj.id + '_4');

        if(gVarMouseDownAction == 'Add') 
        {
            objSelection.className = 'tbSelectionAdd';
            gTempSelectionArray.add(obj.id.substr(2));
        }
        else
        { 
            objSelection.className = 'tbSelectionRemove';
            gTempSelectionArray = MM_RemoveFromArray(gTempSelectionArray, obj.id.substr(2));
        }
    }
}

function AvailabilityOnClickColumn(obj)
{
    var curDay = new Date(); curDay.setTime(parseInt(obj.id.substr(2))); 
    var hour,min, objAvailability,objState;
    if(gTempSelectionArray.length==0) MM_ConvertFromSelection();
    for(var i = gDisplayStartTimeIndex; i < gDisplayEndTimeIndex; i++)  
    {
        hour = parseInt(i/2);
        min = 0;
        if(hour != i/2) min = 30;
        curDay.setHours(hour,min,0,0);

        objState = document.getElementById('tb' + curDay.getTime() + '_1');
        if(objState!=null && objState.className != 'tbStateOutOfBounds')
        {
            if(obj.action == 'Add') 
                gTempSelectionArray.add(curDay.getTime());
            else
                gTempSelectionArray = MM_RemoveFromArray(gTempSelectionArray,curDay.getTime());
        }
    }
    if(obj.action == 'Add') obj.action = 'Remove';
    else obj.action = 'Add';
    
    MM_ConvertToSelection();
    bindTimeblocks();
    bindSelections();
    bindCalendar();
    
}

function AvailabilityOnClickRow(obj){
    var hourtick = obj.id.substr(2);
    var hour, min, curTick, objState;
    if(gTempSelectionArray.length==0) MM_ConvertFromSelection();
    for(var curTick=gClientAnchorDate.getTime();curTick<gClientAnchorDate.getTime() + gClientDisplayDays * DAYMS; curTick = curTick + parseInt(DAYMS))
    {
        hour = parseInt(hourtick/2);
        min = 0;
        if(hour != hourtick/2) min = 30;
        curDay = new Date(); curDay.setTime(curTick);
        curDay.setHours(hour,min,0,0);

        objState = document.getElementById('tb' + curDay.getTime() + '_1');
        if(objState!=null && objState.className != 'tbStateOutOfBounds')
        {
            if(obj.action == 'Add') 
                gTempSelectionArray.add(curDay.getTime());
            else
                gTempSelectionArray = MM_RemoveFromArray(gTempSelectionArray,curDay.getTime());
        }
    }
    if(obj.action == 'Add') obj.action = 'Remove';
    else obj.action = 'Add';
    
    MM_ConvertToSelection();
    bindTimeblocks();
    bindSelections();
    bindCalendar();
}


// AVAILABILITY ARRAY WORKER FUNCTIONS //

// genereate temp selecion array from selection array
function MM_ConvertFromSelection()
{
    gTempSelectionArray = new Array();
    if(arrSelected.length >0)
    {
        var curTime;
        for(var i=0;i<arrSelected.length;i++)
        {
            for(curTime=parseInt(arrSelected[i][0]);curTime<=parseInt(arrSelected[i][1]);curTime=parseInt(curTime)+parseInt(TBMS))
            {
                gTempSelectionArray.add(curTime);
            }
        }
    }
}

// convert from temp selected array to arrSelected
function MM_ConvertToSelection()
{
    if(gTempSelectionArray.length>0)
    {
        arrSelected = new Array();
        gTempSelectionArray.sort();

        var curTime = gTempSelectionArray[0];
        var starttime = gTempSelectionArray[0];
        var endtime = gTempSelectionArray[0];
        
        for(var i=0;i<gTempSelectionArray.length;i++)
        {
            if (parseInt(gTempSelectionArray[i]) > parseInt(curTime)+parseInt(TBMS))
            {
                arrSelected.push(new Array(starttime,endtime,0));
                starttime = gTempSelectionArray[i];
                endtime = starttime;
            }
            else
            {
                endtime = gTempSelectionArray[i];
            }
            curTime = gTempSelectionArray[i];
        }
        // add last one
        arrSelected.push(new Array(starttime,gTempSelectionArray[gTempSelectionArray.length-1],0));
    }
    else arrSelected = new Array();
}


function MM_RemoveFromArray(arr,obj)
{
    var str = arr.join('|');
    str = str.replace(obj.toString() + '|','');
    str = str.replace('|' + obj.toString(),'');
    str = str.replace(obj.toString(),'');

    // clean availability
    var objAvailability = document.getElementById('tb' + obj + '_4');
    if(objAvailability!=null) 
    {
        if (objAvailability.className == 'tbAvailabilityStart' || objAvailability.className == 'tbAvailabilityMiddle' || objAvailability.className == 'tbAvailabilityEnd' || objAvailability.className == 'tbAvailabilityOne'){
            objAvailability.className = objAvailability.className + 'Remove';
            objAvailability.innerHTML = '';
        }
        gVarCleanupArray.push('tb' + obj);
    }
    
    var arrR;
    if(str.length==0) arrR = new Array();
    else arrR = str.split('|');
    
    return arrR;
}

// -------------------------------- SELECTION -------------------------------- //

function SelectionOnMouseOver(obj){
    document.getElementById(obj.id).getElementsByTagName('div')[0].style.background = 'Yellow';
}

function SelectionOnMouseOut(obj){
    document.getElementById(obj.id).getElementsByTagName('div')[0].style.background = 'White';
}

function SelectionOnClick(indexNum,tbTicks){
    if(gIsConfirmation == false){
        navToTimeblock(tbTicks);
    }else{
        document.location.href='ConfirmMeeting.aspx?ticks='+tbTicks;
    }
}

//in development (snoopdog)
function HighlightSelectionBlock(indexPos){
    var elementID;
    
    if(gIsConfirmation == false){
        elementID = 'ab' + indexPos;
    }else{
        elementID = 'sb' + indexPos;
    }
    
    document.getElementById(elementID).getElementsByTagName('div')[0].style.background = 'Yellow';
}

function bindSelections(){
    var yOffset = 0;
    
    var sb = new StringBuilder();

    sb.append('<div id="divSelectionBgAvail" unselectable="on">');
    sb.append('    <div id="divSelectionHeaderAvail" unselectable="on">');
    sb.append('        <div style="padding-top: 5px; padding-left: 10px;" unselectable="on">YOUR AVAILABILITY</div>');
    sb.append('    </div>');
    sb.append('    <div id="divSelectionsAvail" unselectable="on">');
    
    for (var i=0; i<arrSelected.length; i++){
        var startDate = setDayFormatLong(new Date(parseInt(arrSelected[i][0])));
        var startTime = setTimeFormat(parseInt(arrSelected[i][0]));
        var endTime = setTimeFormat(parseInt(arrSelected[i][1]) + parseInt(TBMS));

        sb.append('        <div unselectable="on" class="ab" id="ab' + i + '" style="top: ' + yOffset + 'px;" onmouseover="SelectionOnMouseOver(this);" onmouseout="SelectionOnMouseOut(this);" onclick="SelectionOnClick(' + i + ',' + parseInt(arrSelected[i][0]) + ');">');
        sb.append('            <div class="abBg"></div>');
        sb.append('            <div class="abText">' + startDate + '<br />' + startTime + ' - ' + endTime + '</div>');
        sb.append('        </div>');
        
        yOffset += 40; //height of selection tile
    }
    
    sb.append('    </div>');
    sb.append('</div>');

    document.getElementById('divSelection').innerHTML = sb.toString();
}


function bindSolutions(){
    var yOffset = 0;
    var sb = new StringBuilder();

    sb.append('<div id="divSolutionBg" unselectable="on">');
    sb.append('    <div id="divSolutionHeader" unselectable="on">');
    sb.append('        <div style="padding-top: 5px; padding-left: 10px;" unselectable="on">');
    sb.append('            <div style="float: left;" unselectable="on">MEETING SOLUTIONS</div>');
    sb.append('            <div style="float: right; margin-right: 2px;"><img alt="Help" src="/images/icon_help.gif" style="width: 16px; height: 16px" /></div>');
    sb.append('        </div>');
    sb.append('    </div>');
    sb.append('    <div id="divSolutionSorting" unselectable="on">');
    sb.append('        <div style="padding-top: 5px; padding-left: 10px;">');
    sb.append('            <div id="SolutionSortLabel">Sort by:</div>');
    sb.append('            <div style="float: right; margin-right: 1px;">');
    sb.append('                <select id="SolutionSortTypeDLL" onchange="SolutionSortTypeOnChange(this);" disabled="disabled">');
    sb.append('                    <option value="1" selected="selected">Maximum Attendance</option>');
    sb.append('                    <option value="2">VIP Attendance</option>');
    sb.append('                </select>');
    sb.append('            </div>');
    sb.append('        </div>');
    sb.append('    </div>');
    sb.append('    <div id="divSolutions">');
    
    for (var i=0; i<gSolutionArray.length; i++){
        var startDate = setDayFormatLong(new Date(parseInt(gSolutionArray[i][0])));
        var startTime = setTimeFormat(gSolutionArray[i][0]);
        var endTime = setTimeFormat(gSolutionArray[i][1]);
        var totalUsers = gSolutionArray[i][2].length;
        
        var PieNumFull = Math.round(160*(parseInt(gSolutionArray[i][4])/360));
        var PieNumPartial = Math.round(160*(parseInt(gSolutionArray[i][5])/360));
        var PieNumVIP = parseInt(gSolutionArray[i][6]);

        sb.append('        <div unselectable="on" id="sb' + i + '" style="top: ' + yOffset + 'px;" class="sb" onmouseover="SelectionOnMouseOver(this);Tip(MM_TipSolution(' + i + '), FOLLOWMOUSE, false, DURATION, -2000);" onmouseout="SelectionOnMouseOut(this);UnTip();" onclick="SelectionOnClick(' + i + ',' + parseInt(gSolutionArray[i][0]) + ');">');
        sb.append('            <div class="sbBg"></div>');
        sb.append('            <div class="sbIndex">' + (i+1) + '</div>');
        sb.append('            <div class="sbText">' + startDate + '<br />' + startTime + ' - ' + endTime +'</div>');
        sb.append('            <div style="position: absolute; height: 18px; top: 34px; left: 36px; z-index: 10; background-color: Lime; width: ' + PieNumFull + 'px;"><!--ie--></div>');
        sb.append('            <div style="position: absolute; height: 18px; top: 36px; left: 41px; z-index: 20; font-family: Verdana; font-size: 10px;">Full Attendance</div>');
        sb.append('            <div style="position: absolute; height: 18px; top: 36px; left: 36px; z-index: 30; font-family: Verdana; font-size: 10px; text-align: right; width: 155px;">' + totalUsers + ' of ' + gTotalAcceptedAttendees + '</div>');
        sb.append('            <div style="position: absolute; height: 18px; top: 33px; left: 35px; z-index: 40; width: 160px; border: 1px solid #333333;"><!--ie--></div>');
        sb.append('            <div style="position: absolute; height: 18px; top: 55px; left: 36px; z-index: 10; background-color: #99ff99; width: ' + PieNumPartial + 'px;"><!--ie--></div>');
        sb.append('            <div style="position: absolute; height: 18px; top: 57px; left: 41px; z-index: 20; font-family: Verdana; font-size: 10px;">Partial Attendance</div>');
        sb.append('            <div style="position: absolute; height: 18px; top: 54px; left: 35px; z-index: 40; width: 160px; border: 1px solid #333333;"><!--ie--></div>');
        sb.append('        </div>');
        
        yOffset += 80; //increment offset by the height of 'selection tile'
    }
    sb.append('    </div>');
    sb.append('</div>');

    document.getElementById('divSelection').innerHTML = sb.toString();
}

function SolutionSortTypeOnChange(obj){
    bindSolutions();
}

// -------------------------------- COOKIES -------------------------------- //

function getcookie(c_name) 
{ 
    if (document.cookie.length>0) 
    { 
        c_start=document.cookie.indexOf(c_name + "="); 
        if (c_start!=-1) 
        { 
            c_start=c_start + c_name.length+1; 
            c_end=document.cookie.indexOf(";",c_start); 
            if (c_end==-1) c_end=document.cookie.length; 
            return unescape(document.cookie.substring(c_start,c_end)); 
        } 
    } 
    return ""; 
} 

function setcookie(c_name,value) 
{
    var exdate=new Date();
    document.cookie=c_name+ "=" +escape(value); 
} 

function checkcookie(c_name,value)
{ 
    if(getcookie(c_name)==null || getcookie(c_name)=="")
    { 
        setcookie(c_name, value); 
    } 
}



// -------------------------------- PROTOTYPES -------------------------------- //

//older browsers may not support this.
Date.prototype.addHours=function (n) {this.setHours (this.getHours () + n)};
Date.prototype.addMinutes=function (n) {this.setMinutes (this.getMinutes () + n)};
Date.prototype.addDays=function (n) {this.setDate (this.getDate () + n)};

// Add to array if not exsit
Array.prototype.add = function (obj){
    var b = true;
    for(var i=0;i<this.length;i++)
    {
        if(this[i]==obj)b=false;
    }
    if(b) this.push(obj);
}


// STRING PROTOTYPE //

function StringBuilder(value)
{
    this.strings = new Array('');
    this.append(value);
}

//trims space characters
String.prototype.trim = function () 
{
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

// Appends the given value to the end of this instance.
StringBuilder.prototype.append = function (value)
{
    if (value)
    {
        this.strings.push(value);
    }
}

// Clears the string buffer
StringBuilder.prototype.clear = function ()
{
    this.strings.length = 1;
}

// Converts this instance to a String.
StringBuilder.prototype.toString = function ()
{
    return this.strings.join('');
}

// STRING FORMATTING //

function TextToLower(id)
{
    var txt = document.getElementById(id);
    if(txt!=null) 
    {
        txt.value = removeSpaces(txt.value.toLowerCase());
    }
}
function removeSpaces(string) 
{
	var tstring = '';
	string = '' + string;
	splitstring = string.split(' ');
	for(i = 0; i < splitstring.length; i++)
	tstring += splitstring[i];
	return tstring;
}


//DATETIME FORMATTING //

       
function setDayFormat(dateObj){
    var date=dateObj.getDate(); // Get the numerical date
    var year=dateObj.getYear(); // Get the year
    var day=dateObj.getDay(); // Get the day in number form (0,1,2,3,etc.)
    var month=dateObj.getMonth()+1; // Get the month

    // Make day number value correspond to actual day name
    var dayName=new Array(7)
    dayName[0]='Sun';
    dayName[1]='Mon';
    dayName[2]='Tue';
    dayName[3]='Wed';
    dayName[4]='Thu';
    dayName[5]='Fri';
    dayName[6]='Sat';

    // Add suffix to date (1st, 2nd, 4th, etc.)
    if (date== 1) suffix=('st');
    else if (date== 2) suffix=('nd');
    else if (date== 3) suffix=('rd');
    else if (date== 21) suffix=('st');
    else if (date== 22) suffix=('nd');
    else if (date== 23) suffix=('rd');
    else if (date== 31) suffix=('st');
    else suffix=('th');
    
    if (month== 1) monthName=('Jan.');
    else if (month== 2) monthName=('Feb.');
    else if (month== 3) monthName=('Mar.');
    else if (month== 4) monthName=('Apr.');
    else if (month== 5) monthName=('May.');
    else if (month== 6) monthName=('Jun.');
    else if (month== 7) monthName=('Jul.');
    else if (month== 8) monthName=('Aug.');
    else if (month== 9) monthName=('Sep.');
    else if (month== 10) monthName=('Oct.');
    else if (month== 11) monthName=('Nov.');
    else monthName=('Dec.');

    // Write date
    var strDate=dayName[day] + ', ' + monthName + ' ' + date + suffix;// + ', ' + year;

    return strDate
}

function setDayFormatLong(dateObj){
    var date=dateObj.getDate(); // Get the numerical date
    var year=dateObj.getFullYear(); // Get the year
    var day=dateObj.getDay(); // Get the day in number form (0,1,2,3,etc.)
    var month=dateObj.getMonth()+1; // Get the month

    // Make day number value correspond to actual day name
    var dayName=new Array(7)
    dayName[0]='Sun';
    dayName[1]='Mon';
    dayName[2]='Tues';
    dayName[3]='Wed';
    dayName[4]='Thurs';
    dayName[5]='Fri';
    dayName[6]='Sat';

    // Add suffix to date (1st, 2nd, 4th, etc.)
    if (date==1) suffix=('st');
    else if (date==2) suffix=('nd');
    else if (date==3) suffix=('rd');
    else if (date==21) suffix=('st');
    else if (date==22) suffix=('nd');
    else if (date==23) suffix=('rd');
    else if (date==31) suffix=('st');
    else suffix=('th');

    // Make month number correspond to month name
    if (month==1) monthName=('January');
    else if (month==2) monthName=('February');
    else if (month==3) monthName=('March');
    else if (month==4) monthName=('April');
    else if (month==5) monthName=('May');
    else if (month==6) monthName=('June');
    else if (month==7) monthName=('July');
    else if (month==8) monthName=('August');
    else if (month==9) monthName=('September');
    else if (month==10) monthName=('October');
    else if (month==11) monthName=('November');
    else monthName=('December');
    
    return (strDate=dayName[day] + ', ' + monthName + ' ' + date + suffix + ', ' + year);
}

function setTimeFormat(milliseconds){
    var dateObj = new Date(milliseconds);
    var hour = dateObj.getHours();
    var mins = dateObj.getMinutes();
    var strSetTimeFormat;
    
    if (gDisplayTimeFormatOption == 'military'){
        if(hour<10) hour = '0'+hour;
        if(mins<30) mins = '0'+mins;
        strSetTimeFormat = hour + ':' + mins
    } else {
        var meridian = 'am';
        
        if(hour>11) meridian = 'pm';
        if(hour==0) hour = '12';
        if(hour>12) hour = hour-12;
        //if(hour<10) hour = '0'+hour;
        if(mins<30) mins = '0'+mins;
        
        strSetTimeFormat = hour + ':' + mins + '<sup>' + meridian + '</sup>';
    }
    
    return strSetTimeFormat;
}

//from GeneralFunctions.js //

//Get days between 2 date
function DateDifferent(strDate1, strDate2)
{
    var diff = (((Date.parse(strDate2))-(Date.parse(strDate1)))/(24*60*60*1000)).toFixed(0);
    if(parseFloat(diff)!=parseInt(diff)) diff = parseInt(diff)+1;
    return diff;
}

//Get Monday
function GetMonday(strDate,format)
{
    var tD = new Date(strDate);
    var tW = addDays(tD,1-parseInt(tD.getDay()),format);
    return tW;
}

//Add days to a date
function addDays(myDate,days,format) {
    var d3 = new Date(myDate);
    var newdate = new Date(d3.getTime() + parseInt(days)*24*60*60*1000);

    var dd = newdate.getDate();
    var mm = newdate.getMonth()+1; // 0 based
    var yy = newdate.getYear();
    if (yy < 1000) yy +=1900; // Y2K fix
    
    return FormatTime((yy + '/' +mm + '/' + dd  ),format);
}

function ValidateStartTimeIndex()
{
    for (var i=0; i<arrSelected.length; i++)
    {    
        //var startTime = setTimeFormat(parseInt(arrSelected[i][0]));
        var dateObj = new Date(parseInt(arrSelected[i][0]));
        var hour = dateObj.getHours();
        var mins = dateObj.getMinutes();
        var inx=hour*2;
        if ( mins>=30)inx+=1;
        if ( gDisplayStartTimeIndex>inx) gDisplayStartTimeIndex=inx+1;
        //var endTime = setTimeFormat(parseInt(arrSelected[i][1]) + parseInt(TBMS));
    }
}

function ValidateEndTimeIndex()
{
    for (var i=0; i<arrSelected.length; i++)
    {    
        //var startTime = setTimeFormat(parseInt(arrSelected[i][0]));
        var dateObj = new Date(parseInt(arrSelected[i][1]) + parseInt(TBMS));
        var hour = dateObj.getHours();
        var mins = dateObj.getMinutes();
        var inx=hour*2;
        if ( mins>=30)inx+=1;
        if ( gDisplayEndTimeIndex<inx) gDisplayEndTimeIndex=inx;
        //var endTime = setTimeFormat(parseInt(arrSelected[i][1]) + parseInt(TBMS));
    }
}
//Return specific format time
function FormatTime(myTimes,sFormat)
{
    var Result = '';
    var tYear,tMonth,tDay;
    var tHour,tMinute,tSecond;
    
    var myTime = new Date(myTimes);
    
    tYear = myTime.getFullYear();
    tMonth = parseInt(myTime.getMonth())+1;
    if(parseInt(tMonth)<10)
    {
        tMonth = '0'+parseInt(tMonth).toString()
    }
    tDay = myTime.getDate();
    if(parseInt(tDay)<10)
    {
        tDay = '0'+parseInt(tDay).toString()
    }
    
    tHour = myTime.getHours();
    if(parseInt(tHour)<10)
    {
        tHour = '0'+parseInt(tHour).toString()
    }
    tMinute = myTime.getMinutes();
    if(parseInt(tMinute)<10)
    {
        tMinute = '0'+parseInt(tMinute).toString()
    }
    tSecond = myTime.getSeconds();
    if(parseInt(tSecond)<10)
    {
        tSecond = '0'+parseInt(tSecond).toString()
    }
    
    if(sFormat=='yy/mm/dd')
    {
        return (tYear + '/' +tMonth + '/' + tDay  );
    }
    if(sFormat=='yy/m/d')
    {
        return (tYear + '/' + parseInt(tMonth).toString() + '/' + parseFloat(tDay).toString());
    }
    if(sFormat=='mm/dd/yy')
    {
        return (tMonth + '/' + tDay+ '/' + tYear  );
    }
    if(sFormat=='yyyy-mm-dd')
    {
        return (tYear+'-'+tMonth+'-'+tDay);
    }
    if(sFormat=='YYYY/MM/dd')
    {
        Result = tYear+'/'+tMonth+'/'+tDay;
    }
    if(sFormat=='YYYY/MM/dd hh:mm:ss')
    {
        Result = tYear+'/'+tMonth+'/'+tDay+' '+tHour+':'+tMinute+':00';
    }
    if(sFormat=='YY/MM/DD HH:mm:00')
    {
        Result = tYear+'/'+tMonth+'/'+tDay+' '+tHour+':'+tMinute+':00';
    }
    
    return Result;
}

function GetCalenderDate(sDate)
{
    var tArr = new Array();
    tArr = sDate.toString().split(',');
    var YY = tArr[0];
    var MM = tArr[1];
    if(parseInt(MM)<10) MM = '0'+parseInt(MM).toString();
    var DD = tArr[2];
    if(parseInt(DD)<10) DD = '0'+parseInt(DD).toString();
    return (YY+'/'+MM+'/'+DD)
}

function CreateCalendarDateArray(sDate)
{
    var tArr = new Array();
    tArr = sDate.split('/');
    var mm = tArr[0];
    var dd = tArr[1];
    var YY = tArr[2];
    tArr[0] = YY;
    tArr[1] = mm;
    tArr[2] = dd;
    return tArr;
}

function CompareDateString(sDate1,sDate2)
{
    var d1 = Date.parse(sDate1);
    var d2 = Date.parse(sDate2);
    return (parseInt(d1)<=parseInt(d2))
}

function CompareDate(iDate1,iDate2)
{
    var d1 = new Date();
    var d2 = new Date();
    d1.setDate(iDate1);
    d2.setDate(iDate2);
    return (parseInt(d1)<=parseInt(d2));
}

//this is probably obsolete
//Add 0.5 hour to time
//function AddMinutes(myDates,AddMin)
//{
//    var myDate = new Date(myDates);
//    newdate = new Date(myDate.getTime() + AddMin*60*1000);
//    return FormatTime(newdate,"YYYY/MM/dd hh:mm:ss")
//}

function IsSameDay(date1,date2)
{
    date1 = new Date(date1);
    date2 = new Date(date2);
    if(date1.getDate()==date2.getDate() && date1.getMonth()==date2.getMonth() && date1.getFullYear()==date2.getFullYear()) return true;
    else return false;
}
function IsSameDay2(idate1, idate2)
{
    var date1 = new Date();
    var date2 = new Date();
    date1.setTime(idate1);
    date2.setTime(idate2)
    if(date1.getDate()==date2.getDate() && date1.getMonth()==date2.getMonth() && date1.getFullYear()==date2.getFullYear()) return true;
    else return false;
}

//Compare 2 date if same hour and minutes
function CompareHourMin(Date1,Date2)
{
    var D1 = new Date(Date1);
    var D2 = new Date(Date2);
    var Result = false;
    if(parseInt(D1.getHours())==parseInt(D2.getHours()) && parseInt(D1.getMinutes())==parseInt(D2.getMinutes()))
    {
        Result = true;
    }
    return Result;
}

function Sc_FormatDate(sDate,sHour)
{
    var sDate = new Date(sDate);
    var DD = sDate.getDate();
    if(parseInt(DD)<10) DD='0'+parseInt(DD).toString();
    var YY = sDate.getYear();
    var MM = sDate.getMonth()+1;
    if(parseInt(MM)<10) MM='0'+parseInt(MM).toString();
    
    sHour = parseFloat(sHour);
    var HH = parseInt(sHour);
    if(parseInt(HH)<10) HH='0'+parseInt(HH).toString();
    var mm = Math.abs(parseFloat(sHour)-parseInt(sHour))*60;
    if(parseInt(mm)<10) mm='0'+parseInt(mm).toString();

    return YY+'/'+MM+'/'+DD+' '+HH+':'+mm+':00';
}


//================================================
//Time Zone
//================================================
function GetClientTimeZone()
{
    var tzo=(new Date().getTimezoneOffset()/60);
    return tzo;
}

function ConvertToUTCFormat(myDate)
{
    var newDate = new Date(myDate);
    return newDate.toUTCString();
}

function ConvertToLocalFormat(myDate)
{
    var newDate = new Date(myDate);
    return newDate.toString();
}


//==============================================
// Mouse Position
//==============================================
function mouseX(evt) 
{
    if (evt.pageX) return evt.pageX;
    else if (evt.clientX)
       return evt.clientX + (document.documentElement.scrollLeft ?
       document.documentElement.scrollLeft :
       document.body.scrollLeft);
    else return null;
}
function mouseY(evt) 
{
    if (evt.pageY) return evt.pageY;
    else if (evt.clientY)
       return evt.clientY + (document.documentElement.scrollTop ?
       document.documentElement.scrollTop :
       document.body.scrollTop);
    else return null;
}

// Step 4 Calendar/Navigator //

var Calendar_StartBound = "";
var Calendar_EndBound = "";
var aSelect = new Array();
var MarkedDays = 5;
var datCurrentDay, datFirstDay, datShowDay;

function SetCalendarVarible(sb,eb,sa,md)
{
    Calendar_StartBound = sb;
    Calendar_EndBound = eb;
    aSelect = sa;
    MarkedDays = md;
}

function ChooseDate(divDate,date)
{
    var s = "";
	s = s + "<DIV name='divDayPad' id='divDayPad' style='font-family: Trebuchet MS;'>";
	s = s + "   <table cellpadding='0' cellspacing='0' style='border: solid 1px #808080; width: 240px'><tr><td>"
	s = s + "	<table border='0' width='100%' cellpadding='4' cellspacing='0' style='border: solid 1px #ffffff;'>";
	s = s + "		<tr style='BACKGROUND-COLOR: #999999'>";
	s = s + "			<td rowSpan='2' width='20'><font size='1' face='Webdings' style='cursor:pointer' name='cmdPageLeft' id='cmdPageLeft' onclick = 'cmdPageLeft_OnClick()'><img src='/images/left.gif'/></font></td>";
	s = s + "			<td align='right' rowSpan='2' width='210'>";
	s = s + "				<SELECT id='cboMonth' name='cboMonth' onchange='cboMonth_change()'>";
	s = s + "					<OPTION value='1' selected>January</OPTION>";
	s = s + "					<OPTION value='2'>Februray</OPTION>";
	s = s + "					<OPTION value='3'>March</OPTION>";
	s = s + "					<OPTION value='4'>April</OPTION>";
	s = s + "					<OPTION value='5'>May</OPTION>";
	s = s + "					<OPTION value='6'>June</OPTION>";
	s = s + "					<OPTION value='7'>July</OPTION>";
	s = s + "					<OPTION value='8'>August</OPTION>";
	s = s + "					<OPTION value='9'>September</OPTION>";
	s = s + "					<OPTION value='10'>October</OPTION>";
	s = s + "					<OPTION value='11'>November</OPTION>";
	s = s + "					<OPTION value='12'>December</OPTION>";
	s = s + "				</SELECT>&nbsp;<span name='fntYear' id='fntYear' font-size='1px'>2001</span>";
	s = s + "			</td>";
	s = s + "			<td align='middle' width='20'><font face='Webdings' size='1' style='cursor:pointer' name='cmdYearUp' id='cmdYearUp' onclick = 'cmdYearUp_OnClick()'><img src='/images/up.gif'/></font></td>";
	s = s + "			<td rowSpan='2' align='left' font-size='1px'></td>";
	s = s + "			<td rowSpan='2' align='right' width='20'><FONT face='Webdings' size='1' style='cursor:pointer' name='cmdPageRight' id='cmdPageRight' onclick = 'cmdPageRight_OnClick()'><img src='/images/right.gif'/></font></td>";
	s = s + "		</tr>";
	s = s + "		<tr style='BACKGROUND-COLOR: #999999'><td align='middle' width='20'><font size='1' face='Webdings' style='cursor:pointer' name='cmdYearDown' id='cmdYearDown' onclick = 'cmdYearDown_OnClick()'><img src='/images/down.gif'/></font></td></tr>";
	s = s + "	</table>";  
	s = s + "	<table style='BACKGROUND-COLOR: #ffffff;' border='0' width='100%' cellpadding='0' cellspacing='0'>";
	s = s + "		<tr name='week0' id='week0' height='15'>";
	s = s + "			<td name='day01' id='day01' align='middle' font-size='1px'>S</td>";
	s = s + "			<td name='day02' id='day02' align='middle' font-size='1px'>M</td>";
	s = s + "			<td name='day03' id='day03' align='middle' font-size='1px'>T</td>";
	s = s + "			<td name='day04' id='day04' align='middle' font-size='1px'>W</td>";
	s = s + "			<td name='day05' id='day05' align='middle' font-size='1px'>T</td>";
	s = s + "			<td name='day06' id='day06' align='middle' font-size='1px'>F</td>";
	s = s + "			<td name='day07' id='day07' align='middle' font-size='1px'>S</td></tr>";
	for(var i=0;i<=5;i++)
	{
		s = s + "	<tr name='week" + i + "' id='week" + i + "1' height='15'>";
		s = s + "		<td name='day" + (i*7) + "' id='day" + (i*7) + "' align='middle' style='cursor:pointer' onclick = 'divDayPad_OnClick()'></td>";
		s = s + "		<td name='day" + (i*7+1) + "' id='day" + (i*7+1) + "' align='middle' style='cursor:pointer' onclick = 'divDayPad_OnClick()'></td>";
		s = s + "		<td name='day" + (i*7+2) + "' id='day" + (i*7+2) + "' align='middle' style='cursor:pointer' onclick = 'divDayPad_OnClick()'></td>";
		s = s + "		<td name='day" + (i*7+3) + "' id='day" + (i*7+3) + "' align='middle' style='cursor:pointer' onclick = 'divDayPad_OnClick()'></td>";
		s = s + "		<td name='day" + (i*7+4) + "' id='day" + (i*7+4) + "' align='middle' style='cursor:pointer' onclick = 'divDayPad_OnClick()'></td>";
		s = s + "		<td name='day" + (i*7+5) + "' id='day" + (i*7+5) + "' align='middle' style='cursor:pointer' onclick = 'divDayPad_OnClick()'></td>";
		s = s + "		<td name='day" + (i*7+6) + "' id='day" + (i*7+6) + "' align='middle' style='cursor:pointer' onclick = 'divDayPad_OnClick()'></td>";
		s = s + "	</tr>";
	}	
	s = s + "		<tr name='week7' id='week7' height='15'>";
	s = s + "			<td name='day_today' id='day_today' align='left' colSpan='7' font-size='1px' style='cursor:pointer' onclick = 'Today_OnClick()'></td>";
	s = s + "		</tr>";
	s = s + "	</table>";
	s = s + "   </td></tr></table>";
	s = s + "</DIV>";
	
	divDate.innerHTML = s;

    datCurrentDay = date;
    DrawDay(datCurrentDay);	 
}

function DateAdd(interval, number, date)
{
    date = new Date(date);
    var datRet = new Date(date.toString());
    
    switch (interval.toLowerCase()){
    case 'ms':
      datRet.setMilliseconds(date.getMilliseconds() + number);
      break;
    case 's':
      datRet.setSeconds(date.getSeconds() + number);
      break;
    case 'mi':
      datRet.setMinutes(date.getMinutes() + number);
      break;
    case 'h':
      datRet.setHours(date.getHours() + number);
      break;
    case 'd':
      datRet.setDate(date.getDate() + number);
      break;
    case 'm':
      datRet.setMonth(date.getMonth() + number);
      break;
    case 'yyyy':
      datRet.setFullYear(date.getFullYear() + number);
      break;
  }
  return datRet;
}

function DateDiff(date1, date2)
{
    var d1 = Date.parse(date1);
    var d2 = Date.parse(date2);
    var d = Math.abs(d1-d2)/1000;
    d = d/3600;
    d = d/24; 
    return d;
}

function DrawDay(date)
{
	//Set current date
	date = new Date(date);
	datShowDay = new Date(date);
	var nYear = date.getFullYear(),nMonth = date.getMonth(),nDay = date.getDate();
	
	//Caculate the first day of this calendar month(the last Sunday of 1st day of this month)
	datFirstDay = new Date(nYear, nMonth, 1);
	for(var i=1;i<=7;i++)
	{
		datFirstDay = DateAdd('d', -1, datFirstDay);
		if (datFirstDay.getDay() == 0)
			break;		
	}	
	
	//Month-week
	for(var i=0;i<=5;i++)
	{
		//Week
		for(var j=0;j<=6;j++)
		{
			//Set cell object
			//var objTD = document.getElementById('day' + (i*7+j));
			var objTD = document.getElementById('day' + (i*7+j));
			objTD.background = '';
			objTD.style.fontsize = '13';
	        objTD.style.cursor = 'pointer';
	        if(objTD.onclick=='') objTD.onclick = divDayPad_OnClick;

			var datTmp = DateAdd('d', i*7+j, datFirstDay);
			var flag = 0;
			var seltag = false;
			var datMax = new Date(9999,11,28);
			if (datFirstDay.toString() == datMax.toString() &&  (i*7 + j)>33)
			{
				datTmp = DateAdd('d', -31, datTmp);
				flag = 1;			
			}

			objTD.innerHTML = datTmp.getDate();			
			//Range
			var InRange = true;
			if(CompareDate(datTmp,addDays(Calendar_StartBound,-1,'yy/mm/dd')) || CompareDate(addDays(Calendar_EndBound,1,'yy/mm/dd'),datTmp)) InRange=false;

		    if(new Date(Calendar_StartBound).getTime()>new Date(datTmp).getTime() || new Date(Calendar_EndBound).getTime()<new Date(datTmp).getTime())
		    {
		        // Out of meeting range
			    objTD.style.cursor = '';
			    objTD.onclick = '';
			    objTD.style.fontWeight = 'normal';
		        objTD.style.color = 'wheat';
		    }
			else if (datTmp.getMonth() != nMonth || flag==1 || InRange==false)
			{
				objTD.style.color = '#aaaaaa';
				if(!InRange)
				{
				    objTD.style.cursor = '';
				    objTD.onclick = '';
				    objTD.style.fontWeight = 'normal';
				    //objTD.style.backgroundColor = '';
				}
			}
			else	
			{
				objTD.style.color = '#000000';
				//If in select array mark as bold
				seltag = false;
				if(aSelect.length>0 && InRange)
				{
				    for(var k=0;k<aSelect.length;k++)
				    {
				        if(IsSameDay2(aSelect[k][0],datTmp.getTime()))
				        {
				            seltag = true;
				            break;
				        }
				    }
				}	
				if(seltag)
				{
		            objTD.style.fontWeight = 'bold';
		            //objTD.style.backgroundColor = 'gray';
				}
				else
				{
		            objTD.style.fontWeight = 'normal';
		            //objTD.style.backgroundColor = '';
				}
			}
		}
	}

	//Set year and month
	document.getElementById('fntYear').innerText = nYear;
	document.getElementById('cboMonth').value = nMonth+1;
		
	for(var i=0;i<=5;i++)
	{
		for(j=0;j<=6;j++)
			document.getElementById('day' + (i*7+j)).bgColor = "ffffff";		
	}

	//Set current date and selected date
	var now = new Date();
	now = new Date(now.getFullYear(), now.getMonth(), now.getDate());	

	//Today Tag
	var s = 'Today:&nbsp;&nbsp;&nbsp;'; 
    
    switch(now.getDay())
    {
        case 0: 
        s += 'Sunday';
        break;
        
        case 1:
        s += 'Monday';
        break;
        
        case 2:
        s += 'Tuesday'; 
        break;
        
        case 3:
        s += 'Wednesday'; 
        break;
        
        case 4:
        s += 'Thursday'; 
        break;
        
        case 5:
        s += 'Friday'; 
        break;
        
        case 6:
        s += 'Saturday'; 
        break;
    }
    
    s += '&nbsp;' + now.getFullYear() + '/';
	if (now.getMonth() < 10)
		s += '0' + (now.getMonth()+1) + '/';
	else
		s += (now.getMonth()+1) + '/';

	if (now.getDate() < 10)
		s += '0' + now.getDate();
	else
		s +=  now.getDate();

	var objtoday = document.getElementById('day_today');
	objtoday.innerHTML = s;

}
function cmdPageLeft_OnClick()
{
    if (datShowDay.getFullYear() == 1000)
        return;
        
	var date = DateAdd('m', -1, datShowDay);
	SelectWeek(date,MarkedDays);
}
function cmdPageRight_OnClick()
{
    if (datShowDay.getFullYear() == 9999 && datShowDay.getMonth() == 11)
        return;
        
	var date = DateAdd('m', 1, datShowDay);
	SelectWeek(date,MarkedDays);
}

function cmdYearDown_OnClick()
{
    if (datShowDay.getFullYear() == 1000)
        return;
        
	var date = DateAdd('yyyy', -1, datShowDay);
	SelectWeek(date,MarkedDays);
}
function cmdYearUp_OnClick()
{
    if (datShowDay.getFullYear() == 9999)
        return;
        
	var date = DateAdd('yyyy', 1, datShowDay);	
	SelectWeek(date,MarkedDays);
}

function divDayPad_OnClick()
{
    var id = window.event.srcElement.id;
	if (id.substring(0, 3) == 'day')
	{
		if (parseInt(id.substring(3, id.length)) >= 0)
		{
			var dateValue =  parseInt(id.substring(3, id.length));
	        var datMax = new Date(9999,11,28);
	        if (datFirstDay.toString() == datMax.toString() &&  dateValue>33)
	            return;
		    var datSelDay =  DateAdd('d', dateValue, datFirstDay);
		    // If out of bound
		    if(new Date(Calendar_StartBound).getTime()<=new Date(datSelDay).getTime() && new Date(Calendar_EndBound).getTime()>=new Date(datSelDay).getTime())
		    {
		        SelectWeek(datSelDay,MarkedDays);
                datCurrentDay = datSelDay;
                
                CalendarOnClick(datSelDay);
            }
		}
	}
}

var datSelect = null;
function SelectWeek(date,nday)
{
    //if(date.getMonth()!=datCurrentDay.getMonth()) 
    date = new Date(date);
    DrawDay(date);
    
    if(date.getMonth()==datCurrentDay.getMonth() && date.getFullYear()==datCurrentDay.getFullYear())
    {
        for(var i=0;i<=5;i++)
        {
            for(var j=0;j<=6;j++)
               if(document.getElementById('day' + (i*7+j))!=null) document.getElementById('day' + (i*7+j)).bgColor = '';
        }
            
        var nDay = DateDiff(date, datFirstDay);
        var n = parseInt(nDay/7+1)-1;
        var nW = date.getDay();
        for(var i=nW;i<=parseInt(nday)+nW-1;i++)
             if(document.getElementById('day' + (n*7+i))!=null) document.getElementById('day' + (n*7+i)).bgColor = 'CDCCCC';
         datSelect = date;
    }
}
function cboMonth_change()
{
	var date = DateAdd('m', parseInt(document.getElementById('cboMonth').value) -1 - new Date(datShowDay).getMonth(), datShowDay);
	SelectWeek(date,MarkedDays);
}
function GetDate()
{
    var nWeek = datSelect.getDay();
    return DateAdd('d', 1-nWeek, datSelect);
}
function Today_OnClick()
{
	var now = new Date();
	now = new Date(now.getFullYear(), now.getMonth(), now.getDate());

    datCurrentDay = now;		
    SelectWeek(now,MarkedDays);
    CalendarOnClick(now);
}