Login   Register  
PHP Classes
elePHPant
Icontem

File: HijriCalendar.class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Hossam Suliman  >  One Hijri Year Calendar  >  HijriCalendar.class.php  >  Download  
File: HijriCalendar.class.php
Role: Class source
Content type: text/plain
Description: Main Class
Class: One Hijri Year Calendar
Display a month or an year of the Hijri calendar
Author: By
Last change: - Make it accessible without user login.
Date: 2012-12-03 13:33
Size: 19,740 bytes
 

Contents

Class file image Download
<?php

/**
 * HijriCalendar class.
 *
 * A class to get (print) one Hijri year calendar (based on 'Umm al-Qura').
 * 
 * @version: 1.0.
 * @author: Hossamzee.
 * @date: 3 Dec 2012.
 *
 * @notes:
 * - This code has not been written from scratch, rather it has been written using alot of other resources.
 * - I used word 'Miladi' as an alternative word of 'Gregorian', but they both have same return.
 * 
 * @related_classes: 
 *
 * @thanks_to:
 * - [Gent, R.H. van] for amazing codes for [Miladi (Gregorian) to Hijri converting].
 * - [Layth A. Ibraheem] for amazing codes for [Hijri To Gregorian Date Convert].
 *
 * @see:
 * - {http://www.staff.science.uu.nl/~gent0113/islam/ummalqura.htm}.
 * - {http://www.phpclasses.org/package/6848-PHP-Convert-dates-between-Gregorian-to-Hijri-calendars.html}.
 */

class HijriCalendar{

	/**
	 * Variables.
	 */

