X

Web Design

X

Photography


X

Development

			<?php

			/* class Browser
			 *
			 * This PHP class determines, given the user-agent string, what browser
			 * rendering engine and rendering engine version you happen to be running.
			 * It then sets a bunch of array values based on what's known not to be
			 * supported in that browser rendering engine version.
			 *
			 * This is greatly simplified and should not at all be considered
			 * authoritative. This was really just written for my interests.
			 *
			 * Author: Spencer Wohlers <spencer [%at] geekwithoutacause.com>
			 * Last Updated: September 7, 2009
			 */

			class Browser {
				public static $renderingEngine = "null";
				public static $renderingEngineVersion = 0;
				public static $userAgentString = "null";
				public static $javascriptOn = false;
				public static $browserSupport = array(
					"HTML5Support" => true,
					"HTML5StyleSupport" => true,
					"HTML5FormSupport" => true,
					"CSS21Support" => true,
					"CSS3Support" => true,
					"AdvancedColorSupport" => true,
					"JSONSupport" => true,
					"SVGSupport" => true,
					"PNGSupport" => true,
					"CrossDocMessagingSupport" => true,
					"DragDropSupport" => true,
					"ContentEditableSupport" => true,
					"CanvasSupport" => true,
					"AudioVideoSupport" => true,
					"ElementsByClassNameSupport" => true,
					"FontLinkingSupport" => true);

				public function __construct($string) {
					self::$userAgentString = $string;
					self::parseUAString();
				}
				private function setTrident($version) {
					$browsersup = &self::$browserSupport;
					self::$renderingEngine = "Trident";
					self::$renderingEngineVersion = $version;
					if ($version <= 6) {
						$browsersup["HTML5Support"] = false;
						$browsersup["HTML5StyleSupport"] = false;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = false;
						$browsersup["CSS3Support"] = false;
						$browsersup["AdvancedColorSupport"] = false;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = false;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = false;
						$browsersup["DragDropSupport"] = false;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = false;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = false;
						$browsersup["FontLinkingSupport"] = false;
					}
					if ($version == 7) {
						$browsersup["HTML5Support"] = false;
						$browsersup["HTML5StyleSupport"] = false;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = false;
						$browsersup["CSS3Support"] = false;
						$browsersup["AdvancedColorSupport"] = false;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = false;
						$browsersup["PNGSupport"] = true;
						$browsersup["CrossDocMessagingSupport"] = false;
						$browsersup["DragDropSupport"] = true;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = false;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = false;
						$browsersup["FontLinkingSupport"] = false;
					}
					if ($version == 8) {
						$browsersup["HTML5Support"] = false;
						$browsersup["HTML5StyleSupport"] = false;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = false;
						$browsersup["AdvancedColorSupport"] = false;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = false;
						$browsersup["PNGSupport"] = true;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = true;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = false;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = false;
						$browsersup["FontLinkingSupport"] = false;
					}
				}
				private function setGecko($version) {
					$browsersup = &self::$browserSupport;
					self::$renderingEngine = "Gecko";
					self::$renderingEngineVersion = $version;
					if ($version <= 181) {
						// Firefox 1.0 and 2.0
						$browsersup["HTML5Support"] = false;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = false;
						$browsersup["AdvancedColorSupport"] = false;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = false;
						$browsersup["DragDropSupport"] = false;
						$browsersup["ContentEditableSupport"] = false;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = false;
						$browsersup["FontLinkingSupport"] = false;
					}
					if ($version > 181) {
						// Firefox 3.0
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = false;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = false;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = false;
					}
					if ($version > 190) {
						// Firefox 3.5
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = true;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = true;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = true;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = true;
					}
					if ($version > 191) {
						// Firefox 3.6
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = true;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = true;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = true;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = true;
					}
				}
				private function setWebkit($version) {
					$browsersup = &self::$browserSupport;
					self::$renderingEngine = "Webkit";
					self::$renderingEngineVersion = $version;
					if ($version < 527) {
						// Chrome 1.0, Safari 3
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = false;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = true;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = false;
						$browsersup["DragDropSupport"] = false;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = true;
					}
					if ($version > 527) {
						// Chrome 2.0, Safari 4.0
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = true;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = true;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = true;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = true;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = true;
					}
					if ($version > 530) {
						// Chrome 3.0
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = true;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = true;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = true;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = true;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = true;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = true;
					}

				}
				private function setPresto($version) {
					$browsersup = &self::$browserSupport;
					self::$renderingEngine = "Presto";
					self::$renderingEngineVersion = $version;
					if ($version < 98) {
						// Opera pre-10
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = true;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = false;
						$browsersup["AdvancedColorSupport"] = false;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = false;
						$browsersup["DragDropSupport"] = false;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = false;
						$browsersup["FontLinkingSupport"] = false;
					}
					if ($version == 98) {
						// Opera 10
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = true;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = true;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = false;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = false;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = true;
					}
					if ($version > 98) {
						// Opera post-10
						$browsersup["HTML5Support"] = true;
						$browsersup["HTML5StyleSupport"] = true;
						$browsersup["HTML5FormSupport"] = true;
						$browsersup["CSS21Support"] = true;
						$browsersup["CSS3Support"] = true;
						$browsersup["AdvancedColorSupport"] = true;
						$browsersup["JSONSupport"] = false;
						$browsersup["SVGSupport"] = true;
						$browsersup["PNGSupport"] = false;
						$browsersup["CrossDocMessagingSupport"] = true;
						$browsersup["DragDropSupport"] = false;
						$browsersup["ContentEditableSupport"] = true;
						$browsersup["CanvasSupport"] = true;
						$browsersup["AudioVideoSupport"] = true;
						$browsersup["ElementsByClassNameSupport"] = true;
						$browsersup["FontLinkingSupport"] = true;
					}
				}

				/* In order to identify the rendering engine so that we
				   know what features it doesn't support, we have to parse
				   the user-agent string for the rendering engine and its
				   version. */
				private function parseUAString() {
					$string = &self::$userAgentString;
					// the user-agent string.
					$relevantlocation = -1;
					// the part of the UA String relevant to identifying
					// the rendering engine.
					$version = 0;
					// the version of the rendering engine.

					if (($relevantlocation = strpos($string, "Opera")) === 0) {
						$preparseversion = substr($string,
							$relevantlocation + 6,
							strpos($string, " ", $relevantlocation)
							- ($relevantlocation + 6));
						$version  = $preparseversion[0] * 10 + $preparseversion[2];
						self::setPresto($version);
						return;
					}

					if (($relevantlocation = strpos($string, "WebKit")) > 0) {
						$version = substr($string, $relevantlocation + 7, 3);
						self::setWebkit($version);
						return;
					}

					if (($relevantlocation = strpos($string, "Gecko")) > 0) {
						$preparseversion = substr($string,
							strpos($string, "rv:") + 3,
							5);
						$version = $preparseversion[0] * 100 + $preparseversion[2] * 10 +
							$preparseversion[4];
						self::setGecko($version);
						return;
					}

					if (($relevantlocation = strpos($string, "MSIE")) > 0) {
						$version = substr($string, $relevantlocation + 5, 1);
						self::setTrident($version);
						return;
					}
				}

				/* Prints the array of values the browser is determined to support. */
				public function printTable() {
					echo "<p>I recognize you as " . self::$renderingEngine . " " . self::$renderingEngineVersion . ". I think you support: </p>";
					print_r(self::$browserSupport);
				}

				/* Returns a value from the array. */
				public function checkFeature($feature) {
					return self::$browserSupport[$feature];
				}
			}

			?>