//this file implements stylish HTML Element to replace SELECT element
//the look can be customized by changing the associated image files
var topsel_z = 150;
var topMonths = ['January','February','March','April','May','June','July','August','September','October','November','December'];

function topSELECT(name,width,vari){
	this.name =  name;
	this.width = width;
	this.options = new Array();
	this.classOn = 'topselect_on';
	this.classOff = 'topselect_off';
	this.classItemOn = 'topselect_item_on';
	this.classItemOff = 'topselect_item_off';
	this.classBar = 'topselect_bar';
	this.selectedIndex = -1;
	this.vari = vari;
	this.onChangeCode = '';
	this.selectedBefore = -2;
	this.html = '';
	html = '';
	html += '<div id="tophtml_root_'+name+'" style="position:relative;z-index:'+topsel_z+';">';
	//generate a hidden field to store the SELECT value	
	html += '<input type=hidden id='+name+' name='+name+' value="">'; 
	//generate a visible div for this SELECT
	html += '<div id="tophtml_'+name+'" style="display:block;position:relative;width:'+width+'px;height:24px;z-index:0;">';
	html += '<table border=0 cellspacing=0 cellpadding=0 width="100%">';	
	html += '<tr><td align=left id="tophtml_cell_'+name+'" width="100%" class="'+this.classOff+'" onMouseOver="'+vari+'.styleOn();" onMouseOut="'+vari+'.styleOff();">';
	html += '<img src="/images/tophtml/arrow.gif" border=0 align=right width="16" height="24" onClick="'+vari+'.toggleSelect();"><span valign=middle id="tophtml_si_'+name+'">&nbsp;</span>';
	html += '</td></tr>';
	html += '</table>';
	html += '</div>';
	//generate an auxiliary div for this SELECT
	html += '<div id="tophtmlax_'+name+'" style="display:none;position:absolute;top:0px;left:0px;width:'+width+'px;height:24px;overflow:hidden;border:0px;background-color:#EEEEEE;z-index:'+topsel_z+';">';
	topsel_z -= 10;
	html += '</div>';
	html += '</div>';	
	this.html = html;
	
	//register methods on this select
	this.initSelect = initSelect;
	this.addOption = addOption;
	this.drawOptions = drawOptions;
	this.selectOption = selectOption;
	this.openSelect = openSelect;
	this.closeSelect = closeSelect;
	this.toggleSelect = toggleSelect;
	this.styleOn = styleOn;
	this.styleOff = styleOff;
	this.scrollUp = scrollUp;
	this.scrollDown = scrollDown;
	this.findSelectedOption = findSelectedOption;
}

function initSelect(){
	//save references to objects for future use
	var name = this.name;
	this.rootdiv = document.getElementById("tophtml_root_"+name);
	this.topdiv = document.getElementById("tophtml_"+name);
	this.auxdiv = document.getElementById("tophtmlax_"+name);
	this.topcell = document.getElementById("tophtml_cell_"+name);
	this.topfont = document.getElementById("tophtml_si_"+name);

	//adjust position of auxiliary div	
	this.auxdiv.style.top  = '24px';
	this.auxdiv.style.left = '0px';
}

function selectOption(option){
	var elem = document.getElementById(this.name);
	var display = '';
	if (option < 0 || option > this.options.length){
		this.selectedIndex = -1;
		elem.value = "";		
	}else{
		this.selectedIndex = option;
		elem.value = this.options[option][0];
		display = this.options[option][1];
	}
	//display chosen option
	this.topfont.innerHTML = display;
	//close select
	this.closeSelect();
	//execute onChange if option changed
	var bf = this.selectedBefore;
	this.selectedBefore = this.selectedIndex;
	if (this.onChangeCode != '' && bf != -2 && bf != this.selectedIndex){
		eval(this.onChangeCode);
	}
}

function addOption(value,text){
	this.options[this.options.length] = new Array(value,text);	
}

function styleOn(){
	this.topcell.className = this.classOn;
}

function styleOff(){
	this.topcell.className = this.classOff;
}

