<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Code Igniter
 *
 * An open source application development framework for PHP 4.3.2 or newer
 *
 * @package		CodeIgniter
 * @author		Rick Ellis
 * @copyright	Copyright (c) 2006, pMachine, Inc.
 * @license		http://www.codeignitor.com/user_guide/license.html 
 * @link		http://www.codeigniter.com
 * @since		Version 1.0
 * @filesource
 */
 
// ------------------------------------------------------------------------

/**
 * User Agent Class
 * 
 * Identifies the platform, browser, robot, or mobile devise of the browsing agent
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	User Agent
 * @author		Rick Ellis
 * @link		http://www.codeigniter.com/user_guide/libraries/uri.html
 */
class CI_User_agent {

	var $agent		= NULL;
	
	var $is_browser	= FALSE;
	var $is_robot	= FALSE;
	var $is_mobile	= FALSE;
	
	var $platform	= '';
	var $browser	= '';
	var $version	= '';
	var $moble		= '';
	var $robot		= '';


	var $platforms = array (
							'windows nt 6.0'	=> 'Windows Longhorn',
							'windows nt 5.2'	=> 'Windows 2003',
							'windows nt 5.0'	=> 'Windows 2000',
							'windows nt 5.1'	=> 'Windows XP',
							'windows nt 4.0'	=> 'Windows NT 4.0',
							'winnt4.0'			=> 'Windows NT 4.0',
							'winnt 4.0'			=> 'Windows NT',
							'winnt'				=> 'Windows NT',
							'windows 98'		=> 'Windows 98',
							'win98'				=> 'Windows 98',
							'windows 95'		=> 'Windows 95',
							'win95'				=> 'Windows 95',
							'windows'			=> 'Unknown Windows OS',
							'mac os x'			=> 'Mac OS X',
							'freebsd'			=> 'FreeBSD',
							'ppc'				=> 'Macintosh',
							'sunos'				=> 'Sun Solaris',
							'linux'				=> 'Linux',
							'debian'			=> 'Debian',
							'beos'				=> 'BeOS',
							'apachebench'		=> 'ApacheBench',
							'aix'				=> 'AIX',
							'irix'				=> 'Irix',
							'osf'				=> 'DEC OSF',
							'hp-ux'				=> 'HP-UX',
							'netbsd'			=> 'NetBSD',
							'bsdi'				=> 'BSDi',
							'openbsd'			=> 'OpenBSD',
							'gnu'				=> 'GNU/Linux',
							'unix'				=> 'Unknown Unix OS'
						);

	var $browsers = array(
							'Opera'				=> 'Opera',
							'MSIE'				=> 'Internet Explorer',
							'Internet Explorer'	=> 'Internet Explorer',
							'Shiira'			=> 'Shiira',
							'Firefox'			=> 'Firefox',
							'Camino'			=> 'Camino',
							'Mozilla'			=> 'Mozilla',
							'Safari'			=> 'Safari',
							'Konqueror'			=> 'Konqueror',
							'Lynx'				=> 'Lynx',
							'ANTFresco'			=> 'Fresco'
						);

	var $mobiles = array(
							'mobileexplorer'	=> 'Mobile Explorer',
							'openwave'			=> 'Open Wave',
							'opera mini'		=> 'Opera Mini',
							'operamini'			=> 'Opera Mini',
							'elaine'			=> 'Palm',
							'palmsource'		=> 'Palm',
							'digital paths'		=> 'Palm',
							'avantgo'			=> 'Avantgo',
							'xiino'				=> 'Xiino',
							'palmscape'			=> 'Palmscape',
							'nokia'				=> 'Nokia',
							'ericsson'			=> 'Ericsson',
							'blackBerry'		=> 'BlackBerry',
							'motorola'			=> 'Motorola'
						);	

