window.Modernizr = (function (window, document, undefined) { var version = '1.7', ret = {}, enableHTML5 = true, docElement = document.documentElement, docHead = document.head || document.getElementsByTagName('head')[0], mod = 'modernizr', modElem = document.createElement(mod), m_style = modElem.style, inputElem = document.createElement('input'), smile = ':)', tostring = Object.prototype.toString, prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '), domPrefixes = 'Webkit Moz O ms Khtml'.split(' '), ns = { 'svg': 'http://www.w3.org/2000/svg' }, tests = {}, inputs = {}, attrs = {}, classes = [], featurename, testMediaQuery = function (mq) { var st = document.createElement('style'), div = document.createElement('div'), ret; st.textContent = mq + '{#modernizr{height:3px}}'; docHead.appendChild(st); div.id = 'modernizr'; docElement.appendChild(div); ret = div.offsetHeight === 3; st.parentNode.removeChild(st); div.parentNode.removeChild(div); return !!ret }, isEventSupported = (function () { var TAGNAMES = { 'select': 'input', 'change': 'input', 'submit': 'form', 'reset': 'form', 'error': 'img', 'load': 'img', 'abort': 'img' }; function isEventSupported(eventName, element) { element = element || document.createElement(TAGNAMES[eventName] || 'div'); eventName = 'on' + eventName; var isSupported = (eventName in element); if (!isSupported) { if (!element.setAttribute) { element = document.createElement('div') } if (element.setAttribute && element.removeAttribute) { element.setAttribute(eventName, ''); isSupported = is(element[eventName], 'function'); if (!is(element[eventName], undefined)) { element[eventName] = undefined } element.removeAttribute(eventName) } } element = null; return isSupported } return isEventSupported })(); var _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty; if (!is(_hasOwnProperty, undefined) && !is(_hasOwnProperty.call, undefined)) { hasOwnProperty = function (object, property) { return _hasOwnProperty.call(object, property) } } else { hasOwnProperty = function (object, property) { return ((property in object) && is(object.constructor.prototype[property], undefined)) } } function set_css(str) { m_style.cssText = str } function set_css_all(str1, str2) { return set_css(prefixes.join(str1 + ';') + (str2 || '')) } function is(obj, type) { return typeof obj === type } function contains(str, substr) { return ('' + str).indexOf(substr) !== -1 } function test_props(props, callback) { for (var i in props) { if (m_style[props[i]] !== undefined && (!callback || callback(props[i], modElem))) { return true } } } function test_props_all(prop, callback) { var uc_prop = prop.charAt(0).toUpperCase() + prop.substr(1), props = (prop + ' ' + domPrefixes.join(uc_prop + ' ') + uc_prop).split(' '); return !!test_props(props, callback) } tests['flexbox'] = function () { function set_prefixed_value_css(element, property, value, extra) { property += ':'; element.style.cssText = (property + prefixes.join(value + ';' + property)).slice(0, -property.length) + (extra || '') } function set_prefixed_property_css(element, property, value, extra) { element.style.cssText = prefixes.join(property + ':' + value + ';') + (extra || '') } var c = document.createElement('div'), elem = document.createElement('div'); set_prefixed_value_css(c, 'display', 'box', 'width:42px;padding:0;'); set_prefixed_property_css(elem, 'box-flex', '1', 'width:10px;'); c.appendChild(elem); docElement.appendChild(c); var ret = elem.offsetWidth === 42; c.removeChild(elem); docElement.removeChild(c); return ret }; tests['canvas'] = function () { var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')) }; tests['canvastext'] = function () { return !!(ret['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')) }; tests['webgl'] = function () { return !!window.WebGLRenderingContext }; tests['touch'] = function () { return ('ontouchstart' in window) || testMediaQuery('@media (' + prefixes.join('touch-enabled),(') + 'modernizr)') }; tests['geolocation'] = function () { return !!navigator.geolocation }; tests['postmessage'] = function () { return !!window.postMessage }; tests['websqldatabase'] = function () { var result = !!window.openDatabase; return result }; tests['indexedDB'] = function () { for (var i = -1, len = domPrefixes.length; ++i < len; ) { var prefix = domPrefixes[i].toLowerCase(); if (window[prefix + '_indexedDB'] || window[prefix + 'IndexedDB']) { return true } } return false }; tests['hashchange'] = function () { return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7) }; tests['history'] = function () { return !!(window.history && history.pushState) }; tests['draganddrop'] = function () { return isEventSupported('dragstart') && isEventSupported('drop') }; tests['websockets'] = function () { return ('WebSocket' in window) }; tests['rgba'] = function () { set_css('background-color:rgba(150,255,150,.5)'); return contains(m_style.backgroundColor, 'rgba') }; tests['hsla'] = function () { set_css('background-color:hsla(120,40%,100%,.5)'); return contains(m_style.backgroundColor, 'rgba') || contains(m_style.backgroundColor, 'hsla') }; tests['multiplebgs'] = function () { set_css('background:url(//:),url(//:),red url(//:)'); return new RegExp("(url\\s*\\(.*?){3}").test(m_style.background) }; tests['backgroundsize'] = function () { return test_props_all('backgroundSize') }; tests['borderimage'] = function () { return test_props_all('borderImage') }; tests['borderradius'] = function () { return test_props_all('borderRadius', '', function (prop) { return contains(prop, 'orderRadius') }) }; tests['boxshadow'] = function () { return test_props_all('boxShadow') }; tests['textshadow'] = function () { return document.createElement('div').style.textShadow === '' }; tests['opacity'] = function () { set_css_all('opacity:.55'); return /^0.55$/.test(m_style.opacity) }; tests['cssanimations'] = function () { return test_props_all('animationName') }; tests['csscolumns'] = function () { return test_props_all('columnCount') }; tests['cssgradients'] = function () { var str1 = 'background-image:', str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', str3 = 'linear-gradient(left top,#9f9, white);'; set_css((str1 + prefixes.join(str2 + str1) + prefixes.join(str3 + str1)).slice(0, -str1.length)); return contains(m_style.backgroundImage, 'gradient') }; tests['cssreflections'] = function () { return test_props_all('boxReflect') }; tests['csstransforms'] = function () { return !!test_props(['transformProperty', 'WebkitTransform', 'MozTransform', 'OTransform', 'msTransform']) }; tests['csstransforms3d'] = function () { var ret = !!test_props(['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']); if (ret && 'webkitPerspective' in docElement.style) { ret = testMediaQuery('@media (' + prefixes.join('transform-3d),(') + 'modernizr)') } return ret }; tests['csstransitions'] = function () { return test_props_all('transitionProperty') }; tests['fontface'] = function () { var sheet, bool, head = docHead || docElement, style = document.createElement("style"), impl = document.implementation || { hasFeature: function () { return false } }; style.type = 'text/css'; head.insertBefore(style, head.firstChild); sheet = style.sheet || style.styleSheet; var supportAtRule = impl.hasFeature('CSS2', '') ? function (rule) { if (!(sheet && rule)) return false; var result = false; try { sheet.insertRule(rule, 0); result = (/src/i).test(sheet.cssRules[0].cssText); sheet.deleteRule(sheet.cssRules.length - 1) } catch (e) { } return result } : function (rule) { if (!(sheet && rule)) return false; sheet.cssText = rule; return sheet.cssText.length !== 0 && (/src/i).test(sheet.cssText) && sheet.cssText.replace(/\r+|\n+/g, '').indexOf(rule.split(' ')[0]) === 0 }; bool = supportAtRule('@font-face { font-family: "font"; src: "//:"; }'); head.removeChild(style); return bool }; tests['video'] = function () { var elem = document.createElement('video'), bool = !!elem.canPlayType; if (bool) { bool = new Boolean(bool); bool.ogg = elem.canPlayType('video/ogg; codecs="theora"'); var h264 = 'video/mp4; codecs="avc1.42E01E'; bool.h264 = elem.canPlayType(h264 + '"') || elem.canPlayType(h264 + ', mp4a.40.2"'); bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"') } return bool }; tests['audio'] = function () { var elem = document.createElement('audio'), bool = !!elem.canPlayType; if (bool) { bool = new Boolean(bool); bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"'); bool.mp3 = elem.canPlayType('audio/mpeg;'); bool.wav = elem.canPlayType('audio/wav; codecs="1"'); bool.m4a = elem.canPlayType('audio/x-m4a;') || elem.canPlayType('audio/aac;') } return bool }; tests['localstorage'] = function () { try { return !!localStorage.getItem } catch (e) { return false } }; tests['sessionstorage'] = function () { try { return !!sessionStorage.getItem } catch (e) { return false } }; tests['webWorkers'] = function () { return !!window.Worker }; tests['applicationcache'] = function () { return !!window.applicationCache }; tests['svg'] = function () { return !!document.createElementNS && !!document.createElementNS(ns.svg, "svg").createSVGRect }; tests['inlinesvg'] = function () { var div = document.createElement('div'); div.innerHTML = '<svg/>'; return (div.firstChild && div.firstChild.namespaceURI) == ns.svg }; tests['smil'] = function () { return !!document.createElementNS && /SVG/.test(tostring.call(document.createElementNS(ns.svg, 'animate'))) }; tests['svgclippaths'] = function () { return !!document.createElementNS && /SVG/.test(tostring.call(document.createElementNS(ns.svg, 'clipPath'))) }; function webforms() { ret['input'] = (function (props) { for (var i = 0, len = props.length; i < len; i++) { attrs[props[i]] = !!(props[i] in inputElem) } return attrs })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); ret['inputtypes'] = (function (props) { for (var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++) { inputElem.setAttribute('type', inputElemType = props[i]); bool = inputElem.type !== 'text'; if (bool) { inputElem.value = smile; inputElem.style.cssText = 'position:absolute;visibility:hidden;'; if (/^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined) { docElement.appendChild(inputElem); defaultView = document.defaultView; bool = defaultView.getComputedStyle && defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && (inputElem.offsetHeight !== 0); docElement.removeChild(inputElem) } else if (/^(search|tel)$/.test(inputElemType)) { } else if (/^(url|email)$/.test(inputElemType)) { bool = inputElem.checkValidity && inputElem.checkValidity() === false } else if (/^color$/.test(inputElemType)) { docElement.appendChild(inputElem); docElement.offsetWidth; bool = inputElem.value != smile; docElement.removeChild(inputElem) } else { bool = inputElem.value != smile } } inputs[props[i]] = !!bool } return inputs })('search tel url email datetime date month week time datetime-local number range color'.split(' ')) } for (var feature in tests) { if (hasOwnProperty(tests, feature)) { featurename = feature.toLowerCase(); ret[featurename] = tests[feature](); classes.push((ret[featurename] ? '' : 'no-') + featurename) } } if (!ret.input) webforms(); ret.crosswindowmessaging = ret.postmessage; ret.historymanagement = ret.history; ret.addTest = function (feature, test) { feature = feature.toLowerCase(); if (ret[feature]) { return } test = !!(test()); docElement.className += ' ' + (test ? '' : 'no-') + feature; ret[feature] = test; return ret }; set_css(''); modElem = inputElem = null; if (enableHTML5 && window.attachEvent && (function () { var elem = document.createElement("div"); elem.innerHTML = "<elem></elem>"; return elem.childNodes.length !== 1 })()) { (function (win, doc) { var elems = 'abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video', elemsArr = elems.split('|'), elemsArrLen = elemsArr.length, elemRegExp = new RegExp('(^|\\s)(' + elems + ')', 'gi'), tagRegExp = new RegExp('<(\/*)(' + elems + ')', 'gi'), ruleRegExp = new RegExp('(^|[^\\n]*?\\s)(' + elems + ')([^\\n]*)({[\\n\\w\\W]*?})', 'gi'), docFrag = doc.createDocumentFragment(), html = doc.documentElement, head = html.firstChild, bodyElem = doc.createElement('body'), styleElem = doc.createElement('style'), body; function shim(doc) { var a = -1; while (++a < elemsArrLen) doc.createElement(elemsArr[a]) } function getCSS(styleSheetList, mediaType) { var a = -1, len = styleSheetList.length, styleSheet, cssTextArr = []; while (++a < len) { styleSheet = styleSheetList[a]; if ((mediaType = styleSheet.media || mediaType) != 'screen') cssTextArr.push(getCSS(styleSheet.imports, mediaType), styleSheet.cssText) } return cssTextArr.join('') } shim(doc); shim(docFrag); head.insertBefore(styleElem, head.firstChild); styleElem.media = 'print'; win.attachEvent('onbeforeprint', function () { var a = -1, cssText = getCSS(doc.styleSheets, 'all'), cssTextArr = [], rule; body = body || doc.body; while ((rule = ruleRegExp.exec(cssText)) != null) cssTextArr.push((rule[1] + rule[2] + rule[3]).replace(elemRegExp, '$1.iepp_$2') + rule[4]); styleElem.styleSheet.cssText = cssTextArr.join('\n'); while (++a < elemsArrLen) { var nodeList = doc.getElementsByTagName(elemsArr[a]), nodeListLen = nodeList.length, b = -1; while (++b < nodeListLen) if (nodeList[b].className.indexOf('iepp_') < 0) nodeList[b].className += ' iepp_' + elemsArr[a] } docFrag.appendChild(body); html.appendChild(bodyElem); bodyElem.className = body.className; bodyElem.innerHTML = body.innerHTML.replace(tagRegExp, '<$1font') }); win.attachEvent('onafterprint', function () { bodyElem.innerHTML = ''; html.removeChild(bodyElem); html.appendChild(body); styleElem.styleSheet.cssText = '' }) })(window, document) } ret._enableHTML5 = enableHTML5; ret._version = version; docElement.className = docElement.className.replace(/\bno-js\b/, '') + ' js ' + classes.join(' '); return ret })(this, this.document);