function drawOptions(){
	//define auxiliary div height based on number of options. More than 5 options scrolls
	var height = this.options.length;
	var scroll = false;
	if (height > 5) {
		height = 5;
		scroll = true;
	}
	height = height * 24 + 4;
	this.auxdiv.style.height = height+'px';
	var name = this.name;
	//draw options
	var html = '<table width="100%" cellspacing=0 cellpadding=0 style="border:2px groove #000000;">';
	if (scroll){
		html += '<tr height="24">';
		html += '<td rowspan=5 style="height:120px;">';
		html += '<div id="tophtml_scroll_'+name+'" style="width=100%;height:120px;overflow:hidden;">';
		html += '<table width="100%" border=0 cellspacing=0 cellpadding=0>';
		for(var i=0; i < this.options.length; i++){
			var value = this.options[i][0];
			var text  = this.options[i][1];
			html += '<tr height="24">';
			html += '<td id="tophtml_op_'+name+'_'+i+'" width="100%" align=left class="'+this.classItemOff+'" onMouseOver="this.className=\''+this.classItemOn+'\';" onMouseOut="this.className=\''+this.classItemOff+'\';" onClick="'+this.vari+'.selectOption('+i+');">';
			html += text;
			html += '</td>';
			html += '</tr>';
		}		
		html += '</table>';
		html += '</div>';
		html += '</td>';
		html += '<td width="16" class="'+this.classBar+'" onClick="'+this.vari+'.scrollUp();" onMouseDown="'+this.vari+'.scrollUp();"><img src="/images/tophtml/up.gif" width="16" height="24"></td>';
		html += '</tr>';
		html += '<tr height="24"><td width="16" class="'+this.classBar+'">&nbsp;</td></tr>';
		html += '<tr height="24"><td width="16" class="'+this.classBar+'">&nbsp;</td></tr>';
		html += '<tr height="24"><td width="16" class="'+this.classBar+'">&nbsp;</td></tr>';
		html += '<tr height="24"><td width="16" class="'+this.classBar+'" onClick="'+this.vari+'.scrollDown();" onMouseDown="'+this.vari+'.scrollDown();"><img src="/images/tophtml/down.gif" width="16" height="24"></td></tr>';						
	}else{
		for(var i=0; i < this.options.length; i++){
			var value = this.options[i][0];
			var text  = this.options[i][1];
			html += '<tr height="24">';
			html += '<td id="tophtml_op_'+name+'_'+i+'" width="100%" align=left class="'+this.classItemOff+'" onMouseOver="this.className=\''+this.classItemOn+'\';" onMouseOut="this.className=\''+this.classItemOff+'\';" onClick="'+this.vari+'.selectOption('+i+');">';
			html += text;
			html += '</td>';
			html += '</tr>';
		}
	}
	html += '</table>'; 
	this.auxdiv.innerHTML = html;	
}

function openSelect(){
	//set all to class Off except current one
	var name = this.name;
	for (var i = 0; i < this.options.length; i++){
		var el = document.getElementById("tophtml_op_"+name+"_"+i);
		el.className = this.classItemOff;
	}
	this.auxdiv.style.display = 'block';
}

function closeSelect(){
	this.auxdiv.style.display = 'none';
}

function toggleSelect(){
	if (this.auxdiv.style.display == 'block')
		this.closeSelect();
	else
		this.openSelect();
}

function scrollUp(){
	var scroll = document.getElementById("tophtml_scroll_"+this.name);
	scroll.scrollTop -= 24;
}

function scrollDown(){
	var scroll = document.getElementById("tophtml_scroll_"+this.name);
	scroll.scrollTop += 24;
}

function findSelectedOption(optvalue){
	this.selectedIndex = -1;
	for(var i=0; i < this.options.length; i++){
		if (this.options[i][0] == optvalue){
			this.selectOption(i);
			break;
		}
	}
}

var toppick_z = 200;

