var monthName=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
var monthName2=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"];
var monthName3=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];
var monthName4=["JaN","FeB","MaR","ApR","MaY","JuN","JuL","AuG","SeP","OcT","NoV","DeC"];
var monthName5=["JAn","FEb","MAr","APr","MAy","JUn","JUl","AUg","SEp","OCt","NOv","DEc"];
var monthName6=["jAN","fEB","mAR","aPR","mAY","jUN","jUL","aUG","sEP","oCT","nOV","dEC"];
var cursor={x:0,y:0};

function show_calendar(str_target,str_datetime,defaulttime,languageCd){
	var arr_months=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"];
	var week_days=["日","一","二","三","四","五","六"];
	var n_weekstart=1; // day week starts from(normally 0 or 1)
	var dt_datetime;

	if(checkValidateDateFormat(str_datetime)==false){

		if(checkValidateDateFormat(defaulttime)==false){
	 		dt_datetime=new Date();
	 	}else{
	 		dt_datetime= str2dt(defaulttime);
	 	}
	}else{
		//valid format
		dt_datetime=str2dt(str_datetime);
	}

	var dt_prev_month=new Date(dt_datetime);
	dt_prev_month.setDate(1);
	dt_prev_month.setMonth(dt_datetime.getMonth()-1);
	var dt_next_month=new Date(dt_datetime);
	dt_next_month.setDate(1);
	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);

	// html generation(feel free to tune it for your particular application)
	// print calendar header
	//onBlur=\"window.close()\"
	var str_buffer=new String(
		"<html>\n"+
		"<head>\n"+
		"<title>Calendar</title>\n"+
		"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" +
		"</head>\n"+
		"<body bgcolor=\"White\">\n"+
		"<table class=\"clsOTable\" cellspacing=\"0\" border=\"0\" width=\"200\">\n"+
		"<tr><td bgcolor=\"#4682B4\">\n"+
		"<table cellspacing=\"1\" cellpadding=\"3\" border=\"0\" width=\"200\">\n"+
		"<tr>\n	<td bgcolor=\"#4682B4\"><a href=\"javascript:window.opener.show_calendar('"+
		str_target+"','"+ dt2dtstr(dt_prev_month)+"'"+",'"+languageCd+"');\">"+
		"<img src=\"media/image/common/calendar/prev.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"previous month\"></a></td>\n"+
		"	<td bgcolor=\"#4682B4\" colspan=\"5\">"+
		"<font color=\"white\" face=\"tahoma,verdana\" size=\"2\">"
		+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</font></td>\n"+
		"	<td bgcolor=\"#4682B4\" align=\"right\"><a href=\"javascript:window.opener.show_calendar('"
		+str_target+"','"+dt2dtstr(dt_next_month)+"'"+",'"+languageCd+"');\">"+
		"<img src=\"media/image/common/calendar/next.gif\" width=\"16\" height=\"16\" border=\"0\""+
		" alt=\"next month\"></a></td>\n</tr>\n"
	);

	var dt_current_day=new Date(dt_firstday);
	// print weekdays titles
	str_buffer+="<tr>\n";
	for(var n=0; n<7; n++)
		str_buffer+="	<td bgcolor=\"#87CEFA\">"+
		"<font color=\"white\" face=\"tahoma,verdana\" size=\"2\">"+
		week_days[(n_weekstart+n)%7]+"</font></td>\n";
	// print calendar table
	str_buffer+="</tr>\n";
	while(dt_current_day.getMonth() == dt_datetime.getMonth() ||
		dt_current_day.getMonth() == dt_firstday.getMonth()){
		// print row heder
		str_buffer+="<tr>\n";
		for(var n_current_wday=0; n_current_wday<7; n_current_wday++){
				if(dt_current_day.getDate() == dt_datetime.getDate() &&
					dt_current_day.getMonth() == dt_datetime.getMonth())
					// print current date
					str_buffer+="	<td bgcolor=\"#FFB6C1\" align=\"right\">";
				else if(dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days
					str_buffer+="	<td bgcolor=\"#DBEAF5\" align=\"right\">";
				else
					// print working days of current month
					str_buffer+="	<td bgcolor=\"white\" align=\"right\">";

				if(dt_current_day.getMonth() == dt_datetime.getMonth())
					// print days of current month
					str_buffer+="<a href=\"javascript:assignDate('"+dt2dtstr(dt_current_day)+"','"+str_target+"'); window.close();\">"+
					"<font color=\"black\" face=\"tahoma,verdana\" size=\"2\">";
				else 
					// print days of other months
					str_buffer+="<a href=\"javascript:assignDate('"+dt2dtstr(dt_current_day)+"','"+str_target+"'); window.close();\">"+
					"<font color=\"gray\" face=\"tahoma,verdana\" size=\"2\">";

				str_buffer+=dt_current_day.getDate()+"</font></a></td>\n";
				dt_current_day.setDate(dt_current_day.getDate()+1);

		}
		// print row footer
		str_buffer+="</tr>\n";
	}

	str_buffer+="<script type=\"text/javascript\">";
	str_buffer+="function assignDate(currentDate,targetName){";
	str_buffer+="var el=null;"
	str_buffer+="try{";
	str_buffer+="el=eval(\"window.opener.document.forms[0].elements['\"+targetName+\"']\")";
	str_buffer+="}catch(e){}";
	str_buffer+="if(el==null){";
	str_buffer+="try{";
	str_buffer+="el=eval(\"window.opener.document.forms[1].elements['\"+targetName+\"']\")";
	str_buffer+="}catch(e){}";
	str_buffer+="}";
	str_buffer+="if(el!=null){";
	str_buffer+="el.value=currentDate;";
	str_buffer+="}";
	str_buffer+="}";
	str_buffer+="</script>";

	// print calendar footer
	str_buffer+="</body>\n</html>\n";

	var vWinCal=window.open("","Calendar","width=220,height=220,status=no,resizable=yes,top="+cursor.y+",left="+cursor.x);
	vWinCal.opener=self;
	vWinCal.moveTo(cursor.x,cursor.y);
	vWinCal.focus();
	var calc_doc=vWinCal.document;
	calc_doc.write(str_buffer);
	calc_doc.close();
}

