(function (factory) { if(window.jQuery){ factory(jQuery); factory = jQuery.noop; } if (typeof define === 'function' && define.amd && define.amd.jQuery) { define('polyfiller', ['jquery'], factory); } }(function($){ "use strict"; var DOMSUPPORT = 'dom-support'; var jScripts = $(document.scripts || 'script'); var special = $.event.special; var emptyJ = $([]); var Modernizr = window.Modernizr; var asyncWebshims = window.asyncWebshims; var addTest = Modernizr.addTest; var Object = window.Object; var html5 = window.html5 || {}; Modernizr.advancedObjectProperties = Modernizr.objectAccessor = Modernizr.ES5 = !!('create' in Object && 'seal' in Object); if(Modernizr.ES5 && !('toJSON' in Date.prototype)){ Modernizr.ES5 = false; } var webshims = { version: '1.11.3', cfg: { //addCacheBuster: false, waitReady: true, // extendNative: false, loadStyles: true, disableShivMethods: true, wspopover: {appendTo: 'auto', hideOnBlur: true}, basePath: (function(){ var script = jScripts.filter('[src*="polyfiller.js"]'); var path; script = script[0] || script.end()[script.end().length - 1]; path = ( ( !('hrefNormalized' in $.support) || $.support.hrefNormalized ) ? script.src : script.getAttribute("src", 4) ).split('?')[0]; path = path.slice(0, path.lastIndexOf("/") + 1) + 'shims/'; return path; })() }, bugs: {}, /* * some data */ modules: {}, features: {}, featureList: [], setOptions: function(name, opts){ if (typeof name == 'string' && opts !== undefined) { webCFG[name] = (!$.isPlainObject(opts)) ? opts : $.extend(true, webCFG[name] || {}, opts); } else if (typeof name == 'object') { $.extend(true, webCFG, name); } }, addPolyfill: function(name, cfg){ cfg = cfg || {}; var feature = cfg.f || name; if (!webshimsFeatures[feature]) { webshimsFeatures[feature] = []; webshims.featureList.push(feature); webCFG[feature] = {}; } if(!webshimsFeatures[feature].failedM && cfg.nM){ $.each(cfg.nM.split(' '), function(i, name){ if(!(name in Modernizr)){ webshimsFeatures[feature].failedM = name; return false; } }); } if(webshimsFeatures[feature].failedM){ cfg.test = function(){ webshims.error('webshims needs Modernizr.'+webshimsFeatures[feature].failedM + ' to implement feature: '+ feature); return true; }; } webshimsFeatures[feature].push(name); cfg.options = $.extend(webCFG[feature], cfg.options); addModule(name, cfg); if (cfg.methodNames) { $.each(cfg.methodNames, function(i, methodName){ webshims.addMethodName(methodName); }); } }, polyfill: (function(){ var loaded = {}; return function(features){ if(!features){ features = webshims.featureList; webshims.info('loading all features without specifing might be bad for performance'); } if (typeof features == 'string') { features = features.split(' '); } for(var i = 0; i < features.length; i++){ if(loaded[features[i]]){ webshims.error(features[i] +' already loaded, you might want to use updatePolyfill instead? see: bit.ly/12BtXX3'); } loaded[features[i]] = true; } return webshims._polyfill(features); }; })(), _polyfill: (function(){ var firstPolyfillCall = function(features){ var addClass = []; var onReadyEvts = features; var timer; if(webCFG.disableShivMethods){ html5.shivMethods = false; } var removeLoader = function(){ $('html').removeClass('loading-polyfills long-loading-polyfills'); $(window).unbind('.lP'); clearTimeout(timer); }; addClass.push('loading-polyfills'); timer = setTimeout(function(){ $('html').addClass('long-loading-polyfills'); timer = setTimeout(removeLoader, 300); }, 300); $(window).on('load.lP error.lP', removeLoader); if (webCFG.waitReady && $.isReady) { webshims.warn('Call webshims.polyfill before DOM-Ready or set waitReady to false.'); } onReady(features, removeLoader); if (addClass[0]) { $('html').addClass(addClass.join(' ')); } if(webCFG.loadStyles){ loader.loadCSS('styles/shim.css'); } //remove function firstPolyfillCall = $.noop; }; var loadedFormBase; return function(features){ var toLoadFeatures = []; if(!loadedFormBase){ loadedFormBase = $.inArray('forms', features) !== -1; if(!loadedFormBase && $.inArray('forms-ext', features) !== -1){ features.push('forms'); loadedFormBase = true; } } if (webCFG.waitReady) { $.readyWait++; onReady(features, function(){ $.ready(true); }); } $.each(features, function(i, feature){ if(!webshimsFeatures[feature]){ webshims.error("could not find webshims-feature (aborted): "+ feature); isReady(feature, true); return; } if (feature !== webshimsFeatures[feature][0]) { onReady(webshimsFeatures[feature], function(){ isReady(feature, true); }); } toLoadFeatures = toLoadFeatures.concat(webshimsFeatures[feature]); }); firstPolyfillCall(features); loadList(toLoadFeatures); }; })(), /* * handle ready modules */ reTest: (function(){ var resList; var reTest = function(i, name){ var module = modules[name]; var readyName = name+'Ready'; var feature; if(module && !module.loaded && !( (module.test && $.isFunction(module.test) ) ? module.test([]) : module.test )){ if(special[readyName]){ delete special[readyName]; } feature = webshimsFeatures[module.f]; resList.push(name); } }; return function(moduleNames){ if(typeof moduleNames == 'string'){ moduleNames = moduleNames.split(' '); } resList = []; $.each(moduleNames, reTest); loadList(resList); }; })(), isReady: function(name, _set){ name = name + 'Ready'; if (_set) { if (special[name] && special[name].add) { return true; } special[name] = $.extend(special[name] || {}, { add: function(details){ details.handler.call(this, name); } }); $(document).triggerHandler(name); } return !!(special[name] && special[name].add) || false; }, ready: function(events, fn /*, _created*/){ var _created = arguments[2]; var evt = events; if (typeof events == 'string') { events = events.split(' '); } if (!_created) { events = $.map($.grep(events, function(evt){ return !isReady(evt); }), function(evt){ return evt + 'Ready'; }); } if (!events.length) { fn($, webshims, window, document); return; } var readyEv = events.shift(), readyFn = function(){ onReady(events, fn, true); }; $(document).one(readyEv, readyFn); }, /* * basic DOM-/jQuery-Helpers */ capturingEvents: function(names, _maybePrevented){ if (!document.addEventListener) { return; } if (typeof names == 'string') { names = [names]; } $.each(names, function(i, name){ var handler = function(e){ e = $.event.fix(e); if (_maybePrevented && webshims.capturingEventPrevented) { webshims.capturingEventPrevented(e); } return $.event.dispatch.call(this, e); }; special[name] = special[name] || {}; if (special[name].setup || special[name].teardown) { return; } $.extend(special[name], { setup: function(){ this.addEventListener(name, handler, true); }, teardown: function(){ this.removeEventListener(name, handler, true); } }); }); }, register: function(name, fn){ var module = modules[name]; if (!module) { webshims.error("can't find module: " + name); return; } if (module.noAutoCallback) { var ready = function(){ fn($, webshims, window, document, undefined, module.options); isReady(name, true); }; if (module.d && module.d.length) { onReady(module.d, ready); } else { ready(); } } }, c: {}, /* * loader */ loader: { addModule: function(name, ext){ modules[name] = ext; ext.name = ext.name || name; if(!ext.c){ ext.c = []; } $.each(ext.c, function(i, comboname){ if(!webshims.c[comboname]){ webshims.c[comboname] = []; } webshims.c[comboname].push(name); }); }, loadList: (function(){ var loadedModules = []; var loadScript = function(src, names){ if (typeof names == 'string') { names = [names]; } $.merge(loadedModules, names); loader.loadScript(src, false, names); }; var noNeedToLoad = function(name, list){ if (isReady(name) || $.inArray(name, loadedModules) != -1) { return true; } var module = modules[name]; var cfg = webCFG[module.f || name] || {}; var supported; if (module) { supported = (module.test && $.isFunction(module.test)) ? module.test(list) : module.test; if (supported) { isReady(name, true); return true; } else { return false; } } return true; }; var setDependencies = function(module, list){ if (module.d && module.d.length) { var addDependency = function(i, dependency){ if (!noNeedToLoad(dependency, list) && $.inArray(dependency, list) == -1) { list.push(dependency); } }; $.each(module.d, function(i, dependency){ if (modules[dependency]) { addDependency(i, dependency); } else if (webshimsFeatures[dependency]) { $.each(webshimsFeatures[dependency], addDependency); onReady(webshimsFeatures[dependency], function(){ isReady(dependency, true); }); } }); if (!module.noAutoCallback) { module.noAutoCallback = true; } } }; return function(list, combo){ var module; var loadCombos = []; var i; var len; var foundCombo; var loadCombo = function(j, combo){ foundCombo = combo; $.each(webshims.c[combo], function(i, moduleName){ if($.inArray(moduleName, loadCombos) == -1 || $.inArray(moduleName, loadedModules) != -1){ foundCombo = false; return false; } }); if(foundCombo){ loadScript('combos/'+foundCombo, webshims.c[foundCombo]); return false; } }; //length of list is dynamically for (i = 0; i < list.length; i++) { module = modules[list[i]]; if (!module || noNeedToLoad(module.name, list)) { if (!module) { webshims.warn('could not find: ' + list[i]); } continue; } if (module.css) { loader.loadCSS(module.css); } if (module.loadInit) { module.loadInit(); } module.loaded = true; setDependencies(module, list); loadCombos.push(module.name); } for(i = 0, len = loadCombos.length; i < len; i++){ foundCombo = false; module = loadCombos[i]; if($.inArray(module, loadedModules) == -1){ if(webshims.debug != 'noCombo'){ $.each(modules[module].c, loadCombo); } if(!foundCombo){ loadScript(modules[module].src || module, module); } } } }; })(), makePath: function(src){ if (src.indexOf('//') != -1 || src.indexOf('/') === 0) { return src; } if (src.indexOf('.') == -1) { src += '.js'; } if (webCFG.addCacheBuster) { src += webCFG.addCacheBuster; } return webCFG.basePath + src; }, loadCSS: (function(){ var parent, loadedSrcs = []; return function(src){ src = this.makePath(src); if ($.inArray(src, loadedSrcs) != -1) { return; } parent = parent || $('link, style')[0] || $('script')[0]; loadedSrcs.push(src); $('').insertBefore(parent).attr({ href: src }); }; })(), loadScript: (function(){ var loadedSrcs = []; var scriptLoader; return function(src, callback, name){ src = loader.makePath(src); if ($.inArray(src, loadedSrcs) != -1) {return;} var complete = function(){ complete = null; if (callback) { callback(); } if (name) { if (typeof name == 'string') { name = name.split(' '); } $.each(name, function(i, name){ if (!modules[name]) { return; } if (modules[name].afterLoad) { modules[name].afterLoad(); } isReady(!modules[name].noAutoCallback ? name : name + 'FileLoaded', true); }); } }; loadedSrcs.push(src); if(window.require && window.define && window.define.amd){ require([src], complete); } else if (window.sssl) { sssl(src, complete); } else if (window.yepnope) { yepnope.injectJs(src, complete); } else if (window.steal) { steal(src).then(complete); } }; })() } }; /* * shortcuts */ $.webshims = webshims; var webCFG = webshims.cfg; var webshimsFeatures = webshims.features; var isReady = webshims.isReady; var onReady = webshims.ready; var addPolyfill = webshims.addPolyfill; var modules = webshims.modules; var loader = webshims.loader; var loadList = loader.loadList; var addModule = loader.addModule; var bugs = webshims.bugs; var removeCombos = []; var importantLogs = { warn: 1, error: 1 }; webshims.addMethodName = function(name){ name = name.split(':'); var prop = name[1]; if (name.length == 1) { prop = name[0]; name = name[0]; } else { name = name[0]; } $.fn[name] = function(){ return this.callProp(prop, arguments); }; }; $.fn.callProp = function(prop, args){ var ret; if(!args){ args = []; } this.each(function(){ var fn = $.prop(this, prop); if (fn && fn.apply) { ret = fn.apply(this, args); if (ret !== undefined) { return false; } } else { webshims.warn(prop+ " is not a method of "+ this); } }); return (ret !== undefined) ? ret : this; }; //activeLang will be overridden // set current Lang: // - webshims.activeLang(lang:string); // get current lang // - webshims.activeLang(); // - webshims.activeLang({ // module: moduleName:string, // callback: callback:function, // langObj: languageObj:array/object // }); webshims.activeLang = (function(){ var curLang = navigator.browserLanguage || navigator.language || ''; onReady('webshimLocalization', function(){ webshims.activeLang(curLang); }); return function(lang){ if(lang){ if (typeof lang == 'string' ) { curLang = lang; } else if(typeof lang == 'object'){ var args = arguments; var that = this; onReady('webshimLocalization', function(){ webshims.activeLang.apply(that, args); }); } } return curLang; }; })(); webshims.errorLog = []; $.each(['log', 'error', 'warn', 'info'], function(i, fn){ webshims[fn] = function(message){ if( (importantLogs[fn] && webshims.debug !== false) || webshims.debug){ webshims.errorLog.push(message); if(window.console && console.log){ console[(console[fn]) ? fn : 'log'](message); } } }; }); //Overwrite DOM-Ready and implement a new ready-method (function(){ $.isDOMReady = $.isReady; var onReady = function(){ $.isDOMReady = true; isReady('DOM', true); setTimeout(function(){ isReady('WINDOWLOAD', true); }, 9999); }; if(!$.isDOMReady){ var $Ready = $.ready; $.ready = function(unwait){ if(unwait !== true && document.body){ onReady(); $.ready = $Ready; } return $Ready.apply(this, arguments); }; $.ready.promise = $Ready.promise; } else { onReady(); } $(onReady); $(window).load(function(){ onReady(); setTimeout(function(){ isReady('WINDOWLOAD', true); }, 9); }); })(); /* * jQuery-plugins for triggering dom updates can be also very usefull in conjunction with non-HTML5 DOM-Changes (AJAX) * Example: * $.webshims.addReady(function(context, insertedElement){ * $('div.tabs', context).add(insertedElement.filter('div.tabs')).tabs(); * }); * * $.ajax({ * success: function(html){ * $('#main').htmlPolyfill(html); * } * }); */ (function(){ var readyFns = []; var eachTrigger = function(){ if(this.nodeType == 1){ webshims.triggerDomUpdate(this); } }; $.extend(webshims, { addReady: function(fn){ var readyFn = function(context, elem){ webshims.ready('DOM', function(){fn(context, elem);}); }; readyFns.push(readyFn); readyFn(document, emptyJ); }, triggerDomUpdate: function(context){ if(!context || !context.nodeType){ if(context && context.jquery){ context.each(function(){ webshims.triggerDomUpdate(this); }); } return; } var type = context.nodeType; if(type != 1 && type != 9){return;} var elem = (context !== document) ? $(context) : emptyJ; $.each(readyFns, function(i, fn){ fn(context, elem); }); } }); $.fn.htmlPolyfill = function(a){ var ret = $.fn.html.call(this, a); if(ret === this && $.isDOMReady){ this.each(eachTrigger); } return ret; }; $.fn.jProp = function(){ return $($.fn.prop.apply(this, arguments) || []); }; $.each(['after', 'before', 'append', 'prepend', 'replaceWith'], function(i, name){ $.fn[name+'Polyfill'] = function(a){ a = $(a); $.fn[name].call(this, a); if($.isDOMReady){ a.each(eachTrigger); } return this; }; }); $.each(['insertAfter', 'insertBefore', 'appendTo', 'prependTo', 'replaceAll'], function(i, name){ $.fn[name.replace(/[A-Z]/, function(c){return "Polyfill"+c;})] = function(){ $.fn[name].apply(this, arguments); if($.isDOMReady){ webshims.triggerDomUpdate(this); } return this; }; }); $.fn.updatePolyfill = function(){ if($.isDOMReady){ webshims.triggerDomUpdate(this); } return this; }; $.each(['getNativeElement', 'getShadowElement', 'getShadowFocusElement'], function(i, name){ $.fn[name] = function(){ return this.pushStack(this); }; }); })(); //this might be extended by ES5 shim feature (function(){ var defineProperty = 'defineProperty'; var has = Object.prototype.hasOwnProperty; var descProps = ['configurable', 'enumerable', 'writable']; var extendUndefined = function(prop){ for(var i = 0; i < 3; i++){ if(prop[descProps[i]] === undefined && (descProps[i] !== 'writable' || prop.value !== undefined)){ prop[descProps[i]] = true; } } }; var extendProps = function(props){ if(props){ for(var i in props){ if(has.call(props, i)){ extendUndefined(props[i]); } } } }; if(Object.create){ webshims.objectCreate = function(proto, props, opts){ extendProps(props); var o = Object.create(proto, props); if(opts){ o.options = $.extend(true, {}, o.options || {}, opts); opts = o.options; } if(o._create && $.isFunction(o._create)){ o._create(opts); } return o; }; } if(Object[defineProperty]){ webshims[defineProperty] = function(obj, prop, desc){ extendUndefined(desc); return Object[defineProperty](obj, prop, desc); }; } if(Object.defineProperties){ webshims.defineProperties = function(obj, props){ extendProps(props); return Object.defineProperties(obj, props); }; } webshims.getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; webshims.getPrototypeOf = Object.getPrototypeOf; })(); /* * Start Features */ /* general modules */ /* change path $.webshims.modules[moduleName].src */ addModule('swfmini', { test: function(){ if(window.swfobject && !window.swfmini){ window.swfmini = window.swfobject; } return ('swfmini' in window); }, c: [16, 7, 2, 8, 1, 12, 19, 25, 23, 27] }); modules.swfmini.test(); /* * polyfill-Modules */ // webshims lib uses a of http://github.com/kriskowal/es5-shim/ to implement addPolyfill('es5', { test: !!(Modernizr.ES5 && Function.prototype.bind), c: [14, 18, 19, 25, 20] }); addPolyfill('dom-extend', { f: DOMSUPPORT, noAutoCallback: true, d: ['es5'], c: [16, 7, 2, 15, 30, 3, 8, 4, 9, 10, 14, 25, 19, 20, 26, 31] }); //json-storage // // //