View source
<?php
define('BROWSERCLASS_OPERATION_WITHOUT_JS', 0);
define('BROWSERCLASS_OPERATION_WITH_JS', 1);
define('BROWSERCLASS_BROWSER', 1);
define('BROWSERCLASS_PLATFORM', 2);
define('BROWSERCLASS_MOBILE', 4);
define('BROWSERCLASS_OTHER_CLASSES', 8);
define('BROWSERCLASS_ALL', BROWSERCLASS_BROWSER | BROWSERCLASS_PLATFORM | BROWSERCLASS_MOBILE | BROWSERCLASS_OTHER_CLASSES);
function browserclass_menu() {
$items = array();
$items['admin/settings/browserclass'] = array(
'title' => 'Browser class',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'browserclass_settings_form',
),
'access arguments' => array(
'administer browser class',
),
);
return $items;
}
function browserclass_perm() {
return array(
'administer browser class',
);
}
function browserclass_init() {
if ((variable_get('browserclass_operation', BROWSERCLASS_OPERATION_WITHOUT_JS) == BROWSERCLASS_OPERATION_WITH_JS || variable_get('cache', CACHE_DISABLED) != CACHE_DISABLED) && ($browser_classes = browserclass_get_classes())) {
drupal_add_js(drupal_get_path('module', 'browserclass') . '/browserclass.js', 'module', 'footer');
}
}
function browserclass_token_list($type = 'all') {
$tokens = array();
if ($type == 'global' || $type == 'user' || $type == 'all') {
$tokens['all']['browserclass'] = t('The current user\'s browser classes.');
$tokens['all']['browserclass-browser'] = t('Browser type');
$tokens['all']['browserclass-platform'] = t('Platform');
$tokens['all']['browserclass-mobile'] = t('Device info');
$tokens['all']['browserclass-hook-classes'] = t('Extra hook classes');
}
return $tokens;
}
function browserclass_token_values($type, $object = NULL) {
$values = array();
if ($type == 'global' || $type == 'user' || $type == 'all') {
$browser_classes = browserclass_get_classes();
$values['browserclass'] = implode(' ', $browser_classes);
$values['browserclass-browser'] = implode(' ', browserclass_get_classes(BROWSERCLASS_BROWSER));
$values['browserclass-platform'] = implode(' ', browserclass_get_classes(BROWSERCLASS_PLATFORM));
$values['browserclass-mobile'] = implode(' ', browserclass_get_classes(BROWSERCLASS_MOBILE));
$values['browserclass-hook-classes'] = implode(' ', browserclass_get_classes(BROWSERCLASS_OTHER_CLASSES));
}
return $values;
}
function browserclass_preprocess_page(&$vars) {
if (variable_get('browserclass_operation', BROWSERCLASS_OPERATION_WITHOUT_JS) == BROWSERCLASS_OPERATION_WITHOUT_JS && variable_get('cache', CACHE_DISABLED) == CACHE_DISABLED && ($browser_classes = browserclass_get_classes())) {
$vars['body_classes'] .= ' ' . implode(' ', $browser_classes);
$vars['browser_classes'] = $browser_classes;
}
}
function browserclass_settings_form(&$form_state) {
$form = array();
$form['browserclass_operation'] = array(
'#type' => 'radios',
'#title' => t('Operation'),
'#options' => array(
BROWSERCLASS_OPERATION_WITH_JS => t('Always add the class with JavaScript'),
BROWSERCLASS_OPERATION_WITHOUT_JS => t('Only use JavaScript if page cache is enabled'),
),
'#default_value' => variable_get('browserclass_operation', BROWSERCLASS_OPERATION_WITHOUT_JS),
);
return system_settings_form($form);
}
function browserclass_get_classes($types = BROWSERCLASS_ALL) {
$classes = array();
if (isset($_SERVER['HTTP_USER_AGENT'])) {
$agent = strtolower($_SERVER['HTTP_USER_AGENT']);
if ($types & BROWSERCLASS_BROWSER) {
$classes = array_merge($classes, browserclass_check_browser($agent));
}
if ($types & BROWSERCLASS_PLATFORM) {
$classes = array_merge($classes, browserclass_check_platform($agent));
}
if ($types & BROWSERCLASS_OTHER_CLASSES) {
$classes = array_merge($classes, module_invoke_all('browserclass_classes', $agent));
}
if ($types & BROWSERCLASS_MOBILE) {
$classes[] = browserclass_is_mobile_devide($agent, $classes) ? 'mobile' : 'desktop';
}
}
return $classes;
}
function browserclass_check_browser($agent) {
$classes = array();
if (stristr($agent, 'msie') !== FALSE) {
$classes[] = 'ie';
$pattern = '/.*msie ([0-9]*)\\..*/';
$matches = array();
preg_match($pattern, $agent, $matches);
if ($matches[1]) {
$classes[] = 'ie' . $matches[1];
}
}
if (stristr($agent, 'opera') !== FALSE) {
$classes[] = 'opera';
$aresult = explode('/', stristr($agent, 'version'));
if (isset($aresult[1])) {
$aversion = explode(' ', $aresult[1]);
$classes[] = 'opera' . _browserclass_clear_version($aversion[0]);
}
}
if (stristr($agent, 'chrome') !== FALSE) {
$classes[] = 'chrome';
$aresult = explode('/', stristr($agent, 'chrome'));
$aversion = explode(' ', $aresult[1]);
$classes[] = 'chrome' . _browserclass_clear_version($aversion[0]);
}
elseif (stristr($agent, 'safari') !== FALSE) {
$classes[] = 'safari';
$aresult = explode('/', stristr($agent, 'version'));
if (isset($aresult[1])) {
$aversion = explode(' ', $aresult[1]);
$classes[] = 'safari' . _browserclass_clear_version($aversion[0]);
}
}
if (stristr($agent, 'netscape') !== FALSE) {
$classes[] = 'netscape';
if (preg_match('/navigator\\/([^ ]*)/', $agent, $matches)) {
$classes[] = 'netscape' . _browserclass_clear_version($matches[1]);
}
elseif (preg_match('/netscape6?\\/([^ ]*)/', $agent, $matches)) {
$classes[] = 'netscape' . _browserclass_clear_version($matches[1]);
}
}
if (stristr($agent, 'firefox') !== FALSE) {
$classes[] = 'ff';
if (preg_match("/firefox[\\/ \\(]([^ ;\\)]+)/", $agent, $matches)) {
$classes[] = 'ff' . _browserclass_clear_version($matches[1]);
}
}
if (stristr($agent, 'konqueror') !== FALSE) {
$classes[] = 'konqueror';
$aresult = explode(' ', stristr($agent, 'konqueror'));
$aversion = explode('/', $aresult[0]);
$classes[] = 'konqueror' . _browserclass_clear_version($aversion[1]);
}
if (stristr($agent, 'dillo') !== FALSE) {
$classes[] = 'dillo';
}
if (stristr($agent, 'chimera') !== FALSE) {
$classes[] = 'chimera';
}
if (stristr($agent, 'beonex') !== FALSE) {
$classes[] = 'beonex';
}
if (stristr($agent, 'aweb') !== FALSE) {
$classes[] = 'aweb';
}
if (stristr($agent, 'amaya') !== FALSE) {
$classes[] = 'amaya';
}
if (stristr($agent, 'icab') !== FALSE) {
$classes[] = 'icab';
}
if (stristr($agent, 'lynx') !== FALSE) {
$classes[] = 'lynx';
}
if (stristr($agent, 'galeon') !== FALSE) {
$classes[] = 'galeon';
}
if (stristr($agent, 'opera mini') !== FALSE) {
$classes[] = 'operamini';
$resultant = stristr($agent, 'opera mini');
if (preg_match('/\\//', $resultant)) {
$aresult = explode('/', $resultant);
$aversion = explode(' ', $aresult[1]);
$classes[] = 'operamini' . _browserclass_clear_version($aversion[0]);
}
else {
$aversion = explode(' ', stristr($resultant, 'opera mini'));
$classes[] = 'operamini' . _browserclass_clear_version($aversion[1]);
}
}
return $classes;
}
function browserclass_check_platform($agent) {
$classes = array();
if (stristr($agent, 'windows') !== FALSE) {
$classes[] = 'win';
}
elseif (stristr($agent, 'ipad') !== FALSE) {
$classes[] = 'ipad';
}
elseif (stristr($agent, 'ipod') !== FALSE) {
$classes[] = 'ipod';
}
elseif (stristr($agent, 'iphone') !== FALSE) {
$classes[] = 'iphone';
}
elseif (stristr($agent, 'mac') !== FALSE) {
$classes[] = 'mac';
}
elseif (stristr($agent, 'android') !== FALSE) {
$classes[] = 'android';
}
elseif (stristr($agent, 'linux') !== FALSE) {
$classes[] = 'linux';
}
elseif (stristr($agent, 'nokia') !== FALSE) {
$classes[] = 'nokia';
}
elseif (stristr($agent, 'blackberry') !== FALSE) {
$classes[] = 'blackberry';
}
elseif (stristr($agent, 'freebsd') !== FALSE) {
$classes[] = 'freebsd';
}
elseif (stristr($agent, 'openbsd') !== FALSE) {
$classes[] = 'openbsd';
}
elseif (stristr($agent, 'netbsd') !== FALSE) {
$classes[] = 'netbsd';
}
return $classes;
}
function browserclass_is_mobile_devide($agent, $classes) {
$mobile_devices = array(
'ipad',
'ipod',
'iphone',
'android',
'blackberry',
'operamini',
);
foreach ($mobile_devices as $mobile) {
if (in_array($mobile, $classes)) {
return TRUE;
}
}
if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {
return TRUE;
}
if (preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|pocket|kindle|mobile|pda|psp|treo)/', $agent)) {
return TRUE;
}
return FALSE;
}
function _browserclass_clear_version($version) {
$version = preg_replace('/[^0-9,.,a-z,A-Z-]/', '', $version);
return substr($version, 0, strpos($version, '.'));
}