<?php
/**
 * ************************************************************
 * phpStyles 0.1
 * http://skindeep.logankoester.com/
 * Easily create browser-specific CSS rules to tweak those
 * naughty bits.
 * 
 * Version: 0.1
 * Author: Logan Koester
 * Author URI: http://logankoester.com
 * 
 * Usage: You can embed dynamic rules directly into your stylesheets, just 
 *        call it something like "style.css.php", and then use create a
 *        RewriteRule pointing "style.css" to "style.css.php" for
 *        complete transparency.
 * 
 * Example usage:
 * 
 *        <?php
 *        // #footer color is white in any browser but firefox
 *        require_once('phpStyles.inc.php');
 *        $css = new phpStyles(); ?>
 *        body { background-color: #1a1a1a; }
 *        <?php $css->ruleset('#footer', 'text-align: center;
 *                                        color: white;');
 *        $css->ruleset('#footer', 'color: red;', 'Firefox'); ?>
 *         
 * ************************************************************
 */

/*  Copyright 2006  Logan Koester  (email : logan@logankoester.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 2 of the License, or
(at your option) 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

class phpStyles {
    var 
$browser;

    function 
phpStyles() {
        
$this->browser = new Browser;
    }

    function 
ruleset($name$value$browser false$platform false$version false) {
        
$ruleset['name'] = $name;
        
$ruleset['value'] = $value;
        
$ruleset['platform'] = $platform;
        
$ruleset['browser'] = $browser;
        
$ruleset['version'] = $version;
        if (
$this->environment($ruleset)) {
            echo 
$ruleset['name']." {\n".Clean::Clean(($ruleset['value']))."}\n";
        }
    }

    function 
environment($ruleset) {
        
// Test if $style should be used in the current environment
        
$browser $this->browser;
        if (
$ruleset['platform'] == $browser->Platform || !$ruleset['platform']) {
            if (
$ruleset['browser'] == $browser->Name || !$ruleset['browser']) {
                if (
$ruleset['version'] == $browser->Version || !$ruleset['version']) {
                    return 
true;
                }
            }
        }
        return 
false;
    }

}

class 
Clean {
    
/**
     * ***********************************************
     * Perhaps a misnomer , this is an extraordinarily
     * messy class that I really don't have time to
     * clean just yet ;)
     * ***********************************************
     */
    // Clean up the rules a bit if you like. Be careful
    
function Clean($string) {
        
$rules Clean::breakRules($string);
        foreach (
$rules as $rule) {
            
$cleaned .= '    '.$rule.";\n";
        }
        return 
$cleaned;
    }

    function 
stripWhite($string) {
        
$string str_replace("\r"''$string);
        
$string str_replace("\n"''$string);
        
$string str_replace("\t"''$string);
        
$string str_replace(' '''$string);
        return 
$string;
    }
    function 
breakRules($string) {
        
// Splits a string containing multiple CSS rules, returning an array.
        
$string Clean::stripWhite($string);
        if (
substr($string, -11) != ';'$string .= ';';
        
$rules explode(';'$string);
        
array_pop($rules);
        return 
$rules;
    }
}

/*****************************************************************

File name: browser.php
Author: Gary White
Last modified: November 10, 2003

**************************************************************

Copyright (C) 2003  Gary White

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 2
of the License, or (at your option) 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 at:
http://www.gnu.org/copyleft/gpl.html

**************************************************************

Browser class

Identifies the user's Operating system, browser and version
by parsing the HTTP_USER_AGENT string sent to the server

Typical Usage:

require_once($_SERVER['DOCUMENT_ROOT'].'/include/browser.php');
$br = new Browser;
echo "$br->Platform, $br->Name version $br->Version";

For operating systems, it will correctly identify:
Microsoft Windows
MacIntosh
Linux

Anything not determined to be one of the above is considered to by Unix
because most Unix based browsers seem to not report the operating system.
The only known problem here is that, if a HTTP_USER_AGENT string does not
contain the operating system, it will be identified as Unix. For unknown
browsers, this may not be correct.

For browsers, it should correctly identify all versions of:
Amaya
Galeon
iCab
Internet Explorer
For AOL versions it will identify as Internet Explorer (AOL) and the version
will be the AOL version instead of the IE version.
Konqueror
Lynx
Mozilla
Netscape Navigator/Communicator
OmniWeb
Opera
Pocket Internet Explorer for handhelds
Safari
WebTV
*****************************************************************/

class browser{

    var 
$Name "Unknown";
    var 
$Version "Unknown";
    var 
$Platform "Unknown";
    var 
$UserAgent "Not reported";
    var 
$AOL false;

