    /**
     * @class Ext.env.OS
     * Provide useful information about the current operating system environment. Access the global instance stored in Ext.os. Example:
     * <pre><code>
     * if (Ext.os.is.Windows) {
     *      // Windows specific code here
     * }
     *
     * if (Ext.os.is.iOS) {
     *      // iPad, iPod, iPhone, etc.
     * }
     *
     * console.log("Version " + Ext.os.version);
     * </code></pre>
     *
     * For a full list of supported values, refer to: {@link Ext.env.OS#is Ext.env.OS.is}
     */
    Ext.define('Ext.env.OS', {

        statics: {
            osNames: {
                ios: 'iOS',
                android: 'Android',
                webos: 'WebOS',
                blackberry: 'BlackBerry',
                mac: 'MacOSX',
                win: 'Windows',
                linux: 'Linux',
                other: 'Other'
            },
            osPrefixes: {
                ios: 'iPhone OS ',
                android: 'Android ',
                blackberry: 'BlackBerry ',
                webos: 'webOS/'
            }
        },

        /*
         * A "hybrid" property, can be either accessed as a method call, i.e:
         * <pre><code>
         * if (Ext.os.is('Android')) { ... }
         * </code></pre>
         *
         * or as an object with boolean properties, i.e:
         * <pre><code>
         * if (Ext.os.is.Android) { ... }
         * </code></pre>
         *
         * Versions can be conveniently checked as well. For example:
         * <pre><code>
         * if (Ext.os.is.Android2) { ... } // Equivalent to (Ext.os.is.Android && Ext.os.version.equals(2))
         *
         * if (Ext.os.is.iOS32) { ... } // Equivalent to (Ext.os.is.iOS && Ext.os.version.equals(3.2))
         * </code></pre>
         *
         * Note that only {@link Ext.Version#getMajor major component}  and {@link Ext.Version#getShortVersion shortVersion}
         * value of the version are available via direct property checking.
         *
         * Supported values are: iOS, iPad, iPhone, iPod, Android, WebOS, BlackBerry, MacOSX, Windows, Linux and Other
         *
         * @param {String} value The OS name to check
         * @return {Boolean}
         */
        is: Ext.emptyFn,

        /*
         * Read-only - the full name of the current operating system
         * Possible values are: iOS, Android, WebOS, BlackBerry, MacOSX, Windows, Linux and Other
         * @type String
         */
        name: null,

        /*
         * Read-only, refer to {@link Ext.Version}
         * @type Ext.Version
         */
        version: null,

        constructor: function() {
            var userAgent = Ext.global.navigator.userAgent,
                platform = Ext.global.navigator.platform,
                selfClass = this.statics(),
                osMatch = userAgent.match(new RegExp('((?:' + Ext.Object.getValues(selfClass.osPrefixes).join(')|(?:') + '))([^\\s;]+)')),
                name = 'other',
                version = '',
                actualVersionMatch;

            if (osMatch) {
                name = selfClass.osNames[Ext.Object.getKey(selfClass.osPrefixes, osMatch[1])];
                version = osMatch[2];

                if (name === 'BlackBerry') {
                    actualVersionMatch = userAgent.match(/Version\/([\d\._]+)/);

                    if (actualVersionMatch) {
                        version = actualVersionMatch[1];
                    }
                }
            }
            else {
                name = selfClass.osNames[(userAgent.toLowerCase().match(/mac|win|linux/i) || ['other'])[0]];
            }

            Ext.apply(this, {
                name: name,
                version: new Ext.Version(version)
            });

            this.is = function(name) {
                return this.is[name] === true;
            };

            if (name === 'iOS') {
                this.is[platform] = true;
            }

            this.is[this.name] = true;
            this.is[this.name + (this.version.getMajor() || '')] = true;
            this.is[this.name + this.version.getShortVersion()] = true;

            Ext.Object.each(selfClass.osNames, function(key, name) {
                this.is[name] = (this.name === name);
            }, this);

            return this;
        }
    }, function() {

    Ext.os = new Ext.env.OS();

    });