	/**
	 * Data of days getting from 'Umm al-Qura'.
	 * @author: Gent, R.H. van.
	 * @see: {http://www.staff.science.uu.nl/~gent0113/islam/ummalqura.htm}.
	 */
	private $ummalquraData = array(
				28607,28636,28665,28695,28724,28754,28783,28813,28843,28872,28901,28931,
				28960,28990,29019,29049,29078,29108,29137,29167,29196,29226,29255,29285,
				29315,29345,29375,29404,29434,29463,29492,29522,29551,29580,29610,29640,
				29669,29699,29729,29759,29788,29818,29847,29876,29906,29935,29964,29994,
				30023,30053,30082,30112,30141,30171,30200,30230,30259,30289,30318,30348,
				30378,30408,30437,30467,30496,30526,30555,30585,30614,30644,30673,30703,
				30732,30762,30791,30821,30850,30880,30909,30939,30968,30998,31027,31057,
				31086,31116,31145,31175,31204,31234,31263,31293,31322,31352,31381,31411,
				31441,31471,31500,31530,31559,31589,31618,31648,31676,31706,31736,31766,
				31795,31825,31854,31884,31913,31943,31972,32002,32031,32061,32090,32120,
				32150,32180,32209,32239,32268,32298,32327,32357,32386,32416,32445,32475,
				32504,32534,32563,32593,32622,32652,32681,32711,32740,32770,32799,32829,
				32858,32888,32917,32947,32976,33006,33035,33065,33094,33124,33153,33183,
				33213,33243,33272,33302,33331,33361,33390,33420,33450,33479,33509,33539,
				33568,33598,33627,33657,33686,33716,33745,33775,33804,33834,33863,33893,
				33922,33952,33981,34011,34040,34069,34099,34128,34158,34187,34217,34247,
				34277,34306,34336,34365,34395,34424,34454,34483,34512,34542,34571,34601,
				34631,34660,34690,34719,34749,34778,34808,34837,34867,34896,34926,34955,
				34985,35015,35044,35074,35103,35133,35162,35192,35222,35251,35280,35310,
				35340,35370,35399,35429,35458,35488,35517,35547,35576,35605,35635,35665,
				35694,35723,35753,35782,35811,35841,35871,35901,35930,35960,35989,36019,
				36048,36078,36107,36136,36166,36195,36225,36254,36284,36314,36343,36373,
				36403,36433,36462,36492,36521,36551,36580,36610,36639,36669,36698,36728,
				36757,36786,36816,36845,36875,36904,36934,36963,36993,37022,37052,37081,
				37111,37141,37170,37200,37229,37259,37288,37318,37347,37377,37406,37436,
				37465,37495,37524,37554,37584,37613,37643,37672,37701,37731,37760,37790,
				37819,37849,37878,37908,37938,37967,37997,38027,38056,38085,38115,38144,
				38174,38203,38233,38262,38292,38322,38351,38381,38410,38440,38469,38499,
				38528,38558,38587,38617,38646,38676,38705,38735,38764,38794,38823,38853,
				38882,38912,38941,38971,39001,39030,39059,39089,39118,39148,39178,39208,
				39237,39267,39297,39326,39355,39385,39414,39444,39473,39503,39532,39562,
				39592,39621,39650,39680,39709,39739,39768,39798,39827,39857,39886,39916,
				39946,39975,40005,40035,40064,40094,40123,40153,40182,40212,40241,40271,
				40300,40330,40359,40389,40418,40448,40477,40507,40536,40566,40595,40625,
				40655,40685,40714,40744,40773,40803,40832,40862,40892,40921,40951,40980,
				41009,41039,41068,41098,41127,41157,41186,41216,41245,41275,41304,41334,
				41364,41393,41422,41452,41481,41511,41540,41570,41599,41629,41658,41688,
				41718,41748,41777,41807,41836,41865,41894,41924,41953,41983,42012,42042,
				42072,42102,42131,42161,42190,42220,42249,42279,42308,42337,42367,42397,
				42426,42456,42485,42515,42545,42574,42604,42633,42662,42692,42721,42751,
				42780,42810,42839,42869,42899,42929,42958,42988,43017,43046,43076,43105,
				43135,43164,43194,43223,43253,43283,43312,43342,43371,43401,43430,43460,
				43489,43519,43548,43578,43607,43637,43666,43696,43726,43755,43785,43814,
				43844,43873,43903,43932,43962,43991,44021,44050,44080,44109,44139,44169,
				44198,44228,44258,44287,44317,44346,44375,44405,44434,44464,44493,44523,
				44553,44582,44612,44641,44671,44700,44730,44759,44788,44818,44847,44877,
				44906,44936,44966,44996,45025,45055,45084,45114,45143,45172,45202,45231,
				45261,45290,45320,45350,45380,45409,45439,45468,45498,45527,45556,45586,
				45615,45644,45674,45704,45733,45763,45793,45823,45852,45882,45911,45940,
				45970,45999,46028,46058,46088,46117,46147,46177,46206,46236,46265,46295,
				46324,46354,46383,46413,46442,46472,46501,46531,46560,46590,46620,46649,
				46679,46708,46738,46767,46797,46826,46856,46885,46915,46944,46974,47003,
				47033,47063,47092,47122,47151,47181,47210,47240,47269,47298,47328,47357,
				47387,47417,47446,47476,47506,47535,47565,47594,47624,47653,47682,47712,
				47741,47771,47800,47830,47860,47890,47919,47949,47978,48008,48037,48066,
				48096,48125,48155,48184,48214,48244,48273,48303,48333,48362,48392,48421,
				48450,48480,48509,48538,48568,48598,48627,48657,48687,48717,48746,48776,
				48805,48834,48864,48893,48922,48952,48982,49011,49041,49071,49100,49130,
				49160,49189,49218,49248,49277,49306,49336,49365,49395,49425,49455,49484,
				49514,49543,49573,49602,49632,49661,49690,49720,49749,49779,49809,49838,
				49868,49898,49927,49957,49986,50016,50045,50075,50104,50133,50163,50192,
				50222,50252,50281,50311,50340,50370,50400,50429,50459,50488,50518,50547,
				50576,50606,50635,50665,50694,50724,50754,50784,50813,50843,50872,50902,
				50931,50960,50990,51019,51049,51078,51108,51138,51167,51197,51227,51256,
				51286,51315,51345,51374,51403,51433,51462,51492,51522,51552,51582,51611,
				51641,51670,51699,51729,51758,51787,51816,51846,51876,51906,51936,51965,
				51995,52025,52054,52083,52113,52142,52171,52200,52230,52260,52290,52319,
				52349,52379,52408,52438,52467,52497,52526,52555,52585,52614,52644,52673,
				52703,52733,52762,52792,52822,52851,52881,52910,52939,52969,52998,53028,
				53057,53087,53116,53146,53176,53205,53235,53264,53294,53324,53353,53383,
				53412,53441,53471,53500,53530,53559,53589,53619,53648,53678,53708,53737,
				53767,53796,53825,53855,53884,53913,53943,53973,54003,54032,54062,54092,
				54121,54151,54180,54209,54239,54268,54297,54327,54357,54387,54416,54446,
				54476,54505,54535,54564,54593,54623,54652,54681,54711,54741,54770,54800,
				54830,54859,54889,54919,54948,54977,55007,55036,55066,55095,55125,55154,
				55184,55213,55243,55273,55302,55332,55361,55391,55420,55450,55479,55508,
				55538,55567,55597,55627,55657,55686,55716,55745,55775,55804,55834,55863,
				55892,55922,55951,55981,56011,56040,56070,56100,56129,56159,56188,56218,
				56247,56276,56306,56335,56365,56394,56424,56454,56483,56513,56543,56572,
				56601,56631,56660,56690,56719,56749,56778,56808,56837,56867,56897,56926,
				56956,56985,57015,57044,57074,57103,57133,57162,57192,57221,57251,57280,
				57310,57340,57369,57399,57429,57458,57487,57517,57546,57576,57605,57634,
				57664,57694,57723,57753,57783,57813,57842,57871,57901,57930,57959,57989,
				58018,58048,58077,58107,58137,58167,58196,58226,58255,58285,58314,58343,
				58373,58402,58432,58461,58491,58521,58551,58580,58610,58639,58669,58698,
				58727,58757,58786,58816,58845,58875,58905,58934,58964,58994,59023,59053,
				59082,59111,59141,59170,59200,59229,59259,59288,59318,59348,59377,59407,
				59436,59466,59495,59525,59554,59584,59613,59643,59672,59702,59731,59761,
				59791,59820,59850,59879,59909,59939,59968,59997,60027,60056,60086,60115,
				60145,60174,60204,60234,60264,60293,60323,60352,60381,60411,60440,60469,
				60499,60528,60558,60588,60618,60648,60677,60707,60736,60765,60795,60824,
				60853,60883,60912,60942,60972,61002,61031,61061,61090,61120,61149,61179,
				61208,61237,61267,61296,61326,61356,61385,61415,61445,61474,61504,61533,
				61563,61592,61621,61651,61680,61710,61739,61769,61799,61828,61858,61888,
				61917,61947,61976,62006,62035,62064,62094,62123,62153,62182,62212,62242,
				62271,62301,62331,62360,62390,62419,62448,62478,62507,62537,62566,62596,
				62625,62655,62685,62715,62744,62774,62803,62832,62862,62891,62921,62950,
				62980,63009,63039,63069,63099,63128,63157,63187,63216,63246,63275,63305,
				63334,63363,63393,63423,63453,63482,63512,63541,63571,63600,63630,63659,
				63689,63718,63747,63777,63807,63836,63866,63895,63925,63955,63984,64014,
				64043,64073,64102,64131,64161,64190,64220,64249,64279,64309,64339,64368,
				64398,64427,64457,64486,64515,64545,64574,64603,64633,64663,64692,64722,
				64752,64782,64811,64841,64870,64899,64929,64958,64987,65017,65047,65076,
				65106,65136,65166,65195,65225,65254,65283,65313,65342,65371,65401,65431,
				65460,65490,65520,65549,65579,65608,65638,65667,65697,65726,65755,65785,
				65815,65844,65874,65903,65933,65963,65992,66022,66051,66081,66110,66140,
				66169,66199,66228,66258,66287,66317,66346,66376,66405,66435,66465,66494,
				66524,66553,66583,66612,66641,66671,66700,66730,66760,66789,66819,66849,
				66878,66908,66937,66967,66996,67025,67055,67084,67114,67143,67173,67203,
				67233,67262,67292,67321,67351,67380,67409,67439,67468,67497,67527,67557,
				67587,67617,67646,67676,67705,67735,67764,67793,67823,67852,67882,67911,
				67941,67971,68000,68030,68060,68089,68119,68148,68177,68207,68236,68266,
				68295,68325,68354,68384,68414,68443,68473,68502,68532,68561,68591,68620,
				68650,68679,68708,68738,68768,68797,68827,68857,68886,68916,68946,68975,
				69004,69034,69063,69092,69122,69152,69181,69211,69240,69270,69300,69330,
				69359,69388,69418,69447,69476,69506,69535,69565,69595,69624,69654,69684,
				69713,69743,69772,69802,69831,69861,69890,69919,69949,69978,70008,70038,
				70067,70097,70126,70156,70186,70215,70245,70274,70303,70333,70362,70392,
				70421,70451,70481,70510,70540,70570,70599,70629,70658,70687,70717,70746,
				70776,70805,70835,70864,70894,70924,70954,70983,71013,71042,71071,71101,
				71130,71159,71189,71218,71248,71278,71308,71337,71367,71397,71426,71455,
				71485,71514,71543,71573,71602,71632,71662,71691,71721,71751,71781,71810,
				71839,71869,71898,71927,71957,71986,72016,72046,72075,72105,72135,72164,
				72194,72223,72253,72282,72311,72341,72370,72400,72429,72459,72489,72518,
				72548,72577,72607,72637,72666,72695,72725,72754,72784,72813,72843,72872,
				72902,72931,72961,72991,73020,73050,73080,73109,73139,73168,73197,73227,
				73256,73286,73315,73345,73375,73404,73434,73464,73493,73523,73552,73581,
				73611,73640,73669,73699,73729,73758,73788,73818,73848,73877,73907,73936,
				73965,73995,74024,74053,74083,74113,74142,74172,74202,74231,74261,74291,
				74320,74349,74379,74408,74437,74467,74497,74526,74556,74586,74615,74645,
				74675,74704,74733,74763,74792,74822,74851,74881,74910,74940,74969,74999,
				75029,75058,75088,75117,75147,75176,75206,75235,75264,75294,75323,75353,
				75383,75412,75442,75472,75501,75531,75560,75590,75619,75648,75678,75707,
				75737,75766,75796,75826,75856,75885,75915,75944,75974,76003,76032,76062,
				76091,76121,76150,76180,76210,76239,76269,76299,76328,76358,76387,76416,
				76446,76475,76505,76534,76564,76593,76623,76653,76682,76712,76741,76771,
				76801,76830,76859,76889,76918,76948,76977,77007,77036,77066,77096,77125,
				77155,77185,77214,77243,77273,77302,77332,77361,77390,77420,77450,77479,
				77509,77539,77569,77598,77627,77657,77686,77715,77745,77774,77804,77833,
				77863,77893,77923,77952,77982,78011,78041,78070,78099,78129,78158,78188,
				78217,78247,78277,78307,78336,78366,78395,78425,78454,78483,78513,78542,
				78572,78601,78631,78661,78690,78720,78750,78779,78808,78838,78867,78897,
				78926,78956,78985,79015,79044,79074,79104,79133,79163,79192,79222,79251,
				79281,79310,79340,79369,79399,79428,79458,79487,79517,79546,79576,79606,
				79635,79665,79695,79724,79753,79783,79812,79841,79871,79900,79930,79960,
				79990,
	);
	
