// The Tibetan calendar for 2005
//Phukluk
var cal = new Array(
	"2000/02/06*11-30+",
	"2000/03/07+04-",
	"2000/04/05*09-22+",
	"2000/05/05*03-",
	"2000/06/03*06-18+29-",
	"2000/07/02*",
	"2000/08/01*02-14+24-",
	"2000/08/30*27-",
	"2000/09/28*10+21-",
	"2000/10/28*25-",
	"2000/11/26*04+18-",
	"2000/12/26*08+12-",
	"2001/01/25*17-29+",
	"2001/02/24*12-",
	"2001/03/25*17-22+",
	"2001/04/24*10-26+",
	"2001/05/24*03-",
	"2001/06/22*06-22+28-",
	"2001/07/21*10-12+",
	"2001/08/20*02-19+24-",
	"2001/09/18*05-09+28-",
	"2001/10/17*14+21-",
	"2001/11/16*25-",
	"2001/12/15*07+20-",
	"2002/01/14*26-28+",
	"2002/02/13*19-",
	"2002/03/14*02+13-",
	"2002/04/13*17-26+",
	"2002/05/13*10-",
	"2002/06/11*13-21+",
	"2002/07/11*06-",
	"2002/08/09*09-18+",
	"2002/09/08*02-",
	"2002/10/07*05-13+28-",
	"2002/11/05*19+20-",
	"2002/12/05+03-06+26-",
	"2003/01/03*10+21-",
	"2003/02/02*26-",
	"2003/03/03*02+20-",
	"2003/04/02*06+13-",
	"2003/05/02*17-30+",
	"2003/06/01*10-",
	"2003/06/30*13-26+",
	"2003/07/30*06-",
	"2003/08/28*09-23+",
	"2003/09/27*02-",
	"2003/10/26*05-17+29-",
	"2003/11/24*",
	"2003/12/24*04-10+28-",
	"2004/01/22*13+22-",
	"2004/02/21*27-",
	"2004/03/21*05+20-",
	"2004/04/20*10+13-25-28+",
	"2004/05/20*17-",
	"2004/06/18*04+10-22-24+",
	"2004/07/18*13-",
	"2004/08/16*02+05-16-22+",
	"2004/09/15*09-27+",
	"2004/10/15*01-14-16+",
	"2004/11/13*06-21+30-",
	"2004/12/12*",
	"2005/01/11*05-13+29-",
	"2005/02/09*16+23-",
	"2005/03/11*27-",
	"2005/04/09*09+21-",
	"2005/05/09*25-",
	"2005/06/07*03+18-",
	"2005/07/07*20-30+",
	"2005/08/06+13-",
	"2005/09/04*16-26+",
	"2005/10/04*09-",
	"2005/11/02*13-20+",
	"2005/12/02*07-24+",
	"2006/01/01*01-",
	"2006/01/30*06-16+30-",
	"2006/02/28*19+23-",
	"2006/03/30*28-",
	"2006/04/28*12+22-",
	"2006/05/28*25-",
	"2006/06/26*08+18-",
	"2006/07/26*20-",
	"2006/08/24*05+13-",
	"2006/09/23*16-30+",
	"2006/10/23*10-",
	"2006/11/21*14-24+",
	"2006/12/21*08-27+",
	"2007/01/20*01-",
	"2007/02/18*07-19+",
	"2007/03/20*01-",
	"2007/04/18*05-12+29-",
	"2007/05/17*17+21-",
	"2007/06/16*03-07+25-",
	"2007/07/15*14+16-28-",
	"2007/08/13*04+20-",
	"2007/09/12*24-29+",
	"2007/10/12*17-",
	"2007/11/10*04+10-",
	"2007/12/10*15-27+",
	"2008/01/09*09-",
	"2008/02/07*15-18+",
	"2008/03/08*08-22+",
	"2008/04/07*02-",
	"2008/05/06+06-16+29-",
	"2008/06/04*",
	"2008/07/04*02-12+25-",
	"2008/08/02*27-",
	"2008/08/31*09+20-",
	"2008/09/30*24-",
	"2008/10/29*03+17-",
	"2008/11/28*23-26+",
	"2008/12/28*16-30+",
	"2009/01/27*10-",
	"2009/02/25*15-21+",
	"2009/03/27*09-25+",
	"2009/04/26*02-",
	"2009/05/25*06-20+29-",
	"2009/06/23*",
	"2009/07/23*02-17+24-",
	"2009/08/21*27-",
	"2009/09/19*13+20-",
	"2009/10/19*24-",
	"2009/11/17*07+18-",
	"2009/12/17*23-29+",
	"2010/01/16*17-",
	"2010/02/14*02+11-",
	"2010/03/16*16-25+",
	"2010/04/15*10-",
	"2010/05/14*14-19+",
	"2010/06/13*06-26+27-",
	"2010/07/12*09-16+",
	"2010/08/11*02-",
	"2010/09/09*05-12+28-",
	"2010/10/08*",
	"2010/11/07*02-06+25-",
	"2010/12/06*10+19-",
	"2011/01/05+24-",
	"2011/02/03*02+18-",
	"2011/03/05*05+12-",
	"2011/04/04*17-29+",
	"2011/05/04*10-",
	"2011/06/02*13-24+",
	"2011/07/02*06-",
	"2011/07/31*09-21+",
	"2011/08/30*02-",
	"2011/09/28*05-16+28-",
	"2011/10/27*",
	"2011/11/26*02-10+26-",
	"2011/12/25*13+20-",
	"2012/01/24*25-",
	"2012/02/22*05+19-",
	"2012/03/23*09+12-25-27+",
	"2012/04/22*17-",
	"2012/05/21*03+10-",
	"2012/06/20*13-29+",
	"2012/07/20*06-",
	"2012/08/18*09-25+",
	"2012/09/17*01-",
	"2012/10/16*05-20+29-",
	"2012/11/14*",
	"2012/12/14*03-13+27-",
	"2013/01/12*17+21-",
	"2013/02/11*26-",
	"2013/03/12*08+20-",
	"2013/04/11*24-",
	"2013/05/10*02+18-",
	"2013/06/09*21-28+",
	"2013/07/09*13-",
	"2013/08/07*16-24+",
	"2013/09/06*09-",
	"2013/10/05+12-20+",
	"2013/11/04*06-24+29-",
	"2013/12/03*",
	"2014/01/02*04-16+28-",
	"2014/01/31*",
	"2014/03/02*04-07+27-",
	"2014/03/31*12+21-",
	"2014/04/30*25-",
	"2014/05/29*06+18-",
	"2014/06/28*20-",
	"2014/07/27*03+13-",
	"2014/08/26*16-29+",
	"2014/09/25*09-",
	"2014/10/24*13-23+",
	"2014/11/23*06-",
	"2014/12/22*12-16+",
	"2015/01/21*05-19+30-",
	"2015/02/19*",
	"2015/03/21*04-11+28-",
	"2015/04/19*15+21-",
	"2015/05/19*25-",
	"2015/06/17*11+17-",
	"2015/07/17*20-",
	"2015/08/15*08+12-24-27+",
	"2015/09/14*16-",
	"2015/10/13*03+09-",
	"2015/11/12*13-27+",
	"2015/12/12*07-",
	"2016/01/10*12-19+",
	"2016/02/09*06-22+",
	"2016/03/10*01-",
	"2016/04/08*05-15+29-",
	"2016/05/07*",
	"2016/06/06+02-10+25-",
	"2016/07/05*28-",
	"2016/08/03*06+20-",
	"2016/09/02*23-",
	"2016/10/01*02+17-",
	"2016/10/31*21-26+",
	"2016/11/30*14-30+",
	"2016/12/30*08-",
	"2017/01/28*13-22+",
	"2017/02/27*08-25+",
	"2017/03/29*01-",
	"2017/04/27*06-19+29-",
	"2017/05/26*",
	"2017/06/25*02-14+25-",
	"2017/07/24*27-",
	"2017/08/22*11+20-",
	"2017/09/21*24-",
	"2017/10/20*06+17-",
	"2017/11/19*21-30+",
	"2017/12/19*15-",
	"2018/01/17*03+09-",
	"2018/02/16*15-25+",
	"2018/03/18*09-",
	"2018/04/16*13-18+",
	"2018/05/16*06-23+29-",
	"2018/06/14*",
	"2018/07/14*02-20+24-",
	"2018/08/12*05-10+28-",
	"2018/09/10*16+19-",
	"2018/10/10*02-05+24-",
	"2018/11/08*10+18-",
	"2018/12/08*22-",
	"2019/01/06*03+17-",
	"2019/02/05*06+10-",
	"2019/03/07+16-28+",
	"2019/04/06*09-",
	"2019/05/05*13-22+",
	"2019/06/04*06-",
	"2019/07/03*09-18+",
	"2019/08/02*02-",
	"2019/08/31*05-15+28-",
	"2019/09/29*",
	"2019/10/29*01-10+25-",
	"2019/11/27*14+18-",
	"2019/12/27*23-",
	"2020/01/25*05+18-"
	);
