﻿var divTimePickerId = "divTimePicker";
var divTimePickerListId = "divTimePickerList";
var divCloseTimePickerId = "divCloseTimePicker";

/*By setting the variables below to null, they are not used*/
var JSTimeLimitStart = null; /*Restrict starting range of times that can be selected*/
var JSTimeLimitEnd = null; /*Restrict ending range of times that can be selected*/

function disposeTimePicker() { $("#" + divTimePickerId).children().remove(); $("#" + divTimePickerId).hide(); }
function setTimeToField(pvInputFieldId, pvValue) { var elem = document.getElementById(pvInputFieldId); if (elem != null) { elem.value = pvValue; } }

function GetCtrlId(pvTargetId) {
    this.TargetId = pvTargetId;
    this.StartDateId = (this.TargetId.indexOf("End") >= 0) ? this.TargetId.replace("EndTime", "StartDate") : this.TargetId.replace("Time", "Date");
    this.StartTimeId = (this.TargetId.indexOf("End") >= 0) ? this.TargetId.replace("End", "Start") : this.TargetId;
    this.EndDateId = (this.TargetId.indexOf("End") >= 0) ? this.TargetId.replace("Time", "Date") : this.TargetId.replace("StartTime", "EndDate");
    this.EndTimeId = (this.TargetId.indexOf("End") >= 0) ? this.TargetId : this.TargetId.replace("Start", "End");
    this.DurationId = (this.TargetId.indexOf("End") >= 0) ? this.TargetId.replace("EndTime", "Duration") : this.TargetId.replace("StartTime", "Duration");
}

function GetCtrlValue(pvGetCtrlId) {
    this.GetCtrlId = pvGetCtrlId;
    this.StartDate = GetDateFromInputText(this.GetCtrlId.StartDateId, null);
    this.StartTime = GetTimeFromInputText(this.GetCtrlId.StartTimeId, null);
    this.EndDate = GetDateFromInputText(this.GetCtrlId.EndDateId, null);
    this.EndTime = GetTimeFromInputText(this.GetCtrlId.EndTimeId, null);
}

function timeClicked(pvTime, pvTargetId) {
    if (String(pvTime).indexOf(":") > 0) {
        setTimeToField(pvTargetId, pvTime); /*Time selector*/
    }
    else {
        /*Duration selector*/
        var lCtrlId = new GetCtrlId(pvTargetId);
        var lCtrlValue = new GetCtrlValue(lCtrlId);

        var SDate = lCtrlValue.StartDate; var STime = lCtrlValue.StartTime;

        if (SDate == null || STime == null) {
            /*INVALID:  start date & time parameters not found*/
        }
        else {
            /*Set time parts*/
            var lSHour = parseInt(STime.split(":")[0]); var lSMinute = parseInt(STime.split(":")[1]);

            /*Set the date parts*/
            var lStarting = GetUTCDate(GetYearValue(SDate), GetMonthValue(SDate), GetDateValue(SDate), lSHour, lSMinute);
            var lEnding = GetUTCDate(GetYearValue(SDate), GetMonthValue(SDate), GetDateValue(SDate), lSHour, lSMinute + parseInt(pvTime));

            var lEHr = lEnding.getHours(); var lEMn = lEnding.getMinutes();
            if (lEHr == 0)
                setTimeToField(lCtrlId.EndTimeId, "12:" + ((lEMn == 0) ? "00" : String(lEMn)) + " AM");
            else if (lEHr < 12)
                setTimeToField(lCtrlId.EndTimeId, lEHr + ":" + ((lEMn == 0) ? "00" : String(lEMn)) + " AM");
            else if (lEHr == 12)
                setTimeToField(lCtrlId.EndTimeId, lEHr + ":" + ((lEMn == 0) ? "00" : String(lEMn)) + " PM");
            else if (lEHr > 12)
                setTimeToField(lCtrlId.EndTimeId, (lEHr - 12) + ":" + ((lEMn == 0) ? "00" : String(lEMn)) + " PM");
        }
    }
    validateTimes(pvTargetId);
}

