vendor/assets/javascripts/webshims/shims/dom-extend.js in webshims-rails-0.4.5 vs vendor/assets/javascripts/webshims/shims/dom-extend.js in webshims-rails-0.4.6

- old
+ new

@@ -1,949 +1,949 @@ -//DOM-Extension helper -jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){ - "use strict"; - //shortcus - var modules = webshims.modules; - var listReg = /\s*,\s*/; - - //proxying attribute - var olds = {}; - var havePolyfill = {}; - var extendedProps = {}; - var extendQ = {}; - var modifyProps = {}; - - var oldVal = $.fn.val; - var singleVal = function(elem, name, val, pass, _argless){ - return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val); - }; - $.fn.val = function(val){ - var elem = this[0]; - if(arguments.length && val == null){ - val = ''; - } - if(!arguments.length){ - if(!elem || elem.nodeType !== 1){return oldVal.call(this);} - return $.prop(elem, 'value', val, 'val', true); - } - if($.isArray(val)){ - return oldVal.apply(this, arguments); - } - var isFunction = $.isFunction(val); - return this.each(function(i){ - elem = this; - if(elem.nodeType === 1){ - if(isFunction){ - var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true)); - if(genVal == null){ - genVal = ''; - } - $.prop(elem, 'value', genVal, 'val') ; - } else { - $.prop(elem, 'value', val, 'val'); - } - } - }); - }; - - var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000)); - var elementData = function(elem, key, val){ - elem = elem.jquery ? elem[0] : elem; - if(!elem){return val || {};} - var data = $.data(elem, dataID); - if(val !== undefined){ - if(!data){ - data = $.data(elem, dataID, {}); - } - if(key){ - data[key] = val; - } - } - - return key ? data && data[key] : data; - }; - - - [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){ - $.fn[data.name] = function(){ - return this.map(function(){ - var shadowData = elementData(this, 'shadowData'); - return shadowData && shadowData[data.prop] || this; - }); - }; - }); - - - ['removeAttr', 'prop', 'attr'].forEach(function(type){ - olds[type] = $[type]; - $[type] = function(elem, name, value, pass, _argless){ - var isVal = (pass == 'val'); - var oldMethod = !isVal ? olds[type] : singleVal; - if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){ - return oldMethod(elem, name, value, pass, _argless); - } - - var nodeName = (elem.nodeName || '').toLowerCase(); - var desc = extendedProps[nodeName]; - var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type; - var propMethod; - var oldValMethod; - var ret; - - - if(!desc){ - desc = extendedProps['*']; - } - if(desc){ - desc = desc[name]; - } - - if(desc){ - propMethod = desc[curType]; - } - - if(propMethod){ - if(name == 'value'){ - oldValMethod = propMethod.isVal; - propMethod.isVal = isVal; - } - if(curType === 'removeAttr'){ - return propMethod.value.call(elem); - } else if(value === undefined){ - return (propMethod.get) ? - propMethod.get.call(elem) : - propMethod.value - ; - } else if(propMethod.set) { - if(type == 'attr' && value === true){ - value = name; - } - - ret = propMethod.set.call(elem, value); - } - if(name == 'value'){ - propMethod.isVal = oldValMethod; - } - } else { - ret = oldMethod(elem, name, value, pass, _argless); - } - if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){ - - var boolValue; - if(curType == 'removeAttr'){ - boolValue = false; - } else if(curType == 'prop'){ - boolValue = !!(value); - } else { - boolValue = true; - } - - modifyProps[nodeName][name].forEach(function(fn){ - if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){ - fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type); - } - }); - } - return ret; - }; - - extendQ[type] = function(nodeName, prop, desc){ - - if(!extendedProps[nodeName]){ - extendedProps[nodeName] = {}; - } - if(!extendedProps[nodeName][prop]){ - extendedProps[nodeName][prop] = {}; - } - var oldDesc = extendedProps[nodeName][prop][type]; - var getSup = function(propType, descriptor, oDesc){ - if(descriptor && descriptor[propType]){ - return descriptor[propType]; - } - if(oDesc && oDesc[propType]){ - return oDesc[propType]; - } - if(type == 'prop' && prop == 'value'){ - return function(value){ - var elem = this; - return (desc.isVal) ? - singleVal(elem, prop, value, false, (arguments.length === 0)) : - olds[type](elem, prop, value) - ; - }; - } - if(type == 'prop' && propType == 'value' && desc.value.apply){ - return function(value){ - var sup = olds[type](this, prop); - if(sup && sup.apply){ - sup = sup.apply(this, arguments); - } - return sup; - }; - } - return function(value){ - return olds[type](this, prop, value); - }; - }; - extendedProps[nodeName][prop][type] = desc; - if(desc.value === undefined){ - if(!desc.set){ - desc.set = desc.writeable ? - getSup('set', desc, oldDesc) : - (webshims.cfg.useStrict && prop == 'prop') ? - function(){throw(prop +' is readonly on '+ nodeName);} : - $.noop - ; - } - if(!desc.get){ - desc.get = getSup('get', desc, oldDesc); - } - - } - - ['value', 'get', 'set'].forEach(function(descProp){ - if(desc[descProp]){ - desc['_sup'+descProp] = getSup(descProp, oldDesc); - } - }); - }; - - }); - - //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc - var isExtendNativeSave = (!$.browser.msie || parseInt($.browser.version, 10) > 8); - var extendNativeValue = (function(){ - var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar')); - var has = Object.prototype.hasOwnProperty; - return function(nodeName, prop, desc){ - var elem = document.createElement(nodeName); - var elemProto = webshims.getPrototypeOf(elem); - if( isExtendNativeSave && elemProto && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){ - var sup = elem[prop]; - desc._supvalue = function(){ - if(sup && sup.apply){ - return sup.apply(this, arguments); - } - return sup; - }; - elemProto[prop] = desc.value; - } else { - desc._supvalue = function(){ - var data = elementData(this, 'propValue'); - if(data && data[prop] && data[prop].apply){ - return data[prop].apply(this, arguments); - } - return data && data[prop]; - }; - initProp.extendValue(nodeName, prop, desc.value); - } - desc.value._supvalue = desc._supvalue; - }; - })(); - - var initProp = (function(){ - - var initProps = {}; - - webshims.addReady(function(context, contextElem){ - var nodeNameCache = {}; - var getElementsByName = function(name){ - if(!nodeNameCache[name]){ - nodeNameCache[name] = $(context.getElementsByTagName(name)); - if(contextElem[0] && $.nodeName(contextElem[0], name)){ - nodeNameCache[name] = nodeNameCache[name].add(contextElem); - } - } - }; - - - $.each(initProps, function(name, fns){ - getElementsByName(name); - if(!fns || !fns.forEach){ - webshims.warn('Error: with '+ name +'-property. methods: '+ fns); - return; - } - fns.forEach(function(fn){ - nodeNameCache[name].each(fn); - }); - }); - nodeNameCache = null; - }); - - var tempCache; - var emptyQ = $([]); - var createNodeNameInit = function(nodeName, fn){ - if(!initProps[nodeName]){ - initProps[nodeName] = [fn]; - } else { - initProps[nodeName].push(fn); - } - if($.isDOMReady){ - (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn); - } - }; - - var elementExtends = {}; - return { - createTmpCache: function(nodeName){ - if($.isDOMReady){ - tempCache = tempCache || $( document.getElementsByTagName(nodeName) ); - } - return tempCache || emptyQ; - }, - flushTmpCache: function(){ - tempCache = null; - }, - content: function(nodeName, prop){ - createNodeNameInit(nodeName, function(){ - var val = $.attr(this, prop); - if(val != null){ - $.attr(this, prop, val); - } - }); - }, - createElement: function(nodeName, fn){ - createNodeNameInit(nodeName, fn); - }, - extendValue: function(nodeName, prop, value){ - createNodeNameInit(nodeName, function(){ - $(this).each(function(){ - var data = elementData(this, 'propValue', {}); - data[prop] = this[prop]; - this[prop] = value; - }); - }); - } - }; - })(); - - var createPropDefault = function(descs, removeType){ - if(descs.defaultValue === undefined){ - descs.defaultValue = ''; - } - if(!descs.removeAttr){ - descs.removeAttr = { - value: function(){ - descs[removeType || 'prop'].set.call(this, descs.defaultValue); - descs.removeAttr._supvalue.call(this); - } - }; - } - if(!descs.attr){ - descs.attr = {}; - } - }; - - $.extend(webshims, { - - getID: (function(){ - var ID = new Date().getTime(); - return function(elem){ - elem = $(elem); - var id = elem.attr('id'); - if(!id){ - ID++; - id = 'ID-'+ ID; - elem.attr('id', id); - } - return id; - }; - })(), - extendUNDEFProp: function(obj, props){ - $.each(props, function(name, prop){ - if( !(name in obj) ){ - obj[name] = prop; - } - }); - }, - //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect - createPropDefault: createPropDefault, - data: elementData, - moveToFirstEvent: function(elem, eventType, bindType){ - var events = ($._data(elem, 'events') || {})[eventType]; - var fn; - - if(events && events.length > 1){ - fn = events.pop(); - if(!bindType){ - bindType = 'bind'; - } - if(bindType == 'bind' && events.delegateCount){ - events.splice( events.delegateCount, 0, fn); - } else { - events.unshift( fn ); - } - - - } - elem = null; - }, - addShadowDom: (function(){ - var resizeTimer; - var lastHeight; - var lastWidth; - - var docObserve = { - init: false, - runs: 0, - test: function(){ - var height = docObserve.getHeight(); - var width = docObserve.getWidth(); - - if(height != docObserve.height || width != docObserve.width){ - docObserve.height = height; - docObserve.width = width; - docObserve.handler({type: 'docresize'}); - docObserve.runs++; - if(docObserve.runs < 9){ - setTimeout(docObserve.test, 90); - } - } else { - docObserve.runs = 0; - } - }, - handler: function(e){ - clearTimeout(resizeTimer); - resizeTimer = setTimeout(function(){ - if(e.type == 'resize'){ - var width = $(window).width(); - var height = $(window).width(); - if(height == lastHeight && width == lastWidth){ - return; - } - lastHeight = height; - lastWidth = width; - - docObserve.height = docObserve.getHeight(); - docObserve.width = docObserve.getWidth(); - - } - $.event.trigger('updateshadowdom'); - }, (e.type == 'resize') ? 50 : 9); - }, - _create: function(){ - $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){ - var body = document.body; - var doc = document.documentElement; - docObserve[type] = function(){ - return Math.max( - body[ "scroll" + name ], doc[ "scroll" + name ], - body[ "offset" + name ], doc[ "offset" + name ], - doc[ "client" + name ] - ); - }; - }); - }, - start: function(){ - if(!this.init && document.body){ - this.init = true; - this._create(); - this.height = docObserve.getHeight(); - this.width = docObserve.getWidth(); - setInterval(this.test, 600); - $(this.test); - webshims.ready('WINDOWLOAD', this.test); - $(window).bind('resize', this.handler); - (function(){ - var oldAnimate = $.fn.animate; - var animationTimer; - - $.fn.animate = function(){ - clearTimeout(animationTimer); - animationTimer = setTimeout(function(){ - docObserve.test(); - }, 99); - - return oldAnimate.apply(this, arguments); - }; - })(); - } - } - }; - - - $.event.customEvent.updateshadowdom = true; - webshims.docObserve = function(){ - webshims.ready('DOM', function(){ - docObserve.start(); - }); - }; - return function(nativeElem, shadowElem, opts){ - opts = opts || {}; - if(nativeElem.jquery){ - nativeElem = nativeElem[0]; - } - if(shadowElem.jquery){ - shadowElem = shadowElem[0]; - } - var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {}); - var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {}); - var shadowFocusElementData = {}; - if(!opts.shadowFocusElement){ - opts.shadowFocusElement = shadowElem; - } else if(opts.shadowFocusElement){ - if(opts.shadowFocusElement.jquery){ - opts.shadowFocusElement = opts.shadowFocusElement[0]; - } - shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData); - } - - nativeData.hasShadow = shadowElem; - shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem; - shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = { - nativeElement: nativeElem, - shadowElement: shadowElem, - shadowFocusElement: opts.shadowFocusElement - }; - if(opts.shadowChilds){ - opts.shadowChilds.each(function(){ - elementData(this, 'shadowData', shadowData.shadowData); - }); - } - - if(opts.data){ - shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data; - } - opts = null; - webshims.docObserve(); - }; - })(), - propTypes: { - standard: function(descs, name){ - createPropDefault(descs); - if(descs.prop){return;} - descs.prop = { - set: function(val){ - descs.attr.set.call(this, ''+val); - }, - get: function(){ - return descs.attr.get.call(this) || descs.defaultValue; - } - }; - - }, - "boolean": function(descs, name){ - - createPropDefault(descs); - if(descs.prop){return;} - descs.prop = { - set: function(val){ - if(val){ - descs.attr.set.call(this, ""); - } else { - descs.removeAttr.value.call(this); - } - }, - get: function(){ - return descs.attr.get.call(this) != null; - } - }; - }, - "src": (function(){ - var anchor = document.createElement('a'); - anchor.style.display = "none"; - return function(descs, name){ - - createPropDefault(descs); - if(descs.prop){return;} - descs.prop = { - set: function(val){ - descs.attr.set.call(this, val); - }, - get: function(){ - var href = this.getAttribute(name); - var ret; - if(href == null){return '';} - - anchor.setAttribute('href', href+'' ); - - if(!$.support.hrefNormalized){ - try { - $(anchor).insertAfter(this); - ret = anchor.getAttribute('href', 4); - } catch(er){ - ret = anchor.getAttribute('href', 4); - } - $(anchor).detach(); - } - return ret || anchor.href; - } - }; - }; - })(), - enumarated: function(descs, name){ - - createPropDefault(descs); - if(descs.prop){return;} - descs.prop = { - set: function(val){ - descs.attr.set.call(this, val); - }, - get: function(){ - var val = (descs.attr.get.call(this) || '').toLowerCase(); - if(!val || descs.limitedTo.indexOf(val) == -1){ - val = descs.defaultValue; - } - return val; - } - }; - } - -// ,unsignedLong: $.noop -// ,"doubble": $.noop -// ,"long": $.noop -// ,tokenlist: $.noop -// ,settableTokenlist: $.noop - }, - reflectProperties: function(nodeNames, props){ - if(typeof props == 'string'){ - props = props.split(listReg); - } - props.forEach(function(prop){ - webshims.defineNodeNamesProperty(nodeNames, prop, { - prop: { - set: function(val){ - $.attr(this, prop, val); - }, - get: function(){ - return $.attr(this, prop) || ''; - } - } - }); - }); - }, - defineNodeNameProperty: function(nodeName, prop, descs){ - havePolyfill[prop] = true; - - if(descs.reflect){ - webshims.propTypes[descs.propType || 'standard'](descs, prop); - } - - ['prop', 'attr', 'removeAttr'].forEach(function(type){ - var desc = descs[type]; - if(desc){ - if(type === 'prop'){ - desc = $.extend({writeable: true}, desc); - } else { - desc = $.extend({}, desc, {writeable: true}); - } - - extendQ[type](nodeName, prop, desc); - if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){ - extendNativeValue(nodeName, prop, desc); - } - descs[type] = desc; - } - }); - if(descs.initAttr){ - initProp.content(nodeName, prop); - } - return descs; - }, - - defineNodeNameProperties: function(name, descs, propType, _noTmpCache){ - var olddesc; - for(var prop in descs){ - if(!_noTmpCache && descs[prop].initAttr){ - initProp.createTmpCache(name); - } - if(propType){ - if(descs[prop][propType]){ - //webshims.log('override: '+ name +'['+prop +'] for '+ propType); - } else { - descs[prop][propType] = {}; - ['value', 'set', 'get'].forEach(function(copyProp){ - if(copyProp in descs[prop]){ - descs[prop][propType][copyProp] = descs[prop][copyProp]; - delete descs[prop][copyProp]; - } - }); - } - } - descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]); - } - if(!_noTmpCache){ - initProp.flushTmpCache(); - } - return descs; - }, - - createElement: function(nodeName, create, descs){ - var ret; - if($.isFunction(create)){ - create = { - after: create - }; - } - initProp.createTmpCache(nodeName); - if(create.before){ - initProp.createElement(nodeName, create.before); - } - if(descs){ - ret = webshims.defineNodeNameProperties(nodeName, descs, false, true); - } - if(create.after){ - initProp.createElement(nodeName, create.after); - } - initProp.flushTmpCache(); - return ret; - }, - onNodeNamesPropertyModify: function(nodeNames, props, desc, only){ - if(typeof nodeNames == 'string'){ - nodeNames = nodeNames.split(listReg); - } - if($.isFunction(desc)){ - desc = {set: desc}; - } - - nodeNames.forEach(function(name){ - if(!modifyProps[name]){ - modifyProps[name] = {}; - } - if(typeof props == 'string'){ - props = props.split(listReg); - } - if(desc.initAttr){ - initProp.createTmpCache(name); - } - props.forEach(function(prop){ - if(!modifyProps[name][prop]){ - modifyProps[name][prop] = []; - havePolyfill[prop] = true; - } - if(desc.set){ - if(only){ - desc.set.only = only; - } - modifyProps[name][prop].push(desc.set); - } - - if(desc.initAttr){ - initProp.content(name, prop); - } - }); - initProp.flushTmpCache(); - - }); - }, - defineNodeNamesBooleanProperty: function(elementNames, prop, descs){ - if(!descs){ - descs = {}; - } - if($.isFunction(descs)){ - descs.set = descs; - } - webshims.defineNodeNamesProperty(elementNames, prop, { - attr: { - set: function(val){ - this.setAttribute(prop, val); - if(descs.set){ - descs.set.call(this, true); - } - }, - get: function(){ - var ret = this.getAttribute(prop); - return (ret == null) ? undefined : prop; - } - }, - removeAttr: { - value: function(){ - this.removeAttribute(prop); - if(descs.set){ - descs.set.call(this, false); - } - } - }, - reflect: true, - propType: 'boolean', - initAttr: descs.initAttr || false - }); - }, - contentAttr: function(elem, name, val){ - if(!elem.nodeName){return;} - var attr; - if(val === undefined){ - attr = (elem.attributes[name] || {}); - val = attr.specified ? attr.value : null; - return (val == null) ? undefined : val; - } - - if(typeof val == 'boolean'){ - if(!val){ - elem.removeAttribute(name); - } else { - elem.setAttribute(name, name); - } - } else { - elem.setAttribute(name, val); - } - }, - -// set current Lang: -// - webshims.activeLang(lang:string); -// get current lang -// - webshims.activeLang(); -// get current lang -// webshims.activeLang({ -// register: moduleName:string, -// callback: callback:function -// }); -// get/set including removeLang -// - webshims.activeLang({ -// module: moduleName:string, -// callback: callback:function, -// langObj: languageObj:array/object -// }); - activeLang: (function(){ - var callbacks = []; - var registeredCallbacks = {}; - var currentLang; - var shortLang; - var notLocal = /:\/\/|^\.*\//; - var loadRemoteLang = function(data, lang, options){ - var langSrc; - if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){ - data.loading = true; - langSrc = options.langSrc; - if(!notLocal.test(langSrc)){ - langSrc = webshims.cfg.basePath+langSrc; - } - webshims.loader.loadScript(langSrc+lang+'.js', function(){ - if(data.langObj[lang]){ - data.loading = false; - callLang(data, true); - } else { - $(function(){ - if(data.langObj[lang]){ - callLang(data, true); - } - data.loading = false; - }); - } - }); - return true; - } - return false; - }; - var callRegister = function(module){ - if(registeredCallbacks[module]){ - registeredCallbacks[module].forEach(function(data){ - data.callback(); - }); - } - }; - var callLang = function(data, _noLoop){ - if(data.activeLang != currentLang && data.activeLang !== shortLang){ - var options = modules[data.module].options; - if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){ - data.activeLang = currentLang; - data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang); - callRegister(data.module); - } else if( !_noLoop && - !loadRemoteLang(data, currentLang, options) && - !loadRemoteLang(data, shortLang, options) && - data.langObj[''] && data.activeLang !== '' ) { - data.activeLang = ''; - data.callback(data.langObj[''], currentLang); - callRegister(data.module); - } - } - }; - - - var activeLang = function(lang){ - - if(typeof lang == 'string' && lang !== currentLang){ - currentLang = lang; - shortLang = currentLang.split('-')[0]; - if(currentLang == shortLang){ - shortLang = false; - } - $.each(callbacks, function(i, data){ - callLang(data); - }); - } else if(typeof lang == 'object'){ - - if(lang.register){ - if(!registeredCallbacks[lang.register]){ - registeredCallbacks[lang.register] = []; - } - registeredCallbacks[lang.register].push(lang); - lang.callback(); - } else { - if(!lang.activeLang){ - lang.activeLang = ''; - } - callbacks.push(lang); - callLang(lang); - } - } - return currentLang; - }; - - return activeLang; - })() - }); - - $.each({ - defineNodeNamesProperty: 'defineNodeNameProperty', - defineNodeNamesProperties: 'defineNodeNameProperties', - createElements: 'createElement' - }, function(name, baseMethod){ - webshims[name] = function(names, a, b, c){ - if(typeof names == 'string'){ - names = names.split(listReg); - } - var retDesc = {}; - names.forEach(function(nodeName){ - retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c); - }); - return retDesc; - }; - }); - - webshims.isReady('webshimLocalization', true); -}); -//html5a11y -(function($, document){ - var browserVersion = $.webshims.browserVersion; - if($.browser.mozilla && browserVersion > 5){return;} - if (!$.browser.msie || (browserVersion < 12 && browserVersion > 7)) { - var elemMappings = { - article: "article", - aside: "complementary", - section: "region", - nav: "navigation", - address: "contentinfo" - }; - var addRole = function(elem, role){ - var hasRole = elem.getAttribute('role'); - if (!hasRole) { - elem.setAttribute('role', role); - } - }; - - $.webshims.addReady(function(context, contextElem){ - $.each(elemMappings, function(name, role){ - var elems = $(name, context).add(contextElem.filter(name)); - for (var i = 0, len = elems.length; i < len; i++) { - addRole(elems[i], role); - } - }); - if (context === document) { - var header = document.getElementsByTagName('header')[0]; - var footers = document.getElementsByTagName('footer'); - var footerLen = footers.length; - if (header && !$(header).closest('section, article')[0]) { - addRole(header, 'banner'); - } - if (!footerLen) { - return; - } - var footer = footers[footerLen - 1]; - if (!$(footer).closest('section, article')[0]) { - addRole(footer, 'contentinfo'); - } - } - }); - } -})(jQuery, document); +//DOM-Extension helper +jQuery.webshims.register('dom-extend', function($, webshims, window, document, undefined){ + "use strict"; + //shortcus + var modules = webshims.modules; + var listReg = /\s*,\s*/; + + //proxying attribute + var olds = {}; + var havePolyfill = {}; + var extendedProps = {}; + var extendQ = {}; + var modifyProps = {}; + + var oldVal = $.fn.val; + var singleVal = function(elem, name, val, pass, _argless){ + return (_argless) ? oldVal.call($(elem)) : oldVal.call($(elem), val); + }; + $.fn.val = function(val){ + var elem = this[0]; + if(arguments.length && val == null){ + val = ''; + } + if(!arguments.length){ + if(!elem || elem.nodeType !== 1){return oldVal.call(this);} + return $.prop(elem, 'value', val, 'val', true); + } + if($.isArray(val)){ + return oldVal.apply(this, arguments); + } + var isFunction = $.isFunction(val); + return this.each(function(i){ + elem = this; + if(elem.nodeType === 1){ + if(isFunction){ + var genVal = val.call( elem, i, $.prop(elem, 'value', undefined, 'val', true)); + if(genVal == null){ + genVal = ''; + } + $.prop(elem, 'value', genVal, 'val') ; + } else { + $.prop(elem, 'value', val, 'val'); + } + } + }); + }; + + var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000)); + var elementData = function(elem, key, val){ + elem = elem.jquery ? elem[0] : elem; + if(!elem){return val || {};} + var data = $.data(elem, dataID); + if(val !== undefined){ + if(!data){ + data = $.data(elem, dataID, {}); + } + if(key){ + data[key] = val; + } + } + + return key ? data && data[key] : data; + }; + + + [{name: 'getNativeElement', prop: 'nativeElement'}, {name: 'getShadowElement', prop: 'shadowElement'}, {name: 'getShadowFocusElement', prop: 'shadowFocusElement'}].forEach(function(data){ + $.fn[data.name] = function(){ + return this.map(function(){ + var shadowData = elementData(this, 'shadowData'); + return shadowData && shadowData[data.prop] || this; + }); + }; + }); + + + ['removeAttr', 'prop', 'attr'].forEach(function(type){ + olds[type] = $[type]; + $[type] = function(elem, name, value, pass, _argless){ + var isVal = (pass == 'val'); + var oldMethod = !isVal ? olds[type] : singleVal; + if( !elem || !havePolyfill[name] || elem.nodeType !== 1 || (!isVal && pass && type == 'attr' && $.attrFn[name]) ){ + return oldMethod(elem, name, value, pass, _argless); + } + + var nodeName = (elem.nodeName || '').toLowerCase(); + var desc = extendedProps[nodeName]; + var curType = (type == 'attr' && (value === false || value === null)) ? 'removeAttr' : type; + var propMethod; + var oldValMethod; + var ret; + + + if(!desc){ + desc = extendedProps['*']; + } + if(desc){ + desc = desc[name]; + } + + if(desc){ + propMethod = desc[curType]; + } + + if(propMethod){ + if(name == 'value'){ + oldValMethod = propMethod.isVal; + propMethod.isVal = isVal; + } + if(curType === 'removeAttr'){ + return propMethod.value.call(elem); + } else if(value === undefined){ + return (propMethod.get) ? + propMethod.get.call(elem) : + propMethod.value + ; + } else if(propMethod.set) { + if(type == 'attr' && value === true){ + value = name; + } + + ret = propMethod.set.call(elem, value); + } + if(name == 'value'){ + propMethod.isVal = oldValMethod; + } + } else { + ret = oldMethod(elem, name, value, pass, _argless); + } + if((value !== undefined || curType === 'removeAttr') && modifyProps[nodeName] && modifyProps[nodeName][name]){ + + var boolValue; + if(curType == 'removeAttr'){ + boolValue = false; + } else if(curType == 'prop'){ + boolValue = !!(value); + } else { + boolValue = true; + } + + modifyProps[nodeName][name].forEach(function(fn){ + if(!fn.only || (fn.only = 'prop' && type == 'prop') || (fn.only == 'attr' && type != 'prop')){ + fn.call(elem, value, boolValue, (isVal) ? 'val' : curType, type); + } + }); + } + return ret; + }; + + extendQ[type] = function(nodeName, prop, desc){ + + if(!extendedProps[nodeName]){ + extendedProps[nodeName] = {}; + } + if(!extendedProps[nodeName][prop]){ + extendedProps[nodeName][prop] = {}; + } + var oldDesc = extendedProps[nodeName][prop][type]; + var getSup = function(propType, descriptor, oDesc){ + if(descriptor && descriptor[propType]){ + return descriptor[propType]; + } + if(oDesc && oDesc[propType]){ + return oDesc[propType]; + } + if(type == 'prop' && prop == 'value'){ + return function(value){ + var elem = this; + return (desc.isVal) ? + singleVal(elem, prop, value, false, (arguments.length === 0)) : + olds[type](elem, prop, value) + ; + }; + } + if(type == 'prop' && propType == 'value' && desc.value.apply){ + return function(value){ + var sup = olds[type](this, prop); + if(sup && sup.apply){ + sup = sup.apply(this, arguments); + } + return sup; + }; + } + return function(value){ + return olds[type](this, prop, value); + }; + }; + extendedProps[nodeName][prop][type] = desc; + if(desc.value === undefined){ + if(!desc.set){ + desc.set = desc.writeable ? + getSup('set', desc, oldDesc) : + (webshims.cfg.useStrict && prop == 'prop') ? + function(){throw(prop +' is readonly on '+ nodeName);} : + $.noop + ; + } + if(!desc.get){ + desc.get = getSup('get', desc, oldDesc); + } + + } + + ['value', 'get', 'set'].forEach(function(descProp){ + if(desc[descProp]){ + desc['_sup'+descProp] = getSup(descProp, oldDesc); + } + }); + }; + + }); + + //see also: https://github.com/lojjic/PIE/issues/40 | https://prototype.lighthouseapp.com/projects/8886/tickets/1107-ie8-fatal-crash-when-prototypejs-is-loaded-with-rounded-cornershtc + var isExtendNativeSave = (!$.browser.msie || parseInt($.browser.version, 10) > 8); + var extendNativeValue = (function(){ + var UNKNOWN = webshims.getPrototypeOf(document.createElement('foobar')); + var has = Object.prototype.hasOwnProperty; + return function(nodeName, prop, desc){ + var elem = document.createElement(nodeName); + var elemProto = webshims.getPrototypeOf(elem); + if( isExtendNativeSave && elemProto && UNKNOWN !== elemProto && ( !elem[prop] || !has.call(elem, prop) ) ){ + var sup = elem[prop]; + desc._supvalue = function(){ + if(sup && sup.apply){ + return sup.apply(this, arguments); + } + return sup; + }; + elemProto[prop] = desc.value; + } else { + desc._supvalue = function(){ + var data = elementData(this, 'propValue'); + if(data && data[prop] && data[prop].apply){ + return data[prop].apply(this, arguments); + } + return data && data[prop]; + }; + initProp.extendValue(nodeName, prop, desc.value); + } + desc.value._supvalue = desc._supvalue; + }; + })(); + + var initProp = (function(){ + + var initProps = {}; + + webshims.addReady(function(context, contextElem){ + var nodeNameCache = {}; + var getElementsByName = function(name){ + if(!nodeNameCache[name]){ + nodeNameCache[name] = $(context.getElementsByTagName(name)); + if(contextElem[0] && $.nodeName(contextElem[0], name)){ + nodeNameCache[name] = nodeNameCache[name].add(contextElem); + } + } + }; + + + $.each(initProps, function(name, fns){ + getElementsByName(name); + if(!fns || !fns.forEach){ + webshims.warn('Error: with '+ name +'-property. methods: '+ fns); + return; + } + fns.forEach(function(fn){ + nodeNameCache[name].each(fn); + }); + }); + nodeNameCache = null; + }); + + var tempCache; + var emptyQ = $([]); + var createNodeNameInit = function(nodeName, fn){ + if(!initProps[nodeName]){ + initProps[nodeName] = [fn]; + } else { + initProps[nodeName].push(fn); + } + if($.isDOMReady){ + (tempCache || $( document.getElementsByTagName(nodeName) )).each(fn); + } + }; + + var elementExtends = {}; + return { + createTmpCache: function(nodeName){ + if($.isDOMReady){ + tempCache = tempCache || $( document.getElementsByTagName(nodeName) ); + } + return tempCache || emptyQ; + }, + flushTmpCache: function(){ + tempCache = null; + }, + content: function(nodeName, prop){ + createNodeNameInit(nodeName, function(){ + var val = $.attr(this, prop); + if(val != null){ + $.attr(this, prop, val); + } + }); + }, + createElement: function(nodeName, fn){ + createNodeNameInit(nodeName, fn); + }, + extendValue: function(nodeName, prop, value){ + createNodeNameInit(nodeName, function(){ + $(this).each(function(){ + var data = elementData(this, 'propValue', {}); + data[prop] = this[prop]; + this[prop] = value; + }); + }); + } + }; + })(); + + var createPropDefault = function(descs, removeType){ + if(descs.defaultValue === undefined){ + descs.defaultValue = ''; + } + if(!descs.removeAttr){ + descs.removeAttr = { + value: function(){ + descs[removeType || 'prop'].set.call(this, descs.defaultValue); + descs.removeAttr._supvalue.call(this); + } + }; + } + if(!descs.attr){ + descs.attr = {}; + } + }; + + $.extend(webshims, { + + getID: (function(){ + var ID = new Date().getTime(); + return function(elem){ + elem = $(elem); + var id = elem.attr('id'); + if(!id){ + ID++; + id = 'ID-'+ ID; + elem.attr('id', id); + } + return id; + }; + })(), + extendUNDEFProp: function(obj, props){ + $.each(props, function(name, prop){ + if( !(name in obj) ){ + obj[name] = prop; + } + }); + }, + //http://www.w3.org/TR/html5/common-dom-interfaces.html#reflect + createPropDefault: createPropDefault, + data: elementData, + moveToFirstEvent: function(elem, eventType, bindType){ + var events = ($._data(elem, 'events') || {})[eventType]; + var fn; + + if(events && events.length > 1){ + fn = events.pop(); + if(!bindType){ + bindType = 'bind'; + } + if(bindType == 'bind' && events.delegateCount){ + events.splice( events.delegateCount, 0, fn); + } else { + events.unshift( fn ); + } + + + } + elem = null; + }, + addShadowDom: (function(){ + var resizeTimer; + var lastHeight; + var lastWidth; + + var docObserve = { + init: false, + runs: 0, + test: function(){ + var height = docObserve.getHeight(); + var width = docObserve.getWidth(); + + if(height != docObserve.height || width != docObserve.width){ + docObserve.height = height; + docObserve.width = width; + docObserve.handler({type: 'docresize'}); + docObserve.runs++; + if(docObserve.runs < 9){ + setTimeout(docObserve.test, 90); + } + } else { + docObserve.runs = 0; + } + }, + handler: function(e){ + clearTimeout(resizeTimer); + resizeTimer = setTimeout(function(){ + if(e.type == 'resize'){ + var width = $(window).width(); + var height = $(window).width(); + if(height == lastHeight && width == lastWidth){ + return; + } + lastHeight = height; + lastWidth = width; + + docObserve.height = docObserve.getHeight(); + docObserve.width = docObserve.getWidth(); + + } + $.event.trigger('updateshadowdom'); + }, (e.type == 'resize') ? 50 : 9); + }, + _create: function(){ + $.each({ Height: "getHeight", Width: "getWidth" }, function(name, type){ + var body = document.body; + var doc = document.documentElement; + docObserve[type] = function(){ + return Math.max( + body[ "scroll" + name ], doc[ "scroll" + name ], + body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + }; + }); + }, + start: function(){ + if(!this.init && document.body){ + this.init = true; + this._create(); + this.height = docObserve.getHeight(); + this.width = docObserve.getWidth(); + setInterval(this.test, 600); + $(this.test); + webshims.ready('WINDOWLOAD', this.test); + $(window).bind('resize', this.handler); + (function(){ + var oldAnimate = $.fn.animate; + var animationTimer; + + $.fn.animate = function(){ + clearTimeout(animationTimer); + animationTimer = setTimeout(function(){ + docObserve.test(); + }, 99); + + return oldAnimate.apply(this, arguments); + }; + })(); + } + } + }; + + + $.event.customEvent.updateshadowdom = true; + webshims.docObserve = function(){ + webshims.ready('DOM', function(){ + docObserve.start(); + }); + }; + return function(nativeElem, shadowElem, opts){ + opts = opts || {}; + if(nativeElem.jquery){ + nativeElem = nativeElem[0]; + } + if(shadowElem.jquery){ + shadowElem = shadowElem[0]; + } + var nativeData = $.data(nativeElem, dataID) || $.data(nativeElem, dataID, {}); + var shadowData = $.data(shadowElem, dataID) || $.data(shadowElem, dataID, {}); + var shadowFocusElementData = {}; + if(!opts.shadowFocusElement){ + opts.shadowFocusElement = shadowElem; + } else if(opts.shadowFocusElement){ + if(opts.shadowFocusElement.jquery){ + opts.shadowFocusElement = opts.shadowFocusElement[0]; + } + shadowFocusElementData = $.data(opts.shadowFocusElement, dataID) || $.data(opts.shadowFocusElement, dataID, shadowFocusElementData); + } + + nativeData.hasShadow = shadowElem; + shadowFocusElementData.nativeElement = shadowData.nativeElement = nativeElem; + shadowFocusElementData.shadowData = shadowData.shadowData = nativeData.shadowData = { + nativeElement: nativeElem, + shadowElement: shadowElem, + shadowFocusElement: opts.shadowFocusElement + }; + if(opts.shadowChilds){ + opts.shadowChilds.each(function(){ + elementData(this, 'shadowData', shadowData.shadowData); + }); + } + + if(opts.data){ + shadowFocusElementData.shadowData.data = shadowData.shadowData.data = nativeData.shadowData.data = opts.data; + } + opts = null; + webshims.docObserve(); + }; + })(), + propTypes: { + standard: function(descs, name){ + createPropDefault(descs); + if(descs.prop){return;} + descs.prop = { + set: function(val){ + descs.attr.set.call(this, ''+val); + }, + get: function(){ + return descs.attr.get.call(this) || descs.defaultValue; + } + }; + + }, + "boolean": function(descs, name){ + + createPropDefault(descs); + if(descs.prop){return;} + descs.prop = { + set: function(val){ + if(val){ + descs.attr.set.call(this, ""); + } else { + descs.removeAttr.value.call(this); + } + }, + get: function(){ + return descs.attr.get.call(this) != null; + } + }; + }, + "src": (function(){ + var anchor = document.createElement('a'); + anchor.style.display = "none"; + return function(descs, name){ + + createPropDefault(descs); + if(descs.prop){return;} + descs.prop = { + set: function(val){ + descs.attr.set.call(this, val); + }, + get: function(){ + var href = this.getAttribute(name); + var ret; + if(href == null){return '';} + + anchor.setAttribute('href', href+'' ); + + if(!$.support.hrefNormalized){ + try { + $(anchor).insertAfter(this); + ret = anchor.getAttribute('href', 4); + } catch(er){ + ret = anchor.getAttribute('href', 4); + } + $(anchor).detach(); + } + return ret || anchor.href; + } + }; + }; + })(), + enumarated: function(descs, name){ + + createPropDefault(descs); + if(descs.prop){return;} + descs.prop = { + set: function(val){ + descs.attr.set.call(this, val); + }, + get: function(){ + var val = (descs.attr.get.call(this) || '').toLowerCase(); + if(!val || descs.limitedTo.indexOf(val) == -1){ + val = descs.defaultValue; + } + return val; + } + }; + } + +// ,unsignedLong: $.noop +// ,"doubble": $.noop +// ,"long": $.noop +// ,tokenlist: $.noop +// ,settableTokenlist: $.noop + }, + reflectProperties: function(nodeNames, props){ + if(typeof props == 'string'){ + props = props.split(listReg); + } + props.forEach(function(prop){ + webshims.defineNodeNamesProperty(nodeNames, prop, { + prop: { + set: function(val){ + $.attr(this, prop, val); + }, + get: function(){ + return $.attr(this, prop) || ''; + } + } + }); + }); + }, + defineNodeNameProperty: function(nodeName, prop, descs){ + havePolyfill[prop] = true; + + if(descs.reflect){ + webshims.propTypes[descs.propType || 'standard'](descs, prop); + } + + ['prop', 'attr', 'removeAttr'].forEach(function(type){ + var desc = descs[type]; + if(desc){ + if(type === 'prop'){ + desc = $.extend({writeable: true}, desc); + } else { + desc = $.extend({}, desc, {writeable: true}); + } + + extendQ[type](nodeName, prop, desc); + if(nodeName != '*' && webshims.cfg.extendNative && type == 'prop' && desc.value && $.isFunction(desc.value)){ + extendNativeValue(nodeName, prop, desc); + } + descs[type] = desc; + } + }); + if(descs.initAttr){ + initProp.content(nodeName, prop); + } + return descs; + }, + + defineNodeNameProperties: function(name, descs, propType, _noTmpCache){ + var olddesc; + for(var prop in descs){ + if(!_noTmpCache && descs[prop].initAttr){ + initProp.createTmpCache(name); + } + if(propType){ + if(descs[prop][propType]){ + //webshims.log('override: '+ name +'['+prop +'] for '+ propType); + } else { + descs[prop][propType] = {}; + ['value', 'set', 'get'].forEach(function(copyProp){ + if(copyProp in descs[prop]){ + descs[prop][propType][copyProp] = descs[prop][copyProp]; + delete descs[prop][copyProp]; + } + }); + } + } + descs[prop] = webshims.defineNodeNameProperty(name, prop, descs[prop]); + } + if(!_noTmpCache){ + initProp.flushTmpCache(); + } + return descs; + }, + + createElement: function(nodeName, create, descs){ + var ret; + if($.isFunction(create)){ + create = { + after: create + }; + } + initProp.createTmpCache(nodeName); + if(create.before){ + initProp.createElement(nodeName, create.before); + } + if(descs){ + ret = webshims.defineNodeNameProperties(nodeName, descs, false, true); + } + if(create.after){ + initProp.createElement(nodeName, create.after); + } + initProp.flushTmpCache(); + return ret; + }, + onNodeNamesPropertyModify: function(nodeNames, props, desc, only){ + if(typeof nodeNames == 'string'){ + nodeNames = nodeNames.split(listReg); + } + if($.isFunction(desc)){ + desc = {set: desc}; + } + + nodeNames.forEach(function(name){ + if(!modifyProps[name]){ + modifyProps[name] = {}; + } + if(typeof props == 'string'){ + props = props.split(listReg); + } + if(desc.initAttr){ + initProp.createTmpCache(name); + } + props.forEach(function(prop){ + if(!modifyProps[name][prop]){ + modifyProps[name][prop] = []; + havePolyfill[prop] = true; + } + if(desc.set){ + if(only){ + desc.set.only = only; + } + modifyProps[name][prop].push(desc.set); + } + + if(desc.initAttr){ + initProp.content(name, prop); + } + }); + initProp.flushTmpCache(); + + }); + }, + defineNodeNamesBooleanProperty: function(elementNames, prop, descs){ + if(!descs){ + descs = {}; + } + if($.isFunction(descs)){ + descs.set = descs; + } + webshims.defineNodeNamesProperty(elementNames, prop, { + attr: { + set: function(val){ + this.setAttribute(prop, val); + if(descs.set){ + descs.set.call(this, true); + } + }, + get: function(){ + var ret = this.getAttribute(prop); + return (ret == null) ? undefined : prop; + } + }, + removeAttr: { + value: function(){ + this.removeAttribute(prop); + if(descs.set){ + descs.set.call(this, false); + } + } + }, + reflect: true, + propType: 'boolean', + initAttr: descs.initAttr || false + }); + }, + contentAttr: function(elem, name, val){ + if(!elem.nodeName){return;} + var attr; + if(val === undefined){ + attr = (elem.attributes[name] || {}); + val = attr.specified ? attr.value : null; + return (val == null) ? undefined : val; + } + + if(typeof val == 'boolean'){ + if(!val){ + elem.removeAttribute(name); + } else { + elem.setAttribute(name, name); + } + } else { + elem.setAttribute(name, val); + } + }, + +// set current Lang: +// - webshims.activeLang(lang:string); +// get current lang +// - webshims.activeLang(); +// get current lang +// webshims.activeLang({ +// register: moduleName:string, +// callback: callback:function +// }); +// get/set including removeLang +// - webshims.activeLang({ +// module: moduleName:string, +// callback: callback:function, +// langObj: languageObj:array/object +// }); + activeLang: (function(){ + var callbacks = []; + var registeredCallbacks = {}; + var currentLang; + var shortLang; + var notLocal = /:\/\/|^\.*\//; + var loadRemoteLang = function(data, lang, options){ + var langSrc; + if(lang && options && $.inArray(lang, options.availabeLangs || []) !== -1){ + data.loading = true; + langSrc = options.langSrc; + if(!notLocal.test(langSrc)){ + langSrc = webshims.cfg.basePath+langSrc; + } + webshims.loader.loadScript(langSrc+lang+'.js', function(){ + if(data.langObj[lang]){ + data.loading = false; + callLang(data, true); + } else { + $(function(){ + if(data.langObj[lang]){ + callLang(data, true); + } + data.loading = false; + }); + } + }); + return true; + } + return false; + }; + var callRegister = function(module){ + if(registeredCallbacks[module]){ + registeredCallbacks[module].forEach(function(data){ + data.callback(); + }); + } + }; + var callLang = function(data, _noLoop){ + if(data.activeLang != currentLang && data.activeLang !== shortLang){ + var options = modules[data.module].options; + if( data.langObj[currentLang] || (shortLang && data.langObj[shortLang]) ){ + data.activeLang = currentLang; + data.callback(data.langObj[currentLang] || data.langObj[shortLang], currentLang); + callRegister(data.module); + } else if( !_noLoop && + !loadRemoteLang(data, currentLang, options) && + !loadRemoteLang(data, shortLang, options) && + data.langObj[''] && data.activeLang !== '' ) { + data.activeLang = ''; + data.callback(data.langObj[''], currentLang); + callRegister(data.module); + } + } + }; + + + var activeLang = function(lang){ + + if(typeof lang == 'string' && lang !== currentLang){ + currentLang = lang; + shortLang = currentLang.split('-')[0]; + if(currentLang == shortLang){ + shortLang = false; + } + $.each(callbacks, function(i, data){ + callLang(data); + }); + } else if(typeof lang == 'object'){ + + if(lang.register){ + if(!registeredCallbacks[lang.register]){ + registeredCallbacks[lang.register] = []; + } + registeredCallbacks[lang.register].push(lang); + lang.callback(); + } else { + if(!lang.activeLang){ + lang.activeLang = ''; + } + callbacks.push(lang); + callLang(lang); + } + } + return currentLang; + }; + + return activeLang; + })() + }); + + $.each({ + defineNodeNamesProperty: 'defineNodeNameProperty', + defineNodeNamesProperties: 'defineNodeNameProperties', + createElements: 'createElement' + }, function(name, baseMethod){ + webshims[name] = function(names, a, b, c){ + if(typeof names == 'string'){ + names = names.split(listReg); + } + var retDesc = {}; + names.forEach(function(nodeName){ + retDesc[nodeName] = webshims[baseMethod](nodeName, a, b, c); + }); + return retDesc; + }; + }); + + webshims.isReady('webshimLocalization', true); +}); +//html5a11y +(function($, document){ + var browserVersion = $.webshims.browserVersion; + if($.browser.mozilla && browserVersion > 5){return;} + if (!$.browser.msie || (browserVersion < 12 && browserVersion > 7)) { + var elemMappings = { + article: "article", + aside: "complementary", + section: "region", + nav: "navigation", + address: "contentinfo" + }; + var addRole = function(elem, role){ + var hasRole = elem.getAttribute('role'); + if (!hasRole) { + elem.setAttribute('role', role); + } + }; + + $.webshims.addReady(function(context, contextElem){ + $.each(elemMappings, function(name, role){ + var elems = $(name, context).add(contextElem.filter(name)); + for (var i = 0, len = elems.length; i < len; i++) { + addRole(elems[i], role); + } + }); + if (context === document) { + var header = document.getElementsByTagName('header')[0]; + var footers = document.getElementsByTagName('footer'); + var footerLen = footers.length; + if (header && !$(header).closest('section, article')[0]) { + addRole(header, 'banner'); + } + if (!footerLen) { + return; + } + var footer = footers[footerLen - 1]; + if (!$(footer).closest('section, article')[0]) { + addRole(footer, 'contentinfo'); + } + } + }); + } +})(jQuery, document);