// Global variables
var isCSS, isW3C, isIE4, isNN4, isIE6CSS;
// Initialize upon load to let all browsers establish content objects
function initDHTMLAPI() {
    if (document.images) {
        isCSS = (document.body && document.body.style) ? true : false;
        isW3C = (isCSS && document.getElementById) ? true : false;
        isIE4 = (isCSS && document.all) ? true : false;
        isNN4 = (document.layers) ? true : false;
        isIE6CSS = (document.compatMode && document.compatMode.indexOf("CSS1") >= 0) ? true : false;
    }
}
// Set event handler to initialize API
window.onload = initDHTMLAPI;

// Seek nested NN4 layer from string name
function seekLayer(doc, name) {
    var theObj;
    for (var i = 0; i < doc.layers.length; i++) {
        if (doc.layers[i].name == name) {
            theObj = doc.layers[i];
            break;
        }
        // dive into nested layers if necessary
        if (doc.layers[i].document.layers.length > 0) {
            theObj = seekLayer(document.layers[i].document, name);
        }
    }
    return theObj;
}

// Convert object name string or object reference
// into a valid element object reference
function getRawObject(obj) {
    var theObj;
    if (typeof obj == "string") {
        if (isW3C) {
            theObj = document.getElementById(obj);
        } else if (isIE4) {
            theObj = document.all(obj);
        } else if (isNN4) {
            theObj = seekLayer(document, obj);
        }
    } else {
        // pass through object reference
        theObj = obj;
    }
    return theObj;
}

// Convert object name string or object reference
// into a valid style (or NN4 layer) reference
function getObject(obj) {
    var theObj = getRawObject(obj);
    if (theObj && isCSS) {
        theObj = theObj.style;
    }
    return theObj;
}

// Position an object at a specific pixel coordinate
function shiftTo(obj, x, y) {
    var theObj = getObject(obj);
    if (theObj) {
        if (isCSS) {
            // equalize incorrect numeric value type
            var units = (typeof theObj.left == "string") ? "px" : 0 
            theObj.left = x + units;
            theObj.top = y + units;
        } else if (isNN4) {
            theObj.moveTo(x,y)
        }
    }
}

// Move an object by x and/or y pixels
function shiftBy(obj, deltaX, deltaY) {
    var theObj = getObject(obj);
    if (theObj) {
        if (isCSS) {
            // equalize incorrect numeric value type
            var units = (typeof theObj.left == "string") ? "px" : 0 
            theObj.left = getObjectLeft(obj) + deltaX + units;
            theObj.top = getObjectTop(obj) + deltaY + units;
        } else if (isNN4) {
            theObj.moveBy(deltaX, deltaY);
        }
    }
}

// Set the z-order of an object
function setZIndex(obj, zOrder) {
    var theObj = getObject(obj);
    if (theObj) {
        theObj.zIndex = zOrder;
    }
}

// Set the background color of an object
function setBGColor(obj, color) {
    var theObj = getObject(obj);
    if (theObj) {
        if (isNN4) {
            theObj.bgColor = color;
        } else if (isCSS) {
            theObj.backgroundColor = color;
        }
    }
}

// Set the visibility of an object to visible
function show(obj) {
    var theObj = getObject(obj);
    if (theObj) {
        theObj.visibility = "visible";
    }
}

// Set the visibility of an object to hidden
function hide(obj) {
    var theObj = getObject(obj);
    if (theObj) {
        theObj.visibility = "hidden";
    }
}

// Retrieve the x coordinate of a positionable object
function getObjectLeft(obj)  {
    var elem = getRawObject(obj);
    var result = 0;
    if (document.defaultView) {
        var style = document.defaultView;
        var cssDecl = style.getComputedStyle(elem, "");
        result = cssDecl.getPropertyValue("left");
    } else if (elem.currentStyle) {
        result = elem.currentStyle.left;
    } else if (elem.style) {
        result = elem.style.left;
    } else if (isNN4) {
        result = elem.left;
    }
    return parseInt(result);
}