function validateTimes(pvTargetId) {
    var lCtrlId = new GetCtrlId(pvTargetId);
    var lCtrlValue = new GetCtrlValue(lCtrlId);
    
    var SDate = lCtrlValue.StartDate; var STime = lCtrlValue.StartTime;
    var EDate = lCtrlValue.EndDate; var ETime = lCtrlValue.EndTime;

    if (STime == null || ETime == null) {
        /*If either time is invalid, clear the field*/
        if (STime == null) { setTimeToField(lCtrlId.StartTimeId, ""); }
        if (ETime == null) { setTimeToField(lCtrlId.EndTimeId, ""); }
    }
    else {
        /*Check dates and do a more complete validation*/
        if (SDate == null || EDate == null) {
            /*The dates are not valid, so times cannot be validated*/
        }
        else {
            /*There are entries for all parameters, validate them*/            
            if (GetUTCDateString(SDate) == GetUTCDateString(EDate)) {
                if ($("#hiddenTimeFlag").val() == "1"){
                    /*************************************************************************/
                    /**SAME START TIME********************************************************/
                    /*************************************************************************/
                    /*Start time must be before endtime*/
                    if (parseInt(STime.split(":")[0]) < parseInt(ETime.split(":")[0])) {
                        /*VALID: start hour less than end hour*/
                    }
                    else if (parseInt(STime.split(":")[0]) == parseInt(ETime.split(":")[0])) {
	                    /*HOURS ARE EQUAL*/
                        if (parseInt(STime.split(":")[1]) <= parseInt(ETime.split(":")[1])) {
            	            /*VALID: start minute less that end minute*/
                        }
                        else {
                            /*CHANGE THE END DATE TO ONE DAY AFTER THE START DATE*/
                            var lNewEndDate = lCtrlValue.EndDate;
                            lNewEndDate.setDate(lNewEndDate.getDate() + 1);
                            setTimeToField(lCtrlId.EndDateId, GetLocalDateString(lNewEndDate));
                            //setTimeToField(lCtrlId.EndTimeId, ""); /*INVALID*/
                        }
                    }
                    else {
                        /*CHANGE THE END DATE TO ONE DAY AFTER THE START DATE*/
                        var lNewEndDate = lCtrlValue.EndDate;
                        lNewEndDate.setDate(lNewEndDate.getDate() + 1);
                        setTimeToField(lCtrlId.EndDateId, GetLocalDateString(lNewEndDate));
                        //setTimeToField(lCtrlId.EndTimeId, ""); /*INVALID*/
                    }
                    /*************************************************************************/    
                }
                else {
                    /*************************************************************************/
                    /**DO NOT ALLOW SAME TIME*************************************************/
                    /*************************************************************************/
                    /*Start time must be before endtime*/
                    if (parseInt(STime.split(":")[0]) < parseInt(ETime.split(":")[0])) {
	                    /*VALID: start hour less than end hour*/
                    }
                    else if (parseInt(STime.split(":")[0]) == parseInt(ETime.split(":")[0])) {
		                /*HOURS ARE EQUAL*/
                        if (parseInt(STime.split(":")[1]) < parseInt(ETime.split(":")[1])) {
                	        /*VALID: start minute less that end minute*/
                        }
                        else {
                            /*CHANGE THE END DATE TO ONE DAY AFTER THE START DATE*/
                            var lNewEndDate = lCtrlValue.EndDate;
                            lNewEndDate.setDate(lNewEndDate.getDate() + 1);
                            setTimeToField(lCtrlId.EndDateId, GetLocalDateString(lNewEndDate));
                            //setTimeToField(lCtrlId.EndTimeId, ""); /*INVALID*/
                        }
                    }
                    else {
                        /*CHANGE THE END DATE TO ONE DAY AFTER THE START DATE*/
                        var lNewEndDate = lCtrlValue.EndDate;
                        lNewEndDate.setDate(lNewEndDate.getDate() + 1);
                        setTimeToField(lCtrlId.EndDateId, GetLocalDateString(lNewEndDate));
                        //setTimeToField(lCtrlId.EndTimeId, ""); /*INVALID*/
                    }
                    /*************************************************************************/
                }
            }
            else {
                /*Times can be anything*/
            }     
        }
    }
    updateDuration(pvTargetId);
    disposeTimePicker();
}