	/**
	 * Hijri months.
	 * @author: Hossamzee.
	 */
	private $hijriMonths = array(
		"Muharram", "Safar", "Rabi' al-awwal", "Rabi' al-thani", "Jumada al-awwal", "Jumada al-thani",
		"Rajab", "Sha'aban", "Ramadan", "Shawwal", "Dhu al-Qi'dah", "Dhu al-Hijjah"
	);
	
	/**
	 * Hijri weekdays.
	 * @author: Hossamzee.
	 */
	private $hijriWeekdays = array(
		0 => 1, // Sun => 1
		1 => 2, // Mon => 2
		2 => 3, // Tue => 3
		3 => 4, // Wed => 4
		4 => 5, // Thu => 5
		5 => 6, // Fri => 6
		6 => 0, // Sat => 0
	);
	
	/**
	 * Hijri year to be gotten.
	 * @author: Hossamzee.
	 */
	public $hijriYear = 1433;
	
	/**
	 * Methods.
	 */
	
	/**
	 * get a calendar of one Hijri year.
	 * @author: Hossamzee.
	 */
	public function getHijriYearCalendar()
	{
		$table = "<table><tr><th colspan='4'><h2>$this->hijriYear</h2></th></tr><tr>";

		for ($hijriMonth=1; $hijriMonth<=12; $hijriMonth++)
		{
			$table .= "<td valign='top'>";
			$table .= $this->getOneHijriMonthCalendar($hijriMonth);
			$table .= "</td>";
		
			/**
			 * Check if this month is last month on the row.
			 */
			if ($hijriMonth % 4 == 0)
			{
				$table .= "</tr><tr>";
			}
		}

		$table .= "</tr></table>";
	
		/**
		 * Return a table containing all (12) Hijri months.
		 */
		return $table;
	}
	
