﻿
function julianDay( Y, M, D ){
	
	var y,m,d;
	
	
	y=parseInt(Y);
	m=parseInt(M);
	d=parseInt(D);
	
	var jy,ja,jm;
	
	
	if( y==0 ){
		alert("There was no year zero in the Julian calendar.");
		return "invalid";
	}
	
	
	if( y==1582 && m==10 && d>4 && d<15 ){
		alert("October 5th to 14th were skipped in October of 1582\nwhen Pope Gregory XIII implemented the calendar reforms\nof the commission headed by the Jesuit mathematician and astronomer\nChristoph Clavius.");
		return "invalid";
	}
	
	if(y<0) y++;

	if(m>2){
		jy=y;
		jm=m+1;
	}else{
		jy=y-1;
		jm=m+13;
	}
	
	var julian = Math.floor( Math.floor(365.25*jy) + Math.floor(30.6001*jm) + d + 1720995 );
	

	var gregorianStart = 15 + 31*( 10 + 12*1582 );
	
	if( d + 31*(m + 12*y) >= gregorianStart ){
		ja = Math.floor(0.01*jy);
		julian += 2 - ja + Math.floor(0.25*ja);
	}
	
	
	return julian;
	
}


function julianGregorianDate( julian ){
	
	var j1, j2, j3, j4, j5;
	
	
	var gregorianStart  = 2299161;
	if( julian >= gregorianStart ){
		var tmp = Math.floor( ( (julian - 1867216) - 0.25 ) / 36524.25 );
		j1 = julian + 1 + tmp - Math.floor(0.25*tmp);
	}else{
		j1 = julian;
	}
	
	j2 = j1 + 1524;
	j3 = Math.floor( 6680.0 + ( (j2 - 2439870) - 122.1 )/365.25 );
	j4 = Math.floor(j3*365.25);
	j5 = Math.floor( (j2 - j4)/30.6001 );
	
	var d = Math.floor(j2 - j4 - Math.floor(j5*30.6001));
	var m = Math.floor(j5 - 1);
	if( m > 12 ) m -= 12;
	var y = Math.floor(j3 - 4715);
	if( m > 2 ) y--;
	if( y <= 0 ) y--;
	
	return formatISODate(y,m,d);
	
}


function dayOfWeek( julian ){
	
	return (julian+1)%7;
	
}


function padWithZeros(number,length) {
	 var str = "" + number;
	 while( str.length < length ) str = '0' + str;
	 return str;
}


function formatISODate( year, month, day ){
	
	// Date delimiter:
	var delimiter=".";
	if(year<0){
		year= -year; year = "-" + padWithZeros(year,4);
	}else{
		year = padWithZeros(year,4);
	}
	return year + delimiter + padWithZeros(month,2) + delimiter + padWithZeros(day,2);
	
}

       
function setToday( objectId ){
	 
	var today = new Date();
	document.getElementById( objectId ).value = formatISODate( today.getFullYear(), today.getMonth()+1, today.getDate() );
	
}


function callCalendar( objectId ,lanmu){
	
	var dateString=document.getElementById( objectId ).value;
       // Normalize possibly variant delimiters to the ISO preferred delimiter:
	var re = new RegExp( '[/\.\ ]', 'gi' );
	dateString=dateString.replace( re, "-" );
	// Split the date string:
	dateComponents=dateString.split("-");
	var year,month,day;
	year=dateComponents[0];
	month=dateComponents[1];
	day=dateComponents[2];
	generateCalendar( year, month, day, objectId,lanmu);
	
}

function setDate(day,lanmu)
{
	year =document.getElementById("currentYear").value;
	month=document.getElementById("currentMonth").value;
	isoDateString=formatISODate(year,month,day);
	var _url = "http://sousuo.gov.cn/search?channelid=6001&outlinepage=en_sousuo.jsp&prepage=20&searchword=pubdate%3D"+isoDateString+"+and+nodepath%3D"+lanmu+"&lanmu="+lanmu;
	window.open(_url,"_blank","");
}


function previousYear(lanmu){
	
	year =parseInt(document.getElementById("currentYear").value);
	month=parseInt(document.getElementById("currentMonth").value);
	day  =parseInt(document.getElementById("currentDay").value);
	destination = document.getElementById("destinationId").value;
	year -= 1;
	
	if( year==0 ) year = -1;
	
	window.generateCalendar(year,month,day,destination,lanmu);
	
}


function previousMonth(lanmu){
	
	year =parseInt(document.getElementById("currentYear").value);
	month=parseInt(document.getElementById("currentMonth").value);
	day  =parseInt(document.getElementById("currentDay").value);
	destination = document.getElementById("destinationId").value;
	month -= 1;
	if(month<1){ 
		month = 12;
		year -= 1;
		if( year==0 ) year = -1;
	}
	window.generateCalendar(year,month,day,destination,lanmu);
	
}


function nextMonth(lanmu){
	
	year =parseInt(document.getElementById("currentYear").value);
	month=parseInt(document.getElementById("currentMonth").value);
	day  =parseInt(document.getElementById("currentDay").value);
	destination = document.getElementById("destinationId").value;
	month += 1;
	if(month>12){
		month = 1;
		year += 1;
		if( year==0 ) year = 1;
	}
	window.generateCalendar(year,month,day,destination,lanmu);
	
}