//Tsurluk
var cal2 = new Array(
	"2000/02/06*11-28+",
	"2000/03/07*05-",
	"2000/04/05*09-22+",
	"2000/05/05*03-",
	"2000/06/03*06-17+29-",
	"2000/07/02*",
	"2000/08/01*02-14+25-",
	"2000/08/30*28-",
	"2000/09/28*09+21-",
	"2000/10/28+25-",
	"2000/11/26*03+19-",
	"2000/12/26*06+13-",
	"2001/01/25*18-28+",
	"2001/02/24*12-",
	"2001/03/25*02+05-18-20+",
	"2001/04/24*10-26+",
	"2001/05/24*03-",
	"2001/06/22*06-22+29-",
	"2001/07/21*",
	"2001/08/20*02-18+24-",
	"2001/09/18*28-",
	"2001/10/17*13+22-",
	"2001/11/16*26-",
	"2001/12/15*06+20-",
	"2002/01/14*10+14-",
	"2002/02/13*19-",
	"2002/03/14*01+13-",
	"2002/04/13*17-25+",
	"2002/05/13*10-",
	"2002/06/11*14-21+",
	"2002/07/11*06-",
	"2002/08/09*09-17+",
	"2002/09/08*02-",
	"2002/10/07*05-13+29-",
	"2002/11/05*17+22-",
	"2002/12/05*27-",
	"2003/01/03*09+21-",
	"2003/02/02*27-30+",
	"2003/03/04*20-",
	"2003/04/02*05+14-",
	"2003/05/02*17-29+",
	"2003/06/01*11-",
	"2003/06/30+13-26+",
	"2003/07/30*06-",
	"2003/08/28*09-22+",
	"2003/09/27*02-",
	"2003/10/26*06-16+29-",
	"2003/11/24*",
	"2003/12/24*05-09+28-",
	"2004/01/22*12+23-",
	"2004/02/21*27-",
	"2004/03/21*04+21-",
	"2004/04/20*09+14-",
	"2004/05/20*18-",
	"2004/06/18*04+10-",
	"2004/07/18*13-",
	"2004/08/16*01+05-17-20+",
	"2004/09/15*09-26+",
	"2004/10/15*02-",
	"2004/11/13*06-20+30-",
	"2004/12/12*",
	"2005/01/11*05-12+29-",
	"2005/02/09*15+24-",
	"2005/03/11*28-",
	"2005/04/09*08+21-",
	"2005/05/09*25-",
	"2005/06/07*03+18-",
	"2005/07/07*21-29+",
	"2005/08/06*13-",
	"2005/09/04*16-25+",
	"2005/10/04*10-",
	"2005/11/02*14-19+",
	"2005/12/02*07-23+",
	"2006/01/01*01-",
	"2006/01/30*06-15+",
	"2006/03/01+01-18+24-",
	"2006/03/30*28-",
	"2006/04/28*12+22-",
	"2006/05/28*25-",
	"2006/06/26*07+18-",
	"2006/07/26*20-",
	"2006/08/24*04+13-",
	"2006/09/23*17-29+",
	"2006/10/23*10-",
	"2006/11/21*14-23+",
	"2006/12/21*08-26+",
	"2007/01/20*02-",
	"2007/02/18*07-18+",
	"2007/03/20*02-",
	"2007/04/18*06-11+29-",
	"2007/05/17*16+22-",
	"2007/06/16*04-05+25-",
	"2007/07/15*13+17-28-",
	"2007/08/13*03+20-",
	"2007/09/12*09+12-25-28+",
	"2007/10/12*17-",
	"2007/11/10*03+11-",
	"2007/12/10*15-26+",
	"2008/01/09*10-29+",
	"2008/02/08*03-",
	"2008/03/08*08-21+",
	"2008/04/07*02-",
	"2008/05/06*06-15+29-",
	"2008/06/04*",
	"2008/07/04*02-11+25-",
	"2008/08/02*28-",
	"2008/08/31*08+21-",
	"2008/09/30*24-",
	"2008/10/29*03+18-",
	"2008/11/28+07+11-",
	"2008/12/28*16-29+",
	"2009/01/27*11-",
	"2009/02/25*16-20+",
	"2009/03/27*09-25+",
	"2009/04/26*03-",
	"2009/05/25*06-20+29-",
	"2009/06/23*",
	"2009/07/23*02-16+25-",
	"2009/08/21*28-",
	"2009/09/19*12+21-",
	"2009/10/19*25-",
	"2009/11/17*06+19-",
	"2009/12/17*24-28+",
	"2010/01/16*18-",
	"2010/02/14*01+12-",
	"2010/03/16*16-24+",
	"2010/04/15*10-29+",
	"2010/05/15*02-14-18+",
	"2010/06/13*06-25+28-",
	"2010/07/12*10-15+",
	"2010/08/11*02-",
	"2010/09/09*05-11+28-",
	"2010/10/08*17+21-",
	"2010/11/07*26-",
	"2010/12/06*09+20-",
	"2011/01/05*25-",
	"2011/02/03*01+19-",
	"2011/03/05*04+13-",
	"2011/04/04*17-28+",
	"2011/05/04*10-",
	"2011/06/02*14-23+",
	"2011/07/02*06-",
	"2011/07/31+09-20+",
	"2011/08/30*02-",
	"2011/09/28*05-16+29-",
	"2011/10/27*",
	"2011/11/26*03-09+27-",
	"2011/12/25*12+21-",
	"2012/01/24*26-",
	"2012/02/22*04+20-",
	"2012/03/23*08+13-",
	"2012/04/22*17-",
	"2012/05/21*02+11-",
	"2012/06/20*14-28+",
	"2012/07/20*06-",
	"2012/08/18*09-25+",
	"2012/09/17*02-",
	"2012/10/16*06-19+29-",
	"2012/11/14*",
	"2012/12/14*03-12+28-",
	"2013/01/12*15+22-",
	"2013/02/11*27-",
	"2013/03/12*07+21-",
	"2013/04/11*25-",
	"2013/05/10*01+18-",
	"2013/06/09*07+09-21-27+",
	"2013/07/09*14-",
	"2013/08/07*16-24+",
	"2013/09/06*09-",
	"2013/10/05*13-19+",
	"2013/11/04*06-23+30-",
	"2013/12/03*",
	"2014/01/02*05-15+29-",
	"2014/01/31*18+23-",
	"2014/03/02*28-",
	"2014/03/31+11+21-",
	"2014/04/30*25-",
	"2014/05/29*05+18-",
	"2014/06/28*21-",
	"2014/07/27*02+13-",
	"2014/08/26*16-28+",
	"2014/09/25*09-",
	"2014/10/24*13-23+",
	"2014/11/23*07-27+30-",
	"2014/12/22*",
	"2015/01/21*06-18+30-",
	"2015/02/19*",
	"2015/03/21*05-10+28-",
	"2015/04/19*15+22-",
	"2015/05/19*25-",
	"2015/06/17*10+18-",
	"2015/07/17*21-",
	"2015/08/15*07+13-",
	"2015/09/14*17-",
	"2015/10/13*02+10-",
	"2015/11/12*14-26+",
	"2015/12/12*08-",
	"2016/01/10*14-17+",
	"2016/02/09*07-21+",
	"2016/03/10*01-",
	"2016/04/08*05-14+29-",
	"2016/05/07*",
	"2016/06/06*03-09+25-",
	"2016/07/05*28-",
	"2016/08/03*06+21-",
	"2016/09/02*24-",
	"2016/10/01*02+17-",
	"2016/10/31*07+09-22-25+",
	"2016/11/30*15-29+",
	"2016/12/30+09-",
	"2017/01/28*14-21+",
	"2017/02/27*08-24+",
	"2017/03/29*02-",
	"2017/04/27*06-18+29-",
	"2017/05/26*",
	"2017/06/25*02-14+25-",
	"2017/07/24*28-",
	"2017/08/22*11+21-",
	"2017/09/21*24-",
	"2017/10/20*06+18-",
	"2017/11/19*22-29+",
	"2017/12/19*16-",
	"2018/01/17*02+10-",
	"2018/02/16*15-24+",
	"2018/03/18*09-28+",
	"2018/04/17*02-14-16+",
	"2018/05/16*06-22+29-",
	"2018/06/14*",
	"2018/07/14*02-19+24-",
	"2018/08/12*06-09+28-",
	"2018/09/10*15+20-",
	"2018/10/10*25-",
	"2018/11/08*09+18-",
	"2018/12/08*23-",
	"2019/01/06*02+17-",
	"2019/02/05*05+11-",
	"2019/03/07*16-27+",
	"2019/04/06*10-",
	"2019/05/05*14-21+",
	"2019/06/04*07-",
	"2019/07/03*09-18+",
	"2019/08/02*02-",
	"2019/08/31+05-14+28-",
	"2019/09/29*",
	"2019/10/29*02-09+25-",
	"2019/11/27*13+19-",
	"2019/12/27*24-",
	"2020/01/25*04+18-"
	);