	/**
	 * get a calendar of one Hijri month.
	 * @author: Hossamzee.
	 */
	public function getOneHijriMonthCalendar($hijriMonth)
	{
		$miladi = $this->hijriToMiladi(1, $hijriMonth, $this->hijriYear);
		$dateInfo = $this->dateInfo($miladi["day"], $miladi["month"], $miladi["year"]);
		$hijriDay = $dateInfo["hijriDay"];

		/**
		  * Convert Julian day to Unix timestamp.
		  */
		$startTime = jdToUnix($dateInfo["julianDay"]);

		/**
		 * Check if the hijri day is not the first.
		 */
		if ($hijriDay > 1)
		{
			$startTime = $startTime - (($hijriDay-1) * (24*60*60)); 
			$dateInfo = $this->dateInfo(date("d", $startTime), date("m", $startTime), date("Y", $startTime));
		}

		$hijriMonthName = $this->hijriMonths[$hijriMonth-1];
		$weekday = $dateInfo["hijriWeekday"];
	
		$table  = "<table border='1'>";
		$table .= "<tr><th colspan='7'><center><b>$hijriMonthName</b></center></th></tr>";
		$table .= "<tr><th>Sat</th><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th></tr><tr>";

		if ($weekday != 0)
		{
			$table .= "<td colspan='$weekday'>&nbsp;</td>";
		}

		/**
		 * Start looping about it.
		 */
		for ($day=1; $day<=$dateInfo["hijriMonthLength"]; $day++)
		{
			$thisTime = $startTime + (($day-1) * (24*60*60));
			$thisMiladiDate = date("dM", $thisTime);

			$table .= "<td>$day</td>";
		
			if ($weekday == 6)
			{
				$table .= "</tr><tr>";
			}
		
			/**
			 * Do not pass 6, ever.
			 */
			$weekday = ($weekday+1)%7;
		}

		if ($weekday != 0)
		{
			$diffWeekday = (6-$weekday) + 1;
			$table .= "<td colspan='$diffWeekday'>&nbsp;</td>";
		}
	
		$table .= "</tr></table>";
	
		/**
		 * Return a table containing all (29 or 30) Hijri month days.
		 */
		return $table;
	}
	