// Retrieve the y coordinate of a positionable object
function getObjectTop(obj)  {
    var elem = getRawObject(obj);
    var result = 0;
    if (document.defaultView) {
        var style = document.defaultView;
        var cssDecl = style.getComputedStyle(elem, "");
        result = cssDecl.getPropertyValue("top");
    } else if (elem.currentStyle) {
        result = elem.currentStyle.top;
    } else if (elem.style) {
        result = elem.style.top;
    } else if (isNN4) {
        result = elem.top;
    }
    return parseInt(result);
}

// Retrieve the rendered width of an element
function getObjectWidth(obj)  {
    var elem = getRawObject(obj);
    var result = 0;
    if (elem.offsetWidth) {
        result = elem.offsetWidth;
    } else if (elem.clip && elem.clip.width) {
        result = elem.clip.width;
    } else if (elem.style && elem.style.pixelWidth) {
        result = elem.style.pixelWidth;
    }
    return parseInt(result);
}

// Retrieve the rendered height of an element
function getObjectHeight(obj)  {
    var elem = getRawObject(obj);
    var result = 0;
    if (elem.offsetHeight) {
        result = elem.offsetHeight;
    } else if (elem.clip && elem.clip.height) {
        result = elem.clip.height;
    } else if (elem.style && elem.style.pixelHeight) {
        result = elem.style.pixelHeight;
    }
    return parseInt(result);
}

// Return the available content width space in browser window
function getInsideWindowWidth() {
    if (window.innerWidth) {
        return window.innerWidth;
    } else if (isIE6CSS) {
        // measure the html element's clientWidth
        return document.body.parentElement.clientWidth
    } else if (document.body && document.body.clientWidth) {
        return document.body.clientWidth;
    }
    return 0;
}

// Return the available content height space in browser window
function getInsideWindowHeight() {
    if (window.innerHeight) {
        return window.innerHeight;
    } else if (isIE6CSS) {
        // measure the html element's clientHeight
        return document.body.parentElement.clientHeight
    } else if (document.body && document.body.clientHeight) {
        return document.body.clientHeight;
    }
    return 0;
}


/*******************
  UTILITY FUNCTIONS
********************/
// day of week of month's first day
function getFirstDay(theYear, theMonth){
    var firstDate = new Date(theYear,theMonth-1,1);
    return firstDate.getDay();
}
// number of days in the month
function getMonthLen(theYear, theMonth) {
    var nextMonth = new Date(theYear, theMonth, 1);
    nextMonth.setHours(nextMonth.getHours() - 3);
    return nextMonth.getDate();
}

function getElementPosition(elemID) {
	var offsetTrail = document.getElementById(elemID);
    var offsetLeft = 0;
    var offsetTop = 0;
    while (offsetTrail) {
        offsetLeft += offsetTrail.offsetLeft;
        offsetTop += offsetTrail.offsetTop;
        offsetTrail = offsetTrail.offsetParent;
    }
    if (navigator.userAgent.indexOf("Mac") != -1 && 
        typeof document.body.leftMargin != "undefined") {
        offsetLeft += document.body.leftMargin;
        offsetTop += document.body.topMargin;
    }
    return {left:offsetLeft, top:offsetTop};
}

// position and show calendar
function showCalendar(evt, targetFormName, targetFieldName, defaultMonth, defaultYear) {	
    evt = (evt) ? evt : event;
    if (evt) {
		var dateChooserForm=document.dateChooser;
		var currentDate = new Date();
		var currentMonth=currentDate.getMonth() + 1;
		var currentYear=currentDate.getYear();
		if (currentYear < 1000) currentYear = currentYear + 1900;
		var theMonth = (defaultMonth) ? defaultMonth : currentMonth;
		var theYear = (defaultYear) ? defaultYear : currentYear;
		resetTarget (targetFormName, targetFieldName, defaultMonth, defaultYear);		
		var calendarPickerObj=document.getElementById("calendarPicker");		
    	if (calendarPickerObj.style.visibility != "visible") {
    	    var elem = (evt.target) ? evt.target : evt.srcElement;
    	    var position = getElementPosition(elem.id);
            //shiftTo("calendar", position.left + elem.offsetWidth, position.top);
			shiftTo("calendarPicker", position.left, position.top + elem.offsetHeight);		
			populateTable(theMonth, theYear)
            show("calendarPicker");
        } else {
            hide("calendarPicker");
        }
    }
}