function topPICKER(name,width,height,boxtitle,top,left,vari){
	this.name = name;
	this.vari = vari;
	this.width = width;
	this.height = height;
	this.boxtitle = boxtitle;
	this.imagebox = 55;
	this.pics = new Array();
	this.selectedPicture = -1;
	this.left = left;
	this.top  = top;
	this.scrollTimeout = false;
	this.onClickCode = 'return true;';
	var bodyheight = height-30;
	var scrollerwidth = this.width-60;
	var titlewidth = this.width-64;
	var html = '<div id="toppicker_'+this.name+'" style="display:none;width:'+width+'px;height:'+height+'px;position:absolute;top:'+top+'px;left:'+left+'px;z-index:'+toppick_z+';">';
	html    += '<table width="100%" border=0 cellspacing=0 cellpadding=0>';
	html    += '<tr height="30">';
	html    += '<td width="20"><img src="/images/tophtml/corner_left.gif" width="20" height="30" border=0></td>';
	html    += '<td width="'+titlewidth+'" class="tophtml_title" align=center>'+this.boxtitle+'</td>';
	html    += '<td width="24" class="tophtml_title" valign=middle><img src="/images/tophtml/close.gif" width=24 height=24 border=0 onClick="'+vari+'.closePicker();"></td>';
	html    += '<td width="20"><img src="/images/tophtml/corner_right.gif" width="20" height="30" border=0></td>';	
	html    += '</tr>';
	html    += '<tr height='+bodyheight+'>';
	html    += '<td colspan=4 width="100%" valign=middle class="tophtml_content">';
	html    += '<table width="100%" border=0 cellspacing=0 cellpadding=0>';
	html    += '<tr>';
	html    += '<td width="30" align=center valign=middle><img src="/images/tophtml/left.gif" width="24" height="24" onMouseOver="'+vari+'.startScrollingLeft();" onMouseOut="'+vari+'.stopScrolling();"></td>';
	html    += '<td width="'+scrollerwidth+'" valign=middle>';
	html    += '<div id="toppicker_scroll_'+name+'" valign=middle style="width:'+scrollerwidth+'px;vertical-align:50%;overflow:hidden;z-index:'+toppick_z+'">';
	html    += '</div>';
	html    += '</td>';
	html    += '<td width="30" align=center valign=middle><img src="/images/tophtml/right.gif" width="24" height="24" onMouseOver="'+vari+'.startScrollingRight();" onMouseOut="'+vari+'.stopScrolling();"></td>';
	html    += '</tr>';
	html    += '</table>';
	html    += '</td>';
	html    += '</tr>';
	html    += '</tr>';
	html    += '</table>';
	html    += '</div>\n';
	this.html = html;
	toppick_z++;		
	//methods
	this.initPicker = initPicker;
	this.drawPicker = drawPicker;	
	this.scrollLeft = scrollLeft;
	this.closePicker  = closePicker;
	this.scrollRight = scrollRight;	
	this.addPicture  = addPicture;
	this.openPicker  = openPicker;
	this.startScrollingLeft = startScrollingLeft;
	this.startScrollingRight = startScrollingRight;
	this.stopScrolling = stopScrolling;
}

function initPicker(){
	this.scrolldiv = document.getElementById("toppicker_scroll_"+this.name);
	this.rootdiv   = document.getElementById("toppicker_"+this.name);
}

function scrollLeft(){
	this.scrolldiv.scrollLeft -= 25;	
}

function scrollRight(){
	this.scrolldiv.scrollLeft += 25;
}

function drawPicker(){
	//draws the pic boxes inside the scrollable div
	var cellwidth = this.imagebox + 6;
	var html = '<table border=0 cellspacing=5 cellpadding=0><tr>';
	for (var i=0 ; i < this.pics.length; i++){
		html += '<td valign=middle class="toppicker_off" onMouseOver="this.className=\'toppicker_on\';" onMouseOut="this.className=\'toppicker_off\';" width="'+cellwidth+'" align=center><img src="'+this.pics[i]+'" style="border:1px solid #000000;" width='+this.imagebox+' height='+this.imagebox+' onClick="'+this.onClickCode+'"></td>';
	}
	html += '</tr></table>';
	this.scrolldiv.innerHTML = html;
}

function addPicture(url){
	this.pics[this.pics.length] = url;
}

function openPicker(){
	this.rootdiv.style.display = 'block';
}

function closePicker(){
	this.rootdiv.style.display = 'none';
}

function startScrollingRight(){
	this.scrollRight();
	this.scrollTimeout = setTimeout(this.vari+'.startScrollingRight()',100);
}

function startScrollingLeft(){
	this.scrollLeft();
	this.scrollTimeout = setTimeout(this.vari+'.startScrollingLeft()',100);
}

function stopScrolling(){
	if (this.scrollTimeout){
		clearTimeout(this.scrollTimeout);
		this.scrollTimeout = false;
	}
}

function topCHECKBOX(name,valueYes,valueNo,checked,vari){
	this.name = name;
	this.valueYes = valueYes;
	this.valueNo = valueNo;
	this.checked = checked;
	this.vari = vari;
	this.onImage = '/images/tophtml/on.gif';
	this.offImage = '/images/tophtml/off.gif';
	this.html = '<img id="img_'+name+'" name="img_'+name+'" src="';
	if (this.checked)
		this.html += this.onImage;
	else
		this.html += this.offImage;
	this.html += '" width=24 height=24 border=0 style="vertical-align:middle;" onClick="'+this.vari+'.toggleCheckbox();"><input type=hidden id="'+this.name+'" name="'+this.name+'" value="';
	if (this.checked)
		this.html += this.valueYes;
	else
		this.html += this.valueNo;
	this.html += '">';
	
	//register methods
	this.toggleCheckbox = toggleTopCheckbox;
	this.setCheckboxStatus = setTopCheckboxStatus;
	this.getValue = getTopCheckboxValue;
}

function toggleTopCheckbox(){
	var img = document.getElementById("img_"+this.name);
	var ctl = document.getElementById(this.name);
	if (this.checked){
		this.checked = false;
		img.src = this.offImage;
		ctl.value = this.valueNo;
	}else{
		this.checked = true;
		img.src = this.onImage;
		ctl.value = this.valueYes;
	}
	return true;
}