	var $robots = array(
			
							'googlebot'					=> 'Googlebot',
							'msnbot'					=> 'MSNBot',
							'slurp'						=> 'Inktomi Slurp',
							'yahoo'						=> 'Yahoo',
							'askjeeves'					=> 'AskJeeves',
							'fastcrawler'				=> 'FastCrawler',
							'infoseek'					=> 'InfoSeek Robot 1.0',
							'lycos'						=> 'Lycos',
							'abcdatos'					=> 'ABCdatos BotLink',
							'Acme.Spider'				=> 'Acme.Spider',
							'ahoythehomepagefinder'		=> 'Ahoy! The Homepage Finder',
							'Alkaline'					=> 'Alkaline',
							'anthill'					=> 'Anthill',
							'appie'						=> 'Walhello appie',
							'arachnophilia'				=> 'Arachnophilia',
							'arale'						=> 'Arale',
							'araneo'					=> 'Araneo',
							'araybot'					=> 'AraybOt',
							'architext'					=> 'ArchitextSpider',
							'aretha'					=> 'Aretha',
							'ariadne'					=> 'ARIADNE',
							'arks'						=> 'arks',
							'aspider'					=> 'ASpider (Associative Spider)',
							'atn.txt'					=> 'ATN Worldwide',
							'atomz'						=> 'Atomz.com Search Robot',
							'auresys'					=> 'AURESYS',
							'backrub'					=> 'BackRub',
							'bbot'						=> 'BBot',
							'bigbrother'				=> 'Big Brother',
							'bjaaland'					=> 'Bjaaland',
							'blackwidow'				=> 'BlackWidow',
							'blindekuh'					=> 'Die Blinde Kuh',
							'Bloodhound'				=> 'Bloodhound',
							'borg-bot'					=> 'Borg-Bot',
							'boxseabot'					=> 'BoxSeaBot',
							'brightnet'					=> 'bright.net caching robot',
							'bspider'					=> 'BSpider',
							'cactvschemistryspider'		=> 'CACTVS Chemistry Spider',
							'calif'						=> 'Calif',
							'cassandra'					=> 'Cassandra',
							'cgireader'					=> 'Digimarc Marcspider/CGI',
							'checkbot'					=> 'Checkbot',
							'christcrawler'				=> 'ChristCrawler.com',
							'churl'						=> 'churl',
							'cienciaficcion'			=> 'cIeNcIaFiCcIoN.nEt',
							'cmc'						=> 'CMC/0.01',
							'Collective'				=> 'Collective',
							'combine'					=> 'Combine System',
							'confuzzledbot'				=> 'ConfuzzledBot',
							'coolbot'					=> 'CoolBot',
							'core'						=> 'Web Core / Roots',
							'cosmos'					=> 'XYLEME Robot',
							'cruiser'					=> 'Internet Cruiser Robot',
							'cusco'						=> 'Cusco',
							'cyberspyder'				=> 'CyberSpyder Link Test',
							'cydralspider'				=> 'CydralSpider',
							'desertrealm'				=> 'Desert Realm Spider',
							'deweb'						=> 'DeWeb(c) Katalog/Index',
							'dienstspider'				=> 'DienstSpider',
							'digger'					=> 'Digger',
							'diibot'					=> 'Digital Integrity Robot',
							'directhit'					=> 'Direct Hit Grabber',
							'dnabot'					=> 'DNAbot',
							'download_express'			=> 'DownLoad Express',
							'dragonbot'					=> 'DragonBot',
							'e-collector'				=> 'e-collector',
							'ebiness'					=> 'EbiNess',
							'eit'						=> 'EIT Link Verifier Robot',
							'elfinbot'					=> 'ELFINBOT',
							'emacs'						=> 'Emacs-w3 Search Engine',
							'emcspider'					=> 'ananzi',
							'esculapio'					=> 'esculapio',
							'esther'					=> 'Esther',
							'evliyacelebi'				=> 'Evliya Celebi',
							'nzexplorer'				=> 'nzexplorer',
							'fdse'						=> 'Fluid Dynamics Search Engine robot',
							'felix'						=> 'Felix IDE',
							'ferret'					=> 'Wild Ferret Web Hopper #1, #2, #3',
							'fetchrover'				=> 'FetchRover',
							'fido'						=> 'fido',
							'finnish'					=> 'Hämähäkki',
							'fireball'					=> 'KIT-Fireball',
							'fish'						=> 'Fish search',
							'fouineur'					=> 'Fouineur',
							'francoroute'				=> 'Robot Francoroute',
							'freecrawl'					=> 'Freecrawl',
							'funnelweb'					=> 'FunnelWeb',
							'gama'						=> 'gammaSpider, FocusedCrawler',
							'gazz'						=> 'gazz',
							'gcreep'					=> 'GCreep',
							'getbot'					=> 'GetBot',
							'geturl'					=> 'GetURL',
							'golem'						=> 'Golem',
							'grapnel'					=> 'Grapnel/0.01 Experiment',
							'griffon'					=> 'Griffon                                                               ',
							'gromit'					=> 'Gromit',
							'gulliver'					=> 'Northern Light Gulliver',
							'gulperbot'					=> 'Gulper Bot',
							'hambot'					=> 'HamBot',
							'harvest'					=> 'Harvest',
							'havindex'					=> 'havIndex',
							'hi'						=> 'HI (HTML Index) Search',
							'hometown'					=> 'Hometown Spider Pro',
							'wired-digital'				=> 'Wired Digital',
							'htdig'						=> 'ht://Dig',
							'htmlgobble'				=> 'HTMLgobble',
							'hyperdecontextualizer'		=> 'Hyper-Decontextualizer',
							'iajabot'					=> 'iajaBot',
							'ibm'						=> 'IBM_Planetwide',
							'iconoclast'				=> 'Popular Iconoclast',
							'Ilse'						=> 'Ingrid',
							'imagelock'					=> 'Imagelock ',
							'incywincy'					=> 'IncyWincy',
							'informant'					=> 'Informant',
							'infoseeksidewinder'		=> 'Infoseek Sidewinder',
							'infospider'				=> 'InfoSpiders',
							'inspectorwww'				=> 'Inspector Web',
							'intelliagent'				=> 'IntelliAgent',
							'irobot'					=> 'I, Robot',
							'iron33'					=> 'Iron33',
							'israelisearch'				=> 'Israeli-search',
							'javabee'					=> 'JavaBee',
							'JBot'						=> 'JBot Java Web Robot',
							'jcrawler'					=> 'JCrawler',
							'jobo'						=> 'JoBo Java Web Robot',
							'jobot'						=> 'Jobot',
							'joebot'					=> 'JoeBot',
							'jubii'						=> 'The Jubii Indexing Robot',
							'jumpstation'				=> 'JumpStation',
							'kapsi'						=> 'image.kapsi.net',
							'katipo'					=> 'Katipo',
							'kdd'						=> 'KDD-Explorer',
							'kilroy'					=> 'Kilroy',
							'ko_yappo_robot'			=> 'KO_Yappo_Robot',
							'labelgrabber.txt'			=> 'LabelGrabber',
							'larbin'					=> 'larbin',
							'legs'						=> 'legs',
							'linkidator'				=> 'Link Validator',
							'linkscan'					=> 'LinkScan',
							'linkwalker'				=> 'LinkWalker',
							'lockon'					=> 'Lockon',
							'logo_gif'					=> 'logo.gif Crawler',
							'magpie'					=> 'Magpie',
							'marvin'					=> 'marvin/infoseek',
							'mattie'					=> 'Mattie',
							'mediafox'					=> 'MediaFox',
							'merzscope'					=> 'MerzScope',
							'meshexplorer'				=> 'NEC-MeshExplorer',
							'MindCrawler'				=> 'MindCrawler',
							'mnogosearch'				=> 'mnoGoSearch search engine software',
							'moget'						=> 'moget',
							'momspider'					=> 'MOMspider',
							'monster'					=> 'Monster',
							'motor'						=> 'Motor',
							'muncher'					=> 'Muncher',
							'muninn'					=> 'Muninn',
							'muscatferret'				=> 'Muscat Ferret',
							'mwdsearch'					=> 'Mwd.Search',
							'myweb'						=> 'Internet Shinchakubin',
							'NDSpider'					=> 'NDSpider',
							'netcarta'					=> 'NetCarta WebMap Engine',
							'netmechanic'				=> 'NetMechanic',
							'netscoop'					=> 'NetScoop',
							'newscan-online'			=> 'newscan-online',
							'nhse'						=> 'NHSE Web Forager',
							'nomad'						=> 'Nomad',
							'northstar'					=> 'The NorthStar Robot',
							'objectssearch'				=> 'ObjectsSearch',
							'occam'						=> 'Occam',
							'octopus'					=> 'HKU WWW Octopus',
							'OntoSpider'				=> 'OntoSpider',
							'openfind'					=> 'Openfind data gatherer',
							'orb_search'				=> 'Orb Search',
							'packrat'					=> 'Pack Rat',
							'pageboy'					=> 'PageBoy',
							'parasite'					=> 'ParaSite',
							'patric'					=> 'Patric',
							'pegasus'					=> 'pegasus',
							'perignator'				=> 'The Peregrinator',
							'perlcrawler'				=> 'PerlCrawler 1.0',
							'phantom'					=> 'Phantom',
							'phpdig'					=> 'PhpDig',
							'pitkow'					=> 'html_analyzer',
							'pjspider'					=> 'Portal Juice Spider',
							'pka'						=> 'PGP Key Agent',
							'poppi'						=> 'Poppi',
							'portalb'					=> 'PortalB Spider',
							'psbot'						=> 'psbot',
							'Puu'						=> 'GetterroboPlus Puu',
							'python'					=> 'The Python Robot',
							'raven '					=> 'Raven Search',
							'rbse'						=> 'RBSE Spider',
							'resumerobot'				=> 'Resume Robot',
							'rhcs'						=> 'RoadHouse Crawling System',
							'rixbot'					=> 'RixBot',
							'roadrunner'				=> 'Road Runner: The ImageScape Robot',
							'robbie'					=> 'Robbie the Robot',
							'robi'						=> 'ComputingSite Robi/1.0',
							'robocrawl'					=> 'RoboCrawl Spider',
							'robofox'					=> 'RoboFox',
							'robozilla'					=> 'Robozilla',
							'roverbot'					=> 'Roverbot',
							'rules'						=> 'RuLeS',
							'safetynetrobot'			=> 'SafetyNet Robot',
							'scooter'					=> 'Scooter',
							'search_au'					=> 'Search.Aus-AU.COM',
							'search-info'				=> 'Sleek',
							'searchprocess'				=> 'SearchProcess',
							'senrigan'					=> 'Senrigan',
							'sgscout'					=> 'SG-Scout',
							'shaggy'					=> 'ShagSeeker',
							'sift'						=> 'Sift',
							'simbot'					=> 'Simmany Robot Ver1.0',
							'site-valet'				=> 'Site Valet',
							'sitetech'					=> 'SiteTech-Rover',
							'skymob'					=> 'Skymob.com',
							'slcrawler'					=> 'SLCrawler',
							'smartspider'				=> 'Smart Spider',
							'snooper'					=> 'Snooper',
							'solbot'					=> 'Solbot',
							'speedy'					=> 'Speedy Spider',
							'spider_monkey'				=> 'spider_monkey',
							'spiderbot'					=> 'SpiderBot',
							'spiderline'				=> 'Spiderline Crawler',
							'spiderman'					=> 'SpiderMan',
							'spiderview'				=> 'SpiderView(tm)',
							'spry'						=> 'Spry Wizard Robot',
							'ssearcher'					=> 'Site Searcher',
							'suke'						=> 'Suke',
							'suntek'					=> 'suntek search engine',
							'sven'						=> 'Sven',
							'sygol'						=> 'Sygol ',
							'tach_bw'					=> 'TACH Black Widow',
							'tarantula'					=> 'Tarantula',
							'tarspider'					=> 'tarspider',
							'tcl'						=> 'Tcl W3 Robot',
							'techbot'					=> 'TechBOT',
							'templeton'					=> 'Templeton',
							'titin'						=> 'TitIn',
							'titan'						=> 'TITAN',
							'tkwww'						=> 'The TkWWW Robot',
							'tlspider'					=> 'TLSpider',
							'ucsd'						=> 'UCSD Crawl',
							'udmsearch'					=> 'UdmSearch',
							'ultraseek'					=> 'Ultraseek',
							'uptimebot'					=> 'UptimeBot',
							'urlck'						=> 'URL Check',
							'valkyrie'					=> 'Valkyrie',
							'verticrawl'				=> 'Verticrawl',
							'victoria'					=> 'Victoria',
							'visionsearch'				=> 'vision-search',
							'voidbot'					=> 'void-bot',
							'voyager'					=> 'Voyager',
							'vwbot'						=> 'VWbot',
							'w3index'					=> 'The NWI Robot',
							'w3m2'						=> 'W3M2',
							'wallpaper'					=> 'WallPaper (alias crawlpaper)',
							'wanderer'					=> 'the World Wide Web Wanderer',
							'wapspider'					=> 'w@pSpider by wap4.com',
							'webbandit'					=> 'WebBandit Web Spider',
							'webcatcher'				=> 'WebCatcher',
							'webcopy'					=> 'WebCopy',
							'webfetcher'				=> 'webfetcher',
							'webfoot'					=> 'The Webfoot Robot',
							'webinator'					=> 'Webinator',
							'weblayers'					=> 'weblayers',
							'weblinker'					=> 'WebLinker',
							'webmirror'					=> 'WebMirror',
							'webmoose'					=> 'The Web Moose',
							'webquest'					=> 'WebQuest',
							'webreader'					=> 'Digimarc MarcSpider',
							'webreaper'					=> 'WebReaper',
							'webs'						=> 'webs',
							'websnarf'					=> 'Websnarf',
							'webspider'					=> 'WebSpider',
							'webvac'					=> 'WebVac',
							'webwalk'					=> 'webwalk',
							'webwalker'					=> 'WebWalker',
							'webwatch'					=> 'WebWatch',
							'wget'						=> 'Wget',
							'whatuseek'					=> 'whatUseek Winona',
							'whowhere'					=> 'WhoWhere Robot',
							'wlm'						=> 'Weblog Monitor',
							'wmir'						=> 'w3mir',
							'wolp'						=> 'WebStolperer',
							'wombat'					=> 'The Web Wombat ',
							'worm'						=> 'The World Wide Web Worm',
							'wwwc'						=> 'WWWC Ver 0.2.5',
							'wz101'						=> 'WebZinger',
							'xget'						=> 'XGET',				
						);	


	
	/**
	 * Constructor
	 *
	 * Sets the User Agent and runs the compilation routine
	 *
	 * @access	public
	 * @return	void
	 */		
	function CI_User_agent()
	{
		if (isset($_SERVER['HTTP_USER_AGENT']))
		{
			$this->agent = trim($_SERVER['HTTP_USER_AGENT']);
		}
		
		if ( ! is_null($this->agent))
		{
			$this->_compile_data();
		}
	}
	