function updateDuration(pvTargetId) {
    var lCtrlId = new GetCtrlId(pvTargetId);
    var lCtrlValue = new GetCtrlValue(lCtrlId);

    var SDate = lCtrlValue.StartDate; var STime = lCtrlValue.StartTime;
    var EDate = lCtrlValue.EndDate; var ETime = lCtrlValue.EndTime;

    if (SDate == null || STime == null) {
        /*INVALID:  start date & time parameters not found*/
    }
    else {
        if (EDate == null || ETime == null) {
            /*INVALID:  end date & time parameters could found*/
        }
        else {
            var DurationControl = document.getElementById(lCtrlId.DurationId);
            if (DurationControl != null) {
                var lStarting = GetUTCDate(GetYearValue(SDate), GetMonthValue(SDate), GetDateValue(SDate), parseInt(STime.split(":")[0]), parseInt(STime.split(":")[1]))
                var lEnding = GetUTCDate(GetYearValue(EDate), GetMonthValue(EDate), GetDateValue(EDate), parseInt(ETime.split(":")[0]), parseInt(ETime.split(":")[1]))

                var lTimeSpan = lEnding - lStarting;
                if (lTimeSpan > 0) {
                    var lHours = (parseInt(lTimeSpan / (1000 * 60)) / 60);
                    lHours = Math.round((lHours * 100)) / 100;
                    DurationControl.innerHTML = lHours + "&nbsp;hours";
                }
                else {
                    DurationControl.innerHTML = "";
                }
            }
        }
    }
}

function createTimePicker(pvTime, pvTargetId) {
    var lStarting = GetUTCDate(2009, 0, 1, 0, 0);
    var lEnding = GetUTCDate(2009, 0, 1, 24, 0);

    /*Autoscroll to the time already in the text field, or from the start time*/
    var pvDefaultTo = "800AM";
    if (pvTime != "") { pvDefaultTo = String(pvTime).replace(":", "").replace(" ", ""); }
    else {
        /*Try and auto scroll the end time selector*/
        var lCtrlId = new GetCtrlId(pvTargetId); var lCtrlValue = new GetCtrlValue(lCtrlId);
        var lDefaultTo = lCtrlValue.EndTime;
        if (lDefaultTo != null){ pvDefaultTo = String(lDefaultTo).replace(":", "").replace(" ", ""); }
    }
    
    createTimePickerHelper(lStarting, lEnding, pvDefaultTo, pvTargetId, false);
}


function createDurationPicker(pvTime, pvTargetId) {
    /*Get id's of controls related to this end time picker*/
    var lCtrlId = new GetCtrlId(pvTargetId);
    var lCtrlValue = new GetCtrlValue(lCtrlId);

    /*Get the starting date and time associated with this end time*/
    var SDate = lCtrlValue.StartDate; var STime = lCtrlValue.StartTime;
    var lStarting = new Date();
    if (SDate == null || STime == null) {
        return false; /*Valid date and times must be selected*/
    }
    else {
        /*There is a valid start date & time*/
        var lHour = STime.split(":")[0];
        var lMinute = STime.split(":")[1];
        
        if (lMinute >= 30) { lHour++; lMinute = 0; /*Increment to the next hour*/ }
        else { lMinute = 30; /*Increment to the next 30 minutes*/ } 
        
        lStarting = GetUTCDate(SDate.getFullYear(), SDate.getMonth(), SDate.getDate(), lHour, lMinute);
    }

    lEnding = GetUTCDate(lStarting.getUTCFullYear(), lStarting.getUTCMonth(), lStarting.getUTCDate(), lStarting.getUTCHours() + 23, lStarting.getUTCMinutes() + 30);
        
    var pvDefaultTo = "";
    if (pvTime != "") { /*Autoscroll to the time already in the text field*/
        pvDefaultTo = String(pvTime).replace(":", "").replace(" ", "");
    }
    
    var EDate = lCtrlValue.EndDate;
    if (EDate != null && CompareDates(EDate, SDate) == 1) {
        createTimePickerHelper(GetUTCDate(2009, 0, 1, 0, 0), GetUTCDate(2009, 0, 1, 0, 0), pvDefaultTo, pvTargetId, false);
    }
    else {       
        createTimePickerHelper(lStarting, lEnding, pvDefaultTo, pvTargetId, true);
    } 
}