var annual = new Array (
	"01/01*Losar",
	"01/14*Milarepa Day",
	"04/07*Buddha's Birth",
	"04/15*Buddha's Enlightenment and Parinirvana",
	"06/04*Buddha's First Sermon",
	"09/22*Buddha's Return From Heaven"
	);

var monthly = new Array (
	"08*Medicine Buddha Day",
	"10*Guru Rinpoche Day",
	"15*Full Moon",
	"25*Dakini Day",
	"29*Protectors Day",
	"30*New Moon"
	);
	
function slash(date) {
    var daystr = "";
    for (var i=date.length-1; i >=0; i --) {
	if (daystr) 
	    daystr = daystr + "/" 
	if (date[i] < 10)
	    daystr = daystr + "0";
	daystr = daystr + date[i];
     }
    
    return daystr;
}

function makeOrdinal (nr) {
    var suffix = new Array ("th", "st", "nd", "rd", "th", 
			    "th", "th", "th", "th", "th");
    var str;
    if (nr >= 0) {
	str = "";
    } else {
	str = "2nd ";
	nr = -nr;
    }
    if (nr == 11 || nr == 12 || nr == 13) {
	str = str + nr + "th";
    } else {
	str = str + nr + suffix[nr%10];
    }
    return str;
}

function unslash (slashed) {
    var date = slashed.split("/");
    return new Array (
	parseInt(date[2],10),
	parseInt(date[1],10), 
	parseInt(date[0],10));
}

