<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.2.4 or newer
 *
 * NOTICE OF LICENSE
 *
 * Licensed under the Academic Free License version 3.0
 *
 * This source file is subject to the Academic Free License (AFL 3.0) that is
 * bundled with this package in the files license_afl.txt / license_afl.rst.
 * It is also available through the world wide web at this URL:
 * http://opensource.org/licenses/AFL-3.0
 * If you did not receive a copy of the license and are unable to obtain it
 * through the world wide web, please send an email to
 * licensing@ellislab.com so we can send you a copy immediately.
 *
 * @package		CodeIgniter
 * @author		EllisLab Dev Team
 * @copyright	Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/)
 * @license		http://opensource.org/licenses/AFL-3.0 Academic Free License (AFL 3.0)
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */

/*
| -------------------------------------------------------------------
| USER AGENT TYPES
| -------------------------------------------------------------------
| This file contains four arrays of user agent data.  It is used by the
| User Agent Class to help identify browser, platform, robot, and
| mobile device data.  The array keys are used to identify the device
| and the array values are used to set the actual name of the item.
|
*/

$platforms = array (
	'windows nt 6.1'	=> 'Windows 7',
	'windows nt 6.0'	=> 'Windows Vista',
	'windows nt 5.2'	=> 'Windows 2003',
	'windows nt 5.1'	=> 'Windows XP',
	'windows nt 5.0'	=> 'Windows 2000',
	'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',
	'os x'				=> 'Mac OS X',
	'ppc mac'			=> 'Power PC Mac',
	'freebsd'			=> 'FreeBSD',
	'ppc'				=> 'Macintosh',
	'linux'				=> 'Linux',
	'debian'			=> 'Debian',
	'sunos'				=> 'Sun Solaris',
	'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'
);


// The order of this array should NOT be changed. Many browsers return
// multiple browser types so we want to identify the sub-type first.
$browsers = array(
	'Flock'			=> 'Flock',
	'Chrome'		=> 'Chrome',
	'Opera'			=> 'Opera',
	'MSIE'			=> 'Internet Explorer',
	'Internet Explorer'	=> 'Internet Explorer',
	'Shiira'		=> 'Shiira',
	'Firefox'		=> 'Firefox',
	'Chimera'		=> 'Chimera',
	'Phoenix'		=> 'Phoenix',
	'Firebird'		=> 'Firebird',
	'Camino'		=> 'Camino',
	'Netscape'		=> 'Netscape',
	'OmniWeb'		=> 'OmniWeb',
	'Safari'		=> 'Safari',
	'Mozilla'		=> 'Mozilla',
	'Konqueror'		=> 'Konqueror',
	'icab'			=> 'iCab',
	'Lynx'			=> 'Lynx',
	'Links'			=> 'Links',
	'hotjava'		=> 'HotJava',
	'amaya'			=> 'Amaya',
	'IBrowse'		=> 'IBrowse'
);

$mobiles = array(
	// legacy array, old values commented out
	'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'

	// Phones and Manufacturers
	'motorola'		=> "Motorola",
	'nokia'			=> "Nokia",
	'palm'			=> "Palm",
	'iphone'		=> "Apple iPhone",
	'ipad'			=> "iPad",
	'ipod'			=> "Apple iPod Touch",
	'sony'			=> "Sony Ericsson",
	'ericsson'		=> "Sony Ericsson",
	'blackberry'	=> "BlackBerry",
	'cocoon'		=> "O2 Cocoon",
	'blazer'		=> "Treo",
	'lg'			=> "LG",
	'amoi'			=> "Amoi",
	'xda'			=> "XDA",
	'mda'			=> "MDA",
	'vario'			=> "Vario",
	'htc'			=> "HTC",
	'samsung'		=> "Samsung",
	'sharp'			=> "Sharp",
	'sie-'			=> "Siemens",
	'alcatel'		=> "Alcatel",
	'benq'			=> "BenQ",
	'ipaq'			=> "HP iPaq",
	'mot-'			=> "Motorola",
	'playstation portable'	=> "PlayStation Portable",
	'hiptop'		=> "Danger Hiptop",
	'nec-'			=> "NEC",
	'panasonic'		=> "Panasonic",
	'philips'		=> "Philips",
	'sagem'			=> "Sagem",
	'sanyo'			=> "Sanyo",
	'spv'			=> "SPV",
	'zte'			=> "ZTE",
	'sendo'			=> "Sendo",
	'dsi'			=> "Nintendo DSi",
	'ds'			=> "Nintendo DS",
	'wii'			=> "Nintendo Wii",
	'3ds'			=> "Nintendo 3DS",
	'open web'		=> "Open Web",
	'openweb'		=> "OpenWeb",

	// Operating Systems
	'android'		=> "Android",
	'symbian'		=> "Symbian",
	'SymbianOS'		=> "SymbianOS",
	'elaine'		=> "Palm",
	'palm'			=> "Palm",
	'series60'		=> "Symbian S60",
	'windows ce'	=> "Windows CE",

	// Browsers
	'obigo'			=> "Obigo",
	'netfront'		=> "Netfront Browser",
	'openwave'		=> "Openwave Browser",
	'mobilexplorer'	=> "Mobile Explorer",
	'operamini'		=> "Opera Mini",
	'opera mini'	=> "Opera Mini",
	'opera mobi'	=> "Opera Mobile",

	// Other
	'digital paths'	=> "Digital Paths",
	'avantgo'		=> "AvantGo",
	'xiino'			=> "Xiino",
	'novarra'		=> "Novarra Transcoder",
	'vodafone'		=> "Vodafone",
	'docomo'		=> "NTT DoCoMo",
	'o2'			=> "O2",

	// Fallback
	'mobile'		=> "Generic Mobile",
	'wireless'		=> "Generic Mobile",
	'j2me'			=> "Generic Mobile",
	'midp'			=> "Generic Mobile",
	'cldc'			=> "Generic Mobile",
	'up.link'		=> "Generic Mobile",
	'up.browser'	=> "Generic Mobile",
	'smartphone'	=> "Generic Mobile",
	'cellphone'		=> "Generic Mobile"
);

// There are hundreds of bots but these are the most common.
$robots = array(
	'googlebot'		=> 'Googlebot',
	'msnbot'		=> 'MSNBot',
	'bingbot'		=> 'Bing',
	'slurp'			=> 'Inktomi Slurp',
	'yahoo'			=> 'Yahoo',
	'askjeeves'		=> 'AskJeeves',
	'fastcrawler'	=> 'FastCrawler',
	'infoseek'		=> 'InfoSeek Robot 1.0',
	'lycos'			=> 'Lycos'
);

/* End of file user_agents.php */
/* Location: ./application/config/user_agents.php */
