<?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",
// 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 */