vendor/assets/javascripts/webshims/shims/combos/25.js in webshims-rails-1.13.0 vs vendor/assets/javascripts/webshims/shims/combos/25.js in webshims-rails-1.14.1

- old
+ new

@@ -1,1678 +1,6 @@ -/*! 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 swfmini = function() { - var wasRemoved = function(){webshims.error('This method was removed from swfmini');}; - var UNDEF = "undefined", - OBJECT = "object", - webshims = window.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], - - isDomLoaded = false, - 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; - } - } - else if (typeof win.ActiveXObject != UNDEF) { - try { - 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)]; - } - } - } - catch(e) {} - } - return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; - }(); - - - function callDomLoadFunctions() { - if (isDomLoaded) { return; } - isDomLoaded = true; - var dl = domLoadFnArr.length; - for (var i = 0; i < dl; i++) { - domLoadFnArr[i](); - } - } - - function addDomLoadEvent(fn) { - if (isDomLoaded) { - fn(); - } - else { - domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ - } - } - - - /* Main function - - Will preferably execute onDomLoad, otherwise onload (as a fallback) - */ - function main() { - if (plugin) { - testPlayerVersion(); - } - } - - /* 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)]; - } - } - else if (counter < 10) { - counter++; - setTimeout(arguments.callee, 10); - return; - } - b.removeChild(o); - t = null; - })(); - } - } - - - function createElement(el) { - return doc.createElement(el); - } - - - /* 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; - } - - - - - - webshims.ready('DOM', callDomLoadFunctions); - - webshims.loader.addModule('swfmini-embed', {d: ['swfmini']}); - var loadEmbed = hasPlayerVersion('9.0.0') ? - function(){ - webshims.loader.loadList(['swfmini-embed']); - return true; - } : - webshims.$.noop - ; - - if(!Modernizr.video){ - loadEmbed(); - } else { - webshims.ready('WINDOWLOAD', loadEmbed); - } - - return { - /* Public API - - Reference: http://code.google.com/p/swfobject/wiki/documentation - */ - registerObject: wasRemoved, - - getObjectById: wasRemoved, - - embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { - var args = arguments; - if(loadEmbed()){ - webshims.ready('swfmini-embed', function(){ - swfmini.embedSWF.apply(swfmini, args); - }); - } else if(callbackFn) { - callbackFn({success:false, id:replaceElemIdStr}); - } - }, - - switchOffAutoHideShow: function() { - autoHideShow = false; - }, - - ua: ua, - - 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); - } - else { - return undefined; - } - }, - - showExpressInstall: wasRemoved, - - removeSWF: wasRemoved, - - createCSS: wasRemoved, - - addDomLoadEvent: addDomLoadEvent, - - addLoadEvent: wasRemoved, - - - // For internal usage only - expressInstallCallback: wasRemoved - }; -}(); - -webshims.isReady('swfmini', true); -;// Copyright 2009-2012 by contributors, MIT License -// vim: ts=4 sts=4 sw=4 expandtab - -(function () { -setTimeout(function(){ - webshims.isReady('es5', true); -}); -/** - * Brings an environment as close to ECMAScript 5 compliance - * as is possible with the facilities of erstwhile engines. - * - * Annotated ES5: http://es5.github.com/ (specific links below) - * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf - * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/ - */ - -// -// Function -// ======== -// - -// ES-5 15.3.4.5 -// http://es5.github.com/#x15.3.4.5 - -function Empty() {} - -if (!Function.prototype.bind) { - Function.prototype.bind = function bind(that) { // .length is 1 - // 1. Let Target be the this value. - var target = this; - // 2. If IsCallable(Target) is false, throw a TypeError exception. - if (typeof target != "function") { - throw new TypeError("Function.prototype.bind called on incompatible " + target); - } - // 3. Let A be a new (possibly empty) internal list of all of the - // argument values provided after thisArg (arg1, arg2 etc), in order. - // XXX slicedArgs will stand in for "A" if used - var args = _Array_slice_.call(arguments, 1); // for normal call - // 4. Let F be a new native ECMAScript object. - // 11. Set the [[Prototype]] internal property of F to the standard - // built-in Function prototype object as specified in 15.3.3.1. - // 12. Set the [[Call]] internal property of F as described in - // 15.3.4.5.1. - // 13. Set the [[Construct]] internal property of F as described in - // 15.3.4.5.2. - // 14. Set the [[HasInstance]] internal property of F as described in - // 15.3.4.5.3. - var bound = function () { - - if (this instanceof bound) { - // 15.3.4.5.2 [[Construct]] - // When the [[Construct]] internal method of a function object, - // F that was created using the bind function is called with a - // list of arguments ExtraArgs, the following steps are taken: - // 1. Let target be the value of F's [[TargetFunction]] - // internal property. - // 2. If target has no [[Construct]] internal method, a - // TypeError exception is thrown. - // 3. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Construct]] internal - // method of target providing args as the arguments. - - var result = target.apply( - this, - args.concat(_Array_slice_.call(arguments)) - ); - if (Object(result) === result) { - return result; - } - return this; - - } else { - // 15.3.4.5.1 [[Call]] - // When the [[Call]] internal method of a function object, F, - // which was created using the bind function is called with a - // this value and a list of arguments ExtraArgs, the following - // steps are taken: - // 1. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. - // 2. Let boundThis be the value of F's [[BoundThis]] internal - // property. - // 3. Let target be the value of F's [[TargetFunction]] internal - // property. - // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. - // 5. Return the result of calling the [[Call]] internal method - // of target providing boundThis as the this value and - // providing args as the arguments. - - // equiv: target.call(this, ...boundArgs, ...args) - return target.apply( - that, - args.concat(_Array_slice_.call(arguments)) - ); - - } - - }; - if(target.prototype) { - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - // Clean up dangling references. - Empty.prototype = null; - } - // XXX bound.length is never writable, so don't even try - // - // 15. If the [[Class]] internal property of Target is "Function", then - // a. Let L be the length property of Target minus the length of A. - // b. Set the length own property of F to either 0 or L, whichever is - // larger. - // 16. Else set the length own property of F to 0. - // 17. Set the attributes of the length own property of F to the values - // specified in 15.3.5.1. - - // TODO - // 18. Set the [[Extensible]] internal property of F to true. - - // TODO - // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). - // 20. Call the [[DefineOwnProperty]] internal method of F with - // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: - // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and - // false. - // 21. Call the [[DefineOwnProperty]] internal method of F with - // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, - // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, - // and false. - - // TODO - // NOTE Function objects created using Function.prototype.bind do not - // have a prototype property or the [[Code]], [[FormalParameters]], and - // [[Scope]] internal properties. - // XXX can't delete prototype in pure-js. - - // 22. Return F. - return bound; - }; -} - -// Shortcut to an often accessed properties, in order to avoid multiple -// dereference that costs universally. -// _Please note: Shortcuts are defined after `Function.prototype.bind` as we -// us it in defining shortcuts. -var call = Function.prototype.call; -var prototypeOfArray = Array.prototype; -var prototypeOfObject = Object.prototype; -var _Array_slice_ = prototypeOfArray.slice; -// Having a toString local variable name breaks in Opera so use _toString. -var _toString = call.bind(prototypeOfObject.toString); -var owns = call.bind(prototypeOfObject.hasOwnProperty); - -// If JS engine supports accessors creating shortcuts. -var defineGetter; -var defineSetter; -var lookupGetter; -var lookupSetter; -var supportsAccessors; -if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { - defineGetter = call.bind(prototypeOfObject.__defineGetter__); - defineSetter = call.bind(prototypeOfObject.__defineSetter__); - lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); - lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); -} - -// -// Array -// ===== -// - -// ES5 15.4.4.12 -// http://es5.github.com/#x15.4.4.12 -// Default value for second param -// [bugfix, ielt9, old browsers] -// IE < 9 bug: [1,2].splice(0).join("") == "" but should be "12" -if ([1,2].splice(0).length != 2) { - var array_splice = Array.prototype.splice; - - if(function() { // test IE < 9 to splice bug - see issue #138 - function makeArray(l) { - var a = []; - while (l--) { - a.unshift(l) - } - return a - } - - var array = [] - , lengthBefore - ; - - array.splice.bind(array, 0, 0).apply(null, makeArray(20)); - array.splice.bind(array, 0, 0).apply(null, makeArray(26)); - - lengthBefore = array.length; //20 - array.splice(5, 0, "XXX"); // add one element - - if(lengthBefore + 1 == array.length) { - return true;// has right splice implementation without bugs - } - // else { - // IE8 bug - // } - }()) {//IE 6/7 - Array.prototype.splice = function(start, deleteCount) { - if (!arguments.length) { - return []; - } else { - return array_splice.apply(this, [ - start === void 0 ? 0 : start, - deleteCount === void 0 ? (this.length - start) : deleteCount - ].concat(_Array_slice_.call(arguments, 2))) - } - }; - } - else {//IE8 - Array.prototype.splice = function(start, deleteCount) { - var result - , args = _Array_slice_.call(arguments, 2) - , addElementsCount = args.length - ; - - if(!arguments.length) { - return []; - } - - if(start === void 0) { // default - start = 0; - } - if(deleteCount === void 0) { // default - deleteCount = this.length - start; - } - - if(addElementsCount > 0) { - if(deleteCount <= 0) { - if(start == this.length) { // tiny optimisation #1 - this.push.apply(this, args); - return []; - } - - if(start == 0) { // tiny optimisation #2 - this.unshift.apply(this, args); - return []; - } - } - - // Array.prototype.splice implementation - result = _Array_slice_.call(this, start, start + deleteCount);// delete part - args.push.apply(args, _Array_slice_.call(this, start + deleteCount, this.length));// right part - args.unshift.apply(args, _Array_slice_.call(this, 0, start));// left part - - // delete all items from this array and replace it to 'left part' + _Array_slice_.call(arguments, 2) + 'right part' - args.unshift(0, this.length); - - array_splice.apply(this, args); - - return result; - } - - return array_splice.call(this, start, deleteCount); - } - - } -} - -// ES5 15.4.4.12 -// http://es5.github.com/#x15.4.4.13 -// Return len+argCount. -// [bugfix, ielt8] -// IE < 8 bug: [].unshift(0) == undefined but should be "1" -if ([].unshift(0) != 1) { - var array_unshift = Array.prototype.unshift; - Array.prototype.unshift = function() { - array_unshift.apply(this, arguments); - return this.length; - }; -} - -// ES5 15.4.3.2 -// http://es5.github.com/#x15.4.3.2 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray -if (!Array.isArray) { - Array.isArray = function isArray(obj) { - return _toString(obj) == "[object Array]"; - }; -} - -// The IsCallable() check in the Array functions -// has been replaced with a strict check on the -// internal class of the object to trap cases where -// the provided function was actually a regular -// expression literal, which in V8 and -// JavaScriptCore is a typeof "function". Only in -// V8 are regular expression literals permitted as -// reduce parameters, so it is desirable in the -// general case for the shim to match the more -// strict and common behavior of rejecting regular -// expressions. - -// ES5 15.4.4.18 -// http://es5.github.com/#x15.4.4.18 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach - -// Check failure of by-index access of string characters (IE < 9) -// and failure of `0 in boxedString` (Rhino) -var boxedString = Object("a"), - splitString = boxedString[0] != "a" || !(0 in boxedString); - -if (!Array.prototype.forEach) { - Array.prototype.forEach = function forEach(fun /*, thisp*/) { - var object = toObject(this), - self = splitString && _toString(this) == "[object String]" ? - this.split("") : - object, - thisp = arguments[1], - i = -1, - length = self.length >>> 0; - - // If no callback function or if callback is not a callable function - if (_toString(fun) != "[object Function]") { - throw new TypeError(); // TODO message - } - - while (++i < length) { - if (i in self) { - // Invoke the callback function with call, passing arguments: - // context, property value, property key, thisArg object - // context - fun.call(thisp, self[i], i, object); - } - } - }; -} - -// ES5 15.4.4.19 -// http://es5.github.com/#x15.4.4.19 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map -if (!Array.prototype.map) { - Array.prototype.map = function map(fun /*, thisp*/) { - var object = toObject(this), - self = splitString && _toString(this) == "[object String]" ? - this.split("") : - object, - length = self.length >>> 0, - result = Array(length), - thisp = arguments[1]; - - // If no callback function or if callback is not a callable function - if (_toString(fun) != "[object Function]") { - throw new TypeError(fun + " is not a function"); - } - - for (var i = 0; i < length; i++) { - if (i in self) - result[i] = fun.call(thisp, self[i], i, object); - } - return result; - }; -} - -// ES5 15.4.4.20 -// http://es5.github.com/#x15.4.4.20 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter -if (!Array.prototype.filter) { - Array.prototype.filter = function filter(fun /*, thisp */) { - var object = toObject(this), - self = splitString && _toString(this) == "[object String]" ? - this.split("") : - object, - length = self.length >>> 0, - result = [], - value, - thisp = arguments[1]; - - // If no callback function or if callback is not a callable function - if (_toString(fun) != "[object Function]") { - throw new TypeError(fun + " is not a function"); - } - - for (var i = 0; i < length; i++) { - if (i in self) { - value = self[i]; - if (fun.call(thisp, value, i, object)) { - result.push(value); - } - } - } - return result; - }; -} - -// ES5 15.4.4.16 -// http://es5.github.com/#x15.4.4.16 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every -if (!Array.prototype.every) { - Array.prototype.every = function every(fun /*, thisp */) { - var object = toObject(this), - self = splitString && _toString(this) == "[object String]" ? - this.split("") : - object, - length = self.length >>> 0, - thisp = arguments[1]; - - // If no callback function or if callback is not a callable function - if (_toString(fun) != "[object Function]") { - throw new TypeError(fun + " is not a function"); - } - - for (var i = 0; i < length; i++) { - if (i in self && !fun.call(thisp, self[i], i, object)) { - return false; - } - } - return true; - }; -} - -// ES5 15.4.4.17 -// http://es5.github.com/#x15.4.4.17 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some -if (!Array.prototype.some) { - Array.prototype.some = function some(fun /*, thisp */) { - var object = toObject(this), - self = splitString && _toString(this) == "[object String]" ? - this.split("") : - object, - length = self.length >>> 0, - thisp = arguments[1]; - - // If no callback function or if callback is not a callable function - if (_toString(fun) != "[object Function]") { - throw new TypeError(fun + " is not a function"); - } - - for (var i = 0; i < length; i++) { - if (i in self && fun.call(thisp, self[i], i, object)) { - return true; - } - } - return false; - }; -} - -// ES5 15.4.4.21 -// http://es5.github.com/#x15.4.4.21 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce -if (!Array.prototype.reduce) { - Array.prototype.reduce = function reduce(fun /*, initial*/) { - var object = toObject(this), - self = splitString && _toString(this) == "[object String]" ? - this.split("") : - object, - length = self.length >>> 0; - - // If no callback function or if callback is not a callable function - if (_toString(fun) != "[object Function]") { - throw new TypeError(fun + " is not a function"); - } - - // no value to return if no initial value and an empty array - if (!length && arguments.length == 1) { - throw new TypeError("reduce of empty array with no initial value"); - } - - var i = 0; - var result; - if (arguments.length >= 2) { - result = arguments[1]; - } else { - do { - if (i in self) { - result = self[i++]; - break; - } - - // if array contains no values, no initial value to return - if (++i >= length) { - throw new TypeError("reduce of empty array with no initial value"); - } - } while (true); - } - - for (; i < length; i++) { - if (i in self) { - result = fun.call(void 0, result, self[i], i, object); - } - } - - return result; - }; -} - -// ES5 15.4.4.22 -// http://es5.github.com/#x15.4.4.22 -// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight -if (!Array.prototype.reduceRight) { - Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { - var object = toObject(this), - self = splitString && _toString(this) == "[object String]" ? - this.split("") : - object, - length = self.length >>> 0; - - // If no callback function or if callback is not a callable function - if (_toString(fun) != "[object Function]") { - throw new TypeError(fun + " is not a function"); - } - - // no value to return if no initial value, empty array - if (!length && arguments.length == 1) { - throw new TypeError("reduceRight of empty array with no initial value"); - } - - var result, i = length - 1; - if (arguments.length >= 2) { - result = arguments[1]; - } else { - do { - if (i in self) { - result = self[i--]; - break; - } - - // if array contains no values, no initial value to return - if (--i < 0) { - throw new TypeError("reduceRight of empty array with no initial value"); - } - } while (true); - } - - if (i < 0) { - return result; - } - - do { - if (i in this) { - result = fun.call(void 0, result, self[i], i, object); - } - } while (i--); - - return result; - }; -} - -// ES5 15.4.4.14 -// http://es5.github.com/#x15.4.4.14 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf -if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { - Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { - var self = splitString && _toString(this) == "[object String]" ? - this.split("") : - toObject(this), - length = self.length >>> 0; - - if (!length) { - return -1; - } - - var i = 0; - if (arguments.length > 1) { - i = toInteger(arguments[1]); - } - - // handle negative indices - i = i >= 0 ? i : Math.max(0, length + i); - for (; i < length; i++) { - if (i in self && self[i] === sought) { - return i; - } - } - return -1; - }; -} - -// ES5 15.4.4.15 -// http://es5.github.com/#x15.4.4.15 -// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf -if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { - Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { - var self = splitString && _toString(this) == "[object String]" ? - this.split("") : - toObject(this), - length = self.length >>> 0; - - if (!length) { - return -1; - } - var i = length - 1; - if (arguments.length > 1) { - i = Math.min(i, toInteger(arguments[1])); - } - // handle negative indices - i = i >= 0 ? i : length - Math.abs(i); - for (; i >= 0; i--) { - if (i in self && sought === self[i]) { - return i; - } - } - return -1; - }; -} - -// -// Object -// ====== -// - -// ES5 15.2.3.14 -// http://es5.github.com/#x15.2.3.14 -if (!Object.keys) { - // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation - var hasDontEnumBug = true, - dontEnums = [ - "toString", - "toLocaleString", - "valueOf", - "hasOwnProperty", - "isPrototypeOf", - "propertyIsEnumerable", - "constructor" - ], - dontEnumsLength = dontEnums.length; - - for (var key in {"toString": null}) { - hasDontEnumBug = false; - } - - Object.keys = function keys(object) { - - if ( - (typeof object != "object" && typeof object != "function") || - object === null - ) { - throw new TypeError("Object.keys called on a non-object"); - } - - var keys = []; - for (var name in object) { - if (owns(object, name)) { - keys.push(name); - } - } - - if (hasDontEnumBug) { - for (var i = 0, ii = dontEnumsLength; i < ii; i++) { - var dontEnum = dontEnums[i]; - if (owns(object, dontEnum)) { - keys.push(dontEnum); - } - } - } - return keys; - }; - -} - -// -// Date -// ==== -// - -// ES5 15.9.5.43 -// http://es5.github.com/#x15.9.5.43 -// This function returns a String value represent the instance in time -// represented by this Date object. The format of the String is the Date Time -// string format defined in 15.9.1.15. All fields are present in the String. -// The time zone is always UTC, denoted by the suffix Z. If the time value of -// this object is not a finite Number a RangeError exception is thrown. -var negativeDate = -62198755200000, - negativeYearString = "-000001"; -if ( - !Date.prototype.toISOString || - (new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1) -) { - Date.prototype.toISOString = function toISOString() { - var result, length, value, year, month; - if (!isFinite(this)) { - throw new RangeError("Date.prototype.toISOString called on non-finite value."); - } - - year = this.getUTCFullYear(); - - month = this.getUTCMonth(); - // see https://github.com/kriskowal/es5-shim/issues/111 - year += Math.floor(month / 12); - month = (month % 12 + 12) % 12; - - // the date time string format is specified in 15.9.1.15. - result = [month + 1, this.getUTCDate(), - this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()]; - year = ( - (year < 0 ? "-" : (year > 9999 ? "+" : "")) + - ("00000" + Math.abs(year)) - .slice(0 <= year && year <= 9999 ? -4 : -6) - ); - - length = result.length; - while (length--) { - value = result[length]; - // pad months, days, hours, minutes, and seconds to have two - // digits. - if (value < 10) { - result[length] = "0" + value; - } - } - // pad milliseconds to have three digits. - return ( - year + "-" + result.slice(0, 2).join("-") + - "T" + result.slice(2).join(":") + "." + - ("000" + this.getUTCMilliseconds()).slice(-3) + "Z" - ); - }; -} - - -// ES5 15.9.5.44 -// http://es5.github.com/#x15.9.5.44 -// This function provides a String representation of a Date object for use by -// JSON.stringify (15.12.3). -var dateToJSONIsSupported = false; -try { - dateToJSONIsSupported = ( - Date.prototype.toJSON && - new Date(NaN).toJSON() === null && - new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && - Date.prototype.toJSON.call({ // generic - toISOString: function () { - return true; - } - }) - ); -} catch (e) { -} -if (!dateToJSONIsSupported) { - Date.prototype.toJSON = function toJSON(key) { - // When the toJSON method is called with argument key, the following - // steps are taken: - - // 1. Let O be the result of calling ToObject, giving it the this - // value as its argument. - // 2. Let tv be toPrimitive(O, hint Number). - var o = Object(this), - tv = toPrimitive(o), - toISO; - // 3. If tv is a Number and is not finite, return null. - if (typeof tv === "number" && !isFinite(tv)) { - return null; - } - // 4. Let toISO be the result of calling the [[Get]] internal method of - // O with argument "toISOString". - toISO = o.toISOString; - // 5. If IsCallable(toISO) is false, throw a TypeError exception. - if (typeof toISO != "function") { - throw new TypeError("toISOString property is not callable"); - } - // 6. Return the result of calling the [[Call]] internal method of - // toISO with O as the this value and an empty argument list. - return toISO.call(o); - - // NOTE 1 The argument is ignored. - - // NOTE 2 The toJSON function is intentionally generic; it does not - // require that its this value be a Date object. Therefore, it can be - // transferred to other kinds of objects for use as a method. However, - // it does require that any such object have a toISOString method. An - // object is free to use the argument key to filter its - // stringification. - }; -} - -// ES5 15.9.4.2 -// http://es5.github.com/#x15.9.4.2 -// based on work shared by Daniel Friesen (dantman) -// http://gist.github.com/303249 -if (!Date.parse || "Date.parse is buggy") { - // XXX global assignment won't work in embeddings that use - // an alternate object for the context. - Date = (function(NativeDate) { - - // Date.length === 7 - function Date(Y, M, D, h, m, s, ms) { - var length = arguments.length; - if (this instanceof NativeDate) { - var date = length == 1 && String(Y) === Y ? // isString(Y) - // We explicitly pass it through parse: - new NativeDate(Date.parse(Y)) : - // We have to manually make calls depending on argument - // length here - length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) : - length >= 6 ? new NativeDate(Y, M, D, h, m, s) : - length >= 5 ? new NativeDate(Y, M, D, h, m) : - length >= 4 ? new NativeDate(Y, M, D, h) : - length >= 3 ? new NativeDate(Y, M, D) : - length >= 2 ? new NativeDate(Y, M) : - length >= 1 ? new NativeDate(Y) : - new NativeDate(); - // Prevent mixups with unfixed Date object - date.constructor = Date; - return date; - } - return NativeDate.apply(this, arguments); - }; - - // 15.9.1.15 Date Time String Format. - var isoDateExpression = new RegExp("^" + - "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign + - // 6-digit extended year - "(?:-(\\d{2})" + // optional month capture - "(?:-(\\d{2})" + // optional day capture - "(?:" + // capture hours:minutes:seconds.milliseconds - "T(\\d{2})" + // hours capture - ":(\\d{2})" + // minutes capture - "(?:" + // optional :seconds.milliseconds - ":(\\d{2})" + // seconds capture - "(?:(\\.\\d{1,}))?" + // milliseconds capture - ")?" + - "(" + // capture UTC offset component - "Z|" + // UTC capture - "(?:" + // offset specifier +/-hours:minutes - "([-+])" + // sign capture - "(\\d{2})" + // hours offset capture - ":(\\d{2})" + // minutes offset capture - ")" + - ")?)?)?)?" + - "$"); - - var months = [ - 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 - ]; - - function dayFromMonth(year, month) { - var t = month > 1 ? 1 : 0; - return ( - months[month] + - Math.floor((year - 1969 + t) / 4) - - Math.floor((year - 1901 + t) / 100) + - Math.floor((year - 1601 + t) / 400) + - 365 * (year - 1970) - ); - } - - // Copy any custom methods a 3rd party library may have added - for (var key in NativeDate) { - Date[key] = NativeDate[key]; - } - - // Copy "native" methods explicitly; they may be non-enumerable - Date.now = NativeDate.now; - Date.UTC = NativeDate.UTC; - Date.prototype = NativeDate.prototype; - Date.prototype.constructor = Date; - - // Upgrade Date.parse to handle simplified ISO 8601 strings - Date.parse = function parse(string) { - var match = isoDateExpression.exec(string); - if (match) { - // parse months, days, hours, minutes, seconds, and milliseconds - // provide default values if necessary - // parse the UTC offset component - var year = Number(match[1]), - month = Number(match[2] || 1) - 1, - day = Number(match[3] || 1) - 1, - hour = Number(match[4] || 0), - minute = Number(match[5] || 0), - second = Number(match[6] || 0), - millisecond = Math.floor(Number(match[7] || 0) * 1000), - // When time zone is missed, local offset should be used - // (ES 5.1 bug) - // see https://bugs.ecmascript.org/show_bug.cgi?id=112 - offset = !match[4] || match[8] ? - 0 : Number(new NativeDate(1970, 0)), - signOffset = match[9] === "-" ? 1 : -1, - hourOffset = Number(match[10] || 0), - minuteOffset = Number(match[11] || 0), - result; - if ( - hour < ( - minute > 0 || second > 0 || millisecond > 0 ? - 24 : 25 - ) && - minute < 60 && second < 60 && millisecond < 1000 && - month > -1 && month < 12 && hourOffset < 24 && - minuteOffset < 60 && // detect invalid offsets - day > -1 && - day < ( - dayFromMonth(year, month + 1) - - dayFromMonth(year, month) - ) - ) { - result = ( - (dayFromMonth(year, month) + day) * 24 + - hour + - hourOffset * signOffset - ) * 60; - result = ( - (result + minute + minuteOffset * signOffset) * 60 + - second - ) * 1000 + millisecond + offset; - if (-8.64e15 <= result && result <= 8.64e15) { - return result; - } - } - return NaN; - } - return NativeDate.parse.apply(this, arguments); - }; - - return Date; - })(Date); -} - -// ES5 15.9.4.4 -// http://es5.github.com/#x15.9.4.4 -if (!Date.now) { - Date.now = function now() { - return new Date().getTime(); - }; -} - - -// -// Number -// ====== -// - -// ES5.1 15.7.4.5 -// http://es5.github.com/#x15.7.4.5 -if (!Number.prototype.toFixed || (0.00008).toFixed(3) !== '0.000' || (0.9).toFixed(0) === '0' || (1.255).toFixed(2) !== '1.25' || (1000000000000000128).toFixed(0) !== "1000000000000000128") { - // Hide these variables and functions - (function () { - var base, size, data, i; - - base = 1e7; - size = 6; - data = [0, 0, 0, 0, 0, 0]; - - function multiply(n, c) { - var i = -1; - while (++i < size) { - c += n * data[i]; - data[i] = c % base; - c = Math.floor(c / base); - } - } - - function divide(n) { - var i = size, c = 0; - while (--i >= 0) { - c += data[i]; - data[i] = Math.floor(c / n); - c = (c % n) * base; - } - } - - function toString() { - var i = size; - var s = ''; - while (--i >= 0) { - if (s !== '' || i === 0 || data[i] !== 0) { - var t = String(data[i]); - if (s === '') { - s = t; - } else { - s += '0000000'.slice(0, 7 - t.length) + t; - } - } - } - return s; - } - - function pow(x, n, acc) { - return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc))); - } - - function log(x) { - var n = 0; - while (x >= 4096) { - n += 12; - x /= 4096; - } - while (x >= 2) { - n += 1; - x /= 2; - } - return n; - } - - Number.prototype.toFixed = function (fractionDigits) { - var f, x, s, m, e, z, j, k; - - // Test for NaN and round fractionDigits down - f = Number(fractionDigits); - f = f !== f ? 0 : Math.floor(f); - - if (f < 0 || f > 20) { - throw new RangeError("Number.toFixed called with invalid number of decimals"); - } - - x = Number(this); - - // Test for NaN - if (x !== x) { - return "NaN"; - } - - // If it is too big or small, return the string value of the number - if (x <= -1e21 || x >= 1e21) { - return String(x); - } - - s = ""; - - if (x < 0) { - s = "-"; - x = -x; - } - - m = "0"; - - if (x > 1e-21) { - // 1e-21 < x < 1e21 - // -70 < log2(x) < 70 - e = log(x * pow(2, 69, 1)) - 69; - z = (e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1)); - z *= 0x10000000000000; // Math.pow(2, 52); - e = 52 - e; - - // -18 < e < 122 - // x = z / 2 ^ e - if (e > 0) { - multiply(0, z); - j = f; - - while (j >= 7) { - multiply(1e7, 0); - j -= 7; - } - - multiply(pow(10, j, 1), 0); - j = e - 1; - - while (j >= 23) { - divide(1 << 23); - j -= 23; - } - - divide(1 << j); - multiply(1, 1); - divide(2); - m = toString(); - } else { - multiply(0, z); - multiply(1 << (-e), 0); - m = toString() + '0.00000000000000000000'.slice(2, 2 + f); - } - } - - if (f > 0) { - k = m.length; - - if (k <= f) { - m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m; - } else { - m = s + m.slice(0, k - f) + '.' + m.slice(k - f); - } - } else { - m = s + m; - } - - return m; - } - }()); -} - - -// -// String -// ====== -// - - -// ES5 15.5.4.14 -// http://es5.github.com/#x15.5.4.14 - -// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] -// Many browsers do not split properly with regular expressions or they -// do not perform the split correctly under obscure conditions. -// See http://blog.stevenlevithan.com/archives/cross-browser-split -// I've tested in many browsers and this seems to cover the deviant ones: -// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] -// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] -// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not -// [undefined, "t", undefined, "e", ...] -// ''.split(/.?/) should be [], not [""] -// '.'.split(/()()/) should be ["."], not ["", "", "."] - -var string_split = String.prototype.split; -if ( - 'ab'.split(/(?:ab)*/).length !== 2 || - '.'.split(/(.?)(.?)/).length !== 4 || - 'tesst'.split(/(s)*/)[1] === "t" || - ''.split(/.?/).length === 0 || - '.'.split(/()()/).length > 1 -) { - (function () { - var compliantExecNpcg = /()??/.exec("")[1] === void 0; // NPCG: nonparticipating capturing group - - String.prototype.split = function (separator, limit) { - var string = this; - if (separator === void 0 && limit === 0) - return []; - - // If `separator` is not a regex, use native split - if (Object.prototype.toString.call(separator) !== "[object RegExp]") { - return string_split.apply(this, arguments); - } - - var output = [], - flags = (separator.ignoreCase ? "i" : "") + - (separator.multiline ? "m" : "") + - (separator.extended ? "x" : "") + // Proposed for ES6 - (separator.sticky ? "y" : ""), // Firefox 3+ - lastLastIndex = 0, - // Make `global` and avoid `lastIndex` issues by working with a copy - separator = new RegExp(separator.source, flags + "g"), - separator2, match, lastIndex, lastLength; - string += ""; // Type-convert - if (!compliantExecNpcg) { - // Doesn't need flags gy, but they don't hurt - separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); - } - /* Values for `limit`, per the spec: - * If undefined: 4294967295 // Math.pow(2, 32) - 1 - * If 0, Infinity, or NaN: 0 - * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; - * If negative number: 4294967296 - Math.floor(Math.abs(limit)) - * If other: Type-convert, then use the above rules - */ - limit = limit === void 0 ? - -1 >>> 0 : // Math.pow(2, 32) - 1 - limit >>> 0; // ToUint32(limit) - while (match = separator.exec(string)) { - // `separator.lastIndex` is not reliable cross-browser - lastIndex = match.index + match[0].length; - if (lastIndex > lastLastIndex) { - output.push(string.slice(lastLastIndex, match.index)); - // Fix browsers whose `exec` methods don't consistently return `undefined` for - // nonparticipating capturing groups - if (!compliantExecNpcg && match.length > 1) { - match[0].replace(separator2, function () { - for (var i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === void 0) { - match[i] = void 0; - } - } - }); - } - if (match.length > 1 && match.index < string.length) { - Array.prototype.push.apply(output, match.slice(1)); - } - lastLength = match[0].length; - lastLastIndex = lastIndex; - if (output.length >= limit) { - break; - } - } - if (separator.lastIndex === match.index) { - separator.lastIndex++; // Avoid an infinite loop - } - } - if (lastLastIndex === string.length) { - if (lastLength || !separator.test("")) { - output.push(""); - } - } else { - output.push(string.slice(lastLastIndex)); - } - return output.length > limit ? output.slice(0, limit) : output; - }; - }()); - -// [bugfix, chrome] -// If separator is undefined, then the result array contains just one String, -// which is the this value (converted to a String). If limit is not undefined, -// then the output array is truncated so that it contains no more than limit -// elements. -// "0".split(undefined, 0) -> [] -} else if ("0".split(void 0, 0).length) { - String.prototype.split = function(separator, limit) { - if (separator === void 0 && limit === 0) return []; - return string_split.apply(this, arguments); - } -} - - -// ECMA-262, 3rd B.2.3 -// Note an ECMAScript standart, although ECMAScript 3rd Edition has a -// non-normative section suggesting uniform semantics and it should be -// normalized across all browsers -// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE -if("".substr && "0b".substr(-1) !== "b") { - var string_substr = String.prototype.substr; - /** - * Get the substring of a string - * @param {integer} start where to start the substring - * @param {integer} length how many characters to return - * @return {string} - */ - String.prototype.substr = function(start, length) { - return string_substr.call( - this, - start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start, - length - ); - } -} - -// ES5 15.5.4.20 -// http://es5.github.com/#x15.5.4.20 -var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + - "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + - "\u2029\uFEFF"; -if (!String.prototype.trim || ws.trim()) { - // http://blog.stevenlevithan.com/archives/faster-trim-javascript - // http://perfectionkills.com/whitespace-deviations/ - ws = "[" + ws + "]"; - var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), - trimEndRegexp = new RegExp(ws + ws + "*$"); - String.prototype.trim = function trim() { - if (this === void 0 || this === null) { - throw new TypeError("can't convert "+this+" to object"); - } - return String(this) - .replace(trimBeginRegexp, "") - .replace(trimEndRegexp, ""); - }; -} - -// -// Util -// ====== -// - -// ES5 9.4 -// http://es5.github.com/#x9.4 -// http://jsperf.com/to-integer - -function toInteger(n) { - n = +n; - if (n !== n) { // isNaN - n = 0; - } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - return n; -} - -function isPrimitive(input) { - var type = typeof input; - return ( - input === null || - type === "undefined" || - type === "boolean" || - type === "number" || - type === "string" - ); -} - -function toPrimitive(input) { - var val, valueOf, toString; - if (isPrimitive(input)) { - return input; - } - valueOf = input.valueOf; - if (typeof valueOf === "function") { - val = valueOf.call(input); - if (isPrimitive(val)) { - return val; - } - } - toString = input.toString; - if (typeof toString === "function") { - val = toString.call(input); - if (isPrimitive(val)) { - return val; - } - } - throw new TypeError(); -} - -// ES5 9.9 -// http://es5.github.com/#x9.9 -var toObject = function (o) { - if (o == null) { // this matches both null and undefined - throw new TypeError("can't convert "+o+" to object"); - } - return Object(o); -}; - -})(); - - - - -(function($, shims){ - var defineProperty = 'defineProperty'; - var advancedObjectProperties = !!(Object.create && Object.defineProperties && Object.getOwnPropertyDescriptor); - //safari5 has defineProperty-interface, but it can't be used on dom-object - //only do this test in non-IE browsers, because this hurts dhtml-behavior in some IE8 versions - if (advancedObjectProperties && Object[defineProperty] && Object.prototype.__defineGetter__) { - (function(){ - try { - var foo = document.createElement('foo'); - Object[defineProperty](foo, 'bar', { - get: function(){ - return true; - } - }); - advancedObjectProperties = !!foo.bar; - } - catch (e) { - advancedObjectProperties = false; - } - foo = null; - })(); - } - - Modernizr.objectAccessor = !!((advancedObjectProperties || (Object.prototype.__defineGetter__ && Object.prototype.__lookupSetter__))); - Modernizr.advancedObjectProperties = advancedObjectProperties; - -if((!advancedObjectProperties || !Object.create || !Object.defineProperties || !Object.getOwnPropertyDescriptor || !Object.defineProperty)){ - var call = Function.prototype.call; - var prototypeOfObject = Object.prototype; - var owns = call.bind(prototypeOfObject.hasOwnProperty); - - shims.objectCreate = function(proto, props, opts, no__proto__){ - var o; - var f = function(){}; - - f.prototype = proto; - o = new f(); - - if(!no__proto__ && !('__proto__' in o) && !Modernizr.objectAccessor){ - o.__proto__ = proto; - } - - if(props){ - shims.defineProperties(o, props); - } - - if(opts){ - o.options = $.extend(true, {}, o.options || {}, opts); - opts = o.options; - } - - if(o._create && $.isFunction(o._create)){ - o._create(opts); - } - return o; - }; - - shims.defineProperties = function(object, props){ - for (var name in props) { - if (owns(props, name)) { - shims.defineProperty(object, name, props[name]); - } - } - return object; - }; - - var descProps = ['configurable', 'enumerable', 'writable']; - shims.defineProperty = function(proto, property, descriptor){ - if(typeof descriptor != "object" || descriptor === null){return proto;} - - if(owns(descriptor, "value")){ - proto[property] = descriptor.value; - return proto; - } - - if(proto.__defineGetter__){ - if (typeof descriptor.get == "function") { - proto.__defineGetter__(property, descriptor.get); - } - if (typeof descriptor.set == "function"){ - proto.__defineSetter__(property, descriptor.set); - } - } - return proto; - }; - - shims.getPrototypeOf = function (object) { - return Object.getPrototypeOf && Object.getPrototypeOf(object) || object.__proto__ || object.constructor && object.constructor.prototype; - }; - - //based on http://www.refactory.org/s/object_getownpropertydescriptor/view/latest - shims.getOwnPropertyDescriptor = function(obj, prop){ - if (typeof obj !== "object" && typeof obj !== "function" || obj === null){ - throw new TypeError("Object.getOwnPropertyDescriptor called on a non-object"); - } - var descriptor; - if(Object.defineProperty && Object.getOwnPropertyDescriptor){ - try{ - descriptor = Object.getOwnPropertyDescriptor(obj, prop); - return descriptor; - } catch(e){} - } - descriptor = { - configurable: true, - enumerable: true, - writable: true, - value: undefined - }; - var getter = obj.__lookupGetter__ && obj.__lookupGetter__(prop), - setter = obj.__lookupSetter__ && obj.__lookupSetter__(prop) - ; - - if (!getter && !setter) { // not an accessor so return prop - if(!owns(obj, prop)){ - return; - } - descriptor.value = obj[prop]; - return descriptor; - } - - // there is an accessor, remove descriptor.writable; populate descriptor.get and descriptor.set - delete descriptor.writable; - delete descriptor.value; - descriptor.get = descriptor.set = undefined; - - if(getter){ - descriptor.get = getter; - } - - if(setter){ - descriptor.set = setter; - } - - return descriptor; - }; - -} -webshims.isReady('es5', true); -})(webshims.$, webshims); - - -; //this might was already extended by ES5 shim feature (function($){ "use strict"; var webshims = window.webshims; if(webshims.defineProperties){return;} @@ -1849,12 +177,12 @@ $(evtDel).off(evt, fn); } }); return this; }; - - var dataID = '_webshimsLib'+ (Math.round(Math.random() * 1000)); + var idCount = 0; + var dataID = '_webshims'+ (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){ @@ -1881,10 +209,39 @@ } }); return this.pushStack(elems); }; }); + + function clone(elem, dataAndEvents, uniqueIds){ + var cloned = $.clone( elem, dataAndEvents, false ); + $(cloned.querySelectorAll('.'+webshims.shadowClass)).detach(); + if(uniqueIds){ + idCount++; + $(cloned.querySelectorAll('[id]')).prop('id', function(i, id){ + return id +idCount; + }); + } else { + $(cloned.querySelectorAll('audio[id^="ID-"], video[id^="ID-"], label[id^="ID-"]')).removeAttr('id'); + } + return cloned; + } + + $.fn.clonePolyfill = function(dataAndEvents, uniqueIds){ + dataAndEvents = dataAndEvents || false; + return this + .map(function() { + var cloned = clone( this, dataAndEvents, uniqueIds ); + setTimeout(function(){ + if($.contains(document.body, cloned)){ + $(cloned).updatePolyfill(); + } + }); + return cloned; + }) + ; + }; //add support for $('video').trigger('play') in case extendNative is set to false if(!webshims.cfg.extendNative && !webshims.cfg.noTriggerOverride){ (function(oldTrigger){ $.event.trigger = function(event, data, elem, onlyHandlers){ @@ -2192,10 +549,11 @@ elem.eq(0).prop('id', id); } return id; }; })(), + shadowClass: 'wsshadow-'+(Date.now()), implement: function(elem, type){ var data = elementData(elem, 'implemented') || elementData(elem, 'implemented', {}); if(data[type]){ webshims.warn(type +' already implemented for element #'+elem.id); return false; @@ -2859,924 +1217,478 @@ } }); })(); }); -;webshims.register('filereader', function( $, webshims ){ +;webshim.register('filereader', function($, webshim, window, document, undefined, featureOptions){ "use strict"; - /** - * Code is based on https://github.com/Jahdrien/FileReader - * - */ - (function(){ - var swfobject = window.swfmini || window.swfobject; - - var readyCallbacks = $.Callbacks('once unique memory'), - inputsCount = 0, - currentTarget = null; - - // if native FileReader support, then dont add the polyfill and make the plugin do nothing - if (window.FileReader) { - $.fn.fileReader = function () { return this; } - return ; - } - - /** - * JQuery Plugin - */ - $.fn.fileReader = function( options ) { - if(this.length){ - options = $.extend($.fn.fileReader.defaults, options); - - var self = this; - readyCallbacks.add(function() { - return main(self, options); - }); - if ($.isFunction(options.callback)) readyCallbacks.add(options.callback); - - if (!FileAPIProxy.ready) { - FileAPIProxy.init(options); + var mOxie, moxie, hasXDomain; + var FormData = $.noop; + var sel = 'input[type="file"].ws-filereader'; + var loadMoxie = function (){ + webshim.loader.loadList(['moxie']); + }; + var _createFilePicker = function(){ + var $input, picker, $parent, onReset; + var input = this; + + if(webshim.implement(input, 'filepicker')){ + + input = this; + $input = $(this); + $parent = $input.parent(); + onReset = function(){ + if(!input.value){ + $input.prop('value', ''); } - } - return this; - }; - - /** - * Default options - * allows user set default options - */ - $.fn.fileReader.defaults = { - id : 'fileReaderSWFObject', // ID for the created swf object container, - multiple : null, - accept : null, - label : null, - extensions : null, - filereader : 'files/filereader.swf', // The path to the filereader swf file - expressInstall : null, // The path to the express install swf file - debugMode : false, - callback : false // Callback function when Filereader is ready - }; - - /** - * Plugin callback - * adds an input to registry - */ - var main = function(el, options) { - return el.each(function(i, input) { - input = $(input); - var id = input.attr('id'); - var multiple, accept, label; - if (!id) { - id = 'flashFileInput' + inputsCount; - input.attr('id', id); - inputsCount++; - } - multiple = input.prop('multiple'); - accept = input.data('swfaccept') || input.prop('accept') || options.accept; - label = input.jProp('labels') - .map(function(){ - return $(this).text(); - }).get().join(' ') || - input.data('swflabel') || - options.label; + }; - FileAPIProxy.inputs[id] = input; - FileAPIProxy.swfObject.add(id, multiple, accept, label, options.extensions); - - input.css('z-index', 0) - .mouseover(function (e) { - if (id !== currentTarget) { - e = e || window.event; - currentTarget = id; - FileAPIProxy.swfObject.mouseover(id); - FileAPIProxy.container - .height(input.outerHeight()) - .width(input.outerWidth()) - .css(input.offset()); - } - }) - .click(function(e) { - e.preventDefault(); - e.stopPropagation(); - e.stopImmediatePropagation(); - return false; - }); + $input.attr('tabindex', '-1').on('mousedown.filereaderwaiting click.filereaderwaiting', false); + $parent.addClass('ws-loading'); + picker = new mOxie.FileInput({ + browse_button: this, + accept: $.prop(this, 'accept'), + multiple: $.prop(this, 'multiple') }); - }; - - /** - * Flash FileReader Proxy - */ - window.FileAPIProxy = { - ready: false, - _inititalized: false, - init: function(o) { - var self = this; - this.debugMode = o.debugMode; - - if(!this.container){ - this.container = $('<div>').attr('id', o.id) - .wrap('<div>') - .parent() - .css({ - position:'fixed', - // top:'0px', - width:'1px', - height:'1px', - display:'inline-block', - background:'transparent', - 'z-index':99999 - }) - // Hands over mouse events to original input for css styles - .on('mouseover mouseout mousedown mouseup', function(evt) { - if(currentTarget){ - $('#' + currentTarget).trigger(evt.type); - } - }) - .appendTo('body'); - - swfobject.embedSWF(o.filereader, o.id, '100%', '100%', '10', o.expressInstall, {debugMode: o.debugMode ? true : ''}, {'wmode':'transparent','allowScriptAccess':'sameDomain'}, {}, function(e) { - self.swfObject = e.ref; - $(self.swfObject) - .css({ - display: 'block', - outline: 0 - }) - .attr('tabindex', 0); - - self.ready = e.success && typeof e.ref.add === "function"; - - if (self.ready) { - readyCallbacks.fire(); - } - }); - } - }, - swfObject: null, - container: null, - // Inputs Registry - inputs: {}, - // Readers Registry - readers: {}, - // Receives FileInput events - onFileInputEvent: function(evt) { - if (this.debugMode) console.info('FileInput Event ', evt.type, evt); - if (evt.target in this.inputs) { - var el = this.inputs[evt.target]; - evt.target = el[0]; - if( evt.type === 'change') { - webshims.data(evt.target, 'fileList', new FileList(evt.files)); + + $input.jProp('form').on('reset', function(){ + setTimeout(onReset); + }); + picker.onready = function(){ + $input.off('.fileraderwaiting'); + $parent.removeClass('ws-waiting'); + }; + + picker.onchange = function(e){ + webshim.data(input, 'fileList', e.target.files); + $input.trigger('change'); + }; + picker.onmouseenter = function(){ + $input.trigger('mouseover'); + $parent.addClass('ws-mouseenter'); + }; + picker.onmouseleave = function(){ + $input.trigger('mouseout'); + $parent.removeClass('ws-mouseenter'); + }; + picker.onmousedown = function(){ + $input.trigger('mousedown'); + $parent.addClass('ws-active'); + }; + picker.onmouseup = function(){ + $input.trigger('mouseup'); + $parent.removeClass('ws-active'); + }; + + webshim.data(input, 'filePicker', picker); + + webshim.ready('WINDOWLOAD', function(){ + var lastWidth; + $input.onWSOff('updateshadowdom', function(){ + var curWitdth = input.offsetWidth; + if(curWitdth && lastWidth != curWitdth){ + lastWidth = curWitdth; + picker.refresh(); } - el.trigger(evt); - } - window.focus(); - }, - // Receives FileReader ProgressEvents - onFileReaderEvent: function(evt) { - if (this.debugMode) console.info('FileReader Event ', evt.type, evt, evt.target in this.readers); - if (evt.target in this.readers) { - var reader = this.readers[evt.target]; - evt.target = reader; - reader._handleFlashEvent.call(reader, evt); - } - }, - // Receives flash FileReader Error Events - onFileReaderError: function(error) { - if (this.debugMode) console.log(error); - }, - onSWFReady: function() { - this.container.css({position: 'absolute'}); - this.ready = typeof this.swfObject.add === "function"; - if (this.ready) { - readyCallbacks.fire(); - } - - return true; + }); + }); + + webshim.addShadowDom(); + + picker.init(); + if(input.disabled){ + picker.disable(true); } - }; - - - /** - * Add FileReader to the window object - */ - window.FileReader = function () { - // states - this.EMPTY = 0; - this.LOADING = 1; - this.DONE = 2; - - this.readyState = 0; - - // File or Blob data - this.result = null; - - this.error = null; - - // event handler attributes - this.onloadstart = null; - this.onprogress = null; - this.onload = null; - this.onabort = null; - this.onerror = null; - this.onloadend = null; - - // Event Listeners handling using JQuery Callbacks - this._callbacks = { - loadstart : $.Callbacks( "unique" ), - progress : $.Callbacks( "unique" ), - abort : $.Callbacks( "unique" ), - error : $.Callbacks( "unique" ), - load : $.Callbacks( "unique" ), - loadend : $.Callbacks( "unique" ) - }; - - // Custom properties - this._id = null; - }; - - window.FileReader.prototype = { - // async read methods - readAsBinaryString: function (file) { - this._start(file); - FileAPIProxy.swfObject.read(file.input, file.name, 'readAsBinaryString'); - }, - readAsText: function (file, encoding) { - this._start(file); - FileAPIProxy.swfObject.read(file.input, file.name, 'readAsText'); - }, - readAsDataURL: function (file) { - this._start(file); - FileAPIProxy.swfObject.read(file.input, file.name, 'readAsDataURL'); - }, - readAsArrayBuffer: function(file){ - throw("Whoops FileReader.readAsArrayBuffer is unimplemented"); - }, - - abort: function () { - this.result = null; - if (this.readyState === this.EMPTY || this.readyState === this.DONE) return; - FileAPIProxy.swfObject.abort(this._id); - }, - - // Event Target interface - addEventListener: function (type, listener) { - if (type in this._callbacks) this._callbacks[type].add(listener); - }, - removeEventListener: function (type, listener) { - if (type in this._callbacks) this._callbacks[type].remove(listener); - }, - dispatchEvent: function (event) { - event.target = this; - if (event.type in this._callbacks) { - var fn = this['on' + event.type]; - if ($.isFunction(fn)) fn(event); - this._callbacks[event.type].fire(event); - } - return true; - }, - - // Custom private methods - - // Registers FileReader instance for flash callbacks - _register: function(file) { - this._id = file.input + '.' + file.name; - FileAPIProxy.readers[this._id] = this; - }, - _start: function(file) { - this._register(file); - if (this.readyState === this.LOADING) throw {type: 'InvalidStateError', code: 11, message: 'The object is in an invalid state.'}; - }, - _handleFlashEvent: function(evt) { - switch (evt.type) { - case 'loadstart': - this.readyState = this.LOADING; - break; - case 'loadend': - this.readyState = this.DONE; - break; - case 'load': - this.readyState = this.DONE; - this.result = FileAPIProxy.swfObject.result(this._id); - break; - case 'error': - this.result = null; - this.error = { - name: 'NotReadableError', - message: 'The File cannot be read!' - }; - } - this.dispatchEvent(new FileReaderEvent(evt)); - } - }; - - /** - * FileReader ProgressEvent implenting Event interface - */ - window.FileReaderEvent = function (e) { - this.initEvent(e); - }; - - window.FileReaderEvent.prototype = { - initEvent: function (event) { - $.extend(this, { - type: null, - target: null, - currentTarget: null, - - eventPhase: 2, - - bubbles: false, - cancelable: false, - - defaultPrevented: false, - - isTrusted: false, - timeStamp: new Date().getTime() - }, event); - }, - stopPropagation: function (){ - }, - stopImmediatePropagation: function (){ - }, - preventDefault: function (){ - } - }; - - /** - * FileList interface (Object with item function) - */ - window.FileList = function(array) { - if (array) { - for (var i = 0; i < array.length; i++) { - this[i] = array[i]; - } - this.length = array.length; - } else { - this.length = 0; - } - }; - - window.FileList.prototype = { - item: function(index) { - return (index in this) ? this[index] : null; - } - }; - })(); - - webshims.defineNodeNameProperty('input', 'files', { + } + }; + var getFileNames = function(file){ + return file.name; + }; + var createFilePicker = function(){ + var elem = this; + loadMoxie(); + $(elem) + .on('mousedown.filereaderwaiting click.filereaderwaiting', false) + .parent() + .addClass('ws-loading') + ; + webshim.ready('moxie', function(){ + createFilePicker.call(elem); + }); + }; + var noxhr = /^(?:script|jsonp)$/i; + var notReadyYet = function(){ + loadMoxie(); + webshim.error('filereader/formdata not ready yet. please wait for moxie to load `webshim.ready("moxie", callbackFn);`` or wait for the first change event on input[type="file"].ws-filereader.') + }; + var inputValueDesc = webshim.defineNodeNameProperty('input', 'value', { prop: { - writeable: false, get: function(){ - if(this.type != 'file'){return null;} - if(!$(this).is('.ws-filereader')){ - webshims.error("please add the 'ws-filereader' class to your input[type='file'] to implement files-property"); + var fileList = webshim.data(this, 'fileList'); + + if(fileList && fileList.map){ + return fileList.map(getFileNames).join(', '); } - return webshims.data(this, 'fileList') || webshims.data(this, 'fileList', new FileList()); + + return inputValueDesc.prop._supget.call(this); + }, + set: function(val){ + if(val === '' && this.type == 'file' && $(this).hasClass('ws-filereader')){ + webshim.data(this, 'fileList', []); + } + inputValueDesc.prop._supset.call(this); } } } ); - - webshims.defineNodeNamesBooleanProperty('input', 'multiple'); + var shimMoxiePath = webshim.cfg.basePath+'moxie/'; + var crossXMLMessage = 'You nedd a crossdomain.xml to get all "filereader" / "XHR2" / "CORS" features to work. Or host moxie.swf/moxie.xap on your server an configure filereader options: "swfpath"/"xappath"'; + var testMoxie = function(options){ + return (options.wsType == 'moxie' || (options.data && options.data instanceof mOxie.FormData) || (options.crossDomain && $.support.cors !== false && hasXDomain != 'no' && !noxhr.test(options.dataType || ''))); + }; + var createMoxieTransport = function (options){ - //webshims - $.fn.fileReader.defaults.filereader = webshims.cfg.basePath +'swf/filereader.swf'; - var wait = ['DOM']; - if(webshims.modules["form-core"].loaded){ - wait.push('forms'); - } - webshims.ready(wait, function(){ - webshims.addReady(function(context, contextElem){ - $('input[type="file"].ws-filereader', context).fileReader(); - }); - }); -}); -;(function(Modernizr, webshims){ - "use strict"; - var hasNative = Modernizr.audio && Modernizr.video; - var supportsLoop = false; - var bugs = webshims.bugs; - var swfType = 'mediaelement-jaris'; - var loadSwf = function(){ - webshims.ready(swfType, function(){ - if(!webshims.mediaelement.createSWF){ - webshims.mediaelement.loadSwf = true; - webshims.reTest([swfType], hasNative); + if(testMoxie(options)){ + var ajax; + webshim.info('moxie transfer used for $.ajax'); + if(hasXDomain == 'no'){ + webshim.error(crossXMLMessage); } - }); - }; + return { + send: function( headers, completeCallback ) { - var wsCfg = webshims.cfg; - var options = wsCfg.mediaelement; - var hasSwf; - if(!options){ - webshims.error("mediaelement wasn't implemented but loaded"); - return; - } + var proressEvent = function(obj, name){ + if(options[name]){ + var called = false; + ajax.addEventListener('load', function(e){ + if(!called){ + options[name]({type: 'progress', lengthComputable: true, total: 1, loaded: 1}); + } else if(called.lengthComputable && called.total > called.loaded){ + options[name]({type: 'progress', lengthComputable: true, total: called.total, loaded: called.total}); + } + }); + obj.addEventListener('progress', function(e){ + called = e; + options[name](e); + }); + } + }; + ajax = new moxie.xhr.XMLHttpRequest(); - if(hasNative){ - var videoElem = document.createElement('video'); - Modernizr.videoBuffered = ('buffered' in videoElem); - Modernizr.mediaDefaultMuted = ('defaultMuted' in videoElem); - supportsLoop = ('loop' in videoElem); - Modernizr.mediaLoop = supportsLoop; + ajax.open(options.type, options.url, options.async, options.username, options.password); - webshims.capturingEvents(['play', 'playing', 'waiting', 'paused', 'ended', 'durationchange', 'loadedmetadata', 'canplay', 'volumechange']); - - if( !Modernizr.videoBuffered || !supportsLoop || (!Modernizr.mediaDefaultMuted && navigator.userAgent.indexOf('MSIE') != -1 && 'ActiveXObject' in window) ){ - webshims.addPolyfill('mediaelement-native-fix', { - d: ['dom-support'] - }); - webshims.loader.loadList(['mediaelement-native-fix']); - } - } - - if(Modernizr.track && !bugs.track){ - (function(){ - if(!bugs.track){ + proressEvent(ajax.upload, featureOptions.uploadprogress); + proressEvent(ajax.upload, featureOptions.progress); - if(window.VTTCue && !window.TextTrackCue){ - window.TextTrackCue = window.VTTCue; - } else if(!window.VTTCue){ - window.VTTCue = window.TextTrackCue; - } + ajax.addEventListener('load', function(e){ + var responses = { + text: ajax.responseText, + xml: ajax.responseXML + }; + completeCallback(ajax.status, ajax.statusText, responses, ajax.getAllResponseHeaders()); + }); - try { - new VTTCue(2, 3, ''); - } catch(e){ - bugs.track = true; - } - } - })(); - } + if(options.xhrFields && options.xhrFields.withCredentials){ + ajax.withCredentials = true; + } -webshims.register('mediaelement-core', function($, webshims, window, document, undefined, options){ - hasSwf = swfmini.hasFlashPlayerVersion('10.0.3'); - var mediaelement = webshims.mediaelement; - - mediaelement.parseRtmp = function(data){ - var src = data.src.split('://'); - var paths = src[1].split('/'); - var i, len, found; - data.server = src[0]+'://'+paths[0]+'/'; - data.streamId = []; - for(i = 1, len = paths.length; i < len; i++){ - if(!found && paths[i].indexOf(':') !== -1){ - paths[i] = paths[i].split(':')[1]; - found = true; - } - if(!found){ - data.server += paths[i]+'/'; - } else { - data.streamId.push(paths[i]); - } + if(options.timeout){ + ajax.timeout = options.timeout; + } + + $.each(headers, function(name, value){ + ajax.setRequestHeader(name, value); + }); + + + ajax.send(options.data); + + }, + abort: function() { + if(ajax){ + ajax.abort(); + } + } + }; } - if(!data.streamId.length){ - webshims.error('Could not parse rtmp url'); - } - data.streamId = data.streamId.join('/'); }; + var transports = { + //based on script: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest + xdomain: (function(){ + var httpRegEx = /^https?:\/\//i; + var getOrPostRegEx = /^get|post$/i; + var sameSchemeRegEx = new RegExp('^'+location.protocol, 'i'); + return function(options, userOptions, jqXHR) { - var getSrcObj = function(elem, nodeName){ - elem = $(elem); - var src = {src: elem.attr('src') || '', elem: elem, srcProp: elem.prop('src')}; - var tmp; - - if(!src.src){return src;} - - tmp = elem.attr('data-server'); - if(tmp != null){ - src.server = tmp; - } - - tmp = elem.attr('type') || elem.attr('data-type'); - if(tmp){ - src.type = tmp; - src.container = $.trim(tmp.split(';')[0]); - } else { - if(!nodeName){ - nodeName = elem[0].nodeName.toLowerCase(); - if(nodeName == 'source'){ - nodeName = (elem.closest('video, audio')[0] || {nodeName: 'video'}).nodeName.toLowerCase(); + // Only continue if the request is: asynchronous, uses GET or POST method, has HTTP or HTTPS protocol, and has the same scheme as the calling page + if (!options.crossDomain || options.username || (options.xhrFields && options.xhrFields.withCredentials) || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url) || (options.data && options.data instanceof mOxie.FormData) || noxhr.test(options.dataType || '')) { + return; } + + var xdr = null; + webshim.info('xdomain transport used.'); + + return { + send: function(headers, complete) { + var postData = ''; + var userType = (userOptions.dataType || '').toLowerCase(); + + xdr = new XDomainRequest(); + if (/^\d+$/.test(userOptions.timeout)) { + xdr.timeout = userOptions.timeout; + } + + xdr.ontimeout = function() { + complete(500, 'timeout'); + }; + + xdr.onload = function() { + var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType; + var status = { + code: xdr.status || 200, + message: xdr.statusText || 'OK' + }; + var responses = { + text: xdr.responseText, + xml: xdr.responseXML + }; + try { + if (userType === 'html' || /text\/html/i.test(xdr.contentType)) { + responses.html = xdr.responseText; + } else if (userType === 'json' || (userType !== 'text' && /\/json/i.test(xdr.contentType))) { + try { + responses.json = $.parseJSON(xdr.responseText); + } catch(e) { + + } + } else if (userType === 'xml' && !xdr.responseXML) { + var doc; + try { + doc = new ActiveXObject('Microsoft.XMLDOM'); + doc.async = false; + doc.loadXML(xdr.responseText); + } catch(e) { + + } + + responses.xml = doc; + } + } catch(parseMessage) {} + complete(status.code, status.message, responses, allResponseHeaders); + }; + + // set an empty handler for 'onprogress' so requests don't get aborted + xdr.onprogress = function(){}; + xdr.onerror = function() { + complete(500, 'error', { + text: xdr.responseText + }); + }; + + if (userOptions.data) { + postData = ($.type(userOptions.data) === 'string') ? userOptions.data : $.param(userOptions.data); + } + xdr.open(options.type, options.url); + xdr.send(postData); + }, + abort: function() { + if (xdr) { + xdr.abort(); + } + } + }; + }; + })(), + moxie: function (options, originalOptions, jqXHR){ + if(testMoxie(options)){ + loadMoxie(options); + var ajax; + + var tmpTransport = { + send: function( headers, completeCallback ) { + ajax = true; + webshim.ready('moxie', function(){ + if(ajax){ + ajax = createMoxieTransport(options, originalOptions, jqXHR); + tmpTransport.send = ajax.send; + tmpTransport.abort = ajax.abort; + ajax.send(headers, completeCallback); + } + }); + }, + abort: function() { + ajax = false; + } + }; + return tmpTransport; } - if(src.server){ - src.type = nodeName+'/rtmp'; - src.container = nodeName+'/rtmp'; - } else { - - tmp = mediaelement.getTypeForSrc( src.src, nodeName, src ); - - if(tmp){ - src.type = tmp; - src.container = tmp; - } - } } - - if(!src.container){ - $(elem).attr('data-wsrecheckmimetype', ''); - } - - tmp = elem.attr('media'); - if(tmp){ - src.media = tmp; - } - if(src.type == 'audio/rtmp' || src.type == 'video/rtmp'){ - if(src.server){ - src.streamId = src.src; - } else { - mediaelement.parseRtmp(src); - } - } - return src; }; - - - - var hasYt = !hasSwf && ('postMessage' in window) && hasNative; - - var loadTrackUi = function(){ - if(loadTrackUi.loaded){return;} - loadTrackUi.loaded = true; - if(!options.noAutoTrack){ - webshims.ready('WINDOWLOAD', function(){ - loadThird(); - webshims.loader.loadList(['track-ui']); - }); - } - }; - var loadYt = (function(){ - var loaded; - return function(){ - if(loaded || !hasYt){return;} - loaded = true; - webshims.loader.loadScript("https://www.youtube.com/player_api"); - $(function(){ - webshims._polyfill(["mediaelement-yt"]); - }); - }; - })(); - var loadThird = function(){ - if(hasSwf){ - loadSwf(); - } else { - loadYt(); - } - }; - - webshims.addPolyfill('mediaelement-yt', { - test: !hasYt, - d: ['dom-support'] - }); - + if(!featureOptions.progress){ + featureOptions.progress = 'onprogress'; + } - - mediaelement.mimeTypes = { - audio: { - //ogm shouldn´t be used! - 'audio/ogg': ['ogg','oga', 'ogm'], - 'audio/ogg;codecs="opus"': 'opus', - 'audio/mpeg': ['mp2','mp3','mpga','mpega'], - 'audio/mp4': ['mp4','mpg4', 'm4r', 'm4a', 'm4p', 'm4b', 'aac'], - 'audio/wav': ['wav'], - 'audio/3gpp': ['3gp','3gpp'], - 'audio/webm': ['webm'], - 'audio/fla': ['flv', 'f4a', 'fla'], - 'application/x-mpegURL': ['m3u8', 'm3u'] - }, - video: { - //ogm shouldn´t be used! - 'video/ogg': ['ogg','ogv', 'ogm'], - 'video/mpeg': ['mpg','mpeg','mpe'], - 'video/mp4': ['mp4','mpg4', 'm4v'], - 'video/quicktime': ['mov','qt'], - 'video/x-msvideo': ['avi'], - 'video/x-ms-asf': ['asf', 'asx'], - 'video/flv': ['flv', 'f4v'], - 'video/3gpp': ['3gp','3gpp'], - 'video/webm': ['webm'], - 'application/x-mpegURL': ['m3u8', 'm3u'], - 'video/MP2T': ['ts'] - } + if(!featureOptions.uploadprogress){ + featureOptions.uploadprogress = 'onuploadprogress'; + } + + if(!featureOptions.swfpath){ + featureOptions.swfpath = shimMoxiePath+'flash/Moxie.cdn.swf'; + } + if(!featureOptions.xappath){ + featureOptions.xappath = shimMoxiePath+'silverlight/Moxie.cdn.xap'; + } + + if($.support.cors !== false || !window.XDomainRequest){ + delete transports.xdomain; + } + + + $.ajaxTransport("+*", function( options, originalOptions, jqXHR ) { + var ajax, type; + + if(options.wsType || transports[transports]){ + ajax = transports[transports](options, originalOptions, jqXHR); } - ; - - mediaelement.mimeTypes.source = $.extend({}, mediaelement.mimeTypes.audio, mediaelement.mimeTypes.video); - - mediaelement.getTypeForSrc = function(src, nodeName){ - if(src.indexOf('youtube.com/watch?') != -1 || src.indexOf('youtube.com/v/') != -1){ - return 'video/youtube'; - } - if(src.indexOf('rtmp') === 0){ - return nodeName+'/rtmp'; - } - src = src.split('?')[0].split('#')[0].split('.'); - src = src[src.length - 1]; - var mt; - - $.each(mediaelement.mimeTypes[nodeName], function(mimeType, exts){ - if(exts.indexOf(src) !== -1){ - mt = mimeType; - return false; + if(!ajax){ + for(type in transports){ + ajax = transports[type](options, originalOptions, jqXHR); + if(ajax){break;} } - }); - return mt; - }; - - - mediaelement.srces = function(mediaElem, srces){ - mediaElem = $(mediaElem); - if(!srces){ - srces = []; - var nodeName = mediaElem[0].nodeName.toLowerCase(); - var src = getSrcObj(mediaElem, nodeName); - - if(!src.src){ - $('source', mediaElem).each(function(){ - src = getSrcObj(this, nodeName); - if(src.src){srces.push(src);} - }); - } else { - srces.push(src); - } - return srces; - } else { - webshims.error('setting sources was removed.'); } - }; - - - $.fn.loadMediaSrc = function(){ - webshims.error('loadMediaSrc was removed.'); - }; - - 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); - srces = srces || mediaelement.srces(mediaElem); - $.each(srces, function(i, src){ - if(src.container && src.src && ((hasSwf && mediaelement.swfMimeTypes.indexOf(src.container) != -1) || (hasYt && src.container == 'video/youtube'))){ - ret = src; - return false; - } - }); - - } - - return ret; - }; - - var nativeCanPlayType = {}; - mediaelement.canNativePlaySrces = function(mediaElem, srces){ - var ret = ''; - if(hasNative){ - mediaElem = $(mediaElem); - var nodeName = (mediaElem[0].nodeName || '').toLowerCase(); - 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 && nativeCanPlay.call(mediaElem[0], src.type) ){ - ret = src; - return false; - } - }); - } - return ret; - }; - var emptyType = (/^\s*application\/octet\-stream\s*$/i); - var getRemoveEmptyType = function(){ - var ret = emptyType.test($.attr(this, 'type') || ''); - if(ret){ - $(this).removeAttr('type'); - } - return ret; - }; - mediaelement.setError = function(elem, message){ - if($('source', elem).filter(getRemoveEmptyType).length){ - webshims.error('"application/octet-stream" is a useless mimetype for audio/video. Please change this attribute.'); - try { - $(elem).mediaLoad(); - } catch(er){} - } else { - if(!message){ - message = "can't play sources"; - } - $(elem).pause().data('mediaerror', message); - webshims.error('mediaelementError: '+ message); - setTimeout(function(){ - if($(elem).data('mediaerror')){ - $(elem).addClass('media-error').trigger('mediaerror'); - } - }, 1); - } - - - }; - - var handleThird = (function(){ - var requested; - var readyType = hasSwf ? swfType : 'mediaelement-yt'; - return function( mediaElem, ret, data ){ - //readd to ready + return ajax; + }); - webshims.ready(readyType, function(){ - if(mediaelement.createSWF && $(mediaElem).parent()[0]){ - mediaelement.createSWF( mediaElem, ret, data ); - } else if(!requested) { - requested = true; - loadThird(); - - handleThird( mediaElem, ret, data ); - } - }); - if(!requested && hasYt && !mediaelement.createSWF){ - loadYt(); - } - }; - })(); - - var stepSources = function(elem, data, useSwf, _srces, _noLoop){ - var ret; - if(useSwf || (useSwf !== false && data && data.isActive == 'third')){ - ret = mediaelement.canThirdPlaySrces(elem, _srces); - if(!ret){ - if(_noLoop){ - mediaelement.setError(elem, false); - } else { - stepSources(elem, data, false, _srces, true); - } - } else { - handleThird(elem, ret, data); - } - } else { - ret = mediaelement.canNativePlaySrces(elem, _srces); - if(!ret){ - if(_noLoop){ - mediaelement.setError(elem, false); - if(data && data.isActive == 'third') { - mediaelement.setActive(elem, 'html5', data); + webshim.defineNodeNameProperty('input', 'files', { + prop: { + writeable: false, + get: function(){ + if(this.type != 'file'){return null;} + if(!$(this).is('.ws-filereader')){ + webshim.info("please add the 'ws-filereader' class to your input[type='file'] to implement files-property"); } - } else { - stepSources(elem, data, true, _srces, true); + return webshim.data(this, 'fileList') || []; } - } else if(data && data.isActive == 'third') { - mediaelement.setActive(elem, 'html5', data); } } - }; - var stopParent = /^(?:embed|object|datalist)$/i; - var selectSource = function(elem, data){ - var baseData = webshims.data(elem, 'mediaelementBase') || webshims.data(elem, 'mediaelementBase', {}); - var _srces = mediaelement.srces(elem); - var parent = elem.parentNode; - - clearTimeout(baseData.loadTimer); - $(elem).removeClass('media-error'); - $.data(elem, 'mediaerror', false); - - if(!_srces.length || !parent || parent.nodeType != 1 || stopParent.test(parent.nodeName || '')){return;} - data = data || webshims.data(elem, 'mediaelement'); - if(mediaelement.sortMedia){ - _srces.sort(mediaelement.sortMedia); + ); + + webshim.reflectProperties(['input'], ['accept']); + + if($('<input />').prop('multiple') == null){ + webshim.defineNodeNamesBooleanProperty(['input'], ['multiple']); + } + + webshim.onNodeNamesPropertyModify('input', 'disabled', function(value, boolVal, type){ + var picker = webshim.data(this, 'filePicker'); + if(picker){ + picker.disable(boolVal); } - 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); - }); - - var handleMedia = false; - var initMediaElements = function(){ - var testFixMedia = function(){ - if(webshims.implement(this, 'mediaelement')){ - selectSource(this); - if(!Modernizr.mediaDefaultMuted && $.attr(this, 'muted') != null){ - $.prop(this, 'muted', true); + + window.FileReader = notReadyYet; + window.FormData = notReadyYet; + webshim.ready('moxie', function(){ + var wsMimes = 'application/xml,xml'; + moxie = window.moxie; + mOxie = window.mOxie; + + mOxie.Env.swf_url = featureOptions.swfpath; + mOxie.Env.xap_url = featureOptions.xappath; + + window.FileReader = mOxie.FileReader; + + window.FormData = function(form){ + var appendData, i, len, files, fileI, fileLen, inputName; + var moxieData = new mOxie.FormData(); + if(form && $.nodeName(form, 'form')){ + appendData = $(form).serializeArray(); + for(i = 0; i < appendData.length; i++){ + if(Array.isArray(appendData[i].value)){ + appendData[i].value.forEach(function(val){ + moxieData.append(appendData[i].name, val); + }); + } else { + moxieData.append(appendData[i].name, appendData[i].value); + } } - } - - }; - - webshims.ready('dom-support', function(){ - handleMedia = true; - - if(!supportsLoop){ - webshims.defineNodeNamesBooleanProperty(['audio', 'video'], 'loop'); - } - - ['audio', 'video'].forEach(function(nodeName){ - var supLoad; - 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); + + appendData = form.querySelectorAll('input[type="file"][name]'); + + for(i = 0, len = appendData.length; i < appendData.length; i++){ + inputName = appendData[i].name; + if(inputName && !$(appendData[i]).is(':disabled')){ + files = $.prop(appendData[i], 'files') || []; + if(files.length){ + if(files.length > 1){ + webshim.error('FormData shim can only handle one file per ajax. Use multiple ajax request. One per file.'); } - if(!loadTrackUi.loaded && $('track', this).length){ - loadTrackUi(); + for(fileI = 0, fileLen = files.length; fileI < fileLen; fileI++){ + moxieData.append(inputName, files[fileI]); } - $(this).triggerHandler('wsmediareload'); } } - }); - 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'; - } - } - 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.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)){ - loadThird(); - handleMedia = true; - return false; - } - }) - ; - } - }); + } + + return moxieData; + }; + FormData = window.FormData; + + createFilePicker = _createFilePicker; + transports.moxie = createMoxieTransport; + + featureOptions.mimeTypes = (featureOptions.mimeTypes) ? wsMimes+','+featureOptions.mimeTypes : wsMimes; + try { + mOxie.Mime.addMimeType(featureOptions.mimeTypes); + } catch(e){ + webshim.warn('mimetype to moxie error: '+e); } - }; - - //set native implementation ready, before swf api is retested - if(hasNative){ - webshims.isReady('mediaelement-core', true); - initMediaElements(); - webshims.ready('WINDOWLOAD mediaelement', loadThird); - } else { - webshims.ready(swfType, initMediaElements); + }); + + webshim.addReady(function(context, contextElem){ + $(context.querySelectorAll(sel)).add(contextElem.filter(sel)).each(createFilePicker); + }); + webshim.ready('WINDOWLOAD', loadMoxie); + + if(webshim.cfg.debug !== false && featureOptions.swfpath.indexOf((location.protocol+'//'+location.hostname)) && featureOptions.swfpath.indexOf(('https://'+location.hostname))){ + webshim.ready('WINDOWLOAD', function(){ + + var printMessage = function(){ + if(hasXDomain == 'no'){ + webshim.error(crossXMLMessage); + } + }; + + try { + hasXDomain = sessionStorage.getItem('wsXdomain.xml'); + } catch(e){} + printMessage(); + if(hasXDomain == null){ + $.ajax({ + url: 'crossdomain.xml', + type: 'HEAD', + dataType: 'xml', + success: function(){ + hasXDomain = 'yes'; + }, + error: function(){ + hasXDomain = 'no'; + }, + complete: function(){ + try { + sessionStorage.setItem('wsXdomain.xml', hasXDomain); + } catch(e){} + printMessage(); + } + }); + } + }); } - webshims.ready('track', loadTrackUi); }); - -})(Modernizr, webshims); ;webshims.register('mediaelement-jaris', function($, webshims, window, document, undefined, options){ "use strict"; var mediaelement = webshims.mediaelement; var swfmini = window.swfmini; @@ -4476,10 +2388,10 @@ data.actionQueue = []; box = data.shadowElem; resetSwfProps(data); } else { $(document.getElementById('wrapper-'+ elemId )).remove(); - box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>') + box = $('<div class="polyfill-'+ (elemNodeName) +' polyfill-mediaelement '+ webshims.shadowClass +'" id="wrapper-'+ elemId +'"><div id="'+ elemId +'"></div>') .css({ position: 'relative', overflow: 'hidden' }) ;