Net_UserAgent
[ class tree: Net_UserAgent ] [ index: Net_UserAgent ] [ all elements ]

Source for file Detect.php

Documentation is available at Detect.php

  1. <?php
  2. // {{{ license
  3.  
  4. // +----------------------------------------------------------------------+
  5. // | PHP version 4.2                                                      |
  6. // +----------------------------------------------------------------------+
  7. // | Copyright (c) 1997-2007 The PHP Group                                |
  8. // +----------------------------------------------------------------------+
  9. // | This source file is subject to version 2.0 of the PHP license,       |
  10. // | that is bundled with this package in the file LICENSE, and is        |
  11. // | available at through the world-wide-web at                           |
  12. // | http://www.php.net/license/2_02.txt.                                 |
  13. // | If you did not receive a copy of the PHP license and are unable to   |
  14. // | obtain it through the world-wide-web, please send a note to          |
  15. // | license@php.net so we can mail you a copy immediately.               |
  16. // +----------------------------------------------------------------------+
  17. // | Authors: Dan Allen <dan@mojavelinux.com>                             |
  18. // |          Jason Rust <jrust@php.net>                                  |
  19. // +----------------------------------------------------------------------+
  20.  
  21. // $Id: Detect.php,v 1.28 2009/06/09 04:07:00 clockwerx Exp $
  22.  
  23. // }}}
  24. // {{{ constants
  25.  
  26. define('NET_USERAGENT_DETECT_BROWSER',  'browser');
  27. define('NET_USERAGENT_DETECT_OS',       'os');
  28. define('NET_USERAGENT_DETECT_FEATURES''features');
  29. define('NET_USERAGENT_DETECT_QUIRKS',   'quirks');
  30. define('NET_USERAGENT_DETECT_ACCEPT',   'accept');
  31. define('NET_USERAGENT_DETECT_ALL',      'all');
  32.  
  33. // }}}
  34. // {{{ class Net_UserAgent_Detect
  35.  
  36. /**
  37.  * The Net_UserAgent_Detect object does a number of tests on an HTTP user
  38.  * agent string.  The results of these tests are available via methods of
  39.  * the object.  Note that all methods in this class can be called
  40.  * statically.  The constructor and singleton methods are only retained
  41.  * for BC.
  42.  *
  43.  * This module is based upon the JavaScript browser detection code
  44.  * available at http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html.
  45.  * This module had many influences from the lib/Browser.php code in
  46.  * version 1.3 of Horde.
  47.  *
  48.  * @author   Jason Rust <jrust@php.net>
  49.  * @author   Dan Allen <dan@mojavelinux.com>
  50.  * @author   Chuck Hagenbuch <chuck@horde.org>
  51.  * @author   Jon Parise <jon@horde.org>
  52.  * @package  Net_UserAgent
  53.  */
  54.  
  55. // }}}
  56.     // {{{ constructor
  57.  
  58.     function Net_UserAgent_Detect($in_userAgent = null$in_detect = null)
  59.     {
  60.         $this->detect($in_userAgent$in_detect);
  61.     }
  62.  
  63.     // }}}
  64.     // {{{ singleton
  65.  
  66.     /**
  67.      * To be used in place of the contructor to return only open instance.
  68.      *
  69.      * @access public
  70.      * @return object Net_UserAgent_Detect instance
  71.      */
  72.     function &singleton($in_userAgent = null$in_detect = null
  73.     {
  74.         static $instance;
  75.        
  76.         if (!isset($instance)) 
  77.             $instance = new Net_UserAgent_Detect($in_userAgent$in_detect)
  78.         }
  79.         
  80.         return $instance
  81.     }
  82.  
  83.     // }}}
  84.     // {{{ detect()
  85.  
  86.     /**
  87.      * Detect the user agent and prepare flags, features and quirks
  88.      * based on what is found
  89.      *
  90.      * This is the core of the Net_UserAgent_Detect class.  It moves its
  91.      * way through the user agent string setting up the flags based on
  92.      * the vendors and versions of the browsers, determining the OS and
  93.      * setting up the features and quirks owned by each of the relevant
  94.      * clients.  Note that if you are going to be calling methods of
  95.      * this class statically then set all the parameters using th
  96.      * setOption()
  97.      *
  98.      * @param  string $in_userAgent (optional) User agent override.
  99.      * @param  mixed $in_detect (optional) The level of checking to do.
  100.      *
  101.      * @access public
  102.      * @return void 
  103.      */
  104.     function detect($in_userAgent = null$in_detect = null)
  105.     {
  106.         static $hasRun;
  107.         $options &Net_UserAgent_Detect::_getStaticProperty('options');
  108.         if (!empty($hasRun&& empty($options['re-evaluate'])) {
  109.             return;
  110.         }
  111.  
  112.         $hasRun = true;
  113.         // {{{ set up static properties
  114.  
  115.         $in_userAgent = isset($options['userAgent']&& is_null($in_userAgent$options['userAgent'$in_userAgent;
  116.         $in_detect = isset($options['detectOptions']&& is_null($in_detect$options['detectOptions'$in_detect;
  117.  
  118.         // User agent string that is being analyzed
  119.         $userAgent &Net_UserAgent_Detect::_getStaticProperty('userAgent');
  120.  
  121.         // Array that stores all of the flags for the vendor and version
  122.         // of the different browsers
  123.         $browser &Net_UserAgent_Detect::_getStaticProperty('browser');
  124.         $browser array_flip(array('ns''ns2''ns3''ns4''ns4up''nav''ns6''belowns6''ns6up''firefox''firefox0.x''firefox1.x''firefox1.5''firefox2.x''firefox3.x''gecko''ie''ie3''ie4''ie4up''ie5''ie5_5''ie5up''ie6''belowie6''ie6up''ie7''ie7up''ie8''ie8tr''ie8up''opera''opera2''opera3''opera4''opera5''opera6''opera7''opera8''opera9''opera5up''opera6up''opera7up''belowopera8''opera8up''opera9up''aol''aol3''aol4''aol5''aol6''aol7''aol8''webtv''aoltv''tvnavigator''hotjava''hotjava3''hotjava3up''konq''safari''safari_mobile''chrome''netgem''webdav''icab'));
  125.         
  126.         // Array that stores all of the flags for the operating systems,
  127.         // and in some cases the versions of those operating systems (windows)
  128.         $os &Net_UserAgent_Detect::_getStaticProperty('os');
  129.         $os array_flip(array('win''win95''win16''win31''win9x''win98''wince''winme''win2k''winxp''winnt''win2003''vista''win7''os2''mac''mac68k''macppc''linux''unix''vms''sun''sun4''sun5''suni86''irix''irix5''irix6''hpux''hpux9''hpux10''aix''aix1''aix2''aix3''aix4''sco''unixware''mpras''reliant''dec''sinix''freebsd''bsd'));
  130.  
  131.         // Array which stores known issues with the given client that can
  132.         // be used for on the fly tweaking so that the client may recieve
  133.         // the proper handling of this quirk.
  134.         $quirks &Net_UserAgent_Detect::_getStaticProperty('quirks');
  135.         $quirks = array(
  136.                 'must_cache_forms'         => false,
  137.                 'popups_disabled'          => false,
  138.                 'empty_file_input_value'   => false,
  139.                 'cache_ssl_downloads'      => false,
  140.                 'scrollbar_in_way'         => false,
  141.                 'break_disposition_header' => false,
  142.                 'nested_table_render_bug'  => false);
  143.  
  144.         // Array that stores credentials for each of the browser/os
  145.         // combinations.  These allow quick access to determine if the
  146.         // current client has a feature that is going to be implemented
  147.         // in the script.
  148.         $features &Net_UserAgent_Detect::_getStaticProperty('features');
  149.         $features = array(
  150.                 'javascript'   => false,
  151.                 'dhtml'        => false,
  152.                 'dom'          => false,
  153.                 'sidebar'      => false,
  154.                 'gecko'        => false,
  155.                 'svg'          => false,
  156.                 'css2'         => false,
  157.                 'ajax'         => false);
  158.  
  159.         // The leading identifier is the very first term in the user
  160.         // agent string, which is used to identify clients which are not
  161.         // Mosaic-based browsers.
  162.         $leadingIdentifier &Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier');
  163.  
  164.         // The full version of the client as supplied by the very first
  165.         // numbers in the user agent
  166.         $version &Net_UserAgent_Detect::_getStaticProperty('version');
  167.         $version = 0;
  168.  
  169.         // The major part of the client version, which is the integer
  170.         // value of the version.
  171.         $majorVersion &Net_UserAgent_Detect::_getStaticProperty('majorVersion');
  172.         $majorVersion = 0;
  173.  
  174.         // The minor part of the client version, which is the decimal
  175.         // parts of the version
  176.         $subVersion &Net_UserAgent_Detect::_getStaticProperty('subVersion');
  177.         $subVersion = 0;
  178.  
  179.         // }}}
  180.         // detemine what user agent we are using
  181.         if (is_null($in_userAgent)) {
  182.             if (isset($_SERVER['HTTP_USER_AGENT'])) {
  183.                 $userAgent $_SERVER['HTTP_USER_AGENT'];
  184.             }
  185.             elseif (isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'])) {
  186.                 $userAgent $GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'];
  187.             }
  188.             else {
  189.                 $userAgent '';
  190.             }
  191.         }
  192.         else {
  193.             $userAgent $in_userAgent;
  194.         }
  195.  
  196.         // get the lowercase version for case-insensitive searching
  197.         $agt strtolower($userAgent);
  198.  
  199.         // figure out what we need to look for
  200.         $detectOptions = array(NET_USERAGENT_DETECT_BROWSER,
  201.                 NET_USERAGENT_DETECT_OSNET_USERAGENT_DETECT_FEATURES,
  202.                 NET_USERAGENT_DETECT_QUIRKSNET_USERAGENT_DETECT_ACCEPT
  203.                 NET_USERAGENT_DETECT_ALL);
  204.         $detect is_null($in_detectNET_USERAGENT_DETECT_ALL : $in_detect;
  205.         settype($detect'array');
  206.         foreach($detectOptions as $option{
  207.             if (in_array($option$detect)) {
  208.                 $detectFlags[$option= true; 
  209.             }
  210.             else {
  211.                 $detectFlags[$option= false;
  212.             }
  213.         }
  214.  
  215.         // initialize the arrays of browsers and operating systems
  216.  
  217.         // Get the type and version of the client
  218.         if (preg_match(";^([[:alnum:]]+)[ /\(]*[[:alpha:]]*([\d]*)(\.[\d\.]*);"$agt$matches)) {
  219.             list($leadingIdentifier$majorVersion$subVersion$matches;
  220.         }
  221.  
  222.         if (empty($leadingIdentifier)) {
  223.             $leadingIdentifier 'Unknown';
  224.         }
  225.  
  226.         $version $majorVersion $subVersion;
  227.     
  228.         // Browser type
  229.         if ($detectFlags[NET_USERAGENT_DETECT_ALL|| $detectFlags[NET_USERAGENT_DETECT_BROWSER]{
  230.             $browser['webdav']  ($agt == 'microsoft data access internet publishing provider dav' || $agt == 'microsoft data access internet publishing provider protocol discovery');
  231.             $browser['konq'(strpos($agt'konqueror'!== false ||  strpos($agt'safari'!== false );
  232.             $browser['safari'(strpos($agt'safari'!== false);
  233.             $browser['chrome'(strpos($agt'chrome'!== false);
  234.             $browser['safari_mobile'(strpos($agt'safari'!== false && strpos($agt'mobile'!== false );
  235.             $browser['text']    strpos($agt'links'!== false || strpos($agt'lynx'!== false || strpos($agt'w3m'!== false;
  236.             $browser['ns']      strpos($agt'mozilla'!== false && !(strpos($agt'spoofer'!== false&& !(strpos($agt'compatible'!== false&& !(strpos($agt'hotjava'!== false&& !(strpos($agt'opera'!== false&& !(strpos($agt'webtv'!== false? 1 : 0;
  237.             $browser['netgem']  strpos($agt'netgem'!== false;
  238.             $browser['icab']    strpos($agt'icab'!== false;
  239.             $browser['ns2']     $browser['ns'&& $majorVersion == 2;
  240.             $browser['ns3']     $browser['ns'&& $majorVersion == 3;
  241.             $browser['ns4']     $browser['ns'&& $majorVersion == 4;
  242.             $browser['ns4up']   $browser['ns'&& $majorVersion >= 4;
  243.             // determine if this is a Netscape Navigator
  244.             $browser['nav'$browser['belowns6'$browser['ns'&& $majorVersion < 5;
  245.             $browser['ns6']     !$browser['konq'&& $browser['ns'&& $majorVersion == 5;
  246.             $browser['ns6up']   $browser['ns6'&& $majorVersion >= 5;
  247.             $browser['gecko']   strpos($agt'gecko'!== false && !$browser['konq'];
  248.             $browser['firefox'$browser['gecko'&& strpos($agt'firefox'!== false;
  249.             $browser['firefox0.x'$browser['firefox'&& strpos($agt'firefox/0.'!== false;
  250.             $browser['firefox1.x'$browser['firefox'&& strpos($agt'firefox/1.'!== false;
  251.             $browser['firefox1.5'$browser['firefox'&& strpos($agt'firefox/1.5'!== false;
  252.             $browser['firefox2.x'$browser['firefox'&& strpos($agt'firefox/2.'!== false;
  253.             $browser['firefox3.x'$browser['firefox'&& strpos($agt'firefox/3.'!== false;
  254.             $browser['ie']      strpos($agt'msie'!== false && !(strpos($agt'opera'!== false);
  255.             $browser['ie3']     $browser['ie'&& $majorVersion < 4;
  256.             $browser['ie4']     $browser['ie'&& $majorVersion == 4 && (strpos($agt'msie 4'!== false);
  257.             $browser['ie4up']   $browser['ie'&& !$browser['ie3'];
  258.             $browser['ie5']     $browser['ie4up'&& (strpos($agt'msie 5'!== false);
  259.             $browser['ie5_5']   $browser['ie4up'&& (strpos($agt'msie 5.5'!== false);
  260.             $browser['ie5up']   $browser['ie4up'&& !$browser['ie3'&& !$browser['ie4'];
  261.             $browser['ie5_5up'$browser['ie5up'&& !$browser['ie5'];
  262.             $browser['ie6']     strpos($agt'msie 6'!== false;
  263.             $browser['ie6up']   $browser['ie5up'&& !$browser['ie5'&& !$browser['ie5_5'];
  264.             $browser['ie7'strpos($agt'msie 7'&& !strpos($agt,'trident/4');
  265.             $browser['ie7up']   $browser['ie6up'&& !$browser['ie6'];
  266.             $browser['ie8tr'strpos($agt'msie 7'&& strpos($agt,'trident/4'!== false;
  267.             $browser['ie8'strpos($agt'msie 8'!== false;
  268.             $browser['ie8up'$browser['ie7up'&& !$browser['ie7']
  269.             $browser['belowie6']$browser['ie'&& !$browser['ie6up'];
  270.             $browser['opera']   strpos($agt'opera'!== false;
  271.             $browser['opera2']  strpos($agt'opera 2'!== false || strpos($agt'opera/2'!== false;
  272.             $browser['opera3']  strpos($agt'opera 3'!== false || strpos($agt'opera/3'!== false;
  273.             $browser['opera4']  strpos($agt'opera 4'!== false || strpos($agt'opera/4'!== false;
  274.             $browser['opera5']  strpos($agt'opera 5'!== false || strpos($agt'opera/5'!== false;
  275.             $browser['opera6']  strpos($agt'opera 6'!== false || strpos($agt'opera/6'!== false;
  276.             $browser['opera7']  strpos($agt'opera 7'!== false || strpos($agt'opera/7'!== false;
  277.             $browser['opera8']  strpos($agt'opera 8'!== false || strpos($agt'opera/8'!== false;
  278.             $browser['opera9']  strpos($agt'opera 9'!== false || strpos($agt'opera/9'!== false;
  279.             $browser['opera5up'$browser['opera'&& !$browser['opera2'&& !$browser['opera3'&& !$browser['opera4'];
  280.             $browser['opera6up'$browser['opera'&& !$browser['opera2'&& !$browser['opera3'&& !$browser['opera4'&& !$browser['opera5'];
  281.             $browser['opera7up'$browser['opera'&& !$browser['opera2'&& !$browser['opera3'&& !$browser['opera4'&& !$browser['opera5'&& !$browser['opera6'];
  282.             $browser['opera8up'$browser['opera'&& !$browser['opera2'&& !$browser['opera3'&& !$browser['opera4'&& !$browser['opera5'&& !$browser['opera6'&& !$browser['opera7'];
  283.             $browser['opera9up'$browser['opera'&& !$browser['opera2'&& !$browser['opera3'&& !$browser['opera4'&& !$browser['opera5'&& !$browser['opera6'&& !$browser['opera7'&& !$browser['opera8'];
  284.             $browser['belowopera8'$browser['opera'&& !$browser['opera8up'];
  285.             $browser['aol']   strpos($agt'aol'!== false;
  286.             $browser['aol3']  $browser['aol'&& $browser['ie3'];
  287.             $browser['aol4']  $browser['aol'&& $browser['ie4'];
  288.             $browser['aol5']  strpos($agt'aol 5'!== false;
  289.             $browser['aol6']  strpos($agt'aol 6'!== false;
  290.             $browser['aol7']  strpos($agt'aol 7'!== false || strpos($agt'aol7'!== false;
  291.             $browser['aol8']  strpos($agt'aol 8'!== false || strpos($agt'aol8'!== false;
  292.             $browser['webtv'strpos($agt'webtv'!== false; 
  293.             $browser['aoltv'$browser['tvnavigator'strpos($agt'navio'!== false || strpos($agt'navio_aoltv'!== false; 
  294.             $browser['hotjava'strpos($agt'hotjava'!== false;
  295.             $browser['hotjava3'$browser['hotjava'&& $majorVersion == 3;
  296.             $browser['hotjava3up'$browser['hotjava'&& $majorVersion >= 3;
  297.             $browser['iemobile'strpos($agt'iemobile'!== false || strpos($agt'windows ce'!== false && (strpos($agt'ppc'!== false || strpos($agt'smartphone'!== false);
  298.         }
  299.  
  300.         if ($detectFlags[NET_USERAGENT_DETECT_ALL|| 
  301.             ($detectFlags[NET_USERAGENT_DETECT_BROWSER&& $detectFlags[NET_USERAGENT_DETECT_FEATURES])) {
  302.             // Javascript Check
  303.             if ($browser['ns2'|| $browser['ie3']{
  304.                 Net_UserAgent_Detect::setFeature('javascript'1.0);
  305.             }
  306.             elseif ($browser['iemobile']{
  307.               // no javascript
  308.             }
  309.             elseif ($browser['opera5up']{
  310.                 Net_UserAgent_Detect::setFeature('javascript'1.3);
  311.             }
  312.             elseif ($browser['opera'|| $browser['ns3']{
  313.                 Net_UserAgent_Detect::setFeature('javascript'1.1);
  314.             }
  315.             elseif (($browser['ns4'&& ($version <= 4.05)) || $browser['ie4']{
  316.                 Net_UserAgent_Detect::setFeature('javascript'1.2);
  317.             }
  318.             elseif (($browser['ie5up'&& strpos($agt'mac'!== false|| $browser['konq']{
  319.                 Net_UserAgent_Detect::setFeature('javascript'1.4);
  320.             }
  321.             // I can't believe IE6 still has javascript 1.3, what a shitty browser
  322.             elseif (($browser['ns4'&& ($version > 4.05)) || $browser['ie5up'|| $browser['hotjava3up']{
  323.                 Net_UserAgent_Detect::setFeature('javascript'1.3);
  324.             }
  325.             elseif ($browser['ns6up'|| $browser['gecko'|| $browser['netgem']{
  326.                 Net_UserAgent_Detect::setFeature('javascript'1.5);
  327.             }
  328.         }
  329.         
  330.         /** OS Check **/
  331.         if ($detectFlags[NET_USERAGENT_DETECT_ALL|| $detectFlags[NET_USERAGENT_DETECT_OS]{
  332.             $os['win']   strpos($agt'win'!== false || strpos($agt'16bit'!== false;
  333.             $os['win95'strpos($agt'win95'!== false || strpos($agt'windows 95'!== false;
  334.             $os['win16'strpos($agt'win16'!== false || strpos($agt'16bit'!== false || strpos($agt'windows 3.1'!== false || strpos($agt'windows 16-bit'!== false;  
  335.             $os['win31'strpos($agt'windows 3.1'!== false || strpos($agt'win16'!== false || strpos($agt'windows 16-bit'!== false;
  336.             $os['winme'strpos($agt'win 9x 4.90'!== false;
  337.             $os['wince'strpos($agt'windows ce'!== false;
  338.             $os['win2k'strpos($agt'windows nt 5.0'!== false;
  339.             $os['winxp'strpos($agt'windows nt 5.1'!== false;
  340.             $os['win2003'strpos($agt'windows nt 5.2'!== false;
  341.             $os['win98'strpos($agt'win98'!== false || strpos($agt'windows 98'!== false;
  342.             $os['win9x'$os['win95'|| $os['win98'];
  343.             $os['winnt'(strpos($agt'winnt'!== false || strpos($agt'windows nt'!== false&& strpos($agt'windows nt 5'=== false;
  344.             $os['win32'$os['win95'|| $os['winnt'|| $os['win98'|| $majorVersion >= 4 && strpos($agt'win32'!== false || strpos($agt'32bit'!== false;
  345.             $os['vista'strpos($agt'windows nt 6.0'!== false;
  346.             $os['win7'strpos($agt'windows nt 6.1'!== false; 
  347.             $os['os2']   strpos($agt'os/2'!== false || strpos($agt'ibm-webexplorer'!== false;
  348.             $os['mac']   strpos($agt'mac'!== false;
  349.             $os['mac68k']   $os['mac'&& (strpos($agt'68k'!== false || strpos($agt'68000'!== false);
  350.             $os['macppc']   $os['mac'&& (strpos($agt'ppc'!== false || strpos($agt'powerpc'!== false);
  351.             $os['sun']      strpos($agt'sunos'!== false;
  352.             $os['sun4']     strpos($agt'sunos 4'!== false;
  353.             $os['sun5']     strpos($agt'sunos 5'!== false;
  354.             $os['suni86']   $os['sun'&& strpos($agt'i86'!== false;
  355.             $os['irix']     strpos($agt'irix'!== false;
  356.             $os['irix5']    strpos($agt'irix 5'!== false;
  357.             $os['irix6']    strpos($agt'irix 6'!== false || strpos($agt'irix6'!== false;
  358.             $os['hpux']     strpos($agt'hp-ux'!== false;
  359.             $os['hpux9']    $os['hpux'&& strpos($agt'09.'!== false;
  360.             $os['hpux10']   $os['hpux'&& strpos($agt'10.'!== false;
  361.             $os['aix']      strpos($agt'aix'!== false;
  362.             $os['aix1']     strpos($agt'aix 1'!== false;
  363.             $os['aix2']     strpos($agt'aix 2'!== false;
  364.             $os['aix3']     strpos($agt'aix 3'!== false;
  365.             $os['aix4']     strpos($agt'aix 4'!== false;
  366.             $os['linux']    strpos($agt'inux'!== false;
  367.             $os['sco']      strpos($agt'sco'!== false || strpos($agt'unix_sv'!== false;
  368.             $os['unixware'strpos($agt'unix_system_v'!== false; 
  369.             $os['mpras']    strpos($agt'ncr'!== false; 
  370.             $os['reliant']  strpos($agt'reliant'!== false;
  371.             $os['dec']      strpos($agt'dec'!== false || strpos($agt'osf1'!== false || strpos($agt'dec_alpha'!== false || strpos($agt'alphaserver'!== false || strpos($agt'ultrix'!== false || strpos($agt'alphastation'!== false;
  372.             $os['sinix']    strpos($agt'sinix'!== false;
  373.             $os['freebsd']  strpos($agt'freebsd'!== false;
  374.             $os['bsd']      strpos($agt'bsd'!== false;
  375.             $os['unix']     strpos($agt'x11'!== false || strpos($agt'unix'!== false || $os['sun'|| $os['irix'|| $os['hpux'|| $os['sco'|| $os['unixware'|| $os['mpras'|| $os['reliant'|| $os['dec'|| $os['sinix'|| $os['aix'|| $os['linux'|| $os['bsd'|| $os['freebsd'];
  376.             $os['vms']      strpos($agt'vax'!== false || strpos($agt'openvms'!== false;
  377.         }
  378.  
  379.         // Setup the quirks
  380.         if ($detectFlags[NET_USERAGENT_DETECT_ALL|| 
  381.             ($detectFlags[NET_USERAGENT_DETECT_BROWSER&& $detectFlags[NET_USERAGENT_DETECT_QUIRKS])) {
  382.             if ($browser['konq']{
  383.                 Net_UserAgent_Detect::setQuirk('empty_file_input_value');
  384.             }
  385.  
  386.             if ($browser['ie']{
  387.                 Net_UserAgent_Detect::setQuirk('cache_ssl_downloads');
  388.             }
  389.  
  390.             if ($browser['ie6']{
  391.                 Net_UserAgent_Detect::setQuirk('scrollbar_in_way');
  392.             }
  393.  
  394.             if ($browser['ie5']{
  395.                 Net_UserAgent_Detect::setQuirk('break_disposition_header');
  396.             }
  397.  
  398.             if ($browser['ie7']{
  399.                 Net_UserAgent_Detect::setQuirk('popups_disabled');
  400.             }
  401.  
  402.             if ($browser['ns6']{
  403.                 Net_UserAgent_Detect::setQuirk('popups_disabled');
  404.                 Net_UserAgent_Detect::setQuirk('must_cache_forms');
  405.             }
  406.             
  407.             if ($browser['nav'&& $subVersion < .79{
  408.                 Net_UserAgent_Detect::setQuirk('nested_table_render_bug');
  409.             }
  410.         }
  411.             
  412.         // Set features
  413.         if ($detectFlags[NET_USERAGENT_DETECT_ALL|| 
  414.             ($detectFlags[NET_USERAGENT_DETECT_BROWSER&& $detectFlags[NET_USERAGENT_DETECT_FEATURES])) {
  415.             if ($browser['gecko']{
  416.                 preg_match(';gecko/([\d]+)\b;i'$agt$matches);
  417.                 Net_UserAgent_Detect::setFeature('gecko'$matches[1]);
  418.             }
  419.  
  420.             if ($browser['gecko'|| ($browser['ie5up'&& !$browser['iemobile']|| $browser['konq'|| $browser['opera8up'&& !$os['wince']{
  421.                 Net_UserAgent_Detect::setFeature('ajax');
  422.             }
  423.  
  424.             if ($browser['ns6up'|| $browser['opera5up'|| $browser['konq'|| $browser['netgem']{
  425.                 Net_UserAgent_Detect::setFeature('dom');
  426.             }
  427.  
  428.             if ($browser['ie4up'|| $browser['ns4up'|| $browser['opera5up'|| $browser['konq'|| $browser['netgem']{
  429.                 Net_UserAgent_Detect::setFeature('dhtml');
  430.             }
  431.  
  432.             if ($browser['firefox1.5'|| $browser['firefox2.x'|| $browser['opera9up']{
  433.                 Net_UserAgent_Detect::setFeature('svg');
  434.             }
  435.  
  436.             if ($browser['gecko'|| $browser['ns6up'|| $browser['ie5up'|| $browser['konq'|| $browser['opera7up']{
  437.                 Net_UserAgent_Detect::setFeature('css2');
  438.             }
  439.         }
  440.  
  441.         if ($detectFlags[NET_USERAGENT_DETECT_ALL|| $detectFlags[NET_USERAGENT_DETECT_ACCEPT]{
  442.             $mimetypes preg_split(';[\s,]+;'substr(getenv('HTTP_ACCEPT')0strpos(getenv('HTTP_ACCEPT'';'';'))-1PREG_SPLIT_NO_EMPTY);
  443.             Net_UserAgent_Detect::setAcceptType((array) $mimetypes'mimetype');
  444.  
  445.             $languages preg_split(';[\s,]+;'substr(getenv('HTTP_ACCEPT_LANGUAGE')0strpos(getenv('HTTP_ACCEPT_LANGUAGE'';'';'))-1PREG_SPLIT_NO_EMPTY);
  446.             if (empty($languages)) {
  447.                 $languages 'en';
  448.             }
  449.  
  450.             Net_UserAgent_Detect::setAcceptType((array) $languages'language');
  451.  
  452.             $encodings preg_split(';[\s,]+;'substr(getenv('HTTP_ACCEPT_ENCODING')0strpos(getenv('HTTP_ACCEPT_ENCODING'';'';'))-1PREG_SPLIT_NO_EMPTY);
  453.             Net_UserAgent_Detect::setAcceptType((array) $encodings'encoding');
  454.             
  455.             $charsets preg_split(';[\s,]+;'substr(getenv('HTTP_ACCEPT_CHARSET')0strpos(getenv('HTTP_ACCEPT_CHARSET'';'';'))-1PREG_SPLIT_NO_EMPTY);
  456.             Net_UserAgent_Detect::setAcceptType((array) $charsets'charset');
  457.         }
  458.     }
  459.     
  460.     // }}}
  461.     // {{{ setOption()
  462.  
  463.     /**
  464.      * Sets a class option.  The available settings are:
  465.      * o 'userAgent' => The user agent string to detect (useful for
  466.      * checking a string manually).
  467.      * o 'detectOptions' => The level of checking to do.  A single level
  468.      * or an array of options.  Default is NET_USERAGENT_DETECT_ALL.
  469.      *
  470.      * @param string $in_field The option field (userAgent or detectOptions)
  471.      * @param mixed $in_value The value for the field
  472.      */
  473.     function setOption($in_field$in_value)
  474.     {
  475.         $options &Net_UserAgent_Detect::_getStaticProperty('options');
  476.         $options[$in_field$in_value;
  477.     }
  478.  
  479.     // }}}
  480.     // {{{ isBrowser()
  481.  
  482.     /**
  483.      * Look up the provide browser flag and return a boolean value
  484.      *
  485.      * Given one of the flags listed in the properties, this function will return
  486.      * the value associated with that flag.
  487.      *
  488.      * @param  string $in_match flag to lookup
  489.      *
  490.      * @access public
  491.      * @return boolean whether or not the browser satisfies this flag
  492.      */
  493.     function isBrowser($in_match)
  494.     {
  495.         Net_UserAgent_Detect::detect();
  496.         $browser &Net_UserAgent_Detect::_getStaticProperty('browser');
  497.         return isset($browser[strtolower($in_match)]$browser[strtolower($in_match): false;
  498.     }
  499.  
  500.     // }}}
  501.     // {{{ getBrowser()
  502.  
  503.     /**
  504.      * Since simply returning the "browser" is somewhat ambiguous since there
  505.      * are different ways to classify the browser, this function works by taking
  506.      * an expect list and returning the string of the first match, so put the important
  507.      * ones first in the array.
  508.      *
  509.      * @param  array $in_expectList the browser flags to search for
  510.      *
  511.      * @access public
  512.      * @return string first flag that matches
  513.      */
  514.     function getBrowser($in_expectList)
  515.     {
  516.         Net_UserAgent_Detect::detect();
  517.         $browser &Net_UserAgent_Detect::_getStaticProperty('browser');
  518.         foreach((array) $in_expectList as $brwsr{
  519.             if (!empty($browser[strtolower($brwsr)])) {
  520.                 return $brwsr;
  521.             }
  522.         }
  523.     }
  524.  
  525.     // }}}
  526.     // {{{ getBrowserString()
  527.  
  528.     /**
  529.      * This function returns the vendor string corresponding to the flag.
  530.      *
  531.      * Either use the default matches or pass in an associative array of
  532.      * flags and corresponding vendor strings.  This function will find
  533.      * the highest version flag and return the vendor string corresponding
  534.      * to the appropriate flag.  Be sure to pass in the flags in ascending order
  535.      * if you want a basic matches first, followed by more detailed matches.
  536.      *
  537.      * @param  array $in_vendorStrings (optional) array of flags matched with vendor strings
  538.      *
  539.      * @access public
  540.      * @return string vendor string matches appropriate flag
  541.      */
  542.     function getBrowserString($in_vendorStrings = null)
  543.     {
  544.         if (is_null($in_vendorStrings)) {
  545.             $in_vendorStrings = array (
  546.                     'ie'       => 'Microsoft Internet Explorer',
  547.                     'ie4up'    => 'Microsoft Internet Explorer 4.x',
  548.                     'ie5up'    => 'Microsoft Internet Explorer 5.x',
  549.                     'ie6up'    => 'Microsoft Internet Explorer 6.x',
  550.                     'ie7up'    => 'Microsoft Internet Explorer 7.x',
  551.                     'ie8up'    => 'Microsoft Internet Explorer 8.x',
  552.                     'ie8tr'    => 'Microsoft Internet Explorer 8.x (Compatibility View)'
  553.                     'opera4'   => 'Opera 4.x',
  554.                     'opera5up' => 'Opera 5.x',
  555.                     'nav'      => 'Netscape Navigator',
  556.                     'ns4'      => 'Netscape 4.x',
  557.                     'ns6up'    => 'Mozilla/Netscape 6.x',
  558.                     'firefox0.x' => 'Firefox 0.x',
  559.                     'firefox1.x' => 'Firefox 1.x',
  560.                     'firefox1.5' => 'Firefox 1.5',
  561.                     'firefox2.x' => 'Firefox 2.x',
  562.                     'firefox3.x' => 'Firefox 3.x',
  563.                     'konq'     => 'Konqueror',
  564.                     'safari'   => 'Safari',
  565.                     'safari_mobile'     => 'Safari Mobile',
  566.                     'chrome'   => 'Google Chrome',
  567.                     'netgem'   => 'Netgem/iPlayer');
  568.         }
  569.  
  570.         Net_UserAgent_Detect::detect();
  571.         $browser &Net_UserAgent_Detect::_getStaticProperty('browser');
  572.         foreach((array) $in_vendorStrings as $flag => $string{
  573.             if (!empty($browser[$flag])) {
  574.                 $vendorString $string;
  575.             }
  576.         }
  577.  
  578.         // if there are no matches just use the user agent leading idendifier (usually Mozilla)
  579.         if (!isset($vendorString)) {
  580.             $leadingIdentifier &Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier');
  581.             $vendorString $leadingIdentifier;
  582.         }
  583.         
  584.         return $vendorString;
  585.     }
  586.  
  587.     // }}}
  588.     // {{{ isIE()
  589.  
  590.     /**
  591.      * Determine if the browser is an Internet Explorer browser
  592.      *
  593.      * @access public
  594.      * @return bool whether or not this browser is an ie browser
  595.      */
  596.     function isIE()
  597.     {
  598.         Net_UserAgent_Detect::detect();
  599.         $browser &Net_UserAgent_Detect::_getStaticProperty('browser');
  600.         return !empty($browser['ie']);
  601.     }
  602.  
  603.     // }}}
  604.     // {{{ isNavigator()
  605.  
  606.     /**
  607.      * Determine if the browser is a Netscape Navigator browser
  608.      *
  609.      * @access public
  610.      * @return bool whether or not this browser is a Netscape Navigator browser
  611.      */
  612.     function isNavigator()
  613.     {
  614.         Net_UserAgent_Detect::detect();
  615.         $browser &Net_UserAgent_Detect::_getStaticProperty('browser');
  616.         return !empty($browser['nav']);
  617.     }
  618.  
  619.     // }}}
  620.     // {{{ isNetscape()
  621.  
  622.     /**
  623.      * Determine if the browser is a Netscape or Mozilla browser
  624.      *
  625.      * Note that this function is not the same as isNavigator, since the
  626.      * new Mozilla browsers are still sponsered by Netscape, and hence are
  627.      * Netscape products, but not the original Navigators
  628.      *
  629.      * @access public
  630.      * @return bool whether or not this browser is a Netscape product
  631.      */
  632.     function isNetscape()
  633.     {
  634.         Net_UserAgent_Detect::detect();
  635.         $browser &Net_UserAgent_Detect::_getStaticProperty('browser');
  636.         return !empty($browser['ns4up']);
  637.     }
  638.     
  639.     // }}}
  640.     // {{{ isOS()
  641.  
  642.     /**
  643.      * Look up the provide OS flag and return a boolean value
  644.      *
  645.      * Given one of the flags listed in the properties, this function will return
  646.      * the value associated with that flag for the operating system.
  647.      *
  648.      * @param  string $in_match flag to lookup
  649.      *
  650.      * @access public
  651.      * @return boolean whether or not the OS satisfies this flag
  652.      */
  653.     function isOS($in_match)
  654.     {
  655.         Net_UserAgent_Detect::detect();
  656.         $os &Net_UserAgent_Detect::_getStaticProperty('os');
  657.         return isset($os[strtolower($in_match)]$os[strtolower($in_match): false;
  658.     }
  659.  
  660.     // }}}
  661.     // {{{ getOS()
  662.  
  663.     /**
  664.      * Since simply returning the "os" is somewhat ambiguous since there
  665.      * are different ways to classify the browser, this function works by taking
  666.      * an expect list and returning the string of the first match, so put the important
  667.      * ones first in the array.
  668.      *
  669.      * @access public
  670.      * @return string first flag that matches
  671.      */
  672.     function getOS($in_expectList)
  673.     {
  674.         Net_UserAgent_Detect::detect();
  675.         $os &Net_UserAgent_Detect::_getStaticProperty('os');
  676.         foreach((array) $in_expectList as $expectOs{
  677.             if (!empty($os[strtolower($expectOs)])) {
  678.                 return $expectOs;
  679.             }
  680.         }
  681.     }
  682.  
  683.     // }}}
  684.     // {{{ getOSString()
  685.  
  686.     /**
  687.      * This function returns the os string corresponding to the flag.
  688.      *
  689.      * Either use the default matches or pass in an associative array of
  690.      * flags and corresponding os strings.  This function will find
  691.      * the highest version flag and return the os string corresponding
  692.      * to the appropriate flag.  Be sure to pass in the flags in ascending order
  693.      * if you want a basic matches first, followed by more detailed matches.
  694.      *
  695.      * @param  array $in_osStrings (optional) array of flags matched with os strings
  696.      *
  697.      * @access public
  698.      * @return string os string matches appropriate flag
  699.      */
  700.     function getOSString($in_osStrings = null)
  701.     {
  702.         if (is_null($in_osStrings)) {
  703.             $in_osStrings = array(
  704.                    'win'   => 'Microsoft Windows',
  705.                    'wince' => 'Microsoft Windows CE',
  706.                    'win9x' => 'Microsoft Windows 9x',
  707.                    'winme' => 'Microsoft Windows Millenium',
  708.                    'win2k' => 'Microsoft Windows 2000',
  709.                    'winnt' => 'Microsoft Windows NT',
  710.                    'winxp' => 'Microsoft Windows XP',
  711.                    'win2003' => 'Microsoft Windows 2003',
  712.                    'vista' => 'Microsoft Windows Vista',
  713.                    'win7' => 'Microsoft Windows 7'
  714.                    'mac'   => 'Macintosh',
  715.                    'unix'  => 'Linux/Unix');
  716.         }
  717.  
  718.         Net_UserAgent_Detect::detect();
  719.         $osString 'Unknown';
  720.  
  721.         $os &Net_UserAgent_Detect::_getStaticProperty('os');
  722.         foreach((array) $in_osStrings as $flag => $string{
  723.             if (!empty($os[$flag])) {
  724.                 $osString $string;
  725.             }
  726.         }
  727.  
  728.         return $osString;
  729.     }
  730.  
  731.     // }}}
  732.     // {{{ setQuirk()
  733.  
  734.     /**
  735.      * Set a unique behavior for the current browser.
  736.      *
  737.      * Many client browsers do some really funky things, and this
  738.      * mechanism allows the coder to determine if an excepetion must
  739.      * be made with the current client.
  740.      *
  741.      * @param string $in_quirk The quirk to set
  742.      * @param string $in_hasQuirk (optional) Does the browser have the quirk?
  743.      *
  744.      * @access public
  745.      * @return void 
  746.      */
  747.     function setQuirk($in_quirk$in_hasQuirk = true)
  748.     {
  749.         $quirks &Net_UserAgent_Detect::_getStaticProperty('quirks');
  750.         $hasQuirk !empty($in_hasQuirk)
  751.         $quirks[strtolower($in_quirk)$hasQuirk;
  752.     }
  753.  
  754.     // }}}
  755.     // {{{ hasQuirk()
  756.  
  757.     /**
  758.      * Check a unique behavior for the current browser.
  759.      *
  760.      * Many client browsers do some really funky things, and this
  761.      * mechanism allows the coder to determine if an excepetion must
  762.      * be made with the current client.
  763.      *
  764.      * @param string $in_quirk The quirk to detect
  765.      *
  766.      * @access public
  767.      * @return bool whether or not browser has this quirk
  768.      */
  769.     function hasQuirk($in_quirk)
  770.     {
  771.         return (bool) Net_UserAgent_Detect::getQuirk($in_quirk);
  772.     }
  773.     
  774.     // }}}
  775.     // {{{ getQuirk()
  776.  
  777.     /**
  778.      * Get the unique behavior for the current browser.
  779.      *
  780.      * Many client browsers do some really funky things, and this
  781.      * mechanism allows the coder to determine if an excepetion must
  782.      * be made with the current client.
  783.      *
  784.      * @param string $in_quirk The quirk to detect
  785.      *
  786.      * @access public
  787.      * @return string value of the quirk, in this case usually a boolean
  788.      */
  789.     function getQuirk($in_quirk)
  790.     {
  791.         Net_UserAgent_Detect::detect();
  792.         $quirks &Net_UserAgent_Detect::_getStaticProperty('quirks');
  793.         return isset($quirks[strtolower($in_quirk)]$quirks[strtolower($in_quirk): null; 
  794.     }
  795.  
  796.     // }}}
  797.     // {{{ setFeature()
  798.  
  799.     /**
  800.      * Set capabilities for the current browser.
  801.      *
  802.      * Since the capabilities of client browsers vary widly, this interface
  803.      * helps keep track of the core features of a client, such as if the client
  804.      * supports dhtml, dom, javascript, etc.
  805.      *
  806.      * @param string $in_feature The feature to set
  807.      * @param string $in_hasFeature (optional) Does the browser have the feature?
  808.      *
  809.      * @access public
  810.      * @return void 
  811.      */
  812.     function setFeature($in_feature$in_hasFeature = true)
  813.     {
  814.         $features &Net_UserAgent_Detect::_getStaticProperty('features');
  815.         $features[strtolower($in_feature)$in_hasFeature;
  816.     }
  817.  
  818.     // }}}
  819.     // {{{ hasFeature()
  820.  
  821.     /**
  822.      * Check the capabilities for the current browser.
  823.      *
  824.      * Since the capabilities of client browsers vary widly, this interface
  825.      * helps keep track of the core features of a client, such as if the client
  826.      * supports dhtml, dom, javascript, etc.
  827.      *
  828.      * @param string $in_feature The feature to detect
  829.      *
  830.      * @access public
  831.      * @return bool whether or not the current client has this feature
  832.      */
  833.     function hasFeature($in_feature)
  834.     {
  835.         return (bool) Net_UserAgent_Detect::getFeature($in_feature);
  836.     }
  837.     
  838.     // }}}
  839.     // {{{ getFeature()
  840.  
  841.     /**
  842.      * Get the capabilities for the current browser.
  843.      *
  844.      * Since the capabilities of client browsers vary widly, this interface
  845.      * helps keep track of the core features of a client, such as if the client
  846.      * supports dhtml, dom, javascript, etc.
  847.      *
  848.      * @param string $in_feature The feature to detect
  849.      *
  850.      * @access public
  851.      * @return string value of the feature requested
  852.      */
  853.     function getFeature($in_feature)
  854.     {
  855.         Net_UserAgent_Detect::detect();
  856.         $features &Net_UserAgent_Detect::_getStaticProperty('features');
  857.         return isset($features[strtolower($in_feature)]$features[strtolower($in_feature): null; 
  858.     }
  859.  
  860.     // }}}
  861.     // {{{ getAcceptType()
  862.  
  863.     /**
  864.      * Retrive the accept type for the current browser.
  865.      *
  866.      * To keep track of the mime-types, languages, charsets and encodings
  867.      * that each browser accepts we use associative arrays for each type.
  868.      * This function works like getBrowser() as it takes an expect list
  869.      * and returns the first match.  For instance, to find the language
  870.      * you would pass in your allowed languages and see if any of the
  871.      * languages set in the browser match.
  872.      *
  873.      * @param  string $in_expectList values to check
  874.      * @param  string $in_type type of accept
  875.      *
  876.      * @access public
  877.      * @return string the first matched value
  878.      */
  879.     function getAcceptType($in_expectList$in_type)
  880.     {
  881.         Net_UserAgent_Detect::detect();
  882.         $type strtolower($in_type);
  883.  
  884.         if ($type == 'mimetype' || $type == 'language' || $type == 'charset' || $type == 'encoding'{
  885.             $typeArray &Net_UserAgent_Detect::_getStaticProperty($type);
  886.             foreach((array) $in_expectList as $match{
  887.                 if (!empty($typeArray[$match])) {
  888.                     return $match;
  889.                 }
  890.             }
  891.         }
  892.  
  893.         return null;
  894.     }
  895.  
  896.     // }}}
  897.     // {{{ setAcceptType()
  898.  
  899.     /**
  900.      * Set the accept types for the current browser.
  901.      *
  902.      * To keep track of the mime-types, languages, charsets and encodings
  903.      * that each browser accepts we use associative arrays for each type.
  904.      * This function takes and array of accepted values for the type and
  905.      * records them for retrieval.
  906.      *
  907.      * @param  array $in_values values of the accept type
  908.      * @param  string $in_type type of accept
  909.      *
  910.      * @access public
  911.      * @return void 
  912.      */
  913.     function setAcceptType($in_values$in_type)
  914.     {
  915.         $type strtolower($in_type);
  916.  
  917.         if ($type == 'mimetype' || $type == 'language' || $type == 'charset' || $type == 'encoding'{
  918.             $typeArray &Net_UserAgent_Detect::_getStaticProperty($type);
  919.             foreach((array) $in_values as $value{
  920.                 $typeArray[$value= true;
  921.             }
  922.         }
  923.     }
  924.  
  925.     // }}}
  926.     // {{{ hasAcceptType()
  927.  
  928.     /**
  929.      * Check the accept types for the current browser.
  930.      *
  931.      * To keep track of the mime-types, languages, charsets and encodings
  932.      * that each browser accepts we use associative arrays for each type.
  933.      * This function checks the array for the given type and determines if
  934.      * the browser accepts it.
  935.      *
  936.      * @param  string $in_value values to check
  937.      * @param  string $in_type type of accept
  938.      *
  939.      * @access public
  940.      * @return bool whether or not the value is accept for this type
  941.      */
  942.     function hasAcceptType($in_value$in_type)
  943.     {
  944.         return (bool) Net_UserAgent_Detect::getAcceptType((array) $in_value$in_type);
  945.     }
  946.  
  947.     // }}}
  948.     // {{{ getUserAgent()
  949.  
  950.     /**
  951.      * Return the user agent string that is being worked on
  952.      *
  953.      * @access public
  954.      * @return string user agent
  955.      */
  956.     function getUserAgent()
  957.     {
  958.         Net_UserAgent_Detect::detect();
  959.         $userAgent &Net_UserAgent_Detect::_getStaticProperty('userAgent');
  960.         return $userAgent;
  961.     }
  962.  
  963.     // }}}
  964.     // {{{ _getStaticProperty()
  965.  
  966.     /**
  967.      * Copy of getStaticProperty() from PEAR.php to avoid having to
  968.      * include PEAR.php
  969.      *
  970.      * @access private
  971.      * @param  string $var    The variable to retrieve.
  972.      * @return mixed   A reference to the variable. If not set it will be
  973.      *                  auto initialised to NULL.
  974.      */
  975.     function &_getStaticProperty($var)
  976.     {
  977.         static $properties;
  978.         return $properties[$var];
  979.     }
  980.  
  981.     // }}}
  982. }
  983. ?>

Documentation generated on Mon, 11 Mar 2019 15:31:50 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.