├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── bower.json ├── bower_components └── jquery │ ├── .bower.json │ ├── MIT-LICENSE.txt │ ├── bower.json │ ├── dist │ ├── jquery.js │ ├── jquery.min.js │ └── jquery.min.map │ └── src │ ├── ajax.js │ ├── ajax │ ├── jsonp.js │ ├── load.js │ ├── parseJSON.js │ ├── parseXML.js │ ├── script.js │ ├── var │ │ ├── nonce.js │ │ └── rquery.js │ └── xhr.js │ ├── attributes.js │ ├── attributes │ ├── attr.js │ ├── classes.js │ ├── prop.js │ ├── support.js │ └── val.js │ ├── callbacks.js │ ├── core.js │ ├── core │ ├── access.js │ ├── init.js │ ├── parseHTML.js │ ├── ready.js │ └── var │ │ └── rsingleTag.js │ ├── css.js │ ├── css │ ├── addGetHookIf.js │ ├── curCSS.js │ ├── defaultDisplay.js │ ├── hiddenVisibleSelectors.js │ ├── support.js │ ├── swap.js │ └── var │ │ ├── cssExpand.js │ │ ├── isHidden.js │ │ ├── rmargin.js │ │ └── rnumnonpx.js │ ├── data.js │ ├── data │ ├── accepts.js │ └── support.js │ ├── deferred.js │ ├── deprecated.js │ ├── dimensions.js │ ├── effects.js │ ├── effects │ ├── Tween.js │ ├── animatedSelector.js │ └── support.js │ ├── event.js │ ├── event │ ├── ajax.js │ ├── alias.js │ └── support.js │ ├── exports │ ├── amd.js │ └── global.js │ ├── intro.js │ ├── jquery.js │ ├── manipulation.js │ ├── manipulation │ ├── _evalUrl.js │ ├── support.js │ └── var │ │ └── rcheckableType.js │ ├── offset.js │ ├── outro.js │ ├── queue.js │ ├── queue │ └── delay.js │ ├── selector-sizzle.js │ ├── selector.js │ ├── serialize.js │ ├── sizzle │ └── dist │ │ ├── sizzle.js │ │ ├── sizzle.min.js │ │ └── sizzle.min.map │ ├── support.js │ ├── traversing.js │ ├── traversing │ ├── findFilter.js │ └── var │ │ └── rneedsContext.js │ ├── var │ ├── class2type.js │ ├── concat.js │ ├── deletedIds.js │ ├── hasOwn.js │ ├── indexOf.js │ ├── pnum.js │ ├── push.js │ ├── rnotwhite.js │ ├── slice.js │ ├── strundefined.js │ ├── support.js │ └── toString.js │ └── wrap.js ├── changelog.txt ├── composer.json ├── css ├── base.less ├── font.less ├── mixins.less ├── resets.less ├── responsive.less ├── theme.less └── variables.less ├── demo ├── asnavfor-rtl.html ├── basic-carousel-rtl.html ├── basic-carousel.html ├── basic-slider-with-caption.html ├── basic-slider-with-custom-direction-nav.html ├── carousel-min-max.html ├── css │ ├── demo.css │ ├── flexslider-rtl-min.css │ ├── flexslider-rtl.css │ └── flexslider.css ├── dynamic-carousel-min-max.html ├── fonts │ └── webfonts │ │ ├── geo-medium │ │ ├── eot │ │ │ └── 1110FC_0.eot │ │ ├── svg │ │ │ ├── 1110FC_0.svg │ │ │ └── svg_test.html │ │ ├── ttf │ │ │ └── 1110FC_0.ttf │ │ └── woff │ │ │ └── 1110FC_0.woff │ │ ├── geo-regular │ │ ├── eot │ │ │ └── 11014B_0.eot │ │ ├── svg │ │ │ ├── 11014B_0.svg │ │ │ └── svg_test.html │ │ ├── ttf │ │ │ └── 11014B_0.ttf │ │ └── woff │ │ │ └── 11014B_0.woff │ │ └── geo-semibold │ │ ├── eot │ │ └── style_169898.eot │ │ ├── svg │ │ ├── index.html │ │ └── style_169898.svg │ │ ├── ttf │ │ └── style_169898.ttf │ │ └── woff │ │ └── style_169898.woff ├── images │ ├── kitchen_adventurer_caramel.jpg │ ├── kitchen_adventurer_cheesecake_brownie.jpg │ ├── kitchen_adventurer_donut.jpg │ ├── kitchen_adventurer_lemon.jpg │ └── logo.png ├── index-rtl.html ├── index.html ├── js │ ├── demo.js │ ├── froogaloop.js │ ├── jquery.easing.js │ ├── jquery.fitvid.js │ ├── jquery.flexslider.js │ ├── jquery.mousewheel.js │ ├── modernizr.js │ ├── shBrushCss.js │ ├── shBrushJScript.js │ ├── shBrushXml.js │ └── shCore.js ├── thumbnail-controlnav.html ├── thumbnail-slider.html ├── video-wistia.html └── video.html ├── flexslider-rtl-min.css ├── flexslider-rtl.css ├── flexslider.css ├── flexslider.less ├── fonts ├── flexslider-icon.eot ├── flexslider-icon.svg ├── flexslider-icon.ttf └── flexslider-icon.woff ├── images └── bg_play_pause.png ├── jquery.flexslider-min.js ├── jquery.flexslider.js ├── node_modules └── jquery │ ├── .bowerrc │ ├── .jscsrc │ ├── .npmignore │ ├── AUTHORS.txt │ ├── CONTRIBUTING.md │ ├── MIT-LICENSE.txt │ ├── README.md │ ├── bower.json │ ├── dist │ ├── jquery.js │ ├── jquery.min.js │ └── jquery.min.map │ ├── package.json │ └── src │ ├── ajax.js │ ├── ajax │ ├── jsonp.js │ ├── load.js │ ├── parseJSON.js │ ├── parseXML.js │ ├── script.js │ ├── var │ │ ├── nonce.js │ │ └── rquery.js │ └── xhr.js │ ├── attributes.js │ ├── attributes │ ├── attr.js │ ├── classes.js │ ├── prop.js │ ├── support.js │ └── val.js │ ├── callbacks.js │ ├── core.js │ ├── core │ ├── access.js │ ├── init.js │ ├── parseHTML.js │ ├── ready.js │ └── var │ │ └── rsingleTag.js │ ├── css.js │ ├── css │ ├── addGetHookIf.js │ ├── curCSS.js │ ├── defaultDisplay.js │ ├── hiddenVisibleSelectors.js │ ├── support.js │ ├── swap.js │ └── var │ │ ├── cssExpand.js │ │ ├── isHidden.js │ │ ├── rmargin.js │ │ └── rnumnonpx.js │ ├── data.js │ ├── data │ ├── accepts.js │ └── support.js │ ├── deferred.js │ ├── deprecated.js │ ├── dimensions.js │ ├── effects.js │ ├── effects │ ├── Tween.js │ ├── animatedSelector.js │ └── support.js │ ├── event.js │ ├── event │ ├── ajax.js │ ├── alias.js │ └── support.js │ ├── exports │ ├── amd.js │ └── global.js │ ├── intro.js │ ├── jquery.js │ ├── manipulation.js │ ├── manipulation │ ├── _evalUrl.js │ ├── support.js │ └── var │ │ └── rcheckableType.js │ ├── offset.js │ ├── outro.js │ ├── queue.js │ ├── queue │ └── delay.js │ ├── selector-sizzle.js │ ├── selector.js │ ├── serialize.js │ ├── sizzle │ ├── dist │ │ ├── sizzle.js │ │ ├── sizzle.min.js │ │ └── sizzle.min.map │ └── test │ │ ├── data │ │ ├── empty.js │ │ ├── mixed_sort.html │ │ └── testinit.js │ │ ├── index.html │ │ ├── jquery.js │ │ └── unit │ │ ├── extending.js │ │ ├── selector.js │ │ └── utilities.js │ ├── support.js │ ├── traversing.js │ ├── traversing │ ├── findFilter.js │ └── var │ │ └── rneedsContext.js │ ├── var │ ├── class2type.js │ ├── concat.js │ ├── deletedIds.js │ ├── hasOwn.js │ ├── indexOf.js │ ├── pnum.js │ ├── push.js │ ├── rnotwhite.js │ ├── slice.js │ ├── strundefined.js │ ├── support.js │ └── toString.js │ └── wrap.js └── package.json /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | Community made patches, localisations, bug reports and contributions are always welcome and are crucial to ensure FlexSlider remains the #1 responsive jQuery slideshow solution. :) 4 | 5 | When contributing, please ensure you follow the guidelines below so that we can keep on top of things. 6 | 7 | __Note:__ 8 | 9 | GitHub is for *bug reports and contributions only* - if you have a setup question, please be mindful of this and keep your question clear and concise, if you must post it to this repository. 10 | 11 | If you are a WooThemes customer, use [WooThemes Support](http://support.woothemes.com). Our ninjas are on hand to assist with your set up query. 12 | 13 | ## Getting Started 14 | 15 | * Make sure you have a [GitHub account](https://github.com/signup/free) 16 | * Submit a ticket for your issue, assuming one does not already exist (please look over the currently open issues before creating a new issue). 17 | * Clearly describe the issue including steps to reproduce when it is a bug. 18 | * Make sure you fill in the earliest version that you know has the issue. 19 | 20 | ## Making Changes 21 | 22 | * Fork the repository on GitHub. 23 | * Make the changes to your forked repository. 24 | * Ensure you use LF line endings - no crazy windows line endings. :) 25 | * When committing, reference your issue (#1234) and include a note about the fix. 26 | * Push the changes to your fork and submit a pull request on the **master** branch of the FlexSlider repository. Existing maintenance branches will be maintained of by FlexSlider developers. 27 | * Please don't modify the changelog, this will be maintained by FlexSlider developers. 28 | 29 | At this point you're waiting on us to merge your pull request. We'll review all pull requests, and make suggestions and changes if necessary. 30 | 31 | # Additional Resources 32 | 33 | * [General GitHub documentation](http://help.github.com/) 34 | * [GitHub pull request documentation](http://help.github.com/send-pull-requests/) 35 | * [WooThemes Support](http://support.woothemes.com) -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flexslider", 3 | "version": "2.7.2", 4 | "homepage": "https://github.com/woocommerce/FlexSlider", 5 | "authors": [ 6 | "Automattic " 7 | ], 8 | "description": "An awesome, fully responsive jQuery slider toolkit.", 9 | "main": [ 10 | "jquery.flexslider.js", 11 | "flexslider.css" 12 | ], 13 | "keywords": [ 14 | "flexslider", 15 | "jquery", 16 | "slider", 17 | "woothemes", 18 | "automattic" 19 | ], 20 | "license": "GPLv2 and later", 21 | "ignore": [ 22 | "**/.*", 23 | "node_modules", 24 | "bower_components", 25 | "test", 26 | "tests", 27 | "demo" 28 | ], 29 | "dependencies": { 30 | "jquery": ">=1.11.3" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /bower_components/jquery/.bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "1.11.3", 4 | "main": "dist/jquery.js", 5 | "license": "MIT", 6 | "ignore": [ 7 | "**/.*", 8 | "build", 9 | "dist/cdn", 10 | "speed", 11 | "test", 12 | "*.md", 13 | "AUTHORS.txt", 14 | "Gruntfile.js", 15 | "package.json" 16 | ], 17 | "devDependencies": { 18 | "sizzle": "2.1.1-jquery.2.1.2", 19 | "requirejs": "2.1.10", 20 | "qunit": "1.14.0", 21 | "sinon": "1.8.1" 22 | }, 23 | "keywords": [ 24 | "jquery", 25 | "javascript", 26 | "library" 27 | ], 28 | "homepage": "https://github.com/jquery/jquery", 29 | "_release": "1.11.3", 30 | "_resolution": { 31 | "type": "version", 32 | "tag": "1.11.3", 33 | "commit": "1472290917f17af05e98007136096784f9051fab" 34 | }, 35 | "_source": "git://github.com/jquery/jquery.git", 36 | "_target": "1.11.3", 37 | "_originalSource": "jquery" 38 | } -------------------------------------------------------------------------------- /bower_components/jquery/MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2014 jQuery Foundation and other contributors 2 | http://jquery.com/ 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /bower_components/jquery/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery", 3 | "version": "1.11.3", 4 | "main": "dist/jquery.js", 5 | "license": "MIT", 6 | "ignore": [ 7 | "**/.*", 8 | "build", 9 | "dist/cdn", 10 | "speed", 11 | "test", 12 | "*.md", 13 | "AUTHORS.txt", 14 | "Gruntfile.js", 15 | "package.json" 16 | ], 17 | "devDependencies": { 18 | "sizzle": "2.1.1-jquery.2.1.2", 19 | "requirejs": "2.1.10", 20 | "qunit": "1.14.0", 21 | "sinon": "1.8.1" 22 | }, 23 | "keywords": [ 24 | "jquery", 25 | "javascript", 26 | "library" 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/jsonp.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "./var/nonce", 4 | "./var/rquery", 5 | "../ajax" 6 | ], function( jQuery, nonce, rquery ) { 7 | 8 | var oldCallbacks = [], 9 | rjsonp = /(=)\?(?=&|$)|\?\?/; 10 | 11 | // Default jsonp settings 12 | jQuery.ajaxSetup({ 13 | jsonp: "callback", 14 | jsonpCallback: function() { 15 | var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); 16 | this[ callback ] = true; 17 | return callback; 18 | } 19 | }); 20 | 21 | // Detect, normalize options and install callbacks for jsonp requests 22 | jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 23 | 24 | var callbackName, overwritten, responseContainer, 25 | jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 26 | "url" : 27 | typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data" 28 | ); 29 | 30 | // Handle iff the expected data type is "jsonp" or we have a parameter to set 31 | if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 32 | 33 | // Get callback name, remembering preexisting value associated with it 34 | callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? 35 | s.jsonpCallback() : 36 | s.jsonpCallback; 37 | 38 | // Insert callback into url or form data 39 | if ( jsonProp ) { 40 | s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 41 | } else if ( s.jsonp !== false ) { 42 | s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 43 | } 44 | 45 | // Use data converter to retrieve json after script execution 46 | s.converters["script json"] = function() { 47 | if ( !responseContainer ) { 48 | jQuery.error( callbackName + " was not called" ); 49 | } 50 | return responseContainer[ 0 ]; 51 | }; 52 | 53 | // force json dataType 54 | s.dataTypes[ 0 ] = "json"; 55 | 56 | // Install callback 57 | overwritten = window[ callbackName ]; 58 | window[ callbackName ] = function() { 59 | responseContainer = arguments; 60 | }; 61 | 62 | // Clean-up function (fires after converters) 63 | jqXHR.always(function() { 64 | // Restore preexisting value 65 | window[ callbackName ] = overwritten; 66 | 67 | // Save back as free 68 | if ( s[ callbackName ] ) { 69 | // make sure that re-using the options doesn't screw things around 70 | s.jsonpCallback = originalSettings.jsonpCallback; 71 | 72 | // save the callback name for future use 73 | oldCallbacks.push( callbackName ); 74 | } 75 | 76 | // Call if it was a function and we have a response 77 | if ( responseContainer && jQuery.isFunction( overwritten ) ) { 78 | overwritten( responseContainer[ 0 ] ); 79 | } 80 | 81 | responseContainer = overwritten = undefined; 82 | }); 83 | 84 | // Delegate to script 85 | return "script"; 86 | } 87 | }); 88 | 89 | }); 90 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/load.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "../core/parseHTML", 4 | "../ajax", 5 | "../traversing", 6 | "../manipulation", 7 | "../selector", 8 | // Optional event/alias dependency 9 | "../event/alias" 10 | ], function( jQuery ) { 11 | 12 | // Keep a copy of the old load method 13 | var _load = jQuery.fn.load; 14 | 15 | /** 16 | * Load a url into a page 17 | */ 18 | jQuery.fn.load = function( url, params, callback ) { 19 | if ( typeof url !== "string" && _load ) { 20 | return _load.apply( this, arguments ); 21 | } 22 | 23 | var selector, response, type, 24 | self = this, 25 | off = url.indexOf(" "); 26 | 27 | if ( off >= 0 ) { 28 | selector = jQuery.trim( url.slice( off, url.length ) ); 29 | url = url.slice( 0, off ); 30 | } 31 | 32 | // If it's a function 33 | if ( jQuery.isFunction( params ) ) { 34 | 35 | // We assume that it's the callback 36 | callback = params; 37 | params = undefined; 38 | 39 | // Otherwise, build a param string 40 | } else if ( params && typeof params === "object" ) { 41 | type = "POST"; 42 | } 43 | 44 | // If we have elements to modify, make the request 45 | if ( self.length > 0 ) { 46 | jQuery.ajax({ 47 | url: url, 48 | 49 | // if "type" variable is undefined, then "GET" method will be used 50 | type: type, 51 | dataType: "html", 52 | data: params 53 | }).done(function( responseText ) { 54 | 55 | // Save response for use in complete callback 56 | response = arguments; 57 | 58 | self.html( selector ? 59 | 60 | // If a selector was specified, locate the right elements in a dummy div 61 | // Exclude scripts to avoid IE 'Permission Denied' errors 62 | jQuery("
").append( jQuery.parseHTML( responseText ) ).find( selector ) : 63 | 64 | // Otherwise use the full result 65 | responseText ); 66 | 67 | }).complete( callback && function( jqXHR, status ) { 68 | self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); 69 | }); 70 | } 71 | 72 | return this; 73 | }; 74 | 75 | }); 76 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/parseJSON.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core" 3 | ], function( jQuery ) { 4 | 5 | var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g; 6 | 7 | jQuery.parseJSON = function( data ) { 8 | // Attempt to parse using the native JSON parser first 9 | if ( window.JSON && window.JSON.parse ) { 10 | // Support: Android 2.3 11 | // Workaround failure to string-cast null input 12 | return window.JSON.parse( data + "" ); 13 | } 14 | 15 | var requireNonComma, 16 | depth = null, 17 | str = jQuery.trim( data + "" ); 18 | 19 | // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains 20 | // after removing valid tokens 21 | return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) { 22 | 23 | // Force termination if we see a misplaced comma 24 | if ( requireNonComma && comma ) { 25 | depth = 0; 26 | } 27 | 28 | // Perform no more replacements after returning to outermost depth 29 | if ( depth === 0 ) { 30 | return token; 31 | } 32 | 33 | // Commas must not follow "[", "{", or "," 34 | requireNonComma = open || comma; 35 | 36 | // Determine new depth 37 | // array/object open ("[" or "{"): depth += true - false (increment) 38 | // array/object close ("]" or "}"): depth += false - true (decrement) 39 | // other cases ("," or primitive): depth += true - true (numeric cast) 40 | depth += !close - !open; 41 | 42 | // Remove this token 43 | return ""; 44 | }) ) ? 45 | ( Function( "return " + str ) )() : 46 | jQuery.error( "Invalid JSON: " + data ); 47 | }; 48 | 49 | return jQuery.parseJSON; 50 | 51 | }); 52 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/parseXML.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core" 3 | ], function( jQuery ) { 4 | 5 | // Cross-browser xml parsing 6 | jQuery.parseXML = function( data ) { 7 | var xml, tmp; 8 | if ( !data || typeof data !== "string" ) { 9 | return null; 10 | } 11 | try { 12 | if ( window.DOMParser ) { // Standard 13 | tmp = new DOMParser(); 14 | xml = tmp.parseFromString( data, "text/xml" ); 15 | } else { // IE 16 | xml = new ActiveXObject( "Microsoft.XMLDOM" ); 17 | xml.async = "false"; 18 | xml.loadXML( data ); 19 | } 20 | } catch( e ) { 21 | xml = undefined; 22 | } 23 | if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { 24 | jQuery.error( "Invalid XML: " + data ); 25 | } 26 | return xml; 27 | }; 28 | 29 | return jQuery.parseXML; 30 | 31 | }); 32 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/script.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "../ajax" 4 | ], function( jQuery ) { 5 | 6 | // Install script dataType 7 | jQuery.ajaxSetup({ 8 | accepts: { 9 | script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" 10 | }, 11 | contents: { 12 | script: /(?:java|ecma)script/ 13 | }, 14 | converters: { 15 | "text script": function( text ) { 16 | jQuery.globalEval( text ); 17 | return text; 18 | } 19 | } 20 | }); 21 | 22 | // Handle cache's special case and global 23 | jQuery.ajaxPrefilter( "script", function( s ) { 24 | if ( s.cache === undefined ) { 25 | s.cache = false; 26 | } 27 | if ( s.crossDomain ) { 28 | s.type = "GET"; 29 | s.global = false; 30 | } 31 | }); 32 | 33 | // Bind script tag hack transport 34 | jQuery.ajaxTransport( "script", function(s) { 35 | 36 | // This transport only deals with cross domain requests 37 | if ( s.crossDomain ) { 38 | 39 | var script, 40 | head = document.head || jQuery("head")[0] || document.documentElement; 41 | 42 | return { 43 | 44 | send: function( _, callback ) { 45 | 46 | script = document.createElement("script"); 47 | 48 | script.async = true; 49 | 50 | if ( s.scriptCharset ) { 51 | script.charset = s.scriptCharset; 52 | } 53 | 54 | script.src = s.url; 55 | 56 | // Attach handlers for all browsers 57 | script.onload = script.onreadystatechange = function( _, isAbort ) { 58 | 59 | if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { 60 | 61 | // Handle memory leak in IE 62 | script.onload = script.onreadystatechange = null; 63 | 64 | // Remove the script 65 | if ( script.parentNode ) { 66 | script.parentNode.removeChild( script ); 67 | } 68 | 69 | // Dereference the script 70 | script = null; 71 | 72 | // Callback if not abort 73 | if ( !isAbort ) { 74 | callback( 200, "success" ); 75 | } 76 | } 77 | }; 78 | 79 | // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending 80 | // Use native DOM manipulation to avoid our domManip AJAX trickery 81 | head.insertBefore( script, head.firstChild ); 82 | }, 83 | 84 | abort: function() { 85 | if ( script ) { 86 | script.onload( undefined, true ); 87 | } 88 | } 89 | }; 90 | } 91 | }); 92 | 93 | }); 94 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/var/nonce.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../../core" 3 | ], function( jQuery ) { 4 | return jQuery.now(); 5 | }); 6 | -------------------------------------------------------------------------------- /bower_components/jquery/src/ajax/var/rquery.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | return (/\?/); 3 | }); 4 | -------------------------------------------------------------------------------- /bower_components/jquery/src/attributes.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "./core", 3 | "./attributes/val", 4 | "./attributes/attr", 5 | "./attributes/prop", 6 | "./attributes/classes" 7 | ], function( jQuery ) { 8 | 9 | // Return jQuery for attributes-only inclusion 10 | return jQuery; 11 | }); 12 | -------------------------------------------------------------------------------- /bower_components/jquery/src/attributes/prop.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "../core/access", 4 | "./support" 5 | ], function( jQuery, access, support ) { 6 | 7 | var rfocusable = /^(?:input|select|textarea|button|object)$/i, 8 | rclickable = /^(?:a|area)$/i; 9 | 10 | jQuery.fn.extend({ 11 | prop: function( name, value ) { 12 | return access( this, jQuery.prop, name, value, arguments.length > 1 ); 13 | }, 14 | 15 | removeProp: function( name ) { 16 | name = jQuery.propFix[ name ] || name; 17 | return this.each(function() { 18 | // try/catch handles cases where IE balks (such as removing a property on window) 19 | try { 20 | this[ name ] = undefined; 21 | delete this[ name ]; 22 | } catch( e ) {} 23 | }); 24 | } 25 | }); 26 | 27 | jQuery.extend({ 28 | propFix: { 29 | "for": "htmlFor", 30 | "class": "className" 31 | }, 32 | 33 | prop: function( elem, name, value ) { 34 | var ret, hooks, notxml, 35 | nType = elem.nodeType; 36 | 37 | // don't get/set properties on text, comment and attribute nodes 38 | if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { 39 | return; 40 | } 41 | 42 | notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); 43 | 44 | if ( notxml ) { 45 | // Fix name and attach hooks 46 | name = jQuery.propFix[ name ] || name; 47 | hooks = jQuery.propHooks[ name ]; 48 | } 49 | 50 | if ( value !== undefined ) { 51 | return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? 52 | ret : 53 | ( elem[ name ] = value ); 54 | 55 | } else { 56 | return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? 57 | ret : 58 | elem[ name ]; 59 | } 60 | }, 61 | 62 | propHooks: { 63 | tabIndex: { 64 | get: function( elem ) { 65 | // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set 66 | // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 67 | // Use proper attribute retrieval(#12072) 68 | var tabindex = jQuery.find.attr( elem, "tabindex" ); 69 | 70 | return tabindex ? 71 | parseInt( tabindex, 10 ) : 72 | rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 73 | 0 : 74 | -1; 75 | } 76 | } 77 | } 78 | }); 79 | 80 | // Some attributes require a special call on IE 81 | // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 82 | if ( !support.hrefNormalized ) { 83 | // href/src property should get the full normalized URL (#10299/#12915) 84 | jQuery.each([ "href", "src" ], function( i, name ) { 85 | jQuery.propHooks[ name ] = { 86 | get: function( elem ) { 87 | return elem.getAttribute( name, 4 ); 88 | } 89 | }; 90 | }); 91 | } 92 | 93 | // Support: Safari, IE9+ 94 | // mis-reports the default selected property of an option 95 | // Accessing the parent's selectedIndex property fixes it 96 | if ( !support.optSelected ) { 97 | jQuery.propHooks.selected = { 98 | get: function( elem ) { 99 | var parent = elem.parentNode; 100 | 101 | if ( parent ) { 102 | parent.selectedIndex; 103 | 104 | // Make sure that it also works with optgroups, see #5701 105 | if ( parent.parentNode ) { 106 | parent.parentNode.selectedIndex; 107 | } 108 | } 109 | return null; 110 | } 111 | }; 112 | } 113 | 114 | jQuery.each([ 115 | "tabIndex", 116 | "readOnly", 117 | "maxLength", 118 | "cellSpacing", 119 | "cellPadding", 120 | "rowSpan", 121 | "colSpan", 122 | "useMap", 123 | "frameBorder", 124 | "contentEditable" 125 | ], function() { 126 | jQuery.propFix[ this.toLowerCase() ] = this; 127 | }); 128 | 129 | // IE6/7 call enctype encoding 130 | if ( !support.enctype ) { 131 | jQuery.propFix.enctype = "encoding"; 132 | } 133 | 134 | }); 135 | -------------------------------------------------------------------------------- /bower_components/jquery/src/attributes/support.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../var/support" 3 | ], function( support ) { 4 | 5 | (function() { 6 | // Minified: var a,b,c,d,e 7 | var input, div, select, a, opt; 8 | 9 | // Setup 10 | div = document.createElement( "div" ); 11 | div.setAttribute( "className", "t" ); 12 | div.innerHTML = "
a"; 13 | a = div.getElementsByTagName("a")[ 0 ]; 14 | 15 | // First batch of tests. 16 | select = document.createElement("select"); 17 | opt = select.appendChild( document.createElement("option") ); 18 | input = div.getElementsByTagName("input")[ 0 ]; 19 | 20 | a.style.cssText = "top:1px"; 21 | 22 | // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) 23 | support.getSetAttribute = div.className !== "t"; 24 | 25 | // Get the style information from getAttribute 26 | // (IE uses .cssText instead) 27 | support.style = /top/.test( a.getAttribute("style") ); 28 | 29 | // Make sure that URLs aren't manipulated 30 | // (IE normalizes it by default) 31 | support.hrefNormalized = a.getAttribute("href") === "/a"; 32 | 33 | // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) 34 | support.checkOn = !!input.value; 35 | 36 | // Make sure that a selected-by-default option has a working selected property. 37 | // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) 38 | support.optSelected = opt.selected; 39 | 40 | // Tests for enctype support on a form (#6743) 41 | support.enctype = !!document.createElement("form").enctype; 42 | 43 | // Make sure that the options inside disabled selects aren't marked as disabled 44 | // (WebKit marks them as disabled) 45 | select.disabled = true; 46 | support.optDisabled = !opt.disabled; 47 | 48 | // Support: IE8 only 49 | // Check if we can trust getAttribute("value") 50 | input = document.createElement( "input" ); 51 | input.setAttribute( "value", "" ); 52 | support.input = input.getAttribute( "value" ) === ""; 53 | 54 | // Check if an input maintains its value after becoming a radio 55 | input.value = "t"; 56 | input.setAttribute( "type", "radio" ); 57 | support.radioValue = input.value === "t"; 58 | })(); 59 | 60 | return support; 61 | 62 | }); 63 | -------------------------------------------------------------------------------- /bower_components/jquery/src/core/access.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core" 3 | ], function( jQuery ) { 4 | 5 | // Multifunctional method to get and set values of a collection 6 | // The value/s can optionally be executed if it's a function 7 | var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 8 | var i = 0, 9 | length = elems.length, 10 | bulk = key == null; 11 | 12 | // Sets many values 13 | if ( jQuery.type( key ) === "object" ) { 14 | chainable = true; 15 | for ( i in key ) { 16 | jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); 17 | } 18 | 19 | // Sets one value 20 | } else if ( value !== undefined ) { 21 | chainable = true; 22 | 23 | if ( !jQuery.isFunction( value ) ) { 24 | raw = true; 25 | } 26 | 27 | if ( bulk ) { 28 | // Bulk operations run against the entire set 29 | if ( raw ) { 30 | fn.call( elems, value ); 31 | fn = null; 32 | 33 | // ...except when executing function values 34 | } else { 35 | bulk = fn; 36 | fn = function( elem, key, value ) { 37 | return bulk.call( jQuery( elem ), value ); 38 | }; 39 | } 40 | } 41 | 42 | if ( fn ) { 43 | for ( ; i < length; i++ ) { 44 | fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); 45 | } 46 | } 47 | } 48 | 49 | return chainable ? 50 | elems : 51 | 52 | // Gets 53 | bulk ? 54 | fn.call( elems ) : 55 | length ? fn( elems[0], key ) : emptyGet; 56 | }; 57 | 58 | return access; 59 | 60 | }); 61 | -------------------------------------------------------------------------------- /bower_components/jquery/src/core/init.js: -------------------------------------------------------------------------------- 1 | // Initialize a jQuery object 2 | define([ 3 | "../core", 4 | "./var/rsingleTag", 5 | "../traversing/findFilter" 6 | ], function( jQuery, rsingleTag ) { 7 | 8 | // A central reference to the root jQuery(document) 9 | var rootjQuery, 10 | 11 | // Use the correct document accordingly with window argument (sandbox) 12 | document = window.document, 13 | 14 | // A simple way to check for HTML strings 15 | // Prioritize #id over to avoid XSS via location.hash (#9521) 16 | // Strict HTML recognition (#11290: must start with <) 17 | rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, 18 | 19 | init = jQuery.fn.init = function( selector, context ) { 20 | var match, elem; 21 | 22 | // HANDLE: $(""), $(null), $(undefined), $(false) 23 | if ( !selector ) { 24 | return this; 25 | } 26 | 27 | // Handle HTML strings 28 | if ( typeof selector === "string" ) { 29 | if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { 30 | // Assume that strings that start and end with <> are HTML and skip the regex check 31 | match = [ null, selector, null ]; 32 | 33 | } else { 34 | match = rquickExpr.exec( selector ); 35 | } 36 | 37 | // Match html or make sure no context is specified for #id 38 | if ( match && (match[1] || !context) ) { 39 | 40 | // HANDLE: $(html) -> $(array) 41 | if ( match[1] ) { 42 | context = context instanceof jQuery ? context[0] : context; 43 | 44 | // scripts is true for back-compat 45 | // Intentionally let the error be thrown if parseHTML is not present 46 | jQuery.merge( this, jQuery.parseHTML( 47 | match[1], 48 | context && context.nodeType ? context.ownerDocument || context : document, 49 | true 50 | ) ); 51 | 52 | // HANDLE: $(html, props) 53 | if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { 54 | for ( match in context ) { 55 | // Properties of context are called as methods if possible 56 | if ( jQuery.isFunction( this[ match ] ) ) { 57 | this[ match ]( context[ match ] ); 58 | 59 | // ...and otherwise set as attributes 60 | } else { 61 | this.attr( match, context[ match ] ); 62 | } 63 | } 64 | } 65 | 66 | return this; 67 | 68 | // HANDLE: $(#id) 69 | } else { 70 | elem = document.getElementById( match[2] ); 71 | 72 | // Check parentNode to catch when Blackberry 4.6 returns 73 | // nodes that are no longer in the document #6963 74 | if ( elem && elem.parentNode ) { 75 | // Handle the case where IE and Opera return items 76 | // by name instead of ID 77 | if ( elem.id !== match[2] ) { 78 | return rootjQuery.find( selector ); 79 | } 80 | 81 | // Otherwise, we inject the element directly into the jQuery object 82 | this.length = 1; 83 | this[0] = elem; 84 | } 85 | 86 | this.context = document; 87 | this.selector = selector; 88 | return this; 89 | } 90 | 91 | // HANDLE: $(expr, $(...)) 92 | } else if ( !context || context.jquery ) { 93 | return ( context || rootjQuery ).find( selector ); 94 | 95 | // HANDLE: $(expr, context) 96 | // (which is just equivalent to: $(context).find(expr) 97 | } else { 98 | return this.constructor( context ).find( selector ); 99 | } 100 | 101 | // HANDLE: $(DOMElement) 102 | } else if ( selector.nodeType ) { 103 | this.context = this[0] = selector; 104 | this.length = 1; 105 | return this; 106 | 107 | // HANDLE: $(function) 108 | // Shortcut for document ready 109 | } else if ( jQuery.isFunction( selector ) ) { 110 | return typeof rootjQuery.ready !== "undefined" ? 111 | rootjQuery.ready( selector ) : 112 | // Execute immediately if ready is not present 113 | selector( jQuery ); 114 | } 115 | 116 | if ( selector.selector !== undefined ) { 117 | this.selector = selector.selector; 118 | this.context = selector.context; 119 | } 120 | 121 | return jQuery.makeArray( selector, this ); 122 | }; 123 | 124 | // Give the init function the jQuery prototype for later instantiation 125 | init.prototype = jQuery.fn; 126 | 127 | // Initialize central reference 128 | rootjQuery = jQuery( document ); 129 | 130 | return init; 131 | 132 | }); 133 | -------------------------------------------------------------------------------- /bower_components/jquery/src/core/parseHTML.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "./var/rsingleTag", 4 | "../manipulation" // buildFragment 5 | ], function( jQuery, rsingleTag ) { 6 | 7 | // data: string of html 8 | // context (optional): If specified, the fragment will be created in this context, defaults to document 9 | // keepScripts (optional): If true, will include scripts passed in the html string 10 | jQuery.parseHTML = function( data, context, keepScripts ) { 11 | if ( !data || typeof data !== "string" ) { 12 | return null; 13 | } 14 | if ( typeof context === "boolean" ) { 15 | keepScripts = context; 16 | context = false; 17 | } 18 | context = context || document; 19 | 20 | var parsed = rsingleTag.exec( data ), 21 | scripts = !keepScripts && []; 22 | 23 | // Single tag 24 | if ( parsed ) { 25 | return [ context.createElement( parsed[1] ) ]; 26 | } 27 | 28 | parsed = jQuery.buildFragment( [ data ], context, scripts ); 29 | 30 | if ( scripts && scripts.length ) { 31 | jQuery( scripts ).remove(); 32 | } 33 | 34 | return jQuery.merge( [], parsed.childNodes ); 35 | }; 36 | 37 | return jQuery.parseHTML; 38 | 39 | }); 40 | -------------------------------------------------------------------------------- /bower_components/jquery/src/core/var/rsingleTag.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | // Match a standalone tag 3 | return (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); 4 | }); 5 | -------------------------------------------------------------------------------- /bower_components/jquery/src/css/addGetHookIf.js: -------------------------------------------------------------------------------- 1 | define(function() { 2 | 3 | function addGetHookIf( conditionFn, hookFn ) { 4 | // Define the hook, we'll check on the first run if it's really needed. 5 | return { 6 | get: function() { 7 | var condition = conditionFn(); 8 | 9 | if ( condition == null ) { 10 | // The test was not ready at this point; screw the hook this time 11 | // but check again when needed next time. 12 | return; 13 | } 14 | 15 | if ( condition ) { 16 | // Hook not needed (or it's not possible to use it due to missing dependency), 17 | // remove it. 18 | // Since there are no other hooks for marginRight, remove the whole object. 19 | delete this.get; 20 | return; 21 | } 22 | 23 | // Hook needed; redefine it so that the support test is not executed again. 24 | 25 | return (this.get = hookFn).apply( this, arguments ); 26 | } 27 | }; 28 | } 29 | 30 | return addGetHookIf; 31 | 32 | }); 33 | -------------------------------------------------------------------------------- /bower_components/jquery/src/css/curCSS.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "exports", 3 | "../core", 4 | "./var/rnumnonpx", 5 | "./var/rmargin", 6 | "../selector" // contains 7 | ], function( exports, jQuery, rnumnonpx, rmargin ) { 8 | 9 | var getStyles, curCSS, 10 | rposition = /^(top|right|bottom|left)$/; 11 | 12 | if ( window.getComputedStyle ) { 13 | getStyles = function( elem ) { 14 | // Support: IE<=11+, Firefox<=30+ (#15098, #14150) 15 | // IE throws on elements created in popups 16 | // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 17 | if ( elem.ownerDocument.defaultView.opener ) { 18 | return elem.ownerDocument.defaultView.getComputedStyle( elem, null ); 19 | } 20 | 21 | return window.getComputedStyle( elem, null ); 22 | }; 23 | 24 | curCSS = function( elem, name, computed ) { 25 | var width, minWidth, maxWidth, ret, 26 | style = elem.style; 27 | 28 | computed = computed || getStyles( elem ); 29 | 30 | // getPropertyValue is only needed for .css('filter') in IE9, see #12537 31 | ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined; 32 | 33 | if ( computed ) { 34 | 35 | if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { 36 | ret = jQuery.style( elem, name ); 37 | } 38 | 39 | // A tribute to the "awesome hack by Dean Edwards" 40 | // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right 41 | // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels 42 | // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values 43 | if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { 44 | 45 | // Remember the original values 46 | width = style.width; 47 | minWidth = style.minWidth; 48 | maxWidth = style.maxWidth; 49 | 50 | // Put in the new values to get a computed value out 51 | style.minWidth = style.maxWidth = style.width = ret; 52 | ret = computed.width; 53 | 54 | // Revert the changed values 55 | style.width = width; 56 | style.minWidth = minWidth; 57 | style.maxWidth = maxWidth; 58 | } 59 | } 60 | 61 | // Support: IE 62 | // IE returns zIndex value as an integer. 63 | return ret === undefined ? 64 | ret : 65 | ret + ""; 66 | }; 67 | } else if ( document.documentElement.currentStyle ) { 68 | getStyles = function( elem ) { 69 | return elem.currentStyle; 70 | }; 71 | 72 | curCSS = function( elem, name, computed ) { 73 | var left, rs, rsLeft, ret, 74 | style = elem.style; 75 | 76 | computed = computed || getStyles( elem ); 77 | ret = computed ? computed[ name ] : undefined; 78 | 79 | // Avoid setting ret to empty string here 80 | // so we don't default to auto 81 | if ( ret == null && style && style[ name ] ) { 82 | ret = style[ name ]; 83 | } 84 | 85 | // From the awesome hack by Dean Edwards 86 | // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 87 | 88 | // If we're not dealing with a regular pixel number 89 | // but a number that has a weird ending, we need to convert it to pixels 90 | // but not position css attributes, as those are proportional to the parent element instead 91 | // and we can't measure the parent instead because it might trigger a "stacking dolls" problem 92 | if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { 93 | 94 | // Remember the original values 95 | left = style.left; 96 | rs = elem.runtimeStyle; 97 | rsLeft = rs && rs.left; 98 | 99 | // Put in the new values to get a computed value out 100 | if ( rsLeft ) { 101 | rs.left = elem.currentStyle.left; 102 | } 103 | style.left = name === "fontSize" ? "1em" : ret; 104 | ret = style.pixelLeft + "px"; 105 | 106 | // Revert the changed values 107 | style.left = left; 108 | if ( rsLeft ) { 109 | rs.left = rsLeft; 110 | } 111 | } 112 | 113 | // Support: IE 114 | // IE returns zIndex value as an integer. 115 | return ret === undefined ? 116 | ret : 117 | ret + "" || "auto"; 118 | }; 119 | } 120 | 121 | exports.getStyles = getStyles; 122 | exports.curCSS = curCSS; 123 | 124 | }); 125 | -------------------------------------------------------------------------------- /bower_components/jquery/src/css/defaultDisplay.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "../core", 3 | "../manipulation" // appendTo 4 | ], function( jQuery ) { 5 | 6 | var iframe, 7 | elemdisplay = {}; 8 | 9 | /** 10 | * Retrieve the actual display of a element 11 | * @param {String} name nodeName of the element 12 | * @param {Object} doc Document object 13 | */ 14 | // Called only from within defaultDisplay 15 | function actualDisplay( name, doc ) { 16 | var style, 17 | elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), 18 | 19 | // getDefaultComputedStyle might be reliably used only on attached element 20 | display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? 21 | 22 | // Use of this method is a temporary fix (more like optmization) until something better comes along, 23 | // since it was removed from specification and supported only in FF 24 | style.display : jQuery.css( elem[ 0 ], "display" ); 25 | 26 | // We don't have any data stored on the element, 27 | // so use "detach" method as fast way to get rid of the element 28 | elem.detach(); 29 | 30 | return display; 31 | } 32 | 33 | /** 34 | * Try to determine the default display value of an element 35 | * @param {String} nodeName 36 | */ 37 | function defaultDisplay( nodeName ) { 38 | var doc = document, 39 | display = elemdisplay[ nodeName ]; 40 | 41 | if ( !display ) { 42 | display = actualDisplay( nodeName, doc ); 43 | 44 | // If the simple way fails, read from inside an iframe 45 | if ( display === "none" || !display ) { 46 | 47 | // Use the already-created iframe if possible 48 | iframe = (iframe || jQuery( "