	// --------------------------------------------------------------------
	
	/**
	 * Compile the User Agent Data
	 *
	 * @access	private
	 * @return	bool
	 */		
	function _compile_data()
	{
		$this->_set_platform();
	
		foreach (array('_set_browser', '_set_robot', '_set_mobile') as $function)
		{
			if ($this->$function() === TRUE)
			{
				break;
			}
		}	
	}
	
	// --------------------------------------------------------------------
	
	/**
	 * Set the Platform
	 *
	 * @access	private
	 * @return	mixed
	 */		
	function _set_platform()
	{
		foreach ($this->platforms as $key => $val) 
		{
			if (preg_match("|$key|i", $this->agent)) 
			{
				$this->platform = $val;
				return TRUE;
			}
		}
	
		$this->platform = 'Unknown Platform';
	}

	// --------------------------------------------------------------------
	
	/**
	 * Set the Browser
	 *
	 * @access	private
	 * @return	bool
	 */		
	function _set_browser()
	{
		foreach ($this->browsers as $key => $val) 
		{		
			if (preg_match("|".$key.".*?([0-9\.]+)|i", $this->agent, $match)) 
			{
				$this->is_browser = TRUE;
				$this->version = $match[1];
				$this->browser = $val;
				return TRUE;
			}
		}
		
		return FALSE;
	}
		
