UNPKG

yrexpert-js

Version:

L'interface Web pour votre système expert...

1,559 lines (1,273 loc) 2.27 MB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: src/js/bundle.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: src/js/bundle.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&amp;&amp;require;if(!u&amp;&amp;a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&amp;&amp;require;for(var o=0;o&lt;r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ /*! ---------------------------------------------------------------------------- | ewd-client: Browser (websocket &amp; HTTP) Client for ewd-xpress applications | | | | Copyright (c) 2016 M/Gateway Developments Ltd, | | Reigate, Surrey UK. | | All rights reserved. | | | | http://www.mgateway.com | | Email: rtweed@mgateway.com | | | | | | Licensed under the Apache License, Version 2.0 (the "License"); | | you may not use this file except in compliance with the License. | | You may obtain a copy of the License at | | | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | | See the License for the specific language governing permissions and | | limitations under the License. | ---------------------------------------------------------------------------- */ 'use strict'; module.exports = require('./lib/ewd'); },{"./lib/ewd":2}],2:[function(require,module,exports){ /* ---------------------------------------------------------------------------- | ewd-client: Browser (websocket &amp; HTTP) Client for ewd-xpress applications | | | | Copyright (c) 2016 M/Gateway Developments Ltd, | | Reigate, Surrey UK. | | All rights reserved. | | | | http://www.mgateway.com | | Email: rtweed@mgateway.com | | | | | | Licensed under the Apache License, Version 2.0 (the "License"); | | you may not use this file except in compliance with the License. | | You may obtain a copy of the License at | | | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | | See the License for the specific language governing permissions and | | limitations under the License. | ---------------------------------------------------------------------------- */ module.exports = { EWD: require('./proto/ewd-client') }; },{"./proto/ewd-client":3}],3:[function(require,module,exports){ /*! ---------------------------------------------------------------------------- | ewd-client: Browser (websocket &amp; HTTP) Client for ewd-xpress applications | | | | Copyright (c) 2016 M/Gateway Developments Ltd, | | Reigate, Surrey UK. | | All rights reserved. | | | | http://www.mgateway.com | | Email: rtweed@mgateway.com | | | | | | Licensed under the Apache License, Version 2.0 (the "License"); | | you may not use this file except in compliance with the License. | | You may obtain a copy of the License at | | | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | | See the License for the specific language governing permissions and | | limitations under the License. | ---------------------------------------------------------------------------- 17 December 2016 */ var EWD; (function() { var events = {}; var emitter = { on: function(type, callback, deleteWhenFinished) { if (!events[type]) events[type] = []; events[type].push({ callback: callback, deleteWhenFinished: deleteWhenFinished }); }, off: function(type, callback) { var event = events[type]; if (typeof callback === 'function') { if (event) { for (var i = 0; i &lt; event.length; i++) { if (event[i].callback === callback) { event.splice(i,1); } } } } else { event = []; } }, emit: function(type, data) { var ev = events[type]; if (!ev || ev.length &lt; 1) return; data = data || {}; for (var i = 0; i &lt; ev.length; i++) { var e = ev[i]; e.callback(data); if (e.deleteWhenFinished &amp;&amp; data.finished) ev.splice(i,1); } } }; var start = function(application, $, io, customAjaxFn, url) { //console.log('starting ewd-client: ' + JSON.stringify(application)); var url; var cookieName = 'ewdSession'; var appName = application; if (typeof application === 'object') { $ = application.$; io = application.io; customAjaxFn = application.ajax; url = application.url; appName = application.application; cookieName = application.cookieName; } function getCookie(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length == 2) return parts.pop().split(";").shift(); } (function(application, io, customAjaxFn, url) { //console.log('application = ' + application); //console.log('customAjaxFn = ' + typeof customAjaxFn); var token; EWD.application = application; function registerEvent(messageObj, callback) { var cb = callback; var type = messageObj.type; if (type === 'ewd-fragment') { type = type + ':' + messageObj.params.file; var targetId = messageObj.params.targetId; var fragmentName = messageObj.params.file; cb = function(responseObj) { if (typeof $ !== 'undefined') $('#' + targetId).html(responseObj.message.content); callback(fragmentName); } delete messageObj.params.targetId; } EWD.on(type, cb, true); } function handleResponse(messageObj) { // messages received back from Node.js //if (EWD.log &amp;&amp; messageObj.type !== 'ewd-register') console.log('raw received: ' + JSON.stringify(messageObj)); if (messageObj.message &amp;&amp; messageObj.message.error &amp;&amp; messageObj.message.disconnect) { if (typeof socket !== 'undefined') { socket.disconnect(); console.log('Socket disconnected'); } EWD.send = function() {}; EWD.emit = function() {}; console.log(messageObj.message.error); return; } if (messageObj.type === 'ewd-register') { token = messageObj.message.token; EWD.setCookie = function(name) { name = name || 'ewd-token'; document.cookie = name + "=" + token; }; console.log(application + ' registered'); EWD.emit('ewd-registered'); return; } if (messageObj.type === 'ewd-reregister') { console.log('Re-registered'); EWD.emit('ewd-reregistered'); return; } if (EWD.log) console.log('received: ' + JSON.stringify(messageObj)); if (messageObj.type === 'ewd-fragment') { if (messageObj.message.error) { EWD.emit('error', messageObj); return; } EWD.emit('ewd-fragment:' + messageObj.message.fragmentName, messageObj); return; } if (messageObj.message &amp;&amp; messageObj.message.error) { var ok = EWD.emit('error', messageObj); if (ok) return; } EWD.emit(messageObj.type, messageObj); }; function ajax(messageObj, callback) { if (callback) { registerEvent(messageObj, callback); } if (token) { messageObj.token = token; } if (token || messageObj.type === 'ewd-register') { messageObj.token = token; console.log('Ajax send: ' + JSON.stringify(messageObj)); (function(type) { function success(data) { console.log('Ajax response for type ' + type + ': ' + JSON.stringify(data)); if (data.ewd_response !== false) { handleResponse({ type: type, message: data, finished: true }); } } function fail(error) { console.log('Error occurred: ' + error); var messageObj = { message: {error: error} }; EWD.emit('error', messageObj); } var params = { url: '/ajax', type: 'post', contentType: 'application/json', data: messageObj, dataType: 'json', timeout: 10000 }; if (customAjaxFn) { customAjaxFn(params, success, fail); } else if (typeof $ !== 'undefined') { $.ajax({ url: params.url, type: params.type, contentType: params.contentType, data: JSON.stringify(params.data), dataType: params.dataType, timeout: params.timeout }) .done(function(data) { success(data); }) .error(function(err) { var error = err.responseJSON.error; fail(error); }); } else { console.log('Error: No Ajax handler function is available'); } }(messageObj.type)); delete messageObj.token; if (EWD.log) console.log('sent: ' + JSON.stringify(messageObj)); } }; EWD.send = function(messageObj, callback) { if (messageObj.ajax) { ajax(messageObj, callback); return; } if (callback) { registerEvent(messageObj, callback); } if (token) { messageObj.token = token; socket.emit('ewdjs', messageObj); delete messageObj.token; if (EWD.log) console.log('sent: ' + JSON.stringify(messageObj)); } }; EWD.getFragment = function(params, callback) { EWD.send({ type: 'ewd-fragment', service: params.service || false, params: { file: params.name, targetId: params.targetId } }, callback); }; if (io) { var socket; if (url) { socket = io(url, { transports: ['websocket'] // needed for react-native }); } else { socket = io.connect(); } socket.on('connect', function() { EWD.disconnectSocket = function() { socket.disconnect(); console.log('EWD disconnected socket'); }; //console.log('token: ' + token + '; ' + cookieName + ' cookie: ' + getCookie(cookieName)); if (!token &amp;&amp; cookieName &amp;&amp; getCookie(cookieName)) token = getCookie(cookieName); if (token) { // re-connection occured - re-register to attach to original Session var message = { type: 'ewd-reregister', token: token }; } else { var message = { type: 'ewd-register', application: application }; } socket.emit('ewdjs', message); }); socket.on('ewdjs', handleResponse); socket.on('disconnect', function() { console.log('*** server has disconnected socket, probably because it shut down'); EWD.emit('socketDisconnected'); }); } else { EWD.send = ajax; EWD.send({ type: 'ewd-register', application: application }); } })(appName, io, customAjaxFn, url); EWD.start = function() {}; io = null; customAjaxFn = null; } var ewd = function() { this.application = 'undefined'; this.log = false; }; var proto = ewd.prototype; proto.on = emitter.on; proto.off = emitter.off; proto.emit = emitter.emit; proto.start = start; EWD = new ewd(); })(); if (typeof module !== 'undefined') module.exports = EWD; },{}],4:[function(require,module,exports){ /*! ---------------------------------------------------------------------------- | ewd-xpress-react: React Client Modules for ewd-xpress | | | | Copyright (c) 2016 M/Gateway Developments Ltd, | | Reigate, Surrey UK. | | All rights reserved. | | | | http://www.mgateway.com | | Email: rtweed@mgateway.com | | | | | | Licensed under the Apache License, Version 2.0 (the "License"); | | you may not use this file except in compliance with the License. | | You may obtain a copy of the License at | | | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | | See the License for the specific language governing permissions and | | limitations under the License. | ---------------------------------------------------------------------------- */ 'use strict'; module.exports = require('./lib/ewd-react'); },{"./lib/ewd-react":6}],5:[function(require,module,exports){ /* ---------------------------------------------------------------------------- | ewd-xpress-react: React Client Modules for ewd-xpress | | | | Copyright (c) 2016 M/Gateway Developments Ltd, | | Reigate, Surrey UK. | | All rights reserved. | | | | http://www.mgateway.com | | Email: rtweed@mgateway.com | | | | | | Licensed under the Apache License, Version 2.0 (the "License"); | | you may not use this file except in compliance with the License. | | You may obtain a copy of the License at | | | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | | See the License for the specific language governing permissions and | | limitations under the License. | ---------------------------------------------------------------------------- 14 December 2016 */ module.exports = function (envObj, component, $, io) { // Here we do all the EWD-specific stuff envObj.on('ewd-registered', function() { component.setState({ status: 'go' }); }); envObj.on('ewd-reregistered', function() { if (component.state.status === 'wait') { component.setState({ status: 'go' }); } }); envObj.on('socketDisconnected', function() { if (component.state.status === 'wait') { component.setState({ status: 'disconnected' }); } }); component.start = function(application) { envObj.start(application, $, io); }; envObj.componentPaths = {}; envObj.updateComponentPath = function(component) { // builds a React component hierarchy for the application var componentPath = component.props.componentPath; var path = componentPath.slice(0); path.push(component.constructor.displayName); var pathStr = JSON.stringify(path); if (!envObj[pathStr]) { console.log('Component path: ' + pathStr); envObj.send({ type: 'updateComponentPath', params: { path: path }, service: 'ewd-react-tools' }); envObj[pathStr] = true; } return path; }; return envObj; }; },{}],6:[function(require,module,exports){ /* ---------------------------------------------------------------------------- | ewd-xpress-react: React Client Modules for ewd-xpress | | | | Copyright (c) 2016 M/Gateway Developments Ltd, | | Reigate, Surrey UK. | | All rights reserved. | | | | http://www.mgateway.com | | Email: rtweed@mgateway.com | | | | | | Licensed under the Apache License, Version 2.0 (the "License"); | | you may not use this file except in compliance with the License. | | You may obtain a copy of the License at | | | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | | See the License for the specific language governing permissions and | | limitations under the License. | ---------------------------------------------------------------------------- 27 April 2016 */ var loader = require('./loader'); var controller = require('./controller'); module.exports = { loader: loader, controller: controller }; },{"./controller":5,"./loader":7}],7:[function(require,module,exports){ /* ---------------------------------------------------------------------------- | ewd-xpress-react: React Client Modules for ewd-xpress | | | | Copyright (c) 2016 M/Gateway Developments Ltd, | | Reigate, Surrey UK. | | All rights reserved. | | | | http://www.mgateway.com | | Email: rtweed@mgateway.com | | | | | | Licensed under the Apache License, Version 2.0 (the "License"); | | you may not use this file except in compliance with the License. | | You may obtain a copy of the License at | | | | http://www.apache.org/licenses/LICENSE-2.0 | | | | Unless required by applicable law or agreed to in writing, software | | distributed under the License is distributed on an "AS IS" BASIS, | | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | | See the License for the specific language governing permissions and | | limitations under the License. | ---------------------------------------------------------------------------- 14 December 2016 */ "use strict" var React = require('react'); var ReactDOM = require('react-dom'); var ewdClient = require('ewd-client'); var ewdController = require('./controller'); module.exports = function(params) { var io; if (!params.no_sockets) io = require('socket.io-client'); var $; if (!params.ajax) $ = require('jquery'); var EWD = ewdClient.EWD; //console.log('cwd = ' + process.cwd()); EWD.application = { name: params.applicationName || 'unknown', mode: params.mode || 'development', log: params.log || true }; EWD.log = params.log || false; //console.log('EWD = ' + JSON.stringify(EWD)); var MainPage = params.MainPage; var Top = React.createClass({displayName: "Top", getInitialState: function() { return { status: 'wait', } }, componentWillMount: function() { // set up EWD.js-specific context this.controller = ewdController(EWD, this, $, io); }, componentDidMount: function() { if (params.log) console.log('starting EWD'); var startParams = { application: EWD.application.name, cookieName: params.cookieName, url: params.url, io: io, $: $ }; this.start(startParams); }, render: function render() { var componentPath = ['app']; var renderComponent; if (this.state.status === 'wait') { renderComponent = React.createElement( 'div', null, 'Please wait...' ); } else { renderComponent = React.createElement(MainPage, { controller: this.controller, componentPath: componentPath, status: this.state.status }); } return renderComponent; } }); ReactDOM.render(React.createElement(Top, null), document.getElementById('content')); }; },{"./controller":5,"ewd-client":1,"jquery":8,"react":618,"react-dom":262,"socket.io-client":619}],8:[function(require,module,exports){ /*! * jQuery JavaScript Library v3.1.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2016-09-22T22:30Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" &amp;&amp; typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge &lt;= 12 - 13+, Firefox &lt;=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var document = window.document; var getProto = Object.getPrototypeOf; var slice = arr.slice; var concat = arr.concat; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; function DOMEval( code, doc ) { doc = doc || document; var script = doc.createElement( "script" ); script.text = code; doc.head.appendChild( script ).parentNode.removeChild( script ); } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.1.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, // Support: Android &lt;=4.0 only // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, // Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return letter.toUpperCase(); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num &lt; 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, eq: function( i ) { var len = this.length, j = +i + ( i &lt; 0 ? len : 0 ); return this.pushStack( j >= 0 &amp;&amp; j &lt; len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" &amp;&amp; !jQuery.isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i &lt; length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep &amp;&amp; copy &amp;&amp; ( jQuery.isPlainObject( copy ) || ( copyIsArray = jQuery.isArray( copy ) ) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src &amp;&amp; jQuery.isArray( src ) ? src : []; } else { clone = src &amp;&amp; jQuery.isPlainObject( src ) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isFunction: function( obj ) { return jQuery.type( obj ) === "function"; }, isArray: Array.isArray, isWindow: function( obj ) { return obj != null &amp;&amp; obj === obj.window; }, isNumeric: function( obj ) { // As of jQuery 3.0, isNumeric is limited to // strings and numbers (primitives or objects) // that can be coerced to finite numbers (gh-2662) var type = jQuery.type( obj ); return ( type === "number" || type === "string" ) &amp;&amp; // parseFloat NaNs numeric-cast false positives ("") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN !isNaN( obj - parseFloat( obj ) ); }, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) &amp;&amp; proto.constructor; return typeof Ctor === "function" &amp;&amp; fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { /* eslint-disable no-unused-vars */ // See https://github.com/eslint/eslint/issues/6125 var name; for ( name in obj ) { return false; } return true; }, type: function( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android &lt;=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; }, // Evaluates a script in a global context globalEval: function( code ) { DOMEval( code ); }, // Convert dashed to camelCase; used by the css and data modules // Support: IE &lt;=9 - 11, Edge 12 - 13 // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName &amp;&amp; elem.nodeName.toLowerCase() === name.toLowerCase(); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i &lt; length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // Support: Android &lt;=4.0 only trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android &lt;=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j &lt; len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i &lt; length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i &lt; length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var tmp, args, proxy; if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind args = slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++; return proxy; }, now: Date.now, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj &amp;&amp; "length" in obj &amp;&amp; obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" &amp;&amp; length > 0 &amp;&amp; ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.3 * https://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2016-08-08 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i &lt; len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox&lt;24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high &lt; 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high &amp; 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, disabledAncestor = addCombinator( function( elem ) { return elem.disabled === true &amp;&amp; ("form" in elem || "label" in elem); }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android&lt;4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE&lt;9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context &amp;&amp; context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 &amp;&amp; nodeType !== 9 &amp;&amp; nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 &amp;&amp; (match = rquickExpr.exec( selector )) ) { // ID selector if ( (m = match[1]) ) { // Document context if ( nodeType === 9 ) { if ( (elem = context.getElementById( m )) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext &amp;&amp; (elem = newContext.getElementById( m )) &amp;&amp; contains( context, elem ) &amp;&amp; elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( (m = match[3]) &amp;&amp; support.getElementsByClassName &amp;&amp; context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa &amp;&amp; !compilerCache[ selector + " " ] &amp;&amp; (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { if ( nodeType !== 1 ) { newContext = context; newSelector = selector; // qSA looks outside Element context, which is not what we want // Thanks to Andrew Dupont for this workaround technique // Support: IE &lt;=8 // Exclude object elements } else if ( context.nodeName.toLowerCase() !== "object" ) { // Capture the context ID, setting it first if necessary if ( (nid = context.getAttribute( "id" )) ) { nid = nid.replace( rcssescape, fcssescape ); } else