--- a/common.inc.php +++ b/common.inc.php @@ -2,202 +2,216 @@ include_once("config.inc.php"); include("php-calendar.lib.php"); + function include_header($title) { - ?> - <!doctype html> -<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]--> -<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]--> -<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]--> -<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]--> -<head> - <meta charset="utf-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> - - <title></title> - <meta name="description" content=""> - <meta name="author" content=""> - - <meta name="viewport" content="width=device-width,initial-scale=1"> - - <!-- CSS concatenated and minified via ant build script--> - <link rel="stylesheet" href="css/style.css"> - <!-- end CSS--> - - <script src="js/libs/modernizr-2.0.6.min.js"></script> -</head> - -<body> - - <div id="container"> - <header> - - </header> - <div id="main" role="main"> - <?php -} -function include_footer() { - ?> - </div> - <footer> - - </footer> - </div> <!--! end of #container --> - <!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if necessary --> - <script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script> - <script>window.jQuery || document.write('<script src="js/libs/jquery-1.5.1.min.js">\x3C/script>')</script> - <script type="text/javascript" src="js/jquery.imagefit.js"></script> -<script> -$(window).load(function(){ - $('.col1').imagefit(); -}); -</script> -</body> -</html> - <?php + ?> + <!doctype html> + <!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]--> + <!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]--> + <!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]--> + <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]--> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> + + <title></title> + <meta name="description" content=""> + <meta name="author" content=""> + + <meta name="viewport" content="width=device-width,initial-scale=1"> + + <!-- CSS concatenated and minified via ant build script--> + <link rel="stylesheet" href="css/style.css"> + <!-- end CSS--> + + <script src="js/libs/modernizr-2.0.6.min.js"></script> + </head> + + <body> + + <div id="container"> + <header> + + </header> + <div id="main" role="main"> + <?php + } + + function include_footer() { + ?> + </div> + <footer> + + </footer> + </div> <!--! end of #container --> + <!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if necessary --> + <script src="//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js"></script> + <script>window.jQuery || document.write('<script src="js/libs/jquery-1.5.1.min.js">\x3C/script>')</script> + <script type="text/javascript" src="js/jquery.imagefit.js"></script> + <script> + $(window).load(function(){ + $('.col1').imagefit(); + }); + </script> + </body> + </html> + <?php } function include_sidebar() { - ?> + ?> <a href="upload.php">Upload a new day</a><br> <a href="help.php">Help/Instructions</a><br> <hr> -<?php -foreach (getCalendarMonths() as $month) { - echo generate_calendar($month['year'], $month['month'], getCalendarDays($month['year'], $month['month']), 3); -} + <?php + foreach (getCalendarMonths() as $month) { + echo generate_calendar($month['year'], $month['month'], getCalendarDays($month['year'], $month['month']), 3); + } } function getNextAvailableDate() { - if ($previousDate = getPreviousDate()) { - $nextDayTime = strtotime("+1 day",strtotime($previousDate)); - if (date("m",$nextDayTime) == "08" and date("d",$nextDayTime) == "24") { - // skip the 24th of August - $nextDayTime = strtotime("+1 day",$nextDayTime); - } - return date("Y-m-d",$nextDayTime); - } else { - return START_DATE; - } + if ($previousDate = getPreviousDate()) { + $nextDayTime = strtotime("+1 day", strtotime($previousDate)); + if (date("m", $nextDayTime) == "08" and date("d", $nextDayTime) == "24") { + // skip the 24th of August + $nextDayTime = strtotime("+1 day", $nextDayTime); + } + return date("Y-m-d", $nextDayTime); + } else { + return START_DATE; + } +} +function getDateFromFilename($filename) { + $fnameParts = explode(".",$filename); + return $fnameParts[0]; +} +function getFilenameForDate($date,$fileext = "") { + $results = glob(DATA_DIR."/".$date."*".$fileext); + if (sizeof($results) > 0) { + return $results[0]; + } else return false; } function getPreviousDate() { - $datedFiles = scandir(DATA_DIR); // sorted descendingly by default - if (sizeof($datedFiles) > 2) {// always at least 2 even for an empty folder because of ./ and ../ - return removeImageFileExtensions($datedFiles[sizeof($datedFiles)-1]); -} else { - return false; -} -} + $datedFiles = scandir(DATA_DIR); // sorted descendingly by default + if (sizeof($datedFiles) > 2) {// always at least 2 even for an empty folder because of ./ and ../ + return getDateFromFilename($datedFiles[sizeof($datedFiles) - 1]); + } else { + return false; + } +} + function getPhoto($displayDate) { - $cacheFile = CACHE_DIR.$displayDate.".png"; - if (file_exists($cacheFile)) { - return $cacheFile; - } else { - if (file_exists(DATA_DIR.$displayDate.".jpg")) { - $source_gd_image = imagecreatefromjpeg( DATA_DIR.$displayDate.".jpg"); - - } else if (file_exists(DATA_DIR.$displayDate.".png")) { - $source_gd_image = imagecreatefrompng( DATA_DIR.$displayDate.".png" ); - } else { - return false; - } - - if ( $source_gd_image === false ) - { - return false; - } -$source_image_width = imagesx($source_gd_image); - $source_image_height = imagesy($source_gd_image); - - $header_gd_image = imagecreatefrompng( "img/header.png" ); -$header_image_width = imagesx($header_gd_image); - $header_image_height = imagesy($header_gd_image); - - $white = imagecolorallocate($source_gd_image, 255, 255, 255); - $black = imagecolorallocate($source_gd_image, 0, 0, 0); - function calculateTextBox($text,$fontFile,$fontSize) { - /************ - simple function that calculates the *exact* bounding box (single pixel precision). - The function returns an associative array with these keys: - left, top: coordinates you will pass to imagettftext - width, height: dimension of the image you have to create - *************/ - $rect = imagettfbbox($fontSize,0,$fontFile,$text); - $minX = min(array($rect[0],$rect[2],$rect[4],$rect[6])); - $maxX = max(array($rect[0],$rect[2],$rect[4],$rect[6])); - $minY = min(array($rect[1],$rect[3],$rect[5],$rect[7])); - $maxY = max(array($rect[1],$rect[3],$rect[5],$rect[7])); - - return array( - "left" => abs($minX) - 1, - "top" => abs($minY) - 1, - "width" => $maxX - $minX, - "height" => $maxY - $minY, - "box" => $rect - ); -} -$date = strtotime($displayDate); + $cacheFile = CACHE_DIR . $displayDate . ".png"; + if (file_exists($cacheFile)) { + return $cacheFile; + } else { + if ($fname = getFilenameForDate($displayDate,".jpg")) { + $source_gd_image = imagecreatefromjpeg($fname); + } else if ($fname = getFilenameForDate($displayDate,".png")) { + $source_gd_image = imagecreatefrompng($fname); + } else { + return false; + } + + if ($source_gd_image === false) { + return false; + } + $source_image_width = imagesx($source_gd_image); + $source_image_height = imagesy($source_gd_image); + + $header_gd_image = imagecreatefrompng("img/header.png"); + $header_image_width = imagesx($header_gd_image); + $header_image_height = imagesy($header_gd_image); + + $white = imagecolorallocate($source_gd_image, 255, 255, 255); + $black = imagecolorallocate($source_gd_image, 0, 0, 0); + + function calculateTextBox($text, $fontFile, $fontSize) { + /* * ********** + simple function that calculates the *exact* bounding box (single pixel precision). + The function returns an associative array with these keys: + left, top: coordinates you will pass to imagettftext + width, height: dimension of the image you have to create + * *********** */ + $rect = imagettfbbox($fontSize, 0, $fontFile, $text); + $minX = min(array($rect[0], $rect[2], $rect[4], $rect[6])); + $maxX = max(array($rect[0], $rect[2], $rect[4], $rect[6])); + $minY = min(array($rect[1], $rect[3], $rect[5], $rect[7])); + $maxY = max(array($rect[1], $rect[3], $rect[5], $rect[7])); + + return array( + "left" => abs($minX) - 1, + "top" => abs($minY) - 1, + "width" => $maxX - $minX, + "height" => $maxY - $minY, + "box" => $rect + ); + } + + $date = strtotime($displayDate); // First we create our bounding box for the first text -$textDayName = date("l",$date); -$sizeDayName = 18; -$fontDayName = "./img/mplus-1p-medium.ttf"; -$bboxDayName = calculateTextBox($textDayName,$fontDayName,$sizeDayName); - -$textDate = date("jS F Y",$date); -$sizeDate = 14; -$fontDate = "./img/mplus-1p-regular.ttf"; -$bboxDate = calculateTextBox($textDate,$fontDate,$sizeDate); - -$margin = 15; -$maxX = $header_image_width + $margin*2 + max($bboxDayName['width'],$bboxDate['width']) + $margin*2; -$maxY = max($header_image_height + $margin*2 , ($bboxDayName['height']+$margin+$bboxDate['height'])); + $textDayName = date("l", $date); + $sizeDayName = 18; + $fontDayName = "./img/mplus-1p-medium.ttf"; + $bboxDayName = calculateTextBox($textDayName, $fontDayName, $sizeDayName); + + $textDate = date("jS F Y", $date); + $sizeDate = 14; + $fontDate = "./img/mplus-1p-regular.ttf"; + $bboxDate = calculateTextBox($textDate, $fontDate, $sizeDate); + + $margin = 15; + $maxX = $header_image_width + $margin * 2 + max($bboxDayName['width'], $bboxDate['width']) + $margin * 2; + $maxY = max($header_image_height + $margin * 2, ($bboxDayName['height'] + $margin + $bboxDate['height'])); // Draw a white rectangle -imagefilledrectangle($source_gd_image, 0, 0, $maxX, $maxY, $white); - -imagecopy($source_gd_image, $header_gd_image,$margin,$margin,0,0,$header_image_width,$header_image_height); + imagefilledrectangle($source_gd_image, 0, 0, $maxX, $maxY, $white); + + imagecopy($source_gd_image, $header_gd_image, $margin, $margin, 0, 0, $header_image_width, $header_image_height); // Write it -imagettftext($source_gd_image, $sizeDayName, 0, $header_image_width+$margin*2+$bboxDayName['left'], $margin+$bboxDayName['top'], $black, $fontDayName, $textDayName); -imagettftext($source_gd_image, $sizeDate, 0, $header_image_width+$margin*2+$bboxDate['left'], $margin+$bboxDayName['height']+$margin+$bboxDate['top'], $black, $fontDate, $textDate); - - imagepng( $source_gd_image, $cacheFile, 9 ); - imagedestroy( $source_gd_image ); - return $cacheFile; - } -} -function getCalendarDays($year,$month) { - $result = Array(); - if ($handle = opendir(DATA_DIR)) { - while (false !== ($file = readdir($handle))) { - if ($file != "." && $file != ".." && startsWith($file,"$year-$month")) { - $parts = explode("-",$file); - $day = removeImageFileExtensions($parts[2]); - $result[$day]=Array("index.php?date=$year-$month-$day",'linked-day'); - } - } - } - ksort($result); - return $result; -} + imagettftext($source_gd_image, $sizeDayName, 0, $header_image_width + $margin * 2 + $bboxDayName['left'], $margin + $bboxDayName['top'], $black, $fontDayName, $textDayName); + imagettftext($source_gd_image, $sizeDate, 0, $header_image_width + $margin * 2 + $bboxDate['left'], $margin + $bboxDayName['height'] + $margin + $bboxDate['top'], $black, $fontDate, $textDate); + + imagepng($source_gd_image, $cacheFile, 9); + imagedestroy($source_gd_image); + return $cacheFile; + } +} + +function getCalendarDays($year, $month) { + $result = Array(); + if ($handle = opendir(DATA_DIR)) { + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && startsWith($file, "$year-$month")) { + $parts = explode("-", $file); + $day = getDateFromFilename($parts[2]); + $result[$day] = Array("index.php?date=$year-$month-$day", 'linked-day'); + } + } + } + ksort($result); + return $result; +} + function getCalendarMonths() { - $months = Array(); - if ($handle = opendir(DATA_DIR)) { - while (false !== ($file = readdir($handle))) { - if ($file != "." && $file != "..") { - $parts = explode("-",$file); - $months[$parts[0].$parts[1]]=Array("month"=>$parts[1],"year"=>$parts[0]); - } - } - } - return $months; -} -function startsWith($haystack, $needle) -{ - // source: http://stackoverflow.com/questions/834303/php-startswith-and-endswith-functions + $months = Array(); + if ($handle = opendir(DATA_DIR)) { + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != "..") { + $parts = explode("-", $file); + $months[$parts[0] . $parts[1]] = Array("month" => $parts[1], "year" => $parts[0]); + } + } + } + return $months; +} + +function startsWith($haystack, $needle) { + // source: http://stackoverflow.com/questions/834303/php-startswith-and-endswith-functions $length = strlen($needle); return (substr($haystack, 0, $length) === $needle); } -function removeImageFileExtensions($filename) { - return str_replace(Array(".png",".jpg"),"",$filename); -} + + ?>