/**
 * Misc. environment functions
 *
 * @changes 2005-12-05 / marc / Created
 *
 * @copyright Copyright © 2005 / CHILIBYTES Böhm & Welte GbR / www.chilibytes.com
 * @author marc
 * @version 0.0.1
 * @package Javascript
 * @subpackage Environment
 *
 */

/** Internet Explorer Family */
var CB_ENVIRONMENT_BROWSER_IDENT_IE 	= 	0x0000000000FF;
/** Internet Explorer Version 6.x */
var CB_ENVIRONMENT_BROWSER_IDENT_IE6x 	= 	0x000000000001;
/** Internet Explorer Version 5.5 */
var CB_ENVIRONMENT_BROWSER_IDENT_IE55 	=  	0x000000000002;
/** Internet Explorer Version 5.x */
var CB_ENVIRONMENT_BROWSER_IDENT_IE5x 	=  	0x000000000004;
/** Internet Explorer Version 4.x */
var CB_ENVIRONMENT_BROWSER_IDENT_IE4x 	=  	0x000000000008;
/** Internet Explorer Versions < 4.x */
var CB_ENVIRONMENT_BROWSER_IDENT_IE_OLD =  	0x000000000010;
/** Gecko Family */
var CB_ENVIRONMENT_BROWSER_IDENT_GECKO 	=  	0x00000000FF00;
/** Gecko Firefox Version 1.x */
var CB_ENVIRONMENT_BROWSER_IDENT_FF1x 	=  	0x000000000100;
/** Gecko Firefox Version 0.x */
var CB_ENVIRONMENT_BROWSER_IDENT_FF0x 	=  	0x000000000200;
/** Gecko Mozilla All Versions */
var CB_ENVIRONMENT_BROWSER_IDENT_MOZILLA=   0x000000000400;
/** Gecko Netscape Version 6.x */
var CB_ENVIRONMENT_BROWSER_IDENT_NS6 	=  	0x000000000800;
/** Gecko Netscape Version 7.x */
var CB_ENVIRONMENT_BROWSER_IDENT_NS7 	=  	0x000000001000;
/** Opera Family */
var CB_ENVIRONMENT_BROWSER_IDENT_OPERA 	=  	0x000000FF0000;
/** Opera Version 5.x */
var CB_ENVIRONMENT_BROWSER_IDENT_OPERA5 =  	0x000000010000;
/** Opera Version 6.x */
var CB_ENVIRONMENT_BROWSER_IDENT_OPERA6 =  	0x000000020000;
/** Opera Version 7.x */
var CB_ENVIRONMENT_BROWSER_IDENT_OPERA7 =  	0x000000040000;
/** Opera Version 8.x */
var CB_ENVIRONMENT_BROWSER_IDENT_OPERA8 =  	0x000000080000;
/** Netscape Versions < 6 */
var CB_ENVIRONMENT_BROWSER_IDENT_NS_OLD = 	0x0000FF000000;
/** KHTML Family */
var CB_ENVIRONMENT_BROWSER_IDENT_KHTML 	= 	0x00FF00000000;
/** KHTML Konqueor Version 2 */
var CB_ENVIRONMENT_BROWSER_IDENT_K2	 	= 	0x000100000000;
/** KHTML Konqueor Version 3 */
var CB_ENVIRONMENT_BROWSER_IDENT_K3 	= 	0x000200000000;
/** KHTML Safari MacOSX */
var CB_ENVIRONMENT_BROWSER_IDENT_SAFARI = 	0x000400000000;
/** All other unknown browserversions */
var CB_ENVIRONMENT_BROWSER_IDENT_MISC	= 	0xFF0000000000;

/**
 * Constructor
 */
function CB_Environment() {
	this.constructor = CB_Environment;
}

/**
 * Retrieves the current client browseragent
 *
 * Uses regular expressions to parse the HTTP_USER_AGENT-string
 *
 * @uses Browserdefines
 *
 * @return int Browser ident hexdefine
 */