function setTopCheckboxStatus(st){
	var img = document.getElementById("img_"+this.name);
	var ctl = document.getElementById(this.name);
	if (! st){
		this.checked = false;
		img.src = this.offImage;
		ctl.value = this.valueNo;
	}else{
		this.checked = true;
		img.src = this.onImage;
		ctl.value = this.valueYes;
	}
	return true;
}

function getTopCheckboxValue(){
	var ctl = document.getElementById(this.name);
	return ctl.value;	
}

function topCALENDAR(name,vari,format,varname){
	this.name     = name;
	this.variable = vari;
	this.format   = format;
	this.html     = '';
	this.varname  = varname;
	this.currdate = new Date().getTime();
	this.dates    = new Array();
			
	var html = '<iframe id=tcalf_'+name+'  style="position:absolute;top:0;left:0;display:none;width:175px;height:160;border:1px solid #000000;background-color:#EEEEEE;z-index:250;"></iframe>\n';
	html += '<div id=tcal_'+name+' style="position:absolute;top:0;left:0;display:none;width:175px;height:160;border:1px solid #000000;background-color:#EEEEEE;z-index:251;">\n';
	html += '<table width="100%" align=center border=0 cellspacing=0 cellpadding=0>\n';
	html += '<tr><td colspan=5 width="175" align=right><a href="#" onClick="return '+varname+'.hide();"><img src="/images/tophtml/close.gif" border=0 width=24 height=24></a></td></tr>\n';
	html += '<tr>\n';
	html += ' <td width="20" align=left class="tophtml_bold"><a href="#" onClick="return '+varname+'.backYear();" class="tophtml_bold">&laquo;</a></td>\n';
	html += ' <td width="20" align=left class="tophtml_bold"><a href="#" onClick="return '+varname+'.backMonth();"  class="tophtml_bold">&lsaquo;</a></td>\n';
	html += ' <td width="95" align=center class="tophtml_smallbold" id="tcalmonthname_'+name+'">Month Name</td>\n';
	html += ' <td width="20" align=right class="tophtml_bold"><a href="#" onClick="return '+varname+'.fwdMonth();"  class="tophtml_bold">&rsaquo;</a></td>\n';
	html += ' <td width="20" align=right class="tophtml_bold"><a href="#" onClick="return '+varname+'.fwdYear();"  class="tophtml_bold">&raquo;</a></td>\n';
	html += '</tr>\n';
	html += '</table>\n';
	html += '<table width="100%" align=center border=0 cellspacing=1 cellpadding=0>\n';
	html += '<tr bgcolor="#E0E0E0;">\n';
	html += '<td width="25" class="tophtml_smallbold">Su</td>\n';	
	html += '<td width="25" class="tophtml_smallbold">Mo</td>\n';
	html += '<td width="25" class="tophtml_smallbold">Tu</td>\n';	
	html += '<td width="25" class="tophtml_smallbold">We</td>\n';	
	html += '<td width="25" class="tophtml_smallbold">Th</td>\n';	
	html += '<td width="25" class="tophtml_smallbold">Fr</td>\n';	
	html += '<td width="25" class="tophtml_smallbold">Sa</td>\n';	
	html += '</tr>\n';
	for (var week=1; week <= 6 ; week++){
		html += '<tr>\n';
		for (var day=1; day <= 7 ; day++){
			var cl = day == 1 ? 'tophtml_smallred' : "tophtml_small";
			html += '<td id="tcalcell_'+name+'_'+week+'_'+day+'" class="'+cl+'" align=center onClick="'+varname+'.selectValue('+week+','+day+');" onMouseOver="this.className=\'tophtml_calover\';" onMouseOut="this.className=\''+cl+'\'";>&nbsp;</td>\n';
		}
		html += '</tr>\n';
	}
	html += '</table>\n';
	html += '</div>\n';
	
	this.html = html;
	
	this.setDate = THCalendarSetDate;
	this.backYear = THCalendarBackYear;
	this.backMonth= THCalendarBackMonth;
	this.fwdMonth = THCalendarFwdMonth;
	this.fwdYear  = THCalendarFwdYear;
	this.draw     = THCalendarDraw;
	this.getValue = THCalendarGetValue;
	this.position = THCalendarPosition;
	this.activate = THCalendarActivate;
	this.hide     = THCalendarHide;
	this.selectValue = THCalendarSelectValue;
	this.getWithFormat = THCalendarGetWithFormat;
}

function THCalendarSetDate(dt){
	this.currdate = dt;
	this.draw();
}

