
// modify: Benny Riadi <benny@intuisi.com>;<boss@intuisi.com>
// Notes: You can modify what ever you want

var cal_ctn;
var org_str;
var container_id;

function simpleCal(obj_name,cur_date,evt) {
	var arr_months = ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"];
	var week_days = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
	var n_weekstart = 1; // day week starts from (normally 0 or 1)
	var today_date = new Date();
	
	// create date time obj;
	var dt_datetime = (cur_date == null || cur_date =="" ?  new Date() : str2dt(cur_date));
	
	var dt_prev_month = new Date(dt_datetime);
	dt_prev_month.setMonth(dt_datetime.getMonth()-1);
	var dt_next_month = new Date(dt_datetime);
	dt_next_month.setMonth(dt_datetime.getMonth()+1);
	var dt_firstday = new Date(dt_datetime);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
	var dt_lastday = new Date(dt_next_month);
	dt_lastday.setDate(0);
	
	// print calendar header
	var str_buffer = new String (
		'<style type="text/css">#caltable a{display:block} #caltable a:hover{font-weight:bold} #caltable td,#caltable th {font-family:Arial; font-size:8.5pt}</style>'+
		'<table border="1" id="caltable" cellspacing="0" bgcolor="FFFFFF" bordercolor="#a7a7a7" cellpadding="5" style="border-collapse:collapse">'+
		'<tr><td><a href="javascript:simpleCal(\''+obj_name+'\', \''+ dt2dtstr(dt_prev_month)+'\')" id="nxt"><b>&#9668</b></a></td>'+
		'<th colspan="5" align="center">'+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</th>"+
		'<td align="right"><a href="javascript:simpleCal(\''+obj_name+'\', \''+ dt2dtstr(dt_next_month)+'\')" id="prv"><b>&#9658</b></a>'+
		'</td></tr>'
	);

	var dt_current_day = new Date(dt_firstday);
	// print weekdays titles
	str_buffer += '<tr  style="background:#b5b5b5">';
	for (var n=0; n<7; n++){
		str_buffer += '	<th>'+week_days[(n_weekstart+n)%7]+'</th>';
	}
	// print calendar table
	str_buffer += '</tr>';
	while (dt_current_day.getMonth() == dt_datetime.getMonth() || dt_current_day.getMonth() == dt_firstday.getMonth()) 
	{
		// print row heder
		str_buffer += '<tr>\n';
		var bg=''; // default bg color;
		var fnt=''; // default font color;
		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
				if (dt_current_day.getDate() == today_date.getDate() && dt_current_day.getMonth() == today_date.getMonth())
				{
					// current date color
					bg='style="border:#ff0000 1px solid;background:#ffff99"';
				}
				else if (dt_current_day.getMonth() != dt_datetime.getMonth())
				{
					// different month color
					bg='bgcolor="#DDDDDD"';
				}
				else
				{
					// print working days of current month
					bg='bgcolor="#FFFFFF"';
				}
				if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
				{
					// weekend days color
					fnt=' style="color:#ff0000"';
				}
					// print days of other months
				str_buffer += '<td '+bg+'><a href="javascript:inDate(\''+obj_name+'\',\''+dt2dtstr(dt_current_day)+'\')"'+fnt+'>'+dt_current_day.getDate()+'</a></td>';
				dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		// print row footer
		str_buffer += '</tr>';
	}
		str_buffer += '</table>';
		
		new_container=obj_name+'_cal';

		if(container_id!=new_container && container_id){
			// close old calendar
			document.getElementById(container_id).style.visibility='hidden';
		}
		container_id=new_container;
		
		if(evt && !document.getElementById(container_id)){
			var obj_ln=evt.target || evt.srcElement;
			cal_ctn=obj_ln.id;
			//cal_ctn.push(obj_ln);
			var obj_prn=obj_ln.parentElement || obj_ln.parentNode;

			var str_buffer='<div id="'+container_id+'" style="position:absolute;z-index:99;visibility:visible;clear:both">'+str_buffer+'</div>';
			org_str=obj_prn.innerHTML;
			obj_prn.innerHTML=org_str+str_buffer;
		}
		else{
			obj_cntr=document.getElementById(container_id);	
			obj_cntr.innerHTML=str_buffer;
			obj_cntr.style.visibility='visible';
		}

}

// datetime parsing and formatting routimes. modify them if you wish other datetime format
function str2dt (str_datetime) {
	var re_date = /^(\d+)\-(\d+)\-(\d+)$/;
	if (!re_date.exec(str_datetime)){
		return alert("This Datetime format: \" [ "+ str_datetime+" ] \" is invalid \n Please correct it or CLEAR the field");
	}
	return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1, RegExp.$4, RegExp.$5));
}
function dt2dtstr (dt_datetime) {
	return (new String (dt_datetime.getDate()+"-"+(dt_datetime.getMonth()+1)+"-"+dt_datetime.getFullYear()));
}
function dt2tmstr (dt_datetime) {
	return (new String (dt_datetime.getHours()+":"+dt_datetime.getMinutes()));
}
function inDate(obj_name,val){
	var obj_target=document.all[obj_name];
	obj_target.value=val;
	document.getElementById(container_id).style.visibility='hidden';
}

document.onclick=hideCal;

function hideCal(e){
	if(container_id){
		var target = (e && e.target) || (event && event.srcElement); 
		if(target.id!=cal_ctn){
			var obj_cntr=document.getElementById(container_id);
			obj_cntr.style.visibility='hidden';
		}
	}
}