gdinm = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
jdinm = [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29];
jweek = [1, 2, 3, 4, 5, 6, 0];
jmonth = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
//incal = {'1388_1_21': {name: 'علی', bday:1367}, '4_23': {name: 'علی', bday:1367}};

function div(a,b)
{
	return Math.floor(a/b);
}

function g2jdate (g_y,g_m,g_d)
{
	
	var gy = g_y-1600;
	var gm = g_m-1;
	var gd = g_d-1;
	var gdno = 365*gy+div(gy+3,4)-div(gy+99,100)+div(gy+399,400);
	for(var i=0; i<gm; ++i){
		gdno += gdinm[i];
	}
	if(gm>1 && ((gy%4==0 && gy%100!=0) || (gy%400==0))) gdno++;
	gdno += gd;
	var jdno = gdno-79;
	
	var j_np = div(jdno,12053);
	var jdno = jdno % 12053;
	
	var jy = 979+33*j_np + 4*div(jdno,1461);
	jdno %= 1461;
	if(jdno >= 366){
		jy += div(jdno-1,365);
		jdno = (jdno-1)%365;
	}
	for(var i=0; i<11 && jdno >= jdinm[i]; ++i){
		jdno -= jdinm[i];
	}
	jm = i+1;
	jd = jdno + 1;
	return [jy,jm,jd];
}

function j2gdate($j_y, $j_m, $j_d)								 
{ 
	$g_days_in_month = gdinm; 
    $j_days_in_month = jdinm;
	
	var $jy = $j_y-979;
	var $jm = $j_m-1; 
	var $jd = $j_d-1; 

	var $j_day_no = 365*$jy + div($jy, 33)*8 + div($jy%33+3, 4); 
	
	for ($i=0; $i < $jm; ++$i)
		$j_day_no += $j_days_in_month[$i];
		
	$j_day_no += $jd; 

	var $g_day_no = $j_day_no+79; 

	var $gy = 1600 + 400*div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */ 
	var $g_day_no = $g_day_no % 146097; 

	var $leap = true; 
	if ($g_day_no >= 36525) { /* 36525 = 365*100 + 100/4 */ 
		$g_day_no--; 
		$gy += 100*div($g_day_no,  36524); /* 36524 = 365*100 + 100/4 - 100/100 */
		$g_day_no = $g_day_no % 36524; 

		if ($g_day_no >= 365)
			$g_day_no++;
		else
			$leap = false;
	}
	
	$gy += 4*div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
	$g_day_no %= 1461; 
	
	if ($g_day_no >= 366) {
		$leap = false; 
		
		$g_day_no--;
		$gy += div($g_day_no, 365);
		$g_day_no = $g_day_no % 365;
	}
	
	for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
		$g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
		
	$gm = $i+1;
	$gd = $g_day_no+1; 

   	return [$gy, $gm, $gd]; 
}

function makeCalendar($year, $month)
{
	var firstd = j2gdate($year, $month, 1);
	var gtoday = new Date();
	var jtoday = g2jdate(gtoday.getFullYear(), gtoday.getMonth()+1, gtoday.getDate());
	var lastd = j2gdate($year, $month, jdinm[$month-1]);
	var firstday = new Date(firstd[0], firstd[1]-1, firstd[2]);
	
	var nextY = Number($year);
	var nextM = Number($month)+1;
	var todaytext = jtoday[0]+'_'+jtoday[1]+'_'+jtoday[2];
	subDate(todaytext, jtoday[0]);
	
	if(nextM > 12){
		nextM = 1;
		nextY++;
	}
	nextM = nextY+'_'+nextM;
	
	var prevY = Number($year)
	var prevM = Number($month)-1
	if(prevM < 1){
		prevM = 12;
		prevY--;
	}
	prevM = prevY+'_'+prevM;
	
	$('nextM').lang = nextM;
	$('prevM').lang = prevM;
	
	$('calendar').set('html', '');
	$('calendartop').set('html', $year+' '+jmonth[$month-1]);
	var div = null;
	
	for(i=0; i<jweek[firstday.getDay()]; i++){
		var div = new Element('DIV',{ 'html': ''
						  			, 'class': 'day'
						  			})
		$('calendar').adopt(div);
	}
	
	var $gday = 0;
	var $d = 1;
	var tincal = false;
	do {
		$gday = j2gdate($year, $month, $d);
		tincal = (typeof(window.incal[$year+'_'+$month+'_'+$d])!='undefined' || typeof(window.incal[$month+'_'+$d])!='undefined');
		div = new Element('DIV',{ 'html': $d
						  		, 'class': 'day'+(($gday[0]==gtoday.getFullYear() && $gday[1]==(gtoday.getMonth()+1) && $gday[2]==gtoday.getDate())? ' today' : '') + (tincal? ' underlined' : '')
								, 'id' : $year+'_'+$month+'_'+$d
								, 'lang' : $year
								, 'rel' : todaytext
								, 'events': {
												'mouseover': function() {
																subDate(this.id, this.lang)
															 }
												,
												'mouseout': function(){
																subDate(this.get('rel'), this.lang);
															}
											}
						  		});
		$('calendar').adopt(div);
		$d++;
	} while( !($gday[2]==lastd[2] && $gday[1]==lastd[1]) );
}

function calendar(inp)
{
	$('calpage').addClass('hidden');
	$('calload').removeClass('hidden');
	
	if(typeof(inp) == 'undefined'){
		var today = new Date();
		inp = g2jdate(today.getFullYear(), today.getMonth()+1, today.getDate());
	}else{
		inp = inp.split(/_/);
	}
	
	$('calload').addClass('hidden');
	$('calpage').removeClass('hidden');
	makeCalendar(inp[0], inp[1]);
}

function subDate(inp, $year){
	var out = '';
	
	if(typeof(inp)!='undefined'){
		if(typeof(window.incal[inp])!='undefined'){
			for(i in window.incal[inp]){
				out += (window.incal[inp][i]['desc']);
				out += '<br />';
			}
		}
		inp = inp.split(/_/);
		var obj = inp[1]+'_'+inp[2];
		if(typeof(window.incal[obj])!='undefined'){
			for(i in window.incal[obj]){
				if(window.incal[obj][i]['bday'])
					out += 'تولد '+String(Number($year)-Number(window.incal[obj][i]['bday']))+' سالگی ';
				out += (window.incal[obj][i]['desc']);
				if(window.incal[obj][i]['img'])
					out += '<br /><img src="http://yasii.ir/zolal/callendar/images/'+window.incal[obj][i]['img']+'.jpg" />';
				out += '<br />';
			}
		}
	}
	$('calsub').set('html', out);
}

function haveCalendar(){
	var time = 1;
	
	while(typeof(window.incal) == 'undefined'){
		time++;
		if(time > 3000){
			window.incal = {};
			break;
		}
	}
	
	calendar();
}