function lookup(cal, daystr) {
    var n = daystr.length;
    for (i = 0; i < cal.length; i ++) {
	if (cal[i].substr(0, n) > daystr) {
	    return i-1;
	}
    }
    return -1;
}

function dayNumber(date) {
    date[2] = date[2] - 1900;
    var day = Math.floor(365.25 * date[2]) + 
	Math.floor(30.55 * (date[1] + 2)) + date[0] - 91;
    if (date[1] > 2) {
	if (date[2] && date[2] % 4 == 0) {
	    day = day - 1;
	} else {
	    day = day - 2;
	}
    }
    return day;
}

function calcTibetanDate (cal, date) {
    var daystr = slash(date);
    var i = lookup(cal, daystr);
    var m = 0;
    var d = 0;
    if (i >= 0) {
	for (var j=0; j<i; j++) {
	    if (cal[j].substr(10,1) != "+")
		m ++;
	}
	m = m % 12;
	if (cal[i].substr(10,1) == "+") {
	    m = -m;
	} else {
	    m = m + 1;
	}
	var d = dayNumber(date) - dayNumber(unslash(cal[i].substr(0,10))) + 1;
	for (j=11; j<cal[i].length; j+=3) {
	    s = parseInt(cal[i].substr(j,2),10);
	    if (d < s)
		break;
	    k = cal[i].charAt(j+2);
	    if (k == "+" && d != s) { 
		if (-- d == s)
		    d = -d;
	    } else if (k == "-") {
		d++;
	    }
	}
    }
    return new Array (d, m);
}

