var dkSolar = 0;
var dkGregorian = 1;

function IsLeapYear(DateKind, Year)
{
	if (DateKind == dkSolar)
		return ((((Year + 38) * 31) % 128) <= 30);
	else
		return (((Year % 4) == 0) && (((Year % 100) != 0) || ((Year % 400) == 0)));
}

function GregorianToSolar(gYear, gMonth, gDay) {
	  if (gDay == 0 && gMonth == 0 && gYear == 0)	{
				dDate = new Date();
	
				gDay = dDate.getDate();
				gMonth = dDate.getMonth() + 1;
				gYear = dDate.getFullYear();
	  }

	gYear = (gYear== 0) ? 2000 : gYear;
	(gYear<1000) ? (gYear += 2000) : true;
	gYear -= ( (gMonth < 3) || ((gMonth == 3) && (gDay < 21)) ) ? 622 : 621;
	switch (gMonth) { 
		case 1: (gDay<21)? (gMonth=10, gDay+=10):(gMonth=11, gDay-=20); break; 
		case 2: (gDay<20)? (gMonth=11, gDay+=11):(gMonth=12, gDay-=19); break; 
		case 3: (gDay<21)? (gMonth=12, gDay+=9):(gMonth=1, gDay-=20); break; 
		case 4: (gDay<21)? (gMonth=1, gDay+=11):(gMonth=2, gDay-=20); break; 
		case 5: 
		case 6: (gDay<22)? (gMonth-=3, gDay+=10):(gMonth-=2, gDay-=21); break; 
		case 7: 
		case 8: 
		case 9: (gDay<23)? (gMonth-=3, gDay+=9):(gMonth-=2, gDay-=22); break; 
		case 10:(gDay<23)? (gMonth=7, gDay+=8):(gMonth=8, gDay-=22); break; 
		case 11:(gDay<22)? (gMonth-=3, gDay+=10):(gMonth-=2, gDay-=21); break;
		case 12:(gDay<22)? (gMonth-=3, gDay+=9):(gMonth-=2, gDay-=21); break; 
		default: break; 
	}

		this.gYear = gYear;
		this.gMonth = gMonth - 1;
		this.gDay = gDay;

		this.getDate  = function () { return this.gDay; };
		this.getMonth = function () { return this.gMonth; };
		this.getYear  = function () { return this.gYear; };
		this.getFullYear = function () { return this.gYear; };
}

function SolarToGregorian(sYear, sMonth, sDay) {

    if (sDay == 0 && sMonth == 0 && sYear == 0) {
			dDate = new Date();

			return dDate;
    }

    //'******************* Leap year
    if (sYear == 1378 || sYear == 1382 || sYear == 1386) {
        if (sMonth == 12 && sDay == 10)
            { sYear = 2000; sMonth = 2; sDay = 29; return; }

        if (sMonth == 12 && sDay > 10)
            sDay --;
    }
    else
    	if (sYear == 1379 || sYear == 1383 || sYear == 1387) {
        sDay --;

        if (sDay == 0) {
            sMonth --;
            if (sMonth > 0 && sMonth < 7) sDay = 31;
            if (sMonth > 6) sDay = 30;
            if (sMonth == 0){
                sDay = 29;
                sMonth = 12;
                sYear --;
            }
        }
    }
    //'*******************

    if (sMonth < 10 || (sMonth == 10 && sDay < 11))
        sYear += 621;
    else
        sYear += 622;

    switch (sMonth) {
        case 1: (sDay < 12) ? (sMonth = 3, sDay += 20) : (sMonth = 4, sDay -= 11); break;
        case 2: (sDay < 11) ? (sMonth = 4, sDay += 20) : (sMonth = 5, sDay -= 10); break;
        case 3: (sDay < 11) ? (sMonth = 5, sDay += 21) : (sMonth = 6, sDay -= 10); break;
        case 4: (sDay < 10) ? (sMonth = 6, sDay += 21) : (sMonth = 7, sDay -= 9);  break;
        case 5:
        case 6:
        case 8: (sDay < 10) ? (sMonth += 2, sDay += 22) : (sMonth += 3, sDay -= 9); break;
        case 7: (sDay < 9) ? (sMonth = 9, sDay += 22) : (sMonth = 10, sDay -= 8); break;
        case 9: (sDay < 10) ? (sMonth = 11, sDay += 21) : (sMonth = 12, sDay -= 9); break;
        case 10: (sDay < 11) ? (sMonth = 12, sDay += 21) : (sMonth = 1, sDay -= 10); break;
        case 11: (sDay < 12) ? (sMonth = 1, sDay += 20) : (sMonth = 2, sDay -= 11); break;
        case 12: (sDay < 10) ? (sMonth = 2, sDay += 19) : (sMonth = 3, sDay -= 9); break;
    }

		var retDate = new Date(sYear, sMonth - 1, sDay);

		return retDate;
}

