//////////////////////////////////////////////////////////////////
//init begin
var arr_m_dayinmonth; //农历每月的天数
var arr_m_ten; //农历天干
var arr_m_twelve; //农历地支
var arr_m_month; //农历月份
var arr_m_day; //农历日
var m_dayinmonth, m_ten, m_twelve, m_month, m_day; //农历月天数，天干，地支，月，日
var year, month, day;  //选择的阳历年/月/日
var m_total, total; //农历总天数，阳历总天数
var i, y;
var str;
var today; //今天
var first_day_of_this_month; //本月第一日
var ty, dd;
var chi; //农历日子

var arr_m_dayinmonth0 = "8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1";
var arr_m_dayinmonth1 = "0,29,30,29,29,30,29,30,29,30,30,30,29,0,8,2";
var arr_m_dayinmonth2 = "0,30,29,30,29,29,30,29,30,29,30,30,30,0,9,3";
var arr_m_dayinmonth3 = "5,29,30,29,30,29,29,30,29,29,30,30,29,30,10,4";
var arr_m_dayinmonth4 = "0,30,30,29,30,29,29,30,29,29,30,30,29,0,1,5";
var arr_m_dayinmonth5 = "0,30,30,29,30,30,29,29,30,29,30,29,30,0,2,6";
var arr_m_dayinmonth6 = "4,29,30,30,29,30,29,30,29,30,29,30,29,30,3,7";
var arr_m_dayinmonth7 = "0,29,30,29,30,29,30,30,29,30,29,30,29,0,4,8";
var arr_m_dayinmonth8 = "0,30,29,29,30,30,29,30,29,30,30,29,30,0,5,9";
var arr_m_dayinmonth9 = "2,29,30,29,29,30,29,30,29,30,30,30,29,30,6,10";
var arr_m_dayinmonth10 = "0,29,30,29,29,30,29,30,29,30,30,30,29,0,7,11";
var arr_m_dayinmonth11 = "6,30,29,30,29,29,30,29,29,30,30,29,30,30,8,12";
var arr_m_dayinmonth12 = "0,30,29,30,29,29,30,29,29,30,30,29,30,0,9,1";
var arr_m_dayinmonth13 = "0,30,30,29,30,29,29,30,29,29,30,29,30,0,10,2";
var arr_m_dayinmonth14 = "5,30,30,29,30,29,30,29,30,29,30,29,29,30,1,3";
var arr_m_dayinmonth15 = "0,30,29,30,30,29,30,29,30,29,30,29,30,0,2,4";
var arr_m_dayinmonth16 = "0,29,30,29,30,29,30,30,29,30,29,30,29,0,3,5";
var arr_m_dayinmonth17 = "2,30,29,29,30,29,30,30,29,30,30,29,30,29,4,6";
var arr_m_dayinmonth18 = "0,30,29,29,30,29,30,29,30,30,29,30,30,0,5,7";
var arr_m_dayinmonth19 = "7,29,30,29,29,30,29,29,30,30,29,30,30,30,6,8";
var arr_m_dayinmonth20 = "0,29,30,29,29,30,29,29,30,30,29,30,30,0,7,9";
var arr_m_dayinmonth21 = "0,30,29,30,29,29,30,29,29,30,29,30,30,0,8,10";
var arr_m_dayinmonth22 = "5,30,29,30,30,29,29,30,29,29,30,29,30,30,9,11";
var arr_m_dayinmonth23 = "0,29,30,30,29,30,29,30,29,29,30,29,30,0,10,12";
var arr_m_dayinmonth24 = "0,29,30,30,29,30,30,29,30,29,30,29,29,0,1,1";
var arr_m_dayinmonth25 = "4,30,29,30,29,30,30,29,30,30,29,30,29,30,2,2";
var arr_m_dayinmonth26 = "0,29,29,30,29,30,29,30,30,29,30,30,29,0,3,3";
var arr_m_dayinmonth27 = "0,30,29,29,30,29,30,29,30,29,30,30,30,0,4,4";
var arr_m_dayinmonth28 = "2,29,30,29,29,30,29,29,30,29,30,30,30,30,5,5";
var arr_m_dayinmonth29 = "0,29,30,29,29,30,29,29,30,29,30,30,30,0,6,6";
var arr_m_dayinmonth30 = "6,29,30,30,29,29,30,29,29,30,29,30,30,29,7,7";
var arr_m_dayinmonth31 = "0,30,30,29,30,29,30,29,29,30,29,30,29,0,8,8";
var arr_m_dayinmonth32 = "0,30,30,30,29,30,29,30,29,29,30,29,30,0,9,9";
var arr_m_dayinmonth33 = "5,29,30,30,29,30,30,29,30,29,30,29,29,30,10,10";
var arr_m_dayinmonth34 = "0,29,30,29,30,30,29,30,29,30,30,29,30,0,1,11";
var arr_m_dayinmonth35 = "0,29,29,30,29,30,29,30,30,29,30,30,29,0,2,12";
var arr_m_dayinmonth36 = "3,30,29,29,30,29,29,30,30,29,30,30,30,29,3,1";
var arr_m_dayinmonth37 = "0,30,29,29,30,29,29,30,29,30,30,30,29,0,4,2";
var arr_m_dayinmonth38 = "7,30,30,29,29,30,29,29,30,29,30,30,29,30,5,3";
var arr_m_dayinmonth39 = "0,30,30,29,29,30,29,29,30,29,30,29,30,0,6,4";
var arr_m_dayinmonth40 = "0,30,30,29,30,29,30,29,29,30,29,30,29,0,7,5";
var arr_m_dayinmonth41 = "6,30,30,29,30,30,29,30,29,29,30,29,30,29,8,6";
var arr_m_dayinmonth42 = "0,30,29,30,30,29,30,29,30,29,30,29,30,0,9,7";
var arr_m_dayinmonth43 = "0,29,30,29,30,29,30,30,29,30,29,30,29,0,10,8";
var arr_m_dayinmonth44 = "4,30,29,30,29,30,29,30,29,30,30,29,30,30,1,9";
var arr_m_dayinmonth45 = "0,29,29,30,29,29,30,29,30,30,30,29,30,0,2,10";
var arr_m_dayinmonth46 = "0,30,29,29,30,29,29,30,29,30,30,29,30,0,3,11";
var arr_m_dayinmonth47 = "2,30,30,29,29,30,29,29,30,29,30,29,30,30,4,12";
var arr_m_dayinmonth48 = "0,30,29,30,29,30,29,29,30,29,30,29,30,0,5,1";
var arr_m_dayinmonth49 = "7,30,29,30,30,29,30,29,29,30,29,30,29,30,6,2";
var arr_m_dayinmonth50 = "0,29,30,30,29,30,30,29,29,30,29,30,29,0,7,3";
var arr_m_dayinmonth51 = "0,30,29,30,30,29,30,29,30,29,30,29,30,0,8,4";
var arr_m_dayinmonth52 = "5,29,30,29,30,29,30,29,30,30,29,30,29,30,9,5";
var arr_m_dayinmonth53 = "0,29,30,29,29,30,30,29,30,30,29,30,29,0,10,6";
var arr_m_dayinmonth54 = "0,30,29,30,29,29,30,29,30,30,29,30,30,0,1,7";
var arr_m_dayinmonth55 = "3,29,30,29,30,29,29,30,29,30,29,30,30,30,2,8";
var arr_m_dayinmonth56 = "0,29,30,29,30,29,29,30,29,30,29,30,30,0,3,9";
var arr_m_dayinmonth57 = "8,30,29,30,29,30,29,29,30,29,30,29,30,29,4,10";
var arr_m_dayinmonth58 = "0,30,30,30,29,30,29,29,30,29,30,29,30,0,5,11";
var arr_m_dayinmonth59 = "0,29,30,30,29,30,29,30,29,30,29,30,29,0,6,12";
var arr_m_dayinmonth60 = "6,30,29,30,29,30,30,29,30,29,30,29,30,29,7,1";
var arr_m_dayinmonth61 = "0,30,29,30,29,30,29,30,30,29,30,29,30,0,8,2";
var arr_m_dayinmonth62 = "0,29,30,29,29,30,29,30,30,29,30,30,29,0,9,3";
var arr_m_dayinmonth63 = "4,30,29,30,29,29,30,29,30,29,30,30,30,29,10,4";
var arr_m_dayinmonth64 = "0,30,29,30,29,29,30,29,30,29,30,30,30,0,1,5";
var arr_m_dayinmonth65 = "0,29,30,29,30,29,29,30,29,29,30,30,29,0,2,6";
var arr_m_dayinmonth66 = "3,30,30,30,29,30,29,29,30,29,29,30,30,29,3,7";
var arr_m_dayinmonth67 = "0,30,30,29,30,30,29,29,30,29,30,29,30,0,4,8";
var arr_m_dayinmonth68 = "7,29,30,29,30,30,29,30,29,30,29,30,29,30,5,9";
var arr_m_dayinmonth69 = "0,29,30,29,30,29,30,30,29,30,29,30,29,0,6,10";
var arr_m_dayinmonth70 = "0,30,29,29,30,29,30,30,29,30,30,29,30,0,7,11";
var arr_m_dayinmonth71 = "5,29,30,29,29,30,29,30,29,30,30,30,29,30,8,12";
var arr_m_dayinmonth72 = "0,29,30,29,29,30,29,30,29,30,30,29,30,0,9,1";
var arr_m_dayinmonth73 = "0,30,29,30,29,29,30,29,29,30,30,29,30,0,10,2";
var arr_m_dayinmonth74 = "4,30,30,29,30,29,29,30,29,29,30,30,29,30,1,3";
var arr_m_dayinmonth75 = "0,30,30,29,30,29,29,30,29,29,30,29,30,0,2,4";
var arr_m_dayinmonth76 = "8,30,30,29,30,29,30,29,30,29,29,30,29,30,3,5";
var arr_m_dayinmonth77 = "0,30,29,30,30,29,30,29,30,29,30,29,29,0,4,6";
var arr_m_dayinmonth78 = "0,30,29,30,30,29,30,30,29,30,29,30,29,0,5,7";
var arr_m_dayinmonth79 = "6,30,29,29,30,29,30,30,29,30,30,29,30,29,6,8";
var arr_m_dayinmonth80 = "0,30,29,29,30,29,30,29,30,30,29,30,30,0,7,9";
var arr_m_dayinmonth81 = "0,29,30,29,29,30,29,29,30,30,29,30,30,0,8,10";
var arr_m_dayinmonth82 = "4,30,29,30,29,29,30,29,29,30,29,30,30,30,9,11";
var arr_m_dayinmonth83 = "0,30,29,30,29,29,30,29,29,30,29,30,30,0,10,12";
var arr_m_dayinmonth84 = "10,30,29,30,30,29,29,30,29,29,30,29,30,30,1,1";
var arr_m_dayinmonth85 = "0,29,30,30,29,30,29,30,29,29,30,29,30,0,2,2";
var arr_m_dayinmonth86 = "0,29,30,30,29,30,30,29,30,29,30,29,29,0,3,3";
var arr_m_dayinmonth87 = "6,30,29,30,29,30,30,29,30,30,29,30,29,29,4,4";
var arr_m_dayinmonth88 = "0,30,29,30,29,30,29,30,30,29,30,30,29,0,5,5";
var arr_m_dayinmonth89 = "0,30,29,29,30,29,29,30,30,29,30,30,30,0,6,6";
var arr_m_dayinmonth90 = "5,29,30,29,29,30,29,29,30,29,30,30,30,30,7,7";
var arr_m_dayinmonth91 = "0,29,30,29,29,30,29,29,30,29,30,30,30,0,8,8";
var arr_m_dayinmonth92 = "0,29,30,30,29,29,30,29,29,30,29,30,30,0,9,9";
var arr_m_dayinmonth93 = "3,29,30,30,29,30,29,30,29,29,30,29,30,29,10,10";
var arr_m_dayinmonth94 = "0,30,30,30,29,30,29,30,29,29,30,29,30,0,1,11";
var arr_m_dayinmonth95 = "8,29,30,30,29,30,29,30,30,29,29,30,29,30,2,12";
var arr_m_dayinmonth96 = "0,29,30,29,30,30,29,30,29,30,30,29,29,0,3,1";
var arr_m_dayinmonth97 = "0,30,29,30,29,30,29,30,30,29,30,30,29,0,4,2";
var arr_m_dayinmonth98 = "5,30,29,29,30,29,29,30,30,29,30,30,29,30,5,3";
var arr_m_dayinmonth99 = "0,30,29,29,30,29,29,30,29,30,30,30,29,0,6,4";
var arr_m_dayinmonth100 = "0,30,30,29,29,30,29,29,30,29,30,30,29,0,7,5";
var arr_m_dayinmonth101 = "4,30,30,29,30,29,30,29,29,30,29,30,29,30,8,6";
var arr_m_dayinmonth102 = "0,30,30,29,30,29,30,29,29,30,29,30,29,0,9,7";
var arr_m_dayinmonth103 = "0,30,30,29,30,30,29,30,29,29,30,29,30,0,10,8";
var arr_m_dayinmonth104 = "2,29,30,29,30,30,29,30,29,30,29,30,29,30,1,9";
var arr_m_dayinmonth105 = "0,29,30,29,30,29,30,30,29,30,29,30,29,0,2,10";
var arr_m_dayinmonth106 = "7,30,29,30,29,30,29,30,29,30,30,29,30,30,3,11";
var arr_m_dayinmonth107 = "0,29,29,30,29,29,30,29,30,30,30,29,30,0,4,12";
var arr_m_dayinmonth108 = "0,30,29,29,30,29,29,30,29,30,30,29,30,0,5,1";
var arr_m_dayinmonth109 = "5,30,30,29,29,30,29,29,30,29,30,29,30,30,6,2";
var arr_m_dayinmonth110 = "0,30,29,30,29,30,29,29,30,29,30,29,30,0,7,3";
var arr_m_dayinmonth111 = "0,30,29,30,30,29,30,29,29,30,29,30,29,0,8,4";
var arr_m_dayinmonth112 = "4,30,29,30,30,29,30,29,30,29,30,29,30,29,9,5";
var arr_m_dayinmonth113 = "0,30,29,30,29,30,30,29,30,29,30,29,30,0,10,6";
var arr_m_dayinmonth114 = "9,29,30,29,30,29,30,29,30,30,29,30,29,30,1,7";
var arr_m_dayinmonth115 = "0,29,30,29,29,30,29,30,30,30,29,30,29,0,2,8";
var arr_m_dayinmonth116 = "0,30,29,30,29,29,30,29,30,30,29,30,30,0,3,9";
var arr_m_dayinmonth117 = "6,29,30,29,30,29,29,30,29,30,29,30,30,30,4,10";
var arr_m_dayinmonth118 = "0,29,30,29,30,29,29,30,29,30,29,30,30,0,5,11";
var arr_m_dayinmonth119 = "0,30,29,30,29,30,29,29,30,29,29,30,30,0,6,12";
var arr_m_dayinmonth120 = "4,29,30,30,30,29,30,29,29,30,29,30,29,30,7,1";