function THCalendarBackYear(){
	var dobj      = new Date(this.currdate);
	var currMonth = dobj.getMonth();
	var currDay   = dobj.getDate();
	
	//go back until it is same month and day in previous year
	dobj.setTime(dobj.getTime() - 60*60*24*1000);
	while (dobj.getMonth() != currMonth || dobj.getDate() != currDay){
		dobj.setTime(dobj.getTime() - 60*60*24*1000);
	}
	this.currdate = dobj.getTime();
	this.draw();
	return false;
}

function THCalendarBackMonth(){
	var dobj      = new Date(this.currdate);
	var currDay   = dobj.getDate();
	var currMon	  = dobj.getMonth();
	var prevMon   = -1;
		
	//go back until it is same day in previous month
	dobj.setTime(dobj.getTime() - 60*60*24*1000);
	while (dobj.getDate() != currDay){
		if (dobj.getMonth() != currMon && prevMon == -1){
			prevMon = dobj.getMonth();
		}
		if (prevMon > -1 && dobj.getMonth() < prevMon){
			//same day does not exist in previous month
			//go for last day in prev month
			while (dobj.getMonth() < prevMon){
				dobj.setTime(dobj.getTime() + 60*60*24*1000);
			}
			break;
		}
		dobj.setTime(dobj.getTime() - 60*60*24*1000);
	}
	this.currdate = dobj.getTime();
	this.draw();
	return false;
}

function THCalendarFwdYear(){
	var dobj      = new Date(this.currdate);
	var currMonth = dobj.getMonth();
	var currDay   = dobj.getDate();
	
	//go forward until it is same month and day in next year
	dobj.setTime(dobj.getTime() + 60*60*24*1000);
	while (dobj.getMonth() != currMonth || dobj.getDate() != currDay){
		dobj.setTime(dobj.getTime() + 60*60*24*1000);
	}
	this.currdate = dobj.getTime();
	this.draw();
	return false;
}

function THCalendarFwdMonth(){
	var dobj      = new Date(this.currdate);
	var currDay   = dobj.getDate();
	var currMon   = dobj.getMonth();
	var nextMon   = -1;
	
	//go forward until it is same day in next month (or last day in next month if same day not available)
	dobj.setTime(dobj.getTime() + 60*60*24*1000);
	while (dobj.getDate() != currDay){
		if (dobj.getMonth() != currMon && nextMon == -1){
			nextMon = dobj.getMonth();
		}
		if (nextMon > -1 && dobj.getMonth() > nextMon){
			//same day does not exist in next month
			//go for last day in next month
			while (dobj.getMonth() > nextMon){
				dobj.setTime(dobj.getTime() - 60*60*24*1000);
			}
			break;
		}
		dobj.setTime(dobj.getTime() + 60*60*24*1000);
	}
	this.currdate = dobj.getTime();
	this.draw();
	return false;
}

function THCalendarGetValue(){
	var dobj      = new Date(this.currdate);
	var yr = dobj.getFullYear();
	var mn = dobj.getMonth()+1;
	var dy = dobj.getDate();
	
	var retval = this.format;
		
	mnstr = mn < 10 ? '0'+mn.toString() : mn.toString();
	dystr = dy < 10 ? '0'+dy.toString() : dy.toString();
	yrstr = yr.toString();
	
	retval = retval.replace(/y/i,yrstr);
	retval = retval.replace(/m/i,mnstr);
	retval = retval.replace(/d/i,dystr);
	
	return retval;	
}

function THCalendarDraw(){
	this.dates.length = 0;	
	var dtobj = new Date(this.currdate);
	var month = dtobj.getMonth();
	//find month name and display it
	var mname = topMonths[dtobj.getMonth()] + ' ' + dtobj.getFullYear().toString();
	var cell  = document.getElementById("tcalmonthname_"+this.name);
	cell.innerHTML = mname;
	//find date to display in first cell	
	while (dtobj.getDate() > 1){
		dtobj.setTime(dtobj.getTime()-60*60*24*1000);
	}
	var weekday = dtobj.getDay();
	while (weekday > 0){
		dtobj.setTime(dtobj.getTime()-60*60*24*1000);
		weekday = dtobj.getDay();
	}
	//date corresponding to each cell		
	for (var week=1 ; week <= 6 ; week++){
		this.dates[week] = new Array();
		for (var day=1; day <= 7 ; day ++){
			var cell = document.getElementById("tcalcell_"+this.name+"_"+week+"_"+day);		
			if (dtobj.getMonth() == month){
				this.dates[week][day] = dtobj.getTime();
				//display the date
				cell.innerHTML = dtobj.getDate().toString();
			}else{
				this.dates[week][day] = 0;
				cell.innerHTML = '&nbsp;';
			}
			//advance
			dtobj.setTime(dtobj.getTime() + 60*60*24*1000);
		}
	}
}

