/*! * jQuery JavaScript Library v2.0.3 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2013-07-03T13:30Z */ (function( window, undefined ) { // Can't do this because several apps including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if // you try to trace through "use strict" call chains. (#13335) // Support: Firefox 18+ //"use strict"; var // A central reference to the root jQuery(document) rootjQuery, // The deferred used on DOM ready readyList, // Support: IE9 // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` core_strundefined = typeof undefined, // Use the correct document accordingly with window argument (sandbox) location = window.location, document = window.document, docElem = document.documentElement, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // [[Class]] -> type pairs class2type = {}, // List of deleted data cache ids, so we can reuse them core_deletedIds = [], core_version = "2.0.3", // Save a reference to some core methods core_concat = core_deletedIds.concat, core_push = core_deletedIds.push, core_slice = core_deletedIds.slice, core_indexOf = core_deletedIds.indexOf, core_toString = class2type.toString, core_hasOwn = class2type.hasOwnProperty, core_trim = core_version.trim, // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Used for matching numbers core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, // Used for splitting on whitespace core_rnotwhite = /\S+/g, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, // Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([\da-z])/gi, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return letter.toUpperCase(); }, // The ready event handler and self cleanup method completed = function() { document.removeEventListener( "DOMContentLoaded", completed, false ); window.removeEventListener( "load", completed, false ); jQuery.ready(); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: core_version, constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Handle HTML strings if ( typeof selector === "string" ) { if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; // scripts is true for back-compat jQuery.merge( this, jQuery.parseHTML( match[1], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The default length of a jQuery object is 0 length: 0, toArray: function() { return core_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 num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : 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; ret.context = this.context; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Add the callback jQuery.ready.promise().done( fn ); return this; }, slice: function() { return this.pushStack( core_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 < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: core_push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; 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; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < 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 && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && 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" + ( core_version + Math.random() ).replace( /\D/g, "" ), noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger("ready").off("ready"); } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray, isWindow: function( obj ) { return obj != null && obj === obj.window; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { if ( obj == null ) { return String( obj ); } // Support: Safari <= 5.1 (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ core_toString.call(obj) ] || "object" : typeof obj; }, isPlainObject: function( obj ) { // Not plain objects: // - Any object or value whose internal [[Class]] property is not "[object Object]" // - DOM nodes // - window if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } // Support: Firefox <20 // The try/catch suppresses exceptions thrown when attempting to access // the "constructor" property of certain host objects, ie. |window.location| // https://bugzilla.mozilla.org/show_bug.cgi?id=814622 try { if ( obj.constructor && !core_hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { return false; } } catch ( e ) { return false; } // If the function hasn't returned already, we're confident that // |obj| is a plain object, created by {} or constructed with new Object return true; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, // data: string of html // context (optional): If specified, the fragment will be created in this context, defaults to document // keepScripts (optional): If true, will include scripts passed in the html string parseHTML: function( data, context, keepScripts ) { if ( !data || typeof data !== "string" ) { return null; } if ( typeof context === "boolean" ) { keepScripts = context; context = false; } context = context || document; var parsed = rsingleTag.exec( data ), scripts = !keepScripts && []; // Single tag if ( parsed ) { return [ context.createElement( parsed[1] ) ]; } parsed = jQuery.buildFragment( [ data ], context, scripts ); if ( scripts ) { jQuery( scripts ).remove(); } return jQuery.merge( [], parsed.childNodes ); }, parseJSON: JSON.parse, // Cross-browser xml parsing parseXML: function( data ) { var xml, tmp; if ( !data || typeof data !== "string" ) { return null; } // Support: IE9 try { tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context globalEval: function( code ) { var script, indirect = eval; code = jQuery.trim( code ); if ( code ) { // If the code includes a valid, prologue position // strict mode pragma, execute code by injecting a // script tag into the document. if ( code.indexOf("use strict") === 1 ) { script = document.createElement("script"); script.text = code; document.head.appendChild( script ).parentNode.removeChild( script ); } else { // Otherwise, avoid the DOM node creation, insertion // and removal by using an indirect global eval indirect( code ); } } }, // Convert dashed to camelCase; used by the css and data modules // 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 && elem.nodeName.toLowerCase() === name.toLowerCase(); }, // args is for internal usage only each: function( obj, callback, args ) { var value, i = 0, length = obj.length, isArray = isArraylike( obj ); if ( args ) { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } } return obj; }, trim: function( text ) { return text == null ? "" : core_trim.call( text ); }, // 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 { core_push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : core_indexOf.call( arr, elem, i ); }, merge: function( first, second ) { var l = second.length, i = first.length, j = 0; if ( typeof l === "number" ) { for ( ; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var retVal, ret = [], i = 0, length = elems.length; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, i = 0, length = elems.length, isArray = isArraylike( elems ), ret = []; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return core_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 = core_slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( core_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; }, // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function access: function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, length = elems.length, bulk = key == null; // Sets many values if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !jQuery.isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < length; i++ ) { fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); } } } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }, now: Date.now, // A method for quickly swapping in/out CSS properties to get correct calculations. // Note: this method belongs to the css module but it's needed here for the support module. // If support gets modularized, this method should be moved back to the css module. swap: function( elem, options, callback, args ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.apply( elem, args || [] ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; } }); jQuery.ready.promise = function( obj ) { if ( !readyList ) { readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called after the browser event has already occurred. // we once tried to use readyState "interactive" here, but it caused issues like the one // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed, false ); } } return readyList.promise( obj ); }; // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); function isArraylike( obj ) { var length = obj.length, type = jQuery.type( obj ); if ( jQuery.isWindow( obj ) ) { return false; } if ( obj.nodeType === 1 && length ) { return true; } return type === "array" || type !== "function" && ( length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj ); } // All jQuery objects should point back to these rootjQuery = jQuery(document); /*! * Sizzle CSS Selector Engine v1.9.4-pre * http://sizzlejs.com/ * * Copyright 2013 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2013-06-03 */ (function( window, undefined ) { var i, support, cachedruns, Expr, getText, isXML, compile, outermostContext, sortInput, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + -(new Date()), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), hasDuplicate = false, sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } return 0; }, // General-purpose constants strundefined = typeof undefined, MAX_NEGATIVE = 1 << 31, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf if we can't use a native one indexOf = arr.indexOf || function( elem ) { var i = 0, len = this.length; for ( ; i < len; i++ ) { if ( this[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 // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/css3-syntax/#characters characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", // Loosely modeled on CSS identifier characters // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = characterEncoding.replace( "w", "w#" ), // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", // Prefer arguments quoted, // then not containing pseudos/brackets, // then attribute selectors/non-parenthetical expressions, // then anything else // These preferences are here to reduce the number of selectors // needing tokenize in the PSEUDO preFilter pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rsibling = new RegExp( whitespace + "*[+~]" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + characterEncoding + ")" ), "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), "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" ) }, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rescape = /'|\\/g, // 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 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : // BMP codepoint high < 0 ? String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }; // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<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<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 match, elem, m, nodeType, // QSA vars i, groups, old, nid, newContext, newSelector; if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; results = results || []; if ( !selector || typeof selector !== "string" ) { return results; } if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { return []; } if ( documentIsHTML && !seed ) { // Shortcuts if ( (match = rquickExpr.exec( selector )) ) { // Speed-up: Sizzle("#ID") if ( (m = match[1]) ) { if ( nodeType === 9 ) { elem = context.getElementById( m ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE, Opera, and Webkit return items // by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } } else { // Context is not a document if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Speed-up: Sizzle("TAG") } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Speed-up: Sizzle(".CLASS") } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // QSA path if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { nid = old = expando; newContext = context; newSelector = nodeType === 9 && selector; // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { groups = tokenize( selector ); if ( (old = context.getAttribute("id")) ) { nid = old.replace( rescape, "\\$&" ); } else { context.setAttribute( "id", nid ); } nid = "[id='" + nid + "'] "; i = groups.length; while ( i-- ) { groups[i] = nid + toSelector( groups[i] ); } newContext = rsibling.test( selector ) && context.parentNode || context; newSelector = groups.join(","); } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch(qsaError) { } finally { if ( !old ) { context.removeAttribute("id"); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {Function(string, Object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key += " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created div and expects a boolean result */ function assert( fn ) { var div = document.createElement("div"); try { return !!fn( div ); } catch (e) { return false; } finally { // Remove from its parent by default if ( div.parentNode ) { div.parentNode.removeChild( div ); } // release memory in IE div = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = attrs.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Detect xml * @param {Element|Object} elem An element or a document */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; // Expose support vars for convenience support = Sizzle.support = {}; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var doc = node ? node.ownerDocument || node : preferredDoc, parent = doc.defaultView; // If no document and documentElement is available, return if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Set our document document = doc; docElem = doc.documentElement; // Support tests documentIsHTML = !isXML( doc ); // Support: IE>8 // If iframe document is assigned to "document" variable and if iframe has been reloaded, // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 // IE6-8 do not support the defaultView property so parent will be undefined if ( parent && parent.attachEvent && parent !== parent.top ) { parent.attachEvent( "onbeforeunload", function() { setDocument(); }); } /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( div ) { div.appendChild( doc.createComment("") ); return !div.getElementsByTagName("*").length; }); // Check if getElementsByClassName can be trusted support.getElementsByClassName = assert(function( div ) { div.innerHTML = "
"; // Support: Safari<4 // Catch class over-caching div.firstChild.className = "i"; // Support: Opera<10 // Catch gEBCN failure to find non-leading classes return div.getElementsByClassName("i").length === 2; }); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( div ) { docElem.appendChild( div ).id = expando; return !doc.getElementsByName || !doc.getElementsByName( expando ).length; }); // ID find and filter if ( support.getById ) { Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== strundefined && documentIsHTML ) { var m = context.getElementById( id ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; } else { // Support: IE6/7 // getElementById is not reliable as a find shortcut delete Expr.find["ID"]; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== strundefined ) { return context.getElementsByTagName( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( div ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 div.innerHTML = ""; // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !div.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } }); assert(function( div ) { // Support: Opera 10-12/IE8 // ^= $= *= and empty values // Should not select anything // Support: Windows 8 Native Apps // The type attribute is restricted during .innerHTML assignment var input = doc.createElement("input"); input.setAttribute( "type", "hidden" ); div.appendChild( input ).setAttribute( "t", "" ); if ( div.querySelectorAll("[t^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":enabled").length ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos div.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( div ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( div, "div" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( div, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ // Element contains another // Purposefully does not implement inclusive descendent // As in, an element does not contain itself contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = docElem.compareDocumentPosition ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); if ( compare ) { // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === doc || contains(preferredDoc, a) ) { return -1; } if ( b === doc || contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } // Not directly comparable, sort on existence of method return a.compareDocumentPosition ? -1 : 1; } : function( a, b ) { var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; // Parentless nodes are either documents or disconnected } else if ( !aup || !bup ) { return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return doc; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch(e) {} } return Sizzle( expr, document, null, [elem] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val === undefined ? support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null : val; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array for ( ; (node = elem[i]); i++ ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (see #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[5] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] && match[4] !== undefined ) { match[2] = match[4]; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index outerCache = parent[ expando ] || (parent[ expando ] = {}); cache = outerCache[ type ] || []; nodeIndex = cache[0] === dirruns && cache[1]; diff = cache[0] === dirruns && cache[2]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } // Use previously-cached element index if available } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { diff = cache[1]; // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) } else { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf.call( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": function( elem ) { return elem.disabled === false; }, "disabled": function( elem ) { return elem.disabled === true; }, "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), // not comment, processing instructions, or others // Thanks to Diego Perini for the nodeName shortcut // Greater than "@" means alpha characters (specifically not starting with "#" or "?") for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); function tokenize( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( tokens = [] ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); } function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var data, cache, outerCache, dirkey = dirruns + " " + doneName; // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { if ( (data = cache[1]) === true || data === cachedruns ) { return data === true; } } else { cache = outerCache[ dir ] = [ dirkey ]; cache[1] = matcher( elem, context, xml ) || cachedruns; if ( cache[1] === true ) { return true; } } } } } }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf.call( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { // A counter to specify which element is currently being matched var matcherCachedRuns = 0, bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, expandContext ) { var elem, j, matcher, setMatched = [], matchedCount = 0, i = "0", unmatched = seed && [], outermost = expandContext != null, contextBackup = outermostContext, // We must always have either seed elements or context elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); if ( outermost ) { outermostContext = context !== document && context; cachedruns = matcherCachedRuns; } // Add elements passing elementMatchers directly to results // Keep `i` a string if there are no elements so `matchedCount` will be "00" below for ( ; (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; cachedruns = ++matcherCachedRuns; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // Apply set filters to unmatched elements matchedCount += i; if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !group ) { group = tokenize( selector ); } i = group.length; while ( i-- ) { cached = matcherFromTokens( group[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); } return cached; }; function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function select( selector, context, results, seed ) { var i, tokens, token, type, find, match = tokenize( selector ); if ( !seed ) { // Try to minimize operations if there is only one group if ( match.length === 1 ) { // Take a shortcut and set the context if the root selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && context.parentNode || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } } // Compile and execute a filtering function // Provide `match` to avoid retokenization if we modified the selector above compile( selector, match )( seed, context, !documentIsHTML, results, rsibling.test( selector ) ); return results; } // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome<14 // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( div1 ) { // Should return 1, but returns 4 (following) return div1.compareDocumentPosition( document.createElement("div") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( div ) { div.innerHTML = ""; return div.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( div ) { div.innerHTML = ""; div.firstChild.setAttribute( "value", "" ); return div.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( div ) { return div.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return (val = elem.getAttributeNode( name )) && val.specified ? val.value : elem[ name ] === true ? name.toLowerCase() : null; } }); } jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.pseudos; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })( window ); // String to Object options format cache var optionsCache = {}; // Convert String-formatted options into Object-formatted ones and store in cache function createOptions( options ) { var object = optionsCache[ options ] = {}; jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { object[ flag ] = true; }); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? ( optionsCache[ options ] || createOptions( options ) ) : jQuery.extend( {}, options ); var // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = !options.once && [], // Fire callbacks fire = function( data ) { memory = options.memory && data; fired = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; firing = true; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { memory = false; // To prevent further calls using add break; } } firing = false; if ( list ) { if ( stack ) { if ( stack.length ) { fire( stack.shift() ); } } else if ( memory ) { list = []; } else { self.disable(); } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // First, we save the current length var start = list.length; (function add( args ) { jQuery.each( args, function( _, arg ) { var type = jQuery.type( arg ); if ( type === "function" ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && type !== "string" ) { // Inspect recursively add( arg ); } }); })( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away } else if ( memory ) { firingStart = start; fire( memory ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { jQuery.each( arguments, function( _, arg ) { var index; while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( firing ) { if ( index <= firingLength ) { firingLength--; } if ( index <= firingIndex ) { firingIndex--; } } } }); } return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); }, // Remove all callbacks from the list empty: function() { list = []; firingLength = 0; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( list && ( !fired || stack ) ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; if ( firing ) { stack.push( args ); } else { fire( args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; jQuery.extend({ Deferred: function( func ) { var tuples = [ // action, add listener, listener list, final state [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], [ "notify", "progress", jQuery.Callbacks("memory") ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, then: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred(function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var action = tuple[ 0 ], fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; // deferred[ done | fail | progress ] for forwarding actions to newDefer deferred[ tuple[1] ](function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() .done( newDefer.resolve ) .fail( newDefer.reject ) .progress( newDefer.notify ); } else { newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } }); }); fns = null; }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Keep pipe for back-compat promise.pipe = promise.then; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 3 ]; // promise[ done | fail | progress ] = list.add promise[ tuple[1] ] = list.add; // Handle state if ( stateString ) { list.add(function() { // state = [ resolved | rejected ] state = stateString; // [ reject_list | resolve_list ].disable; progress_list.lock }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); } // deferred[ resolve | reject | notify ] deferred[ tuple[0] ] = function() { deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; deferred[ tuple[0] + "With" ] = list.fireWith; }); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, resolveValues = core_slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, // the master Deferred. If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), // Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { return function( value ) { contexts[ i ] = this; values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; if( values === progressValues ) { deferred.notifyWith( contexts, values ); } else if ( !( --remaining ) ) { deferred.resolveWith( contexts, values ); } }; }, progressValues, progressContexts, resolveContexts; // add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ) .progress( updateFunc( i, progressContexts, progressValues ) ); } else { --remaining; } } } // if we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); } return deferred.promise(); } }); jQuery.support = (function( support ) { var input = document.createElement("input"), fragment = document.createDocumentFragment(), div = document.createElement("div"), select = document.createElement("select"), opt = select.appendChild( document.createElement("option") ); // Finish early in limited environments if ( !input.type ) { return support; } input.type = "checkbox"; // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere) support.checkOn = input.value !== ""; // Must access the parent to make an option select properly // Support: IE9, IE10 support.optSelected = opt.selected; // Will be defined later support.reliableMarginRight = true; support.boxSizingReliable = true; support.pixelPosition = false; // Make sure checked status is properly cloned // Support: IE9, IE10 input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Check if an input maintains its value after becoming a radio // Support: IE9, IE10 input = document.createElement("input"); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; // #11217 - WebKit loses check when the name is after the checked attribute input.setAttribute( "checked", "t" ); input.setAttribute( "name", "t" ); fragment.appendChild( input ); // Support: Safari 5.1, Android 4.x, Android 2.3 // old WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: Firefox, Chrome, Safari // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) support.focusinBubbles = "onfocusin" in window; div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; // Run tests that need a body at doc ready jQuery(function() { var container, marginDiv, // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box", body = document.getElementsByTagName("body")[ 0 ]; if ( !body ) { // Return for frameset docs that don't have a body return; } container = document.createElement("div"); container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; // Check box-sizing and margin behavior. body.appendChild( container ).appendChild( div ); div.innerHTML = ""; // Support: Firefox, Android 2.3 (Prefixed box-sizing versions). div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%"; // Workaround failing boxSizing test due to offsetWidth returning wrong value // with some non-1 values of body zoom, ticket #13543 jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { support.boxSizing = div.offsetWidth === 4; }); // Use window.getComputedStyle because jsdom on node.js will break without it. if ( window.getComputedStyle ) { support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; // Support: Android 2.3 // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. (#3333) // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right marginDiv = div.appendChild( document.createElement("div") ); marginDiv.style.cssText = div.style.cssText = divReset; marginDiv.style.marginRight = marginDiv.style.width = "0"; div.style.width = "1px"; support.reliableMarginRight = !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); } body.removeChild( container ); }); return support; })( {} ); /* Implementation Summary 1. Enforce API surface and semantic compatibility with 1.9.x branch 2. Improve the module's maintainability by reducing the storage paths to a single mechanism. 3. Use the same single mechanism to support "private" and "user" data. 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 5. Avoid exposing implementation details on user objects (eg. expando properties) 6. Provide a clear path for implementation upgrade to WeakMap in 2014 */ var data_user, data_priv, rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, rmultiDash = /([A-Z])/g; function Data() { // Support: Android < 4, // Old WebKit does not have Object.preventExtensions/freeze method, // return new empty object instead with no [[set]] accessor Object.defineProperty( this.cache = {}, 0, { get: function() { return {}; } }); this.expando = jQuery.expando + Math.random(); } Data.uid = 1; Data.accepts = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType ? owner.nodeType === 1 || owner.nodeType === 9 : true; }; Data.prototype = { key: function( owner ) { // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return the key for a frozen object. if ( !Data.accepts( owner ) ) { return 0; } var descriptor = {}, // Check if the owner object already has a cache key unlock = owner[ this.expando ]; // If not, create one if ( !unlock ) { unlock = Data.uid++; // Secure it in a non-enumerable, non-writable property try { descriptor[ this.expando ] = { value: unlock }; Object.defineProperties( owner, descriptor ); // Support: Android < 4 // Fallback to a less secure definition } catch ( e ) { descriptor[ this.expando ] = unlock; jQuery.extend( owner, descriptor ); } } // Ensure the cache object if ( !this.cache[ unlock ] ) { this.cache[ unlock ] = {}; } return unlock; }, set: function( owner, data, value ) { var prop, // There may be an unlock assigned to this node, // if there is no entry for this "owner", create one inline // and set the unlock as though an owner entry had always existed unlock = this.key( owner ), cache = this.cache[ unlock ]; // Handle: [ owner, key, value ] args if ( typeof data === "string" ) { cache[ data ] = value; // Handle: [ owner, { properties } ] args } else { // Fresh assignments by object are shallow copied if ( jQuery.isEmptyObject( cache ) ) { jQuery.extend( this.cache[ unlock ], data ); // Otherwise, copy the properties one-by-one to the cache object } else { for ( prop in data ) { cache[ prop ] = data[ prop ]; } } } return cache; }, get: function( owner, key ) { // Either a valid cache is found, or will be created. // New caches will be created and the unlock returned, // allowing direct access to the newly created // empty data object. A valid owner object must be provided. var cache = this.cache[ this.key( owner ) ]; return key === undefined ? cache : cache[ key ]; }, access: function( owner, key, value ) { var stored; // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ((key && typeof key === "string") && value === undefined) ) { stored = this.get( owner, key ); return stored !== undefined ? stored : this.get( owner, jQuery.camelCase(key) ); } // [*]When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, name, camel, unlock = this.key( owner ), cache = this.cache[ unlock ]; if ( key === undefined ) { this.cache[ unlock ] = {}; } else { // Support array or space separated string of keys if ( jQuery.isArray( key ) ) { // If "name" is an array of keys... // When data is initially created, via ("key", "val") signature, // keys will be converted to camelCase. // Since there is no way to tell _how_ a key was added, remove // both plain key and camelCase key. #12786 // This will only penalize the array argument path. name = key.concat( key.map( jQuery.camelCase ) ); } else { camel = jQuery.camelCase( key ); // Try the string as a key before any manipulation if ( key in cache ) { name = [ key, camel ]; } else { // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace name = camel; name = name in cache ? [ name ] : ( name.match( core_rnotwhite ) || [] ); } } i = name.length; while ( i-- ) { delete cache[ name[ i ] ]; } } }, hasData: function( owner ) { return !jQuery.isEmptyObject( this.cache[ owner[ this.expando ] ] || {} ); }, discard: function( owner ) { if ( owner[ this.expando ] ) { delete this.cache[ owner[ this.expando ] ]; } } }; // These may be used throughout the jQuery core codebase data_user = new Data(); data_priv = new Data(); jQuery.extend({ acceptData: Data.accepts, hasData: function( elem ) { return data_user.hasData( elem ) || data_priv.hasData( elem ); }, data: function( elem, name, data ) { return data_user.access( elem, name, data ); }, removeData: function( elem, name ) { data_user.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to data_priv methods, these can be deprecated. _data: function( elem, name, data ) { return data_priv.access( elem, name, data ); }, _removeData: function( elem, name ) { data_priv.remove( elem, name ); } }); jQuery.fn.extend({ data: function( key, value ) { var attrs, name, elem = this[ 0 ], i = 0, data = null; // Gets all values if ( key === undefined ) { if ( this.length ) { data = data_user.get( elem ); if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { attrs = elem.attributes; for ( ; i < attrs.length; i++ ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.slice(5) ); dataAttr( elem, name, data[ name ] ); } } data_priv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { data_user.set( this, key ); }); } return jQuery.access( this, function( value ) { var data, camelKey = jQuery.camelCase( key ); // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // with the key as-is data = data_user.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to get data from the cache // with the key camelized data = data_user.get( elem, camelKey ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, camelKey, undefined ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each(function() { // First, attempt to store a copy or reference of any // data that might've been store with a camelCased key. var data = data_user.get( this, camelKey ); // For HTML5 data-* attribute interop, we have to // store property names with dashes in a camelCase form. // This might not apply to all properties...* data_user.set( this, camelKey, value ); // *... In the case of properties that might _actually_ // have dashes, we need to also store a copy of that // unchanged property. if ( key.indexOf("-") !== -1 && data !== undefined ) { data_user.set( this, key, value ); } }); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each(function() { data_user.remove( this, key ); }); } }); function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : // Only convert to a number if it doesn't change the string +data + "" === data ? +data : rbrace.test( data ) ? JSON.parse( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later data_user.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend({ queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = data_priv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || jQuery.isArray( data ) ) { queue = data_priv.access( elem, type, jQuery.makeArray(data) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // not intended for public consumption - generates a queueHooks object, or returns the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return data_priv.get( elem, key ) || data_priv.access( elem, key, { empty: jQuery.Callbacks("once memory").add(function() { data_priv.remove( elem, [ type + "queue", key ] ); }) }); } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); // ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while( i-- ) { tmp = data_priv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } }); var nodeHook, boolHook, rclass = /[\t\r\n\f]/g, rreturn = /\r/g, rfocusable = /^(?:input|select|textarea|button)$/i; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each(function() { delete this[ jQuery.propFix[ name ] || name ]; }); }, addClass: function( value ) { var classes, elem, cur, clazz, j, i = 0, len = this.length, proceed = typeof value === "string" && value; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call( this, j, this.className ) ); }); } if ( proceed ) { // The disjunction here is for better compressibility (see removeClass) classes = ( value || "" ).match( core_rnotwhite ) || []; for ( ; i < len; i++ ) { elem = this[ i ]; cur = elem.nodeType === 1 && ( elem.className ? ( " " + elem.className + " " ).replace( rclass, " " ) : " " ); if ( cur ) { j = 0; while ( (clazz = classes[j++]) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } elem.className = jQuery.trim( cur ); } } } return this; }, removeClass: function( value ) { var classes, elem, cur, clazz, j, i = 0, len = this.length, proceed = arguments.length === 0 || typeof value === "string" && value; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call( this, j, this.className ) ); }); } if ( proceed ) { classes = ( value || "" ).match( core_rnotwhite ) || []; for ( ; i < len; i++ ) { elem = this[ i ]; // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( elem.className ? ( " " + elem.className + " " ).replace( rclass, " " ) : "" ); if ( cur ) { j = 0; while ( (clazz = classes[j++]) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { cur = cur.replace( " " + clazz + " ", " " ); } } elem.className = value ? jQuery.trim( cur ) : ""; } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value; if ( typeof stateVal === "boolean" && type === "string" ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), classNames = value.match( core_rnotwhite ) || []; while ( (className = classNames[ i++ ]) ) { // check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( type === core_strundefined || type === "boolean" ) { if ( this.className ) { // store className if set data_priv.set( this, "__className__", this.className ); } // If the element has a class name or if we're passed "false", // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, option, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one" || index < 0, values = one ? null : [], max = one ? index + 1 : options.length, i = index < 0 ? max : one ? index : 0; // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // IE6-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { optionSet = true; } } // force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } }, attr: function( elem, name, value ) { var hooks, ret, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === core_strundefined ) { return jQuery.prop( elem, name, value ); } // All attributes are lowercase // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, value + "" ); return value; } } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; } }, removeAttr: function( elem, value ) { var name, propName, i = 0, attrNames = value && value.match( core_rnotwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( (name = attrNames[i++]) ) { propName = jQuery.propFix[ name ] || name; // Boolean attributes get special treatment (#10870) if ( jQuery.expr.match.bool.test( name ) ) { // Set corresponding property to false elem[ propName ] = false; } elem.removeAttribute( name ); } } }, attrHooks: { type: { set: function( elem, value ) { if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to default in case type is set after value during creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, propFix: { "for": "htmlFor", "class": "className" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? ret : ( elem[ name ] = value ); } else { return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? ret : elem[ name ]; } }, propHooks: { tabIndex: { get: function( elem ) { return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ? elem.tabIndex : -1; } } } }); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) { var fn = jQuery.expr.attrHandle[ name ], ret = isXML ? undefined : /* jshint eqeqeq: false */ // Temporarily disable this handler to check existence (jQuery.expr.attrHandle[ name ] = undefined) != getter( elem, name, isXML ) ? name.toLowerCase() : null; // Restore handler jQuery.expr.attrHandle[ name ] = fn; return ret; }; }); // Support: IE9+ // Selectedness for an option in an optgroup can be inaccurate if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; } }; } jQuery.each([ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; }); // Radios and checkboxes getter/setter jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }; if ( !jQuery.support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { // Support: Webkit // "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; }; } }); var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; function returnTrue() { return true; } function returnFalse() { return false; } function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = data_priv.get( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !(events = elemData.events) ) { events = elemData.events = {}; } if ( !(eventHandle = elemData.handle) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space types = ( types || "" ).match( core_rnotwhite ) || [""]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first if ( !(handlers = events[ type ]) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = data_priv.hasData( elem ) && data_priv.get( elem ); if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( core_rnotwhite ) || [""]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; data_priv.remove( elem, "events" ); } }, trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, eventPath = [ elem || document ], type = core_hasOwn.call( event, "type" ) ? event.type : event, namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; cur = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf(".") >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf(":") < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join("."); event.namespace_re = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === (elem.ownerDocument || document) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); var i, j, ret, matched, handleObj, handlerQueue = [], args = core_slice.call( arguments ), handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { if ( (event.result = ret) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, matches, sel, handleObj, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers // Black-hole SVG instance trees (#13180) // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.disabled !== true || event.type !== "click" ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matches[ sel ] === undefined ) { matches[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) >= 0 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matches[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, handlers: matches }); } } } } // Add the remaining (directly-bound) handlers if ( delegateCount < handlers.length ) { handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); } return handlerQueue; }, // Includes some event props shared by KeyEvent and MouseEvent props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, copy, type = event.type, originalEvent = event, fixHook = this.fixHooks[ type ]; if ( !fixHook ) { this.fixHooks[ type ] = fixHook = rmouseEvent.test( type ) ? this.mouseHooks : rkeyEvent.test( type ) ? this.keyHooks : {}; } copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = new jQuery.Event( originalEvent ); i = copy.length; while ( i-- ) { prop = copy[ i ]; event[ prop ] = originalEvent[ prop ]; } // Support: Cordova 2.5 (WebKit) (#13255) // All events should have a target; Cordova deviceready doesn't if ( !event.target ) { event.target = document; } // Support: Safari 6.0+, Chrome < 28 // Target should not be a text node (#504, #13143) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { this.focus(); return false; } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return jQuery.nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined ) { event.originalEvent.returnValue = event.result; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; jQuery.removeEvent = function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && e.preventDefault ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && e.stopPropagation ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); } }; // Create mouseenter/leave events using mouseover/out and event-time checks // Support: Chrome 15+ jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // Create "bubbling" focus and blur events // Support: Firefox, Chrome, Safari if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { var elem = this[0]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } }); var isSimple = /^.[^:#\[\.,]*$/, rparentsprev = /^(?:parents|prev(?:Until|All))/, rneedsContext = jQuery.expr.match.needsContext, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var i, ret = [], self = this, len = self.length; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter(function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }) ); } for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } // Needed because $( selector, context ) becomes $( context ).find( selector ) ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); ret.selector = this.selector ? this.selector + " " + selector : selector; return ret; }, has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter(function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector || [], true) ); }, filter: function( selector ) { return this.pushStack( winnow(this, selector || [], false) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], pos = ( rneedsContext.test( selectors ) || typeof selectors !== "string" ) ? jQuery( selectors, context || this.context ) : 0; for ( ; i < l; i++ ) { for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && (pos ? pos.index(cur) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors)) ) { cur = matched.push( cur ); break; } } } return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return core_indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return core_indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( jQuery.unique(all) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter(selector) ); } }); function sibling( cur, dir ) { while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} return cur; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return elem.contentDocument || jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.unique( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; })); }, dir: function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }, sibling: function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; }); } if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; }); } if ( typeof qualifier === "string" ) { if ( isSimple.test( qualifier ) ) { return jQuery.filter( qualifier, elements, not ); } qualifier = jQuery.filter( qualifier, elements ); } return jQuery.grep( elements, function( elem ) { return ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not; }); } var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, rtagName = /<([\w:]+)/, rhtml = /<|&#?\w+;/, rnoInnerhtml = /<(?:script|style|link)/i, manipulation_rcheckableType = /^(?:checkbox|radio)$/i, // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rscriptType = /^$|\/(?:java|ecma)script/i, rscriptTypeMasked = /^true\/(.*)/, rcleanScript = /^\s*\s*$/g, // We have to close these tags to support XHTML (#13200) wrapMap = { // Support: IE 9 option: [ 1, "" ], thead: [ 1, "", "
" ], col: [ 2, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], _default: [ 0, "", "" ] }; // Support: IE 9 wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; jQuery.fn.extend({ text: function( value ) { return jQuery.access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) ); }, null, value, arguments.length ); }, append: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } }); }, prepend: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } }); }, before: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } }); }, after: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } }); }, // keepData is for internal use only--do not document remove: function( selector, keepData ) { var elem, elems = selector ? jQuery.filter( selector, this ) : this, i = 0; for ( ; (elem = elems[i]) != null; i++ ) { if ( !keepData && elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem ) ); } if ( elem.parentNode ) { if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { setGlobalEval( getAll( elem, "script" ) ); } elem.parentNode.removeChild( elem ); } } return this; }, empty: function() { var elem, i = 0; for ( ; (elem = this[i]) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function () { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); }); }, html: function( value ) { return jQuery.access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = value.replace( rxhtmlTag, "<$1>" ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var // Snapshot the DOM in case .domManip sweeps something relevant into its fragment args = jQuery.map( this, function( elem ) { return [ elem.nextSibling, elem.parentNode ]; }), i = 0; // Make the changes, replacing each context element with the new content this.domManip( arguments, function( elem ) { var next = args[ i++ ], parent = args[ i++ ]; if ( parent ) { // Don't use the snapshot next if it has moved (#13810) if ( next && next.parentNode !== parent ) { next = this.nextSibling; } jQuery( this ).remove(); parent.insertBefore( elem, next ); } // Allow new content to include elements from the context set }, true ); // Force removal if there was no new content (e.g., from empty arguments) return i ? this : this.remove(); }, detach: function( selector ) { return this.remove( selector, true ); }, domManip: function( args, callback, allowIntersection ) { // Flatten any nested arrays args = core_concat.apply( [], args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = this.length, set = this, iNoClone = l - 1, value = args[ 0 ], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { return this.each(function( index ) { var self = set.eq( index ); if ( isFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } self.domManip( args, callback, allowIntersection ); }); } if ( l ) { fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } if ( first ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: QtWebKit // jQuery.merge because core_push.apply(_, arraylike) throws jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( this[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Hope ajax is available... jQuery._evalUrl( node.src ); } else { jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); } } } } } } return this; } }); jQuery.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: QtWebKit // .get() because core_push.apply(_, arraylike) throws core_push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; }); jQuery.extend({ clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = jQuery.contains( elem.ownerDocument, elem ); // Support: IE >= 9 // Fix Cloning issues if ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, buildFragment: function( elems, context, scripts, selection ) { var elem, tmp, tag, wrap, contains, j, i = 0, l = elems.length, fragment = context.createDocumentFragment(), nodes = []; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( jQuery.type( elem ) === "object" ) { // Support: QtWebKit // jQuery.merge because core_push.apply(_, arraylike) throws jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement("div") ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || ["", ""] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: QtWebKit // jQuery.merge because core_push.apply(_, arraylike) throws jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Fixes #12346 // Support: Webkit, IE tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( (elem = nodes[ i++ ]) ) { // #4087 - If origin and destination elements are the same, and this is // that element, do not do anything if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( (elem = tmp[ j++ ]) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; }, cleanData: function( elems ) { var data, elem, events, type, key, j, special = jQuery.event.special, i = 0; for ( ; (elem = elems[ i ]) !== undefined; i++ ) { if ( Data.accepts( elem ) ) { key = elem[ data_priv.expando ]; if ( key && (data = data_priv.cache[ key ]) ) { events = Object.keys( data.events || {} ); if ( events.length ) { for ( j = 0; (type = events[j]) !== undefined; j++ ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } if ( data_priv.cache[ key ] ) { // Discard any remaining `private` data delete data_priv.cache[ key ]; } } } // Discard any remaining `user` data delete data_user.cache[ elem[ data_user.expando ] ]; } }, _evalUrl: function( url ) { return jQuery.ajax({ url: url, type: "GET", dataType: "script", async: false, global: false, "throws": true }); } }); // Support: 1.x compatibility // Manipulating tables requires a tbody function manipulationTarget( elem, content ) { return jQuery.nodeName( elem, "table" ) && jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? elem.getElementsByTagName("tbody")[0] || elem.appendChild( elem.ownerDocument.createElement("tbody") ) : elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); if ( match ) { elem.type = match[ 1 ]; } else { elem.removeAttribute("type"); } return elem; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var l = elems.length, i = 0; for ( ; i < l; i++ ) { data_priv.set( elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) ); } } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( data_priv.hasData( src ) ) { pdataOld = data_priv.access( src ); pdataCur = data_priv.set( dest, pdataOld ); events = pdataOld.events; if ( events ) { delete pdataCur.handle; pdataCur.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( data_user.hasData( src ) ) { udataOld = data_user.access( src ); udataCur = jQuery.extend( {}, udataOld ); data_user.set( dest, udataCur ); } } function getAll( context, tag ) { var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : []; return tag === undefined || tag && jQuery.nodeName( context, tag ) ? jQuery.merge( [ context ], ret ) : ret; } // Support: IE >= 9 function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } jQuery.fn.extend({ wrapAll: function( html ) { var wrap; if ( jQuery.isFunction( html ) ) { return this.each(function( i ) { jQuery( this ).wrapAll( html.call(this, i) ); }); } if ( this[ 0 ] ) { // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map(function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; }).append( this ); } return this; }, wrapInner: function( html ) { if ( jQuery.isFunction( html ) ) { return this.each(function( i ) { jQuery( this ).wrapInner( html.call(this, i) ); }); } return this.each(function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } }); }, wrap: function( html ) { var isFunction = jQuery.isFunction( html ); return this.each(function( i ) { jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); }); }, unwrap: function() { return this.parent().each(function() { if ( !jQuery.nodeName( this, "body" ) ) { jQuery( this ).replaceWith( this.childNodes ); } }).end(); } }); var curCSS, iframe, // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rmargin = /^margin/, rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), elemdisplay = { BODY: "block" }, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: 0, fontWeight: 400 }, cssExpand = [ "Top", "Right", "Bottom", "Left" ], cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; // return a css property mapped to a potentially vendor prefixed property function vendorPropName( style, name ) { // shortcut for names that are not vendor prefixed if ( name in style ) { return name; } // check for vendor prefixed names var capName = name.charAt(0).toUpperCase() + name.slice(1), origName = name, i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in style ) { return name; } } return origName; } function isHidden( elem, el ) { // isHidden might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); } // NOTE: we've included the "window" in window.getComputedStyle // because jsdom on node.js will break without it. function getStyles( elem ) { return window.getComputedStyle( elem, null ); } function showHide( elements, show ) { var display, elem, hidden, values = [], index = 0, length = elements.length; for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } values[ index ] = data_priv.get( elem, "olddisplay" ); display = elem.style.display; if ( show ) { // Reset the inline display of this element to learn if it is // being hidden by cascaded rules or not if ( !values[ index ] && display === "none" ) { elem.style.display = ""; } // Set elements which have been overridden with display: none // in a stylesheet to whatever the default browser style is // for such an element if ( elem.style.display === "" && isHidden( elem ) ) { values[ index ] = data_priv.access( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); } } else { if ( !values[ index ] ) { hidden = isHidden( elem ); if ( display && display !== "none" || !hidden ) { data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") ); } } } } // Set the display of most of the elements in a second loop // to avoid the constant reflow for ( index = 0; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } if ( !show || elem.style.display === "none" || elem.style.display === "" ) { elem.style.display = show ? values[ index ] || "" : "none"; } } return elements; } jQuery.fn.extend({ css: function( name, value ) { return jQuery.access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( jQuery.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); }, show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each(function() { if ( isHidden( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } }); } }); jQuery.extend({ // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "columnCount": true, "fillOpacity": true, "fontWeight": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: { // normalize float css property "float": "cssFloat" }, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = jQuery.camelCase( name ), style = elem.style; name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); // gets hook for the prefixed version // followed by the unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // convert relative number strings (+= or -=) to relative numbers. #7345 if ( type === "string" && (ret = rrelNum.exec( value )) ) { value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); // Fixes bug #9237 type = "number"; } // Make sure that NaN and null values aren't set. See: #7116 if ( value == null || type === "number" && isNaN( value ) ) { return; } // If a number was passed in, add 'px' to the (except for certain CSS properties) if ( type === "number" && !jQuery.cssNumber[ origName ] ) { value += "px"; } // Fixes #8908, it can be done more correctly by specifying setters in cssHooks, // but it would mean to define eight (for every problematic property) identical functions if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { style[ name ] = value; } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = jQuery.camelCase( name ); // Make sure that we're working with the right name name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); // gets hook for the prefixed version // followed by the unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } //convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Return, converting to number if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; } return val; } }); curCSS = function( elem, name, _computed ) { var width, minWidth, maxWidth, computed = _computed || getStyles( elem ), // Support: IE9 // getPropertyValue is only needed for .css('filter') in IE9, see #12537 ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, style = elem.style; if ( computed ) { if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { ret = jQuery.style( elem, name ); } // Support: Safari 5.1 // A tribute to the "awesome hack by Dean Edwards" // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret; }; function setPositiveNumber( elem, value, subtract ) { var matches = rnumsplit.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : value; } function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { var i = extra === ( isBorderBox ? "border" : "content" ) ? // If we already have the right measurement, avoid augmentation 4 : // Otherwise initialize for horizontal or vertical properties name === "width" ? 1 : 0, val = 0; for ( ; i < 4; i += 2 ) { // both box models exclude margin, so add it if we want it if ( extra === "margin" ) { val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); } if ( isBorderBox ) { // border-box includes padding, so remove it if we want content if ( extra === "content" ) { val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // at this point, extra isn't border nor margin, so remove border if ( extra !== "margin" ) { val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } else { // at this point, extra isn't content, so add padding val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // at this point, extra isn't content nor padding, so add border if ( extra !== "padding" ) { val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } return val; } function getWidthOrHeight( elem, name, extra ) { // Start with offset property, which is equivalent to the border-box value var valueIsBorderBox = true, val = name === "width" ? elem.offsetWidth : elem.offsetHeight, styles = getStyles( elem ), isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; // some non-html elements return undefined for offsetWidth, so check for null/undefined // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 if ( val <= 0 || val == null ) { // Fall back to computed then uncomputed css if necessary val = curCSS( elem, name, styles ); if ( val < 0 || val == null ) { val = elem.style[ name ]; } // Computed unit is not pixels. Stop here and return. if ( rnumnonpx.test(val) ) { return val; } // we need the check for style in case a browser which returns unreliable values // for getComputedStyle silently falls back to the reliable elem.style valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); // Normalize "", auto, and prepare for extra val = parseFloat( val ) || 0; } // use the active box-sizing model to add/subtract irrelevant styles return ( val + augmentWidthOrHeight( elem, name, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles ) ) + "px"; } // Try to determine the default display value of an element function css_defaultDisplay( nodeName ) { var doc = document, display = elemdisplay[ nodeName ]; if ( !display ) { display = actualDisplay( nodeName, doc ); // If the simple way fails, read from inside an iframe if ( display === "none" || !display ) { // Use the already-created iframe if possible iframe = ( iframe || jQuery("'),this.options.onContentLoaded.call(this),this.modal_arrows?this.modal_arrows.css("display","none"):void 0},showVimeoVideo:function(a){var b,c,d;return b=500/281,d=this.$element.data("width")||560,d=this.checkDimensions(d),c=d/b,this.resize(d),this.lightbox_body.html(''),this.options.onContentLoaded.call(this),this.modal_arrows?this.modal_arrows.css("display","none"):void 0},showInstagramVideo:function(a){var b;return b=this.$element.data("width")||612,b=this.checkDimensions(b),this.resize(b),this.lightbox_body.html(''),this.options.onContentLoaded.call(this),this.modal_arrows?this.modal_arrows.css("display","none"):void 0},loadRemoteContent:function(b){var c,d,e=this;return d=this.$element.data("width")||560,this.resize(d),c=this.$element.data("disableExternalCheck")||!1,c||this.isExternal(b)?(this.lightbox_body.html(''),this.options.onContentLoaded.call(this)):this.lightbox_body.load(b,a.proxy(function(){return e.$element.trigger("loaded.bs.modal")})),this.modal_arrows?this.modal_arrows.css("display","block"):void 0},isExternal:function(a){var b;return b=a.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/),"string"==typeof b[1]&&b[1].length>0&&b[1].toLowerCase()!==location.protocol?!0:"string"==typeof b[2]&&b[2].length>0&&b[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"),"")!==location.host?!0:!1},error:function(a){return this.lightbox_body.html(a),this},preloadImage:function(b,c){var d,e=this;return d=new Image,(null==c||c===!0)&&(d.onload=function(){var b;return b=a(""),b.attr("src",d.src),b.addClass("img-responsive"),e.lightbox_body.html(b),e.modal_arrows&&e.modal_arrows.css("display","block"),e.resize(d.width),e.options.onContentLoaded.call(e)},d.onerror=function(){return e.error("Failed to load image: "+b)}),d.src=b,d},resize:function(b){var c;return c=b+this.border.left+this.padding.left+this.padding.right+this.border.right,this.modal_dialog.css("width","auto").css("max-width",c),this.lightbox_container.find("a").css("line-height",function(){return a(this).parent().height()+"px"}),this},checkDimensions:function(a){var b,c;return c=a+this.border.left+this.padding.left+this.padding.right+this.border.right,b=document.body.clientWidth,c>b&&(a=this.modal_body.width()),a},close:function(){return this.modal.modal("hide")},addTrailingSlash:function(a){return"/"!==a.substr(-1)&&(a+="/"),a}},a.fn.ekkoLightbox=function(c){return this.each(function(){var d;return d=a(this),c=a.extend({remote:d.attr("data-remote")||d.attr("href"),gallery_parent_selector:d.attr("data-parent"),type:d.attr("data-type")},c,d.data()),new b(this,c),this})},a.fn.ekkoLightbox.defaults={gallery_parent_selector:"*:not(.row)",left_arrow_class:".glyphicon .glyphicon-chevron-left",right_arrow_class:".glyphicon .glyphicon-chevron-right",directional_arrows:!0,type:null,always_show_close:!0,onShow:function(){},onShown:function(){},onHide:function(){},onHidden:function(){},onNavigate:function(){},onContentLoaded:function(){}}}).call(this); /* * Jssor.Core 16.0 * http://www.jssor.com/ * * TERMS OF USE - Jssor.Core * * Copyright 2014 Jssor * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*! Jssor */ $Jssor$ = window.$Jssor$ = window.$Jssor$ || {}; //$JssorDebug$ var $JssorDebug$ = new function () { this.$DebugMode = true; // Methods this.$Log = function (msg, important) { var console = window.console || {}; var debug = this.$DebugMode; if (debug && console.log) { console.log(msg); } else if (debug && important) { alert(msg); } }; this.$Error = function (msg, e) { var console = window.console || {}; var debug = this.$DebugMode; if (debug && console.error) { console.error(msg); } else if (debug) { alert(msg); } if (debug) { // since we're debugging, fail fast by crashing throw e || new Error(msg); } }; this.$Fail = function (msg) { throw new Error(msg); }; this.$Assert = function (value, msg) { var debug = this.$DebugMode; if (debug) { if (!value) throw new Error("Assert failed " + msg || ""); } }; this.$Trace = function (msg) { var console = window.console || {}; var debug = this.$DebugMode; if (debug && console.log) { console.log(msg); } }; this.$Execute = function (func) { var debug = this.$DebugMode; if (debug) func(); }; this.$LiveStamp = function (obj, id) { var stamp = document.createElement("DIV"); stamp.setAttribute("id", id); obj.$Live = stamp; }; }; //$JssorEventManager$ var $JssorEventManager$ = function () { var self = this; // Fields var listeners = {}; // dictionary of eventName --> array of handlers // Methods self.$On = self.addEventListener = function (eventName, handler) { if (typeof (handler) != "function") { return; } if (!listeners[eventName]) { listeners[eventName] = []; } listeners[eventName].push(handler); }; self.$Off = self.removeEventListener = function (eventName, handler) { var handlers = listeners[eventName]; if (typeof (handler) != "function") { return; } else if (!handlers) { return; } for (var i = 0; i < handlers.length; i++) { if (handler == handlers[i]) { handlers.splice(i, 1); return; } } }; self.$ClearEventListeners = function (eventName) { if (listeners[eventName]) { delete listeners[eventName]; } }; self.$TriggerEvent = function (eventName) { var handlers = listeners[eventName]; var args = []; if (!handlers) { return; } for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); } for (var i = 0; i < handlers.length; i++) { try { handlers[i].apply(window, args); } catch (e) { // handler threw an error, ignore, go on to next one $JssorDebug$.$Error(e.name + " while executing " + eventName + " handler: " + e.message, e); } } }; };/// /* * Jssor.Utils 17.0 * http://www.jssor.com/ * * TERMS OF USE - Jssor.Utils * * Copyright 2014 Jssor * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ //$JssorPoint$ var $JssorPoint$; (function () { $JssorPoint$ = function (x, y) { // Properties this.x = typeof (x) == "number" ? x : 0; this.y = typeof (y) == "number" ? y : 0; }; // Methods var SDPointPrototype = $JssorPoint$.prototype; SDPointPrototype.$Plus = function (point) { return new $JssorPoint$(this.x + point.x, this.y + point.y); }; SDPointPrototype.$Minus = function (point) { return new $JssorPoint$(this.x - point.x, this.y - point.y); }; SDPointPrototype.$Times = function (factor) { return new $JssorPoint$(this.x * factor, this.y * factor); }; SDPointPrototype.$Divide = function (factor) { return new $JssorPoint$(this.x / factor, this.y / factor); }; SDPointPrototype.$Negate = function () { return new $JssorPoint$(-this.x, -this.y); }; SDPointPrototype.$DistanceTo = function (point) { return Math.sqrt(Math.pow(this.x - point.x, 2) + Math.pow(this.y - point.y, 2)); }; SDPointPrototype.$Apply = function (func) { return new $JssorPoint$(func(this.x), func(this.y)); }; SDPointPrototype.$Equals = function (point) { return (point instanceof $JssorPoint$) && (this.x === point.x) && (this.y === point.y); }; SDPointPrototype.$ToString = function () { return "(" + this.x + "," + this.y + ")"; }; })(); //$JssorEasing$ var $JssorEasing$ = window.$JssorEasing$ = { $EaseLinear: function (t) { return t; }, $EaseGoBack: function (t) { return 1 - Math.abs((t *= 2) - 1); }, $EaseSwing: function (t) { return -Math.cos(t * Math.PI) / 2 + .5; }, $EaseInQuad: function (t) { return t * t; }, $EaseOutQuad: function (t) { return -t * (t - 2); }, $EaseInOutQuad: function (t) { return (t *= 2) < 1 ? 1 / 2 * t * t : -1 / 2 * (--t * (t - 2) - 1); }, $EaseInCubic: function (t) { return t * t * t; }, $EaseOutCubic: function (t) { return (t -= 1) * t * t + 1; }, $EaseInOutCubic: function (t) { return (t *= 2) < 1 ? 1 / 2 * t * t * t : 1 / 2 * ((t -= 2) * t * t + 2); }, $EaseInQuart: function (t) { return t * t * t * t; }, $EaseOutQuart: function (t) { return -((t -= 1) * t * t * t - 1); }, $EaseInOutQuart: function (t) { return (t *= 2) < 1 ? 1 / 2 * t * t * t * t : -1 / 2 * ((t -= 2) * t * t * t - 2); }, $EaseInQuint: function (t) { return t * t * t * t * t; }, $EaseOutQuint: function (t) { return (t -= 1) * t * t * t * t + 1; }, $EaseInOutQuint: function (t) { return (t *= 2) < 1 ? 1 / 2 * t * t * t * t * t : 1 / 2 * ((t -= 2) * t * t * t * t + 2); }, $EaseInSine: function (t) { return 1 - Math.cos(t * Math.PI / 2); }, $EaseOutSine: function (t) { return Math.sin(t * Math.PI / 2); }, $EaseInOutSine: function (t) { return -1 / 2 * (Math.cos(Math.PI * t) - 1); }, $EaseInExpo: function (t) { return t == 0 ? 0 : Math.pow(2, 10 * (t - 1)); }, $EaseOutExpo: function (t) { return t == 1 ? 1 : -Math.pow(2, -10 * t) + 1; }, $EaseInOutExpo: function (t) { return t == 0 || t == 1 ? t : (t *= 2) < 1 ? 1 / 2 * Math.pow(2, 10 * (t - 1)) : 1 / 2 * (-Math.pow(2, -10 * --t) + 2); }, $EaseInCirc: function (t) { return -(Math.sqrt(1 - t * t) - 1); }, $EaseOutCirc: function (t) { return Math.sqrt(1 - (t -= 1) * t); }, $EaseInOutCirc: function (t) { return (t *= 2) < 1 ? -1 / 2 * (Math.sqrt(1 - t * t) - 1) : 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1); }, $EaseInElastic: function (t) { if (!t || t == 1) return t; var p = .3, s = .075; return -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * 2 * Math.PI / p)); }, $EaseOutElastic: function (t) { if (!t || t == 1) return t; var p = .3, s = .075; return Math.pow(2, -10 * t) * Math.sin((t - s) * 2 * Math.PI / p) + 1; }, $EaseInOutElastic: function (t) { if (!t || t == 1) return t; var p = .45, s = .1125; return (t *= 2) < 1 ? -.5 * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * 2 * Math.PI / p) : Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * 2 * Math.PI / p) * .5 + 1; }, $EaseInBack: function (t) { var s = 1.70158; return t * t * ((s + 1) * t - s); }, $EaseOutBack: function (t) { var s = 1.70158; return (t -= 1) * t * ((s + 1) * t + s) + 1; }, $EaseInOutBack: function (t) { var s = 1.70158; return (t *= 2) < 1 ? 1 / 2 * t * t * (((s *= 1.525) + 1) * t - s) : 1 / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2); }, $EaseInBounce: function (t) { return 1 - $JssorEasing$.$EaseOutBounce(1 - t) }, $EaseOutBounce: function (t) { return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; }, $EaseInOutBounce: function (t) { return t < 1 / 2 ? $JssorEasing$.$EaseInBounce(t * 2) * .5 : $JssorEasing$.$EaseOutBounce(t * 2 - 1) * .5 + .5; }, $EaseInWave: function (t) { return 1 - Math.cos(t * Math.PI * 2) }, $EaseOutWave: function (t) { return Math.sin(t * Math.PI * 2); }, $EaseOutJump: function (t) { return 1 - (((t *= 2) < 1) ? (t = 1 - t) * t * t : (t -= 1) * t * t); }, $EaseInJump: function (t) { return ((t *= 2) < 1) ? t * t * t : (t = 2 - t) * t * t; } }; var $JssorDirection$ = window.$JssorDirection$ = { $TO_LEFT: 0x0001, $TO_RIGHT: 0x0002, $TO_TOP: 0x0004, $TO_BOTTOM: 0x0008, $HORIZONTAL: 0x0003, $VERTICAL: 0x000C, $LEFTRIGHT: 0x0003, $TOPBOTOM: 0x000C, $TOPLEFT: 0x0005, $TOPRIGHT: 0x0006, $BOTTOMLEFT: 0x0009, $BOTTOMRIGHT: 0x000A, $AROUND: 0x000F, $GetDirectionHorizontal: function (direction) { return direction & 0x0003; }, $GetDirectionVertical: function (direction) { return direction & 0x000C; }, $ChessHorizontal: function (direction) { return (~direction & 0x0003) + (direction & 0x000C); }, $ChessVertical: function (direction) { return (~direction & 0x000C) + (direction & 0x0003); }, $IsToLeft: function (direction) { return (direction & 0x0003) == 0x0001; }, $IsToRight: function (direction) { return (direction & 0x0003) == 0x0002; }, $IsToTop: function (direction) { return (direction & 0x000C) == 0x0004; }, $IsToBottom: function (direction) { return (direction & 0x000C) == 0x0008; }, $IsHorizontal: function (direction) { return (direction & 0x0003) > 0; }, $IsVertical: function (direction) { return (direction & 0x000C) > 0; } }; var $JssorKeyCode$ = { $BACKSPACE: 8, $COMMA: 188, $DELETE: 46, $DOWN: 40, $END: 35, $ENTER: 13, $ESCAPE: 27, $HOME: 36, $LEFT: 37, $NUMPAD_ADD: 107, $NUMPAD_DECIMAL: 110, $NUMPAD_DIVIDE: 111, $NUMPAD_ENTER: 108, $NUMPAD_MULTIPLY: 106, $NUMPAD_SUBTRACT: 109, $PAGE_DOWN: 34, $PAGE_UP: 33, $PERIOD: 190, $RIGHT: 39, $SPACE: 32, $TAB: 9, $UP: 38 }; var $JssorAlignment$ = { $TopLeft: 0x11, $TopCenter: 0x12, $TopRight: 0x14, $MiddleLeft: 0x21, $MiddleCenter: 0x22, $MiddleRight: 0x24, $BottomLeft: 0x41, $BottomCenter: 0x42, $BottomRight: 0x44, $IsTop: function (aligment) { return aligment & 0x10 > 0; }, $IsMiddle: function (alignment) { return alignment & 0x20 > 0; }, $IsBottom: function (alignment) { return alignment & 0x40 > 0; }, $IsLeft: function (alignment) { return alignment & 0x01 > 0; }, $IsCenter: function (alignment) { return alignment & 0x02 > 0; }, $IsRight: function (alignment) { return alignment & 0x04 > 0; } }; var $JssorMatrix$; var $JssorBrowser$ = { $UNKNOWN: 0, $IE: 1, $FIREFOX: 2, $SAFARI: 3, $CHROME: 4, $OPERA: 5 }; var $ROWSER_UNKNOWN$ = 0; var $ROWSER_IE$ = 1; var $ROWSER_FIREFOX$ = 2; var $ROWSER_SAFARI$ = 3; var $ROWSER_CHROME$ = 4; var $ROWSER_OPERA$ = 5; var $JssorAnimator$; // $JssorUtils$ is a static class, so make it singleton instance var $JssorUtils$ = window.$JssorUtils$ = new function () { // Fields var self = this; var arrActiveX = ["Msxml2.XMLHTTP", "Msxml3.XMLHTTP", "Microsoft.XMLHTTP"]; var supportedImageFormats = { "bmp": false, "jpeg": true, "jpg": true, "png": true, "tif": false, "wdp": false }; var browser = $JssorBrowser$.$UNKNOWN; var browserRuntimeVersion = 0; var browserEngineVersion = 0; var browserJavascriptVersion = 0; var webkitVersion = 0; var app = navigator.appName; var ver = navigator.appVersion; var ua = navigator.userAgent; var urlParams = {}; function DetectBrowser() { if (!browser) { if (app == "Microsoft Internet Explorer" && !!window.attachEvent && !!window.ActiveXObject) { var ieOffset = ua.indexOf("MSIE"); browser = $JssorBrowser$.$IE; browserEngineVersion = parseFloat(ua.substring(ieOffset + 5, ua.indexOf(";", ieOffset))); //check IE javascript version /*@cc_on browserJavascriptVersion = @_jscript_version; @*/ // update: for intranet sites and compat view list sites, IE sends // an IE7 User-Agent to the server to be interoperable, and even if // the page requests a later IE version, IE will still report the // IE7 UA to JS. we should be robust to self. //var docMode = document.documentMode; //if (typeof docMode !== "undefined") { // browserRuntimeVersion = docMode; //} browserRuntimeVersion = document.documentMode || browserEngineVersion; } else if (app == "Netscape" && !!window.addEventListener) { var ffOffset = ua.indexOf("Firefox"); var saOffset = ua.indexOf("Safari"); var chOffset = ua.indexOf("Chrome"); var webkitOffset = ua.indexOf("AppleWebKit"); if (ffOffset >= 0) { browser = $JssorBrowser$.$FIREFOX; browserRuntimeVersion = parseFloat(ua.substring(ffOffset + 8)); } else if (saOffset >= 0) { var slash = ua.substring(0, saOffset).lastIndexOf("/"); browser = (chOffset >= 0) ? $JssorBrowser$.$CHROME : $JssorBrowser$.$SAFARI; browserRuntimeVersion = parseFloat(ua.substring(slash + 1, saOffset)); } if (webkitOffset >= 0) webkitVersion = parseFloat(ua.substring(webkitOffset + 12)); } else { var match = /(opera)(?:.*version|)[ \/]([\w.]+)/i.exec(ua); if (match) { browser = $JssorBrowser$.$OPERA; browserRuntimeVersion = parseFloat(match[2]); } } } } function IsBrowserIE() { DetectBrowser(); return browser == $ROWSER_IE$; } function IsBrowserIeQuirks() { return IsBrowserIE() && (browserRuntimeVersion < 6 || document.compatMode == "BackCompat"); //Composite to "CSS1Compat" } function IsBrowserFireFox() { DetectBrowser(); return browser == $ROWSER_FIREFOX$; } function IsBrowserSafari() { DetectBrowser(); return browser == $ROWSER_SAFARI$; } function IsBrowserChrome() { DetectBrowser(); return browser == $ROWSER_CHROME$; } function IsBrowserOpera() { DetectBrowser(); return browser == $ROWSER_OPERA$; } function IsBrowserBadTransform() { return IsBrowserSafari() && (webkitVersion > 534) && (webkitVersion < 535); } function IsBrowserSafeHWA() { return IsBrowserSafari() && (webkitVersion < 535); } function IsBrowserIe9Earlier() { //IE 8- and chrome 1 won't fade well return IsBrowserIE() && browserRuntimeVersion < 9; // || (IsBrowserChrome() && browserRuntimeVersion < 2); } var _TransformProperty; function GetTransformProperty(elmt) { if (!_TransformProperty) { // Note that in some versions of IE9 it is critical that // msTransform appear in this list before MozTransform each(['transform', 'WebkitTransform', 'msTransform', 'MozTransform', 'OTransform'], function (property) { if (!self.$IsUndefined(elmt.style[property])) { _TransformProperty = property; return true; } }); _TransformProperty = _TransformProperty || "transform"; } return _TransformProperty; } // Constructor { //Ignore urlParams // // Url parameters // var query = window.location.search.substring(1); // ignore '?' // var parts = query.split('&'); // for (var i = 0; i < parts.length; i++) { // var part = parts[i]; // var sep = part.indexOf('='); // if (sep > 0) { // urlParams[part.substring(0, sep)] = // decodeURIComponent(part.substring(sep + 1)); // } // } // Browser behaviors } // Helpers function getOffsetParent(elmt, isFixed) { // IE and Opera "fixed" position elements don't have offset parents. // regardless, if it's fixed, its offset parent is the body. if (isFixed && elmt != document.body) { return document.body; } else { return elmt.offsetParent; } } function toString(obj) { return Object.prototype.toString.call(obj); } // [[Class]] -> type pairs var class2type; function each(object, callback) { if (toString(object) == "[object Array]") { for (var i = 0; i < object.length; i++) { if (callback(object[i], i, object)) { break; } } } else { for (var name in object) { if (callback(object[name], name, object)) { break; } } } } function GetClass2Type() { if (!class2type) { class2type = {}; each(["Boolean", "Number", "String", "Function", "Array", "Date", "RegExp", "Object"], function (name) { class2type["[object " + name + "]"] = name.toLowerCase(); }); } return class2type; } function type(obj) { return obj == null ? String(obj) : GetClass2Type()[toString(obj)] || "object"; } function isPlainObject(obj) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if (!obj || type(obj) !== "object" || obj.nodeType || self.$IsWindow(obj)) { return false; } var hasOwn = Object.prototype.hasOwnProperty; try { // Not own constructor property must be Object if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { return false; } } catch (e) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for (key in obj) { } return key === undefined || hasOwn.call(obj, key); } function Delay(code, delay) { setTimeout(code, delay || 0); } function RemoveByReg(str, reg) { var m = reg.exec(str); if (m) { var header = str.substr(0, m.index); var tailer = str.substr(m.lastIndex + 1, str.length - (m.lastIndex + 1)); str = header + tailer; } return str; } function BuildNewCss(oldCss, removeRegs, replaceValue) { var css = (!oldCss || oldCss == "inherit") ? "" : oldCss; each(removeRegs, function (removeReg) { var m = removeReg.exec(css); if (m) { var header = css.substr(0, m.index); var tailer = css.substr(m.lastIndex + 1, css.length - (m.lastIndex + 1)); css = header + tailer; } }); css = replaceValue + (css.indexOf(" ") != 0 ? " " : "") + css; return css; } function SetStyleFilterIE(elmt, value) { if (browserRuntimeVersion < 9) { elmt.style.filter = value; } } function SetStyleMatrixIE(elmt, matrix, offset) { //matrix is not for ie9+ running in ie8- mode if (browserJavascriptVersion < 9) { var oldFilterValue = elmt.style.filter; var matrixReg = new RegExp(/[\s]*progid:DXImageTransform\.Microsoft\.Matrix\([^\)]*\)/g); var matrixValue = matrix ? "progid:DXImageTransform.Microsoft.Matrix(" + "M11=" + matrix[0][0] + ", M12=" + matrix[0][1] + ", M21=" + matrix[1][0] + ", M22=" + matrix[1][1] + ", SizingMethod='auto expand')" : ""; var newFilterValue = BuildNewCss(oldFilterValue, [matrixReg], matrixValue); SetStyleFilterIE(elmt, newFilterValue); self.$CssMarginTop(elmt, offset.y); self.$CssMarginLeft(elmt, offset.x); } } // Methods self.$IsBrowserIE = IsBrowserIE; self.$IsBrowserIeQuirks = IsBrowserIeQuirks; self.$IsBrowserFireFox = IsBrowserFireFox; self.$IsBrowserSafari = IsBrowserSafari; self.$IsBrowserChrome = IsBrowserChrome; self.$IsBrowserOpera = IsBrowserOpera; self.$IsBrowserBadTransform = IsBrowserBadTransform; self.$IsBrowserSafeHWA = IsBrowserSafeHWA; self.$IsBrowserIe9Earlier = IsBrowserIe9Earlier; self.$GetBrowserVersion = function () { return browserRuntimeVersion; }; self.$GetBrowserEngineVersion = function () { return browserEngineVersion || browserRuntimeVersion; }; self.$GetWebKitVersion = function () { return webkitVersion; }; self.$Delay = Delay; self.$GetElement = function (elmt) { if (self.$IsString(elmt)) { elmt = document.getElementById(elmt); } return elmt; }; self.$GetElementPosition = function (elmt) { elmt = self.$GetElement(elmt); var result = new $JssorPoint$(); // technique from: // http://www.quirksmode.org/js/findpos.html // with special check for "fixed" elements. while (elmt) { result.x += elmt.offsetLeft; result.y += elmt.offsetTop; var isFixed = self.$GetElementStyle(elmt).position == "fixed"; if (isFixed) { result = result.$Plus(self.$GetPageScroll(window)); } elmt = getOffsetParent(elmt, isFixed); } return result; }; self.$GetElementSize = function (elmt) { elmt = self.$GetElement(elmt); return new $JssorPoint$(elmt.clientWidth, elmt.clientHeight); }; self.$GetEvent = function (event) { return event ? event : window.event; }; self.$GetEventSrcElement = function (event) { event = self.$GetEvent(event); return event.target || event.srcElement || document; }; self.$GetEventDstElement = function (event) { event = self.$GetEvent(event); return event.relatedTarget || event.toElement; }; self.$GetMousePosition = function (event) { event = self.$GetEvent(event); var result = new $JssorPoint$(); // technique from: // http://www.quirksmode.org/js/events_properties.html if (event.type == "DOMMouseScroll" && IsBrowserFireFox() && browserRuntimeVersion < 3) { // hack for FF2 which reports incorrect position for mouse scroll result.x = event.screenX; result.y = event.screenY; } else if (typeof (event.pageX) == "number") { result.x = event.pageX; result.y = event.pageY; } else if (typeof (event.clientX) == "number") { result.x = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; result.y = event.clientY + document.body.scrollTop + document.documentElement.scrollTop; } else { $JssorDebug$.$Fail("Unknown event mouse position, no known technique."); } return result; }; self.$GetMouseScroll = function (event) { event = self.$GetEvent(event); var delta = 0; // default value // technique from: // http://blog.paranoidferret.com/index.php/2007/10/31/javascript-tutorial-the-scroll-wheel/ if (typeof (event.wheelDelta) == "number") { delta = event.wheelDelta; } else if (typeof (event.detail) == "number") { delta = event.detail * -1; } else { $JssorDebug$.$Fail("Unknown event mouse scroll, no known technique."); } // normalize value to [-1, 1] return delta ? delta / Math.abs(delta) : 0; }; self.$GetPageScroll = function (window) { var result = new $JssorPoint$(); var docElmt = window.document.documentElement || {}; var body = window.document.body || {}; // technique from: // http://www.howtocreate.co.uk/tutorials/javascript/browserwindow if (typeof (window.pageXOffset) == "number") { // most browsers result.x = window.pageXOffset; result.y = window.pageYOffset; } else if (body.scrollLeft || body.scrollTop) { // W3C spec, IE6+ in quirks mode result.x = body.scrollLeft; result.y = body.scrollTop; } else if (docElmt.scrollLeft || docElmt.scrollTop) { // IE6+ in standards mode result.x = docElmt.scrollLeft; result.y = docElmt.scrollTop; } // note: we specifically aren't testing for typeof here, because IE sets // the appropriate variables undefined instead of 0 under certain // conditions. self means we also shouldn't fail if none of the three // cases are hit; we'll just assume the page scroll is 0. return result; }; self.$GetWindowSize = function (window) { var result = new $JssorPoint$(); // technique from: // http://www.howtocreate.co.uk/tutorials/javascript/browserwindow //jQuery way to get window size, but support ie quirks mode var checkElement = (IsBrowserIeQuirks() ? window.document.body : window.document.documentElement); result.x = checkElement.clientWidth; result.y = checkElement.clientHeight; return result; }; //self.$MakeAjaxRequest = function (url, callback) { // var async = typeof (callback) == "function"; // var req = null; // if (async) { // var actual = callback; // var callback = function () { // Delay($JssorUtils$.$CreateCallback(null, actual, req), 1); // }; // } // if (window.ActiveXObject) { // for (var i = 0; i < arrActiveX.length; i++) { // try { // req = new ActiveXObject(arrActiveX[i]); // break; // } catch (e) { // continue; // } // } // } else if (window.XMLHttpRequest) { // req = new XMLHttpRequest(); // } // if (!req) { // $JssorDebug$.$Fail("Browser doesn't support XMLHttpRequest."); // } // if (async) { // req.onreadystatechange = function () { // if (req.readyState == 4) { // // prevent memory leaks by breaking circular reference now // req.onreadystatechange = new Function(); // callback(); // } // }; // } // try { // req.open("GET", url, async); // req.send(null); // } catch (e) { // $JssorDebug$.$Log(e.name + " while making AJAX request: " + e.message); // req.onreadystatechange = null; // req = null; // if (async) { // callback(); // } // } // return async ? null : req; //}; //self.$ParseXml = function (string) { // var xmlDoc = null; // if (window.ActiveXObject) { // try { // xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); // xmlDoc.async = false; // xmlDoc.loadXML(string); // } catch (e) { // $JssorDebug$.$Log(e.name + " while parsing XML (ActiveX): " + e.message); // } // } else if (window.DOMParser) { // try { // var parser = new DOMParser(); // xmlDoc = parser.parseFromString(string, "text/xml"); // } catch (e) { // $JssorDebug$.$Log(e.name + " while parsing XML (DOMParser): " + e.message); // } // } else { // $JssorDebug$.$Fail("Browser doesn't support XML DOM."); // } // return xmlDoc; //}; function Css(elmt, name, value) { /// /// access css /// $JssorUtils$.$Css(elmt, name); //get css value /// $JssorUtils$.$Css(elmt, name, value); //set css value /// /// /// the element to access css /// /// /// the name of css property /// /// /// the value to set /// if (value != undefined) { elmt.style[name] = value; } else { var style = elmt.currentStyle || elmt.style; value = style[name]; if(value == "" && window.getComputedStyle) { style = elmt.ownerDocument.defaultView.getComputedStyle(elmt, null); style && (value = style.getPropertyValue(name) || style[name]); } return value; } } function CssN(elmt, name, value, isDimensional) { /// /// access css as numeric /// $JssorUtils$.$CssN(elmt, name); //get css value /// $JssorUtils$.$CssN(elmt, name, value); //set css value /// /// /// the element to access css /// /// /// the name of css property /// /// /// the value to set /// if (value != undefined) { isDimensional && (value += "px"); Css(elmt, name, value); } else { return parseFloat(Css(elmt, name)); } } function CssP(elmt, name, value) { /// /// access css in pixel as numeric, like 'top', 'left', 'width', 'height' /// $JssorUtils$.$CssP(elmt, name); //get css value /// $JssorUtils$.$CssP(elmt, name, value); //set css value /// /// /// the element to access css /// /// /// the name of css property /// /// /// the value to set /// return CssN(elmt, name, value, true); } function CssProxy(name, numericOrDimension) { /// /// create proxy to access css, CssProxy(name[, numericOrDimension]); /// /// /// the element to access css /// /// /// not set: access original css, 1: access css as numeric, 2: access css in pixel as numeric /// var isDimensional = numericOrDimension & 2; var cssAccessor = numericOrDimension ? CssN : Css; return function (elmt, value) { return cssAccessor(elmt, name, value, isDimensional); }; } function GetStyleOpacity(elmt) { if (IsBrowserIE() && browserEngineVersion < 9) { var match = /opacity=([^)]*)/.exec(elmt.style.filter || ""); return match ? (parseFloat(match[1]) / 100) : 1; } else return parseFloat(elmt.style.opacity || "1"); } function SetStyleOpacity(elmt, opacity, ie9EarlierForce) { if (IsBrowserIE() && browserEngineVersion < 9) { //var filterName = "filter"; // browserEngineVersion < 8 ? "filter" : "-ms-filter"; var finalFilter = elmt.style.filter || ""; // for CSS filter browsers (IE), remove alpha filter if it's unnecessary. // update: doing self always since IE9 beta seems to have broken the // behavior if we rely on the programmatic filters collection. var alphaReg = new RegExp(/[\s]*alpha\([^\)]*\)/g); // important: note the lazy star! self protects against // multiple filters; we don't want to delete the other ones. // update: also trimming extra whitespace around filter. var ieOpacity = Math.round(100 * opacity); var alphaFilter = ""; if (ieOpacity < 100 || ie9EarlierForce) { alphaFilter = "alpha(opacity=" + ieOpacity + ") "; //elmt.style["-ms-filter"] = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + ieOpacity + ") "; } var newFilterValue = BuildNewCss(finalFilter, [alphaReg], alphaFilter); SetStyleFilterIE(elmt, newFilterValue); } //if (!IsBrowserIE() || browserEngineVersion >= 9) else { elmt.style.opacity = opacity == 1 ? "" : Math.round(opacity * 100) / 100; } } function SetStyleTransformInternal(elmt, transform) { var rotate = transform.$Rotate || 0; var scale = transform.$Scale == undefined ? 1 : transform.$Scale; if (IsBrowserIe9Earlier()) { var matrix = self.$CreateMatrix(rotate / 180 * Math.PI, scale, scale); SetStyleMatrixIE(elmt, (!rotate && scale == 1) ? null : matrix, self.$GetMatrixOffset(matrix, transform.$OriginalWidth, transform.$OriginalHeight)); } else { //rotate(15deg) scale(.5) translateZ(0) var transformProperty = GetTransformProperty(elmt); if (transformProperty) { var transformValue = "rotate(" + rotate % 360 + "deg) scale(" + scale + ")"; if ($JssorUtils$.$IsBrowserChrome() && webkitVersion > 535) transformValue += " perspective(2000px)"; elmt.style[transformProperty] = transformValue; } } } self.$SetStyleTransform = function (elmt, transform) { if (IsBrowserBadTransform()) { Delay(self.$CreateCallback(null, SetStyleTransformInternal, elmt, transform)); } else { SetStyleTransformInternal(elmt, transform); } }; self.$SetStyleTransformOrigin = function (elmt, transformOrigin) { var transformProperty = GetTransformProperty(elmt); if (transformProperty) elmt.style[transformProperty + "Origin"] = transformOrigin; }; self.$SetStyleScale = function (elmt, scale) { if (IsBrowserIE() && browserEngineVersion < 9 || (browserEngineVersion < 10 && IsBrowserIeQuirks())) { elmt.style.zoom = (scale == 1) ? "" : scale; } else { var transformProperty = GetTransformProperty(elmt); if (transformProperty) { //rotate(15deg) scale(.5) var transformValue = "scale(" + scale + ")"; var oldTransformValue = elmt.style[transformProperty]; var scaleReg = new RegExp(/[\s]*scale\(.*?\)/g); var newTransformValue = BuildNewCss(oldTransformValue, [scaleReg], transformValue); elmt.style[transformProperty] = newTransformValue; } } }; self.$EnableHWA = function (elmt) { if (!elmt.style[GetTransformProperty(elmt)] || elmt.style[GetTransformProperty(elmt)] == "none") elmt.style[GetTransformProperty(elmt)] = "perspective(2000px)"; }; self.$DisableHWA = function (elmt) { //if (force || elmt.style[GetTransformProperty(elmt)] == "perspective(2000px)") elmt.style[GetTransformProperty(elmt)] = "none"; }; var ie8OffsetWidth = 0; var ie8OffsetHeight = 0; var ie8WindowResizeCallbackHandlers; //var ie8LastVerticalScrollbar; //var toggleInfo = ""; function Ie8WindowResizeFilter(window) { var trigger = true; var checkElement = (IsBrowserIeQuirks() ? window.document.body : window.document.documentElement); if (checkElement) { //check vertical bar //var hasVerticalBar = checkElement.scrollHeight > checkElement.clientHeight; //var verticalBarToggle = hasVerticalBar != ie8LastVerticalScrollbar; //ie8LastVerticalScrollbar = hasVerticalBar; var widthChange = checkElement.offsetWidth - ie8OffsetWidth; var heightChange = checkElement.offsetHeight - ie8OffsetHeight; if (widthChange || heightChange) { ie8OffsetWidth += widthChange; ie8OffsetHeight += heightChange; } else trigger = false; } trigger && each(ie8WindowResizeCallbackHandlers, function (handler) { handler(); }); } self.$OnWindowResize = function (window, handler) { if (IsBrowserIE() && browserEngineVersion < 9) { if (!ie8WindowResizeCallbackHandlers) { ie8WindowResizeCallbackHandlers = [handler]; handler = self.$CreateCallback(null, Ie8WindowResizeFilter, window); } else { ie8WindowResizeCallbackHandlers.push(handler); return; } } self.$AddEvent(window, "resize", handler); }; self.$AddEvent = function (elmt, eventName, handler, useCapture) { elmt = self.$GetElement(elmt); // technique from: // http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/ if (elmt.addEventListener) { if (eventName == "mousewheel") { elmt.addEventListener("DOMMouseScroll", handler, useCapture); } // we are still going to add the mousewheel -- not a mistake! // self is for opera, since it uses onmousewheel but needs addEventListener. elmt.addEventListener(eventName, handler, useCapture); } else if (elmt.attachEvent) { elmt.attachEvent("on" + eventName, handler); if (useCapture && elmt.setCapture) { elmt.setCapture(); } } $JssorDebug$.$Execute(function () { if (!elmt.addEventListener && !elmt.attachEvent) { $JssorDebug$.$Fail("Unable to attach event handler, no known technique."); } }); }; self.$RemoveEvent = function (elmt, eventName, handler, useCapture) { elmt = self.$GetElement(elmt); // technique from: // http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/ if (elmt.removeEventListener) { if (eventName == "mousewheel") { elmt.removeEventListener("DOMMouseScroll", handler, useCapture); } // we are still going to remove the mousewheel -- not a mistake! // self is for opera, since it uses onmousewheel but needs removeEventListener. elmt.removeEventListener(eventName, handler, useCapture); } else if (elmt.detachEvent) { elmt.detachEvent("on" + eventName, handler); if (useCapture && elmt.releaseCapture) { elmt.releaseCapture(); } } $JssorDebug$.$Execute(function () { if (!elmt.removeEventListener && !elmt.detachEvent) { $JssorDebug$.$Fail("Unable to detach event handler, no known technique."); } }); }; self.$FireEvent = function (elmt, eventName) { //var document = elmt.document; $JssorDebug$.$Execute(function () { if (!document.createEvent && !document.createEventObject) { $JssorDebug$.$Fail("Unable to fire event, no known technique."); } if (!elmt.dispatchEvent && !elmt.fireEvent) { $JssorDebug$.$Fail("Unable to fire event, no known technique."); } }); var evento; if (document.createEvent) { evento = document.createEvent("HTMLEvents"); evento.initEvent(eventName, false, false); elmt.dispatchEvent(evento); } else { var ieEventName = "on" + eventName; evento = document.createEventObject(); //event.eventType = ieEventName; //event.eventName = ieEventName; elmt.fireEvent(ieEventName, evento); } }; self.$AddEventBrowserMouseUp = function (handler, userCapture) { self.$AddEvent((IsBrowserIe9Earlier()) ? document : window, "mouseup", handler, userCapture); }; self.$RemoveEventBrowserMouseUp = function (handler, userCapture) { self.$RemoveEvent((IsBrowserIe9Earlier()) ? document : window, "mouseup", handler, userCapture); }; self.$AddEventBrowserMouseDown = function (handler, userCapture) { self.$AddEvent((IsBrowserIe9Earlier()) ? document : window, "mousedown", handler, userCapture); }; self.$RemoveEventBrowserMouseDown = function (handler, userCapture) { self.$RemoveEvent((IsBrowserIe9Earlier()) ? document : window, "mousedown", handler, userCapture); }; self.$CancelEvent = function (event) { event = self.$GetEvent(event); // technique from: // http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/ if (event.preventDefault) { event.preventDefault(); // W3C for preventing default } event.cancel = true; // legacy for preventing default event.returnValue = false; // IE for preventing default }; self.$StopEvent = function (event) { event = self.$GetEvent(event); // technique from: // http://blog.paranoidferret.com/index.php/2007/08/10/javascript-working-with-events/ if (event.stopPropagation) { event.stopPropagation(); // W3C for stopping propagation } event.cancelBubble = true; // IE for stopping propagation }; self.$CreateCallback = function (object, method) { // create callback args var initialArgs = []; for (var i = 2; i < arguments.length; i++) { initialArgs.push(arguments[i]); } // create closure to apply method var callback = function () { // concatenate new args, but make a copy of initialArgs first var args = initialArgs.concat([]); for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } return method.apply(object, args); }; $JssorDebug$.$LiveStamp(callback, "callback_" + ($JssorUtils$.$GetNow() & 11111111)); return callback; }; var _Freeer; self.$FreeElement = function (elmt) { if (!_Freeer) _Freeer = self.$CreateDivElement(); if (elmt) { $JssorUtils$.$AppendChild(_Freeer, elmt); $JssorUtils$.$ClearInnerHtml(_Freeer); } }; self.$SetInnerText = function (elmt, text) { var textNode = document.createTextNode(text); self.$ClearInnerHtml(elmt); elmt.appendChild(textNode); }; self.$GetInnerText = function (elmt) { return elmt.textContent || elmt.innerText; }; self.$GetInnerHtml = function (elmt) { return elmt.innerHTML; }; self.$SetInnerHtml = function (elmt, html) { elmt.innerHTML = html; }; self.$ClearInnerHtml = function (elmt) { elmt.innerHTML = ""; }; self.$EncodeHtml = function (text) { var div = self.$CreateDivElement(); self.$SetInnerText(div, text); return self.$GetInnerHtml(div); }; self.$DecodeHtml = function (html) { var div = self.$CreateDivElement(); self.$SetInnerHtml(div, html); return self.$GetInnerText(div); }; self.$SelectElement = function (elmt) { var userSelection; if (window.getSelection) { //W3C default userSelection = window.getSelection(); } var theRange = null; if (document.createRange) { theRange = document.createRange(); theRange.selectNode(elmt); } else { theRange = document.body.createTextRange(); theRange.moveToElementText(elmt); theRange.select(); } //set user selection if (userSelection) userSelection.addRange(theRange); }; self.$DeselectElements = function () { if (document.selection) { document.selection.empty(); } else if (window.getSelection) { window.getSelection().removeAllRanges(); } }; self.$GetChildren = function (elmt) { var children = []; for (var tmpEl = elmt.firstChild; tmpEl; tmpEl = tmpEl.nextSibling) { if (tmpEl.nodeType == 1) { children.push(tmpEl); } } return children; }; function FindFirstChildByAttribute(elmt, attrValue, attrName, deep) { if (!attrName) attrName = "u"; for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) { if (elmt.nodeType == 1) { if (self.$GetAttributeEx(elmt, attrName) == attrValue) return elmt; if (deep) { var childRet = FindFirstChildByAttribute(elmt, attrValue, attrName, deep); if (childRet) return childRet; } } } } self.$FindFirstChildByAttribute = FindFirstChildByAttribute; function FindChildrenByAttribute(elmt, attrValue, attrName, deep) { if (!attrName) attrName = "u"; var ret = []; for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) { if (elmt.nodeType == 1) { if (self.$GetAttributeEx(elmt, attrName) == attrValue) ret.push(elmt); if (deep) { var childRet = FindChildrenByAttribute(elmt, attrValue, attrName, deep); if (childRet.length) ret = ret.concat(childRet); } } } return ret; } self.$FindChildrenByAttribute = FindChildrenByAttribute; function FindFirstChildByTag(elmt, tagName, deep) { for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) { if (elmt.nodeType == 1) { if (elmt.tagName == tagName) return elmt; if (deep) { var childRet = FindFirstChildByTag(elmt, tagName, deep); if (childRet) return childRet; } } } } self.$FindFirstChildByTag = FindFirstChildByTag; function FindChildrenByTag(elmt, tagName, deep) { var ret = []; for (elmt = elmt ? elmt.firstChild : null; elmt; elmt = elmt.nextSibling) { if (elmt.nodeType == 1) { if (!tagName || elmt.tagName == tagName) ret.push(elmt); if (deep) { var childRet = FindChildrenByTag(elmt, tagName, true); if (childRet.length) ret = ret.concat(childRet); } } } return ret; } self.$FindChildrenByTag = FindChildrenByTag; self.$GetElementsByTagName = function (elmt, tagName) { return elmt.getElementsByTagName(tagName); }; self.$Extend = function (target) { for (var i = 1; i < arguments.length; i++) { var options = arguments[i]; // Only deal with non-null/undefined values if (options) { // Extend the base object for (var name in options) { target[name] = options[name]; } } } // Return the modified object return target; }; self.$Unextend = function (target, options) { $JssorDebug$.$Assert(options); var unextended = {}; // Extend the base object for (var name in target) { if (target[name] != options[name]) { unextended[name] = target[name]; } } // Return the modified object return unextended; }; self.$IsUndefined = function (obj) { return type(obj) == "undefined"; }; self.$IsFunction = function (obj) { return type(obj) == "function"; }; self.$IsArray = Array.isArray || function (obj) { return type(obj) == "array"; }; self.$IsString = function (obj) { return type(obj) == "string"; }; self.$IsNumeric = function (obj) { return !isNaN(parseFloat(obj)) && isFinite(obj); }; self.$IsWindow = function (obj) { return obj != null && obj == obj.window; }; self.$Type = type; // args is for internal usage only self.$Each = each; self.$IsPlainObject = isPlainObject; self.$CreateDivElement = function (doc) { return self.$CreateElement("DIV", doc); }; self.$CreateSpanElement = function (doc) { return self.$CreateElement("SPAN", doc); }; self.$CreateElement = function (tagName, doc) { doc = doc || document; return doc.createElement(tagName); }; self.$EmptyFunction = function () { }; self.$GetAttribute = function (elmt, name) { return elmt.getAttribute(name); }; self.$GetAttributeEx = function (elmt, name) { return self.$GetAttribute(elmt, name) || self.$GetAttribute(elmt, "data-" + name); }; self.$SetAttribute = function (elmt, name, value) { elmt.setAttribute(name, value); }; self.$GetClassName = function (elmt) { return elmt.className; }; self.$SetClassName = function (elmt, className) { elmt.className = className || ""; }; self.$GetParentNode = function (elmt) { return elmt.parentNode; }; self.$HideElement = function (elmt) { self.$CssDisplay(elmt, "none"); }; self.$HideElements = function (elmts) { for (var i = 0; i < elmts.length; i++) { self.$HideElement(elmts[i]); } }; self.$ShowElement = function (elmt, show) { self.$CssDisplay(elmt, show == false ? "none" : ""); }; self.$ShowElements = function (elmts) { for (var i = 0; i < elmts.length; i++) { self.$ShowElement(elmts[i]); } }; self.$RemoveAttribute = function (elmt, attrbuteName) { elmt.removeAttribute(attrbuteName); }; self.$CanClearClip = function () { //return !IsBrowserIE() || browserEngineVersion > 9 || (browserRuntimeVersion > 7 && !IsBrowserIeQuirks()); return IsBrowserIE() && browserRuntimeVersion < 10; }; self.$SetStyleClip = function (elmt, clip) { if (clip) { elmt.style.clip = "rect(" + Math.round(clip.$Top) + "px " + Math.round(clip.$Right) + "px " + Math.round(clip.$Bottom) + "px " + Math.round(clip.$Left) + "px)"; } else { var cssText = elmt.style.cssText; var clipRegs = [ new RegExp(/[\s]*clip: rect\(.*?\)[;]?/i), new RegExp(/[\s]*cliptop: .*?[;]?/i), new RegExp(/[\s]*clipright: .*?[;]?/i), new RegExp(/[\s]*clipbottom: .*?[;]?/i), new RegExp(/[\s]*clipleft: .*?[;]?/i) ]; var newCssText = BuildNewCss(cssText, clipRegs, ""); $JssorUtils$.$CssCssText(elmt, newCssText); } }; self.$GetNow = function () { return new Date().getTime(); }; self.$AppendChild = function (elmt, child) { elmt.appendChild(child); }; self.$AppendChildren = function (elmt, children) { each(children, function (child) { self.$AppendChild(elmt, child); }); }; self.$InsertBefore = function (elmt, child, refObject) { elmt.insertBefore(child, refObject); }; self.$InsertAdjacentHtml = function (elmt, where, text) { elmt.insertAdjacentHTML(where, text); }; self.$RemoveChild = function (elmt, child) { elmt.removeChild(child); }; self.$RemoveChildren = function (elmt, children) { each(children, function (child) { self.$RemoveChild(elmt, child); }); }; self.$ClearChildren = function (elmt) { self.$RemoveChildren(elmt, self.$GetChildren(elmt)); }; self.$ParseInt = function (str, radix) { return parseInt(str, radix || 10); }; self.$ParseFloat = function (str) { return parseFloat(str); }; self.$IsChild = function (elmtA, elmtB) { var body = document.body; while (elmtB && elmtA != elmtB && body != elmtB) { try { elmtB = elmtB.parentNode; } catch (e) { // Firefox sometimes fires events for XUL elements, which throws // a "permission denied" error. so this is not a child. return false; } } return elmtA == elmtB; }; self.$ToLowerCase = function (value) { if (value) value = value.toLowerCase(); return value; }; self.$CloneNode = function (elmt, deep) { return elmt.cloneNode(deep); }; function TranslateTransition(transition) { if (transition) { var flyDirection = transition.$FlyDirection; if (flyDirection & 1) { transition.x = transition.$ScaleHorizontal || 1; } if (flyDirection & 2) { transition.x = -transition.$ScaleHorizontal || -1; } if (flyDirection & 4) { transition.y = transition.$ScaleVertical || 1; } if (flyDirection & 8) { transition.y = -transition.$ScaleVertical || -1; } TranslateTransition(transition.$Brother); } } self.$TranslateTransitions = function (transitions) { /// /// For backward compatibility only. /// if (transitions) { for (var i = 0; i < transitions.length; i++) { TranslateTransition(transitions[i]); } for (var name in transitions) { TranslateTransition(transitions[name]); } } }; function LoadImageCallback(callback, image, abort) { image.onload = null; image.abort = null; if (callback) callback(image, abort); } self.$LoadImage = function (src, callback) { if (self.$IsBrowserOpera() && browserRuntimeVersion < 11.6 || !src) { LoadImageCallback(callback, null); } else { var image = new Image(); image.onload = self.$CreateCallback(null, LoadImageCallback, callback, image); image.onabort = self.$CreateCallback(null, LoadImageCallback, callback, image, true); image.src = src; } }; self.$LoadImages = function (imageElmts, mainImageElmt, callback) { var _ImageLoading = imageElmts.length + 1; function LoadImageCompleteEventHandler(image, abort) { _ImageLoading--; if (mainImageElmt && image && image.src == mainImageElmt.src) mainImageElmt = image; !_ImageLoading && callback && callback(mainImageElmt); } $JssorUtils$.$Each(imageElmts, function (imageElmt) { $JssorUtils$.$LoadImage(imageElmt.src, LoadImageCompleteEventHandler); }); LoadImageCompleteEventHandler(); }; self.$BuildElement = function (template, tagName, replacer, createCopy) { if (createCopy) template = $JssorUtils$.$CloneNode(template, true); var templateHolders = $JssorUtils$.$GetElementsByTagName(template, tagName); for (var j = templateHolders.length - 1; j > -1; j--) { var templateHolder = templateHolders[j]; var replaceItem = $JssorUtils$.$CloneNode(replacer, true); $JssorUtils$.$SetClassName(replaceItem, $JssorUtils$.$GetClassName(templateHolder)); $JssorUtils$.$CssCssText(replaceItem, templateHolder.style.cssText); var thumbnailPlaceHolderParent = $JssorUtils$.$GetParentNode(templateHolder); $JssorUtils$.$InsertBefore(thumbnailPlaceHolderParent, replaceItem, templateHolder); $JssorUtils$.$RemoveChild(thumbnailPlaceHolderParent, templateHolder); } return template; }; var _MouseDownButtons; function JssorButtonEx(elmt) { var _Self = this; var _OriginClassName; var _IsMouseDown; //class name 'dn' var _IsActive; //class name 'av' var _IsDisabled; //class name 'ds' function Highlight() { var className = _OriginClassName; if (_IsDisabled) { className += 'ds'; } else if (_IsMouseDown) { className += 'dn'; } else if (_IsActive) { className += "av"; } $JssorUtils$.$SetClassName(elmt, className); } function OnMouseDown(event) { if (_IsDisabled) { self.$CancelEvent(event); } else { _MouseDownButtons.push(_Self); _IsMouseDown = true; Highlight(); } } _Self.$MouseUp = function () { /// /// Internal member function, do not use it. /// /// _IsMouseDown = false; Highlight(); }; _Self.$Activate = function (activate) { if (activate != undefined) { _IsActive = activate; Highlight(); } else { return _IsActive; } }; _Self.$Enable = function (enable) { if (enable != undefined) { _IsDisabled = !enable; Highlight(); } else { return !_IsDisabled; } }; //JssorButtonEx Constructor { elmt = self.$GetElement(elmt); if (!_MouseDownButtons) { self.$AddEventBrowserMouseUp(function () { var oldMouseDownButtons = _MouseDownButtons; _MouseDownButtons = []; each(oldMouseDownButtons, function (button) { button.$MouseUp(); }); }); _MouseDownButtons = []; } _OriginClassName = self.$GetClassName(elmt); $JssorUtils$.$AddEvent(elmt, "mousedown", OnMouseDown); } } self.$Buttonize = function (elmt) { return new JssorButtonEx(elmt); }; self.$Css = Css; self.$CssN = CssN; self.$CssP = CssP; self.$CssOverflow = CssProxy("overflow"); self.$CssTop = CssProxy("top", 2); self.$CssLeft = CssProxy("left", 2); self.$CssWidth = CssProxy("width", 2); self.$CssHeight = CssProxy("height", 2); self.$CssMarginLeft = CssProxy("marginLeft", 2); self.$CssMarginTop = CssProxy("marginTop", 2); self.$CssPosition = CssProxy("position"); self.$CssDisplay = CssProxy("display"); self.$CssZIndex = CssProxy("zIndex", 1); self.$CssFloat = function (elmt, float) { return Css(elmt, IsBrowserIE() ? "styleFloat" : "cssFloat", float); }; self.$CssOpacity = function (elmt, opacity, ie9EarlierForce) { if (opacity != undefined) { SetStyleOpacity(elmt, opacity, ie9EarlierForce); } else { return GetStyleOpacity(elmt); } }; self.$CssCssText = function (elmt, text) { if (text != undefined) { elmt.style.cssText = text; } else { return elmt.style.cssText; } }; var _StyleGetter = { $Opacity: self.$CssOpacity, $Top: self.$CssTop, $Left: self.$CssLeft, $Width: self.$CssWidth, $Height: self.$CssHeight, $Position: self.$CssPosition, $Display: self.$CssDisplay, $ZIndex: self.$CssZIndex }; //var _StyleGetter = { // $Opacity: self.$GetStyleOpacity, // $Top: self.$GetStyleTop, // $Left: self.$GetStyleLeft, // $Width: self.$GetStyleWidth, // $Height: self.$GetStyleHeight, // $Position: self.$GetStylePosition, // $Display: self.$GetStyleDisplay, // $ZIndex: self.$GetStyleZIndex //}; var _StyleSetterReserved; //var _StyleSetterReserved = { // $Opacity: self.$SetStyleOpacity, // $Top: self.$SetStyleTop, // $Left: self.$SetStyleLeft, // $Width: self.$SetStyleWidth, // $Height: self.$SetStyleHeight, // $Display: self.$SetStyleDisplay, // $Clip: self.$SetStyleClip, // $MarginLeft: self.$SetStyleMarginLeft, // $MarginTop: self.$SetStyleMarginTop, // $Transform: self.$SetStyleTransform, // $Position: self.$SetStylePosition, // $ZIndex: self.$SetStyleZIndex //}; function GetStyleSetter() { if (!_StyleSetterReserved) { _StyleSetterReserved = self.$Extend({ $MarginTop: self.$CssMarginTop, $MarginLeft: self.$CssMarginLeft, $Clip: self.$SetStyleClip, $Transform: self.$SetStyleTransform }, _StyleGetter); } return _StyleSetterReserved; } function GetStyleSetterEx() { GetStyleSetter(); //For Compression Only _StyleSetterReserved.$Transform = _StyleSetterReserved.$Transform; return _StyleSetterReserved; } self.$GetStyleSetter = GetStyleSetter; self.$GetStyleSetterEx = GetStyleSetterEx; self.$GetStyles = function (elmt, originStyles) { GetStyleSetter(); var styles = {}; each(originStyles, function (value, key) { if (_StyleGetter[key]) { styles[key] = _StyleGetter[key](elmt); } }); return styles; }; self.$SetStyles = function (elmt, styles) { var styleSetter = GetStyleSetter(); each(styles, function (value, key) { styleSetter[key] && styleSetter[key](elmt, value); }); }; self.$SetStylesEx = function (elmt, styles) { GetStyleSetterEx(); self.$SetStyles(elmt, styles); }; $JssorMatrix$ = new function () { var _This = this; function Multiply(ma, mb) { var acs = ma[0].length; var rows = ma.length; var cols = mb[0].length; var matrix = []; for (var r = 0; r < rows; r++) { var row = matrix[r] = []; for (var c = 0; c < cols; c++) { var unitValue = 0; for (var ac = 0; ac < acs; ac++) { unitValue += ma[r][ac] * mb[ac][c]; } row[c] = unitValue; } } return matrix; } _This.$ScaleX = function (matrix, sx) { return _This.$ScaleXY(matrix, sx, 0); }; _This.$ScaleY = function (matrix, sy) { return _This.$ScaleXY(matrix, 0, sy); }; _This.$ScaleXY = function (matrix, sx, sy) { return Multiply(matrix, [[sx, 0], [0, sy]]); }; _This.$TransformPoint = function (matrix, p) { var pMatrix = Multiply(matrix, [[p.x], [p.y]]); return new $JssorPoint$(pMatrix[0][0], pMatrix[1][0]); }; }; self.$CreateMatrix = function (alpha, scaleX, scaleY) { var cos = Math.cos(alpha); var sin = Math.sin(alpha); //var r11 = cos; //var r21 = sin; //var r12 = -sin; //var r22 = cos; //var m11 = cos * scaleX; //var m12 = -sin * scaleY; //var m21 = sin * scaleX; //var m22 = cos * scaleY; return [[cos * scaleX, -sin * scaleY], [sin * scaleX, cos * scaleY]]; }; self.$GetMatrixOffset = function (matrix, width, height) { var p1 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(-width / 2, -height / 2)); var p2 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(width / 2, -height / 2)); var p3 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(width / 2, height / 2)); var p4 = $JssorMatrix$.$TransformPoint(matrix, new $JssorPoint$(-width / 2, height / 2)); return new $JssorPoint$(Math.min(p1.x, p2.x, p3.x, p4.x) + width / 2, Math.min(p1.y, p2.y, p3.y, p4.y) + height / 2); }; }; $JssorAnimator$ = function (delay, duration, options, elmt, fromStyles, toStyles) { delay = delay || 0; var _This = this; var _AutoPlay; var _Hiden; var _CombineMode; var _PlayToPosition; var _PlayDirection; var _NoStop; var _TimeStampLastFrame = 0; var _SubEasings; var _SubRounds; var _SubDurings; var _Callback; var _Position_Current = 0; var _Position_Display = 0; var _Hooked; var _Position_InnerBegin = delay; var _Position_InnerEnd = delay + duration; var _Position_OuterBegin; var _Position_OuterEnd; var _LoopLength; var _NestedAnimators = []; var _StyleSetter; function GetPositionRange(position, begin, end) { var range = 0; if (position < begin) range = -1; else if (position > end) range = 1; return range; } function GetInnerPositionRange(position) { return GetPositionRange(position, _Position_InnerBegin, _Position_InnerEnd); } function GetOuterPositionRange(position) { return GetPositionRange(position, _Position_OuterBegin, _Position_OuterEnd); } function Shift(offset) { _Position_OuterBegin += offset; _Position_OuterEnd += offset; _Position_InnerBegin += offset; _Position_InnerEnd += offset; _Position_Current += offset; _Position_Display += offset; $JssorUtils$.$Each(_NestedAnimators, function (animator) { animator, animator.$Shift(offset); }); } function Locate(position, relative) { var offset = position - _Position_OuterBegin + delay * relative; Shift(offset); //$JssorDebug$.$Execute(function () { // _This.$Position_InnerBegin = _Position_InnerBegin; // _This.$Position_InnerEnd = _Position_InnerEnd; // _This.$Position_OuterBegin = _Position_OuterBegin; // _This.$Position_OuterEnd = _Position_OuterEnd; //}); return _Position_OuterEnd; } function GoToPosition(positionOuter, force) { var trimedPositionOuter = positionOuter; if (_LoopLength && (trimedPositionOuter >= _Position_OuterEnd || trimedPositionOuter <= _Position_OuterBegin)) { trimedPositionOuter = ((trimedPositionOuter - _Position_OuterBegin) % _LoopLength + _LoopLength) % _LoopLength + _Position_OuterBegin; } if (!_Hooked || _NoStop || force || _Position_Current != trimedPositionOuter) { var positionToDisplay = Math.min(trimedPositionOuter, _Position_OuterEnd); positionToDisplay = Math.max(positionToDisplay, _Position_OuterBegin); if (!_Hooked || _NoStop || force || positionToDisplay != _Position_Display) { if (toStyles) { var currentStyles = toStyles; if (fromStyles) { var interPosition = (positionToDisplay - _Position_InnerBegin) / (duration || 1); if (options.$Optimize && $JssorUtils$.$IsBrowserChrome() && duration) interPosition = Math.round(interPosition * duration / 16) / duration * 16; if (options.$Reverse) interPosition = 1 - interPosition; currentStyles = {}; for (var key in toStyles) { var round = _SubRounds[key] || 1; var during = _SubDurings[key] || [0, 1]; var propertyInterPosition = (interPosition - during[0]) / during[1]; propertyInterPosition = Math.min(Math.max(propertyInterPosition, 0), 1); propertyInterPosition = propertyInterPosition * round; var floorPosition = Math.floor(propertyInterPosition); if (propertyInterPosition != floorPosition) propertyInterPosition -= floorPosition; var easing = _SubEasings[key] || _SubEasings.$Default; var easingValue = easing(propertyInterPosition); var currentPropertyValue; var value = fromStyles[key]; var toValue = toStyles[key]; if ($JssorUtils$.$IsNumeric(toValue)) { currentPropertyValue = value + (toValue - value) * easingValue; } else { currentPropertyValue = $JssorUtils$.$Extend({ $Offset: {} }, fromStyles[key]); $JssorUtils$.$Each(toValue.$Offset, function (rectX, n) { var offsetValue = rectX * easingValue; currentPropertyValue.$Offset[n] = offsetValue; currentPropertyValue[n] += offsetValue; }); } currentStyles[key] = currentPropertyValue; } } if (fromStyles.$Zoom) { currentStyles.$Transform = { $Rotate: currentStyles.$Rotate || 0, $Scale: currentStyles.$Zoom, $OriginalWidth: options.$OriginalWidth, $OriginalHeight: options.$OriginalHeight }; } if (toStyles.$Clip && options.$Move) { var styleFrameNClipOffset = currentStyles.$Clip.$Offset; var offsetY = (styleFrameNClipOffset.$Top || 0) + (styleFrameNClipOffset.$Bottom || 0); var offsetX = (styleFrameNClipOffset.$Left || 0) + (styleFrameNClipOffset.$Right || 0); currentStyles.$Left = (currentStyles.$Left || 0) + offsetX; currentStyles.$Top = (currentStyles.$Top || 0) + offsetY; currentStyles.$Clip.$Left -= offsetX; currentStyles.$Clip.$Right -= offsetX; currentStyles.$Clip.$Top -= offsetY; currentStyles.$Clip.$Bottom -= offsetY; } if (currentStyles.$Clip && $JssorUtils$.$CanClearClip() && !currentStyles.$Clip.$Top && !currentStyles.$Clip.$Left && (currentStyles.$Clip.$Right == options.$OriginalWidth) && (currentStyles.$Clip.$Bottom == options.$OriginalHeight)) currentStyles.$Clip = null; $JssorUtils$.$Each(currentStyles, function (value, key) { _StyleSetter[key] && _StyleSetter[key](elmt, value); }); } _This.$OnInnerOffsetChange(_Position_Display - _Position_InnerBegin, positionToDisplay - _Position_InnerBegin); } _Position_Display = positionToDisplay; $JssorUtils$.$Each(_NestedAnimators, function (animator, i) { var nestedAnimator = positionOuter < _Position_Current ? _NestedAnimators[_NestedAnimators.length - i - 1] : animator; nestedAnimator.$GoToPosition(positionOuter, force); }); var positionOld = _Position_Current; var positionNew = positionOuter; _Position_Current = trimedPositionOuter; _Hooked = true; _This.$OnPositionChange(positionOld, positionNew); } } function Join(animator, combineMode) { /// /// Combine another animator as nested animator /// /// /// An instance of $JssorAnimator$ /// /// /// 0: parallel - place the animator parallel to this animator. /// 1: chain - chain the animator at the _Position_InnerEnd of this animator. /// $JssorDebug$.$Execute(function () { if (combineMode !== 0 && combineMode !== 1) $JssorDebug$.$Fail("Argument out of range, the value of 'combineMode' should be either 0 or 1."); }); if (combineMode) animator.$Locate(_Position_OuterEnd, 1); _Position_OuterEnd = Math.max(_Position_OuterEnd, animator.$GetPosition_OuterEnd()); _NestedAnimators.push(animator); } function PlayFrame() { if (_AutoPlay) { var now = $JssorUtils$.$GetNow(); var timeOffset = Math.min(now - _TimeStampLastFrame, $JssorUtils$.$IsBrowserOpera() ? 80 : 20); var timePosition = _Position_Current + timeOffset * _PlayDirection; _TimeStampLastFrame = now; if (timePosition * _PlayDirection >= _PlayToPosition * _PlayDirection) timePosition = _PlayToPosition; GoToPosition(timePosition); if (!_NoStop && timePosition * _PlayDirection >= _PlayToPosition * _PlayDirection) { Stop(_Callback); } else { $JssorUtils$.$Delay(PlayFrame, options.$Interval); } } } function PlayToPosition(toPosition, callback, noStop) { if (!_AutoPlay) { _AutoPlay = true; _NoStop = noStop _Callback = callback; toPosition = Math.max(toPosition, _Position_OuterBegin); toPosition = Math.min(toPosition, _Position_OuterEnd); _PlayToPosition = toPosition; _PlayDirection = _PlayToPosition < _Position_Current ? -1 : 1; _This.$OnStart(); _TimeStampLastFrame = $JssorUtils$.$GetNow(); PlayFrame(); } } function Stop(callback) { if (_AutoPlay) { _NoStop = _AutoPlay = _Callback = false; _This.$OnStop(); if (callback) callback(); } } _This.$Play = function (positionLength, callback, noStop) { PlayToPosition(positionLength ? _Position_Current + positionLength : _Position_OuterEnd, callback, noStop); }; _This.$PlayToPosition = function (position, callback, noStop) { PlayToPosition(position, callback, noStop); }; _This.$PlayToBegin = function (callback, noStop) { PlayToPosition(_Position_OuterBegin, callback, noStop); }; _This.$PlayToEnd = function (callback, noStop) { PlayToPosition(_Position_OuterEnd, callback, noStop); }; _This.$Stop = function () { Stop(); }; _This.$Continue = function (toPosition) { PlayToPosition(toPosition); }; _This.$GetPosition = function () { return _Position_Current; }; _This.$GetPlayToPosition = function () { return _PlayToPosition; }; _This.$GetPosition_Display = function () { return _Position_Display; }; _This.$GoToPosition = GoToPosition; _This.$GoToBegin = function () { GoToPosition(_Position_OuterBegin, true); }; _This.$GoToEnd = function () { GoToPosition(_Position_OuterEnd, true); }; _This.$Move = function (offset) { GoToPosition(_Position_Current + offset); }; _This.$CombineMode = function () { return _CombineMode; }; _This.$GetDuration = function () { return duration; }; _This.$IsPlaying = function () { return _AutoPlay; }; _This.$IsOnTheWay = function () { return _Position_Current > _Position_InnerBegin && _Position_Current <= _Position_InnerEnd; }; _This.$SetLoopLength = function (length) { _LoopLength = length; }; _This.$Locate = Locate; _This.$Shift = Shift; _This.$Join = Join; _This.$Combine = function (animator) { /// /// Combine another animator parallel to this animator /// /// /// An instance of $JssorAnimator$ /// Join(animator, 0); }; _This.$Chain = function (animator) { /// /// Chain another animator at the _Position_InnerEnd of this animator /// /// /// An instance of $JssorAnimator$ /// Join(animator, 1); }; _This.$GetPosition_InnerBegin = function () { /// /// Internal member function, do not use it. /// /// /// return _Position_InnerBegin; }; _This.$GetPosition_InnerEnd = function () { /// /// Internal member function, do not use it. /// /// /// return _Position_InnerEnd; }; _This.$GetPosition_OuterBegin = function () { /// /// Internal member function, do not use it. /// /// /// return _Position_OuterBegin; }; _This.$GetPosition_OuterEnd = function () { /// /// Internal member function, do not use it. /// /// /// return _Position_OuterEnd; }; _This.$OnPositionChange = $JssorUtils$.$EmptyFunction; _This.$OnStart = $JssorUtils$.$EmptyFunction; _This.$OnStop = $JssorUtils$.$EmptyFunction; _This.$OnInnerOffsetChange = $JssorUtils$.$EmptyFunction; _This.$Version = $JssorUtils$.$GetNow(); //Constructor` 1 { options = $JssorUtils$.$Extend({ $Interval: 16 }, options); //Sodo statement, for development time intellisence only $JssorDebug$.$Execute(function () { options = $JssorUtils$.$Extend({ $LoopLength: undefined, $Setter: undefined, $Easing: undefined }, options); }); _LoopLength = options.$LoopLength; _StyleSetter = $JssorUtils$.$Extend({}, $JssorUtils$.$GetStyleSetter(), options.$Setter); _Position_OuterBegin = _Position_InnerBegin = delay; _Position_OuterEnd = _Position_InnerEnd = delay + duration; var _SubRounds = options.$Round || {}; var _SubDurings = options.$During || {}; _SubEasings = $JssorUtils$.$Extend({ $Default: $JssorUtils$.$IsFunction(options.$Easing) && options.$Easing || $JssorEasing$.$EaseSwing }, options.$Easing); } }; function $JssorPlayerClass$() { var _SelfPlayer = this; var _PlayerControllers = []; function PlayerController(playerElement) { var _SelfPlayerController = this; var _PlayerInstance; var _PlayerInstantces = []; function OnPlayerInstanceDataAvailable(event) { var srcElement = $JssorUtils$.$GetEventSrcElement(event); _PlayerInstance = srcElement.pInstance; $JssorUtils$.$RemoveEvent(srcElement, "dataavailable", OnPlayerInstanceDataAvailable); $JssorUtils$.$Each(_PlayerInstantces, function (playerInstance) { if (playerInstance != _PlayerInstance) { playerInstance.$Remove(); } }); playerElement.pTagName = _PlayerInstance.tagName; _PlayerInstantces = null; } function HandlePlayerInstance(playerInstanceElement) { var playerHandler; if (!playerInstanceElement.pInstance) { var playerHandlerAttribute = $JssorUtils$.$GetAttributeEx(playerInstanceElement, "pHandler"); if ($JssorPlayer$[playerHandlerAttribute]) { $JssorUtils$.$AddEvent(playerInstanceElement, "dataavailable", OnPlayerInstanceDataAvailable); playerHandler = new $JssorPlayer$[playerHandlerAttribute](playerElement, playerInstanceElement); _PlayerInstantces.push(playerHandler); $JssorDebug$.$Execute(function () { if ($JssorUtils$.$Type(playerHandler.$Remove) != "function") { $JssorDebug$.$Fail("'pRemove' interface not implemented for player handler '" + playerHandlerAttribute + "'."); } }); } } return playerHandler; } _SelfPlayerController.$InitPlayerController = function () { if (!playerElement.pInstance && !HandlePlayerInstance(playerElement)) { var playerInstanceElements = $JssorUtils$.$GetChildren(playerElement); $JssorUtils$.$Each(playerInstanceElements, function (playerInstanceElement) { HandlePlayerInstance(playerInstanceElement); }); } }; } _SelfPlayer.$EVT_SWITCH = 21; _SelfPlayer.$FetchPlayers = function (elmt) { elmt = elmt || document.body; var playerElements = $JssorUtils$.$FindChildrenByAttribute(elmt, "player", null, true); $JssorUtils$.$Each(playerElements, function (playerElement) { if (!_PlayerControllers[playerElement.pId]) { playerElement.pId = _PlayerControllers.length; _PlayerControllers.push(new PlayerController(playerElement)); } var playerController = _PlayerControllers[playerElement.pId]; playerController.$InitPlayerController(); }); }; }(function(g,f,b,e,c,d,l){/*! Jssor */ $Jssor$=g.$Jssor$=g.$Jssor$||{};new(function(){this.$DebugMode=c;this.$Log=function(c,d){var a=g.console||{},b=this.$DebugMode;if(b&&a.log)a.log(c);else b&&d&&alert(c)};this.$Error=function(b,d){var c=g.console||{},a=this.$DebugMode;if(a&&c.error)c.error(b);else a&&alert(b);if(a)throw d||new Error(b);};this.$Fail=function(a){throw new Error(a);};this.$Assert=function(b,c){var a=this.$DebugMode;if(a)if(!b)throw new Error("Assert failed "+c||"");};this.$Trace=function(c){var a=g.console||{},b=this.$DebugMode;b&&a.log&&a.log(c)};this.$Execute=function(b){var a=this.$DebugMode;a&&b()};this.$LiveStamp=function(b,c){var a=f.createElement("DIV");a.setAttribute("id",c);b.$Live=a}});var m=function(){var b=this,a={};b.$On=b.addEventListener=function(b,c){if(typeof c!="function")return;if(!a[b])a[b]=[];a[b].push(c)};b.$Off=b.removeEventListener=function(e,d){var b=a[e];if(typeof d!="function")return;else if(!b)return;for(var c=0;c0},$IsVertical:function(a){return(a&12)>0}},r={$BACKSPACE:8,$COMMA:188,$DELETE:46,$DOWN:40,$END:35,$ENTER:13,$ESCAPE:27,$HOME:36,$LEFT:37,$NUMPAD_ADD:107,$NUMPAD_DECIMAL:110,$NUMPAD_DIVIDE:111,$NUMPAD_ENTER:108,$NUMPAD_MULTIPLY:106,$NUMPAD_SUBTRACT:109,$PAGE_DOWN:34,$PAGE_UP:33,$PERIOD:190,$RIGHT:39,$SPACE:32,$TAB:9,$UP:38},o,n={$UNKNOWN:0,$IE:1,$FIREFOX:2,$SAFARI:3,$CHROME:4,$OPERA:5},z=1,v=2,x=3,w=4,y=5,i,a=g.$JssorUtils$=new function(){var i=this,p=n.$UNKNOWN,j=0,s=0,U=0,B=0,gb=navigator.appName,k=navigator.userAgent;function F(){if(!p)if(gb=="Microsoft Internet Explorer"&&!!g.attachEvent&&!!g.ActiveXObject){var d=k.indexOf("MSIE");p=n.$IE;s=parseFloat(k.substring(d+5,k.indexOf(";",d)));/*@cc_on U=@_jscript_version@*/;j=f.documentMode||s}else if(gb=="Netscape"&&!!g.addEventListener){var c=k.indexOf("Firefox"),a=k.indexOf("Safari"),h=k.indexOf("Chrome"),b=k.indexOf("AppleWebKit");if(c>=0){p=n.$FIREFOX;j=parseFloat(k.substring(c+8))}else if(a>=0){var i=k.substring(0,a).lastIndexOf("/");p=h>=0?n.$CHROME:n.$SAFARI;j=parseFloat(k.substring(i+1,a))}if(b>=0)B=parseFloat(k.substring(b+12))}else{var e=/(opera)(?:.*version|)[ \/]([\w.]+)/i.exec(k);if(e){p=n.$OPERA;j=parseFloat(e[2])}}}function r(){F();return p==z}function I(){return r()&&(j<6||f.compatMode=="BackCompat")}function ab(){F();return p==v}function P(){F();return p==x}function mb(){F();return p==w}function ob(){F();return p==y}function W(){return P()&&B>534&&B<535}function ib(){return P()&&B<535}function A(){return r()&&j<9}var D;function t(a){if(!D){q(["transform","WebkitTransform","msTransform","MozTransform","OTransform"],function(b){if(!i.$IsUndefined(a.style[b])){D=b;return c}});D=D||"transform"}return D}function kb(a,b){return b&&a!=f.body?f.body:a.offsetParent}function eb(a){return Object.prototype.toString.call(a)}var L;function q(a,c){if(eb(a)=="[object Array]"){for(var b=0;b535)j+=" perspective(2000px)";g.style[h]=j}}}i.$SetStyleTransform=function(b,a){if(W())fb(i.$CreateCallback(e,T,b,a));else T(b,a)};i.$SetStyleTransformOrigin=function(b,c){var a=t(b);if(a)b.style[a+"Origin"]=c};i.$SetStyleScale=function(a,c){if(r()&&s<9||s<10&&I())a.style.zoom=c==1?"":c;else{var b=t(a);if(b){var f="scale("+c+")",e=a.style[b],g=new RegExp(/[\s]*scale\(.*?\)/g),d=K(e,[g],f);a.style[b]=d}}};i.$EnableHWA=function(a){if(!a.style[t(a)]||a.style[t(a)]=="none")a.style[t(a)]="perspective(2000px)"};i.$DisableHWA=function(a){a.style[t(a)]="none"};var db=0,cb=0,H;function hb(g){var f=c,a=I()?g.document.body:g.document.documentElement;if(a){var e=a.offsetWidth-db,b=a.offsetHeight-cb;if(e||b){db+=e;cb+=b}else f=d}f&&q(H,function(a){a()})}i.$OnWindowResize=function(b,a){if(r()&&s<9)if(!H){H=[a];a=i.$CreateCallback(e,hb,b)}else{H.push(a);return}i.$AddEvent(b,"resize",a)};i.$AddEvent=function(a,c,d,b){a=i.$GetElement(a);if(a.addEventListener){c=="mousewheel"&&a.addEventListener("DOMMouseScroll",d,b);a.addEventListener(c,d,b)}else if(a.attachEvent){a.attachEvent("on"+c,d);b&&a.setCapture&&a.setCapture()}};i.$RemoveEvent=function(a,c,d,b){a=i.$GetElement(a);if(a.removeEventListener){c=="mousewheel"&&a.removeEventListener("DOMMouseScroll",d,b);a.removeEventListener(c,d,b)}else if(a.detachEvent){a.detachEvent("on"+c,d);b&&a.releaseCapture&&a.releaseCapture()}};i.$FireEvent=function(c,b){var a;if(f.createEvent){a=f.createEvent("HTMLEvents");a.initEvent(b,d,d);c.dispatchEvent(a)}else{var e="on"+b;a=f.createEventObject();c.fireEvent(e,a)}};i.$AddEventBrowserMouseUp=function(b,a){i.$AddEvent(A()?f:g,"mouseup",b,a)};i.$RemoveEventBrowserMouseUp=function(b,a){i.$RemoveEvent(A()?f:g,"mouseup",b,a)};i.$AddEventBrowserMouseDown=function(b,a){i.$AddEvent(A()?f:g,"mousedown",b,a)};i.$RemoveEventBrowserMouseDown=function(b,a){i.$RemoveEvent(A()?f:g,"mousedown",b,a)};i.$CancelEvent=function(a){a=i.$GetEvent(a);a.preventDefault&&a.preventDefault();a.cancel=c;a.returnValue=d};i.$StopEvent=function(a){a=i.$GetEvent(a);a.stopPropagation&&a.stopPropagation();a.cancelBubble=c};i.$CreateCallback=function(e,d){for(var b=[],a=2;a-1;f--){var b=h[f],e=a.$CloneNode(j,c);a.$SetClassName(e,a.$GetClassName(b));a.$CssCssText(e,b.style.cssText);var g=a.$GetParentNode(b);a.$InsertBefore(g,e,b);a.$RemoveChild(g,b)}return d};var E;function rb(b){var g=this,k,h,j,e;function f(){var c=k;if(e)c+="ds";else if(h)c+="dn";else if(j)c+="av";a.$SetClassName(b,c)}function m(a){if(e)i.$CancelEvent(a);else{E.push(g);h=c;f()}}g.$MouseUp=function(){h=d;f()};g.$Activate=function(a){if(a!=l){j=a;f()}else return j};g.$Enable=function(a){if(a!=l){e=!a;f()}else return!e};b=i.$GetElement(b);if(!E){i.$AddEventBrowserMouseUp(function(){var a=E;E=[];q(a,function(a){a.$MouseUp()})});E=[]}k=i.$GetClassName(b);a.$AddEvent(b,"mousedown",m)}i.$Buttonize=function(a){return new rb(a)};i.$Css=G;i.$CssN=R;i.$CssP=sb;i.$CssOverflow=m("overflow");i.$CssTop=m("top",2);i.$CssLeft=m("left",2);i.$CssWidth=m("width",2);i.$CssHeight=m("height",2);i.$CssMarginLeft=m("marginLeft",2);i.$CssMarginTop=m("marginTop",2);i.$CssPosition=m("position");i.$CssDisplay=m("display");i.$CssZIndex=m("zIndex",1);i.$CssFloat=function(b,a){return G(b,r()?"styleFloat":"cssFloat",a)};i.$CssOpacity=function(b,a,c){if(a!=l)nb(b,a,c);else return lb(b)};i.$CssCssText=function(a,b){if(b!=l)a.style.cssText=b;else return a.style.cssText};var Q={$Opacity:i.$CssOpacity,$Top:i.$CssTop,$Left:i.$CssLeft,$Width:i.$CssWidth,$Height:i.$CssHeight,$Position:i.$CssPosition,$Display:i.$CssDisplay,$ZIndex:i.$CssZIndex},u;function J(){if(!u)u=i.$Extend({$MarginTop:i.$CssMarginTop,$MarginLeft:i.$CssMarginLeft,$Clip:i.$SetStyleClip,$Transform:i.$SetStyleTransform},Q);return u}function Z(){J();u.$Transform=u.$Transform;return u}i.$GetStyleSetter=J;i.$GetStyleSetterEx=Z;i.$GetStyles=function(c,b){J();var a={};q(b,function(d,b){if(Q[b])a[b]=Q[b](c)});return a};i.$SetStyles=function(c,b){var a=J();q(b,function(d,b){a[b]&&a[b](c,d)})};i.$SetStylesEx=function(b,a){Z();i.$SetStyles(b,a)};o=new function(){var a=this;function b(d,g){for(var j=d[0].length,i=d.length,h=g[0].length,f=[],c=0;c=h||n<=i))n=((n-i)%q+q)%q+i;if(!E||y||G||j!=n){var p=b.min(n,h);p=b.max(p,i);if(!E||y||G||p!=t){if(x){var d=x;if(z){var s=(p-l)/(m||1);if(g.$Optimize&&a.$IsBrowserChrome()&&m)s=b.round(s*m/16)/m*16;if(g.$Reverse)s=1-s;d={};for(var o in x){var R=M[o]||1,J=L[o]||[0,1],k=(s-J[0])/J[1];k=b.min(b.max(k,0),1);k=k*R;var H=b.floor(k);if(k!=H)k-=H;var Q=C[o]||C.$Default,I=Q(k),r,K=z[o],F=x[o];if(a.$IsNumeric(F))r=K+(F-K)*I;else{r=a.$Extend({$Offset:{}},z[o]);a.$Each(F.$Offset,function(c,b){var a=c*I;r.$Offset[b]=a;r[b]+=a})}d[o]=r}}if(z.$Zoom)d.$Transform={$Rotate:d.$Rotate||0,$Scale:d.$Zoom,$OriginalWidth:g.$OriginalWidth,$OriginalHeight:g.$OriginalHeight};if(x.$Clip&&g.$Move){var v=d.$Clip.$Offset,D=(v.$Top||0)+(v.$Bottom||0),A=(v.$Left||0)+(v.$Right||0);d.$Left=(d.$Left||0)+A;d.$Top=(d.$Top||0)+D;d.$Clip.$Left-=A;d.$Clip.$Right-=A;d.$Clip.$Top-=D;d.$Clip.$Bottom-=D}if(d.$Clip&&a.$CanClearClip()&&!d.$Clip.$Top&&!d.$Clip.$Left&&d.$Clip.$Right==g.$OriginalWidth&&d.$Clip.$Bottom==g.$OriginalHeight)d.$Clip=e;a.$Each(d,function(b,a){B[a]&&B[a](O,b)})}f.$OnInnerOffsetChange(t-l,p-l)}t=p;a.$Each(u,function(b,c){var a=w=o*p)c=o;w(c);if(!y&&c*p>=o*p)J(D);else a.$Delay(H,g.$Interval)}}function v(d,e,g){if(!r){r=c;y=g;D=e;d=b.max(d,i);d=b.min(d,h);o=d;p=ol&&j<=s};f.$SetLoopLength=function(a){q=a};f.$Locate=N;f.$Shift=I;f.$Join=F;f.$Combine=function(a){F(a,0)};f.$Chain=function(a){F(a,1)};f.$GetPosition_InnerBegin=function(){return l};f.$GetPosition_InnerEnd=function(){return s};f.$GetPosition_OuterBegin=function(){return i};f.$GetPosition_OuterEnd=function(){return h};f.$OnPositionChange=a.$EmptyFunction;f.$OnStart=a.$EmptyFunction;f.$OnStop=a.$EmptyFunction;f.$OnInnerOffsetChange=a.$EmptyFunction;f.$Version=a.$GetNow();g=a.$Extend({$Interval:16},g);q=g.$LoopLength;B=a.$Extend({},a.$GetStyleSetter(),g.$Setter);i=l=n;h=s=n+m;var M=g.$Round||{},L=g.$During||{};C=a.$Extend({$Default:a.$IsFunction(g.$Easing)&&g.$Easing||k.$EaseSwing},g.$Easing)};var s,j=g.$JssorSlideshowFormations$={};new function(){var o=0,n=1,w=2,v=3,I=1,H=2,J=4,G=8,O=256,P=512,N=1024,M=2048,z=M+I,y=M+H,E=P+I,C=P+H,D=O+J,A=O+G,B=N+J,F=N+G;function S(a){return(a&H)==H}function T(a){return(a&J)==J}function x(b,a,c){c.push(a);b[a]=b[a]||[];b[a].push(c)}j.$FormationStraight=function(f){for(var d=f.$Cols,e=f.$Rows,k=f.$Assembly,l=f.$Count,j=[],a=0,b=0,h=d-1,i=e-1,g=l-1,c,b=0;b=0&&a=0&&b=0&&a=0&&bf||d>g){switch(e){case z:case C:a++;break;case A:case B:case E:case y:b++;break;case F:case D:default:a--}if(a<0||b<0||a>f||b>g){switch(e){case z:case C:a=f;b++;break;case E:case y:b=g;a++;break;case A:case B:b=g;a--;break;case F:case D:default:a=0;b++}if(b>g)b=g;else if(b<0)b=0;else if(a>f)a=f;else if(a<0)a=0}d=b;c=a}}return i};j.$FormationSquare=function(h){var a=h.$Cols||1,c=h.$Rows||1,i=[],d,e,f,g,j;f=ac?(a-c)/2:0;j=b.round(b.max(a/2,c/2))+1;for(d=0;d1||f.$Clip;if(f.$Zoom||f.$Rotate){var M=c;if(a.$IsBrowserIE()&&a.$GetBrowserEngineVersion()<9)if(f.$Cols*f.$Rows>1)M=d;else N=d;if(M){g.$Zoom=f.$Zoom?f.$Zoom-1:1;h.$Zoom=1;if(a.$IsBrowserIe9Earlier()||a.$IsBrowserOpera())g.$Zoom=b.min(g.$Zoom,2);var J=f.$Rotate;if(J==c)J=1;g.$Rotate=J*360*(z?-1:1);h.$Rotate=0}}if(N){if(f.$Clip){var x=f.$ScaleClip||1,m=v.$Offset={};if(F&&C){m.$Top=i.$Height/2*x;m.$Bottom=-m.$Top}else if(F)m.$Bottom=-i.$Height*x;else if(C)m.$Top=i.$Height*x;if(E&&D){m.$Left=i.$Width/2*x;m.$Right=-m.$Left}else if(E)m.$Right=-i.$Width*x;else if(D)m.$Left=i.$Width*x}t.$Clip=v;h.$Clip=i[y]}var Q=p?1:-1,R=u?1:-1;if(f.x)g.$Left+=o*f.x*Q;if(f.y)g.$Top+=l*f.y*R;a.$Each(g,function(b,c){if(a.$IsNumeric(b))if(b!=h[c])t[c]=b-h[c]});w[y]=k?h:g;var K=b.round(j*f.$Delay/f.$Interval);n[y]=new Array(K);n[y].$Min=K;for(var B=f.$FramesCount,I=0;I<=B;I++){var e={};a.$Each(t,function(g,c){var m=f.$EasingInstance[c]||f.$EasingInstance.$Default,l=m[f.$Round[c]||1],k=f.$During[c]||[0,1],d=(I/B-k[0])/k[1]*B;d=b.round(b.min(B,b.max(d,0)));var j=l[d];if(a.$IsNumeric(g))e[c]=h[c]+g*j;else{var i=e[c]=a.$Extend({},h[c]);i.$Offset=[];a.$Each(g.$Offset,function(c,b){var a=c*j;i.$Offset[b]=a;i[b]+=a})}});if(h.$Zoom)e.$Transform={$Rotate:e.$Rotate||0,$Scale:e.$Zoom,$OriginalWidth:o,$OriginalHeight:l};if(e.$Clip&&f.$Move){var A=e.$Clip.$Offset,H=(A.$Top||0)+(A.$Bottom||0),G=(A.$Left||0)+(A.$Right||0);e.$Left=(e.$Left||0)+G;e.$Top=(e.$Top||0)+H;e.$Clip.$Left-=G;e.$Clip.$Right-=G;e.$Clip.$Top-=H;e.$Clip.$Bottom-=H}e.$ZIndex=e.$ZIndex||1;n[y].push(e)}})});p.reverse();a.$Each(p,function(b){a.$Each(b,function(d){var g=d[0],f=d[1],e=g+","+f,b=j;if(f||g)b=a.$CloneNode(j,c);a.$SetStyles(b,w[e]);a.$CssOverflow(b,"hidden");a.$CssPosition(b,"absolute");D.$AddClipElement(b);m[e]=b;a.$ShowElement(b,k)})})}g.$JssorSlideshowRunner$=function(h,l,j,n,p){var d=this,o,f,c,s=0,r=n.$TransitionsOrder,k,g=16;function q(){var a=this,b=0;i.call(a,0,o);a.$OnPositionChange=function(d,a){if(a-b>g){b=a;c&&c.$ShowFrame(a);f&&f.$ShowFrame(a)}};a.$Transition=k}d.$GetTransition=function(f){var c=0,e=n.$Transitions,d=e.length;if(r){if(d>f&&(a.$IsBrowserChrome()||a.$IsBrowserSafari()||a.$IsBrowserFireFox()))d-=d%f;c=s++%d}else c=b.floor(b.random()*d);e[c]&&(e[c].$Index=c);return e[c]};d.$Initialize=function(w,x,n,p,a){k=a;a=K(a,g);var m=p.$Item,i=n.$Item;m["no-image"]=!p.$Image;i["no-image"]=!n.$Image;var q=m,r=i,v=a,e=a.$Brother||K({},g);if(!a.$SlideOut){q=i;r=m}var s=e.$Shift||0;f=new L(h,r,e,b.max(s-e.$Interval,0),l,j);c=new L(h,q,v,b.max(e.$Interval-s,0),l,j);f.$ShowFrame(0);c.$ShowFrame(0);o=b.max(f.$EndTime,c.$EndTime);d.$Index=w};d.$Clear=function(){h.$Clear();f=e;c=e};d.$GetProcessor=function(){var a=e;if(c)a=new q;return a};if(a.$IsBrowserIe9Earlier()||a.$IsBrowserOpera()||p&&a.$GetWebKitVersion<537)g=32;m.call(d);i.call(d,-1e7,1e7)};function l(o,ec){var j=this;function zc(){var a=this;i.call(a,-1e8,2e8);a.$GetCurrentSlideInfo=function(){var c=a.$GetPosition_Display(),d=b.floor(c),f=u(d),e=c-b.floor(c);return{$Index:f,$VirtualIndex:d,$Position:e}};a.$OnPositionChange=function(d,a){var e=b.floor(a);if(e!=a&&a>d)e++;Rb(e,c);j.$TriggerEvent(l.$EVT_POSITION_CHANGE,u(a),u(d),a,d)}}function yc(){var b=this;i.call(b,0,0,{$LoopLength:s});a.$Each(C,function(a){L&1&&a.$SetLoopLength(s);b.$Chain(a);a.$Shift(hb/Zb)})}function xc(){var a=this,b=Qb.$Elmt;i.call(a,-1,2,{$Easing:k.$EaseLinear,$Setter:{$Position:Xb},$LoopLength:s},b,{$Position:1},{$Position:-1});a.$Wrapper=b}function mc(o,m){var a=this,f,g,h,k,b;i.call(a,-1e8,2e8);a.$OnStart=function(){R=c;V=e;j.$TriggerEvent(l.$EVT_SWIPE_START,u(y.$GetPosition()),y.$GetPosition())};a.$OnStop=function(){R=d;k=d;var a=y.$GetCurrentSlideInfo();j.$TriggerEvent(l.$EVT_SWIPE_END,u(y.$GetPosition()),y.$GetPosition());!a.$Position&&Bc(a.$VirtualIndex,q)};a.$OnPositionChange=function(d,c){var a;if(k)a=b;else{a=g;if(h)a=n.$SlideEasing(c/h)*(g-f)+f}y.$GoToPosition(a)};a.$PlayCarousel=function(b,d,c,e){f=b;g=d;h=c;y.$GoToPosition(b);a.$GoToPosition(0);a.$PlayToPosition(c,e)};a.$StandBy=function(d){k=c;b=d;a.$Play(d,e,c)};a.$SetStandByPosition=function(a){b=a};a.$MoveCarouselTo=function(a){y.$GoToPosition(a)};y=new zc;y.$Combine(o);y.$Combine(m)}function nc(){var c=this,b=Wb();a.$CssZIndex(b,0);c.$Elmt=b;c.$AddClipElement=function(c){a.$AppendChild(b,c);a.$ShowElement(b)};c.$Clear=function(){a.$HideElement(b);a.$ClearInnerHtml(b)}}function wc(p,o){var f=this,t,x,L,y,g,z=[],R,r,X,J,P,F,k,v,h,hb;i.call(f,-w,w+1,{$SlideItemAnimator:c});function E(a){x&&x.$Revert();t&&t.$Revert();W(p,a);F=c;t=new G.$Class(p,G,1);x=new G.$Class(p,G);x.$GoToBegin();t.$GoToBegin()}function Z(){t.$VersionK||b>I)){var h=d,p=K/I*b/e;if(n.$FillMode&1)h=p>1;else if(n.$FillMode&2)h=p<1;k=h?e*I/b:K;i=h?I:b*K/e}a.$CssWidth(g,k);a.$CssHeight(g,i);a.$CssTop(g,(I-i)/2);a.$CssLeft(g,(K-k)/2)}a.$CssPosition(g,"absolute");j.$TriggerEvent(l.$EVT_LOAD_END,cc)}}a.$HideElement(q);o&&o(f)}function Y(b,c,d,e){if(e==V&&q==o&&S)if(!Ac){var a=u(b);A.$Initialize(a,o,c,f,d);c.$HideContentForSlideshow();bb.$Locate(a,1);bb.$GoToPosition(a);B.$PlayCarousel(b,b,0)}}function ab(b){if(b==V&&q==o){if(!k){var a=e;if(A)if(A.$Index==o)a=A.$GetProcessor();else A.$Clear();Z();k=new uc(o,a,f.$GetCaptionSliderIn(),f.$GetCaptionSliderOut());k.$SetPlayer(h)}!k.$IsPlaying()&&k.$Replay()}}function Q(d,c){if(d==o){if(d!=c)C[c]&&C[c].$ParkOut();h&&h.$Enable();var j=V=a.$GetNow();f.$LoadImage(a.$CreateCallback(e,ab,j))}else{var i=b.abs(o-d),g=w+n.$LazyLoading;(!P||i<=g||s-i<=g)&&f.$LoadImage()}}function db(){if(q==o&&k){k.$Stop();h&&h.$Quit();h&&h.$Disable();k.$OpenSlideshowPanel()}}function gb(){q==o&&k&&k.$Stop()}function O(b){if(U)a.$CancelEvent(b);else j.$TriggerEvent(l.$EVT_CLICK,o,b)}function N(){h=v.pInstance;k&&k.$SetPlayer(h)}f.$LoadImage=function(d,b){b=b||y;if(z.length&&!J){a.$ShowElement(b);if(!X){X=c;j.$TriggerEvent(l.$EVT_LOAD_START);a.$Each(z,function(b){if(!b.src){b.src=a.$GetAttributeEx(b,"src2");a.$CssDisplay(b,b["display-origin"])}})}a.$LoadImages(z,g,a.$CreateCallback(e,M,d,b))}else M(d,b)};f.$GoForNextSlide=function(){if(A){var b=A.$GetTransition(s);if(b){var f=V=a.$GetNow(),c=o+1*Vb,d=C[u(c)];return d.$LoadImage(a.$CreateCallback(e,Y,c,d,b,f),y)}}cb(q+n.$AutoPlaySteps*Vb)};f.$TryActivate=function(){Q(o,o)};f.$ParkOut=function(){h&&h.$Quit();h&&h.$Disable();f.$UnhideContentForSlideshow();k&&k.$Abort();k=e;E()};f.$StampSlideItemElements=function(a){a=hb+"_"+a};f.$HideContentForSlideshow=function(){a.$HideElement(p)};f.$UnhideContentForSlideshow=function(){a.$ShowElement(p)};f.$EnablePlayer=function(){h&&h.$Enable()};function W(b,f,e){if(b["jssor-slider"])return;e=e||0;if(!F){if(b.tagName=="IMG"){z.push(b);if(!b.src){P=c;b["display-origin"]=a.$CssDisplay(b);a.$HideElement(b)}}a.$IsBrowserIe9Earlier()&&a.$CssZIndex(b,(a.$CssZIndex(b)||0)+1);if(n.$HWA&&a.$GetWebKitVersion()>0)(!H||a.$GetWebKitVersion()<534||!fb)&&a.$EnableHWA(b)}var h=a.$GetChildren(b);a.$Each(h,function(h){var j=a.$GetAttributeEx(h,"u");if(j=="player"&&!v){v=h;if(v.pInstance)N();else a.$AddEvent(v,"dataavailable",N)}if(j=="caption"){if(!a.$IsBrowserIE()&&!f){var i=a.$CloneNode(h,c);a.$InsertBefore(b,i,h);a.$RemoveChild(b,h);h=i;f=c}}else if(!F&&!e&&!g&&a.$GetAttributeEx(h,"u")=="image"){g=h;if(g){if(g.tagName=="A"){R=g;a.$SetStyles(R,T);r=a.$CloneNode(g,d);a.$AddEvent(r,"click",O);a.$SetStyles(r,T);a.$CssDisplay(r,"block");a.$CssOpacity(r,0);a.$Css(r,"backgroundColor","#000");g=a.$FindFirstChildByTag(g,"IMG")}g.border=0;a.$SetStyles(g,T)}}W(h,f,e+1)})}f.$OnInnerOffsetChange=function(c,b){var a=w-b;Xb(L,a)};f.$GetCaptionSliderIn=function(){return t};f.$GetCaptionSliderOut=function(){return x};f.$Index=o;m.call(f);var D=a.$FindFirstChildByAttribute(p,"thumb");if(D){f.$Thumb=a.$CloneNode(D,c);a.$RemoveAttribute(D,"id");a.$HideElement(D)}a.$ShowElement(p);y=a.$CloneNode(eb,c);a.$CssZIndex(y,1e3);a.$AddEvent(p,"click",O);E(c);f.$Image=g;f.$Link=r;f.$Item=p;f.$Wrapper=L=p;a.$AppendChild(L,y);j.$On(203,Q);j.$On(22,gb);j.$On(24,db)}function uc(g,r,v,u){var b=this,m=0,x=0,o,h,e,f,k,s,w,t,p=C[g];i.call(b,0,0);function y(){a.$ClearChildren(O);dc&&k&&p.$Link&&a.$AppendChild(O,p.$Link);a.$ShowElement(O,k||!p.$Image)}function z(){if(s){s=d;j.$TriggerEvent(l.$EVT_ROLLBACK_END,g,e,m,h,e,f);b.$GoToPosition(h)}b.$Replay()}function B(a){t=a;b.$Stop();b.$Replay()}b.$Replay=function(){var a=b.$GetPosition_Display();if(!J&&!R&&!t&&q==g){if(!a){if(o&&!k){k=c;b.$OpenSlideshowPanel(c);j.$TriggerEvent(l.$EVT_SLIDESHOW_START,g,m,x,o,f)}y()}var d,n=l.$EVT_STATE_CHANGE;if(a!=f)if(a==e)d=f;else if(a==h)d=e;else if(!a)d=h;else if(a>e){s=c;d=e;n=l.$EVT_ROLLBACK_START}else d=b.$GetPlayToPosition();j.$TriggerEvent(n,g,a,m,h,e,f);var i=S&&(!Tb||ab);if(a==f)i&&p.$GoForNextSlide();else(i||a!=e)&&b.$PlayToPosition(d,z)}};b.$Abort=function(){A&&A.$Index==g&&A.$Clear();var a=b.$GetPosition_Display();a=o){k=d;y();p.$UnhideContentForSlideshow();A.$Clear();j.$TriggerEvent(l.$EVT_SLIDESHOW_END,g,m,x,o,f)}j.$TriggerEvent(l.$EVT_PROGRESS_CHANGE,g,a,m,h,e,f)};b.$SetPlayer=function(a){if(a&&!w){w=a;a.$On($JssorPlayer$.$EVT_SWITCH,B)}};r&&b.$Chain(r);o=b.$GetPosition_OuterEnd();b.$GetPosition_OuterEnd();b.$Chain(v);h=v.$GetPosition_OuterEnd();e=h+n.$AutoPlayInterval;u.$Shift(e);b.$Combine(u);f=b.$GetPosition_OuterEnd()}function Xb(c,g){var f=x>0?x:ib,d=Ab*g*(f&1),e=Bb*g*(f>>1&1);if(!a.$IsBrowserChrome()){d=b.round(d);e=b.round(e)}if(a.$IsBrowserIE()&&a.$GetBrowserVersion()>=10&&a.$GetBrowserVersion()<11)c.style.msTransform="translate("+d+"px, "+e+"px)";else if(a.$IsBrowserChrome()&&a.$GetBrowserVersion()>=30&&a.$GetBrowserVersion()<34){c.style.WebkitTransition="transform 0s";c.style.WebkitTransform="translate3d("+d+"px, "+e+"px, 0px) perspective(2000px)"}else{a.$CssLeft(c,d);a.$CssTop(c,e)}}function sc(c){U=0;var b=a.$GetEventSrcElement(c).tagName;!M&&b!="INPUT"&&b!="TEXTAREA"&&qc()&&rc(c)}function rc(b){qb=R;J=c;zb=d;V=e;a.$AddEvent(f,ob,ac);a.$GetNow();Jb=B.$GetPlayToPosition();B.$Stop();if(!qb)x=0;if(H){var h=b.touches[0];ub=h.clientX;vb=h.clientY}else{var g=a.$GetMousePosition(b);ub=g.x;vb=g.y;a.$CancelEvent(b)}E=0;db=0;gb=0;D=y.$GetPosition();j.$TriggerEvent(l.$EVT_DRAG_START,u(D),D,b)}function ac(e){if(J&&(!a.$IsBrowserIe9Earlier()||e.button)){var f;if(H){var m=e.touches;if(m&&m.length>0)f=new h(m[0].clientX,m[0].clientY)}else f=a.$GetMousePosition(e);if(f){var k=f.x-ub,l=f.y-vb;if(b.floor(D)!=D)x=x||ib&M;if((k||l)&&!x){if(M==3)if(b.abs(l)>b.abs(k))x=2;else x=1;else x=M;if(H&&x==1&&b.abs(l)-b.abs(k)>3)zb=c}if(x){var d=l,j=Bb;if(x==1){d=k;j=Ab}if(!(L&1)){if(d>0){var g=j*q,i=d-g;if(i>0)d=g+b.sqrt(i)*5}if(d<0){var g=j*(s-w-q),i=-d-g;if(i>0)d=-g-b.sqrt(i)*5}}if(E-db<-2)gb=1;else if(E-db>2)gb=0;db=E;E=d;sb=D-E/j/(nb||1);if(E&&x&&!zb){a.$CancelEvent(e);if(!R)B.$StandBy(sb);else B.$SetStandByPosition(sb)}else a.$IsBrowserIe9Earlier()&&a.$CancelEvent(e)}}}else Eb(e)}function Eb(h){oc();if(J){J=d;a.$GetNow();a.$RemoveEvent(f,ob,ac);U=E;U&&a.$CancelEvent(h);B.$Stop();var e=y.$GetPosition();j.$TriggerEvent(l.$EVT_DRAG_END,u(e),e,u(D),D,h);var c=b.floor(D);if(b.abs(E)>=n.$MinDragOffsetToSlide){c=b.floor(e);c+=gb}if(!(L&1))c=b.min(s-w,b.max(c,0));var g=b.abs(c-e);g=1-b.pow(1-g,5);if(!U&&qb)B.$Continue(Jb);else if(e==c){tb.$EnablePlayer();tb.$TryActivate()}else B.$PlayCarousel(e,c,g*Sb)}}function lc(a){C[q];q=u(a);tb=C[q];Rb(a);return q}function Bc(a,b){x=0;lc(a);j.$TriggerEvent(l.$EVT_PARK,u(a),b)}function Rb(b,c){xb=b;a.$Each(Q,function(a){a.$SetCurrentIndex(u(b),b,c)})}function qc(){var b=l.$DragRegistry||0,a=P;if(H)a&1&&(a&=1);l.$DragRegistry|=a;return M=a&~b}function oc(){if(M){l.$DragRegistry&=~P;M=0}}function Wb(){var b=a.$CreateDivElement();a.$SetStyles(b,T);a.$CssPosition(b,"absolute");return b}function u(a){return(a%s+s)%s}function ic(a,c){if(c)if(!L){a=b.min(b.max(a+xb,0),s-w);c=d}else if(L&2){a=u(a+xb);c=d}cb(a,n.$SlideDuration,c)}function yb(){a.$Each(Q,function(a){a.$Show(a.$Options.$ChanceToShow>ab)})}function gc(b){b=a.$GetEvent(b);var c=b.target?b.target:b.srcElement,d=b.relatedTarget?b.relatedTarget:b.toElement;if(!a.$IsChild(o,c)||a.$IsChild(o,d))return;ab=1;yb();C[q].$TryActivate()}function fc(){ab=0;yb()}function hc(){T={$Width:K,$Height:I,$Top:0,$Left:0};a.$Each(X,function(b){a.$SetStyles(b,T);a.$CssPosition(b,"absolute");a.$CssOverflow(b,"hidden");a.$HideElement(b)});a.$SetStyles(eb,T)}function lb(b,a){cb(b,a,c)}function cb(h,g,k){if(Ob&&(!J||n.$NaviQuitDrag)){R=c;J=d;B.$Stop();if(a.$IsUndefined(g))g=Sb;var f=Fb.$GetPosition_Display(),e=h;if(k){e=f+h;if(h>0)e=b.ceil(e);else e=b.floor(e)}if(!(L&1)){e=u(e);e=b.max(0,b.min(e,s-w))}var j=(e-f)%s;e=f+j;var i=f==e?0:g*b.abs(j);i=b.min(i,g*w*1.5);B.$PlayCarousel(f,e,i||1)}}j.$PlayTo=cb;j.$GoTo=function(a){cb(a,1)};j.$Next=function(){lb(1)};j.$Prev=function(){lb(-1)};j.$Pause=function(){S=d};j.$Play=function(){if(!S){S=c;C[q]&&C[q].$TryActivate()}};j.$SetSlideshowTransitions=function(b){a.$TranslateTransitions(b);n.$SlideshowOptions.$Transitions=b};j.$SetCaptionTransitions=function(b){a.$TranslateTransitions(b);G.$CaptionTransitions=b;G.$Version=a.$GetNow()};j.$SlidesCount=function(){return X.length};j.$CurrentIndex=function(){return q};j.$IsAutoPlaying=function(){return S};j.$IsDragging=function(){return J};j.$IsSliding=function(){return R};j.$IsMouseOver=function(){return!ab};j.$LastDragSucceded=function(){return U};j.$GetOriginalWidth=function(){return a.$CssWidth(v||o)};j.$GetOriginalHeight=function(){return a.$CssHeight(v||o)};j.$GetScaleWidth=function(){return a.$CssWidth(o)};j.$GetScaleHeight=function(){return a.$CssHeight(o)};j.$SetScaleWidth=function(c){if(!v){var b=a.$CreateDivElement(f);a.$CssCssText(b,a.$CssCssText(o));a.$SetClassName(b,a.$GetClassName(o));a.$CssPosition(b,"relative");a.$CssTop(b,0);a.$CssLeft(b,0);a.$CssOverflow(b,"visible");v=a.$CreateDivElement(f);a.$CssPosition(v,"absolute");a.$CssTop(v,0);a.$CssLeft(v,0);a.$CssWidth(v,a.$CssWidth(o));a.$CssHeight(v,a.$CssHeight(o));a.$SetStyleTransformOrigin(v,"0 0");a.$AppendChild(v,b);var g=a.$GetChildren(o);a.$AppendChild(o,v);a.$Css(o,"backgroundImage","");var e={navigator:Y&&Y.$Scale==d,arrowleft:N&&N.$Scale==d,arrowright:N&&N.$Scale==d,thumbnavigator:F&&F.$Scale==d,thumbwrapper:F&&F.$Scale==d};a.$Each(g,function(c){a.$AppendChild(e[a.$GetAttributeEx(c,"u")]?o:b,c)});a.$ShowElement(b);a.$ShowElement(v)}nb=c/a.$CssWidth(v);a.$SetStyleScale(v,nb);a.$CssWidth(o,c);a.$CssHeight(o,nb*a.$CssHeight(v));a.$Each(Q,function(a){a.$Relocate()})};j.$GetVirtualIndex=function(a){var d=b.ceil(u(hb/Zb)),c=u(a-q+d);if(c>w){if(a-q>s/2)a-=s;else if(a-q<=-s/2)a+=s}else a=q+c-d;return a};m.call(this);j.$Elmt=o=a.$GetElement(o);var n=a.$Extend({$FillMode:0,$LazyLoading:1,$StartIndex:0,$AutoPlay:d,$Loop:1,$HWA:c,$NaviQuitDrag:c,$AutoPlaySteps:1,$AutoPlayInterval:3e3,$PauseOnHover:1,$SlideDuration:500,$SlideEasing:k.$EaseOutQuad,$MinDragOffsetToSlide:20,$SlideSpacing:0,$DisplayPieces:1,$ParkingPosition:0,$UISearchMode:1,$PlayOrientation:1,$DragOrientation:1},ec),ib=n.$PlayOrientation&3,Vb=(n.$PlayOrientation&4)/-4||1,Z=n.$SlideshowOptions,G=a.$Extend({$Class:t,$PlayInMode:1,$PlayOutMode:1},n.$CaptionSliderOptions);a.$TranslateTransitions(G.$CaptionTransitions);var Y=n.$BulletNavigatorOptions,N=n.$ArrowNavigatorOptions,F=n.$ThumbnailNavigatorOptions,W=n.$UISearchMode,v,z=a.$FindFirstChildByAttribute(o,"slides",e,W),eb=a.$FindFirstChildByAttribute(o,"loading",e,W)||a.$CreateDivElement(f),Ib=a.$FindFirstChildByAttribute(o,"navigator",e,W),bc=a.$FindFirstChildByAttribute(o,"arrowleft",e,W),Yb=a.$FindFirstChildByAttribute(o,"arrowright",e,W),Hb=a.$FindFirstChildByAttribute(o,"thumbnavigator",e,W),kc=a.$CssWidth(z),jc=a.$CssHeight(z),T,X=[],tc=a.$GetChildren(z);a.$Each(tc,function(b){b.tagName=="DIV"&&!a.$GetAttributeEx(b,"u")&&X.push(b)});var q=-1,xb,tb,s=X.length,K=n.$SlideWidth||kc,I=n.$SlideHeight||jc,Ub=n.$SlideSpacing,Ab=K+Ub,Bb=I+Ub,Zb=ib&1?Ab:Bb,w=b.min(n.$DisplayPieces,s),jb,x,M,zb,H,Q=[],Nb,Pb,Mb,dc,Ac,S,Tb=n.$PauseOnHover,Sb=n.$SlideDuration,rb,fb,hb,Ob=w1&&rb&&(!a.$IsBrowserIE()||a.$GetBrowserVersion()>=8)}hb=fb||w>=s||!(L&1)?0:n.$ParkingPosition;P=(w>1||hb?ib:-1)&n.$DragOrientation;var wb=z,C=[],A,O,Db="mousedown",ob="mousemove",Gb="mouseup",mb,D,qb,Jb,sb;if(g.navigator.msPointerEnabled){Db="MSPointerDown";ob="MSPointerMove";Gb="MSPointerUp";mb="MSPointerCancel";if(P){var Cb="none";if(P==1)Cb="pan-y";else if(P==2)Cb="pan-x";a.$SetAttribute(wb.style,"-ms-touch-action",Cb)}}else if("ontouchstart"in g||"createTouch"in f){H=c;Db="touchstart";ob="touchmove";Gb="touchend";mb="touchcancel"}bb=new xc;if(fb)A=new rb(Qb,K,I,Z,H);a.$AppendChild(jb,bb.$Wrapper);a.$CssOverflow(z,"hidden");O=Wb();a.$Css(O,"backgroundColor","#000");a.$CssOpacity(O,0);a.$InsertBefore(wb,O,wb.firstChild);for(var pb=0;pb