/************************
  DRAW CALENDAR CONTENTS
*************************/
// clear and re-populate table based on form's selections
function populateTable(defaultMonth, defaultYear) {
    // pick up date form choices
    // initialize date-dependent variables
	var dateChooserForm=document.dateChooser;
	var theMonth = (defaultMonth) ? defaultMonth : dateChooserForm.chooseMonth.selectedIndex + 1;
    //var theYear = (defaultYear) ? defaultYear : parseInt(dateChooserForm.chooseYear.options[dateChooserForm.chooseYear.selectedIndex].text);
    var theYear = (defaultYear) ? defaultYear : parseInt(dateChooserForm.chooseYear.value);
	if (isNaN(theYear)) {
	  var nowDate= new Date();
	  theYear = nowDate.getYear();	  
	}
	dateChooserForm.chooseYear.value = theYear;
	resetTarget(targetProperty.targetFormName, targetProperty.targetFieldName, theMonth, theYear);
    var firstDay = getFirstDay(theYear, theMonth);
    var howMany = getMonthLen(theYear, theMonth);
    var today = new Date();	
	
    // fill in month/year in table header
    document.getElementById("tableHeader").innerHTML = 
        '<div style="float:left;text-align:center;width:93%">' + dateChooserForm.chooseMonth.options[theMonth-1].text + ' ' + theYear + '</div><div style="float:right;padding:1px 2px 1px 2px;border=1px solid #000000;"><a href="javascript:hideCalendar()" style="text-decoration:none;color:#000000">X</a></div>';

	dateChooserForm.chooseMonth.selectedIndex = theMonth-1;
	
    // initialize vars for table creation
    var dayCounter = 1;
    var TBody = document.getElementById("tableBody");
    // clear any existing rows
    while (TBody.rows.length > 0) {
        TBody.deleteRow(0);
    }
    var newR, newC, dateNum;
    var done=false;
    while (!done) {
        // create new row at end
        newR = TBody.insertRow(TBody.rows.length);
		newR.setAttribute("align", "center");
        if (newR) {			
            for (var i = 0; i < 7; i++) {
                // create new cell at end of row
                newC = newR.insertCell(newR.cells.length);				
                if (TBody.rows.length == 1 && i < firstDay) {
                    // empty boxes before first day
                    newC.innerHTML = "&nbsp;";
                    continue;
                }
                if (dayCounter == howMany) {
                    // no more rows after this one
                    done = true;
                }
                // plug in link/date (or empty for boxes after last day)
                if (dayCounter <= howMany) {
                    if (today.getFullYear() == theYear &&
                        today.getMonth() == dateChooserForm.chooseMonth.selectedIndex &&
                        today.getDate() == dayCounter) {
                        linkColor="#FF0000";
					} else {
					    linkColor="#000000";
                    }
                    newC.innerHTML = "<a href='javascript:void(0)' style='color:" + linkColor + "; text-decoration:none' onclick='chooseDate(" +
                        dayCounter + "," + theMonth + "," + theYear + 
                        "); return false;'>" + dayCounter + "</a>";
                     dayCounter++;
               } else {
                    newC.innerHTML = "&nbsp;";
                }			
            }
        } else {
            done = true;
        }
    }
}

function hideCalendar() {
    hide("calendarPicker");
}

function changeYear(evt) {
	evt = (evt) ? evt : ((event) ? event : null);
    if (evt) {
		if (evt.keyCode == 13) {
		  populateTable();
		}		
    }	
}