function THCalendarPosition(){
	//get position of associated variable
	var obj = document.getElementById(this.variable);

	var curleft = curtop = 0;
	var margleft = margtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		margleft = obj.style.marginLeft;
		margtop  = obj.style.marginTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
			margleft += obj.style.marginLeft;
			margtop += obj.style.marginTop;
		}
	}
		
	//move calendar to that position
	var calfra = document.getElementById("tcalf_"+this.name);
	var caldiv = document.getElementById("tcal_"+this.name);

	calfra.style.top = curtop;
	calfra.style.left= curleft;
	caldiv.style.top = curtop;
	caldiv.style.left= curleft;
	calfra.style.marginTop = margtop;
	calfra.style.marginLeft = margleft;
	caldiv.style.marginTop = margtop;
	caldiv.style.marginLeft = margleft;
}

function THCalendarActivate(){
	this.position();
	this.draw();
	document.getElementById("tcalf_"+this.name).style.display = 'block';
	document.getElementById("tcal_"+this.name).style.display  = 'block';
	return false;
}

function THCalendarHide(){
	document.getElementById("tcalf_"+this.name).style.display = 'none';
	document.getElementById("tcal_"+this.name).style.display  = 'none';
	return false;
}

function THCalendarSelectValue(week,day){
	var clicked = this.dates[week][day];
	if (clicked > 0){
		this.currdate = clicked;
		var vl = this.getValue();
		document.getElementById(this.variable).value = vl;
		this.hide();
		return false;
	}else{
		return false;
	}
}

function THCalendarGetWithFormat(format){
	var dobj      = new Date(this.currdate);
	var yr = dobj.getFullYear();
	var mn = dobj.getMonth()+1;
	var dy = dobj.getDate();
	
	var retval = format;
		
	mnstr = mn < 10 ? '0'+mn.toString() : mn.toString();
	dystr = dy < 10 ? '0'+dy.toString() : dy.toString();
	yrstr = yr.toString();
	
	retval = retval.replace(/y/i,yrstr);
	retval = retval.replace(/m/i,mnstr);
	retval = retval.replace(/d/i,dystr);
	
	return retval;	
}

function topDATERANGE(name,varname){
	this.name     = name;
	this.firstDate= 0;
	this.lastDate = 0;
	this.minDate  = 0;
	this.maxDate  = 0;
	this.numMonths= 2;
	this.weekspermonth = 6;
	this.html     = '';
	this.varname  = varname;
	this.currdate = 0;
	this.mode     = 'C';	//C calendar D days
	this.firstshow= 0;
	this.firstDateBox = '';
	this.lastDateBox = '';
	this.onlyFirstDate = 0;			
	this.onlyFirstDateCurr = new Array();
			
	var html = '';
	html += '<table width="98%" align=center border=0 cellspacing=0 cellpadding=0 id="tdrangemain_'+this.name+'">\n';
	html += '<tr height="180"><td width="30" valign=middle><a href="#" onClick="return '+this.varname+'.back();"><img src="/images/calendar/cal_prev.gif" width="18" height="14" border=0></a></td>\n';
	html += '<td id="tdrange_'+this.name+'" valign=middle>&nbsp;</td>\n';
	html += '<td width="30" valign=middle><a href="#" onClick="return '+this.varname+'.fwd();"><img src="/images/calendar/cal_next.gif" width="18" height="14" border=0></a></td>\n';	
	html += '</tr>\n';
	html += '</table>\n';

	this.html = html;
	
	this.back    = TDRangeBack;
	this.fwd     = TDRangeFwd;
	this.draw     = TDRangeDraw;
	this.setDate = TDRangeSetDate;
	this.mouseOver = TDRangeMouseOver;
	this.mouseOut = TDRangeMouseOut;
	this.hide	 = TDRangeHide;
	this.show    = TDRangeShow;
}

function TDRangeBack(){
	//go back 
	if (this.mode == 'C'){
		var dt = new Date(this.currdate);
		var mon= dt.getMonth();
		while (dt.getMonth() == mon){
			dt.setTime(dt.getTime()-60*60*24*5*1000);
		}
		if (this.minDate > 0){
			var md   = this.minDate.toString();
			var mind = new Date(md.substr(0,4)-0,md.substr(4,2)-1,md.substr(6,2)-0,5);
			if (dt.getFullYear().toString() + (dt.getMonth()+1).toString() >= mind.getFullYear().toString() + (mind.getMonth()+1).toString()){
				this.currdate = dt.getTime();
				this.draw();
			}
		}else{
			this.currdate = dt.getTime();
			this.draw();
		}
	}else{
		var nfirst = this.firstshow - (7 * this.weekspermonth);
		if (nfirst > 0 && nfirst >= this.minDate){
			this.firstshow = nfirst;
			this.draw();
		}
	}
	return false;
}

