<?php

/**
 * Copyright 2008-2016 Kyle Baker (Email: kyleabaker@gmail.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

/* Partly modified by Hakula */

/* Detect Web Browser Version */
function get_browser_version($ua, $title) {
    // Grab the browser version if it's present
    preg_match('/' . $title . '[\ |\/|\:]?([.0-9a-zA-Z]+)/i', $ua, $regmatch);
    $version = (is_null($regmatch[1])) ? '' : $regmatch[1];
    return $version;
}

/* Detect Web Browsers */
function get_browser_name($ua) {
    $version = '';
    $code = null;

    if (preg_match('/360se/i', $ua)) {
        $title = '360 安全浏览器';
        $code = '360';
    } elseif (preg_match('/baidubrowser/i', $ua) || preg_match('/\ Spark/i', $ua)) {
        $title = '百度浏览器';
        $version = get_browser_version($ua, 'Browser');
        $code = 'BaiduBrowser';
    } elseif (preg_match('/SE\ /i', $ua) && preg_match('/MetaSr/i', $ua)) {
        $title = '搜狗高速浏览器';
        $code = 'Sogou-Explorer';
    } elseif (preg_match('/QQBrowser/i', $ua) || preg_match('/MQQBrowser/i', $ua)) {
        $title = 'QQ 浏览器';
        $version = get_browser_version($ua, 'QQBrowser');
        $code = 'QQBrowser';
    } elseif (preg_match('/chromeframe/i', $ua)) {
        $title = 'Google Chrome Frame';
        $version = get_browser_version($ua, 'chromeframe');
        $code = 'Chrome';
    } elseif (preg_match('/Chromium/i', $ua)) {
        $title = 'Chromium';
        $version = get_browser_version($ua, 'Chromium');
    } elseif (preg_match('/CrMo/i', $ua)) {
        $title = 'Google Chrome Mobile';
        $version = get_browser_version($ua, 'CrMo');
        $code = 'Chrome';
    } elseif (preg_match('/CriOS/i', $ua)) {
        $title = 'Google Chrome for iOS';
        $version = get_browser_version($ua, 'CriOS');
        $code = 'Chrome';
    } elseif (preg_match('/Maxthon/i', $ua)) {
        $title = '傲游浏览器';
        $version = get_browser_version($ua, 'Maxthon');
        $code = 'Maxthon';
    } elseif (preg_match('/MiuiBrowser/i', $ua)) {
        $title = 'MIUI Browser';
        $version = get_browser_version($ua, 'MiuiBrowser');
        $code = 'MIUI-Browser';
    } elseif (preg_match('/TheWorld/i', $ua)) {
        $title = '世界之窗浏览器';
        $code = 'TheWorld';
    } elseif (preg_match('/UBrowser/i', $ua)) {
        $title = 'UC 浏览器';
        $version = get_browser_version($ua, 'UBrowser');
        $code = 'UC';
    } elseif (preg_match('/UCBrowser/i', $ua)) {
        $title = 'UC 浏览器';
        $version = get_browser_version($ua, 'UCBrowser');
        $code = 'UC';
    } elseif (preg_match('/UC\ Browser/i', $ua)) {
        $title = 'UC 浏览器';
        $version = get_browser_version($ua, 'UC Browser');
        $code = 'UC';
    } elseif (preg_match('/UCWEB/i', $ua)) {
        $title = 'UC 浏览器';
        $version = get_browser_version($ua, 'UCWEB');
        $code = 'UC';
    } elseif (preg_match('/BlackBerry/i', $ua)) {
        $title = 'BlackBerry';
    } elseif (preg_match('/Coast/i', $ua)) {
        $title = 'Coast';
        $version = get_browser_version($ua, 'Coast');
        $code = 'Opera';
    } elseif (preg_match('/IEMobile/i', $ua)) {
        $title = 'IE Mobile';
        $code = 'IE';
    } elseif (preg_match('/LG Browser/i', $ua)) {
        $title = 'LG Web Browser';
        $version = get_browser_version($ua, 'Browser');
        $code = 'LG';
    } elseif (preg_match('/Navigator/i', $ua)) {
        $title = 'Netscape Navigator';
        $code = 'Netscape';
    } elseif (preg_match('/Netscape/i', $ua)) {
        $title = 'Netscape';
    } elseif (preg_match('/Nintendo 3DS/i', $ua)) {
        $title = 'Nintendo 3DS';
        $code = 'Nintendo';
    } elseif (preg_match('/NintendoBrowser/i', $ua)) {
        $title = 'Nintendo Browser';
        $version = get_browser_version($ua, 'Browser');
        $code = 'Nintendo';
    } elseif (preg_match('/NokiaBrowser/i', $ua)) {
        $title = 'Nokia Browser';
        $version = get_browser_version($ua, 'Browser');
        $code = 'Nokia';
    } elseif (preg_match('/Opera Mini/i', $ua)) {
        $title = 'Opera Mini';
        $code = 'Opera';
    } elseif (preg_match('/Opera Mobi/i', $ua)) {
        if (preg_match('/Version/i', $ua)) {
            $version = get_browser_version($ua, 'Version');
        } else {
            $version = get_browser_version($ua, 'Opera Mobi');
        }
        $title = 'Opera Mobile';
        $code = 'Opera';
    } elseif (preg_match('/Opera/i', $ua) || preg_match('/OPR/i', $ua)) {
        $title = 'Opera';
        $code = 'Opera';
        // How is version stored on this Opera ua?
        if (preg_match('/Version/i', $ua)) {
            $version = get_browser_version($ua, 'Version');
        } elseif (preg_match('/OPR/i', $ua)) {
            $version = get_browser_version($ua, 'OPR');
        } else {
            // Use Opera as fallback since full title may change (Next, Developer, etc.)
            $version = get_browser_version($ua, 'Opera');
        }
        // Parse full edition name, ex: Opera/9.80 (X11; Linux x86_64; U; Edition Labs Camera and Pages; Ubuntu/11.10; en) Presto/2.9.220 Version/12.00
        if (preg_match('/Edition ([\ ._0-9a-zA-Z]+)/i', $ua, $regmatch)) {
            $title .= ' ' . $regmatch[1];
        } elseif (preg_match('/Opera ([\ ._0-9a-zA-Z]+)/i', $ua, $regmatch)) {
            $title .= ' ' . $regmatch[1];
        }
    } elseif (preg_match('/PlayStation\ 4/i', $ua)) {
        $title = 'PS4 Web Browser';
        $code = 'PS4';
    } elseif (preg_match('/SEMC-Browser/i', $ua)) {
        $title = 'SEMC Browser';
        $version = get_browser_version($ua, 'SEMC-Browser');
        $code = 'Sony';
    } elseif (preg_match('/SEMC-java/i', $ua)) {
        $title = 'SEMC Java';
        $code = 'Sony';
    } elseif (preg_match('/Series60/i', $ua) && !preg_match('/Symbian/i', $ua)) {
        $title = 'Nokia S60';
        $version = get_browser_version($ua, 'Series60');
        $code = 'Nokia';
    } elseif (preg_match('/S60/i', $ua) && !preg_match('/Symbian/i', $ua)) {
        $title = 'Nokia S60';
        $version = get_browser_version($ua, 'S60');
        $code = 'Nokia';
    } elseif (preg_match('/TencentTraveler/i', $ua)) {
        $title = 'TT 浏览器';
        $version = get_browser_version($ua, 'TencentTraveler');
        $code = 'QQBrowser';
    } elseif ((preg_match('/Ubuntu\;\ Mobile/i', $ua) || preg_match('/Ubuntu\;\ Tablet/i', $ua) && preg_match('/WebKit/i', $ua))) {
        $title = 'Ubuntu Web Browser';
        $code = 'Ubuntu';
    } elseif (preg_match('/AppleWebkit/i', $ua) && preg_match('/Android/i', $ua) && !preg_match('/Chrome/i', $ua)) {
        $title = 'Android Webkit';
        $version = get_browser_version($ua, 'Version');
        $code = 'Android-Webkit';
    } elseif (preg_match('/Chrome/i', $ua) && preg_match('/Mobile/i', $ua) && (preg_match('/Version/i', $ua) || preg_match('/wv/i', $ua))) {
        $title = 'WebView';
        $version = get_browser_version($ua, 'Version');
        $code = 'Android-Webkit';
    }
    // Pulled out of order to help ensure better detection for above browsers
    elseif (preg_match('/Edge/i', $ua) && preg_match('/Chrome/i', $ua) && preg_match('/Safari/i', $ua)) {
        $title = 'Microsoft Edge';
        $version = get_browser_version($ua, 'Edge');
        $code = 'Edge';
    } elseif (preg_match('/Chrome/i', $ua)) {
        $title = 'Google Chrome';
        $version = get_browser_version($ua, 'Chrome');
        $code = 'Chrome';
    } elseif (preg_match('/Safari/i', $ua) && !preg_match('/Nokia/i', $ua)) {
        $title = 'Safari';
        $code = 'Safari';
        if (preg_match('/Version/i', $ua)) {
            $version = get_browser_version($ua, 'Version');
        }
        if (preg_match('/Mobile Safari/i', $ua)) {
            $title = 'Mobile ' . $title;
        }
    } elseif (preg_match('/Nokia/i', $ua)) {
        $title = 'Nokia Web Browser';
        $code = 'Nokia';
    } elseif (preg_match('/Firefox/i', $ua)) {
        $title = 'Firefox';
        $version = get_browser_version($ua, 'Firefox');
    } elseif (preg_match('/MSIE/i', $ua) || preg_match('/Trident/i', $ua)) {
        $title = 'Internet Explorer';
        $code = 'IE';
        if (preg_match('/\ rv:([.0-9a-zA-Z]+)/i', $ua)) {
            // IE11 or newer
            $version = get_browser_version($ua, ' rv');
        } else {
            // IE10 or older, regex: '/MSIE[\ |\/]?([.0-9a-zA-Z]+)/i'
            $version = get_browser_version($ua, 'MSIE');
        }
        // Detect compatibility mode for IE
        if ($version === '7.0' && preg_match('/Trident\/4.0/i', $ua)) {
            $version = '8.0 (Compatibility Mode)';
        }
    } elseif (preg_match('/Mozilla/i', $ua)) {
        $title = 'Mozilla';
        $version = get_browser_version($ua, ' rv');
        if (empty($version)) {
            $title .= ' Compatible';
            $code = 'Mozilla';
        }
    }
    // No Web browser match
    else {
        $title = 'Other Browser';
        $code = 'Others';
    }
    if (is_null($code)) {
        $code = $title;
    }
    if ($version != '') {
        $title .= " $version";
    }

    $result['code'] = $code;
    $result['title'] = $title;
    return $result;
}