function initDateViewer(div_element, input_param, date){
        var glenn;
        if (null != date) {
            glenn = new DateViewer(date);
        } else {
            glenn = new DateViewer(new Date());
        }
    
    
	//var glenn = new DateViewer(date);
	var date_component = glenn.instance;
	var date_float = document.createElement('div');
	var date_change = document.createElement('a');
	var date_input = document.createElement('input');
	date_component.style.backgroundColor = 'white';
	date_component.style.border = 'thin solid black';
	if(date) date_input.value = date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
	else date_input.value =  '';
	date_float.style.position = 'absolute';
	date_float.style.display = 'none';
	date_change.href = 'javascript:void(0)';
	date_change.innerHTML = "<div style=\"vertical-align: bottom; display: inline; margin-left: 0.5em;\"><img src=\"templates/bch/images/cal.png\" border=\"0\" style=\"padding: 0px;\"></div>";
	date_change.onclick = function(){
		date_float.style.display = 'block';
		date_float.style.left = DL_GetElementLeft(date_input)+'px';
		date_float.style.top = DL_GetElementTop(date_input)+'px';
	};
	date_input.name = input_param;
	date_input.type = 'text';
	date_input.readOnly = 'true';
	div_element.style.display = "block";
	div_element.appendChild(date_float);
	div_element.appendChild(date_input);
	div_element.appendChild(date_change);
	div_element.style.verticalAlign = 'bottom';
	date_float.appendChild(date_component);
	var td1 = document.createElement('td');
	var td2 = document.createElement('td');
	var oks = document.createElement('input');
	var can = document.createElement('input');
	td1.colspan = '2';
	oks.type = 'button';
	can.type = 'button';
	oks.value = 'OK';
	can.value = 'Cancel';
	date_component.firstChild.firstChild.tBodies[0].appendChild(document.createElement('tr'));
	date_component.firstChild.firstChild.tBodies[0].lastChild.appendChild(td1);
	date_component.firstChild.firstChild.tBodies[0].lastChild.appendChild(td2);
	td1.appendChild(oks);
	td2.appendChild(can);
        td2.setAttribute('align', 'right');
	oks.onclick = function(){
		date_float.style.display = 'none';
		date_input.value = glenn.getYear()+"-"+(glenn.getMonth()+1)+"-"+glenn.getDate();
	};
	can.onclick = function(){
		date_float.style.display = 'none';
	};	
}
function DateViewer(date){
	var tempdate = new Date();
	if(date) tempdate = date;
	var days = [" S ", " M ", " T ", " W ", " T ", " F ", " S "];
	var rows = 6;
	var cols = days.length;
	var comp = document.createElement("div");
	var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	var table;
	var dey;
	var v1 = document.getElementById('xv1');
	var v2 = document.getElementById('xv2');
	var dgg = createNewTable('xdate_table', rows+1, cols, false);
	var pad = document.createElement('div');
	var df1 = document.createElement('span');
	var df2 = document.createElement('span');
	var df3 = document.createElement('span');
	var df4 = document.createElement('span');
	var center = document.createElement('div');
	var alldgg = document.createElement('table');
	alldgg.appendChild(document.createElement('tbody'));
	alldgg.tBodies[0].appendChild(document.createElement('tr'));
	alldgg.tBodies[0].appendChild(document.createElement('tr'));
	alldgg.tBodies[0].appendChild(document.createElement('tr'));
	alldgg.tBodies[0].rows[0].appendChild(document.createElement('td'));
	alldgg.tBodies[0].rows[0].appendChild(document.createElement('td'));
	alldgg.tBodies[0].rows[1].appendChild(document.createElement('td'));
	alldgg.tBodies[0].rows[1].cells[0].setAttribute('colSpan', '2');
	alldgg.tBodies[0].rows[2].appendChild(document.createElement('td'));
	alldgg.tBodies[0].rows[2].appendChild(document.createElement('td'));
	var fill = 0;
	var inst = {
		dateinstance : tempdate,
		instance : comp,
		repaint : function(){
			var orig = this.dateinstance.getDate();
			this.dateinstance.setDate(1);
			var start = this.dateinstance.getDay();
			this.dateinstance.setDate(orig);
			df1.firstChild.nextSibling.innerHTML = " &nbsp;"+months[this.dateinstance.getMonth()]+"&nbsp; ";
			df2.firstChild.nextSibling.innerHTML = " &nbsp;"+this.dateinstance.getFullYear()+"&nbsp; ";
			var tmp = new Date();
			tmp.setTime(this.dateinstance.getTime());
			tmp.setDate(0-start);
			for(var row = 0; row < rows+1; row++){
				for(var col = 0; col < cols; col++){
					if(row != 0){
						tmp.setDate(tmp.getDate()+1);
						dgg.instance.tBodies[0].rows[row].cells[col].innerHTML = "";
						dgg.instance.tBodies[0].rows[row].cells[col].style.backgroundColor = 'white';
						if(this.dateinstance.getMonth() == tmp.getMonth()){
							dgg.instance.tBodies[0].rows[row].cells[col].appendChild(document.createTextNode(""+(tmp.getDate())));
							if(this.dateinstance.getDate() == tmp.getDate()) dgg.instance.tBodies[0].rows[row].cells[col].style.backgroundColor = '#C0C0CF';
						}
					}
				}
			}
		},
		setDate : function(num){
			this.dateinstance.setDate(num);
			this.repaint();
		},
		setMonth : function(num){
			this.dateinstance.setMonth(num);
			this.repaint();
		},
		setYear : function(num){
			this.dateinstance.setFullYear(num, this.getMonth(), this.getDate());
			this.repaint();
		},
		getDate : function(){
			return this.dateinstance.getDate();
		},
		getMonth : function(){
			return this.dateinstance.getMonth();
		},
		getYear : function(){
			return this.dateinstance.getFullYear();
		}
	};
	pad.style.padding = '5px';
	comp.appendChild(pad);
	center.style.border = 'thin solid black';
	pad.appendChild(alldgg);
	alldgg.tBodies[0].rows[0].cells[0].appendChild(df1);
	alldgg.tBodies[0].rows[0].cells[0].setAttribute('valign', 'middle');
	alldgg.tBodies[0].rows[0].cells[0].setAttribute('align', 'left');
	alldgg.tBodies[0].rows[0].cells[1].appendChild(df2);
	alldgg.tBodies[0].rows[0].cells[1].setAttribute('valign', 'middle');
	alldgg.tBodies[0].rows[0].cells[1].setAttribute('align', 'right');
	alldgg.tBodies[0].rows[1].cells[0].appendChild(center);
	alldgg.tBodies[0].rows[2].cells[0].appendChild(df3);
	alldgg.tBodies[0].rows[2].cells[0].setAttribute('valign', 'middle');
	alldgg.tBodies[0].rows[2].cells[0].setAttribute('align', 'left');
	alldgg.tBodies[0].rows[2].cells[1].appendChild(df4);
	alldgg.tBodies[0].rows[2].cells[1].setAttribute('valign', 'middle');
	alldgg.tBodies[0].rows[2].cells[1].setAttribute('align', 'right');
	dgg.instance.cellSpacing = '0';
	dgg.instance.cellPadding = '2';
	dgg.instance.tBodies[0].rows[0].style.backgroundColor = '#EAEAD5';
	for(var row = 0; row < rows+1; row++){
		for(var col = 0; col < cols; col++){
			if(row == 0){
				dgg.instance.tBodies[0].rows[row].cells[col].style.textAlign = 'center';
				dgg.instance.tBodies[0].rows[row].cells[col].style.fontWeight = 'bold';
				dgg.instance.tBodies[0].rows[row].cells[col].style.fontSize = '';
				dgg.instance.tBodies[0].rows[row].cells[col].appendChild(document.createTextNode(days[col]));
			} else {
				dgg.instance.tBodies[0].rows[row].cells[col].style.fontWeight = 'bold';
				dgg.instance.tBodies[0].rows[row].cells[col].style.textAlign = 'right';
				dgg.instance.tBodies[0].rows[row].cells[col].style.fontSize = '';
				dgg.instance.tBodies[0].rows[row].cells[col].appendChild(document.createTextNode(""+(fill++)));
				dgg.instance.tBodies[0].rows[row].cells[col].onmouseover = function(){
					if(this.innerHTML && this.innerHTML.length > 0) this.style.cursor = 'pointer';
				}
				dgg.instance.tBodies[0].rows[row].cells[col].onclick = function(){
					if(this.innerHTML && this.innerHTML.length > 0) inst.setDate(parseInt(this.innerHTML));
				}
			}
		}
	}
	center.appendChild(dgg.instance);
	df1.innerHTML += '<img src=\"templates/bch/images/left-arrow.png\" border=\"0\"/>';
	df1.innerHTML += '<span> &nbsp;MONTH&nbsp; </span>';
	df1.innerHTML += '<img src=\"templates/bch/images/right-arrow.png\" border=\"0\"/>';
	df1.firstChild.onclick = function(){
		inst.setMonth((inst.getMonth()-1)%months.length);
	};
	df1.firstChild.onmouseover = function(){
		this.style.cursor = 'pointer';
	};
	df1.firstChild.nextSibling.nextSibling.onclick = function(){
		inst.setMonth((inst.getMonth()+1)%months.length);
	};
	df1.firstChild.nextSibling.nextSibling.onmouseover = function(){
		this.style.cursor = 'pointer';
	};
	df2.innerHTML += '<img src=\"templates/bch/images/left-arrow.png\" border=\"0\"/>';
	df2.innerHTML += '<span> &nbsp;YEAR&nbsp; </span>';
	df2.innerHTML += '<img src=\"templates/bch/images/right-arrow.png\" border=\"0\"/>';
	df2.firstChild.onclick = function(){
		inst.setYear(inst.getYear()-1);
	};
	df2.firstChild.onmouseover = function(){
		this.style.cursor = 'pointer';
	};
	df2.firstChild.nextSibling.nextSibling.onclick = function(){
		inst.setYear(inst.getYear()+1);
	};
	df2.firstChild.nextSibling.nextSibling.onmouseover = function(){
		this.style.cursor = 'pointer';
	};
	inst.repaint();
	return inst;
}