PageSourceSearch

https://www.allianztravelinsurance.com/v_40103979927851/system/master/core_js/vendorlib/modernizr.js

js allianztravelinsurance.com collected 2026-09-24 17:09:19 UTC 24,156 bytes, 802 lines download raw bytes

1/* Modernizr 2.6.3 (Custom Build) | MIT & BSD
2 * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderradius-boxshadow-flexbox-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-input-inputtypes-touch-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-cookies-css_backgroundposition_shorthand-css_backgroundposition_xy-css_backgroundrepeat-css_backgroundsizecover-css_boxsizing-css_lastchild-css_mediaqueries-css_resize-css_scrollbars-css_userselect-forms_fileinput-forms_formattribute-forms_placeholder-forms_speechinput-forms_validation
3 */
4;
5window.Modernizr = (function( window, document, undefined ) {
6
7    var version = '2.6.3',
8
9    Modernizr = {},
10
11    enableClasses = true,
12
13    docElement = document.documentElement,
14
15    mod = 'modernizr',
16    modElem = document.createElement(mod),
17    mStyle = modElem.style,
18
19    inputElem  = document.createElement('input')  ,
20
21    smile = ':)',
22
23    toString = {}.toString,
24
25    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
26
27
28
29    omPrefixes = 'Webkit Moz O ms',
30
31    cssomPrefixes = omPrefixes.split(' '),
32
33    domPrefixes = omPrefixes.toLowerCase().split(' '),
34
35
36    tests = {},
37    inputs = {},
38    attrs = {},
39
40    classes = [],
41
42    slice = classes.slice,
43
44    featureName, 
45
46
47    injectElementWithStyles = function( rule, callback, nodes, testnames ) {
48
49      var style, ret, node, docOverflow,
50          div = document.createElement('div'),
51                body = document.body,
52                fakeBody = body || document.createElement('body');
53
54      if ( parseInt(nodes, 10) ) {
55                      while ( nodes-- ) {
56              node = document.createElement('div');
57              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
58              div.appendChild(node);
59          }
60      }
61
62                style = ['&#173;','<style id="s', mod, '">', rule, '</style>'].join('');
63      div.id = mod;
64          (body ? div : fakeBody).innerHTML += style;
65      fakeBody.appendChild(div);
66      if ( !body ) {
67                fakeBody.style.background = '';
68                fakeBody.style.overflow = 'hidden';
69          docOverflow = docElement.style.overflow;
70          docElement.style.overflow = 'hidden';
71          docElement.appendChild(fakeBody);
72      }
73
74      ret = callback(div, rule);
75        if ( !body ) {
76          fakeBody.parentNode.removeChild(fakeBody);
77          docElement.style.overflow = docOverflow;
78      } else {
79          div.parentNode.removeChild(div);
80      }
81
82      return !!ret;
83
84    },
85
86    testMediaQuery = function( mq ) {
87
88      var matchMedia = window.matchMedia || window.msMatchMedia;
89      if ( matchMedia ) {
90        return matchMedia(mq).matches;
91      }
92
93      var bool;
94
95      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {
96        bool = (window.getComputedStyle ?
97                  getComputedStyle(node, null) :
98                  node.currentStyle)['position'] == 'absolute';
99      });
100
101      return bool;
102
103     },
104 
105
106    isEventSupported = (function() {
107
108      var TAGNAMES = {
109        'select': 'input', 'change': 'input',
110        'submit': 'form', 'reset': 'form',
111        'error': 'img', 'load': 'img', 'abort': 'img'
112      };
113
114      function isEventSupported( eventName, element ) {
115
116        element = element || document.createElement(TAGNAMES[eventName] || 'div');
117        eventName = 'on' + eventName;
118
119            var isSupported = eventName in element;
120
121        if ( !isSupported ) {
122                if ( !element.setAttribute ) {
123            element = document.createElement('div');
124          }
125          if ( element.setAttribute && element.removeAttribute ) {
126            element.setAttribute(eventName, '');
127            isSupported = is(element[eventName], 'function');
128
129                    if ( !is(element[eventName], 'undefined') ) {
130              element[eventName] = undefined;
131            }
132            element.removeAttribute(eventName);
133          }
134        }
135
136        element = null;
137        return isSupported;
138      }
139      return isEventSupported;
140    })(),
141
142
143    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
144
145    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
146      hasOwnProp = function (object, property) {
147        return _hasOwnProperty.call(object, property);
148      };
149    }
150    else {
151      hasOwnProp = function (object, property) { 
152        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
153      };
154    }
155
156
157    if (!Function.prototype.bind) {
158      Function.prototype.bind = function bind(that) {
159
160        var target = this;
161
162        if (typeof target != "function") {
163            throw new TypeError();
164        }
165
166        var args = slice.call(arguments, 1),
167            bound = function () {
168
169            if (this instanceof bound) {
170
171              var F = function(){};
172              F.prototype = target.prototype;
173              var self = new F();
174
175              var result = target.apply(
176                  self,
177                  args.concat(slice.call(arguments))
178              );
179              if (Object(result) === result) {
180                  return result;
181              }
182              return self;
183
184            } else {
185
186              return target.apply(
187                  that,
188                  args.concat(slice.call(arguments))
189              );
190
191            }
192
193        };
194
195        return bound;
196      };
197    }
198
199    function setCss( str ) {
200        mStyle.cssText = str;
201    }
202
203    function setCssAll( str1, str2 ) {
204        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
205    }
206
207    function is( obj, type ) {
208        return typeof obj === type;
209    }
210
211    function contains( str, substr ) {
212        return !!~('' + str).indexOf(substr);
213    }
214
215    function testProps( props, prefixed ) {
216        for ( var i in props ) {
217            var prop = props[i];
218            if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
219                return prefixed == 'pfx' ? prop : true;
220            }
221        }
222        return false;
223    }
224
225    function testDOMProps( props, obj, elem ) {
226        for ( var i in props ) {
227            var item = obj[props[i]];
228            if ( item !== undefined) {
229
230                            if (elem === false) return props[i];
231
232                            if (is(item, 'function')){
233                                return item.bind(elem || obj);
234                }
235
236                            return item;
237            }
238        }
239        return false;
240    }
241
242    function testPropsAll( prop, prefixed, elem ) {
243
244        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),
245            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
246
247            if(is(prefixed, "string") || is(prefixed, "undefined")) {
248          return testProps(props, prefixed);
249
250            } else {
251          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
252          return testDOMProps(props, prefixed, elem);
253        }
254    }    tests['flexbox'] = function() {
255      return testPropsAll('flexWrap');
256    };
257    tests['touch'] = function() {
258        var bool;
259
260        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
261          bool = true;
262        } else {
263          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {
264            bool = node.offsetTop === 9;
265          });
266        }
267
268        return bool;
269    };    tests['rgba'] = function() {
270        setCss('background-color:rgba(150,255,150,.5)');
271
272        return contains(mStyle.backgroundColor, 'rgba');
273    };
274
275
276    tests['multiplebgs'] = function() {
277                setCss('background:url(https://),url(https://),red url(https://)');
278
279            return (/(url\s*\(.*?){3}/).test(mStyle.background);
280    };    tests['backgroundsize'] = function() {
281        return testPropsAll('backgroundSize');
282    };
282    tests['borderradius'] = function() {
283        return testPropsAll('borderRadius');
284    };
285
286    tests['boxshadow'] = function() {
287        return testPropsAll('boxShadow');
288    };
289
290    tests['textshadow'] = function() {
291        return document.createElement('div').style.textShadow === '';
292    };
293
294
295    tests['opacity'] = function() {
296                setCssAll('opacity:.55');
297
298                    return (/^0.55$/).test(mStyle.opacity);
299    };
300
301
302    tests['cssanimations'] = function() {
303        return testPropsAll('animationName');
304    };
305
306
307    tests['csscolumns'] = function() {
308        return testPropsAll('columnCount');
309    };
310
311
312    tests['cssgradients'] = function() {
313        var str1 = 'background-image:',
314            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
315            str3 = 'linear-gradient(left top,#9f9, white);';
316
317        setCss(
318                       (str1 + '-webkit- '.split(' ').join(str2 + str1) +
319                       prefixes.join(str3 + str1)).slice(0, -str1.length)
320        );
321
322        return contains(mStyle.backgroundImage, 'gradient');
323    };
324
325
326    tests['cssreflections'] = function() {
327        return testPropsAll('boxReflect');
328    };
329
330
331    tests['csstransforms'] = function() {
332        return !!testPropsAll('transform');
333    };
334
335
336    tests['csstransforms3d'] = function() {
337
338        var ret = !!testPropsAll('perspective');
339
340                        if ( ret && 'webkitPerspective' in docElement.style ) {
341
342                      injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {
343            ret = node.offsetLeft === 9 && node.offsetHeight === 3;
344          });
345        }
346        return ret;
347    };
348
349
350    tests['csstransitions'] = function() {
351        return testPropsAll('transition');
352    };
353
354
355
356    tests['fontface'] = function() {
357        var bool;
358
359        injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) {
360          var style = document.getElementById('smodernizr'),
361              sheet = style.sheet || style.styleSheet,
362              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';
363
364          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;
365        });
366
367        return bool;
368    };
369
370    tests['generatedcontent'] = function() {
371        var bool;
372
373        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {
374          bool = node.offsetHeight >= 3;
375        });
376
377        return bool;
378    };
379    function webforms() {
380                                            Modernizr['input'] = (function( props ) {
381            for ( var i = 0, len = props.length; i < len; i++ ) {
382                attrs[ props[i] ] = !!(props[i] in inputElem);
383            }
384            if (attrs.list){
385                                  attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
386            }
387            return attrs;
388        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
389                            Modernizr['inputtypes'] = (function(props) {
390
391            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
392
393                inputElem.setAttribute('type', inputElemType = props[i]);
394                bool = inputElem.type !== 'text';
395
396                                                    if ( bool ) {
397
398                    inputElem.value         = smile;
399                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';
400
401                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
402
403                      docElement.appendChild(inputElem);
404                      defaultView = document.defaultView;
405
406                                        bool =  defaultView.getComputedStyle &&
407                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
408                                                                                  (inputElem.offsetHeight !== 0);
409
410                      docElement.removeChild(inputElem);
411
412                    } else if ( /^(search|tel)$/.test(inputElemType) ){
413                                                                                    } else if ( /^(url|email)$/.test(inputElemType) ) {
414                                        bool = inputElem.checkValidity && inputElem.checkValidity() === false;
415
416                    } else {
417                                        bool = inputElem.value != smile;
418                    }
419                }
420
421                inputs[ props[i] ] = !!bool;
422            }
423            return inputs;
424        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
425        }
426    for ( var feature in tests ) {
427        if ( hasOwnProp(tests, feature) ) {
428                                    featureName  = feature.toLowerCase();
429            Modernizr[featureName] = tests[feature]();
430
431            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
432        }
433    }
434
435    Modernizr.input || webforms();
436
437
438     Modernizr.addTest = function ( feature, test ) {
439       if ( typeof feature == 'object' ) {
440         for ( var key in feature ) {
441           if ( hasOwnProp( feature, key ) ) {
442             Modernizr.addTest( key, feature[ key ] );
443           }
444         }
445       } else {
446
447         feature = feature.toLowerCase();
448
449         if ( Modernizr[feature] !== undefined ) {
450                                              return Modernizr;
451         }
452
453         test = typeof test == 'function' ? test() : test;
454
455         if (typeof enableClasses !== "undefined" && enableClasses) {
456           docElement.className += ' ' + (test ? '' : 'no-') + feature;
457         }
458         Modernizr[feature] = test;
459
460       }
461
462       return Modernizr; 
463     };
464
465
466    setCss('');
467    modElem = inputElem = null;
468
469
470    Modernizr._version      = version;
471
472    Modernizr._prefixes     = prefixes;
473    Modernizr._domPrefixes  = domPrefixes;
474    Modernizr._cssomPrefixes  = cssomPrefixes;
475
476    Modernizr.mq            = testMediaQuery;
477
478    Modernizr.hasEvent      = isEventSupported;
479
480    Modernizr.testProp      = function(prop){
481        return testProps([prop]);
482    };
483
484    Modernizr.testAllProps  = testPropsAll;
485
486
487    Modernizr.testStyles    = injectElementWithStyles;
488    Modernizr.prefixed      = function(prop, obj, elem){
489      if(!obj) {
490        return testPropsAll(prop, 'pfx');
491      } else {
492            return testPropsAll(prop, obj, elem);
493      }
494    };
495
496
497    docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') +
498
499                                                    (enableClasses ? ' js ' + classes.join(' ') : '');
500
501    return Modernizr;
502
503})(this, this.document);
504
505// by tauren
506// https://github.com/Modernizr/Modernizr/issues/191
507
508Modernizr.addTest('cookies', function () {
509  // Quick test if browser has cookieEnabled host property
510  if (navigator.cookieEnabled) return true;
511  // Create cookie
512  document.cookie = "cookietest=1";
513  var ret = document.cookie.indexOf("cookietest=") != -1;
514  // Delete cookie
515  document.cookie = "cookietest=1; expires=Thu, 01-Jan-1970 00:00:01 GMT";
516  return ret;
517});
518
519/*
520    https://developer.mozilla.org/en/CSS/background-position
521    http://www.w3.org/TR/css3-background/#background-position
522
523    Example: http://jsfiddle.net/Blink/bBXvt/
524*/
525
526(function() {
527
528    var elem = document.createElement('a'),
529        eStyle = elem.style,
530        val = "right 10px bottom 10px";
531
532    Modernizr.addTest('bgpositionshorthand', function(){
533        eStyle.cssText = "background-position: " + val + ";";
534        return (eStyle.backgroundPosition === val);
535    });
536
537}());
538// developer.mozilla.org/en/CSS/background-repeat
539
540// test page: jsbin.com/uzesun/
541// http://jsfiddle.net/ryanseddon/yMLTQ/6/    
542
543(function(){
544
545
546function getBgRepeatValue(elem){
547    return (window.getComputedStyle ?
548             getComputedStyle(elem, null).getPropertyValue('background') :
549             elem.currentStyle['background']);
550}
551  
552
553Modernizr.testStyles(' #modernizr { background-repeat: round; } ', function(elem, rule){ 
554
555  Modernizr.addTest('bgrepeatround', getBgRepeatValue(elem) == 'round');
556
557});
558
559
560
561Modernizr.testStyles(' #modernizr { background-repeat: space; } ', function(elem, rule){ 
562
563  Modernizr.addTest('bgrepeatspace', getBgRepeatValue(elem) == 'space');
564
565});
566
567
568})();
569/*
570	Allan Lei https://github.com/allanlei
571	
572	Check adapted from https://github.com/brandonaaron/jquery-cssHooks/blob/master/bgpos.js
573	
574	Test: http://jsfiddle.net/allanlei/R8AYS/
575*/
576Modernizr.addTest('bgpositionxy', function() {
577    return Modernizr.testStyles('#modernizr {background-position: 3px 5px;}', function(elem) {
578        var cssStyleDeclaration = window.getComputedStyle ? getComputedStyle(elem, null) : elem.currentStyle;
579        var xSupport = (cssStyleDeclaration.backgroundPositionX == '3px') || (cssStyleDeclaration['background-position-x'] == '3px');
580        var ySupport = (cssStyleDeclaration.backgroundPositionY == '5px') || (cssStyleDeclaration['background-position-y'] == '5px');
581        return xSupport && ySupport;
582    });
583});
584// developer.mozilla.org/en/CSS/background-size
585
586Modernizr.testStyles( '#modernizr{background-size:cover}', function( elem ) {
587	var style = window.getComputedStyle ?
588		window.getComputedStyle( elem, null )
589		: elem.currentStyle;
590		
591	Modernizr.addTest( 'bgsizecover', style.backgroundSize == 'cover' );
592});
593// developer.mozilla.org/en/CSS/box-sizing
594// github.com/Modernizr/Modernizr/issues/248
595
596Modernizr.addTest("boxsizing",function(){
597    return Modernizr.testAllProps("boxSizing") && (document.documentMode === undefined || document.documentMode > 7);
598});
599
600
601// last-child pseudo selector
602// https://github.com/Modernizr/Modernizr/pull/304
603
604
605Modernizr.addTest('lastchild', function(){
606
607  return Modernizr.testStyles("#modernizr div {width:100px} #modernizr :last-child{width:200px;display:block}", function (elem) {
608    return elem.lastChild.offsetWidth > elem.firstChild.offsetWidth;
609  }, 2);
610
611});
612
613
614// Detects whether input type="file" is available on the platform
615// E.g. iOS < 6 and some android version don't support this
616
617//  It's useful if you want to hide the upload feature of your app on devices that
618//  don't support it (iphone, ipad, etc).
619
620Modernizr.addTest('fileinput', function() {
621    var elem = document.createElement('input');
622    elem.type = 'file';
623    return !elem.disabled;
624});
625
626
627Modernizr.addTest('mediaqueries', Modernizr.mq('only all'));
628// Test for CSS 3 UI "resize" property
629// http://www.w3.org/TR/css3-ui/#resize
630// https://developer.mozilla.org/en/CSS/resize
631
632Modernizr.addTest('cssresize', Modernizr.testAllProps('resize'));
633
634
635// -moz-user-select:none test.
636
637// by ryan seddon
638//https://github.com/Modernizr/Modernizr/issues/250
639
640
641Modernizr.addTest("userselect",function(){
642    return Modernizr.testAllProps("user-select");
643});
644
645// Detects whether input form="form_id" is available on the platform
646// E.g. IE 10 (and below), don't support this
647Modernizr.addTest("formattribute", function() {
648	var form = document.createElement("form"),
649		input = document.createElement("input"),
650		div = document.createElement("div"),
651		id = "formtest"+(new Date().getTime()),
652		attr,
653		bool = false;
654
655		form.id = id;
656
657	//IE6/7 confuses the form idl attribute and the form content attribute
658	if(document.createAttribute){
659		attr = document.createAttribute("form");
660		attr.nodeValue = id;
661		input.setAttributeNode(attr);
662		div.appendChild(form);
663		div.appendChild(input);
664
665		document.documentElement.appendChild(div);
666
667		bool = form.elements.length === 1 && input.form == form;
668
669		div.parentNode.removeChild(div);
670	}
671
672	return bool;
673});// Stylable scrollbars detection
674Modernizr.addTest('cssscrollbar', function() {
675
676	var bool,
677
678		styles = "#modernizr{overflow: scroll; width: 40px }#" +
679			Modernizr._prefixes
680				.join("scrollbar{width:0px}"+' #modernizr::')
681				.split('#')
682				.slice(1)
683				.join('#') + "scrollbar{width:0px}";
684
685	Modernizr.testStyles(styles, function(node) {
686		bool = 'scrollWidth' in node && node.scrollWidth == 40;
687	});
688
689	return bool;
690
691});
692// speech input for inputs
693// by @alrra
694
695
696// `webkitSpeech` in elem 
697// doesn`t work correctly in all versions of Chromium based browsers.
698//   It can return false even if they have support for speech i.imgur.com/2Y40n.png
699//  Testing with 'onwebkitspeechchange' seems to fix this problem
700
701// this detect only checks the webkit version because
702// the speech attribute is likely to be deprecated in favor of a JavaScript API.
703// http://lists.w3.org/Archives/Public/public-webapps/2011OctDec/att-1696/speechapi.html
704
705// FIXME: add support for detecting the new spec'd behavior
706
707Modernizr.addTest('speechinput', function(){
708    var elem = document.createElement('input'); 
709    return 'speech' in elem || 'onwebkitspeechchange' in elem; 
710});// This implementation only tests support for interactive form validation.
711// To check validation for a specific type or a specific other constraint,
712// the test can be combined: 
713//    - Modernizr.inputtypes.numer && Modernizr.formvalidation (browser supports rangeOverflow, typeMismatch etc. for type=number)
714//    - Modernizr.input.required && Modernizr.formvalidation (browser supports valueMissing)
715//
716(function(document, Modernizr){
717
718
719Modernizr.formvalidationapi = false;
720Modernizr.formvalidationmessage = false;
721
722Modernizr.addTest('formvalidation', function(){
723    var form = document.createElement('form');
724    if ( !('checkValidity' in form) ) {
725        return false;
726    }
727    var body = document.body,
728
729    html = document.documentElement,
730
731    bodyFaked = false,
732
733    invaildFired = false,
734
735    input;
736
737    Modernizr.formvalidationapi = true;
738
739    // Prevent form from being submitted
740    form.onsubmit = function(e) {
741        //Opera does not validate form, if submit is prevented
742        if ( !window.opera ) {
743            e.preventDefault();
744        }
745        e.stopPropagation();
746    };
747
748    // Calling form.submit() doesn't trigger interactive validation, 
749    // use a submit button instead
750    //older opera browsers need a name attribute
751    form.innerHTML = '<input name="modTest" required><button></button>';
752
753    // FF4 doesn't trigger "invalid" event if form is not in the DOM tree
754    // Chrome throws error if invalid input is not visible when submitting 
755    form.style.position = 'absolute';
756    form.style.top = '-99999em';
757
758    // We might in <head> in which case we need to create body manually
759    if ( !body ) {
760        bodyFaked = true;
761        body = document.createElement('body');
762        //avoid crashing IE8, if background image is used
763        body.style.background = "";
764        html.appendChild(body);
765    }
766
767    body.appendChild(form);
768
769    input = form.getElementsByTagName('input')[0];	
770
771    // Record whether "invalid" event is fired
772    input.oninvalid = function(e) {
773        invaildFired = true;
774        e.preventDefault();
775        e.stopPropagation();
776    };
777
778    //Opera does not fully support the validationMessage property
779    Modernizr.formvalidationmessage = !!input.validationMessage;
780
781    // Submit form by clicking submit button
782    form.getElementsByTagName('button')[0].click();
783
784    // Don't forget to clean up
785    body.removeChild(form);
786    bodyFaked && html.removeChild(body);
787
788    return invaildFired;
789});
790
791
792})(document, window.Modernizr);// testing for placeholder attribute in inputs and textareas
793// re-using Modernizr.input if available
794
795Modernizr.addTest('placeholder', function(){
796
797  return !!( 'placeholder' in ( Modernizr.input    || document.createElement('input')    ) && 
798             'placeholder' in ( Modernizr.textarea || document.createElement('textarea') )
799           );
800
801});
802;

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.