    function 
browser(){
        
$agent $_SERVER['HTTP_USER_AGENT'];

        
// initialize properties
        
$bd['platform'] = "Unknown";
        
$bd['browser'] = "Unknown";
        
$bd['version'] = "Unknown";
        
$this->UserAgent $agent;

        
// find operating system
        
if (eregi("win"$agent))
        
$bd['platform'] = "Windows";
        elseif (
eregi("mac"$agent))
        
$bd['platform'] = "MacIntosh";
        elseif (
eregi("linux"$agent))
        
$bd['platform'] = "Linux";
        elseif (
eregi("OS/2"$agent))
        
$bd['platform'] = "OS/2";
        elseif (
eregi("BeOS"$agent))
        
$bd['platform'] = "BeOS";

        
// test for Opera
        
if (eregi("opera",$agent)){
            
$val stristr($agent"opera");
            if (
eregi("/"$val)){
                
$val explode("/",$val);
                
$bd['browser'] = $val[0];
                
$val explode(" ",$val[1]);
                
$bd['version'] = $val[0];
            }else{
                
$val explode(" ",stristr($val,"opera"));
                
$bd['browser'] = $val[0];
                
$bd['version'] = $val[1];
            }

            
// test for WebTV
        
}elseif(eregi("webtv",$agent)){
            
$val explode("/",stristr($agent,"webtv"));
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];

            
// test for MS Internet Explorer version 1
        
}elseif(eregi("microsoft internet explorer"$agent)){
            
$bd['browser'] = "MSIE";
            
$bd['version'] = "1.0";
            
$var stristr($agent"/");
            if (
ereg("308|425|426|474|0b1"$var)){
                
$bd['version'] = "1.5";
            }

            
// test for NetPositive
        
}elseif(eregi("NetPositive"$agent)){
            
$val explode("/",stristr($agent,"NetPositive"));
            
$bd['platform'] = "BeOS";
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];

            
// test for MS Internet Explorer
        
}elseif(eregi("msie",$agent) && !eregi("opera",$agent)){
            
$val explode(" ",stristr($agent,"msie"));
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];

            
// test for MS Pocket Internet Explorer
        
}elseif(eregi("mspie",$agent) || eregi('pocket'$agent)){
            
$val explode(" ",stristr($agent,"mspie"));
            
$bd['browser'] = "MSPIE";
            
$bd['platform'] = "WindowsCE";
            if (
eregi("mspie"$agent))
            
$bd['version'] = $val[1];
            else {
                
$val explode("/",$agent);
                
$bd['version'] = $val[1];
            }

            
// test for Galeon
        
}elseif(eregi("galeon",$agent)){
            
$val explode(" ",stristr($agent,"galeon"));
            
$val explode("/",$val[0]);
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];

            
// test for Konqueror
        
}elseif(eregi("Konqueror",$agent)){
            
$val explode(" ",stristr($agent,"Konqueror"));
            
$val explode("/",$val[0]);
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];

            
// test for iCab
        
}elseif(eregi("icab",$agent)){
            
$val explode(" ",stristr($agent,"icab"));
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];

            
// test for OmniWeb
        
}elseif(eregi("omniweb",$agent)){
            
$val explode("/",stristr($agent,"omniweb"));
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];

            
// test for Phoenix
        
}elseif(eregi("Phoenix"$agent)){
            
$bd['browser'] = "Phoenix";
            
$val explode("/"stristr($agent,"Phoenix/"));
            
$bd['version'] = $val[1];

            
// test for Firebird
        
}elseif(eregi("firebird"$agent)){
            
$bd['browser']="Firebird";
            
$val stristr($agent"Firebird");
            
$val explode("/",$val);
            
$bd['version'] = $val[1];

            
// test for Firefox
        
}elseif(eregi("Firefox"$agent)){
            
$bd['browser']="Firefox";
            
$val stristr($agent"Firefox");
            
$val explode("/",$val);
            
$bd['version'] = $val[1];

            
// test for Mozilla Alpha/Beta Versions
        
}elseif(eregi("mozilla",$agent) &&
        
eregi("rv:[0-9].[0-9][a-b]",$agent) && !eregi("netscape",$agent)){
            
$bd['browser'] = "Mozilla";
            
$val explode(" ",stristr($agent,"rv:"));
            
eregi("rv:[0-9].[0-9][a-b]",$agent,$val);
            
$bd['version'] = str_replace("rv:","",$val[0]);

            
// test for Mozilla Stable Versions
        
}elseif(eregi("mozilla",$agent) &&
        
eregi("rv:[0-9]\.[0-9]",$agent) && !eregi("netscape",$agent)){
            
$bd['browser'] = "Mozilla";
            
$val explode(" ",stristr($agent,"rv:"));
            
eregi("rv:[0-9]\.[0-9]\.[0-9]",$agent,$val);
            
$bd['version'] = str_replace("rv:","",$val[0]);

            
// test for Lynx & Amaya
        
}elseif(eregi("libwww"$agent)){
            if (
eregi("amaya"$agent)){
                
$val explode("/",stristr($agent,"amaya"));
                
$bd['browser'] = "Amaya";
                
$val explode(" "$val[1]);
                
$bd['version'] = $val[0];
            } else {
                
$val explode("/",$agent);
                
$bd['browser'] = "Lynx";
                
$bd['version'] = $val[1];
            }

            
// test for Safari
        
}elseif(eregi("safari"$agent)){
            
$bd['browser'] = "Safari";
            
$bd['version'] = "";

            
// remaining two tests are for Netscape
        
}elseif(eregi("netscape",$agent)){
            
$val explode(" ",stristr($agent,"netscape"));
            
$val explode("/",$val[0]);
            
$bd['browser'] = $val[0];
            
$bd['version'] = $val[1];
        }elseif(
eregi("mozilla",$agent) && !eregi("rv:[0-9]\.[0-9]\.[0-9]",$agent)){
            
$val explode(" ",stristr($agent,"mozilla"));
            
$val explode("/",$val[0]);
            
$bd['browser'] = "Netscape";
            
$bd['version'] = $val[1];
        }

        
// clean up extraneous garbage that may be in the name
        
$bd['browser'] = ereg_replace("[^a-z,A-Z]"""$bd['browser']);
        
// clean up extraneous garbage that may be in the version
        
$bd['version'] = ereg_replace("[^0-9,.,a-z,A-Z]"""$bd['version']);

        
// check for AOL
        
if (eregi("AOL"$agent)){
            
$var stristr($agent"AOL");
            
$var explode(" "$var);
            
$bd['aol'] = ereg_replace("[^0-9,.,a-z,A-Z]"""$var[1]);
        }

        
// finally assign our properties
        
$this->Name $bd['browser'];
        
$this->Version $bd['version'];
        
$this->Platform $bd['platform'];
        
$this->AOL $bd['aol'];
    }
}

?>