function TDRangeFwd(){
	//go forward
	if (this.mode == 'C'){
		var dt = new Date(this.currdate);
		var mon= dt.getMonth();
		while (dt.getMonth() == mon){
			dt.setTime(dt.getTime()+60*60*24*5*1000);
		}
		if (this.maxDate > 0){
			var md = this.maxDate.toString();
			var maxd = new Date(md.substr(0,4)-0,md.substr(4,2)-1,md.substr(6,2)-0);
			if (dt.getFullYear().toString() + (dt.getMonth()+1).toString() <= maxd.getFullYear().toString() + (maxd.getMonth()+1).toString()){
				this.currdate = dt.getTime();
				this.draw();
			}
		}else{
			this.currdate = dt.getTime();
			this.draw();
		}
	}else{
		var nfirst = this.firstshow + (7 * this.weekspermonth);
		if (nfirst > 0 && nfirst <= this.maxDate){
			this.firstshow = nfirst;
			this.draw();
		}
	}
	return false;
}

function TDRangeDraw(){
	if (this.mode == 'D' && this.firstshow == 0)
		this.firstshow = 1;
	var html = '';
	html += '<table border=0 cellspacing=3 align=center><tr>\n';
	if (this.mode == 'C'){
		//define first day to show based on current date
		var dt = new Date(this.currdate);
		var mon= dt.getMonth();
		var yea= dt.getFullYear();
		while (dt.getDate() > 1){
			dt.setTime(dt.getTime() - 60*60*24*1000);
		}		
		//dt has first of month, now go back until we find day zero
		while (dt.getDay() > 0){
			dt.setTime(dt.getTime() - 60*60*24*1000);
		}
	}
	for(var i=1; i <= this.numMonths ; i++){
		if (this.mode == 'C'){
			mname = topMonths[mon] + ' ' + yea;
		}else{
			var fw = (i-1) * this.weekspermonth + Math.ceil((this.firstshow) / 7);
			var lw = fw + this.weekspermonth - 1;
			mname = 'Week ' + fw.toString() + ' - Week ' + lw.toString();
		}
		if (this.mode == 'C' && i > 1){
			mon++;
			if (mon > 11) mon = 0;
			//adjust dt so getDay equals zero (sunday)
			while (dt.getDay() > 0){
				dt.setTime(dt.getTime() - 60*60*24*1000);
			}
		}
		html += '<td width="175">\n';
		html += '<div align=center><b>'+mname+'</b></div>\n';
		html += '<table width="100%" align=center border=0 cellspacing=1 cellpadding=0>\n';
		html += '<tr bgcolor="#E0E0E0;">\n';
		html += '<td width="25" class="tophtml_smallbold">Su</td>\n';	
		html += '<td width="25" class="tophtml_smallbold">Mo</td>\n';
		html += '<td width="25" class="tophtml_smallbold">Tu</td>\n';	
		html += '<td width="25" class="tophtml_smallbold">We</td>\n';	
		html += '<td width="25" class="tophtml_smallbold">Th</td>\n';	
		html += '<td width="25" class="tophtml_smallbold">Fr</td>\n';	
		html += '<td width="25" class="tophtml_smallbold">Sa</td>\n';	
		html += '</tr>\n';
		for (var week=1; week <= this.weekspermonth ; week++){
			html += '<tr>\n';
			for (var day=1; day <= 7 ; day++){
				if (this.mode == 'C'){
					var cl = dt.getDay() == 0 ? 'tophtml_smallred' : "tophtml_small";
					var m  = (dt.getMonth()+1).toString();
					if (m.length == 1) m = '0' + m;
					var d = dt.getDate().toString();
					if (d.length == 1) d = '0' + d;
					var dval = dt.getFullYear().toString() + m + d;	
					var dshow = dt.getDate();
					if ((this.minDate > 0 && dval-0 < this.minDate) || (this.maxDate > 0 && dval-0 > this.maxDate)){
						dshow = '&nbsp;';
					}
				}else{
					var cl = day == 1 ? 'tophtml_smallred' : "tophtml_small";
					var dval = (this.firstshow - 1) + (i-1) * (this.weekspermonth * 7) + (week-1)*7 + day;
					var dshow = dval;
					if (dval > this.maxDate || dval < this.minDate){
						dshow = '&nbsp;';
					}
				}

				html += '<td id="trngcell_'+i.toString()+'_'+this.name+'_'+week.toString()+'_'+day.toString()+'" class="'+cl+'" dval="'+dval+'" align=center onClick="'+this.varname+'.setDate('+i+','+week+','+day+');" ';
				if (dshow != '&nbsp;'){
					html += 'onMouseOver="'+this.varname+'.mouseOver(this,'+i+','+week+','+day+');" cl="'+cl+'" onMouseOut="'+this.varname+'.mouseOut(this);" ';				
				}
				html += '>'+dshow+'</td>\n';
				if (this.mode == 'C')
					dt.setTime(dt.getTime()+60*60*24*1000);
			}
			html += '</tr>\n';
		}
		html += '</table>\n';		
		html += '</td>\n';
	}
	html += '</tr></table>\n';	
	var container = document.getElementById("tdrange_"+this.name);
	container.innerHTML = html;
	if (this.firstDate > 0){
		for (var p=1; p <= this.numMonths ; p++){
			for (var w=1; w <= this.weekspermonth; w++){
				for (var d=1; d <= 7 ; d++){
					var cell = document.getElementById('trngcell_'+p+'_'+this.name+'_'+w+'_'+d);
					if (cell.dval-0 < this.firstDate || cell.dval-0 > this.lastDate)
						cell.className = 'tophtml_small';
					else
						cell.className = 'tophtml_calover';
				}
			}
		}
	}
}