	/**
	 * Take the integer part of float.
	 * @author: Layth A. Ibraheem.
	 * @see: {http://www.phpclasses.org/package/6848-PHP-Convert-dates-between-Gregorian-to-Hijri-calendars.html}.
	 */
	private function int($float)
	{
		if ($float < -0.0000001)
		{
			return ceil($float-0.0000001);
		}
		
		return floor($float+0.0000001);
	}
	
	/**
	 * Convert a Hijri date into Miladi.
	 * @author: Layth A. Ibraheem.
	 * @see: {http://www.phpclasses.org/package/6848-PHP-Convert-dates-between-Gregorian-to-Hijri-calendars.html}.
	 */
	private function hijriToMiladi($miladiDay, $miladiMonth, $miladiYear)
	{
		$d = $miladiDay;
		$m = $miladiMonth;
		$y = $miladiYear;

		if($y < 1700)
		{
			$jd = $this->int((11*$y+3)/30) + 354*$y + 30*$m - $this->int(($m-1)/2) + $d + 1948440 - 385;

			if($jd > 2299160)
			{
				$l = $jd + 68569;
				$n = $this->int((4*$l)/146097);
				$l = $l - $this->int((146097*$n+3)/4);
				$i = $this->int((4000*($l+1))/1461001);
				$l = $l - $this->int((1461*$i)/4) + 31;
				$j = $this->int((80*$l)/2447);
				$d = $l - $this->int((2447*$j)/80);
				$l = $this->int($j/11);
				$m = $j + 2 - 12*$l;
				$y = 100*($n-49) +$i + $l;
			}
			else
			{
				$j = $jd + 1402;
				$k = $this->int(($j-1)/1461);
				$l = $j - 1461*$k;
				$n = $this->int(($l-1)/365) - $this->int($l/1461);
				$i = $l - 365*$n + 30;
				$j = $this->int((80*$i)/2447);
				$d = $i - $this->int((2447*$j)/80);
				$i = $this->int($j/11);
				$m = $j + 2 - 12*$i;
				$y = 4*$k + $n + $i - 4716;
			}

			// Return miladi date.
			return array(
				"day" => $d,
				"month" => $m,
				"year" => $y
			);
		}
	}
	
