﻿// event
function DatePickerEvent() {
    this.eventHandlers = new Array();
}

DatePickerEvent.prototype.addHandler = function(eventHandler) {
    this.eventHandlers.push(eventHandler);
}

DatePickerEvent.prototype.raise = function(args) {
    for (var i = 0; i < this.eventHandlers.length; i++) {
        this.eventHandlers[i](args);
    }
}

// end event
onCalendarPopupToggle = new DatePickerEvent();


document.onmousedown = CalendarMouseDown;
function CalendarMouseDown(ev){
    var VANCalendarDiv = document.getElementById('CalendarControl');
    if (VANCalendarDiv != null) {
        if (VANCalendarDiv.style.display == 'block') {
            if (!(DivClicked(ev, VANCalendarDiv))) {
                hideCalendarControl();
            }
        }
    }
}

function DivClicked(e, theDiv){
    //alert(theDiv.id);
    if (theDiv.id != null) {
        if (document.all) { // Need to hard-code theDiv to trap IE for error-handling
            var t = window.event.srcElement;
            while (t.parentElement != null) {
                if (t.id == theDiv.id) {
                    return true;
                }
                t = t.parentElement;
            }
            return false;
        }
        else 
            if (document.getElementById) {
                //When a user clicks on another input item outside the control, Firefox will throw error "uncaught exception: Permission denied to get property HTMLDivElement.parentNode."  This is a Firefox bug, however, it does not upset what we are trying to accomplis (determine whether a user clicked outside the popup or not.)
                
                // "originalTarget" doesn't exist    
                //var t = e.originalTarget;
                var t = e.target;
                while (t.parentNode != null) {
                    if (t.id == theDiv.id) {
                        return true;
                    }
                    t = t.parentNode;
                }
                return false;
            }
            else {
                var clickX = e.pageX;
                var clickY = e.pageY;
                var t = document.layers[theDiv.id];
                // alert(clickX + ':' + t.left);
                if ((clickX > t.left) && (clickX < t.left + t.clip.width) && (clickY > t.top) && (clickY < t.top + t.clip.height)) {
                    return true;
                }
                else {
                    return false;
                }
            }
        return false;
    }
    return false;
}

function positionInfo(object){

    var p_elm = object;
    
    this.getElementLeft = getElementLeft;
    function getElementLeft(){
        var x = 0;
        var elm;
        if (typeof(p_elm) == "object") {
            elm = p_elm;
        }
        else {
            elm = document.getElementById(p_elm);
        }
        while (elm != null) {
            x += elm.offsetLeft;
            elm = elm.offsetParent;
        }
        return parseInt(x);
    }
    
    this.getElementWidth = getElementWidth;
    function getElementWidth(){
        var elm;
        if (typeof(p_elm) == "object") {
            elm = p_elm;
        }
        else {
            elm = document.getElementById(p_elm);
        }
        return parseInt(elm.offsetWidth);
    }
    
    this.getElementRight = getElementRight;
    function getElementRight(){
        return getElementLeft(p_elm) + getElementWidth(p_elm);
    }
    
    this.getElementTop = getElementTop;
    function getElementTop(){
        var y = 0;
        var elm;
        if (typeof(p_elm) == "object") {
            elm = p_elm;
        }
        else {
            elm = document.getElementById(p_elm);
        }
        while (elm != null) {
            y += elm.offsetTop;
            elm = elm.offsetParent;
        }
        return parseInt(y);
    }
    
    this.getElementHeight = getElementHeight;
    function getElementHeight(){
        var elm;
        if (typeof(p_elm) == "object") {
            elm = p_elm;
        }
        else {
            elm = document.getElementById(p_elm);
        }
        return parseInt(elm.offsetHeight);
    }
    
    this.getElementBottom = getElementBottom;
    function getElementBottom(){
        return getElementTop(p_elm) + getElementHeight(p_elm);
    }
}

