<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 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 - 2011, 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",

					// 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',
					'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 */
