/**
 * Basic browser detection based on userAgent string
 * plugin support detection; currently chime and MathML
 *
 * $HeadURL: http://trac.gruen.fiz-chemie.de/svn/vs/vscms/trunk/src/vsengine/static/javascript/Browser.js $
 * $Revision: 10992 $
 *
 * Copyright 2007 FIZ CHEMIE Berlin
 */

/**
 * Logger configuration
 */
if (typeof logger == 'undefined') {
    //alert("Browser.js: No logging configuration found. Initialize new one.");
    var logger = log4javascript.getLogger("control");
    log4javascript.setEnabled(false);

    var layout = new log4javascript.PatternLayout("[%-5p] %m");

    var appender = new log4javascript.PopUpAppender(layout);
    appender.setThreshold(log4javascript.Level.DEBUG);
    logger.addAppender(appender);

/**
 * Trace appender for firebug since trace isn't available
 * for PopUpAppender
 */
//    appender = new log4javascript.BrowserConsoleAppender()
//    appender.setThreshold(log4javascript.Level.TRACE);
//    logger.addAppender(appender);
};

/**
 * requires log4javascript.js
 */
function Browser() {

    this.id = new function() {
        var ua = navigator.userAgent;
        var vendor = navigator.vendor;
        var OMNI = ua.indexOf("Omni") > 0;

        this.OP = ua.indexOf("Opera") != -1;
        this.KHTML = ua.indexOf("KHTML") != -1;
        this.OP5 = ua.indexOf("Opera 5") >= 0 || ua.indexOf("Opera 6") >= 0;
        this.OP7 = ua.indexOf("Opera 7") >= 0;
        this.MAC = ua.indexOf("Mac") > 0;
        this.Safari = ua.indexOf("Safari") != -1 && vendor.indexOf("Apple") != -1;

        if (!this.OP5 && !OMNI && !this.KHTML) {
            this.IE        = ua.indexOf("MSIE") > 0;
            this.IE5       = ua.indexOf("MSIE 5") > 0;
            this.IE5_0     = ua.indexOf("MSIE 5.0") > 0;
            this.IE6       = ua.indexOf("MSIE 6.0") > 0;
            this.IE7       = ua.indexOf("MSIE 7.0") > 0;
            this.IE8       = ua.indexOf("MSIE 8.0") > 0;
            this.NS6       = ua.indexOf("Gecko") > 0;
            this.MOZ       = this.NS6 && ua.indexOf("Netscape") == -1 && ua.indexOf("Firefox") == -1;
            this.MAC_IE5   = this.MAC && this.IE5;
            this.IE6       = (document.all && !window.opera) ? true : false;
            this.IE7       = (document.all && !window.opera && window.XMLHttpRequest) ? true : false;
        }
        this.KONQUEROR = ua.indexOf("Konqueror/") > 0;
    };

    this.toString = function() {return navigator.userAgent;};

};

/**
 * Plugin detection, each field should return true or false
 */
Browser.prototype.plugins = {


    flash: function () {
        var found = false;
        var control = null;
        try {
            control = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
            found = true;
        } catch(e) {
            $.each(navigator.plugins, function () {
                if (this.name.match(/flash/gim)) {
                    found = true;
                }
            });
        }
        return found;
    },

    java: function () {
        return navigator.javaEnabled();
    },

    chime : function() {
        var _b = browser;
        var supports = _b.readCookie("supportsChime");

        // always use JMol in Scorm Packages
        if (Properties.mode == 'extern') return false;

        if (supports == null) {
            if (browser.id.Safari) {
                // Safari crashes while loading Chime
                supports = false;
            } else if (navigator.plugins && navigator.plugins.length > 0) {
                $.each(navigator.plugins, function () {
                    if (this.name.match(/chime/gim) || this.description.match(/chime/gim)) {
                        supports = true;
                    }
                });
                logger.trace("[Browser] chime support [navigator] " + supports);
            } else if (window.ActiveXObject) {
                var control;
                try { // IE6
                    control = new ActiveXObject("MDL Information Systems.ChimeShimLibrary");
                } catch(e) {
                    try { // IE7
                        control = new ActiveXObject("MDL Information Systems (Elsevier MDL).ChimeShimLibrary");
                    } catch(e) {
                        // failure in this case indicates that there is no
                        // plugin installed
                    }
                }
                supports = typeof(control) == 'object';
                logger.trace("[Browser] chime support [explorer] " + supports);
            }
            _b.createCookie("supportsChime", supports);
        } else {
            supports = (supports == 'true') ? true : false;
        }
        logger.trace("[Browser] check chime support: " + supports);
        return supports;
    },

    mathml : function() {
        var _b = browser;
        var supports = false;

        // always use alternative image in Scorm Packages
        if (Properties.mode == 'extern') return false;

        var c = _b.readCookie('supportsMathML');
        logger.trace("[Browser] check MathML support: " + c);
        if (c == 'true') {
            return true;
        } else if (c == 'false') {
            return false;
        }

        // skip browser detektion
        // accept for chemgapedia.de
        var loc = window.location.href;
        var skip = (loc.indexOf("chemgapedia.de") == -1);
        if (skip) {
            logger.trace("Location: " + loc);
            logger.trace("skip Plugintest: " + skip );
            return false;
        }

        var ua = navigator.userAgent;
        if (_b.id.IE) {
            supports = false;
        } else if (_b.id.OP) {
            supports = false;
        } else if (_b.id.KHTML) {
            supports = false;
        } else if (ua.indexOf("Gecko" != -1)) {
            // Not all Gecko-like browser support MathML,
            // but I don't know how to test.
            // Gecko does not support MathML for mime type text/html
            supports = (document.contentType == 'text/xml') || (document.contentType == 'application/xhtml+xml');
        }
        logger.trace("[Browser] check MathML support: " + supports);
        return supports;
    }
};

/**
 * Cookie managment
 */
Browser.prototype.createCookie = function(name,value,days) {
    logger.trace("Browser.createCookie: " + name + " = " + value);
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    document.cookie = name + "=" + value + expires + "; path=/";
};

/**
 * read cookie with @name
 */
Browser.prototype.readCookie = function(name) {
    logger.trace("Browser.readCookie: " + name);
    var nameEQ = name + "=";
    var cookie = document.cookie;

    if (!cookie) return null;

    var ca = cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
};
/**
 * delete cookie with @name
 */
Browser.prototype.eraseCookie = function(name) {
    logger.trace("Browser.eraseCookie: " + name);
    var _b = browser;
    _b.createCookie(name,"",-1);
};

/**
 * finally create a new instance of the Browser object
 */
var browser = new Browser();
