| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-is'>/**</span> * @class Ext.is *  * Determines information about the current platform the application is running on. *  * @singleton */Ext.is = {    init : function(navigator) {        var platforms = this.platforms,            ln = platforms.length,            i, platform;        navigator = navigator || window.navigator;        for (i = 0; i < ln; i++) {            platform = platforms[i];            this[platform.identity] = platform.regex.test(navigator[platform.property]);        }<span id='Ext-is-property-Desktop'>        /**</span>         * @property Desktop True if the browser is running on a desktop machine         * @type {Boolean}         */        this.Desktop = this.Mac || this.Windows || (this.Linux && !this.Android);<span id='Ext-is-property-Tablet'>        /**</span>         * @property Tablet True if the browser is running on a tablet (iPad)         */        this.Tablet = this.iPad;<span id='Ext-is-property-Phone'>        /**</span>         * @property Phone True if the browser is running on a phone.         * @type {Boolean}         */        this.Phone = !this.Desktop && !this.Tablet;<span id='Ext-is-property-iOS'>        /**</span>         * @property iOS True if the browser is running on iOS         * @type {Boolean}         */        this.iOS = this.iPhone || this.iPad || this.iPod;        <span id='Ext-is-property-Standalone'>        /**</span>         * @property Standalone Detects when application has been saved to homescreen.         * @type {Boolean}         */        this.Standalone = !!window.navigator.standalone;    },    <span id='Ext-is-property-iPhone'>    /**</span>     * @property iPhone True when the browser is running on a iPhone     * @type {Boolean}     */    platforms: [{        property: 'platform',        regex: /iPhone/i,        identity: 'iPhone'    },    <span id='Ext-is-property-iPod'>    /**</span>     * @property iPod True when the browser is running on a iPod     * @type {Boolean}     */    {        property: 'platform',        regex: /iPod/i,        identity: 'iPod'    },    <span id='Ext-is-property-iPad'>    /**</span>     * @property iPad True when the browser is running on a iPad     * @type {Boolean}     */    {        property: 'userAgent',        regex: /iPad/i,        identity: 'iPad'    },    <span id='Ext-is-property-Blackberry'>    /**</span>     * @property Blackberry True when the browser is running on a Blackberry     * @type {Boolean}     */    {        property: 'userAgent',        regex: /Blackberry/i,        identity: 'Blackberry'    },    <span id='Ext-is-property-Android'>    /**</span>     * @property Android True when the browser is running on an Android device     * @type {Boolean}     */    {        property: 'userAgent',        regex: /Android/i,        identity: 'Android'    },    <span id='Ext-is-property-Mac'>    /**</span>     * @property Mac True when the browser is running on a Mac     * @type {Boolean}     */    {        property: 'platform',        regex: /Mac/i,        identity: 'Mac'    },    <span id='Ext-is-property-Windows'>    /**</span>     * @property Windows True when the browser is running on Windows     * @type {Boolean}     */    {        property: 'platform',        regex: /Win/i,        identity: 'Windows'    },    <span id='Ext-is-property-Linux'>    /**</span>     * @property Linux True when the browser is running on Linux     * @type {Boolean}     */    {        property: 'platform',        regex: /Linux/i,        identity: 'Linux'    }]};Ext.is.init();<span id='Ext-supports'>/**</span> * @class Ext.supports * * Determines information about features are supported in the current environment *  * @singleton */(function(){    // this is a local copy of certain logic from (Abstract)Element.getStyle    // to break a dependancy between the supports mechanism and Element    // use this instead of element references to check for styling info    var getStyle = function(element, styleName){        var view = element.ownerDocument.defaultView,            style = (view ? view.getComputedStyle(element, null) : element.currentStyle) || element.style;        return style[styleName];    };Ext.supports = {<span id='Ext-supports-method-init'>    /**</span>     * Runs feature detection routines and sets the various flags. This is called when     * the scripts loads (very early) and again at {@link Ext#onReady}. Some detections     * are flagged as `early` and run immediately. Others that require the document body     * will not run until ready.     *     * Each test is run only once, so calling this method from an onReady function is safe     * and ensures that all flags have been set.     * @markdown     * @private     */    init : function() {        var me = this,            doc = document,            tests = me.tests,            n = tests.length,            div = n && Ext.isReady && doc.createElement('div'),            test, notRun = [];        if (div) {            div.innerHTML = [                '<div style="height:30px;width:50px;">',                    '<div style="height:20px;width:20px;"></div>',                '</div>',                '<div style="width: 200px; height: 200px; position: relative; padding: 5px;">',                    '<div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"></div>',                '</div>',                '<div style="position: absolute; left: 10%; top: 10%;"></div>',                '<div style="float:left; background-color:transparent;"></div>'            ].join('');            doc.body.appendChild(div);        }        while (n--) {            test = tests[n];            if (div || test.early) {                me[test.identity] = test.fn.call(me, doc, div);            } else {                notRun.push(test);            }        }        if (div) {            doc.body.removeChild(div);        }        me.tests = notRun;    },<span id='Ext-supports-property-PointerEvents'>    /**</span>     * @property PointerEvents True if document environment supports the CSS3 pointer-events style.     * @type {Boolean}     */    PointerEvents: 'pointerEvents' in document.documentElement.style,<span id='Ext-supports-property-CSS3BoxShadow'>    /**</span>     * @property CSS3BoxShadow True if document environment supports the CSS3 box-shadow style.     * @type {Boolean}     */    CSS3BoxShadow: 'boxShadow' in document.documentElement.style || 'WebkitBoxShadow' in document.documentElement.style || 'MozBoxShadow' in document.documentElement.style,<span id='Ext-supports-property-ClassList'>    /**</span>     * @property ClassList True if document environment supports the HTML5 classList API.     * @type {Boolean}     */    ClassList: !!document.documentElement.classList,<span id='Ext-supports-property-OrientationChange'>    /**</span>     * @property OrientationChange True if the device supports orientation change     * @type {Boolean}     */    OrientationChange: ((typeof window.orientation != 'undefined') && ('onorientationchange' in window)),<span id='Ext-supports-property-DeviceMotion'>    /**</span>     * @property DeviceMotion True if the device supports device motion (acceleration and rotation rate)     * @type {Boolean}     */    DeviceMotion: ('ondevicemotion' in window),<span id='Ext-supports-property-Touch'>    /**</span>     * @property Touch True if the device supports touch     * @type {Boolean}     */    // is.Desktop is needed due to the bug in Chrome 5.0.375, Safari 3.1.2    // and Safari 4.0 (they all have 'ontouchstart' in the window object).    Touch: ('ontouchstart' in window) && (!Ext.is.Desktop),<span id='Ext-supports-property-TimeoutActualLateness'>    /**</span>     * @property TimeoutActualLateness True if the browser passes the "actualLateness" parameter to     * setTimeout. See: https://developer.mozilla.org/en/DOM/window.setTimeout     * @type {Boolean}     */    TimeoutActualLateness: (function(){        setTimeout(function(){            Ext.supports.TimeoutActualLateness = arguments.length !== 0;        }, 0);    }()),    tests: [<span id='Ext-supports-property-Transitions'>        /**</span>         * @property Transitions True if the device supports CSS3 Transitions         * @type {Boolean}         */        {            identity: 'Transitions',            fn: function(doc, div) {                var prefix = [                        'webkit',                        'Moz',                        'o',                        'ms',                        'khtml'                    ],                    TE = 'TransitionEnd',                    transitionEndName = [                        prefix[0] + TE,                        'transitionend', //Moz bucks the prefixing convention                        prefix[2] + TE,                        prefix[3] + TE,                        prefix[4] + TE                    ],                    ln = prefix.length,                    i = 0,                    out = false;                for (; i < ln; i++) {                    if (getStyle(div, prefix[i] + "TransitionProperty")) {                        Ext.supports.CSS3Prefix = prefix[i];                        Ext.supports.CSS3TransitionEnd = transitionEndName[i];                        out = true;                        break;                    }                }                return out;            }        },<span id='Ext-supports-property-RightMargin'>        /**</span>         * @property RightMargin True if the device supports right margin.         * See https://bugs.webkit.org/show_bug.cgi?id=13343 for why this is needed.         * @type {Boolean}         */        {            identity: 'RightMargin',            fn: function(doc, div) {                var view = doc.defaultView;                return !(view && view.getComputedStyle(div.firstChild.firstChild, null).marginRight != '0px');            }        },<span id='Ext-supports-property-DisplayChangeInputSelectionBug'>        /**</span>         * @property DisplayChangeInputSelectionBug True if INPUT elements lose their         * selection when their display style is changed. Essentially, if a text input         * has focus and its display style is changed, the I-beam disappears.         *         * This bug is encountered due to the work around in place for the {@link #RightMargin}         * bug. This has been observed in Safari 4.0.4 and older, and appears to be fixed         * in Safari 5. It's not clear if Safari 4.1 has the bug, but it has the same WebKit         * version number as Safari 5 (according to http://unixpapa.com/js/gecko.html).         */        {            identity: 'DisplayChangeInputSelectionBug',            early: true,            fn: function() {                var webKitVersion = Ext.webKitVersion;                // WebKit but older than Safari 5 or Chrome 6:                return 0 < webKitVersion && webKitVersion < 533;            }        },<span id='Ext-supports-property-DisplayChangeTextAreaSelectionBug'>        /**</span>         * @property DisplayChangeTextAreaSelectionBug True if TEXTAREA elements lose their         * selection when their display style is changed. Essentially, if a text area has         * focus and its display style is changed, the I-beam disappears.         *         * This bug is encountered due to the work around in place for the {@link #RightMargin}         * bug. This has been observed in Chrome 10 and Safari 5 and older, and appears to         * be fixed in Chrome 11.         */        {            identity: 'DisplayChangeTextAreaSelectionBug',            early: true,            fn: function() {                var webKitVersion = Ext.webKitVersion;                /*                Has bug w/textarea:                (Chrome) Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US)                            AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.127                            Safari/534.16                (Safari) Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us)                            AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5                            Safari/533.21.1                No bug:                (Chrome) Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7)                            AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.57                            Safari/534.24                */                return 0 < webKitVersion && webKitVersion < 534.24;            }        },<span id='Ext-supports-property-TransparentColor'>        /**</span>         * @property TransparentColor True if the device supports transparent color         * @type {Boolean}         */        {            identity: 'TransparentColor',            fn: function(doc, div, view) {                view = doc.defaultView;                return !(view && view.getComputedStyle(div.lastChild, null).backgroundColor != 'transparent');            }        },<span id='Ext-supports-property-ComputedStyle'>        /**</span>         * @property ComputedStyle True if the browser supports document.defaultView.getComputedStyle()         * @type {Boolean}         */        {            identity: 'ComputedStyle',            fn: function(doc, div, view) {                view = doc.defaultView;                return view && view.getComputedStyle;            }        },<span id='Ext-supports-property-Svg'>        /**</span>         * @property Svg True if the device supports SVG         * @type {Boolean}         */        {            identity: 'Svg',            fn: function(doc) {                return !!doc.createElementNS && !!doc.createElementNS( "http:/" + "/www.w3.org/2000/svg", "svg").createSVGRect;            }        },<span id='Ext-supports-property-Canvas'>        /**</span>         * @property Canvas True if the device supports Canvas         * @type {Boolean}         */        {            identity: 'Canvas',            fn: function(doc) {                return !!doc.createElement('canvas').getContext;            }        },<span id='Ext-supports-property-Vml'>        /**</span>         * @property Vml True if the device supports VML         * @type {Boolean}         */        {            identity: 'Vml',            fn: function(doc) {                var d = doc.createElement("div");                d.innerHTML = "<!--[if vml]><br/><br/><![endif]-->";                return (d.childNodes.length == 2);            }        },<span id='Ext-supports-property-Float'>        /**</span>         * @property Float True if the device supports CSS float         * @type {Boolean}         */        {            identity: 'Float',            fn: function(doc, div) {                return !!div.lastChild.style.cssFloat;            }        },<span id='Ext-supports-property-AudioTag'>        /**</span>         * @property AudioTag True if the device supports the HTML5 audio tag         * @type {Boolean}         */        {            identity: 'AudioTag',            fn: function(doc) {                return !!doc.createElement('audio').canPlayType;            }        },<span id='Ext-supports-property-History'>        /**</span>         * @property History True if the device supports HTML5 history         * @type {Boolean}         */        {            identity: 'History',            fn: function() {                var history = window.history;                return !!(history && history.pushState);            }        },<span id='Ext-supports-property-CSS3DTransform'>        /**</span>         * @property CSS3DTransform True if the device supports CSS3DTransform         * @type {Boolean}         */        {            identity: 'CSS3DTransform',            fn: function() {                return (typeof WebKitCSSMatrix != 'undefined' && new WebKitCSSMatrix().hasOwnProperty('m41'));            }        },<span id='Ext-supports-property-CSS3LinearGradient'>		/**</span>         * @property CSS3LinearGradient True if the device supports CSS3 linear gradients         * @type {Boolean}         */        {            identity: 'CSS3LinearGradient',            fn: function(doc, div) {                var property = 'background-image:',                    webkit   = '-webkit-gradient(linear, left top, right bottom, from(black), to(white))',                    w3c      = 'linear-gradient(left top, black, white)',                    moz      = '-moz-' + w3c,                    opera    = '-o-' + w3c,                    options  = [property + webkit, property + w3c, property + moz, property + opera];                div.style.cssText = options.join(';');                return ("" + div.style.backgroundImage).indexOf('gradient') !== -1;            }        },<span id='Ext-supports-property-CSS3BorderRadius'>        /**</span>         * @property CSS3BorderRadius True if the device supports CSS3 border radius         * @type {Boolean}         */        {            identity: 'CSS3BorderRadius',            fn: function(doc, div) {                var domPrefixes = ['borderRadius', 'BorderRadius', 'MozBorderRadius', 'WebkitBorderRadius', 'OBorderRadius', 'KhtmlBorderRadius'],                    pass = false,                    i;                for (i = 0; i < domPrefixes.length; i++) {                    if (document.body.style[domPrefixes[i]] !== undefined) {                        return true;                    }                }                return pass;            }        },<span id='Ext-supports-property-GeoLocation'>        /**</span>         * @property GeoLocation True if the device supports GeoLocation         * @type {Boolean}         */        {            identity: 'GeoLocation',            fn: function() {                return (typeof navigator != 'undefined' && typeof navigator.geolocation != 'undefined') || (typeof google != 'undefined' && typeof google.gears != 'undefined');            }        },<span id='Ext-supports-property-MouseEnterLeave'>        /**</span>         * @property MouseEnterLeave True if the browser supports mouseenter and mouseleave events         * @type {Boolean}         */        {            identity: 'MouseEnterLeave',            fn: function(doc, div){                return ('onmouseenter' in div && 'onmouseleave' in div);            }        },<span id='Ext-supports-property-MouseWheel'>        /**</span>         * @property MouseWheel True if the browser supports the mousewheel event         * @type {Boolean}         */        {            identity: 'MouseWheel',            fn: function(doc, div) {                return ('onmousewheel' in div);            }        },<span id='Ext-supports-property-Opacity'>        /**</span>         * @property Opacity True if the browser supports normal css opacity         * @type {Boolean}         */        {            identity: 'Opacity',            fn: function(doc, div){                // Not a strict equal comparison in case opacity can be converted to a number.                if (Ext.isIE6 || Ext.isIE7 || Ext.isIE8) {                    return false;                }                div.firstChild.style.cssText = 'opacity:0.73';                return div.firstChild.style.opacity == '0.73';            }        },<span id='Ext-supports-property-Placeholder'>        /**</span>         * @property Placeholder True if the browser supports the HTML5 placeholder attribute on inputs         * @type {Boolean}         */        {            identity: 'Placeholder',            fn: function(doc) {                return 'placeholder' in doc.createElement('input');            }        },<span id='Ext-supports-property-Direct2DBug'>        /**</span>         * @property Direct2DBug True if when asking for an element's dimension via offsetWidth or offsetHeight,         * getBoundingClientRect, etc. the browser returns the subpixel width rounded to the nearest pixel.         * @type {Boolean}         */        {            identity: 'Direct2DBug',            fn: function() {                return Ext.isString(document.body.style.msTransformOrigin);            }        },<span id='Ext-supports-property-BoundingClientRect'>        /**</span>         * @property BoundingClientRect True if the browser supports the getBoundingClientRect method on elements         * @type {Boolean}         */        {            identity: 'BoundingClientRect',            fn: function(doc, div) {                return Ext.isFunction(div.getBoundingClientRect);            }        },        {            identity: 'IncludePaddingInWidthCalculation',            fn: function(doc, div){                return div.childNodes[1].firstChild.offsetWidth == 210;            }        },        {            identity: 'IncludePaddingInHeightCalculation',            fn: function(doc, div){                return div.childNodes[1].firstChild.offsetHeight == 210;            }        },<span id='Ext-supports-property-ArraySort'>        /**</span>         * @property ArraySort True if the Array sort native method isn't bugged.         * @type {Boolean}         */        {            identity: 'ArraySort',            fn: function() {                var a = [1,2,3,4,5].sort(function(){ return 0; });                return a[0] === 1 && a[1] === 2 && a[2] === 3 && a[3] === 4 && a[4] === 5;            }        },<span id='Ext-supports-property-Range'>        /**</span>         * @property Range True if browser support document.createRange native method.         * @type {Boolean}         */        {            identity: 'Range',            fn: function() {                return !!document.createRange;            }        },<span id='Ext-supports-property-CreateContextualFragment'>        /**</span>         * @property CreateContextualFragment True if browser support CreateContextualFragment range native methods.         * @type {Boolean}         */        {            identity: 'CreateContextualFragment',            fn: function() {                var range = Ext.supports.Range ? document.createRange() : false;                return range && !!range.createContextualFragment;            }        },<span id='Ext-supports-property-WindowOnError'>        /**</span>         * @property WindowOnError True if browser supports window.onerror.         * @type {Boolean}         */        {            identity: 'WindowOnError',            fn: function () {                // sadly, we cannot feature detect this...                return Ext.isIE || Ext.isGecko || Ext.webKitVersion >= 534.16; // Chrome 10+            }        },<span id='Ext-supports-property-TextAreaMaxLength'>        /**</span>         * @property TextAreaMaxLength True if the browser supports maxlength on textareas.         * @type {Boolean}         */        {            identity: 'TextAreaMaxLength',            fn: function(){                var el = document.createElement('textarea');                return ('maxlength' in el);            }        },<span id='Ext-supports-property-GetPositionPercentage'>        /**</span>         * @property GetPositionPercentage True if the browser will return the left/top/right/bottom         * position as a percentage when explicitly set as a percentage value.         * @type {Boolean}         */        // Related bug: https://bugzilla.mozilla.org/show_bug.cgi?id=707691#c7        {            identity: 'GetPositionPercentage',            fn: function(doc, div){               return getStyle(div.childNodes[2], 'left') == '10%';            }        }    ]};}());Ext.supports.init(); // run the "early" detections now</pre></body></html>
 |