function createTimePickerHelper(pvStartDateTime, pvEndDateTime, pvDefaultTime, pvTarget, pvDuration) {
    /*Dispose the current time picker*/
    disposeTimePicker(); $("#" + divTimePickerId).show();

    /*Create time picker elements*/
    var divTimePicker = document.getElementById(divTimePickerId);
    var divTimePickerList = document.createElement("div");
    var divCloseTimePicker = document.createElement("div");

    /*Assign atributes*/
    divTimePickerList.setAttribute("id", divTimePickerListId);
    divCloseTimePicker.setAttribute("id", divCloseTimePickerId);

    /*Figure out where to put the time selector*/
    var ctr = jQuery("#" + pvTarget);
    var ctrpos = ctr.offset();
    var ctrposOuterHeight = ctr.outerHeight();
    var ctrposOuterWidth = ctr.outerWidth();
    var ctrposFullOffset = parseInt(ctrpos.top) + parseInt(ctrposOuterHeight);
    divTimePicker.style.top = ctrposFullOffset + "px";
    divTimePicker.style.left = ctrpos.left + "px";
    divTimePicker.style.width = 165 + "px";

    var lAnchorClose = createAnchorHelper("", "javascript:disposeTimePicker();", "X", "", "");
    divCloseTimePicker.appendChild(lAnchorClose);
    divTimePicker.appendChild(divCloseTimePicker);

    /*This is needed for the duration calulations*/
    var lDuration = (pvDuration) ? 30 : 0;    
    
    var lEndTimePicker = (!pvDuration && pvTarget.indexOf("End") >= 0);
    var lStartTimePicker = (!pvDuration && pvTarget.indexOf("Start") >= 0);
    
    if ($("#hiddenTimeFlag").val() == "1" && pvDuration) {
        //Do not increment, because we wanna see the same start time
        var anc = document.createElement("a");
        var mn = GetMonthValue(pvStartDateTime);
        var dy = GetDateValue(pvStartDateTime);
        var yr = GetYearValue(pvStartDateTime);
        var h = pvStartDateTime.getHours();
        var m = pvStartDateTime.getMinutes();
        
        if (m == 0) {h=--h; m = 30; /*Decrement to the last half hour*/ }
        else { m = 0; /*Decrement to the last hour*/ }
      
        
        if (h == 0) { /*12 AM : MIDNIGHT*/
            anc.setAttribute("id", "anc" + 12 + ((m == 0) ? "00" : String(m)) + "AM");
            timestring = 12 + ((m == 0) ? ":00" : ":" + String(m)) + " AM";
            anc.innerHTML = timestring + ((m == 0) ? " (Midnight)" : "");
        }
        else if (h == 12) { /*12 PM : NOON*/
            anc.setAttribute("id", "anc" + 12 + ((m == 0) ? "00" : String(m)) + "PM");
            timestring = 12 + ((m == 0) ? ":00" : ":" + String(m)) + " PM";
            anc.innerHTML = timestring + ((m == 0) ? " (Noon)" : "");
        }
        else if (h > 12) { /*1 PM - 11 PM*/
            anc.setAttribute("id", "anc" + (h - 12) + ((m == 0) ? "00" : String(m)) + "PM");
            
            timestring = (h - 12) + ((m == 0) ? ":00" : ":" + String(m)) + " PM";
            
            anc.innerHTML = timestring;
        }
        else { /*1 AM  - 11 AM*/
            anc.setAttribute("id", "anc" + h + ((m == 0) ? "00" : String(m)) + "AM");
            timestring = h + ((m == 0) ? ":00" : ":" + String(m)) + " AM";
            anc.innerHTML = timestring; 
        }

        if (pvDuration) { anc.innerHTML = anc.innerHTML + " (0 hours)"; }
        anc.href = "javascript:timeClicked('0','" + pvTarget + "')";
        anc.setAttribute("onclick", "timeClicked('0','" + pvTarget + "')");
        
        divTimePickerList.appendChild(anc); 
    }

    while (lDuration <= 1440) {
        /*These are the time elements the picker will use*/
        var mn = GetMonthValue(pvStartDateTime);
        var dy = GetDateValue(pvStartDateTime);
        var yr = GetYearValue(pvStartDateTime);
        var h = pvStartDateTime.getHours();
        var m = pvStartDateTime.getMinutes();
        
        if ((lEndTimePicker && lDuration == 0) || (lStartTimePicker && lDuration == 1440)) {
            /*Hide leading 12:00 AM for end; hide trailing 12:00 AM for start*/
        }
        else {
            var anc = document.createElement("a");
            var timestring = "";
            if (h == 0) { /*12 AM : MIDNIGHT*/
                anc.setAttribute("id", "anc" + 12 + ((m == 0) ? "00" : String(m)) + "AM");
                timestring = 12 + ((m == 0) ? ":00" : ":" + String(m)) + " AM";
                anc.innerHTML = timestring + ((m == 0) ? " (Midnight)" : "");
                if (pvDuration) { anc.innerHTML = anc.innerHTML + " (" + (lDuration / 60) + " hours)"; }
            }
            else if (h == 12) { /*12 PM : NOON*/
                anc.setAttribute("id", "anc" + 12 + ((m == 0) ? "00" : String(m)) + "PM");
                timestring = 12 + ((m == 0) ? ":00" : ":" + String(m)) + " PM";
                anc.innerHTML = timestring + ((m == 0) ? " (Noon)" : "");
                if (pvDuration) { anc.innerHTML = anc.innerHTML + " (" + (lDuration / 60) + " hours)"; }
            }
            else if (h > 12) { /*1 PM - 11 PM*/
                anc.setAttribute("id", "anc" + (h - 12) + ((m == 0) ? "00" : String(m)) + "PM");
                timestring = (h - 12) + ((m == 0) ? ":00" : ":" + String(m)) + " PM";
                anc.innerHTML = timestring;
                if (pvDuration) { anc.innerHTML = anc.innerHTML + " (" + (lDuration / 60) + " hours)"; }
            }
            else { /*1 AM  - 11 AM*/
                anc.setAttribute("id", "anc" + h + ((m == 0) ? "00" : String(m)) + "AM");
                timestring = h + ((m == 0) ? ":00" : ":" + String(m)) + " AM";
                anc.innerHTML = timestring;
                if (pvDuration) { anc.innerHTML = anc.innerHTML + " (" + (lDuration / 60) + " hours)"; }
            }

            if (pvDuration) {
                anc.href = "javascript:timeClicked('" + lDuration + "','" + pvTarget + "')";
                anc.setAttribute("onclick", "timeClicked('" + lDuration + "','" + pvTarget + "')");
            }
            else {
                anc.href = "javascript:timeClicked('" + timestring + "','" + pvTarget + "')";
                anc.setAttribute("onclick", "timeClicked('" + timestring + "','" + pvTarget + "')");
            }


            if (JSTimeLimitStart != null && JSTimeLimitStart > lDuration) {

            }
            else if (JSTimeLimitEnd != null && JSTimeLimitEnd < lDuration) {
                
            }
            else {
                divTimePickerList.appendChild(anc);    
            }
            
        }        

        /*Increment to the next day*/
        pvStartDateTime = GetUTCDate(yr, mn, dy, h, m + 30);
        lDuration += 30;
    }

    /*Add all the cells to the table*/
    divTimePicker.appendChild(divTimePickerList);
    document.body.appendChild(divTimePicker)

    $(document).ready(function() {
        /*AUTOSCROLL FUNCTIONALITY*/
        if (pvDefaultTime != "") {
            if (document.getElementById("anc" + pvDefaultTime) != null) {
                var ancctrl = jQuery("#anc" + pvDefaultTime);
                var ancctrlOffsetTop = document.getElementById("anc" + pvDefaultTime).offsetTop;
                var ancctrlHeight = ancctrl.height();
                var ancctrlposFullOffset = parseInt(ancctrlOffsetTop) - parseInt(ancctrlHeight);
                if (parseInt(ancctrlposFullOffset) > 0) {
                    document.getElementById(divTimePickerListId).scrollTop = ancctrlposFullOffset;
                }
            }
        }
    });
}

function createAnchorHelper(pvId, pvHref, pvInnerHTML, pvClass, pvTitle) {
    anc = document.createElement("a");
    anc.href = pvHref; ;
    anc.innerHTML = pvInnerHTML;
    if (pvClass != "") { anc.setAttribute("class", pvClass); }
    if (pvId != "") { anc.setAttribute("id", pvId); }
    if (pvTitle != "") { anc.setAttribute("title", pvTitle); }
    return anc;
}
