PageSourceSearch

https://hope1032.com.au/wp-content/themes/hopemedia/js/modernizr.js?ver=1.0.0

js hope1032.com.au collected 2026-10-02 03:11:28 UTC 33,661 bytes, 892 lines download raw bytes

1/*!
2 * Modernizr v1.6
3 * http://www.modernizr.com
4 *
5 * Developed by: 
6 * - Faruk Ates  http://farukat.es/
7 * - Paul Irish  http://paulirish.com/
8 *
9 * Copyright (c) 2009-2010
10 * Dual-licensed under the BSD or MIT licenses.
11 * http://www.modernizr.com/license/
12 */
13
14 
15/*
16 * Modernizr is a script that detects native CSS3 and HTML5 features
17 * available in the current UA and provides an object containing all
18 * features with a true/false value, depending on whether the UA has
19 * native support for it or not.
20 * 
21 * Modernizr will also add classes to the <html> element of the page,
22 * one for each feature it detects. If the UA supports it, a class
23 * like "cssgradients" will be added. If not, the class name will be
24 * "no-cssgradients". This allows for simple if-conditionals in your
25 * CSS, giving you fine control over the look & feel of your website.
26 * 
27 * @author        Faruk Ates
28 * @author        Paul Irish
29 * @copyright     (c) 2009-2010 Faruk Ates.
30 * @contributor   Ben Alman
31 */
32
33window.Modernizr = (function(window,doc,undefined){
34    
35    var version = '1.6',
36    
37    ret = {},
38
39    /**
40     * !! DEPRECATED !!
41     * 
42     * enableHTML5 is a private property for advanced use only. If enabled,
43     * it will make Modernizr.init() run through a brief while() loop in
44     * which it will create all HTML5 elements in the DOM to allow for
45     * styling them in Internet Explorer, which does not recognize any
46     * non-HTML4 elements unless created in the DOM this way.
47     * 
48     * enableHTML5 is ON by default.
49     * 
50     * The enableHTML5 toggle option is DEPRECATED as per 1.6, and will be
51     * replaced in 2.0 in lieu of the modular, configurable nature of 2.0.
52     */
53    enableHTML5 = true,
54    
55    
56    docElement = doc.documentElement,
57
58    /**
59     * Create our "modernizr" element that we do most feature tests on.
60     */
61    mod = 'modernizr',
62    m = doc.createElement( mod ),
63    m_style = m.style,
64
65    /**
66     * Create the input element for various Web Forms feature tests.
67     */
68    f = doc.createElement( 'input' ),
69    
70    smile = ':)',
71    
72    tostring = Object.prototype.toString,
73    
74    // List of property values to set for css tests. See ticket #21
75    prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '),
76
77    // Following spec is to expose vendor-specific style properties as:
78    //   elem.style.WebkitBorderRadius
79    // and the following would be incorrect:
80    //   elem.style.webkitBorderRadius
81    
82    // Webkit ghosts their properties in lowercase but Opera & Moz do not.
83    // Microsoft foregoes prefixes entirely <= IE8, but appears to 
84    //   use a lowercase `ms` instead of the correct `Ms` in IE9
85    
86    // More here: http://github.com/Modernizr/Modernizr/issues/issue/21
87    domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),
88
89    ns = {'svg': 'http://www.w3.org/2000/svg'},
90
91    tests = {},
92    inputs = {},
93    attrs = {},
94    
95    classes = [],
96    
97    featurename, // used in testing loop
98    
99    
100    
101    // todo: consider using http://javascript.nwbox.com/CSSSupport/css-support.js instead
102    testMediaQuery = function(mq){
103
104      var st = document.createElement('style'),
105          div = doc.createElement('div'),
106          ret;
107
108      st.textContent = mq + '{#modernizr{height:3px}}';
109      (doc.head || doc.getElementsByTagName('head')[0]).appendChild(st);
110      div.id = 'modernizr';
111      docElement.appendChild(div);
112
113      ret = div.offsetHeight === 3;
114
115      st.parentNode.removeChild(st);
116      div.parentNode.removeChild(div);
117
118      return !!ret;
119
120    },
121    
122    
123    /**
124      * isEventSupported determines if a given element supports the given event
125      * function from http://yura.thinkweb2.com/isEventSupported/
126      */
127    isEventSupported = (function(){
128
129      var TAGNAMES = {
130        'select':'input','change':'input',
131        'submit':'form','reset':'form',
132        'error':'img','load':'img','abort':'img'
133      };
134
135      function isEventSupported(eventName, element) {
136
137        element = element || document.createElement(TAGNAMES[eventName] || 'div');
138        eventName = 'on' + eventName;
139
140        // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
141        var isSupported = (eventName in element);
142
143        if (!isSupported) {
144          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
145          if (!element.setAttribute) {
146            element = document.createElement('div');
147          }
148          if (element.setAttribute && element.removeAttribute) {
149            element.setAttribute(eventName, '');
150            isSupported = typeof element[eventName] == 'function';
151
152            // If property was created, "remove it" (by setting value to `undefined`)
153            if (typeof element[eventName] != 'undefined') {
154              element[eventName] = undefined;
155            }
156            element.removeAttribute(eventName);
157          }
158        }
159
160        element = null;
161        return isSupported;
162      }
163      return isEventSupported;
164    })();
165    
166    
167    // hasOwnProperty shim by kangax needed for Safari 2.0 support
168    var _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty;
169    if (typeof _hasOwnProperty !== 'undefined' && typeof _hasOwnProperty.call !== 'undefined') {
170      hasOwnProperty = function (object, property) {
171        return _hasOwnProperty.call(object, property);
172      };
173    }
174    else {
175      hasOwnProperty = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */
176        return ((property in object) && typeof object.constructor.prototype[property] === 'undefined');
177      };
178    }
179    
180    /**
181     * set_css applies given styles to the Modernizr DOM node.
182     */
183    function set_css( str ) {
184        m_style.cssText = str;
185    }
186
187    /**
188     * set_css_all extrapolates all vendor-specific css strings.
189     */
190    function set_css_all( str1, str2 ) {
191        return set_css(prefixes.join(str1 + ';') + ( str2 || '' ));
192    }
193
194    /**
195     * contains returns a boolean for if substr is found within str.
196     */
197    function contains( str, substr ) {
198        return (''+str).indexOf( substr ) !== -1;
199    }
200
201    /**
202     * test_props is a generic CSS / DOM property test; if a browser supports
203     *   a certain property, it won't return undefined for it.
204     *   A supported CSS property returns empty string when its not yet set.
205     */
206    function test_props( props, callback ) {
207        for ( var i in props ) {
208            if ( m_style[ props[i] ] !== undefined && ( !callback || callback( props[i], m ) ) ) {
209                return true;
210            }
211        }
212    }
213
214    /**
215     * test_props_all tests a list of DOM properties we want to check against.
216     *   We specify literally ALL possible (known and/or likely) properties on 
217     *   the element including the non-vendor prefixed one, for forward-
218     *   compatibility.
219     */
220    function test_props_all( prop, callback ) {
221      
222        var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1),
223            props   = (prop + ' ' + domPrefixes.join(uc_prop + ' ') + uc_prop).split(' ');
224
225        return !!test_props( props, callback );
226    }
227    
228
229    /**
230     * Tests
231     */
232
233    tests['flexbox'] = function() {
234        /**
235         * set_prefixed_value_css sets the property of a specified element
236         * adding vendor prefixes to the VALUE of the property.
237         * @param {Element} element
238         * @param {string} property The property name. This will not be prefixed.
239         * @param {string} value The value of the property. This WILL be prefixed.
240         * @param {string=} extra Additional CSS to append unmodified to the end of
241         * the CSS string.
242         */
243        function set_prefixed_value_css(element, property, value, extra) {
244            property += ':';
245            element.style.cssText = (property + prefixes.join(value + ';' + property)).slice(0, -property.length) + (extra || '');
246        }
247
248        /**
249         * set_prefixed_property_css sets the property of a specified element
250         * adding vendor prefixes to the NAME of the property.
251         * @param {Element} element
252         * @param {string} property The property name. This WILL be prefixed.
253         * @param {string} value The value of the property. This will not be prefixed.
254         * @param {string=} extra Additional CSS to append unmodified to the end of
255         * the CSS string.
256         */
257        function set_prefixed_property_css(element, property, value, extra) {
258            element.style.cssText = prefixes.join(property + ':' + value + ';') + (extra || '');
259        }
260
261        var c = doc.createElement('div'),
262            elem = doc.createElement('div');
263
264        set_prefixed_value_css(c, 'display', 'box', 'width:42px;padding:0;');
265        set_prefixed_property_css(elem, 'box-flex', '1', 'width:10px;');
266
267        c.appendChild(elem);
268        docElement.appendChild(c);
269
270        var ret = elem.offsetWidth === 42;
271
272        c.removeChild(elem);
273        docElement.removeChild(c);
274
275        return ret;
276    };
277    
278    // On the S60 and BB Storm, getContext exists, but always returns undefined
279    // http://github.com/Modernizr/Modernizr/issues/issue/97/ 
280    
281    tests['canvas'] = function() {
282        var elem = doc.createElement( 'canvas' );
283        return !!(elem.getContext && elem.getContext('2d'));
284    };
285    
286    tests['canvastext'] = function() {
287        return !!(ret['canvas'] && typeof doc.createElement( 'canvas' ).getContext('2d').fillText == 'function');
288    };
289    
290    
291    tests['webgl'] = function(){
292
293        var elem = doc.createElement( 'canvas' ); 
294        
295        try {
296            if (elem.getContext('webgl')){ return true; }
297        } catch(e){	}
298        
299        try {
300            if (elem.getContext('experimental-webgl')){ return true; }
301        } catch(e){	}
302
303        return false;
304    };
305    
306    /*
307     * The Modernizr.touch test only indicates if the browser supports
308     *    touch events, which does not necessarily reflect a touchscreen
309     *    device, as evidenced by tablets running Windows 7 or, alas,
310     *    the Palm Pre / WebOS (touch) phones.
311     *    
312     * Additionally, Chrome (desktop) used to lie about its support on this,
313     *    but that has since been rectified: http://crbug.com/36415
314     *    
315     * We also test for Firefox 4 Multitouch Support.
316     *
317     * For more info, see: http://modernizr.github.com/Modernizr/touch.html
318     */
319     
320    tests['touch'] = function() {
321
322        return ('ontouchstart' in window) || testMediaQuery('@media ('+prefixes.join('touch-enabled),(')+'modernizr)');
323
324    };
325
326
327    /**
328     * geolocation tests for the new Geolocation API specification.
329     *   This test is a standards compliant-only test; for more complete
330     *   testing, including a Google Gears fallback, please see:
331     *   http://code.google.com/p/geo-location-javascript/
332     * or view a fallback solution using google's geo API:
333     *   http://gist.github.com/366184
334     */
335    tests['geolocation'] = function() {
336        return !!navigator.geolocation;
337    };
338
339    // Per 1.6: 
340    // This used to be Modernizr.crosswindowmessaging but the longer
341    // name has been deprecated in favor of a shorter and property-matching one.
342    // The old API is still available in 1.6, but as of 2.0 will throw a warning,
343    // and in the first release thereafter disappear entirely.
344    tests['postmessage'] = function() {
345      return !!window.postMessage;
346    };
347
348    // Web SQL database detection is tricky:
349
350    // In chrome incognito mode, openDatabase is truthy, but using it will 
351    //   throw an exception: http://crbug.com/42380
352    // We can create a dummy database, but there is no way to delete it afterwards. 
353    
354    // Meanwhile, Safari users can get prompted on any database creation.
355    //   If they do, any page with Modernizr will give them a prompt:
356    //   http://github.com/Modernizr/Modernizr/issues/closed#issue/113
357    
358    // We have chosen to allow the Chrome incognito false positive, so that Modernizr
359    //   doesn't litter the web with these test databases. As a developer, you'll have
360    //   to account for this gotcha yourself.
361    tests['websqldatabase'] = function() {
362      var result = !!window.openDatabase;
363      /*
364      if (result){
365        try {
366          result = !!openDatabase( mod + "testdb", "1.0", mod + "testdb", 2e4);
367        } catch(e) {
368        }
369      }
370      */
371      return result;
372    };
373    
374    // Vendors have inconsistent prefixing with the experimental Indexed DB:
375    // - Firefox is shipping indexedDB in FF4 as moz_indexedDB
376    // - Webkit's implementation is accessible through webkitIndexedDB
377    // We test both styles.
378    tests['indexedDB'] = function(){
379      for (var i = -1, len = domPrefixes.length; ++i < len; ){ 
380        var prefix = domPrefixes[i].toLowerCase();
381        if (window[prefix + '_indexedDB'] || window[prefix + 'IndexedDB']){
382          return true;
383        } 
384      }
385      return false;
386    };
387
388    // documentMode logic from YUI to filter out IE8 Compat Mode
389    //   which false positives.
390    tests['hashchange'] = function() {
391      return isEventSupported('hashchange', window) && ( document.documentMode === undefined || document.documentMode > 7 );
392    };
393
394    // Per 1.6: 
395    // This used to be Modernizr.historymanagement but the longer
396    // name has been deprecated in favor of a shorter and property-matching one.
397    // The old API is still available in 1.6, but as of 2.0 will throw a warning,
398    // and in the first release thereafter disappear entirely.
399    tests['history'] = function() {
400      return !!(window.history && history.pushState);
401    };
402
403    tests['draganddrop'] = function() {
404        return  isEventSupported('drag') && 
405                isEventSupported('dragstart') && 
406                isEventSupported('dragenter') &&
407                isEventSupported('dragover') &&
408                isEventSupported('dragleave') &&
409                isEventSupported('dragend') &&
410                isEventSupported('drop');
411    };
412    
413    tests['websockets'] = function(){
414        return ('WebSocket' in window);
415    };
416    
417    
418    // http://css-tricks.com/rgba-browser-support/
419    tests['rgba'] = function() {
420        // Set an rgba() color and check the returned value
421        
422        set_css(  'background-color:rgba(150,255,150,.5)' );
423        
424        return contains( m_style.backgroundColor, 'rgba' );
425    };
426    
427    tests['hsla'] = function() {
428        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
429        //   except IE9 who retains it as hsla
430        
431        set_css('background-color:hsla(120,40%,100%,.5)' );
432        
433        return contains( m_style.backgroundColor, 'rgba' ) || contains( m_style.backgroundColor, 'hsla' );
434    };
435    
436    tests['multiplebgs'] = function() {
437        // Setting multiple images AND a color on the background shorthand property
438        //  and then querying the style.background property value for the number of
439        //  occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
440        
441        set_css( 'background:url(//:),url(//:),red url(//:)' );
442        
443        // If the UA supports multiple backgrounds, there should be three occurrences
444        //   of the string "url(" in the return value for elem_style.background
445
446        return new RegExp("(url\\s*\\(.*?){3}").test(m_style.background);
447    };
448    
449    
450    // In testing support for a given CSS property, it's legit to test:
451    //    elem.style[styleName] !== undefined
452    // If the property is supported it will return an empty string,
453    // if unsupported it will return undefined.
454    // We'll take advantage of this quick test and skip setting a style 
455    // on our modernizr element, but instead just testing undefined vs
456    // empty string.
457    // The legacy set_css_all calls will remain in the source 
458    // (however, commented) for clarity, yet functionally they are 
459    // no longer needed.
460    
461
462    tests['backgroundsize'] = function() {
463        return test_props_all( 'backgroundSize' );
464    };
465    
466    tests['borderimage'] = function() {
467        //  set_css_all( 'border-image:url(m.png) 1 1 stretch' );
468        return test_props_all( 'borderImage' );
469    };
470    
471    
472    // Super comprehensive table about all the unique implementations of 
473    // border-radius: http://muddledramblings.com/table-of-css3-border-radius-compliance
474    
475    tests['borderradius'] = function() {
476        //  set_css_all( 'border-radius:10px' );
477        return test_props_all( 'borderRadius', '', function( prop ) {
478            return contains( prop, 'orderRadius' );
479        });
480    };
481    
482    
483    tests['boxshadow'] = function() {
484        //  set_css_all( 'box-shadow:#000 1px 1px 3px' );
485        return test_props_all( 'boxShadow' );
486    };
487    
488    // Note: FF3.0 will false positive on this test 
489    tests['textshadow'] = function(){
490        return doc.createElement('div').style.textShadow === '';
491    };
492    
493    
494    tests['opacity'] = function() {
495        // Browsers that actually have CSS Opacity implemented have done so
496        //  according to spec, which means their return values are within the
497        //  range of [0.0,1.0] - including the leading zero.
498        
499        set_css_all( 'opacity:.5' );
500        
501        return contains( m_style.opacity, '0.5' );
502    };
503    
504    
505    tests['cssanimations'] = function() {
506        //  set_css_all( 'animation:"animate" 2s ease 2', 'position:relative' );
507        return test_props_all( 'animationName' );
508    };
509    
510    
511    tests['csscolumns'] = function() {
512        //  set_css_all( 'column-count:3' );
513        return test_props_all( 'columnCount' );
514    };
515    
516    
517    tests['cssgradients'] = function() {
518        /**
519         * For CSS Gradients syntax, please see:
520         * http://webkit.org/blog/175/introducing-css-gradients/
521         * https://developer.mozilla.org/en/CSS/-moz-linear-gradient
522         * https://developer.mozilla.org/en/CSS/-moz-radial-gradient
523         * http://dev.w3.org/csswg/css3-images/#gradients-
524         */
525        
526        var str1 = 'background-image:',
527            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
528            str3 = 'linear-gradient(left top,#9f9, white);';
529        
530        set_css(
531            (str1 + prefixes.join(str2 + str1) + prefixes.join(str3 + str1)).slice(0,-str1.length)
532        );
533        
534        return contains( m_style.backgroundImage, 'gradient' );
535    };
536    
537    
538    tests['cssreflections'] = function() {
539        //  set_css_all( 'box-reflect:right 1px' );
540        return test_props_all( 'boxReflect' );
541    };
542    
543    
544    tests['csstransforms'] = function() {
545        //  set_css_all( 'transform:rotate(3deg)' );
546        return !!test_props([ 'transformProperty', 'WebkitTransform', 'MozTransform', 'OTransform', 'msTransform' ]);
547    };
548    
549    
550    tests['csstransforms3d'] = function() {
551        //  set_css_all( 'perspective:500' );
552        
553        var ret = !!test_props([ 'perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective' ]);
554        
555        // Webkit’s 3D transforms are passed off to the browser's own graphics renderer.
556        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome (yet?).
557        //   As a result, Webkit typically recognizes the syntax but will sometimes throw a false
558        //   positive, thus we must do a more thorough check:
559        if (ret){
560          
561          // Webkit allows this media query to succeed only if the feature is enabled.    
562          // "@media (transform-3d),(-o-transform-3d),(-moz-transform-3d),(-ms-transform-3d),(-webkit-transform-3d),(modernizr){ ... }"      
563          ret = testMediaQuery('@media ('+prefixes.join('transform-3d),(')+'modernizr)');
564        }
565        return ret;
566    };
567    
568    
569    tests['csstransitions'] = function() {
570        //  set_css_all( 'transition:all .5s linear' );
571        return test_props_all( 'transitionProperty' );
572    };
573
574
575    // @font-face detection routine by Diego Perini
576    // http://javascript.nwbox.com/CSSSupport/
577    tests['fontface'] = function(){
578
579        var 
580        sheet,
581        head = doc.head || doc.getElementsByTagName('head')[0] || docElement,
582        style = doc.createElement("style"),
583        impl = doc.implementation || { hasFeature: function() { return false; } };
584        
585        style.type = 'text/css';
586        head.insertBefore(style, head.firstChild);
587        sheet = style.sheet || style.styleSheet;
588
589        // removing it crashes IE browsers
590        //head.removeChild(style);
591
592        var supportAtRule = impl.hasFeature('CSS2', '') ?
593                function(rule) {
594                    if (!(sheet && rule)) return false;
595                    var result = false;
596                    try {
597                        sheet.insertRule(rule, 0);
598                        result = !(/unknown/i).test(sheet.cssRules[0].cssText);
599                        sheet.deleteRule(sheet.cssRules.length - 1);
600                    } catch(e) { }
601                    return result;
602                } :
603                function(rule) {
604                    if (!(sheet && rule)) return false;
605                    sheet.cssText = rule;
606                    
607                    return sheet.cssText.length !== 0 && !(/unknown/i).test(sheet.cssText) &&
608                      sheet.cssText
609                            .replace(/\r+|\n+/g, '')
610                            .indexOf(rule.split(' ')[0]) === 0;
611                };
612
613
614        // DEPRECATED - allow for a callback
615        ret._fontfaceready = function(fn){
616          fn(ret.fontface);
617        };
618        
619        return supportAtRule('@font-face { font-family: "font"; src: "font.ttf"; }');
620        
621    };
622    
623
624    // These tests evaluate support of the video/audio elements, as well as
625    // testing what types of content they support.
626    //
627    // We're using the Boolean constructor here, so that we can extend the value
628    // e.g.  Modernizr.video     // true
629    //       Modernizr.video.ogg // 'probably'
630    //
631    // Codec values from : http://github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
632    //                     thx to NielsLeenheer and zcorpan
633    
634    // Note: in FF 3.5.1 and 3.5.0, "no" was a return value instead of empty string.
635    //   Modernizr does not normalize for that.
636    
637    tests['video'] = function() {
638        var elem = doc.createElement('video'),
639            bool = !!elem.canPlayType;
640        
641        if (bool){  
642            bool      = new Boolean(bool);  
643            bool.ogg  = elem.canPlayType('video/ogg; codecs="theora"');
644            
645            // Workaround required for IE9, which doesn't report video supp
645ort without audio codec specified.
646            //   bug 599718 @ msft connect
647            var h264 = 'video/mp4; codecs="avc1.42E01E';
648            bool.h264 = elem.canPlayType(h264 + '"') || elem.canPlayType(h264 + ', mp4a.40.2"');
649            
650            bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"');
651        }
652        return bool;
653    };
654    
655    tests['audio'] = function() {
656        var elem = doc.createElement('audio'),
657            bool = !!elem.canPlayType;
658        
659        if (bool){  
660            bool      = new Boolean(bool);  
661            bool.ogg  = elem.canPlayType('audio/ogg; codecs="vorbis"');
662            bool.mp3  = elem.canPlayType('audio/mpeg;');
663            
664            // Mimetypes accepted: 
665            //   https://developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
666            //   http://bit.ly/iphoneoscodecs
667            bool.wav  = elem.canPlayType('audio/wav; codecs="1"');
668            bool.m4a  = elem.canPlayType('audio/x-m4a;') || elem.canPlayType('audio/aac;');
669        }
670        return bool;
671    };
672
673
674    // Both localStorage and sessionStorage are
675    //   tested via the `in` operator because otherwise Firefox will
676    //   throw an error: https://bugzilla.mozilla.org/show_bug.cgi?id=365772
677    //   if cookies are disabled
678    
679    // They require try/catch because of possible firefox configuration:
680    //   http://github.com/Modernizr/Modernizr/issues#issue/92
681    
682    // FWIW miller device resolves to [object Storage] in all supporting browsers
683    //   except for IE who does [object Object]
684    
685    // IE8 Compat mode supports these features completely:
686    //   http://www.quirksmode.org/dom/html5.html
687    
688    tests['localstorage'] = function() {
689        try {
690          return ('localStorage' in window) && window.localStorage !== null;
691        } catch(e) {
692          return false;
693        }
694    };
695
696    tests['sessionstorage'] = function() {
697        try {
698            return ('sessionStorage' in window) && window.sessionStorage !== null;
699        } catch(e){
700            return false;
701        }
702    };
703
704
705    tests['webWorkers'] = function () {
706        return !!window.Worker;
707    };
708
709
710    tests['applicationcache'] =  function() {
711        return !!window.applicationCache;
712    };
713
714 
715    // Thanks to Erik Dahlstrom
716    tests['svg'] = function(){
717        return !!doc.createElementNS && !!doc.createElementNS(ns.svg, "svg").createSVGRect;
718    };
719
720    tests['inlinesvg'] = function() {
721      var div = document.createElement('div');
722      div.innerHTML = '<svg/>';
723      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
724    };
725
726    // Thanks to F1lt3r and lucideer
727    // http://github.com/Modernizr/Modernizr/issues#issue/35
728    tests['smil'] = function(){
729        return !!doc.createElementNS && /SVG/.test(tostring.call(doc.createElementNS(ns.svg,'animate')));
730    };
731
732    tests['svgclippaths'] = function(){
733        // Possibly returns a false positive in Safari 3.2?
734        return !!doc.createElementNS && /SVG/.test(tostring.call(doc.createElementNS(ns.svg,'clipPath')));
735    };
736
737
738    // input features and input types go directly onto the ret object, bypassing the tests loop.
739    // Hold this guy to execute in a moment.
740    function webforms(){
741    
742        // Run through HTML5's new input attributes to see if the UA understands any.
743        // We're using f which is the <input> element created early on
744        // Mike Taylr has created a comprehensive resource for testing these attributes
745        //   when applied to all input types: 
746        //   http://miketaylr.com/code/input-type-attr.html
747        // spec: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
748        ret['input'] = (function(props) {
749            for (var i = 0,len=props.length;i<len;i++) {
750                attrs[ props[i] ] = !!(props[i] in f);
751            }
752            return attrs;
753        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
754
755        // Run through HTML5's new input types to see if the UA understands any.
756        //   This is put behind the tests runloop because it doesn't return a
757        //   true/false like all the other tests; instead, it returns an object
758        //   containing each input type with its corresponding true/false value 
759        
760        // Big thanks to @miketaylr for the html5 forms expertise. http://miketaylr.com/
761        ret['inputtypes'] = (function(props) {
762            for (var i = 0, bool, len=props.length ; i < len ; i++) {
763              
764                f.setAttribute('type', props[i]);
765                bool = f.type !== 'text';
766                
767                // Chrome likes to falsely purport support, so we feed it a textual value;
768                // if that doesnt succeed then we know there's a custom UI
769                if (bool){  
770
771                    f.value = smile;
772     
773                    if (/^range$/.test(f.type) && f.style.WebkitAppearance !== undefined){
774                      
775                      docElement.appendChild(f);
776                      var defaultView = doc.defaultView;
777                      
778                      // Safari 2-4 allows the smiley as a value, despite making a slider
779                      bool =  defaultView.getComputedStyle && 
780                              defaultView.getComputedStyle(f, null).WebkitAppearance !== 'textfield' && 
781                      
782                              // Mobile android web browser has false positive, so must
783                              // check the height to see if the widget is actually there.
784                              (f.offsetHeight !== 0);
785                              
786                      docElement.removeChild(f);
787                              
788                    } else if (/^(search|tel)$/.test(f.type)){
789                      // Spec doesnt define any special parsing or detectable UI 
790                      //   behaviors so we pass these through as true
791                      
792                      // Interestingly, opera fails the earlier test, so it doesn't
793                      //  even make it here.
794                      
795                    } else if (/^(url|email)$/.test(f.type)) {
796
797                      // Real url and email support comes with prebaked validation.
798                      bool = f.checkValidity && f.checkValidity() === false;
799                      
800                    } else {
801                      // If the upgraded input compontent rejects the :) text, we got a winner
802                      bool = f.value != smile;
803                    }
804                }
805                
806                inputs[ props[i] ] = !!bool;
807            }
808            return inputs;
809        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
810
811    }
812
813
814
815    // End of test definitions
816
817
818
819    // Run through all tests and detect their support in the current UA.
820    // todo: hypothetically we could be doing an array of tests and use a basic loop here.
821    for ( var feature in tests ) {
822        if ( hasOwnProperty( tests, feature ) ) {
823            // run the test, throw the return value into the Modernizr,
824            //   then based on that boolean, define an appropriate className
825            //   and push it into an array of classes we'll join later.
826            featurename  = feature.toLowerCase();
827            ret[ featurename ] = tests[ feature ]();
828
829            classes.push( ( ret[ featurename ] ? '' : 'no-' ) + featurename );
830        }
831    }
832    
833    // input tests need to run.
834    if (!ret.input) webforms();
835    
836
837   
838    // Per 1.6: deprecated API is still accesible for now:
839    ret.crosswindowmessaging = ret.postmessage;
840    ret.historymanagement = ret.history;
841
842
843
844    /**
845     * Addtest allows the user to define their own feature tests
846     * the result will be added onto the Modernizr object,
847     * as well as an appropriate className set on the html element
848     * 
849     * @param feature - String naming the feature
850     * @param test - Function returning true if feature is supported, false if not
851     */
852    ret.addTest = function (feature, test) {
853      feature = feature.toLowerCase();
854      
855      if (ret[ feature ]) {
856        return; // quit if you're trying to overwrite an existing test
857      } 
858      test = !!(test());
859      docElement.className += ' ' + (test ? '' : 'no-') + feature; 
860      ret[ feature ] = test;
861      return ret; // allow chaining.
862    };
863
864    /**
865     * Reset m.style.cssText to nothing to reduce memory footprint.
866     */
867    set_css( '' );
868    m = f = null;
869
870    // Enable HTML 5 elements for styling in IE. 
871    // fyi: jscript version does not reflect trident version
872    //      therefore ie9 in ie7 mode will still have a jScript v.9
873    if ( enableHTML5 && window.attachEvent && (function(){ var elem = doc.createElement("div");
874                                      elem.innerHTML = "<elem></elem>";
875                                      return elem.childNodes.length !== 1; })()) {
876        // iepp v1.6 by @jon_neal : code.google.com/p/ie-print-protector
877        (function(f,l){var j="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",n=j.split("|"),k=n.length,g=new RegExp("<(/*)("+j+")","gi"),h=new RegExp("\\b("+j+")\\b(?!.*[;}])","gi"),m=l.createDocumentFragment(),d=l.documentElement,i=d.firstChild,b=l.createElement("style"),e=l.createElement("body");b.media="all";function c(p){var o=-1;while(++o<k){p.createElement(n[o])}}c(l);c(m);function a(t,s){var r=t.length,q=-1,o,p=[];while(++q<r){o=t[q];s=o.media||s;p.push(a(o.imports,s));p.push(o.cssText)}return p.join("")}f.attachEvent("onbeforeprint",function(){var r=-1;while(++r<k){var o=l.getElementsByTagName(n[r]),q=o.length,p=-1;while(++p<q){if(o[p].className.indexOf("iepp_")<0){o[p].className+=" iepp_"+n[r]}}}i.insertBefore(b,i.firstChild);b.styleSheet.cssText=a(l.styleSheets,"all").replace(h,".iepp_$1");m.appendChild(l.body);d.appendChild(e);e.innerHTML=m.firstChild.innerHTML.replace(g,"<$1bdo")});f.attachEvent("onafterprint",function(){e.innerHTML="";d.removeChild(e);i.removeChild(b);d.appendChild(m.firstChild)})})(this,document);
878    }
879
880    // Assign private properties to the return object with prefix
881    ret._enableHTML5     = enableHTML5;
882    ret._version         = version;
883
884    // Remove "no-js" class from <html> element, if it exists:
885    docElement.className=docElement.className.replace(/\bno-js\b/,'') + ' js';
886
887    // Add the new classes to the <html> element.
888    docElement.className += ' ' + classes.join( ' ' );
889    
890    return ret;
891
892})(this,this.document);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.