function addYear(numYear) {
	var dateChooserForm=document.dateChooser;
	dateChooserForm.chooseYear.value = (parseInt(dateChooserForm.chooseYear.value) + numYear) + "";
	populateTable();
}

/*******************
   PROCESS CHOICE
********************/
function chooseDate(date, month, year) {
	selectdate = month + "/" + date + "/" + year;
	eval("document." + targetProperty.targetFormName + "." + targetProperty.targetFieldName + ".value = selectdate");
    hide("calendarPicker");
}
/************************
  CREATE INITIAL CALENDAR TABLE
*************************/
 
var targetProperty = {targetFormName:"", targetFieldName:"", targetMonth:1, targetYear:2005};

function resetTarget (targetFormName, targetFieldName, targetMonth, targetYear) {
	targetProperty.targetFormName = targetFormName;
	targetProperty.targetFieldName = targetFieldName;
	targetProperty.targetMonth = targetMonth;
	targetProperty.targetYear =  targetYear;
}

function isDate(object_value) {
	if (object_value.length == 0)
		return false;
	isplit = object_value.indexOf('/');
	if (isplit == -1 || isplit == object_value.length)
		return false;
	sMonth = object_value.substring(0, isplit);
	if (sMonth.length == 0)
		return false;
	isplit = object_value.indexOf('/', isplit + 1);
	if (isplit == -1 || (isplit + 1 ) == object_value.length)
		return false;
	sDay = object_value.substring((sMonth.length + 1), isplit);
	if (sDay.length == 0)
		return false;
	sYear = object_value.substring(isplit + 1);
	if (!checkinteger(sMonth))	return false;
	else if (!checkrange(sMonth, 1, 12)) return false;
	else if (!checkinteger(sYear)) return false;
	else if (!checkrange(sYear, 1000, 9999)) return false;
	else if (!checkinteger(sDay)) return false;
	else if (!checkday(sYear, sMonth, sDay)) return false;
	else return true;
}
  document.write(
  '<div id="calendarPicker" style="position:absolute;left:0px;top:0px;visibility:hidden">\n' +
  '<form name="dateChooser" onSubmit="return false;">\n' +
  '<table id="calendarTable" border="0" cellpadding="2" cellspacing="1" style="font-family:Verdana; font-size:11px; background-color:#000000">\n' +
  '  <tr bgcolor="#ffffcc">\n' +
  '    <th id="tableHeader" colspan="7"></th>\n' +
  '  </tr>\n' +
  '  <tr bgcolor="#ccffcc"><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th>\n' +
  '  <th>Thu</th><th>Fri</th><th>Sat</th></tr>\n' +
  '  <tbody id="tableBody" style="background-color:#ffffff"></tbody>\n' +
  '  <tr bgcolor="#ffffff">\n' +
  '    <td colspan="7" align="center">\n' +
  '      <select name="chooseMonth" onchange="populateTable()" style="font-family:Verdana;font-size:11px;">\n' +
  '         <option selected>January</option>\n' +
  '			<option>February</option>\n' +
  '         <option>March</option>\n' +
  '			<option>April</option>\n' +
  '			<option>May</option>\n' +
  '         <option>June</option>\n' +
  '			<option>July</option>\n' +
  '			<option>August</option>\n' +
  '         <option>September</option>\n' +
  '			<option>October</option>\n' +
  '         <option>November</option>\n' +
  '			<option>December</option>\n' +
  '      </select>\n' +
  '      <a href="javascript:addYear(-1)" style="font-family:verdana;font-size=11px;color:#000000;text-decoration:none">&lt;&lt;</a> <input type="text" name="chooseYear" size="4" style="font-family:Verdana;font-size:11px;" onKeyDown="changeYear(event)"> <a href="javascript:addYear(1)" style="font-family:verdana;font-size=11px;color:#000000;text-decoration:none">&gt;&gt;</a>\n' +
  '    </td>\n' +
  '  </tr>\n' +
  '</table>\n' +
  '</form>\n' +
  '</div>');