function nextYear(lanmu){
	
	year =parseInt(document.getElementById("currentYear").value);
	month=parseInt(document.getElementById("currentMonth").value);
	day  =parseInt(document.getElementById("currentDay").value);
	destination = document.getElementById("destinationId").value;
	year += 1;
	// Remember that there was no year zero:
	if( year==0 ) year = 1;
	window.generateCalendar(year,month,day,destination,lanmu);
	
}


function generateCalendar( Y, M, D, targetId,lanmu){
	var Month = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
//var Month = new Array("1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月");	
	
//	var Day = new Array("日","一","二","三","四","五","六");
var Day = new Array("1","2","3","4","5","6","7");
	// Digits (if you want to use something other than Arabic-Indic digits):
	// var Digits = new Array("0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31");
	
	var daysInMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var daysInAWeek=7;
	var OutputString;
	
	
	var today = new Date();
	if( Y=="" || isNaN(Y) ){
		thisYear=today.getFullYear();
	}else{
		thisYear=parseInt(Y);
	}
	// Get month:
	if( M=="" || isNaN(M) ){
		thisMonth=today.getMonth()+1;
	}else{
		thisMonth=parseInt(M);
		if(thisMonth<1) thisMonth=1;
		if(thisMonth>12) thisMonth=12;
	}
	// Get day:
	if( D=="" || isNaN(D) ){
		thisDay=today.getDate();
	}else{
		thisDay=parseInt(D);
		if(thisDay<0) thisDay=1;
		if(thisDay>31) thisDay=31;
	}
	
	// Calculate the number of days in February:
	if ((thisYear % 4) == 0){
		daysInMonth[ 1 ] = 29;
		if((thisYear % 100) == 0 && (thisYear % 400) != 0){
			daysInMonth[ 1 ] = 28;
		}
	}
	
	// Document header:
	OutputString = "";
	// Start the calendar table with day headings:
	OutputString += "<table class='rili' border='1' cellSpacing=0 cellPadding=0>\n <tr>\n";
	OutputString += " <td class=\"calendarheading\"></td>\n";
	OutputString += " <td class=\"calendarheading\"><div class=\"cssleftarrow\" onclick=\"previousMonth("+lanmu+")\"><!-- left arrow --></div></td>\n";
	// Print the month heading:
	if( thisYear < 0 ) yearString = -thisYear + " BCE";
	else if( thisYear < 1000 ) yearString = thisYear + " CE";
	else yearString = thisYear;
	OutputString += " <td class=\"calendarheading\" colspan=\"3\"><font color=\"#996600\">" + Month[ thisMonth-1 ]+" "+yearString;
	// Print the year heading: If year<0, negate and print "BCE"; if 0<year<1000, print "CE":
	OutputString += "</font></td>\n";
	OutputString += " <td class=\"calendarheading\"><div class=\"cssrightarrow\" onclick=\"nextMonth("+lanmu+")\"><!-- right arrow --></div></td>\n";
	OutputString += " <td class=\"calendarheading\"></td>\n";

	OutputString += "</tr>\n <tr>\n";
	for(i=0;i<daysInAWeek;i++){
		OutputString += "  <th><font color=\"#996600\">" + Day[i] + "</font></th>\n";
	}
	OutputString += " </tr>\n <tr class='rili'>\n";
	
	// Get the day of week of the first of the month:
	var firstDay=dayOfWeek( julianDay( thisYear, thisMonth, 1 ) ); 
	//alert( Day[ firstDay ] );
	
	// First week:
	for(i=0;i<firstDay;i++){
		OutputString += "  <td onclick=\"previousMonth()\">&nbsp;</td>\n";
	}
	for(d=1;i<daysInAWeek;i++,d++){
		// Special handling for October of 1582:
		if( d==5 && thisMonth==10 && thisYear==1582 ) d+=10;
		OutputString += "  <td";
		if(d==thisDay) OutputString += " class='thisday'";
		OutputString += " ><span style='cursor:hand' onclick=\"setDate(" + d+","+lanmu+ ")\"><font color=\"#996600\">" + d + "</font></span></td>\n";
	}
	
	// Subsequent weeks;
	var lastDayOfMonth=daysInMonth[thisMonth-1];
	for(j=1;j<6 && d<=lastDayOfMonth;j++){
		OutputString += " </tr>\n <!-- Week " + (j+1) + " -->\n<tr class='rili'>\n";
		// Days in this month:
		for( i=0; i<daysInAWeek && d<=lastDayOfMonth;i++,d++){  
			OutputString += "  <td ";
			if(d==thisDay) OutputString += " class='thisday'";
			//OutputString += " onclick=\"setDate(" + d + ")\">" + d + "</td>\n";
			OutputString += "><span style='cursor:hand' onclick=\"setDate(" + d +","+lanmu+")\"><font color=\"#996600\">" + d + "</font></span></td>\n";
		}
		// Finish out the row:
		for(;i<daysInAWeek;i++){
			OutputString += "  <td onclick=\"nextMonth()\">&nbsp;</td>\n";      
		}
	}
	// Finish the HTML, with hidden vars:
	OutputString += "  </tr>\n";
	OutputString += " </table>\n";
	OutputString += "  <input type=\"hidden\" id=\"currentYear\" value=\"" + thisYear + "\">\n";
	OutputString += "  <input type=\"hidden\" id=\"currentMonth\" value=\"" + thisMonth + "\">\n";
	OutputString += "  <input type=\"hidden\" id=\"currentDay\" value=\"" + thisDay + "\">\n";
	OutputString += "  <input type=\"hidden\" id=\"destinationId\" value=\"" + targetId + "\">\n";   
	OutputString += "  ";
	document.all.rl.innerHTML=OutputString;
}