arr_m_ten = new Array("","甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
arr_m_twelve = new Array("","子（鼠）","丑（牛）","寅（虎）","卯（兔）","辰（龙）",
               "巳（蛇）","午（马）","未（羊）","申（猴）","酉（鸡）","戌（狗）","亥（猪）");
arr_m_month = new Array("闰","正","二","三","四","五","六","七","八","九","十","十一","十二","月");
arr_m_day = new Array("","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十");
str = "arr_m_dayinmonth = new Array("
for (i = 0; i < 120; i++)
	str += ("new Array(" + eval("arr_m_dayinmonth" + i) + "), ");
str += ("new Array(" + arr_m_dayinmonth120 + "));");
eval(str);
today = new Date();
//init end
//////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////
//function begin
function output_options(begin, end, direction, value)
{
	//direction=1 增 else 减
	var begin, end, str, i, direction, value;
	var str = "";
	if (direction == 1)
	{
		for(i = begin; i <= end; i++)
		{
			if (i == value)
				str += "<option value=\"" + i + "\" selected>" + i + "</option>";
			else
				str += "<option value=\"" + i + "\">" + i + "</option>";
		}
	}
	else		
	{
		for(i = end; i >= begin; i--)
		{
			if (i == value)
				str += "<option value=\"" + i + "\" selected>" + i + "</option>";
			else
				str += "<option value=\"" + i + "\">" + i + "</option>";
		}
	} 
	document.write(str);
}

function get_date_num_by_month(p_month, p_year)
{
	var p_month, p_year, p_day;
	p_day = 31;
	if(p_month == 4 || p_month == 6 || p_month == 9 || p_month == 11)
		p_day = 30;
	if(p_month == 2)
	{
		if((p_year % 4 == 0 && p_year % 100 != 0) || p_year % 400 == 0)
			p_day = 29;
		else 
			p_day = 28;   
	}
	return p_day;
}

//function end
//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////
//show function begin
function show_data()
{
	var p_year, p_month;
	p_year = year;
	p_month = month;

	m_ten = 0; //天干
	m_twelve = 0; //地支
	week = 5; //星期
	m_day = 0; //农历日
	m_month = 0; //农历月
	total = 11; //阳历总天数 至1900年12月21日
	m_total = 0; //阴历总天数

	first_day_of_this_month = new Date(p_year, p_month, 1); //本月第一天

	//如果没有输入，设为当日日期
	if (p_year == "" || p_month == "" || (p_year < 1901 || p_year > 2020) || (p_month < 1 || p_month > 12))
	{
		p_year = today.getFullYear();
		p_month = today.getMonth();
	}

	//计算到所求日期阳历的总天数-自1900年12月21日始
	//先算年的和
	for (y = 1901; y < p_year; y++)
	{
		total += 365;
		if (y % 4 == 0) 
			total++;
	}
	//再加当年的几个月
	switch (p_month)
	{
		case 12:
			total += 30;
		case 11:
			total += 31;
		case 10:
			total += 30;
		case 9:
			total += 31;
		case 8:
			total += 31;
		case 7:
			total += 30;
		case 6:
			total += 31;
		case 5:
			total += 30;
		case 4:
			total += 31;
		case 3:
			total += 28;
		case 2:
			total += 31;
	}

	if (p_year % 4 == 0 && p_month > 2) //如果当年是闰年还要加一天
		total++;

	//顺便算出当月1日星期几
	//week = first_day_of_this_month.getDay();
	week = (total + week) % 7;
	

	//alert(first_day_of_this_month.getFullYear() + "-");
	//alert(first_day_of_this_month.getMonth() + "-");
	//alert(first_day_of_this_month.getDate() + "-");
	//alert(first_day_of_this_month.getDay() + " ");
	//alert(today.getDay() + " ");
	//alert(m_total + " " + total + " ");
	//alert(week + " ");

	//用农历的天数累加来判断是否超过阳历的天数
	flag1 = 0; //判断跳出循环的条件
	j=0;
	while (j <= 120)
	{
		i = 1;
		while (i <= 13)
		{
			m_total += arr_m_dayinmonth[j][i];
			if (m_total >= total)
			{
				flag1 = 1;
				break;
			}
			i++;
		}
		if (flag1 == 1) 
			break;
		j++;
	}
	//计算所求月份1号的农历日期
	m_day = arr_m_dayinmonth[j][i] - (m_total - total);
	//月头空开的天数
	k = week;
	//是否跨越一年
	dd = get_date_num_by_month(p_month, p_year);
	//是否跨越一年
	ty = 0;
	if ((((arr_m_dayinmonth[j][0] != 0) && (i == 13)) || ((arr_m_dayinmonth[j][0] == 0) && (i == 12))) && ((m_total - total) < dd)) 
		ty=1;

	write_content("list_header", get_header());
	write_content("list_detail", get_date());
	write_content("list_month", get_month());
}

function get_header()//打印年月抬头
{
	var str = "";
	str += "<b>" + year + "年" + sprintf("%02d", month) + "月</b>&nbsp;";
	if (ty == 0)
		str += "<b>" + arr_m_ten[arr_m_dayinmonth[j][14]] + arr_m_twelve[arr_m_dayinmonth[j][15]] + "年</b>";
	else
		str += "<b>" + arr_m_ten[arr_m_dayinmonth[j][14]] + arr_m_twelve[arr_m_dayinmonth[j][15]] + "/" + arr_m_ten[arr_m_dayinmonth[j+1][14]] + arr_m_twelve[arr_m_dayinmonth[j+1][15]] + "年</b>";
	return str;
}

function get_date()
{
	var str = " \
	<table border=\"0\" width=\"100%\" id=\"show_border\"> \
		<tr> \
			<td width=\"14%\"><b>周日</b></td> \
			<td width=\"14%\"><b>周一</b></td> \
			<td width=\"14%\"><b>周二</b></td> \
			<td width=\"14%\"><b>周三</b></td> \
			<td width=\"14%\"><b>周四</b></td> \
			<td width=\"14%\"><b>周五</b></td> \
			<td width=\"14%\"><b>周六</b></td> \
		</tr>";
	day = 1;
	var line = 0;
	while (day <= dd)
	{
		line++;
		str += "<tr>";
		for (s = 0; s <= 6; s++)
		{
			if ((k != 0) || (day > dd))
			{
				str += "<td width=\"14%\" class=\"align_center\">　</td>"; //空格
				k--;
			}
			else
			{
				//#设置字符颜色, 生成中文农历
				if (m_day == 1)
				{
					//1日打印月份
					if ((arr_m_dayinmonth[j][0] != 0) && (arr_m_dayinmonth[j][0] < i))
						m_month = i - 1;
					else
						m_month = i;
					if ((i == arr_m_dayinmonth[j][0]+1) && (arr_m_dayinmonth[j][0] != 0)) 
						chi = arr_m_month[0] + arr_m_month[m_month]; //闰月
					else 
						chi = arr_m_month[m_month] + arr_m_month[13];
				}
				else
					chi = arr_m_day[m_day];
				str += "<td><span class=\"font_red\">" + sprintf("%02d", day) + "</span> &nbsp;" + chi + "</td>";
				//#下一天
				day++;
				m_day++;
				if (m_day > arr_m_dayinmonth[j][i])
				{
					m_day = 1;
					i++;
				}
				if ((i > 12 && arr_m_dayinmonth[j][0] == 0) || (i > 13 && arr_m_dayinmonth[j][0] != 0))
				{
					i = 1;
					j++;
				}
			}
		}
		str += "</tr>";
	}
	while (line < 6)
	{
		str += "<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>"
		line++;
	}
	str += "</table>";
	return str;
}

function get_month()
{
	var str = "";
	//打印上一月，下一月
	ly = ny = year;
	last = month - 1;
	if (last == 0)
	{
		last = 12;
		ly--;
	}
	next = month + 1;
	if (next == 13)
	{
		next = 1;
		ny++;
	}
	//alert(ny);
	if (ly >= 1901)
		str += "<a href=\"Javascript:show_data2(" + ly + ", " + last + ");\">上一个月</a>&nbsp;&nbsp;";
	if (ny <= 2020)
		str += "&nbsp;&nbsp;<a href=\"Javascript:show_data2(" + ny + ", " + next + ");\">下一个月</a>";
	return str;
}
//show function end
//////////////////////////////////////////////////////////////////

/*


/*
sprintf() and printf() in JavaScript
http://jan.moesen.nu/code/javascript/sprintf-and-printf-in-javascript/
Can't handle "%03d" correctly.
Gave up this code at 2005-01-23 03:13:26
*/
function sprintf()
{
/*
======================================================================
 sprintf()
======================================================================
 Purpose : format a string

 Author  : Antoine Hurkmans, January 2002
----------------------------------------------------------------------
 Parameters :
 you may figure this one out yourself (hint: www.php.net/sprintf)
----------------------------------------------------------------------
 Returns : a formatted string
----------------------------------------------------------------------
 Revision History :
 12-Feb-02 AH  - Added support for alternate padding char
 05-Feb-02 AH  - Fixed bug in display of decimal part for floats
 28-Jan-02 AH  - Initial Version
======================================================================

http://www.codebase.nl/index.php/command/viewcode/id/106
Doesn't work properly in FireFox
orig: var re = /%(-)?(0| |'.)?(\d+)?(\.\d*)?([bcdfosxX]{1})/;
now:  var re = /%(-?)([0| |'.]?)((\d+)?)((\.\d*)?)([bcdfosxX]{1})/;
Fixed by Deminy on 2005-01-23 03:13:52
*/
	var iCount, iPadLength, aMatch, iMatchIndex = 1;
	var bAlignLeft, sPad, iWidth, iPrecision, sType;
	
	
	var aArgs = sprintf.arguments;
	if (aArgs.length < 2) return '';
	
	var sFormat = aArgs[0];
	var re = /%(-?)([0| |'.]?)((\d+)?)((\.\d*)?)([bcdfosxX]{1})/;
	while (re.test(sFormat))
	{
		aMatch = re.exec(sFormat);
		bAlignLeft = (aMatch[1] == '-');
		sPad = (aMatch[2] == '' ? ' ' : aMatch[2]);
		if (sPad.substring(0, 1) == "'") sPad = sPad.substring(1);
		iWidth = (aMatch[3] > 0 ? parseInt(aMatch[3]) : 0);
		iPrecision = (aMatch[5].length > 1 ? parseInt(aMatch[5].substring(1)) : 6);
		sType = aMatch[7];
		mArgument = (aArgs[iMatchIndex] != null ? aArgs[iMatchIndex] : '');
		++iMatchIndex;
		if (mArgument.toString().length)
		{
			if ('fbcdoxX'.indexOf(sType) != -1 && isNaN(mArgument)) mArgument = 0;
			switch (sType)
			{
				case 'f':	// floats
					var iPower = Math.pow(10, iPrecision);
					mArgument = (Math.round(parseFloat(mArgument) * iPower) / iPower).toString();
					var aFloatParts = mArgument.split('.');
					if (iPrecision > 0)
					{
						if (aFloatParts.length == 1) aFloatParts[1] = '';
						// pad with zeroes to precision
						for (iCount = aFloatParts[1].length; iCount < iPrecision; iCount++)
							aFloatParts[1] += '0';
						mArgument = aFloatParts[0] + '.' + aFloatParts[1];
					}
					else mArgument = aFloatParts[0];
					
					iPadLength = aFloatParts[0].length;
					break;
				case 'b':	// binary
					mArgument = parseInt(mArgument).toString(2);
					iPadLength = mArgument.length;
					break;
				case 'c':	// character
					mArgument = String.fromCharCode(parseInt(mArgument));
					break;
				case 'd':	// decimal
					mArgument = mArgument.toString();
					iPadLength = mArgument.length;
					break;
				case 'o':	// octal
					mArgument = parseInt(mArgument).toString(8);
					iPadLength = mArgument.length;
					break;
				case 'x':	// hexadecimal (lowercase)
					mArgument = parseInt(mArgument).toString(16);
					iPadLength = mArgument.length;
					break;
				case 'X':	// hexadecimal (uppercase)
					mArgument = parseInt(mArgument).toString(16).toUpperCase();
					iPadLength = mArgument.length;
					break;
				default:	// strings
					mArgument = mArgument.toString();
					iPadLength = mArgument.length;
			}
			
			if ('fbdoxX'.indexOf(sType) != -1)
			{
				// pad with padding-char to width
				if (bAlignLeft)
					for (iCount = iPadLength; iCount < iWidth; iCount++)
						mArgument += sPad;
				else
					for (iCount = iPadLength; iCount < iWidth; iCount++)
						mArgument = sPad + mArgument;
			}
		}
		sFormat = sFormat.replace(re, mArgument);
	}
	return sFormat;
}

