vendor/assets/javascripts/webshims/shims/combos/23.js in webshims-rails-0.4.7 vs vendor/assets/javascripts/webshims/shims/combos/23.js in webshims-rails-1.10.3

- old
+ new

@@ -1,1738 +1,503 @@ -if(!Modernizr.formvalidation || jQuery.webshims.bugs.bustedValidity){ -jQuery.webshims.register('form-shim-extend', function($, webshims, window, document){ -"use strict"; -webshims.inputTypes = webshims.inputTypes || {}; -//some helper-functions -var cfg = webshims.cfg.forms; -var isSubmit; +/*! SWFMini - a SWFObject 2.2 cut down version for webshims + * + * based on SWFObject v2.2 <http://code.google.com/p/swfobject/> + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> +*/ -var isNumber = function(string){ - return (typeof string == 'number' || (string && string == string * 1)); - }, - typeModels = webshims.inputTypes, - checkTypes = { - radio: 1, - checkbox: 1 - }, - getType = function(elem){ - return (elem.getAttribute('type') || elem.type || '').toLowerCase(); - } -; - -//API to add new input types -webshims.addInputType = function(type, obj){ - typeModels[type] = obj; -}; - -//contsrain-validation-api -var validityPrototype = { - customError: false, - - typeMismatch: false, - rangeUnderflow: false, - rangeOverflow: false, - stepMismatch: false, - tooLong: false, - patternMismatch: false, - valueMissing: false, +var swfmini = function() { - valid: true -}; - -var isPlaceholderOptionSelected = function(select){ - if(select.type == 'select-one' && select.size < 2){ - var option = $('> option:first-child', select); - return !!option.prop('selected'); - } - return false; -}; - -var validityRules = { - valueMissing: function(input, val, cache){ - if(!input.prop('required')){return false;} - var ret = false; - if(!('type' in cache)){ - cache.type = getType(input[0]); + var UNDEF = "undefined", + OBJECT = "object", + webshims = jQuery.webshims, + SHOCKWAVE_FLASH = "Shockwave Flash", + SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", + FLASH_MIME_TYPE = "application/x-shockwave-flash", + + win = window, + doc = document, + nav = navigator, + + plugin = false, + domLoadFnArr = [main], + objIdArr = [], + listenersArr = [], + storedAltContent, + storedAltContentId, + storedCallbackFn, + storedCallbackObj, + isDomLoaded = false, + dynamicStylesheet, + dynamicStylesheetMedia, + autoHideShow = true, + + /* Centralized function for browser feature detection + - User agent string detection is only used when no good alternative is possible + - Is executed directly for optimal performance + */ + ua = function() { + var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, + u = nav.userAgent.toLowerCase(), + p = nav.platform.toLowerCase(), + windows = p ? /win/.test(p) : /win/.test(u), + mac = p ? /mac/.test(p) : /mac/.test(u), + webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit + ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html + playerVersion = [0,0,0], + d = null; + if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { + d = nav.plugins[SHOCKWAVE_FLASH].description; + if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+ + plugin = true; + ie = false; // cascaded feature detection for Internet Explorer + d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); + playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); + playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); + playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; } - if(cache.nodeName == 'select'){ - ret = (!val && (input[0].selectedIndex < 0 || isPlaceholderOptionSelected(input[0]) )); - } else if(checkTypes[cache.type]){ - ret = (cache.type == 'checkbox') ? !input.is(':checked') : !webshims.modules["form-core"].getGroupElements(input).filter(':checked')[0]; - } else { - ret = !(val); - } - return ret; - }, - tooLong: function(){ - return false; - }, - typeMismatch: function (input, val, cache){ - if(val === '' || cache.nodeName == 'select'){return false;} - var ret = false; - if(!('type' in cache)){ - cache.type = getType(input[0]); - } - - if(typeModels[cache.type] && typeModels[cache.type].mismatch){ - ret = typeModels[cache.type].mismatch(val, input); - } else if('validity' in input[0]){ - ret = input[0].validity.typeMismatch; - } - return ret; - }, - patternMismatch: function(input, val, cache) { - if(val === '' || cache.nodeName == 'select'){return false;} - var pattern = input.attr('pattern'); - if(!pattern){return false;} + } + else if (typeof win.ActiveXObject != UNDEF) { try { - pattern = new RegExp('^(?:' + pattern + ')$'); - } catch(er){ - webshims.error('invalid pattern value: "'+ pattern +'" | '+ er); - pattern = false; + var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); + if (a) { // a will return null when ActiveX is disabled + d = a.GetVariable("$version"); + if (d) { + ie = true; // cascaded feature detection for Internet Explorer + d = d.split(" ")[1].split(","); + playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } + } } - if(!pattern){return false;} - return !(pattern.test(val)); + catch(e) {} } - } -; - -webshims.addValidityRule = function(type, fn){ - validityRules[type] = fn; -}; - -$.event.special.invalid = { - add: function(){ - $.event.special.invalid.setup.call(this.form || this); - }, - setup: function(){ - var form = this.form || this; - if( $.data(form, 'invalidEventShim') ){ - form = null; - return; + return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; + }(); + + + function callDomLoadFunctions() { + if (isDomLoaded) { return; } + try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early + var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span")); + t.parentNode.removeChild(t); } - $(form) - .data('invalidEventShim', true) - .on('submit', $.event.special.invalid.handler) - ; - webshims.moveToFirstEvent(form, 'submit'); - if(webshims.bugs.bustedValidity && $.nodeName(form, 'form')){ - (function(){ - var noValidate = form.getAttribute('novalidate'); - form.setAttribute('novalidate', 'novalidate'); - webshims.data(form, 'bustedNoValidate', (noValidate == null) ? null : noValidate); - })(); + catch (e) { return; } + isDomLoaded = true; + var dl = domLoadFnArr.length; + for (var i = 0; i < dl; i++) { + domLoadFnArr[i](); } - form = null; - }, - teardown: $.noop, - handler: function(e, d){ - - if( e.type != 'submit' || e.testedValidity || !e.originalEvent || !$.nodeName(e.target, 'form') || $.prop(e.target, 'noValidate') ){return;} - - isSubmit = true; - e.testedValidity = true; - var notValid = !($(e.target).checkValidity()); - if(notValid){ - e.stopImmediatePropagation(); - isSubmit = false; - return false; - } - isSubmit = false; } -}; - -var addSubmitBubbles = function(form){ - if (!$.support.submitBubbles && form && typeof form == 'object' && !form._submit_attached ) { - - $.event.add( form, 'submit._submit', function( event ) { - event._submit_bubble = true; - }); - - form._submit_attached = true; - } -}; -if(!$.support.submitBubbles && $.event.special.submit){ - $.event.special.submit.setup = function() { - // Only need this for delegated form submit events - if ( $.nodeName( this, "form" ) ) { - return false; + + function addDomLoadEvent(fn) { + if (isDomLoaded) { + fn(); } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - $.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = $.nodeName( elem, 'input' ) || $.nodeName( elem, 'button' ) ? $.prop(elem, 'form') : undefined; - addSubmitBubbles(form); - - }); - // return undefined since we don't need an event listener - }; -} - -$.event.special.submit = $.event.special.submit || {setup: function(){return false;}}; -var submitSetup = $.event.special.submit.setup; -$.extend($.event.special.submit, { - setup: function(){ - if($.nodeName(this, 'form')){ - $(this).on('invalid', $.noop); - } else { - $('form', this).on('invalid', $.noop); + else { + domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ } - return submitSetup.apply(this, arguments); } -}); - -$(window).on('invalid', $.noop); - - -webshims.addInputType('email', { - mismatch: (function(){ - //taken from http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#valid-e-mail-address - var test = cfg.emailReg || /^[a-zA-Z0-9.!#$%&'*+-\/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; - return function(val){ - return !test.test(val); - }; - })() -}); - -webshims.addInputType('url', { - mismatch: (function(){ - //taken from scott gonzales - var test = cfg.urlReg || /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i; - return function(val){ - return !test.test(val); - }; - })() -}); - -webshims.defineNodeNameProperty('input', 'type', { - prop: { - get: function(){ - var elem = this; - var type = (elem.getAttribute('type') || '').toLowerCase(); - return (webshims.inputTypes[type]) ? type : elem.type; - } + + /* Cross-browser onload + - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/ + - Will fire an event as soon as a web page including all of its assets are loaded + */ + function addLoadEvent(fn) { + } -}); - -// IDLs for constrain validation API -//ToDo: add object to this list -webshims.defineNodeNamesProperties(['button', 'fieldset', 'output'], { - checkValidity: { - value: function(){return true;} - }, - willValidate: { - value: false - }, - setCustomValidity: { - value: $.noop - }, - validity: { - writeable: false, - get: function(){ - return $.extend({}, validityPrototype); + + /* Main function + - Will preferably execute onDomLoad, otherwise onload (as a fallback) + */ + function main() { + if (plugin) { + testPlayerVersion(); } } -}, 'prop'); - -var baseCheckValidity = function(elem){ - var e, - v = $.prop(elem, 'validity') - ; - if(v){ - $.data(elem, 'cachedValidity', v); - } else { - return true; - } - if( !v.valid ){ - e = $.Event('invalid'); - var jElm = $(elem).trigger(e); - if(isSubmit && !baseCheckValidity.unhandledInvalids && !e.isDefaultPrevented()){ - webshims.validityAlert.showFor(jElm); - baseCheckValidity.unhandledInvalids = true; - } - } - $.removeData(elem, 'cachedValidity'); - return v.valid; -}; -var rsubmittable = /^(?:select|textarea|input)/i; -webshims.defineNodeNameProperty('form', 'checkValidity', { - prop: { - value: function(){ - - var ret = true, - elems = $($.prop(this, 'elements')).filter(function(){ - if(!rsubmittable.test(this.nodeName)){return false;} - var shadowData = webshims.data(this, 'shadowData'); - return !shadowData || !shadowData.nativeElement || shadowData.nativeElement === this; - }) - ; - - baseCheckValidity.unhandledInvalids = false; - for(var i = 0, len = elems.length; i < len; i++){ - if( !baseCheckValidity(elems[i]) ){ - ret = false; + + /* Detect the Flash Player version for non-Internet Explorer browsers + - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description: + a. Both release and build numbers can be detected + b. Avoid wrong descriptions by corrupt installers provided by Adobe + c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports + - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available + */ + function testPlayerVersion() { + var b = doc.getElementsByTagName("body")[0]; + var o = createElement(OBJECT); + o.setAttribute("type", FLASH_MIME_TYPE); + var t = b.appendChild(o); + if (t) { + var counter = 0; + (function(){ + if (typeof t.GetVariable != UNDEF) { + var d = t.GetVariable("$version"); + if (d) { + d = d.split(" ")[1].split(","); + ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; + } } - } - return ret; - } - } -}); - -webshims.defineNodeNamesProperties(['input', 'textarea', 'select'], { - checkValidity: { - value: function(){ - baseCheckValidity.unhandledInvalids = false; - return baseCheckValidity($(this).getNativeElement()[0]); - } - }, - setCustomValidity: { - value: function(error){ - $.removeData(this, 'cachedValidity'); - webshims.data(this, 'customvalidationMessage', ''+error); - } - }, - willValidate: { - writeable: false, - get: (function(){ - var types = { - button: 1, - reset: 1, - hidden: 1, - image: 1 + else if (counter < 10) { + counter++; + setTimeout(arguments.callee, 10); + return; } - ; - return function(){ - var elem = $(this).getNativeElement()[0]; - //elem.name && <- we don't use to make it easier for developers - return !!(!elem.disabled && !elem.readOnly && !types[elem.type] ); - }; - })() - }, - validity: { - writeable: false, - get: function(){ - var jElm = $(this).getNativeElement(); - var elem = jElm[0]; - var validityState = $.data(elem, 'cachedValidity'); - if(validityState){ - return validityState; - } - validityState = $.extend({}, validityPrototype); - - if( !$.prop(elem, 'willValidate') || elem.type == 'submit' ){ - return validityState; - } - var val = jElm.val(), - cache = {nodeName: elem.nodeName.toLowerCase()} - ; - - validityState.customError = !!(webshims.data(elem, 'customvalidationMessage')); - if( validityState.customError ){ - validityState.valid = false; - } - - $.each(validityRules, function(rule, fn){ - if (fn(jElm, val, cache)) { - validityState[rule] = true; - validityState.valid = false; - } - }); - $(this).getShadowFocusElement().attr('aria-invalid', validityState.valid ? 'false' : 'true'); - jElm = null; - elem = null; - return validityState; + b.removeChild(o); + t = null; + })(); } } -}, 'prop'); - -webshims.defineNodeNamesBooleanProperty(['input', 'textarea', 'select'], 'required', { - set: function(value){ - $(this).getShadowFocusElement().attr('aria-required', !!(value)+''); - }, - initAttr: (Modernizr.localstorage)//only if we have aria-support -}); - -webshims.reflectProperties(['input'], ['pattern']); - - -if( !('maxLength' in document.createElement('textarea')) ){ - var constrainMaxLength = (function(){ - var timer; - var curLength = 0; - var lastElement = $([]); - var max = 1e9; - var constrainLength = function(){ - var nowValue = lastElement.prop('value'); - var nowLen = nowValue.length; - if(nowLen > curLength && nowLen > max){ - nowLen = Math.max(curLength, max); - lastElement.prop('value', nowValue.substr(0, nowLen )); - } - curLength = nowLen; - }; - var remove = function(){ - clearTimeout(timer); - lastElement.unbind('.maxlengthconstraint'); - }; - return function(element, maxLength){ - remove(); - if(maxLength > -1){ - max = maxLength; - curLength = $.prop(element, 'value').length; - lastElement = $(element); - lastElement.on({ - 'keydown.maxlengthconstraint keypress.maxlengthconstraint paste.maxlengthconstraint cut.maxlengthconstraint': function(e){ - setTimeout(constrainLength, 0); - }, - 'keyup.maxlengthconstraint': constrainLength, - 'blur.maxlengthconstraint': remove - }); - timer = setInterval(constrainLength, 200); - } - }; - })(); - constrainMaxLength.update = function(element, maxLength){ - if($(element).is(':focus')){ - if(!maxLength){ - maxLength = $.prop(element, 'maxlength'); - } - constrainMaxLength(element, maxLength); - } - }; - $(document).on('focusin', function(e){ - var maxLength; - if(e.target.nodeName == "TEXTAREA" && (maxLength = $.prop(e.target, 'maxlength')) > -1){ - constrainMaxLength(e.target, maxLength); - } - }); - - webshims.defineNodeNameProperty('textarea', 'maxlength', { - attr: { - set: function(val){ - this.setAttribute('maxlength', ''+val); - constrainMaxLength.update(this); - }, - get: function(){ - var ret = this.getAttribute('maxlength'); - return ret == null ? undefined : ret; + function getObjectById(objectIdStr) { + var r = null; + var o = getElementById(objectIdStr); + if (o && o.nodeName == "OBJECT") { + if (typeof o.SetVariable != UNDEF) { + r = o; } - }, - prop: { - set: function(val){ - if(isNumber(val)){ - if(val < 0){ - throw('INDEX_SIZE_ERR'); - } - val = parseInt(val, 10); - this.setAttribute('maxlength', val); - constrainMaxLength.update(this, val); - return; + else { + var n = o.getElementsByTagName(OBJECT)[0]; + if (n) { + r = n; } - this.setAttribute('maxlength', '0'); - constrainMaxLength.update(this, 0); - }, - get: function(){ - var val = this.getAttribute('maxlength'); - return (isNumber(val) && val >= 0) ? parseInt(val, 10) : -1; - } } - }); - webshims.defineNodeNameProperty('textarea', 'maxLength', { - prop: { - set: function(val){ - $.prop(this, 'maxlength', val); - }, - get: function(){ - return $.prop(this, 'maxlength'); - } - } - }); -} - - - -var submitterTypes = {submit: 1, button: 1, image: 1}; -var formSubmitterDescriptors = {}; -[ - { - name: "enctype", - limitedTo: { - "application/x-www-form-urlencoded": 1, - "multipart/form-data": 1, - "text/plain": 1 - }, - defaultProp: "application/x-www-form-urlencoded", - proptype: "enum" - }, - { - name: "method", - limitedTo: { - "get": 1, - "post": 1 - }, - defaultProp: "get", - proptype: "enum" - }, - { - name: "action", - proptype: "url" - }, - { - name: "target" - }, - { - name: "novalidate", - propName: "noValidate", - proptype: "boolean" + return r; } -].forEach(function(desc){ - var propName = 'form'+ (desc.propName || desc.name).replace(/^[a-z]/, function(f){ - return f.toUpperCase(); - }); - var attrName = 'form'+ desc.name; - var formName = desc.name; - var eventName = 'click.webshimssubmittermutate'+formName; - var changeSubmitter = function(){ - var elem = this; - if( !('form' in elem) || !submitterTypes[elem.type] ){return;} - var form = $.prop(elem, 'form'); - if(!form){return;} - var attr = $.attr(elem, attrName); - if(attr != null && ( !desc.limitedTo || attr.toLowerCase() === $.prop(elem, propName))){ - - var oldAttr = $.attr(form, formName); - - $.attr(form, formName, attr); - setTimeout(function(){ - if(oldAttr != null){ - $.attr(form, formName, oldAttr); - } else { - try { - $(form).removeAttr(formName); - } catch(er){ - form.removeAttribute(formName); - } - } - }, 9); - } - }; - - -switch(desc.proptype) { - case "url": - var urlForm = document.createElement('form'); - formSubmitterDescriptors[propName] = { - prop: { - set: function(value){ - $.attr(this, attrName, value); - }, - get: function(){ - var value = $.attr(this, attrName); - if(value == null){return '';} - urlForm.setAttribute('action', value); - return urlForm.action; - } + /* Functions to abstract and display alternative content + */ + function displayAltContent(obj) { + if (ua.ie && ua.win && obj.readyState != 4) { + // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it, + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work + var el = createElement("div"); + obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content + el.parentNode.replaceChild(abstractAltContent(obj), el); + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + obj.parentNode.removeChild(obj); } - }; - break; - case "boolean": - formSubmitterDescriptors[propName] = { - prop: { - set: function(val){ - val = !!val; - if(val){ - $.attr(this, 'formnovalidate', 'formnovalidate'); - } else { - $(this).removeAttr('formnovalidate'); - } - }, - get: function(){ - return $.attr(this, 'formnovalidate') != null; - } + else { + setTimeout(arguments.callee, 10); } - }; - break; - case "enum": - formSubmitterDescriptors[propName] = { - prop: { - set: function(value){ - $.attr(this, attrName, value); - }, - get: function(){ - var value = $.attr(this, attrName); - return (!value || ( (value = value.toLowerCase()) && !desc.limitedTo[value] )) ? desc.defaultProp : value; - } - } - }; - break; - default: - formSubmitterDescriptors[propName] = { - prop: { - set: function(value){ - $.attr(this, attrName, value); - }, - get: function(){ - var value = $.attr(this, attrName); - return (value != null) ? value : ""; - } - } - }; - } - - - if(!formSubmitterDescriptors[attrName]){ - formSubmitterDescriptors[attrName] = {}; - } - formSubmitterDescriptors[attrName].attr = { - set: function(value){ - formSubmitterDescriptors[attrName].attr._supset.call(this, value); - $(this).unbind(eventName).on(eventName, changeSubmitter); - }, - get: function(){ - return formSubmitterDescriptors[attrName].attr._supget.call(this); + })(); } - }; - formSubmitterDescriptors[attrName].initAttr = true; - formSubmitterDescriptors[attrName].removeAttr = { - value: function(){ - $(this).unbind(eventName); - formSubmitterDescriptors[attrName].removeAttr._supvalue.call(this); + else { + obj.parentNode.replaceChild(abstractAltContent(obj), obj); } - }; -}); + } -webshims.defineNodeNamesProperties(['input', 'button'], formSubmitterDescriptors); - - -if(!$.support.getSetAttribute && $('<form novalidate></form>').attr('novalidate') == null){ - webshims.defineNodeNameProperty('form', 'novalidate', { - attr: { - set: function(val){ - this.setAttribute('novalidate', ''+val); - }, - get: function(){ - var ret = this.getAttribute('novalidate'); - return ret == null ? undefined : ret; - } + function abstractAltContent(obj) { + var ac = createElement("div"); + if (ua.win && ua.ie) { + ac.innerHTML = obj.innerHTML; } - }); -} else if(webshims.bugs.bustedValidity){ - - webshims.defineNodeNameProperty('form', 'novalidate', { - attr: { - set: function(val){ - webshims.data(this, 'bustedNoValidate', ''+val); - }, - get: function(){ - var ret = webshims.data(this, 'bustedNoValidate'); - return ret == null ? undefined : ret; + else { + var nestedObj = obj.getElementsByTagName(OBJECT)[0]; + if (nestedObj) { + var c = nestedObj.childNodes; + if (c) { + var cl = c.length; + for (var i = 0; i < cl; i++) { + if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) { + ac.appendChild(c[i].cloneNode(true)); + } + } + } } - }, - removeAttr: { - value: function(){ - webshims.data(this, 'bustedNoValidate', null); - } } - }); + return ac; + } - $.each(['rangeUnderflow', 'rangeOverflow', 'stepMismatch'], function(i, name){ - validityRules[name] = function(elem){ - return (elem[0].validity || {})[name] || false; - }; - }); - -} - -webshims.defineNodeNameProperty('form', 'noValidate', { - prop: { - set: function(val){ - val = !!val; - if(val){ - $.attr(this, 'novalidate', 'novalidate'); - } else { - $(this).removeAttr('novalidate'); + /* Cross-browser dynamic SWF creation + */ + function createSWF(attObj, parObj, id) { + var r, el = getElementById(id); + if (ua.wk && ua.wk < 312) { return r; } + if (el) { + if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content + attObj.id = id; } - }, - get: function(){ - return $.attr(this, 'novalidate') != null; - } - } -}); - -if(Modernizr.inputtypes.date && /webkit/i.test(navigator.userAgent)){ - (function(){ - - var noInputTriggerEvts = {updateInput: 1, input: 1}, - fixInputTypes = { - date: 1, - time: 1 - }, - noFocusEvents = { - focusout: 1, - blur: 1 - }, - changeEvts = { - updateInput: 1, - change: 1 - }, - observe = function(input){ - var timer, - focusedin = true, - lastInputVal = input.prop('value'), - lastChangeVal = lastInputVal, - trigger = function(e){ - //input === null - if(!input){return;} - var newVal = input.prop('value'); - - if(newVal !== lastInputVal){ - lastInputVal = newVal; - if(!e || !noInputTriggerEvts[e.type]){ - input.trigger('input'); - } + if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML + var att = ""; + for (var i in attObj) { + if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries + if (i.toLowerCase() == "data") { + parObj.movie = attObj[i]; } - if(e && changeEvts[e.type]){ - lastChangeVal = newVal; + else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword + att += ' class="' + attObj[i] + '"'; } - if(!focusedin && newVal !== lastChangeVal){ - input.trigger('change'); + else if (i.toLowerCase() != "classid") { + att += ' ' + i + '="' + attObj[i] + '"'; } - }, - extraTimer, - extraTest = function(){ - clearTimeout(extraTimer); - extraTimer = setTimeout(trigger, 9); - }, - unbind = function(e){ - clearInterval(timer); - setTimeout(function(){ - if(e && noFocusEvents[e.type]){ - focusedin = false; - } - if(input){ - input.unbind('focusout blur', unbind).unbind('input change updateInput', trigger); - trigger(); - } - input = null; - }, 1); - } - ; - - clearInterval(timer); - timer = setInterval(trigger, 160); - extraTest(); - input - .off({ - 'focusout blur': unbind, - 'input change updateInput': trigger - }) - .on({ - 'focusout blur': unbind, - 'input updateInput change': trigger - }) - ; + } + var par = ""; + for (var j in parObj) { + if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries + par += '<param name="' + j + '" value="' + parObj[j] + '" />'; + } + } + el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>'; + objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only) + r = getElementById(attObj.id); } - ; - if($.event.customEvent){ - $.event.customEvent.updateInput = true; - } - - (function(){ - - var correctValue = function(elem){ - var i = 1; - var len = 3; - var abort, val; - if(elem.type == 'date' && (isSubmit || !$(elem).is(':focus'))){ - val = elem.value; - if(val && val.length < 10 && (val = val.split('-')) && val.length == len){ - for(; i < len; i++){ - if(val[i].length == 1){ - val[i] = '0'+val[i]; - } else if(val[i].length != 2){ - abort = true; - break; - } + else { // well-behaving browsers + var o = createElement(OBJECT); + o.setAttribute("type", FLASH_MIME_TYPE); + for (var m in attObj) { + if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries + if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword + o.setAttribute("class", attObj[m]); } - if(!abort){ - val = val.join('-'); - $.prop(elem, 'value', val); - return val; + else if (m.toLowerCase() != "classid") { // filter out IE specific attribute + o.setAttribute(m, attObj[m]); } } } - }; - var inputCheckValidityDesc, formCheckValidityDesc, inputValueDesc, inputValidityDesc; - - inputCheckValidityDesc = webshims.defineNodeNameProperty('input', 'checkValidity', { - prop: { - value: function(){ - correctValue(this); - return inputCheckValidityDesc.prop._supvalue.apply(this, arguments); + for (var n in parObj) { + if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element + createObjParam(o, n, parObj[n]); } } - }); - - formCheckValidityDesc = webshims.defineNodeNameProperty('form', 'checkValidity', { - prop: { - value: function(){ - $('input', this).each(function(){ - correctValue(this); - }); - return formCheckValidityDesc.prop._supvalue.apply(this, arguments); + el.parentNode.replaceChild(o, el); + r = o; + } + } + return r; + } + + function createObjParam(el, pName, pValue) { + var p = createElement("param"); + p.setAttribute("name", pName); + p.setAttribute("value", pValue); + el.appendChild(p); + } + + /* Cross-browser SWF removal + - Especially needed to safely and completely remove a SWF in Internet Explorer + */ + function removeSWF(id) { + var obj = getElementById(id); + if (obj && obj.nodeName == "OBJECT") { + if (ua.ie && ua.win) { + obj.style.display = "none"; + (function(){ + if (obj.readyState == 4) { + removeObjectInIE(id); } - } - }); - - inputValueDesc = webshims.defineNodeNameProperty('input', 'value', { - prop: { - set: function(){ - return inputValueDesc.prop._supset.apply(this, arguments); - }, - get: function(){ - return correctValue(this) || inputValueDesc.prop._supget.apply(this, arguments); + else { + setTimeout(arguments.callee, 10); } - } - }); - - inputValidityDesc = webshims.defineNodeNameProperty('input', 'validity', { - prop: { - writeable: false, - get: function(){ - correctValue(this); - return inputValidityDesc.prop._supget.apply(this, arguments); - } - } - }); - - $(document).on('change', function(e){ - correctValue(e.target); - }); - - })(); - - $(document) - .on('focusin', function(e){ - if( e.target && fixInputTypes[e.target.type] && !e.target.readOnly && !e.target.disabled ){ - observe($(e.target)); - } - }) - ; - - - })(); -} - -webshims.addReady(function(context, contextElem){ - //start constrain-validation - var focusElem; - $('form', context) - .add(contextElem.filter('form')) - .bind('invalid', $.noop) - ; + })(); + } + else { + obj.parentNode.removeChild(obj); + } + } + } - try { - if(context == document && !('form' in (document.activeElement || {}))) { - focusElem = $('input[autofocus], select[autofocus], textarea[autofocus]', context).eq(0).getShadowFocusElement()[0]; - if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) { - focusElem.focus(); + function removeObjectInIE(id) { + var obj = getElementById(id); + if (obj) { + for (var i in obj) { + if (typeof obj[i] == "function") { + obj[i] = null; + } } + obj.parentNode.removeChild(obj); } - } - catch (er) {} + } -}); + /* Functions to optimize JavaScript compression + */ + function getElementById(id) { + var el = null; + try { + el = doc.getElementById(id); + } + catch (e) {} + return el; + } + + function createElement(el) { + return doc.createElement(el); + } + + /* Updated attachEvent function for Internet Explorer + - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks + */ + function addListener(target, eventType, fn) { + target.attachEvent(eventType, fn); + listenersArr[listenersArr.length] = [target, eventType, fn]; + } + + /* Flash Player and SWF content version matching + */ + function hasPlayerVersion(rv) { + var pv = ua.pv, v = rv.split("."); + v[0] = parseInt(v[0], 10); + v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0" + v[2] = parseInt(v[2], 10) || 0; + return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; + } + + + + function setVisibility(id, isVisible) { + if (!autoHideShow) { return; } + var elem; + var v = isVisible ? "visible" : "hidden"; + if (isDomLoaded && (elem && getElementById(id))) { + getElementById(id).style.visibility = v; + } + } -if(!Modernizr.formattribute || !Modernizr.fieldsetdisabled){ - (function(){ - (function(prop, undefined){ - $.prop = function(elem, name, value){ - var ret; - if(elem && elem.nodeType == 1 && value === undefined && $.nodeName(elem, 'form') && elem.id){ - ret = document.getElementsByName(name); - if(!ret || !ret.length){ - ret = document.getElementById(name); - } - if(ret){ - ret = $(ret).filter(function(){ - return $.prop(this, 'form') == elem; - }).get(); - if(ret.length){ - return ret.length == 1 ? ret[0] : ret; - } - } + /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only) + */ + var cleanup = function() { + if (ua.ie && ua.win && window.attachEvent) { + window.attachEvent("onunload", function() { + // remove listeners to avoid memory leaks + var ll = listenersArr.length; + for (var i = 0; i < ll; i++) { + listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]); } - return prop.apply(this, arguments); - }; - })($.prop, undefined); - var removeAddedElements = function(form){ - var elements = $.data(form, 'webshimsAddedElements'); - if(elements){ - elements.remove(); - $.removeData(form, 'webshimsAddedElements'); - } - }; - var rCRLF = /\r?\n/g, - rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, - rselectTextarea = /^(?:select|textarea)/i; - - if(!Modernizr.formattribute){ - webshims.defineNodeNamesProperty(['input', 'textarea', 'select', 'button', 'fieldset'], 'form', { - prop: { - get: function(){ - var form = webshims.contentAttr(this, 'form'); - if(form){ - form = document.getElementById(form); - if(form && !$.nodeName(form, 'form')){ - form = null; - } - } - return form || this.form; - }, - writeable: false + // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect + var il = objIdArr.length; + for (var j = 0; j < il; j++) { + removeSWF(objIdArr[j]); } - }); - - - webshims.defineNodeNamesProperty(['form'], 'elements', { - prop: { - get: function(){ - var id = this.id; - var elements = $.makeArray(this.elements); - if(id){ - elements = $(elements).add('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"], button[form="'+ id +'"], fieldset[form="'+ id +'"]').not('.webshims-visual-hide > *').get(); - } - return elements; - }, - writeable: false + // cleanup library's main closures to avoid memory leaks + for (var k in ua) { + ua[k] = null; } - }); - - - - $(function(){ - var stopPropagation = function(e){ - e.stopPropagation(); - }; - $(document).on('submit', function(e){ - - if(!e.isDefaultPrevented()){ - var form = e.target; - var id = form.id; - var elements; - - - if(id){ - removeAddedElements(form); - - elements = $('input[form="'+ id +'"], select[form="'+ id +'"], textarea[form="'+ id +'"]') - .filter(function(){ - return !this.disabled && this.name && this.form != form; - }) - .clone() - ; - if(elements.length){ - $.data(form, 'webshimsAddedElements', $('<div class="webshims-visual-hide" />').append(elements).appendTo(form)); - setTimeout(function(){ - removeAddedElements(form); - }, 9); - } - elements = null; - } - } - }); - - $(document).on('click', function(e){ - if(!e.isDefaultPrevented() && $(e.target).is('input[type="submit"][form], button[form], input[type="button"][form], input[type="image"][form], input[type="reset"][form]')){ - var trueForm = $.prop(e.target, 'form'); - var formIn = e.target.form; - var clone; - if(trueForm && trueForm != formIn){ - clone = $(e.target) - .clone() - .removeAttr('form') - .addClass('webshims-visual-hide') - .on('click', stopPropagation) - .appendTo(trueForm) - ; - if(formIn){ - e.preventDefault(); - } - addSubmitBubbles(trueForm); - clone.trigger('click'); - setTimeout(function(){ - clone.remove(); - clone = null; - }, 9); - } - } - }); - }); - } - - if(!Modernizr.fieldsetdisabled){ - webshims.defineNodeNamesProperty(['fieldset'], 'elements', { - prop: { - get: function(){ - //add listed elements without keygen, object, output - return $('input, select, textarea, button, fieldset', this).get() || []; - }, - writeable: false + ua = null; + for (var l in swfmini) { + swfmini[l] = null; } + swfmini = null; }); } - - $.fn.serializeArray = function() { - return this.map(function(){ - var elements = $.prop(this, 'elements'); - return elements ? $.makeArray( elements ) : this; - }) - .filter(function(){ - return this.name && !this.disabled && - ( this.checked || rselectTextarea.test( this.nodeName ) || - rinput.test( this.type ) ); - }) - .map(function( i, elem ){ - var val = $( this ).val(); - - return val == null ? - null : - $.isArray( val ) ? - $.map( val, function( val, i ){ - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - }) : - { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - }).get(); - }; - - })(); -} - -try { - document.querySelector(':checked'); -} catch(er){ - (function(){ - var checkInputs = { - radio: 1, - checkbox: 1 - }; - var selectChange = function(){ - var options = this.options || []; - var i, len, option; - for(i = 0, len = options.length; i < len; i++){ - option = $(options[i]); - option[$.prop(options[i], 'selected') ? 'addClass' : 'removeClass']('prop-checked'); - } - }; - var checkChange = function(){ - var fn = $.prop(this, 'checked') ? 'addClass' : 'removeClass'; - var className = this.className || ''; - var parent; - - //IE8- has problems to update styles, we help - if( (className.indexOf('prop-checked') == -1) == (fn == 'addClass')){ - $(this)[fn]('prop-checked'); - if((parent = this.parentNode)){ - parent.className = parent.className; - } - } - }; - - - webshims.onNodeNamesPropertyModify('select', 'value', selectChange); - webshims.onNodeNamesPropertyModify('select', 'selectedIndex', selectChange); - webshims.onNodeNamesPropertyModify('option', 'selected', function(){ - $(this).closest('select').each(selectChange); - }); - webshims.onNodeNamesPropertyModify('input', 'checked', function(value, boolVal){ - var type = this.type; - if(type == 'radio' && boolVal){ - webshims.modules["form-core"].getGroupElements(this).each(checkChange); - } else if(checkInputs[type]) { - $(this).each(checkChange); - } - }); - - $(document).on('change', function(e){ - - if(checkInputs[e.target.type]){ - if(e.target.type == 'radio'){ - webshims.modules["form-core"].getGroupElements(e.target).each(checkChange); - } else { - $(e.target)[$.prop(e.target, 'checked') ? 'addClass' : 'removeClass']('prop-checked'); - } - } else if(e.target.nodeName.toLowerCase() == 'select'){ - $(e.target).each(selectChange); - } - }); - - webshims.addReady(function(context, contextElem){ - $('option, input', context) - .add(contextElem.filter('option, input')) - .each(function(){ - var prop; - if(checkInputs[this.type]){ - prop = 'checked'; - } else if(this.nodeName.toLowerCase() == 'option'){ - prop = 'selected'; - } - if(prop){ - $(this)[$.prop(this, prop) ? 'addClass' : 'removeClass']('prop-checked'); - } - - }) - ; - }); - })(); -} - -(function(){ - Modernizr.textareaPlaceholder = !!('placeholder' in $('<textarea />')[0]); - if(Modernizr.input.placeholder && Modernizr.textareaPlaceholder){return;} + }(); - var isOver = (webshims.cfg.forms.placeholderType == 'over'); - var isResponsive = (webshims.cfg.forms.responsivePlaceholder); - var polyfillElements = ['textarea']; - if(!Modernizr.input.placeholder){ - polyfillElements.push('input'); - } + webshims.ready('DOM', callDomLoadFunctions); - var setSelection = function(elem){ - try { - if(elem.setSelectionRange){ - elem.setSelectionRange(0, 0); - return true; - } else if(elem.createTextRange){ - var range = elem.createTextRange(); - range.collapse(true); - range.moveEnd('character', 0); - range.moveStart('character', 0); - range.select(); - return true; - } - } catch(er){} - }; - - var hidePlaceholder = function(elem, data, value, _onFocus){ - if(value === false){ - value = $.prop(elem, 'value'); - } - if(!isOver && elem.type != 'password'){ - if(!value && _onFocus && setSelection(elem)){ - var selectTimer = setTimeout(function(){ - setSelection(elem); - }, 9); - $(elem) - .off('.placeholderremove') - .on({ - 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){ - if(e && (e.keyCode == 17 || e.keyCode == 16)){return;} - elem.value = $.prop(elem, 'value'); - data.box.removeClass('placeholder-visible'); - clearTimeout(selectTimer); - $(elem).unbind('.placeholderremove'); - }, - 'mousedown.placeholderremove drag.placeholderremove select.placeholderremove': function(e){ - setSelection(elem); - clearTimeout(selectTimer); - selectTimer = setTimeout(function(){ - setSelection(elem); - }, 9); - }, - 'blur.placeholderremove': function(){ - clearTimeout(selectTimer); - $(elem).unbind('.placeholderremove'); - } - }) - ; - return; - } - elem.value = value; - } else if(!value && _onFocus){ - $(elem) - .off('.placeholderremove') - .on({ - 'keydown.placeholderremove keypress.placeholderremove paste.placeholderremove input.placeholderremove': function(e){ - if(e && (e.keyCode == 17 || e.keyCode == 16)){return;} - data.box.removeClass('placeholder-visible'); - $(elem).unbind('.placeholderremove'); - }, - 'blur.placeholderremove': function(){ - $(elem).unbind('.placeholderremove'); - } - }) - ; - return; - } - data.box.removeClass('placeholder-visible'); - }, - showPlaceholder = function(elem, data, placeholderTxt){ - if(placeholderTxt === false){ - placeholderTxt = $.prop(elem, 'placeholder'); - } + return { + /* Public API + - Reference: http://code.google.com/p/swfobject/wiki/documentation + */ + registerObject: function() { - if(!isOver && elem.type != 'password'){ - elem.value = placeholderTxt; - } - data.box.addClass('placeholder-visible'); }, - changePlaceholderVisibility = function(elem, value, placeholderTxt, data, type){ - if(!data){ - data = $.data(elem, 'placeHolder'); - if(!data){return;} + + getObjectById: function(objectIdStr) { + if (ua.w3) { + return getObjectById(objectIdStr); } - $(elem).unbind('.placeholderremove'); - if(type == 'focus' || (!type && $(elem).is(':focus'))){ - if(elem.type == 'password' || isOver || $(elem).hasClass('placeholder-visible')){ - hidePlaceholder(elem, data, '', true); - } - return; - } - if(value === false){ - value = $.prop(elem, 'value'); - } - if(value){ - hidePlaceholder(elem, data, value); - return; - } - if(placeholderTxt === false){ - placeholderTxt = $.attr(elem, 'placeholder') || ''; - } - if(placeholderTxt && !value){ - showPlaceholder(elem, data, placeholderTxt); - } else { - hidePlaceholder(elem, data, value); - } }, - createPlaceholder = function(elem){ - elem = $(elem); - var id = elem.prop('id'), - hasLabel = !!(elem.prop('title') || elem.attr('aria-labelledby')) - ; - if(!hasLabel && id){ - hasLabel = !!( $('label[for="'+ id +'"]', elem[0].form)[0] ); - } - if(!hasLabel){ - if(!id){ - id = $.webshims.getID(elem); - } - hasLabel = !!($('label #'+ id)[0]); - } - return $( hasLabel ? '<span class="placeholder-text"></span>' : '<label for="'+ id +'" class="placeholder-text"></label>'); - }, - pHolder = (function(){ - var delReg = /\n|\r|\f|\t/g, - allowedPlaceholder = { - text: 1, - search: 1, - url: 1, - email: 1, - password: 1, - tel: 1, - number: 1 - } - ; - - return { - create: function(elem){ - var data = $.data(elem, 'placeHolder'); - var form; - var responsiveElem; - if(data){return data;} - data = $.data(elem, 'placeHolder', {}); - - $(elem).on('focus.placeholder blur.placeholder', function(e){ - changePlaceholderVisibility(this, false, false, data, e.type ); - data.box[e.type == 'focus' ? 'addClass' : 'removeClass']('placeholder-focused'); - }); - - if((form = $.prop(elem, 'form'))){ - $(form).on('reset.placeholder', function(e){ - setTimeout(function(){ - changePlaceholderVisibility(elem, false, false, data, e.type ); - }, 0); - }); + + embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { + var callbackObj = {success:false, id:replaceElemIdStr}; + if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { + setVisibility(replaceElemIdStr, false); + addDomLoadEvent(function() { + widthStr += ""; // auto-convert to string + heightStr += ""; + var att = {}; + if (attObj && typeof attObj === OBJECT) { + for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs + att[i] = attObj[i]; + } } - - if(elem.type == 'password' || isOver){ - data.text = createPlaceholder(elem); - if(isResponsive || $(elem).is('.responsive-width') || (elem.currentStyle || {width: ''}).width.indexOf('%') != -1){ - responsiveElem = true; - data.box = data.text; - } else { - data.box = $(elem) - .wrap('<span class="placeholder-box placeholder-box-'+ (elem.nodeName || '').toLowerCase() +' placeholder-box-'+$.css(elem, 'float')+'" />') - .parent() - ; + att.data = swfUrlStr; + att.width = widthStr; + att.height = heightStr; + var par = {}; + if (parObj && typeof parObj === OBJECT) { + for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs + par[j] = parObj[j]; } - data.text - .insertAfter(elem) - .on('mousedown.placeholder', function(){ - changePlaceholderVisibility(this, false, false, data, 'focus'); - try { - setTimeout(function(){ - elem.focus(); - }, 0); - } catch(e){} - return false; - }) - ; - - - $.each(['lineHeight', 'fontSize', 'fontFamily', 'fontWeight'], function(i, style){ - var prop = $.css(elem, style); - if(data.text.css(style) != prop){ - data.text.css(style, prop); + } + if (flashvarsObj && typeof flashvarsObj === OBJECT) { + for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs + if (typeof par.flashvars != UNDEF) { + par.flashvars += "&" + k + "=" + flashvarsObj[k]; } - }); - $.each(['Left', 'Top'], function(i, side){ - var size = (parseInt($.css(elem, 'padding'+ side), 10) || 0) + Math.max((parseInt($.css(elem, 'margin'+ side), 10) || 0), 0) + (parseInt($.css(elem, 'border'+ side +'Width'), 10) || 0); - data.text.css('padding'+ side, size); - }); - - $(document) - .onTrigger('updateshadowdom', function(){ - var height, width; - if((width = elem.offsetWidth) || (height = elem.offsetHeight)){ - data.text - .css({ - width: width, - height: height - }) - .css($(elem).position()) - ; - } - }) - ; - - } else { - var reset = function(e){ - if($(elem).hasClass('placeholder-visible')){ - hidePlaceholder(elem, data, ''); - if(e && e.type == 'submit'){ - setTimeout(function(){ - if(e.isDefaultPrevented()){ - changePlaceholderVisibility(elem, false, false, data ); - } - }, 9); - } + else { + par.flashvars = k + "=" + flashvarsObj[k]; } - }; - - $(window).on('beforeunload', reset); - data.box = $(elem); - if(form){ - $(form).submit(reset); } } - - return data; - }, - update: function(elem, val){ - var type = ($.attr(elem, 'type') || $.prop(elem, 'type') || '').toLowerCase(); - if(!allowedPlaceholder[type] && !$.nodeName(elem, 'textarea')){ - webshims.error('placeholder not allowed on input[type="'+type+'"]'); - if(type == 'date'){ - webshims.error('but you can use data-placeholder for input[type="date"]'); + if (hasPlayerVersion(swfVersionStr)) { // create SWF + var obj = createSWF(att, par, replaceElemIdStr); + if (att.id == replaceElemIdStr) { + setVisibility(replaceElemIdStr, true); } - return; + callbackObj.success = true; + callbackObj.ref = obj; } - - - var data = pHolder.create(elem); - if(data.text){ - data.text.text(val); + else { // show alternative content + setVisibility(replaceElemIdStr, true); } - - changePlaceholderVisibility(elem, false, val, data); - } - }; - })() - ; - - $.webshims.publicMethods = { - pHolder: pHolder - }; - polyfillElements.forEach(function(nodeName){ - var desc = webshims.defineNodeNameProperty(nodeName, 'placeholder', { - attr: { - set: function(val){ - var elem = this; - webshims.contentAttr(elem, 'placeholder', val); - pHolder.update(elem, val); - }, - get: function(){ - return webshims.contentAttr(this, 'placeholder'); - } - }, - reflect: true, - initAttr: true - }); - }); - - - polyfillElements.forEach(function(name){ - var placeholderValueDesc = {}; - var desc; - ['attr', 'prop'].forEach(function(propType){ - placeholderValueDesc[propType] = { - set: function(val){ - var elem = this; - var placeholder = webshims.contentAttr(elem, 'placeholder'); - - - $.removeData(elem, 'cachedValidity'); - var ret = desc[propType]._supset.call(elem, val); - if(placeholder && 'value' in elem){ - changePlaceholderVisibility(elem, val, placeholder); - } - return ret; - }, - get: function(){ - var elem = this; - return $(elem).hasClass('placeholder-visible') ? '' : desc[propType]._supget.call(elem); - } - }; - }); - desc = webshims.defineNodeNameProperty(name, 'value', placeholderValueDesc); - }); - -})(); - - (function(){ - var doc = document; - if( 'value' in document.createElement('output') ){return;} - - webshims.defineNodeNameProperty('output', 'value', { - prop: { - set: function(value){ - var setVal = $.data(this, 'outputShim'); - if(!setVal){ - setVal = outputCreate(this); - } - setVal(value); - }, - get: function(){ - return webshims.contentAttr(this, 'value') || $(this).text() || ''; - } + if (callbackFn) { callbackFn(callbackObj); } + }); } - }); + else if (callbackFn) { callbackFn(callbackObj); } + }, + switchOffAutoHideShow: function() { + autoHideShow = false; + }, - webshims.onNodeNamesPropertyModify('input', 'value', function(value, boolVal, type){ - if(type == 'removeAttr'){return;} - var setVal = $.data(this, 'outputShim'); - if(setVal){ - setVal(value); - } - }); + ua: ua, - var outputCreate = function(elem){ - if(elem.getAttribute('aria-live')){return;} - elem = $(elem); - var value = (elem.text() || '').trim(); - var id = elem.attr('id'); - var htmlFor = elem.attr('for'); - var shim = $('<input class="output-shim" type="text" disabled name="'+ (elem.attr('name') || '')+'" value="'+value+'" style="display: none !important;" />').insertAfter(elem); - var form = shim[0].form || doc; - var setValue = function(val){ - shim[0].value = val; - val = shim[0].value; - elem.text(val); - webshims.contentAttr(elem[0], 'value', val); - }; - - elem[0].defaultValue = value; - webshims.contentAttr(elem[0], 'value', value); - - elem.attr({'aria-live': 'polite'}); - if(id){ - shim.attr('id', id); - elem.attr('aria-labelledby', webshims.getID($('label[for="'+id+'"]', form))); + getFlashPlayerVersion: function() { + return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; + }, + + hasFlashPlayerVersion: hasPlayerVersion, + + createSWF: function(attObj, parObj, replaceElemIdStr) { + if (ua.w3) { + return createSWF(attObj, parObj, replaceElemIdStr); } - if(htmlFor){ - id = webshims.getID(elem); - htmlFor.split(' ').forEach(function(control){ - control = document.getElementById(control); - if(control){ - control.setAttribute('aria-controls', id); - } - }); + else { + return undefined; } - elem.data('outputShim', setValue ); - shim.data('outputShim', setValue ); - return setValue; - }; - - webshims.addReady(function(context, contextElem){ - $('output', context).add(contextElem.filter('output')).each(function(){ - outputCreate(this); - }); - }); + }, - /* - * Implements input event in all browsers - */ - (function(){ - var noInputTriggerEvts = {updateInput: 1, input: 1}, - noInputTypes = { - radio: 1, - checkbox: 1, - submit: 1, - button: 1, - image: 1, - reset: 1, - file: 1 - - //pro forma - ,color: 1 - //,range: 1 - }, - observe = function(input){ - var timer, - lastVal = input.prop('value'), - trigger = function(e){ - //input === null - if(!input){return;} - var newVal = input.prop('value'); - - if(newVal !== lastVal){ - lastVal = newVal; - if(!e || !noInputTriggerEvts[e.type]){ - webshims.triggerInlineForm && webshims.triggerInlineForm(input[0], 'input'); - } - } - }, - extraTimer, - extraTest = function(){ - clearTimeout(extraTimer); - extraTimer = setTimeout(trigger, 9); - }, - unbind = function(){ - input.unbind('focusout', unbind).unbind('keyup keypress keydown paste cut', extraTest).unbind('input change updateInput', trigger); - clearInterval(timer); - setTimeout(function(){ - trigger(); - input = null; - }, 1); - - } - ; - - clearInterval(timer); - timer = setInterval(trigger, 99); - extraTest(); - input.on({ - 'keyup keypress keydown paste cut': extraTest, - focusout: unbind, - 'input updateInput change': trigger - }); - } - ; - if($.event.customEvent){ - $.event.customEvent.updateInput = true; - } + showExpressInstall: function() { - $(doc) - .on('focusin', function(e){ - if( e.target && e.target.type && !e.target.readOnly && !e.target.disabled && (e.target.nodeName || '').toLowerCase() == 'input' && !noInputTypes[e.target.type] ){ - observe($(e.target)); - } - }) - ; - })(); - })(); - -}); //webshims.ready end -}//end formvalidation - -jQuery.webshims.register('form-message', function($, webshims, window, document, undefined, options){ - "use strict"; - var validityMessages = webshims.validityMessages; - - var implementProperties = (options.overrideMessages || options.customMessages) ? ['customValidationMessage'] : []; - - validityMessages['en'] = $.extend(true, { - typeMismatch: { - email: 'Please enter an email address.', - url: 'Please enter a URL.', - number: 'Please enter a number.', - date: 'Please enter a date.', - time: 'Please enter a time.', - range: 'Invalid input.', - "datetime-local": 'Please enter a datetime.' }, - rangeUnderflow: { - defaultMessage: 'Value must be greater than or equal to {%min}.' + + removeSWF: function(objElemIdStr) { + if (ua.w3) { + removeSWF(objElemIdStr); + } }, - rangeOverflow: { - defaultMessage: 'Value must be less than or equal to {%max}.' + + createCSS: function() { + }, - stepMismatch: 'Invalid input.', - tooLong: 'Please enter at most {%maxlength} character(s). You entered {%valueLen}.', - patternMismatch: 'Invalid input. {%title}', - valueMissing: { - defaultMessage: 'Please fill out this field.', - checkbox: 'Please check this box if you want to proceed.' + addDomLoadEvent: addDomLoadEvent, + + addLoadEvent: addLoadEvent, + + + // For internal usage only + expressInstallCallback: function() { + } - }, (validityMessages['en'] || validityMessages['en-US'] || {})); - - - ['select', 'radio'].forEach(function(type){ - if(typeof validityMessages['en'].valueMissing == 'object'){ - validityMessages['en'].valueMissing[type] = 'Please select an option.'; - } - }); - - ['date', 'time', 'datetime-local'].forEach(function(type){ - if(typeof validityMessages['en'].rangeUnderflow == 'object'){ - validityMessages.en.rangeUnderflow[type] = 'Value must be at or after {%min}.'; - } - }); - ['date', 'time', 'datetime-local'].forEach(function(type){ - if(typeof validityMessages['en'].rangeOverflow == 'object'){ - validityMessages.en.rangeOverflow[type] = 'Value must be at or before {%max}.'; - } - }); - - validityMessages['en-US'] = validityMessages['en-US'] || validityMessages['en']; - validityMessages[''] = validityMessages[''] || validityMessages['en-US']; - - validityMessages['de'] = $.extend(true, { - typeMismatch: { - email: '{%value} ist keine zulässige E-Mail-Adresse', - url: '{%value} ist keine zulässige Webadresse', - number: '{%value} ist keine Nummer!', - date: '{%value} ist kein Datum', - time: '{%value} ist keine Uhrzeit', - range: '{%value} ist keine Nummer!', - "datetime-local": '{%value} ist kein Datum-Uhrzeit Format.' - }, - rangeUnderflow: { - defaultMessage: '{%value} ist zu niedrig. {%min} ist der unterste Wert, den Sie benutzen können.' - }, - rangeOverflow: { - defaultMessage: '{%value} ist zu hoch. {%max} ist der oberste Wert, den Sie benutzen können.' - }, - stepMismatch: 'Der Wert {%value} ist in diesem Feld nicht zulässig. Hier sind nur bestimmte Werte zulässig. {%title}', - tooLong: 'Der eingegebene Text ist zu lang! Sie haben {%valueLen} Zeichen eingegeben, dabei sind {%maxlength} das Maximum.', - patternMismatch: '{%value} hat für dieses Eingabefeld ein falsches Format! {%title}', - valueMissing: { - defaultMessage: 'Bitte geben Sie einen Wert ein', - checkbox: 'Bitte aktivieren Sie das Kästchen' - } - }, (validityMessages['de'] || {})); - - ['select', 'radio'].forEach(function(type){ - if(typeof validityMessages['de'].valueMissing == 'object'){ - validityMessages['de'].valueMissing[type] = 'Bitte wählen Sie eine Option aus'; - } - }); - - ['date', 'time', 'datetime-local'].forEach(function(type){ - if(typeof validityMessages['de'].rangeUnderflow == 'object'){ - validityMessages.de.rangeUnderflow[type] = '{%value} ist zu früh. {%min} ist die früheste Zeit, die Sie benutzen können.'; - } - }); - ['date', 'time', 'datetime-local'].forEach(function(type){ - if(typeof validityMessages['de'].rangeOverflow == 'object'){ - validityMessages.de.rangeOverflow[type] = '{%value} ist zu spät. {%max} ist die späteste Zeit, die Sie benutzen können.'; - } - }); - - var currentValidationMessage = validityMessages['']; - - - webshims.createValidationMessage = function(elem, name){ - var message = currentValidationMessage[name]; - if(message && typeof message !== 'string'){ - message = message[ $.prop(elem, 'type') ] || message[ (elem.nodeName || '').toLowerCase() ] || message[ 'defaultMessage' ]; - } - if(message){ - ['value', 'min', 'max', 'title', 'maxlength', 'label'].forEach(function(attr){ - if(message.indexOf('{%'+attr) === -1){return;} - var val = ((attr == 'label') ? $.trim($('label[for="'+ elem.id +'"]', elem.form).text()).replace(/\*$|:$/, '') : $.attr(elem, attr)) || ''; - if(name == 'patternMismatch' && attr == 'title' && !val){ - webshims.error('no title for patternMismatch provided. Always add a title attribute.'); - } - message = message.replace('{%'+ attr +'}', val); - if('value' == attr){ - message = message.replace('{%valueLen}', val.length); - } - }); - } - return message || ''; }; - - - if(webshims.bugs.validationMessage || !Modernizr.formvalidation || webshims.bugs.bustedValidity){ - implementProperties.push('validationMessage'); - } - - webshims.activeLang({ - langObj: validityMessages, - module: 'form-core', - callback: function(langObj){ - currentValidationMessage = langObj; - } - }); - - implementProperties.forEach(function(messageProp){ - webshims.defineNodeNamesProperty(['fieldset', 'output', 'button'], messageProp, { - prop: { - value: '', - writeable: false - } - }); - ['input', 'select', 'textarea'].forEach(function(nodeName){ - var desc = webshims.defineNodeNameProperty(nodeName, messageProp, { - prop: { - get: function(){ - var elem = this; - var message = ''; - if(!$.prop(elem, 'willValidate')){ - return message; - } - - var validity = $.prop(elem, 'validity') || {valid: 1}; - - if(validity.valid){return message;} - message = webshims.getContentValidationMessage(elem, validity); - - if(message){return message;} - - if(validity.customError && elem.nodeName){ - message = (Modernizr.formvalidation && !webshims.bugs.bustedValidity && desc.prop._supget) ? desc.prop._supget.call(elem) : webshims.data(elem, 'customvalidationMessage'); - if(message){return message;} - } - $.each(validity, function(name, prop){ - if(name == 'valid' || !prop){return;} - - message = webshims.createValidationMessage(elem, name); - if(message){ - return false; - } - }); - return message || ''; - }, - writeable: false - } - }); - }); - - }); -}); +}(); + (function($, Modernizr, webshims){ "use strict"; var hasNative = Modernizr.audio && Modernizr.video; var supportsLoop = false; var bugs = webshims.bugs; @@ -1744,11 +509,11 @@ webshims.reTest([swfType], hasNative); } }); }; var options = webshims.cfg.mediaelement; - var swfType = options && options.player == 'jwplayer' ? 'mediaelement-swf' : 'mediaelement-jaris'; + var swfType = 'mediaelement-jaris'; var hasSwf; if(!options){ webshims.error("mediaelement wasn't implemented but loaded"); return; } @@ -1769,38 +534,48 @@ webshims.reTest('mediaelement-native-fix'); } } if(hasNative && !options.preferFlash){ + var noSwitch = { + 1: 1, + 2: 1 + }; var switchOptions = function(e){ + var media; var parent = e.target.parentNode; - if(!options.preferFlash && ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) ){ - webshims.ready('DOM mediaelement', function(){ - if(hasSwf){ + if(!options.preferFlash && + ($(e.target).is('audio, video') || (parent && $('source:last', parent)[0] == e.target)) && + (media = $(e.target).closest('audio, video')) && !noSwitch[media.prop('error')] + ){ + $(function(){ + if(hasSwf && !options.preferFlash){ loadSwf(); + webshims.ready('WINDOWLOAD '+swfType, function(){ + setTimeout(function(){ + if(!options.preferFlash && webshims.mediaelement.createSWF && !media.is('.nonnative-api-active')){ + options.preferFlash = true; + document.removeEventListener('error', switchOptions, true); + $('audio, video').each(function(){ + webshims.mediaelement.selectSource(this); + }); + webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src+" Mediaerror: "+ media.prop('error')); + } + }, 9); + }); + } else{ + document.removeEventListener('error', switchOptions, true); } - webshims.ready('WINDOWLOAD '+swfType, function(){ - setTimeout(function(){ - if(hasSwf && !options.preferFlash && webshims.mediaelement.createSWF && !$(e.target).closest('audio, video').is('.nonnative-api-active')){ - options.preferFlash = true; - document.removeEventListener('error', switchOptions, true); - $('audio, video').each(function(){ - webshims.mediaelement.selectSource(this); - }); - webshims.info("switching mediaelements option to 'preferFlash', due to an error with native player: "+e.target.src); - } else if(!hasSwf){ - document.removeEventListener('error', switchOptions, true); - } - }, 20); - }); }); } }; document.addEventListener('error', switchOptions, true); $('audio, video').each(function(){ - if(this.error){ + var error = $.prop(this, 'error'); + if(error && !noSwitch[error]){ switchOptions({target: this}); + return false; } }); } @@ -1831,10 +606,11 @@ if(this && $.nodeName(this, 'track')){ webshims.error("track support was overwritten. Please check your vtt including your vtt mime-type"); } else { webshims.info("track support was overwritten. due to bad browser support"); } + return false; } }; var detectTrackError = function(){ document.addEventListener('error', trackListener, true); @@ -1854,11 +630,11 @@ })(); } webshims.register('mediaelement-core', function($, webshims, window, document, undefined){ - hasSwf = swfobject.hasFlashPlayerVersion('9.0.115'); + hasSwf = swfmini.hasFlashPlayerVersion('9.0.115'); $('html').addClass(hasSwf ? 'swf' : 'no-swf'); var mediaelement = webshims.mediaelement; mediaelement.parseRtmp = function(data){ var src = data.src.split('://'); var paths = src[1].split('/'); @@ -1947,11 +723,11 @@ return function(){ if(loaded || !hasYt){return;} loaded = true; webshims.loader.loadScript("https://www.youtube.com/player_api"); $(function(){ - webshims.polyfill("mediaelement-yt"); + webshims._polyfill(["mediaelement-yt"]); }); }; })(); var loadThird = function(){ if(hasSwf){ @@ -2071,11 +847,11 @@ mediaelement.srces(this, srces); $(this).mediaLoad(); }); }; - mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'jwplayer/jwplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp']; + mediaelement.swfMimeTypes = ['video/3gpp', 'video/x-msvideo', 'video/quicktime', 'video/x-m4v', 'video/mp4', 'video/m4p', 'video/x-flv', 'video/flv', 'audio/mpeg', 'audio/aac', 'audio/mp4', 'audio/x-m4a', 'audio/m4a', 'audio/mp3', 'audio/x-fla', 'audio/fla', 'youtube/flv', 'video/jarisplayer', 'jarisplayer/jarisplayer', 'video/youtube', 'video/rtmp', 'audio/rtmp']; mediaelement.canThirdPlaySrces = function(mediaElem, srces){ var ret = ''; if(hasSwf || hasYt){ mediaElem = $(mediaElem); @@ -2096,15 +872,16 @@ mediaelement.canNativePlaySrces = function(mediaElem, srces){ var ret = ''; if(hasNative){ mediaElem = $(mediaElem); var nodeName = (mediaElem[0].nodeName || '').toLowerCase(); - if(!nativeCanPlayType[nodeName]){return ret;} + var nativeCanPlay = (nativeCanPlayType[nodeName] || {prop: {_supvalue: false}}).prop._supvalue || mediaElem[0].canPlayType; + if(!nativeCanPlay){return ret;} srces = srces || mediaelement.srces(mediaElem); $.each(srces, function(i, src){ - if(src.type && nativeCanPlayType[nodeName].prop._supvalue.call(mediaElem[0], src.type) ){ + if(src.type && nativeCanPlay.call(mediaElem[0], src.type) ){ ret = src; return false; } }); } @@ -2115,11 +892,11 @@ if(!message){ message = "can't play sources"; } $(elem).pause().data('mediaerror', message); - webshims.warn('mediaelementError: '+ message); + webshims.error('mediaelementError: '+ message); setTimeout(function(){ if($(elem).data('mediaerror')){ $(elem).trigger('mediaerror'); } }, 1); @@ -2189,133 +966,154 @@ data = data || webshims.data(elem, 'mediaelement'); stepSources(elem, data, options.preferFlash || undefined, _srces); }; mediaelement.selectSource = selectSource; + $(document).on('ended', function(e){ var data = webshims.data(e.target, 'mediaelement'); if( supportsLoop && (!data || data.isActive == 'html5') && !$.prop(e.target, 'loop')){return;} setTimeout(function(){ if( $.prop(e.target, 'paused') || !$.prop(e.target, 'loop') ){return;} $(e.target).prop('currentTime', 0).play(); }, 1); }); - if(!supportsLoop){ - webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop'); - } - ['audio', 'video'].forEach(function(nodeName){ - var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', { - prop: { - value: function(){ - var data = webshims.data(this, 'mediaelement'); - selectSource(this, data); - if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){ - supLoad.prop._supvalue.apply(this, arguments); + webshims.ready('dom-support', function(){ + if(!supportsLoop){ + webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop'); + } + + ['audio', 'video'].forEach(function(nodeName){ + var supLoad = webshims.defineNodeNameProperty(nodeName, 'load', { + prop: { + value: function(){ + var data = webshims.data(this, 'mediaelement'); + selectSource(this, data); + if(hasNative && (!data || data.isActive == 'html5') && supLoad.prop._supvalue){ + supLoad.prop._supvalue.apply(this, arguments); + } } } - } - }); - nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', { - prop: { - value: function(type){ - var ret = ''; - if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){ - ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type); - if(ret == 'no'){ - ret = ''; + }); + nativeCanPlayType[nodeName] = webshims.defineNodeNameProperty(nodeName, 'canPlayType', { + prop: { + value: function(type){ + var ret = ''; + if(hasNative && nativeCanPlayType[nodeName].prop._supvalue){ + ret = nativeCanPlayType[nodeName].prop._supvalue.call(this, type); + if(ret == 'no'){ + ret = ''; + } } - } - if(!ret && hasSwf){ - type = $.trim((type || '').split(';')[0]); - if(mediaelement.swfMimeTypes.indexOf(type) != -1){ - ret = 'maybe'; + if(!ret && hasSwf){ + type = $.trim((type || '').split(';')[0]); + if(mediaelement.swfMimeTypes.indexOf(type) != -1){ + ret = 'maybe'; + } } + return ret; } - return ret; } + }); + }); + webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], { + set: function(){ + var elem = this; + var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {}); + clearTimeout(baseData.loadTimer); + baseData.loadTimer = setTimeout(function(){ + selectSource(elem); + elem = null; + }, 9); } }); }); - webshims.onNodeNamesPropertyModify(['audio', 'video'], ['src', 'poster'], { - set: function(){ - var elem = this; - var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {}); - clearTimeout(baseData.loadTimer); - baseData.loadTimer = setTimeout(function(){ - selectSource(elem); - elem = null; - }, 9); - } - }); var initMediaElements = function(){ - - webshims.addReady(function(context, insertedElement){ - var media = $('video, audio', context) - .add(insertedElement.filter('video, audio')) - .each(function(){ - var data = webshims.data(this, 'mediaelement'); + var testFixMedia = function(){ + if(webshims.implement(this, 'mediaelement')){ + selectSource(this); + + if(hasNative){ + var bufferTimer; + var lastBuffered; + var elem = this; + var getBufferedString = function(){ + var buffered = $.prop(elem, 'buffered'); + if(!buffered){return;} + var bufferString = ""; + for(var i = 0, len = buffered.length; i < len;i++){ + bufferString += buffered.end(i); + } + return bufferString; + }; + var testBuffer = function(){ + var buffered = getBufferedString(); + if(buffered != lastBuffered){ + lastBuffered = buffered; + $(elem).triggerHandler('progress'); + } + }; - if(hasNative && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay])') && (!data || data.isActive == 'html5')){ - //IE controls not visible bug - $(this).prop('preload', 'metadata').mediaLoad(); - } else { - selectSource(this, data); - } - - if(hasNative){ - - //FF progress bug - (function(){ - var bufferTimer; - var lastBuffered; - var elem = this; - var getBufferedString = function(){ - var buffered = $.prop(elem, 'buffered'); - if(!buffered){return;} - var bufferString = ""; - for(var i = 0, len = buffered.length; i < len;i++){ - bufferString += buffered.end(i); + $(this) + .on({ + 'play loadstart progress': function(e){ + if(e.type == 'progress'){ + lastBuffered = getBufferedString(); } - return bufferString; - }; - var testBuffer = function(){ - var buffered = getBufferedString(); - if(buffered != lastBuffered){ - lastBuffered = buffered; - $(elem).triggerHandler('progress'); + clearTimeout(bufferTimer); + bufferTimer = setTimeout(testBuffer, 999); + }, + 'emptied stalled mediaerror abort suspend': function(e){ + if(e.type == 'emptied'){ + lastBuffered = false; } - }; - - $(this) - .on({ - 'play loadstart progress': function(e){ - if(e.type == 'progress'){ - lastBuffered = getBufferedString(); - } - clearTimeout(bufferTimer); - bufferTimer = setTimeout(testBuffer, 999); - }, - 'emptied stalled mediaerror abort suspend': function(e){ - if(e.type == 'emptied'){ - lastBuffered = false; - } - clearTimeout(bufferTimer); - } - }) - ; - })(); + clearTimeout(bufferTimer); + } + }) + ; + if('ActiveXObject' in window && $.prop(this, 'paused') && !$.prop(this, 'readyState') && $(this).is('audio[preload="none"][controls]:not([autoplay],.nonnative-api-active)')){ + $(this).prop('preload', 'metadata').mediaLoad(); } - - }) - ; - if(!loadTrackUi.loaded && $('track', media).length){ - loadTrackUi(); + } } - media = null; + + }; + var handleMedia = false; + + + webshims.ready('dom-support', function(){ + handleMedia = true; + webshims.addReady(function(context, insertedElement){ + var media = $('video, audio', context) + .add(insertedElement.filter('video, audio')) + .each(testFixMedia) + ; + if(!loadTrackUi.loaded && $('track', media).length){ + loadTrackUi(); + } + media = null; + }); }); + + if(hasNative && !handleMedia){ + webshims.addReady(function(context, insertedElement){ + if(!handleMedia){ + $('video, audio', context) + .add(insertedElement.filter('video, audio')) + .each(function(){ + if(!mediaelement.canNativePlaySrces(this) || (!loadTrackUi.loaded && $('track', this).length)){ + loadThird(); + handleMedia = true; + return false; + } + }) + ; + } + }); + } }; if(Modernizr.track && !bugs.track){ webshims.defineProperty(TextTrack.prototype, 'shimActiveCues', { get: function(){ \ No newline at end of file