CB_Environment.prototype.CurrentClientBrowser = function() {
	var famVersion = null;
	var tmpA = null;
	var agentVersion = null;
    var agent = navigator.userAgent;
    // 1. brackets (index 1): Agent-family
    // 2. brackets (index 2): Agent-family-version
    // 3. brackets (index 3): Agent-engine-informations
    // 4. brackets (index 4): Agent-sepcial-information
    var regExp = /(\S+)\/(\d\.\d+)\s\((.+)\)\s?(.*)/;
    var tmpInfoA = agent.match( regExp );
    // Netscape, KHTML, Mozilla, Firefox, Opera compatibility, IE identity
    if ( !tmpInfoA ) {
    	alert( "Regular expressions parse error -> " +  regExp );
    	return null;
    }
    else if ( tmpInfoA[1] == "Mozilla" ) {
        famVersion = parseFloat( tmpInfoA[2] );
        // Old IEs (<4) uses familiy version 2.0
        if ( famVersion == 2.0 ) {
            return CB_ENVIRONMENT_BROWSER_IDENT_IE_OLD;
        }
        if ( famVersion == 4.0 || famVersion == 5.0 ) {
            // First of all, the opera comptibility mode
            // Also contains the MSIE-Tag
            if ( tmpInfoA[4].indexOf( "Opera" ) != -1 ) {
                regExp = /Opera\s(\d\.\d+)/;
                tmpA = tmpInfoA[4].match( regExp );
                if ( tmpA ) {
	                switch ( parseInt( tmpA[1] ) ) {
	                	case 5:
		                    return CB_ENVIRONMENT_BROWSER_IDENT_OPERA5;
		                case 6:
		                    return CB_ENVIRONMENT_BROWSER_IDENT_OPERA6;
		                case 7:
		                    return CB_ENVIRONMENT_BROWSER_IDENT_OPERA7;
	                   	case 8:
		                    return CB_ENVIRONMENT_BROWSER_IDENT_OPERA8;
	                }
				}
				else {
					alert( "Regular expressions parse error ->" +  regExp );
				}
            }
            else if ( tmpInfoA[3].indexOf ( "MSIE" ) != -1 ) {
            	regExp = /MSIE\s(\d\.\d+)/;
                tmpA = tmpInfoA[3].match( regExp );
                if ( tmpA ) {
	                ieVersion = parseFloat( tmpA[1] );
	                if ( ieVersion == 6.0 ) {
	                	return CB_ENVIRONMENT_BROWSER_IDENT_IE6x;
	                }
	                else if ( ieVersion == 5.5 ) {
	                	return CB_ENVIRONMENT_BROWSER_IDENT_IE55;
	                }
	                else if ( ieVersion >= 5.0 && ieVersion < 5.5 ) {
	                	return CB_ENVIRONMENT_BROWSER_IDENT_IE5x;
	                }
	                else if ( ieVersion >= 4.0 && ieVersion < 5.0 ) {
	                	return CB_ENVIRONMENT_BROWSER_IDENT_IE4x;
	                }
	                else {
	                	return CB_ENVIRONMENT_BROWSER_IDENT_IE_OLD;
	                }
				}
				else {
					alert( "Regular expressions parse error ->" +  regExp );
				}
            }
            else if ( tmpInfoA[3].indexOf( "Konqueror" ) != -1 ) {
            	// Version number could be x.x.x or x.x
            	regExp = /Konqueror\/(\d\.\d+\.?\d?)/;
                tmpA = tmpInfoA[3].match( regExp );
                if ( tmpA ) {
	                switch ( parseInt( tmpA[1] ) ) {
	                	case 2:
	                		return CB_ENVIRONMENT_BROWSER_IDENT_K2;
	                	case 3:
	                		return CB_ENVIRONMENT_BROWSER_IDENT_K3;
	                }
				}
				else {
					alert( "Regular expressions parse error ->" +  regExp );
				}
            }
            else if ( tmpInfoA[4].indexOf( "Safari" ) != -1 ) {
            	return CB_ENVIRONMENT_BROWSER_IDENT_SAFARI;
            }
            else if ( tmpInfoA[4].indexOf( "Gecko" ) != -1 ) {
				// String contains 'Gecko/xxxxxxx Browsername/x.x(.x)'
				regExp = /Gecko\/\d+\s(\S+)\/(\d\.\d+\.?\d*)/;
				tmpA = tmpInfoA[4].match( regExp );
				// The regexp don't match the string on mozilla
				if ( !tmpA ) {
					return CB_ENVIRONMENT_BROWSER_IDENT_MOZILLA;
				}
				agentVersion = parseFloat( tmpA[2] );
				if ( tmpA[1].indexOf( "Firefox" ) != -1 ) {
					if ( agentVersion < 1.0 ) {
						return CB_ENVIRONMENT_BROWSER_IDENT_FF0x;
					}
					else {
						return CB_ENVIRONMENT_BROWSER_IDENT_FF1x;
					}
				}
				else if ( tmpA[1].indexOf( "Netscape" ) != -1 ) {
					switch ( parseInt( agentVersion ) ) {
						case 6:
							return CB_ENVIRONMENT_BROWSER_IDENT_NS6;
						case 7:
							return CB_ENVIRONMENT_BROWSER_IDENT_NS7;
					}
				}
				else {
					return CB_ENVIRONMENT_BROWSER_IDENT_GECKO;
				}
            }
		}
        // Old Netscapeagents (3.x, 4.x) uses this familiy-versions
        else if ( ( famVersion > 4.0 && famVersion < 5.0 ) ||
                  ( famVersion < 4.0 && famVersion > 3.0 ) )
        {
            return CB_ENVIRONMENT_BROWSER_IDENT_NS_OLD;
        }
        // Unsupported familiy-versions
        else {
            return CB_ENVIRONMENT_BROWSER_IDENT_MISC;
        }
    }
    // Original Opera indentity
    else if ( tmpInfoA[1] == "Opera" ) {
        famVersion = parseInt( tmpInfoA[2] );
        switch ( famVersion ) {
            case 5:
                return CB_ENVIRONMENT_BROWSER_IDENT_OPERA5;
            case 6:
                return CB_ENVIRONMENT_BROWSER_IDENT_OPERA6;
            case 7:
                return CB_ENVIRONMENT_BROWSER_IDENT_OPERA7;
            case 8:
                return CB_ENVIRONMENT_BROWSER_IDENT_OPERA8;
        }
    }
    // Unsupported agent-families
    else {
        return CB_ENVIRONMENT_BROWSER_IDENT_MISC;
    }
}