function holiday (cal, date) {
    var daystr = slash (date);
    var i = lookup (cal, daystr);
    var n = cal[0].indexOf("*");
    if (i >= 0 && cal[i].substr(0,n) == daystr) {
	daystr = cal[i].substr(n+1);
    } else {
	daystr = ""
    }
    return daystr
}

function strTibetanDate(tdate) {
    var str = "";
    if (tdate[0]) {
	str = makeOrdinal(tdate[0]) + " day of the ";
	str = str + makeOrdinal(tdate[1]) + " month";
	var hday = holiday (annual, tdate);
	if (hday) {
	    str = str + "<br />\n" + hday;
	} else {
	    td = new Array (1);
	    td[0] = tdate[0];
	    hday = holiday (monthly, td);
	    if (hday) {
		str = str + "<br />\n" + hday;
	    }
	}
    }
    return str;
}

function getTibetanDate (mode, name) {
    var time;
    if (arguments.length < 2) {
	time = new Date();
    } else {
	time = new Date(name);
    }
    var date = new Array (time.getDate(), 
			  time.getMonth()+1, 
			  time.getFullYear());
    var tdate;
    if (mode == "t") {
	tdate = calcTibetanDate (cal2, date); // Tsurluk
    } else {
	tdate = calcTibetanDate (cal, date); // Phukluk
    }
    var tname = strTibetanDate (tdate);
    return tname;
}