	/**
	 * Generalized modulo function (n mod m) also valid for negative values of n.
	 * @author: Gent, R.H. van.
	 * @see: {http://www.staff.science.uu.nl/~gent0113/islam/ummalqura.htm}.
	 */
	private function gmod($n,$m)
	{
		return (($n%$m) + $m) % $m;
	}
	
	/**
	 * Get info of Miladi date, e.g. Hijri date equivalent, days of Hijri month, etc.
	 * @author: Gent, R.H. van.
	 * @see: {http://www.staff.science.uu.nl/~gent0113/islam/ummalqura.htm}.
	 */
	private function dateInfo($day, $month, $year)
	{
		/**
		 * Get calendar data.
		 */
		$m = $month;
		$y = $year;

		/**
		 * Append January and February to the previous year (i.e. regard March as
		 * the first month of the year in order to simplify leapday corrections).
		 */
		if($m < 3)
		{
			$y -= 1;
			$m += 12;
		}

		/**
		 * Determine offset between Julian and Gregorian calendar.
		 */
		$a = floor($y/100.0);
		$jgc = $a - floor($a/4.0) - 2;

		/**
		 * Compute Chronological Julian Day Number (CJDN).
		 */
		$cjdn = floor(365.25*($y+4716)) + floor(30.6001*($m+1)) + $day - $jgc - 1524;
		
		$a = floor(($cjdn - 1867216.25)/36524.25);
		$jgc = $a - floor($a/4.0) + 1;
		$b = $cjdn + $jgc + 1524;
		$c = floor(($b - 122.1)/365.25);
		$d = floor(365.25*$c);
		$month = floor(($b - $d)/30.6001);
		$day = ($b - $d)-floor(30.6001*$month);

		if($month>13) {
			$c += 1;
			$month -= 12;
		}

		$month -= 1;
		$year = $c - 4716;  

		/**
		 * Compute weekday.
		 */
		$wd = $this->gmod($cjdn + 1,7);
		$hijriwd = $this->hijriWeekdays[$wd];

		/**
		 * Compute Modified Chronological Julian Day Number (MCJDN).
		 */
		$mcjdn = $cjdn - 2400000;

		/**
		 * The MCJDN's of the start of the lunations in the 'Umm al-Qura' calendar are stored in 'ummalquraData'.
		 */
		for($i=0; $i<count($this->ummalquraData); $i++){
			if($this->ummalquraData[$i] > $mcjdn)
			{
				break;
			}
		}

		/**
		 * Compute and output the Umm al-Qura calendar date.
		 */
		$iln = $i + 16260;
		$ii = floor(($iln-1)/12);
		$iy = $ii + 1;
		$im = $iln - 12*$ii;
		$id = $mcjdn - $this->ummalquraData[$i-1] + 1;
		$ml = $this->ummalquraData[$i] - $this->ummalquraData[$i-1];

		return array(
			"miladiDay" => $day,
			"miladiMonth" => $month,
			"miladiYear" => $year,
			"julianDay" => $cjdn,
			"weekday" => $wd,
			"hijriWeekday" => $hijriwd,
			"mcjdn" => $mcjdn,
			"hijriDay" => $id,
			"hijriMonth" => $im,
			"hijriYear" => $iy,
			"ilunnum" => $iln,
			"hijriMonthLength" => $ml
		);
	}
}