	// --------------------------------------------------------------------
	
	/**
	 * Set the Robot
	 *
	 * @access	private
	 * @return	bool
	 */		
	function _set_robot()
	{
		foreach ($this->robots as $key => $val) 
		{
			if (preg_match("|$key|i", $this->agent)) 
			{
				$this->is_robot = TRUE;
				$this->robot = $val;
				return TRUE;
			}
		}
	
		return FALSE;
	}

	// --------------------------------------------------------------------
	
	/**
	 * Set the Mobile Devise
	 *
	 * @access	private
	 * @return	bool
	 */		
	function _set_mobile()
	{
		foreach ($this->mobiles as $key => $val) 
		{
			if (FALSE !== (strpos(strtolower($this->agent), $key)))
			{
				$this->is_mobile = TRUE;
				$this->mobile = $val;
				return TRUE;
			}
		}
	
		return FALSE;
	}
	

	// --------------------------------------------------------------------
	
	/**
	 * Is Browser
	 *
	 * @access	public
	 * @return	bool
	 */		
	function is_browser()
	{
		return $this->is_browser;
	}

	// --------------------------------------------------------------------
	
	/**
	 * Is Robot
	 *
	 * @access	public
	 * @return	bool
	 */		
	function is_robot()
	{
		return $this->is_robot;
	}

	// --------------------------------------------------------------------
	
	/**
	 * Is Mobile
	 *
	 * @access	public
	 * @return	bool
	 */		
	function is_mobile()
	{
		return $this->is_mobile;
	}	

	// --------------------------------------------------------------------
	
	/**
	 * Get Platform
	 *
	 * @access	public
	 * @return	string
	 */			
	function get_platform()
	{
		return $this->platform;
	}

	// --------------------------------------------------------------------
	
	/**
	 * Get Browser Name
	 *
	 * @access	public
	 * @return	string
	 */			
	function get_browser()
	{
		return $this->browser;
	}

	// --------------------------------------------------------------------
	
	/**
	 * Get the Browser Version
	 *
	 * @access	public
	 * @return	string
	 */			
	function get_version()
	{
		return $this->version;
	}

	// --------------------------------------------------------------------
	
	/**
	 * Get The Robot Name
	 *
	 * @access	public
	 * @return	string
	 */				
	function get_robot()
	{
		return $this->robot;
	}
	// --------------------------------------------------------------------
	
	/**
	 * Get the Mobile Devise
	 *
	 * @access	public
	 * @return	string
	 */			
	function get_mobile()
	{
		return $this->mobile;
	}
	
	
}

?>