function TDRangeSetDate(panel,week,day){
	var obj = document.getElementById('trngcell_'+panel+'_'+this.name+'_'+week+'_'+day);
	if (this.firstDate == 0 || this.onlyFirstDate == 1){
		//sets first date
		this.firstDate = obj.dval-0;
		if (this.firstDateBox != ''){
			var box = document.getElementById(this.firstDateBox);
			if (this.mode == 'C'){
				var av = obj.dval;
				box.value = av.substr(4,2) + '/' + av.substr(6,2) + '/' + av.substr(0,4);
			}else{
				box.value = obj.dval;
			}
		}
		if (this.onlyFirstDate == 1){
			if (this.onlyFirstDateCurr.length > 0){
				var prevID = 'trngcell_'+this.onlyFirstDateCurr[0].toString()+'_'+this.name+'_'+
							  this.onlyFirstDateCurr[1].toString()+'_'+this.onlyFirstDateCurr[2].toString();
				var prevObj = document.getElementById(prevID);
				this.mouseOut(prevObj);
			}
			this.onlyFirstDateCurr[0] = panel;
			this.onlyFirstDateCurr[1] = week;
			this.onlyFirstDateCurr[2] = day;
		}
	}else if (this.firstDate == obj.dval){
		//frees first date
		this.firstDate = 0;
		if (this.firstDateBox != ''){
			var box = document.getElementById(this.firstDateBox);
			box.value = '';	
		}
	}else if (this.lastDate == obj.dval){
		//frees last date
		this.lastDate = 0;
		if (this.lastDateBox != ''){
			var box = document.getElementById(this.lastDateBox);
			box.value = '';
		}
	}else if (obj.dval-0 > this.firstDate){
		this.lastDate = 0;
		this.mouseOver(obj,panel,week,day);		
		this.lastDate = obj.dval-0;
		if (this.lastDateBox != ''){
			var box = document.getElementById(this.lastDateBox);
			if (this.mode == 'C'){
				var av = obj.dval;
				box.value = av.substr(4,2) + '/' + av.substr(6,2) + '/' + av.substr(0,4);
			}else{
				box.value = obj.dval;
			}
		}
		this.mouseOver(obj,panel,week,day);		
	}
}

function TDRangeMouseOver(obj,panel,week,day){
	if (this.firstDate == 0 || this.onlyFirstDate == 1){
		obj.className = 'tophtml_calover';
	}else if (this.firstDate > 0 && this.lastDate > 0){
		//nothing, things should already be marked
	}else {
		//highlight all from first date to current cell (or last date if set and smaller than current)
		var mx = obj.dval;
		if (this.lastDate > 0 && this.lastDate < mx)
			mx = this.lastDate;
		for (var p=1; p <= this.numMonths ; p++){
			for (var w=1; w <= this.weekspermonth; w++){
				for (var d=1; d <= 7 ; d++){
					var cell = document.getElementById('trngcell_'+p+'_'+this.name+'_'+w+'_'+d);
					if (cell.dval-0 < this.firstDate)
						continue;
					else if (cell.dval-0 <= mx)
						cell.className = 'tophtml_calover';
					else
						cell.className = cell.cl;
				}
			}
		}
	}
}

function TDRangeMouseOut(obj){
	if (this.firstDate == 0 || this.onlyFirstDate == 1){
		if (this.onlyFirstDate == 1 && this.firstDate == obj.dval-0)
			obj.className = 'tophtml_calover';
		else
			obj.className = obj.cl;
	}
}


function TDRangeHide(){
	document.getElementById("tdrangemain_"+this.name).style.display = 'none';
}

function TDRangeShow(){
	document.getElementById("tdrangemain_"+this.name).style.display = 'block';
}