function CalendarControl(){

    var calendarId = 'CalendarControl';
    var currentYear = 0;
    var currentMonth = 0;
    var currentDay = 0;
    
    var selectedYear = 0;
    var selectedMonth = 0;
    var selectedDay = 0;
    
    //var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
    var months = ['Jan', 'Feb', 'March', 'April', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];
    var dateField = null;
    
    function getProperty(p_property){
        getElementProperty(p_property, calendarId)
    }
    
    function getElementProperty(p_property, p_elmId){
        var p_elm = p_elmId;
        var elm = null;
        
        if (typeof(p_elm) == "object") {
            elm = p_elm;
        }
        else {
            elm = document.getElementById(p_elm);
        }
        if (elm != null) {
            if (elm.style) {
                elm = elm.style;
                if (elm[p_property]) {
                    return elm[p_property];
                }
                else {
                    return null;
                }
            }
            else {
                return null;
            }
        }
    }
    
    function setElementProperty(p_property, p_value, p_elmId){
        var p_elm = p_elmId;
        var elm = null;
        
        if (typeof(p_elm) == "object") {
            elm = p_elm;
        }
        else {
            elm = document.getElementById(p_elm);
        }
        if ((elm != null) && (elm.style != null)) {
            elm = elm.style;
            elm[p_property] = p_value;
        }
    }
    
    function setProperty(p_property, p_value){
        setElementProperty(p_property, p_value, calendarId);
    }
    
    function getDaysInMonth(year, month){
        return [31, ((!(year % 4) && ((year % 100) || !(year % 400))) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
    }
    
    function getDayOfWeek(year, month, day){
        var date = new Date(year, month - 1, day)
        return date.getDay();
    }
    
    this.clearDate = clearDate;
    function clearDate(){
        dateField.value = '';
        hide();
    }
    
    this.setDate = setDate;
    function setDate(formattype, year, month, day){
        if (dateField) {
            //Altering to fit in VAN format
            //if (month < 10) {month = "0" + month;}
            //if (day < 10) {day = "0" + day;}
            year = String(year).substring(4, 2);
            var dateString;
            if (formattype == 'd/M/yy' || formattype == 'dd/MM/yy') {
                dateString = day + "/" + month + "/" + year;
            }
            else {
                dateString = month + "/" + day + "/" + year;
            }
            dateField.value = dateString;
            //TJL 12.27.2007 support custom change events, NOTE these are not real events and cannot use the THIS variable, sorry :-(
            if (dateField.getAttribute('onCalendarChange') != null) {
                eval(dateField.getAttribute('onCalendarChange'));
            };
            hide();
        }
        return;
    }
    
    this.changeMonth = changeMonth;
    function changeMonth(change, formattype){
        currentMonth += change;
        currentDay = 0;
        if (currentMonth > 12) {
            currentMonth = 1;
            currentYear++;
        }
        else 
            if (currentMonth < 1) {
                currentMonth = 12;
                currentYear--;
            }
        
        calendar = document.getElementById(calendarId);
        calendar.innerHTML = calendarDrawTable(formattype);
    }
    
    this.changeYear = changeYear;
    function changeYear(change, formattype){
        currentYear += change;
        currentDay = 0;
        calendar = document.getElementById(calendarId);
        calendar.innerHTML = calendarDrawTable(formattype);
    }
    
    function getCurrentYear(){
        var year = new Date().getYear();
        if (year < 1900) 
            year += 1900;
        return year;
    }
    
    function getCurrentMonth(){
        return new Date().getMonth() + 1;
    }
    
    function getCurrentDay(){
        return new Date().getDate();
    }
    
    function calendarDrawTable(formattype){
        var dayOfMonth = 1;
        var validDay = 0;
        var startDayOfWeek = getDayOfWeek(currentYear, currentMonth, dayOfMonth);
        var daysInMonth = getDaysInMonth(currentYear, currentMonth);
        var css_class = null; //CSS class for each day
        var table = "<table cellspacing='0' cellpadding='0' border='0' class='WizardTableSection'>";
        table = table + "<tr><td class='SectionHeading' colspan='7'>";
        table = table + "  <table cellpadding='0' width='100%'><tr><th class='previous' width='30px'><a href=javascript:changeCalendarControlYear(-1,'" + formattype + "');><font face='Arial'><<</font></a>&nbsp;&nbsp;<a href=javascript:changeCalendarControlMonth(-1,'" + formattype + "');><font face='Arial'><</font></a>&nbsp;&nbsp;</th>";
        table = table + "  <th class='title'>" + months[currentMonth - 1] + "&nbsp;" + currentYear + "</th>";
        table = table + "  <th class='next' width='30px'>&nbsp;&nbsp;<a href=javascript:changeCalendarControlMonth(1,'" + formattype + "');><font face='Arial'>></font></a>&nbsp;&nbsp;<a href=javascript:changeCalendarControlYear(1,'" + formattype + "');><font face='Arial'>>></font></a></th></tr></table>";
        table = table + "</td></tr>";
        table = table + "<tr class='ResultsPagerStyle0'><th>Su</th><th>Mo</th><th>Tu</th><th>We</th><th>Th</th><th>Fr</th><th>Sa</th></tr>";
        
        for (var week = 0; week < 6; week++) {
            table = table + "<tr>";
            for (var dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {
                if (week == 0 && startDayOfWeek == dayOfWeek) {
                    validDay = 1;
                }
                else 
                    if (validDay == 1 && dayOfMonth > daysInMonth) {
                        validDay = 0;
                    }
                
                if (validDay) {
                    if (dayOfMonth == selectedDay && currentYear == selectedYear && currentMonth == selectedMonth) {
                        css_class = 'current';
                    }
                    else 
                        if (dayOfWeek == 0 || dayOfWeek == 6) {
                            css_class = 'weekend';
                        }
                        else {
                            css_class = 'weekday';
                        }
                    
                    table = table + "<td><a class='" + css_class + "' href=\"javascript:setCalendarControlDate('" + formattype + "'," + currentYear + "," + currentMonth + "," + dayOfMonth + ")\">" + dayOfMonth + "</a></td>";
                    dayOfMonth++;
                }
                else {
                    table = table + "<td class='empty'>&nbsp;</td>";
                }
            }
            table = table + "</tr>";
        }
        
        //    table = table + "<tr class='header'><th colspan='7' style='padding: 3px;'><a href='javascript:clearCalendarControl();'>Clear</a> | <a href='javascript:hideCalendarControl();'>Close</a></td></tr>";
        table = table + "</table>";
        
        return table;
    }

    this.getZIndexRecursive = getZIndexRecursive  
    function getZIndexRecursive(elm) {
		var z = getElementProperty('zIndex', elm);
		if (z == null) {
			var p = elm.parentNode;
			if (p != null) {
				return getZIndexRecursive(p);
			} else {
				return 0;
			}
		} else {
			return z;
		}
	}

	
	this.show = show;
    function show(field, formattype){
        can_hide = 0;
        
        // If the calendar is visible and associated with
        // this field do not do anything.
        if (dateField == field) {
            return;
        }
        else {
            dateField = field;
        }
        
        if (dateField) {
            try {
                var dateString = new String(dateField.value);
                var dateParts = dateString.split("/");
                if (formattype == 'd/M/yy' || formattype == 'dd/MM/yy') {
                    selectedMonth = parseInt(dateParts[1], 10);
                    selectedDay = parseInt(dateParts[0], 10);
                }
                else {
                    selectedMonth = parseInt(dateParts[0], 10);
                    selectedDay = parseInt(dateParts[1], 10);
                }
                selectedYear = parseInt(dateParts[2], 10);
                //Have to account for the year being only two digit years.  Append the 19, 20, 200 or just make a string in order to convert back into an integer
                if (selectedYear < 10) {
                    selectedYear = "200" + selectedYear;
                }
                else 
                    if (selectedYear > 50 && selectedYear < 100) {
                        selectedYear = "19" + selectedYear;
                    }
                    else 
                        if (selectedYear < 50 && selectedYear > 9) {
                            selectedYear = "20" + selectedYear;
                        }
                        else {
                            selectedYear = "" + selectedYear;
                        }
            } 
            catch (e) {
            }
        }
        
        if (!(selectedYear && selectedMonth && selectedDay)) {
            selectedMonth = getCurrentMonth();
            selectedDay = getCurrentDay();
            selectedYear = getCurrentYear();
        }
        
        currentMonth = selectedMonth;
        currentDay = selectedDay;
        currentYear = parseInt(selectedYear, 10);
        
        if (document.getElementById) {
        
            calendar = document.getElementById(calendarId);
            calendar.innerHTML = calendarDrawTable(formattype, currentYear, currentMonth);
            
            setProperty('display', 'block');
            
            var fieldPos = new positionInfo(dateField);
            var calendarPos = new positionInfo(calendarId);
            
            var x = fieldPos.getElementLeft();
            var y = fieldPos.getElementBottom();
            
            setProperty('left', x + "px");
            setProperty('top', y + "px");
            
            // MPK 072908 make sure the calendar always appears at the top
            var z = getZIndexRecursive(dateField);
            setProperty('zIndex', z + 100);
			
            // TJL 03.12.2007 disabled CalendarControlIFrame everywhere, because it was causing ugly boxes to appear when a page loaded. (and seems to be not used!)
            if (document.all) {
                setElementProperty('display', 'block', 'CalendarControlIFrame');
                setElementProperty('left', x + "px", 'CalendarControlIFrame');
                setElementProperty('top', y + "px", 'CalendarControlIFrame');
                setElementProperty('width', calendarPos.getElementWidth() + "px", 'CalendarControlIFrame');
                setElementProperty('height', calendarPos.getElementHeight() + "px", 'CalendarControlIFrame');
                setElementProperty('zIndex', parseInt(z) + 100, 'CalendarControlIFrame');
            }
        }
        onCalendarPopupToggle.raise('SHOW'); // gs 20100114 - this is used in BU Wizard Rad Window resizing
    }
    
    this.hide = hide;
    function hide() {
        if (dateField) {
            setProperty('display', 'none');
            // TJL 03.12.2007 disabled CalendarControlIFrame everywhere, because it was causing ugly boxes to appear when a page loaded. (and seems to be not used!)
            if (document.all) {
                setElementProperty('display', 'none', 'CalendarControlIFrame');
            }
            dateField = null;
        }
        onCalendarPopupToggle.raise('HIDE'); // gs 20100114 - this is used in BU Wizard Rad Window resizing
    }
    
    this.visible = visible;
    function visible(){
        return dateField
    }
    
    this.can_hide = can_hide;
    var can_hide = 0;
}


var calendarControl = new CalendarControl();

function showCalendarControl(textField, formattype){
    // textField.onblur = hideCalendarControl;
    //formattype: 03.08.2007 - cdn - added to account for clients outside of us
    calendarControl.show(textField, formattype);
}

function clearCalendarControl(){
    calendarControl.clearDate();
}

function hideCalendarControl(){
    if (calendarControl.visible()) {
        calendarControl.hide();
    }
}

function setCalendarControlDate(formattype, year, month, day){
    calendarControl.setDate(formattype, year, month, day);
}

function changeCalendarControlYear(change, formattype){
    calendarControl.changeYear(change, formattype);
}

function changeCalendarControlMonth(change, formattype){
    calendarControl.changeMonth(change, formattype);
}

// TJL 03.12.2007 disabled CalendarControlIFrame everywhere, because it was causing ugly boxes to appear when a page loaded. (and seems to be not used!)
if (document.all) {
    document.write("<iframe id='CalendarControlIFrame' src='/js/Calendar.htm' frameBorder='0' scrolling='no'></iframe>");
    //TJL 06.15.2007 do not use the DOM iframe created below otherwise SSL errors happen :-(.
    //  var ifrm = document.createElement("IFRAME");
    //	ifrm.id="CalendarControlIFrame";
    //	ifrm.setAttribute("frameBorder", 0);
    //	ifrm.setAttribute("scrolling", "no");
    //	document.body.appendChild(ifrm);
}

document.write("<div id='CalendarControl'></div>");