function checkValidateDateFormat(str_checkDate){
	var re_date=/^(\d+)\-(\w+)\-(\d+)$/;
	if(!re_date.exec(str_checkDate)){
		return false;
	}else{
		return true;
	}
}

// datetime parsing and formatting routimes. modify them if you wish other datetime format
function str2dt(str_datetime){
	var re_date=/^(\d+)\-(\w+)\-(\d+)$/;
	re_date.exec(str_datetime);
	for(var n=0;n<12;n++){
		if(RegExp.$2==monthName[n]){
			return(new Date(RegExp.$3,n,RegExp.$1,0,0,0));
		}
		if(RegExp.$2==monthName2[n]){
			return(new Date(RegExp.$3,n,RegExp.$1,0,0,0));
		}
		if(RegExp.$2==monthName3[n]){
			return(new Date(RegExp.$3,n,RegExp.$1,0,0,0));
		}
		if(RegExp.$2==monthName4[n]){
			return(new Date(RegExp.$3,n,RegExp.$1,0,0,0));
		}
		if(RegExp.$2==monthName5[n]){
			return(new Date(RegExp.$3,n,RegExp.$1,0,0,0));
		}
		if(RegExp.$2==monthName6[n]){
			return(new Date(RegExp.$3,n,RegExp.$1,0,0,0));
		}
	}
	return new Date();
}

function dt2dtstr(dt_datetime){
	if(dt_datetime.getDate()>=1 && dt_datetime.getDate()<=9){
			return(new String("0"+dt_datetime.getDate()+"-"+monthName[dt_datetime.getMonth()]+"-"+dt_datetime.getFullYear()));
	}else{
		return(new String(dt_datetime.getDate()+"-"+monthName[dt_datetime.getMonth()]+"-"+dt_datetime.getFullYear()));
	}
}

function getPosition(e){
	e=e||window.event;
	cursor.x=e.screenX;
	cursor.y=e.screenY;
}
document.onmouseup=getPosition;
