以下是 jquery+css3滑动头像 的示例演示效果:
部分效果截图:
HTML代码(index.html):
<html>
<head>
<meta charset="UTF-8">
<title>jquery+css3滑动头像</title>
<style>
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 16px;
-webkit-font-smoothing: antialiased;
-moz-font-smoothing: antialiased;
font-smoothing: antialiased;
margin:0;
padding:0;
background-color: #E6E6E6;
}
.grid {
margin: 100px auto 80px auto;
padding: 0px;
width: 100%;
height: auto;
overflow: hidden;
max-width: 1000px;
-webkit-box-shadow:0px 40px 50px rgba(0, 0, 0, 0.3);
-moz-box-shadow:0px 40px 50px rgba(0, 0, 0, 0.3);
box-shadow:0px 40px 50px rgba(0, 0, 0, 0.3);
}
.grid li {
width: 10%;
background: #000000;
float: left;
position: relative;
overflow: hidden;
}
.grid img {
float: left;
width: 100%;
height: auto;
position: relative;
-webkit-transform-style: preserve-3d;
-webkit-backface-visibility: hidden;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform-style: preserve-3d;
-moz-backface-visibility: hidden;
-moz-transform: translate3d(0, 0, 0);
transform-style: preserve-3d;
backface-visibility: hidden;
transform: translate3d(0, 0, 0);
}
.grid .info {
position: absolute;
width: 100%;
height: 100%;
padding: 15px;
background: #DC584C;
display: none;
z-index: 2;
-webkit-transform-style: preserve-3d;
-webkit-backface-visibility: hidden;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform-style: preserve-3d;
-moz-backface-visibility: hidden;
-moz-transform: translate3d(0, 0, 0);
transform-style: preserve-3d;
backface-visibility: hidden;
transform: translate3d(0, 0, 0);
}
.grid p {
font-size: 22px;
font-weight: bolder;
color: #FFF;
}
.title {background-color:#DC584C; width:100%; position:fixed; top:0; left:0; font-size:12px; font-family:Verdana, Geneva, sans-serif; z-index:99999;}
.title a {color:#FFF; text-decoration:none; line-height:24px; padding:0 10px; letter-spacing: 1px;}
.title_r {float:right;}
.title_l {float:left;}
.title a:hover {background:#a32a1f;}
.footer {text-align:center;}
.footer a {text-decoration:none; font-size:14px; color:#999;}
</style>
</head>
<body>
<ul class="grid">
<li>
<a href="#">
<img src="images/1.jpg" alt="" />
<div class="info">
<p>1</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/2.jpg" alt="" />
<div class="info">
<p>2</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/3.jpg" alt="" />
<div class="info">
<p>3</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/4.jpg" alt="" />
<div class="info">
<p>4</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/5.jpg" alt="" />
<div class="info">
<p>5</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/6.jpg" alt="" />
<div class="info">
<p>6</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/7.jpg" alt="" />
<div class="info">
<p>7</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/8.jpg" alt="" />
<div class="info">
<p>8</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/9.jpg" alt="" />
<div class="info">
<p>9</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/10.jpg" alt="" />
<div class="info">
<p>10</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/11.jpg" alt="" />
<div class="info">
<p>11</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/12.jpg" alt="" />
<div class="info">
<p>12</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/13.jpg" alt="" />
<div class="info">
<p>13</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/14.jpg" alt="" />
<div class="info">
<p>14</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/15.jpg" alt="" />
<div class="info">
<p>15</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/16.jpg" alt="" />
<div class="info">
<p>16</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/17.jpg" alt="" />
<div class="info">
<p>17</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/18.jpg" alt="" />
<div class="info">
<p>18</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/19.jpg" alt="" />
<div class="info">
<p>19</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/20.jpg" alt="" />
<div class="info">
<p>20</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/21.jpg" alt="" />
<div class="info">
<p>21</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/22.jpg" alt="" />
<div class="info">
<p>22</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/23.jpg" alt="" />
<div class="info">
<p>23</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/24.jpg" alt="" />
<div class="info">
<p>24</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/25.jpg" alt="" />
<div class="info">
<p>25</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/1.jpg" alt="" />
<div class="info">
<p>26</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/2.jpg" alt="" />
<div class="info">
<p>27</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/3.jpg" alt="" />
<div class="info">
<p>28</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/4.jpg" alt="" />
<div class="info">
<p>29</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/5.jpg" alt="" />
<div class="info">
<p>30</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/6.jpg" alt="" />
<div class="info">
<p>31</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/7.jpg" alt="" />
<div class="info">
<p>32</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/8.jpg" alt="" />
<div class="info">
<p>33</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/9.jpg" alt="" />
<div class="info">
<p>34</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/10.jpg" alt="" />
<div class="info">
<p>35</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/11.jpg" alt="" />
<div class="info">
<p>36</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/12.jpg" alt="" />
<div class="info">
<p>37</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/13.jpg" alt="" />
<div class="info">
<p>38</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/14.jpg" alt="" />
<div class="info">
<p>39</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/15.jpg" alt="" />
<div class="info">
<p>40</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/16.jpg" alt="" />
<div class="info">
<p>41</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/17.jpg" alt="" />
<div class="info">
<p>42</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/18.jpg" alt="" />
<div class="info">
<p>43</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/19.jpg" alt="" />
<div class="info">
<p>44</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/20.jpg" alt="" />
<div class="info">
<p>45</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/21.jpg" alt="" />
<div class="info">
<p>46</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/22.jpg" alt="" />
<div class="info">
<p>47</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/23.jpg" alt="" />
<div class="info">
<p>48</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/24.jpg" alt="" />
<div class="info">
<p>49</p>
</div>
</a>
</li>
<li>
<a href="#">
<img src="images/25.jpg" alt="" />
<div class="info">
<p>50</p>
</div>
</a>
</li>
</ul>
<script src="js/jquery-latest.js"></script>
<script src="js/jquery.transit.min.js"></script>
<script>
(function() {
$(function() {
var columns, current, easing, grid, hideItem, showItem, time,
_this = this;
grid = $(".grid");
current = {
index: -1,
column: 0,
line: 0
};
columns = 10;
easing = "cubic-bezier(0.165, 0.840, 0.440, 1.000)";
time = 400;
grid.on("mouseenter", "a", function(e) {
var column, el, image, index, info, item, line;
el = $(e.currentTarget);
info = el.find(".info");
image = el.find("img");
index = el.parent().index();
column = index % columns;
line = Math.floor(index / columns);
console.log(index, column, line);
item = {
el: el,
index: index,
column: column,
line: line,
info: info,
image: image
};
if (current.el && current.index === index) return;
if (line === current.line && column > current.column) {
showItem(item, "-100%", 0, "25%", 0);
hideItem(current, "100%", 0, "-25%", 0);
} else if (line === current.line && column < current.column) {
showItem(item, "100%", 0, "-25%", 0);
hideItem(current, "-100%", 0, "25%", 0);
} else if (line > current.line && column === current.column) {
showItem(item, 0, "-100%", 0, "25%");
hideItem(current, 0, "100%", 0, "-25%");
} else {
showItem(item, 0, "100%", 0, "-25%");
hideItem(current, 0, "-100%", 0, "25%");
}
return current = item;
});
showItem = function(item, infoX, infoY, imageX, imageY) {
item.info.stop().css({
x: infoX,
y: infoY,
display: "block"
}).transition({
x: 0,
y: 0,
duration: time,
easing: easing
});
return item.image.stop().transition({
x: imageX,
y: imageY,
opacity: .5,
duration: time,
easing: easing
});
};
return hideItem = function(item, infoX, infoY, imageX, imageY) {
if (!item.el) return;
item.info.stop().transition({
x: infoX,
y: infoY,
duration: time,
easing: easing
});
return item.image.stop().css({
x: imageX,
y: imageY,
opacity: .5
}).transition({
x: 0,
y: 0,
opacity: 1,
duration: time,
easing: easing
});
};
});
}).call(this);
</script>
</body>
</html>
JS代码(jquery-latest.js):
/*! * jQuery JavaScript Library v1.9.1 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright 2005,2012 jQuery Foundation,Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date:2013-2-4 */
(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// The deferred used on DOM readyreadyList,// A central reference to the root jQuery(document)rootjQuery,// Support:IE<9// For `typeof node.method` instead of `node.method !== undefined`core_strundefined = typeof undefined,// Use the correct document accordingly with window argument (sandbox)document = window.document,location = window.location,// Map over jQuery in case of overwrite_jQuery = window.jQuery,// Map over the $ in case of overwrite_$ = window.$,// [[Class]] -> type pairsclass2type ={
}
,// List of deleted data cache ids,so we can reuse themcore_deletedIds = [],core_version = "1.9.1",// Save a reference to some core methodscore_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 jQueryjQuery = function( selector,context ){
// The jQuery object is actually just the init constructor 'enhanced'return new jQuery.fn.init( selector,context,rootjQuery );
}
,// Used for matching numberscore_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,// Used for splitting on whitespacecore_rnotwhite = /\S+/g,// Make sure we trim BOM and NBSP (here's looking at you,Safari 5.0 and IE)rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,// A simple way to check for HTML strings// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)// Strict HTML recognition (#11290:must start with <)rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,// Match a standalone tagrsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,// JSON RegExprvalidchars = /^[\],:{
}
\s]*$/,rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{
4}
)/g,rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,// Matches dashed string for camelizingrmsPrefix = /^-ms-/,rdashAlpha = /-([\da-z])/gi,// Used by jQuery.camelCase as callback to replace()fcamelCase = function( all,letter ){
return letter.toUpperCase();
}
,// The ready event handlercompleted = function( event ){
// readyState === "complete" is good enough for us to call the dom ready in oldIEif ( document.addEventListener || event.type === "load" || document.readyState === "complete" ){
detach();
jQuery.ready();
}
}
,// Clean-up method for dom ready eventsdetach = function(){
if ( document.addEventListener ){
document.removeEventListener( "DOMContentLoaded",completed,false );
window.removeEventListener( "load",completed,false );
}
else{
document.detachEvent( "onreadystatechange",completed );
window.detachEvent( "onload",completed );
}
}
;
jQuery.fn = jQuery.prototype ={
// The current version of jQuery being usedjquery:core_version,constructor:jQuery,init:function( selector,context,rootjQuery ){
var match,elem;
// HANDLE:$(""),$(null),$(undefined),$(false)if ( !selector ){
return this;
}
// Handle HTML stringsif ( 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 checkmatch = [ null,selector,null ];
}
else{
match = rquickExpr.exec( selector );
}
// Match html or make sure no context is specified for #idif ( match && (match[1] || !context) ){
// HANDLE:$(html) -> $(array)if ( match[1] ){
context = context instanceof jQuery ? context[0]:context;
// scripts is true for back-compatjQuery.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 possibleif ( 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 #6963if ( elem && elem.parentNode ){
// Handle the case where IE and Opera return items// by name instead of IDif ( elem.id !== match[2] ){
return rootjQuery.find( selector );
}
// Otherwise,we inject the element directly into the jQuery objectthis.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 selectorselector:"",// The default length of a jQuery object is 0length:0,// The number of elements contained in the matched element setsize:function(){
return this.length;
}
,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 arrayget:function( num ){
return num == null ?// Return a 'clean' arraythis.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 setvar 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 setreturn 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 callbackjQuery.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 instantiationjQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function(){
var src,copyIsArray,copy,name,options,clone,target = arguments[0] ||{
}
,i = 1,length = arguments.length,deep = false;
// Handle a deep copy situationif ( typeof target === "boolean" ){
deep = target;
target = arguments[1] ||{
}
;
// skip the boolean and the targeti = 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 passedif ( length === i ){
target = this;
--i;
}
for (;
i < length;
i++ ){
// Only deal with non-null/undefined valuesif ( (options = arguments[ i ]) != null ){
// Extend the base objectfor ( name in options ){
src = target[ name ];
copy = options[ name ];
// Prevent never-ending loopif ( target === copy ){
continue;
}
// Recurse if we're merging plain objects or arraysif ( 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 themtarget[ name ] = jQuery.extend( deep,clone,copy );
// Don't bring in undefined values}
else if ( copy !== undefined ){
target[ name ] = copy;
}
}
}
}
// Return the modified objectreturn target;
}
;
jQuery.extend({
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 #6781readyWait:1,// Hold (or release) the ready eventholdReady:function( hold ){
if ( hold ){
jQuery.readyWait++;
}
else{
jQuery.ready( true );
}
}
,// Handle when the DOM is readyready:function( wait ){
// Abort if there are pending holds or we're already readyif ( wait === true ? --jQuery.readyWait:jQuery.isReady ){
return;
}
// Make sure body exists,at least,in case IE gets a little overzealous (ticket #5443).if ( !document.body ){
return setTimeout( jQuery.ready );
}
// Remember that the DOM is readyjQuery.isReady = true;
// If a normal DOM Ready event fired,decrement,and wait if need beif ( wait !== true && --jQuery.readyWait > 0 ){
return;
}
// If there are functions bound,to executereadyList.resolveWith( document,[ jQuery ] );
// Trigger any bound ready eventsif ( 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 || function( obj ){
return jQuery.type(obj) === "array";
}
,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 );
}
return typeof obj === "object" || typeof obj === "function" ?class2type[ core_toString.call(obj) ] || "object":typeof obj;
}
,isPlainObject:function( 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 wellif ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ){
return false;
}
try{
// Not own constructor property must be Objectif ( obj.constructor &&!core_hasOwn.call(obj,"constructor") &&!core_hasOwn.call(obj.constructor.prototype,"isPrototypeOf") ){
return false;
}
}
catch ( e ){
// IE8,9 Will throw exceptions on certain host objects #9897return 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 || core_hasOwn.call( obj,key );
}
,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 stringparseHTML: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 tagif ( parsed ){
return [ context.createElement( parsed[1] ) ];
}
parsed = jQuery.buildFragment( [ data ],context,scripts );
if ( scripts ){
jQuery( scripts ).remove();
}
return jQuery.merge( [],parsed.childNodes );
}
,parseJSON:function( data ){
// Attempt to parse using the native JSON parser firstif ( window.JSON && window.JSON.parse ){
return window.JSON.parse( data );
}
if ( data === null ){
return data;
}
if ( typeof data === "string" ){
// Make sure leading/trailing whitespace is removed (IE can't handle it)data = jQuery.trim( data );
if ( data ){
// Make sure the incoming data is actual JSON// Logic borrowed from http://json.org/json2.jsif ( rvalidchars.test( data.replace( rvalidescape,"@" ).replace( rvalidtokens,"]" ).replace( rvalidbraces,"")) ){
return ( new Function( "return " + data ) )();
}
}
}
jQuery.error( "Invalid JSON:" + data );
}
,// Cross-browser xml parsingparseXML:function( data ){
var xml,tmp;
if ( !data || typeof data !== "string" ){
return null;
}
try{
if ( window.DOMParser ){
// Standardtmp = new DOMParser();
xml = tmp.parseFromString( data,"text/xml" );
}
else{
// IExml = new ActiveXObject( "Microsoft.XMLDOM" );
xml.async = "false";
xml.loadXML( data );
}
}
catch( e ){
xml = undefined;
}
if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ){
jQuery.error( "Invalid XML:" + data );
}
return xml;
}
,noop:function(){
}
,// Evaluates a script in a global context// Workarounds based on findings by Jim Driscoll// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-contextglobalEval:function( data ){
if ( data && jQuery.trim( data ) ){
// We use execScript on Internet Explorer// We use an anonymous function so that context is window// rather than jQuery in Firefox( window.execScript || function( data ){
window[ "eval" ].call( window,data );
}
)( data );
}
}
,// 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 onlyeach: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;
}
,// Use native String.trim function wherever possibletrim:core_trim && !core_trim.call("\uFEFF\xA0") ?function( text ){
return text == null ?"":core_trim.call( text );
}
:// Otherwise use our own trimming functionalityfunction( text ){
return text == null ?"":( text + "" ).replace( rtrim,"" );
}
,// results is for internal usage onlymakeArray: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 ){
var len;
if ( arr ){
if ( core_indexOf ){
return core_indexOf.call( arr,elem,i );
}
len = arr.length;
i = i ? i < 0 ? Math.max( 0,len + i ):i:0;
for (;
i < len;
i++ ){
// Skip accessing in sparse arraysif ( i in arr && arr[ i ] === elem ){
return i;
}
}
}
return -1;
}
,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 functionfor (;
i < length;
i++ ){
retVal = !!callback( elems[ i ],i );
if ( inv !== retVal ){
ret.push( elems[ i ] );
}
}
return ret;
}
,// arg is for internal usage onlymap: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 theirif ( 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 arraysreturn core_concat.apply( [],ret );
}
,// A global GUID counter for objectsguid:1,// Bind a function to a context,optionally partially applying any// arguments.proxy:function( fn,context ){
var args,proxy,tmp;
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 bindargs = 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 removedproxy.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 functionaccess:function( elems,fn,key,value,chainable,emptyGet,raw ){
var i = 0,length = elems.length,bulk = key == null;
// Sets many valuesif ( 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 setif ( 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:// Getsbulk ?fn.call( elems ):length ? fn( elems[0],key ):emptyGet;
}
,now:function(){
return ( new Date() ).getTime();
}
}
);
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:15if ( document.readyState === "complete" ){
// Handle it asynchronously to allow scripts the opportunity to delay readysetTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded}
else if ( document.addEventListener ){
// Use the handy event callbackdocument.addEventListener( "DOMContentLoaded",completed,false );
// A fallback to window.onload,that will always workwindow.addEventListener( "load",completed,false );
// If IE event model is used}
else{
// Ensure firing before onload,maybe late but safe also for iframesdocument.attachEvent( "onreadystatechange",completed );
// A fallback to window.onload,that will always workwindow.attachEvent( "onload",completed );
// If IE and not a frame// continually check to see if the document is readyvar top = false;
try{
top = window.frameElement == null && document.documentElement;
}
catch(e){
}
if ( top && top.doScroll ){
(function doScrollCheck(){
if ( !jQuery.isReady ){
try{
// Use the trick by Diego Perini// http://javascript.nwbox.com/IEContentLoaded/top.doScroll("left");
}
catch(e){
return setTimeout( doScrollCheck,50 );
}
// detach all dom ready eventsdetach();
// and execute any waiting functionsjQuery.ready();
}
}
)();
}
}
}
return readyList.promise( obj );
}
;
// Populate the class2type mapjQuery.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 theserootjQuery = jQuery(document);
// String to Object options format cachevar optionsCache ={
}
;
// Convert String-formatted options into Object-formatted ones and store in cachefunction 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 // Flag to know if list is currently firingfiring,// Last fire value (for non-forgettable lists)memory,// Flag to know if list was already firedfired,// End of the loop when firingfiringLength,// Index of currently firing callback (modified by remove if needed)firingIndex,// First callback to fire (used internally by add and fireWith)firingStart,// Actual callback listlist = [],// Stack of fire calls for repeatable listsstack = !options.once && [],// Fire callbacksfire = 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 addbreak;
}
}
firing = false;
if ( list ){
if ( stack ){
if ( stack.length ){
fire( stack.shift() );
}
}
else if ( memory ){
list = [];
}
else{
self.disable();
}
}
}
,// Actual Callbacks objectself ={
// Add a callback or a collection of callbacks to the listadd:function(){
if ( list ){
// First,we save the current lengthvar 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 recursivelyadd( 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 listremove:function(){
if ( list ){
jQuery.each( arguments,function( _,arg ){
var index;
while( ( index = jQuery.inArray( arg,list,index ) ) > -1 ){
list.splice( index,1 );
// Handle firing indexesif ( 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 listempty:function(){
list = [];
return this;
}
,// Have the list do nothing anymoredisable:function(){
list = stack = memory = undefined;
return this;
}
,// Is it disabled?disabled:function(){
return !list;
}
,// Lock the list in its current statelock:function(){
stack = undefined;
if ( !memory ){
self.disable();
}
return this;
}
,// Is it locked?locked:function(){
return !stack;
}
,// Call all callbacks with the given context and argumentsfireWith:function( context,args ){
args = args || [];
args = [ context,args.slice ? args.slice():args ];
if ( list && ( !fired || stack ) ){
if ( firing ){
stack.push( args );
}
else{
fire( args );
}
}
return this;
}
,// Call all the callbacks with the given argumentsfire:function(){
self.fireWith( this,arguments );
return this;
}
,// To know if the callbacks have already been called at least oncefired: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 newDeferdeferred[ 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 objectpromise:function( obj ){
return obj != null ? jQuery.extend( obj,promise ):promise;
}
}
,deferred ={
}
;
// Keep pipe for back-compatpromise.pipe = promise.then;
// Add list-specific methodsjQuery.each( tuples,function( i,tuple ){
var list = tuple[ 2 ],stateString = tuple[ 3 ];
// promise[ done | fail | progress ] = list.addpromise[ tuple[1] ] = list.add;
// Handle stateif ( 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 promisepromise.promise( deferred );
// Call given func if anyif ( func ){
func.call( deferred,deferred );
}
// All done!return deferred;
}
,// Deferred helperwhen:function( subordinate /*,...,subordinateN */
){
var i = 0,resolveValues = core_slice.call( arguments ),length = resolveValues.length,// the count of uncompleted subordinatesremaining = 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 valuesupdateFunc = 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 resolvedif ( 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 masterif ( !remaining ){
deferred.resolveWith( resolveContexts,resolveValues );
}
return deferred.promise();
}
}
);
jQuery.support = (function(){
var support,all,a,input,select,fragment,opt,eventName,isSupported,i,div = document.createElement("div");
// Setupdiv.setAttribute( "className","t" );
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
// Support tests won't run in some limited or non-browser environmentsall = div.getElementsByTagName("*");
a = div.getElementsByTagName("a")[ 0 ];
if ( !all || !a || !all.length ){
return{
}
;
}
// First batch of testsselect = document.createElement("select");
opt = select.appendChild( document.createElement("option") );
input = div.getElementsByTagName("input")[ 0 ];
a.style.cssText = "top:1px;
float:left;
opacity:.5";
support ={
// Test setAttribute on camelCase class. If it works,we need attrFixes when doing get/setAttribute (ie6/7)getSetAttribute:div.className !== "t",// IE strips leading whitespace when .innerHTML is usedleadingWhitespace:div.firstChild.nodeType === 3,// Make sure that tbody elements aren't automatically inserted// IE will insert them into empty tablestbody:!div.getElementsByTagName("tbody").length,// Make sure that link elements get serialized correctly by innerHTML// This requires a wrapper element in IEhtmlSerialize:!!div.getElementsByTagName("link").length,// Get the style information from getAttribute// (IE uses .cssText instead)style:/top/.test( a.getAttribute("style") ),// Make sure that URLs aren't manipulated// (IE normalizes it by default)hrefNormalized:a.getAttribute("href") === "/a",// Make sure that element opacity exists// (IE uses filter instead)// Use a regex to work around a WebKit issue. See #5145opacity:/^0.5/.test( a.style.opacity ),// Verify style float existence// (IE uses styleFloat instead of cssFloat)cssFloat:!!a.style.cssFloat,// Check the default checkbox/radio value ("" on WebKit;
"on" elsewhere)checkOn:!!input.value,// Make sure that a selected-by-default option has a working selected property.// (WebKit defaults to false instead of true,IE too,if it's in an optgroup)optSelected:opt.selected,// Tests for enctype support on a form (#6743)enctype:!!document.createElement("form").enctype,// Makes sure cloning an html5 element does not cause problems// Where outerHTML is undefined,this still workshtml5Clone:document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks ModeboxModel:document.compatMode === "CSS1Compat",// Will be defined laterdeleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,boxSizingReliable:true,pixelPosition:false}
;
// Make sure checked status is properly clonedinput.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;
// Support:IE<9try{
delete div.test;
}
catch( e ){
support.deleteExpando = false;
}
// Check if we can trust getAttribute("value")input = document.createElement("input");
input.setAttribute( "value","" );
support.input = input.getAttribute( "value" ) === "";
// Check if an input maintains its value after becoming a radioinput.value = "t";
input.setAttribute( "type","radio" );
support.radioValue = input.value === "t";
// #11217 - WebKit loses check when the name is after the checked attributeinput.setAttribute( "checked","t" );
input.setAttribute( "name","t" );
fragment = document.createDocumentFragment();
fragment.appendChild( input );
// Check if a disconnected checkbox will retain its checked// value of true after appended to the DOM (IE6/7)support.appendChecked = input.checked;
// WebKit doesn't clone checked state correctly in fragmentssupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
// Support:IE<9// Opera does not clone events (and typeof div.attachEvent === undefined).// IE9-10 clones events bound via attachEvent,but they don't trigger with .click()if ( div.attachEvent ){
div.attachEvent( "onclick",function(){
support.noCloneEvent = false;
}
);
div.cloneNode( true ).click();
}
// Support:IE<9 (lack submit/change bubble),Firefox 17+ (lack focusin event)// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP),test/csp.phpfor ( i in{
submit:true,change:true,focusin:true}
){
div.setAttribute( eventName = "on" + i,"t" );
support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
}
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 readyjQuery(function(){
var container,marginDiv,tds,divReset = "padding:0;
margin:0;
border:0;
display:block;
box-sizing:content-box;
-moz-box-sizing:content-box;
-webkit-box-sizing:content-box;
",body = document.getElementsByTagName("body")[0];
if ( !body ){
// Return for frameset docs that don't have a bodyreturn;
}
container = document.createElement("div");
container.style.cssText = "border:0;
width:0;
height:0;
position:absolute;
top:0;
left:-9999px;
margin-top:1px";
body.appendChild( container ).appendChild( div );
// Support:IE8// Check if table cells still have offsetWidth/Height when they are set// to display:none and there are still other visible table cells in a// table row;
if so,offsetWidth/Height are not reliable for use when// determining if an element has been hidden directly using// display:none (it is still safe to use offsets if a parent element is// hidden;
don safety goggles and see bug #4512 for more information).div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
tds = div.getElementsByTagName("td");
tds[ 0 ].style.cssText = "padding:0;
margin:0;
border:0;
display:none";
isSupported = ( tds[ 0 ].offsetHeight === 0 );
tds[ 0 ].style.display = "";
tds[ 1 ].style.display = "none";
// Support:IE8// Check if empty table cells still have offsetWidth/Heightsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
// Check box-sizing and margin behaviordiv.innerHTML = "";
div.style.cssText = "box-sizing:border-box;
-moz-box-sizing:border-box;
-webkit-box-sizing:border-box;
padding:1px;
border:1px;
display:block;
width:4px;
margin-top:1%;
position:absolute;
top:1%;
";
support.boxSizing = ( div.offsetWidth === 4 );
support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
// 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";
// Check if div with explicit width and no margin-right incorrectly// gets computed margin-right based on width of container. (#3333)// Fails in WebKit before Feb 2011 nightlies// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-rightmarginDiv = 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 );
}
if ( typeof div.style.zoom !== core_strundefined ){
// Support:IE<8// Check if natively block-level elements act like inline-block// elements when setting their display to 'inline' and giving// them layoutdiv.innerHTML = "";
div.style.cssText = divReset + "width:1px;
padding:1px;
display:inline;
zoom:1";
support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
// Support:IE6// Check if elements with layout shrink-wrap their childrendiv.style.display = "block";
div.innerHTML = "<div></div>";
div.firstChild.style.width = "5px";
support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
if ( support.inlineBlockNeedsLayout ){
// Prevent IE 6 from affecting layout for positioned elements #11048// Prevent IE from shrinking the body in IE 7 mode #12869// Support:IE<8body.style.zoom = 1;
}
}
body.removeChild( container );
// Null elements to avoid leaks in IEcontainer = div = tds = marginDiv = null;
}
);
// Null elements to avoid leaks in IEall = select = fragment = opt = a = input = null;
return support;
}
)();
var rbrace = /(?:\{
[\s\S]*\}
|\[[\s\S]*\])$/,rmultiDash = /([A-Z])/g;
function internalData( elem,name,data,pvt /* Internal Use Only */
){
if ( !jQuery.acceptData( elem ) ){
return;
}
var thisCache,ret,internalKey = jQuery.expando,getByName = typeof name === "string",// We have to handle DOM nodes and JS objects differently because IE6-7// can't GC object references properly across the DOM-JS boundaryisNode = elem.nodeType,// Only DOM nodes need the global jQuery cache;
JS object data is// attached directly to the object so GC can occur automaticallycache = isNode ? jQuery.cache:elem,// Only defining an ID for JS objects if its cache already exists allows// the code to shortcut on the same path as a DOM node with no cacheid = isNode ? elem[ internalKey ]:elem[ internalKey ] && internalKey;
// Avoid doing any more work than we need to when trying to get data on an// object that has no data at allif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ){
return;
}
if ( !id ){
// Only DOM nodes need a new unique ID for each element since their data// ends up in the global cacheif ( isNode ){
elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
}
else{
id = internalKey;
}
}
if ( !cache[ id ] ){
cache[ id ] ={
}
;
// Avoids exposing jQuery metadata on plain JS objects when the object// is serialized using JSON.stringifyif ( !isNode ){
cache[ id ].toJSON = jQuery.noop;
}
}
// An object can be passed to jQuery.data instead of a key/value pair;
this gets// shallow copied over onto the existing cacheif ( typeof name === "object" || typeof name === "function" ){
if ( pvt ){
cache[ id ] = jQuery.extend( cache[ id ],name );
}
else{
cache[ id ].data = jQuery.extend( cache[ id ].data,name );
}
}
thisCache = cache[ id ];
// jQuery data() is stored in a separate object inside the object's internal data// cache in order to avoid key collisions between internal data and user-defined// data.if ( !pvt ){
if ( !thisCache.data ){
thisCache.data ={
}
;
}
thisCache = thisCache.data;
}
if ( data !== undefined ){
thisCache[ jQuery.camelCase( name ) ] = data;
}
// Check for both converted-to-camel and non-converted data property names// If a data property was specifiedif ( getByName ){
// First Try to find as-is property dataret = thisCache[ name ];
// Test for null|undefined property dataif ( ret == null ){
// Try to find the camelCased propertyret = thisCache[ jQuery.camelCase( name ) ];
}
}
else{
ret = thisCache;
}
return ret;
}
function internalRemoveData( elem,name,pvt ){
if ( !jQuery.acceptData( elem ) ){
return;
}
var i,l,thisCache,isNode = elem.nodeType,// See jQuery.data for more informationcache = isNode ? jQuery.cache:elem,id = isNode ? elem[ jQuery.expando ]:jQuery.expando;
// If there is already no cache entry for this object,there is no// purpose in continuingif ( !cache[ id ] ){
return;
}
if ( name ){
thisCache = pvt ? cache[ id ]:cache[ id ].data;
if ( thisCache ){
// Support array or space separated string names for data keysif ( !jQuery.isArray( name ) ){
// try the string as a key before any manipulationif ( name in thisCache ){
name = [ name ];
}
else{
// split the camel cased version by spaces unless a key with the spaces existsname = jQuery.camelCase( name );
if ( name in thisCache ){
name = [ name ];
}
else{
name = name.split(" ");
}
}
}
else{
// 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 = name.concat( jQuery.map( name,jQuery.camelCase ) );
}
for ( i = 0,l = name.length;
i < l;
i++ ){
delete thisCache[ name[i] ];
}
// If there is no data left in the cache,we want to continue// and let the cache object itself get destroyedif ( !( pvt ? isEmptyDataObject:jQuery.isEmptyObject )( thisCache ) ){
return;
}
}
}
// See jQuery.data for more informationif ( !pvt ){
delete cache[ id ].data;
// Don't destroy the parent cache unless the internal data object// had been the only thing left in itif ( !isEmptyDataObject( cache[ id ] ) ){
return;
}
}
// Destroy the cacheif ( isNode ){
jQuery.cleanData( [ elem ],true );
// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)}
else if ( jQuery.support.deleteExpando || cache != cache.window ){
delete cache[ id ];
// When all else fails,null}
else{
cache[ id ] = null;
}
}
jQuery.extend({
cache:{
}
,// Unique for each copy of jQuery on the page// Non-digits removed to match rinlinejQueryexpando:"jQuery" + ( core_version + Math.random() ).replace( /\D/g,"" ),// The following elements throw uncatchable exceptions if you// attempt to add expando properties to them.noData:{
"embed":true,// Ban all objects except for Flash (which handle expandos)"object":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000","applet":true}
,hasData:function( elem ){
elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ]:elem[ jQuery.expando ];
return !!elem && !isEmptyDataObject( elem );
}
,data:function( elem,name,data ){
return internalData( elem,name,data );
}
,removeData:function( elem,name ){
return internalRemoveData( elem,name );
}
,// For internal use only._data:function( elem,name,data ){
return internalData( elem,name,data,true );
}
,_removeData:function( elem,name ){
return internalRemoveData( elem,name,true );
}
,// A method for determining if a DOM node can handle the data expandoacceptData:function( elem ){
// Do not set data on non-element because it will not be cleared (#8335).if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ){
return false;
}
var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
// nodes accept data unless otherwise specified;
rejection can be conditionalreturn !noData || noData !== true && elem.getAttribute("classid") === noData;
}
}
);
jQuery.fn.extend({
data:function( key,value ){
var attrs,name,elem = this[0],i = 0,data = null;
// Gets all valuesif ( key === undefined ){
if ( this.length ){
data = jQuery.data( elem );
if ( elem.nodeType === 1 && !jQuery._data( elem,"parsedAttrs" ) ){
attrs = elem.attributes;
for (;
i < attrs.length;
i++ ){
name = attrs[i].name;
if ( !name.indexOf( "data-" ) ){
name = jQuery.camelCase( name.slice(5) );
dataAttr( elem,name,data[ name ] );
}
}
jQuery._data( elem,"parsedAttrs",true );
}
}
return data;
}
// Sets multiple valuesif ( typeof key === "object" ){
return this.each(function(){
jQuery.data( this,key );
}
);
}
return jQuery.access( this,function( value ){
if ( value === undefined ){
// Try to fetch any internally stored data firstreturn elem ? dataAttr( elem,key,jQuery.data( elem,key ) ):null;
}
this.each(function(){
jQuery.data( this,key,value );
}
);
}
,null,value,arguments.length > 1,null,true );
}
,removeData:function( key ){
return this.each(function(){
jQuery.removeData( this,key );
}
);
}
}
);
function dataAttr( elem,key,data ){
// If nothing was found internally,try to fetch any// data from the HTML5 data-* attributeif ( data === undefined && elem.nodeType === 1 ){
var 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 ) ? jQuery.parseJSON( data ):data;
}
catch( e ){
}
// Make sure we set the data so it isn't changed laterjQuery.data( elem,key,data );
}
else{
data = undefined;
}
}
return data;
}
// checks a cache object for emptinessfunction isEmptyDataObject( obj ){
var name;
for ( name in obj ){
// if the public data object is empty,the private is still emptyif ( name === "data" && jQuery.isEmptyObject( obj[name] ) ){
continue;
}
if ( name !== "toJSON" ){
return false;
}
}
return true;
}
jQuery.extend({
queue:function( elem,type,data ){
var queue;
if ( elem ){
type = ( type || "fx" ) + "queue";
queue = jQuery._data( elem,type );
// Speed up dequeue by getting out quickly if this is just a lookupif ( data ){
if ( !queue || jQuery.isArray(data) ){
queue = jQuery._data( 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 sentinelif ( fn === "inprogress" ){
fn = queue.shift();
startLength--;
}
hooks.cur = fn;
if ( fn ){
// Add a progress sentinel to prevent the fx queue from being// automatically dequeuedif ( type === "fx" ){
queue.unshift( "inprogress" );
}
// clear up the last queue stop functiondelete 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 jQuery._data( elem,key ) || jQuery._data( elem,key,{
empty:jQuery.Callbacks("once memory").add(function(){
jQuery._removeData( elem,type + "queue" );
jQuery._removeData( elem,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 queuejQuery._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 = jQuery._data( 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]/g,rreturn = /\r/g,rfocusable = /^(?:input|select|textarea|button|object)$/i,rclickable = /^(?:a|area)$/i,rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,ruseDefault = /^(?:checked|selected)$/i,getSetAttribute = jQuery.support.getSetAttribute,getSetInput = jQuery.support.input;
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 ){
name = jQuery.propFix[ name ] || name;
return this.each(function(){
// try/catch handles cases where IE balks (such as removing a property on window)try{
this[ name ] = undefined;
delete this[ name ];
}
catch( e ){
}
}
);
}
,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* instanceswhile ( cur.indexOf( " " + clazz + " " ) >= 0 ){
cur = cur.replace( " " + clazz + " "," " );
}
}
elem.className = value ? jQuery.trim( cur ):"";
}
}
}
return this;
}
,toggleClass:function( value,stateVal ){
var type = typeof value,isBool = typeof stateVal === "boolean";
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 namesvar className,i = 0,self = jQuery( this ),state = stateVal,classNames = value.match( core_rnotwhite ) || [];
while ( (className = classNames[ i++ ]) ){
// check each className given,space separated liststate = isBool ? state:!self.hasClass( className );
self[ state ? "addClass":"removeClass" ]( className );
}
// Toggle whole class name}
else if ( type === core_strundefined || type === "boolean" ){
if ( this.className ){
// store className if setjQuery._data( 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 ? "":jQuery._data( 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 ret,hooks,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 casesret.replace(rreturn,""):// handle cases where value is null/undef or numberret == null ? "":ret;
}
return;
}
isFunction = jQuery.isFunction( value );
return this.each(function( i ){
var val,self = jQuery(this);
if ( this.nodeType !== 1 ){
return;
}
if ( isFunction ){
val = value.call( this,i,self.val() );
}
else{
val = value;
}
// Treat null/undefined as "";
convert numbers to stringif ( 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 settingif ( !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 #6932var 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 optionsfor (;
i < max;
i++ ){
option = options[ i ];
// oldIE 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 optionvalue = jQuery( option ).val();
// We don't need an array for one selectsif ( one ){
return value;
}
// Multi-Selects return an arrayvalues.push( value );
}
}
return values;
}
,set:function( elem,value ){
var values = jQuery.makeArray( value );
jQuery(elem).find("option").each(function(){
this.selected = jQuery.inArray( jQuery(this).val(),values ) >= 0;
}
);
if ( !values.length ){
elem.selectedIndex = -1;
}
return values;
}
}
}
,attr:function( elem,name,value ){
var hooks,notxml,ret,nType = elem.nodeType;
// don't get/set attributes on text,comment and attribute nodesif ( !elem || nType === 3 || nType === 8 || nType === 2 ){
return;
}
// Fallback to prop when attributes are not supportedif ( typeof elem.getAttribute === core_strundefined ){
return jQuery.prop( elem,name,value );
}
notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
// All attributes are lowercase// Grab necessary hook if one is definedif ( notxml ){
name = name.toLowerCase();
hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook:nodeHook );
}
if ( value !== undefined ){
if ( value === null ){
jQuery.removeAttr( elem,name );
}
else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem,value,name )) !== undefined ){
return ret;
}
else{
elem.setAttribute( name,value + "" );
return value;
}
}
else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem,name )) !== null ){
return ret;
}
else{
// In IE9+,Flash objects don't have .getAttribute (#12945)// Support:IE9+if ( typeof elem.getAttribute !== core_strundefined ){
ret = elem.getAttribute( name );
}
// Non-existent attributes return null,we normalize to undefinedreturn 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 ( rboolean.test( name ) ){
// Set corresponding property to false for boolean attributes// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8if ( !getSetAttribute && ruseDefault.test( name ) ){
elem[ jQuery.camelCase( "default-" + name ) ] =elem[ propName ] = false;
}
else{
elem[ propName ] = false;
}
// See #9699 for explanation of this approach (setting first,then removal)}
else{
jQuery.attr( elem,name,"" );
}
elem.removeAttribute( getSetAttribute ? name:propName );
}
}
}
,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 creationvar val = elem.value;
elem.setAttribute( "type",value );
if ( val ){
elem.value = val;
}
return value;
}
}
}
}
,propFix:{
tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"}
,prop:function( elem,name,value ){
var ret,hooks,notxml,nType = elem.nodeType;
// don't get/set properties on text,comment and attribute nodesif ( !elem || nType === 3 || nType === 8 || nType === 2 ){
return;
}
notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
if ( notxml ){
// Fix name and attach hooksname = jQuery.propFix[ name ] || name;
hooks = jQuery.propHooks[ name ];
}
if ( value !== undefined ){
if ( hooks && "set" in hooks && (ret = hooks.set( elem,value,name )) !== undefined ){
return ret;
}
else{
return ( elem[ name ] = value );
}
}
else{
if ( hooks && "get" in hooks && (ret = hooks.get( elem,name )) !== null ){
return ret;
}
else{
return elem[ name ];
}
}
}
,propHooks:{
tabIndex:{
get:function( elem ){
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/var attributeNode = elem.getAttributeNode("tabindex");
return attributeNode && attributeNode.specified ?parseInt( attributeNode.value,10 ):rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?0:undefined;
}
}
}
}
);
// Hook for boolean attributesboolHook ={
get:function( elem,name ){
var// Use .prop to determine if this attribute is understood as booleanprop = jQuery.prop( elem,name ),// Fetch it accordinglyattr = typeof prop === "boolean" && elem.getAttribute( name ),detail = typeof prop === "boolean" ?getSetInput && getSetAttribute ?attr != null:// oldIE fabricates an empty string for missing boolean attributes// and conflates checked/selected into attropertiesruseDefault.test( name ) ?elem[ jQuery.camelCase( "default-" + name ) ]:!!attr:// fetch an attribute node for properties not recognized as booleanelem.getAttributeNode( name );
return detail && detail.value !== false ?name.toLowerCase():undefined;
}
,set:function( elem,value,name ){
if ( value === false ){
// Remove boolean attributes when set to falsejQuery.removeAttr( elem,name );
}
else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ){
// IE<8 needs the *property* nameelem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name,name );
// Use defaultChecked and defaultSelected for oldIE}
else{
elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
}
return name;
}
}
;
// fix oldIE value attropertyif ( !getSetInput || !getSetAttribute ){
jQuery.attrHooks.value ={
get:function( elem,name ){
var ret = elem.getAttributeNode( name );
return jQuery.nodeName( elem,"input" ) ?// Ignore the value *property* by using defaultValueelem.defaultValue:ret && ret.specified ? ret.value:undefined;
}
,set:function( elem,value,name ){
if ( jQuery.nodeName( elem,"input" ) ){
// Does not return so that setAttribute is also usedelem.defaultValue = value;
}
else{
// Use nodeHook if defined (#1954);
otherwise setAttribute is finereturn nodeHook && nodeHook.set( elem,value,name );
}
}
}
;
}
// IE6/7 do not support getting/setting some attributes with get/setAttributeif ( !getSetAttribute ){
// Use this for any attribute in IE6/7// This fixes almost every IE6/7 issuenodeHook = jQuery.valHooks.button ={
get:function( elem,name ){
var ret = elem.getAttributeNode( name );
return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "":ret.specified ) ?ret.value:undefined;
}
,set:function( elem,value,name ){
// Set the existing or create a new attribute nodevar ret = elem.getAttributeNode( name );
if ( !ret ){
elem.setAttributeNode((ret = elem.ownerDocument.createAttribute( name )));
}
ret.value = value += "";
// Break association with cloned elements by also using setAttribute (#9646)return name === "value" || value === elem.getAttribute( name ) ?value:undefined;
}
}
;
// Set contenteditable to false on removals(#10429)// Setting to empty string throws an error as an invalid valuejQuery.attrHooks.contenteditable ={
get:nodeHook.get,set:function( elem,value,name ){
nodeHook.set( elem,value === "" ? false:value,name );
}
}
;
// Set width and height to auto instead of 0 on empty string( Bug #8150 )// This is for removalsjQuery.each([ "width","height" ],function( i,name ){
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ],{
set:function( elem,value ){
if ( value === "" ){
elem.setAttribute( name,"auto" );
return value;
}
}
}
);
}
);
}
// Some attributes require a special call on IE// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspxif ( !jQuery.support.hrefNormalized ){
jQuery.each([ "href","src","width","height" ],function( i,name ){
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ],{
get:function( elem ){
var ret = elem.getAttribute( name,2 );
return ret == null ? undefined:ret;
}
}
);
}
);
// href/src property should get the full normalized URL (#10299/#12915)jQuery.each([ "href","src" ],function( i,name ){
jQuery.propHooks[ name ] ={
get:function( elem ){
return elem.getAttribute( name,4 );
}
}
;
}
);
}
if ( !jQuery.support.style ){
jQuery.attrHooks.style ={
get:function( elem ){
// Return undefined in the case of empty string// Note:IE uppercases css property names,but if we were to .toLowerCase()// .cssText,that would destroy case senstitivity in URL's,like in "background"return elem.style.cssText || undefined;
}
,set:function( elem,value ){
return ( elem.style.cssText = value + "" );
}
}
;
}
// Safari mis-reports the default selected property of an option// Accessing the parent's selectedIndex property fixes itif ( !jQuery.support.optSelected ){
jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected,{
get:function( elem ){
var parent = elem.parentNode;
if ( parent ){
parent.selectedIndex;
// Make sure that it also works with optgroups,see #5701if ( parent.parentNode ){
parent.parentNode.selectedIndex;
}
}
return null;
}
}
);
}
// IE6/7 call enctype encodingif ( !jQuery.support.enctype ){
jQuery.propFix.enctype = "encoding";
}
// Radios and checkboxes getter/setterif ( !jQuery.support.checkOn ){
jQuery.each([ "radio","checkbox" ],function(){
jQuery.valHooks[ this ] ={
get:function( elem ){
// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specifiedreturn elem.getAttribute("value") === null ? "on":elem.value;
}
}
;
}
);
}
jQuery.each([ "radio","checkbox" ],function(){
jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ],{
set:function( elem,value ){
if ( jQuery.isArray( value ) ){
return ( elem.checked = jQuery.inArray( jQuery(elem).val(),value ) >= 0 );
}
}
}
);
}
);
var rformElems = /^(?:input|select|textarea)$/i,rkeyEvent = /^key/,rmouseEvent = /^(?:mouse|contextmenu)|click/,rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
function returnTrue(){
return true;
}
function returnFalse(){
return false;
}
/* * 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 tmp,events,t,handleObjIn,special,eventHandle,handleObj,handlers,type,namespaces,origType,elemData = jQuery._data( 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 handlerif ( handler.handler ){
handleObjIn = handler;
handler = handleObjIn.handler;
selector = handleObjIn.selector;
}
// Make sure that the handler has a unique ID,used to find/remove it laterif ( !handler.guid ){
handler.guid = jQuery.guid++;
}
// Init the element's event structure and main handler,if this is the firstif ( !(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 unloadedreturn 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 eventseventHandle.elem = elem;
}
// Handle multiple events separated by a space// jQuery(...).bind("mouseover mouseout",fn);
types = ( types || "" ).match( core_rnotwhite ) || [""];
t = types.length;
while ( t-- ){
tmp = rtypenamespace.exec( types[t] ) || [];
type = origType = tmp[1];
namespaces = ( tmp[2] || "" ).split( "." ).sort();
// If event changes its type,use the special event handlers for the changed typespecial = jQuery.event.special[ type ] ||{
}
;
// If selector defined,determine special event api type,otherwise given typetype = ( selector ? special.delegateType:special.bindType ) || type;
// Update special based on newly reset typespecial = jQuery.event.special[ type ] ||{
}
;
// handleObj is passed to all event handlershandleObj = 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 firstif ( !(handlers = events[ type ]) ){
handlers = events[ type ] = [];
handlers.delegateCount = 0;
// Only use addEventListener/attachEvent if the special events handler returns falseif ( !special.setup || special.setup.call( elem,data,namespaces,eventHandle ) === false ){
// Bind the global event handler to the elementif ( elem.addEventListener ){
elem.addEventListener( type,eventHandle,false );
}
else if ( elem.attachEvent ){
elem.attachEvent( "on" + type,eventHandle );
}
}
}
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 frontif ( selector ){
handlers.splice( handlers.delegateCount++,0,handleObj );
}
else{
handlers.push( handleObj );
}
// Keep track of which events have ever been used,for event optimizationjQuery.event.global[ type ] = true;
}
// Nullify elem to prevent memory leaks in IEelem = null;
}
,// Detach an event or set of events from an elementremove:function( elem,types,handler,selector,mappedTypes ){
var j,handleObj,tmp,origCount,t,events,special,handlers,type,namespaces,origType,elemData = jQuery.hasData( elem ) && jQuery._data( elem );
if ( !elemData || !(events = elemData.events) ){
return;
}
// Once for each type.namespace in types;
type may be omittedtypes = ( 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 elementif ( !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 eventsorigCount = 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 usedif ( jQuery.isEmptyObject( events ) ){
delete elemData.handle;
// removeData also checks for emptiness and clears the expando if empty// so use it instead of deletejQuery._removeData( elem,"events" );
}
}
,trigger:function( event,data,elem,onlyHandlers ){
var handle,ontype,cur,bubbleType,special,tmp,i,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 nodesif ( elem.nodeType === 3 || elem.nodeType === 8 ){
return;
}
// focus/blur morphs to focusin/out;
ensure we're not firing them right nowif ( 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 stringevent = event[ jQuery.expando ] ?event:new jQuery.Event( type,typeof event === "object" && event );
event.isTrigger = true;
event.namespace = namespaces.join(".");
event.namespace_re = event.namespace ?new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ):null;
// Clean up the event in case it is being reusedevent.result = undefined;
if ( !event.target ){
event.target = elem;
}
// Clone any incoming data and prepend the event,creating the handler arg listdata = data == null ?[ event ]:jQuery.makeArray( data,[ event ] );
// Allow special events to draw outside the linesspecial = 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 pathi = 0;
while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ){
event.type = i > 1 ?bubbleType:special.bindType || type;
// jQuery handlerhandle = ( jQuery._data( cur,"events" ) ||{
}
)[ event.type ] && jQuery._data( cur,"handle" );
if ( handle ){
handle.apply( cur,data );
}
// Native handlerhandle = 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 nowif ( !onlyHandlers && !event.isDefaultPrevented() ){
if ( (!special._default || special._default.apply( elem.ownerDocument,data ) === false) &&!(type === "click" && jQuery.nodeName( elem,"a" )) && jQuery.acceptData( elem ) ){
// Call a native DOM method on the target with the same name name as the event.// Can't use an .isFunction() check here because IE6/7 fails that test.// Don't do default actions on window,that's where global variables be (#6170)if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ){
// Don't re-trigger an onFOO event when we call its FOO() methodtmp = elem[ ontype ];
if ( tmp ){
elem[ ontype ] = null;
}
// Prevent re-triggering of the same event,since we already bubbled it abovejQuery.event.triggered = type;
try{
elem[ type ]();
}
catch ( e ){
// IE<9 dies on focus/blur to hidden element (#1486,#12518)// only reproducible on winXP IE8 native,not IE9 in IE8 mode}
jQuery.event.triggered = undefined;
if ( tmp ){
elem[ ontype ] = tmp;
}
}
}
}
return event.result;
}
,dispatch:function( event ){
// Make a writable jQuery.Event from the native event objectevent = jQuery.event.fix( event );
var i,ret,handleObj,matched,j,handlerQueue = [],args = core_slice.call( arguments ),handlers = ( jQuery._data( this,"events" ) ||{
}
)[ event.type ] || [],special = jQuery.event.special[ event.type ] ||{
}
;
// Use the fix-ed jQuery.Event rather than the (read-only) native eventargs[0] = event;
event.delegateTarget = this;
// Call the preDispatch hook for the mapped type,and let it bail if desiredif ( special.preDispatch && special.preDispatch.call( this,event ) === false ){
return;
}
// Determine handlershandlerQueue = jQuery.event.handlers.call( this,event,handlers );
// Run delegates first;
they may want to stop propagation beneath usi = 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 typeif ( special.postDispatch ){
special.postDispatch.call( this,event );
}
return event.result;
}
,handlers:function( event,handlers ){
var sel,handleObj,matches,i,handlerQueue = [],delegateCount = handlers.delegateCount,cur = event.target;
// Find delegate handlers// Black-hole SVG <use> 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 check non-elements (#13208)// Don't process clicks on disabled elements (#6911,#8165,#11382,#11764)if ( cur.nodeType === 1 && (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) handlersif ( delegateCount < handlers.length ){
handlerQueue.push({
elem:this,handlers:handlers.slice( delegateCount )}
);
}
return handlerQueue;
}
,fix:function( event ){
if ( event[ jQuery.expando ] ){
return event;
}
// Create a writable copy of the event object and normalize some propertiesvar 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:IE<9// Fix target property (#1925)if ( !event.target ){
event.target = originalEvent.srcElement || document;
}
// Support:Chrome 23+,Safari?// Target should not be a text node (#504,#13143)if ( event.target.nodeType === 3 ){
event.target = event.target.parentNode;
}
// Support:IE<9// For mouse/key events,metaKey==false if it's undefined (#3368,#11328)event.metaKey = !!event.metaKey;
return fixHook.filter ? fixHook.filter( event,originalEvent ):event;
}
,// Includes some event props shared by KeyEvent and MouseEventprops:"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 eventsif ( event.which == null ){
event.which = original.charCode != null ? original.charCode:original.keyCode;
}
return event;
}
}
,mouseHooks:{
props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function( event,original ){
var body,eventDoc,doc,button = original.button,fromElement = original.fromElement;
// Calculate pageX/Y if missing and clientX/Y availableif ( 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 relatedTarget,if necessaryif ( !event.relatedTarget && fromElement ){
event.relatedTarget = fromElement === event.target ? original.toElement:fromElement;
}
// Add which for click:1 === left;
2 === middle;
3 === right// Note:button is not normalized,so don't use itif ( !event.which && button !== undefined ){
event.which = ( button & 1 ? 1:( button & 2 ? 3:( button & 4 ? 2:0 ) ) );
}
return event;
}
}
,special:{
load:{
// Prevent triggered image.load events from bubbling to window.loadnoBubble:true}
,click:{
// For checkbox,fire native event so checked state will be righttrigger:function(){
if ( jQuery.nodeName( this,"input" ) && this.type === "checkbox" && this.click ){
this.click();
return false;
}
}
}
,focus:{
// Fire native event if possible so blur/focus sequence is correcttrigger:function(){
if ( this !== document.activeElement && this.focus ){
try{
this.focus();
return false;
}
catch ( e ){
// Support:IE<9// If we error on focus to hidden element (#1486,#12518),// let .trigger() run the handlers}
}
}
,delegateType:"focusin"}
,blur:{
trigger:function(){
if ( this === document.activeElement && this.blur ){
this.blur();
return false;
}
}
,delegateType:"focusout"}
,beforeunload:{
postDispatch:function( event ){
// Even when returnValue equals to undefined Firefox will still show alertif ( 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 = document.removeEventListener ?function( elem,type,handle ){
if ( elem.removeEventListener ){
elem.removeEventListener( type,handle,false );
}
}
:function( elem,type,handle ){
var name = "on" + type;
if ( elem.detachEvent ){
// #8545,#7054,preventing memory leaks for custom events in IE6-8// detachEvent needed property on element,by name of that event,to properly expose it to GCif ( typeof elem[ name ] === core_strundefined ){
elem[ name ] = null;
}
elem.detachEvent( name,handle );
}
}
;
jQuery.Event = function( src,props ){
// Allow instantiation without the 'new' keywordif ( !(this instanceof jQuery.Event) ){
return new jQuery.Event( src,props );
}
// Event objectif ( 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.returnValue === false ||src.getPreventDefault && src.getPreventDefault() ) ? returnTrue:returnFalse;
// Event type}
else{
this.type = src;
}
// Put explicitly provided properties onto the event objectif ( props ){
jQuery.extend( this,props );
}
// Create a timestamp if incoming event doesn't have onethis.timeStamp = src && src.timeStamp || jQuery.now();
// Mark it as fixedthis[ 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.htmljQuery.Event.prototype ={
isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse,preventDefault:function(){
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue;
if ( !e ){
return;
}
// If preventDefault exists,run it on the original eventif ( e.preventDefault ){
e.preventDefault();
// Support:IE// Otherwise set the returnValue property of the original event to false}
else{
e.returnValue = false;
}
}
,stopPropagation:function(){
var e = this.originalEvent;
this.isPropagationStopped = returnTrue;
if ( !e ){
return;
}
// If stopPropagation exists,run it on the original eventif ( e.stopPropagation ){
e.stopPropagation();
}
// Support:IE// Set the cancelBubble property of the original event to truee.cancelBubble = true;
}
,stopImmediatePropagation:function(){
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
}
}
;
// Create mouseenter/leave events using mouseover/out and event-time checksjQuery.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 windowif ( !related || (related !== target && !jQuery.contains( target,related )) ){
event.type = handleObj.origType;
ret = handleObj.handler.apply( this,arguments );
event.type = fix;
}
return ret;
}
}
;
}
);
// IE submit delegationif ( !jQuery.support.submitBubbles ){
jQuery.event.special.submit ={
setup:function(){
// Only need this for delegated form submit eventsif ( jQuery.nodeName( this,"form" ) ){
return false;
}
// Lazy-add a submit handler when a descendant form may potentially be submittedjQuery.event.add( this,"click._submit keypress._submit",function( e ){
// Node name check avoids a VML-related crash in IE (#9807)var elem = e.target,form = jQuery.nodeName( elem,"input" ) || jQuery.nodeName( elem,"button" ) ? elem.form:undefined;
if ( form && !jQuery._data( form,"submitBubbles" ) ){
jQuery.event.add( form,"submit._submit",function( event ){
event._submit_bubble = true;
}
);
jQuery._data( form,"submitBubbles",true );
}
}
);
// return undefined since we don't need an event listener}
,postDispatch:function( event ){
// If form was submitted by the user,bubble the event up the treeif ( event._submit_bubble ){
delete event._submit_bubble;
if ( this.parentNode && !event.isTrigger ){
jQuery.event.simulate( "submit",this.parentNode,event,true );
}
}
}
,teardown:function(){
// Only need this for delegated form submit eventsif ( jQuery.nodeName( this,"form" ) ){
return false;
}
// Remove delegated handlers;
cleanData eventually reaps submit handlers attached abovejQuery.event.remove( this,"._submit" );
}
}
;
}
// IE change delegation and checkbox/radio fixif ( !jQuery.support.changeBubbles ){
jQuery.event.special.change ={
setup:function(){
if ( rformElems.test( this.nodeName ) ){
// IE doesn't fire change on a check/radio until blur;
trigger it on click// after a propertychange. Eat the blur-change in special.change.handle.// This still fires onchange a second time for check/radio after blur.if ( this.type === "checkbox" || this.type === "radio" ){
jQuery.event.add( this,"propertychange._change",function( event ){
if ( event.originalEvent.propertyName === "checked" ){
this._just_changed = true;
}
}
);
jQuery.event.add( this,"click._change",function( event ){
if ( this._just_changed && !event.isTrigger ){
this._just_changed = false;
}
// Allow triggered,simulated change events (#11500)jQuery.event.simulate( "change",this,event,true );
}
);
}
return false;
}
// Delegated event;
lazy-add a change handler on descendant inputsjQuery.event.add( this,"beforeactivate._change",function( e ){
var elem = e.target;
if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem,"changeBubbles" ) ){
jQuery.event.add( elem,"change._change",function( event ){
if ( this.parentNode && !event.isSimulated && !event.isTrigger ){
jQuery.event.simulate( "change",this.parentNode,event,true );
}
}
);
jQuery._data( elem,"changeBubbles",true );
}
}
);
}
,handle:function( event ){
var elem = event.target;
// Swallow native change events from checkbox/radio,we already triggered them aboveif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ){
return event.handleObj.handler.apply( this,arguments );
}
}
,teardown:function(){
jQuery.event.remove( this,"._change" );
return !rformElems.test( this.nodeName );
}
}
;
}
// Create "bubbling" focus and blur eventsif ( !jQuery.support.focusinBubbles ){
jQuery.each({
focus:"focusin",blur:"focusout"}
,function( orig,fix ){
// Attach a single capturing handler while someone wants focusin/focusoutvar 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 type,origFn;
// Types can be a map of types/handlersif ( 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 infojQuery().off( event );
return origFn.apply( this,arguments );
}
;
// Use same guid so caller can remove using origFnfn.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.EventhandleObj = 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 );
}
);
}
,bind:function( types,data,fn ){
return this.on( types,null,data,fn );
}
,unbind:function( types,fn ){
return this.off( types,null,fn );
}
,delegate:function( selector,types,data,fn ){
return this.on( types,selector,data,fn );
}
,undelegate:function( selector,types,fn ){
// ( namespace ) or ( selector,types [,fn] )return arguments.length === 1 ? this.off( selector,"**" ):this.off( types,selector || "**",fn );
}
,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 );
}
}
}
);
/*! * Sizzle CSS Selector Engine * Copyright 2012 jQuery Foundation and other contributors * Released under the MIT license * http://sizzlejs.com/ */
(function( window,undefined ){
var i,cachedruns,Expr,getText,isXML,compile,hasDuplicate,outermostContext,// Local document varssetDocument,document,docElem,documentIsXML,rbuggyQSA,rbuggyMatches,matches,contains,sortOrder,// Instance-specific dataexpando = "sizzle" + -(new Date()),preferredDoc = window.document,support ={
}
,dirruns = 0,done = 0,classCache = createCache(),tokenCache = createCache(),compilerCache = createCache(),// General-purpose constantsstrundefined = typeof undefined,MAX_NEGATIVE = 1 << 31,// Array methodsarr = [],pop = arr.pop,push = arr.push,slice = arr.slice,// Use a stripped-down indexOf if we can't use a native oneindexOf = arr.indexOf || function( elem ){
var i = 0,len = this.length;
for (;
i < len;
i++ ){
if ( this[i] === elem ){
return i;
}
}
return -1;
}
,// Regular expressions// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespacewhitespace = "[\\x20\\t\\r\\n\\f]",// http://www.w3.org/TR/css3-syntax/#characterscharacterEncoding = "(?:\\\\.|[\\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-identifieridentifier = characterEncoding.replace( "w","w#" ),// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectorsoperators = "([*^$|!~]?=)",attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +"*(?:" + operators + 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 preFilterpseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3,8 ) + ")*)|.*)\\)|)",// Leading and non-escaped trailing whitespace,capturing some non-whitespace characters preceding the latterrtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$","g" ),rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),rpseudo = new RegExp( pseudos ),ridentifier = new RegExp( "^" + identifier + "$" ),matchExpr ={
"ID":new RegExp( "^#(" + characterEncoding + ")" ),"CLASS":new RegExp( "^\\.(" + characterEncoding + ")" ),"NAME":new RegExp( "^\\[name=['\"]?(" + 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" ),// 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" )}
,rsibling = /[\x20\t\r\n\f]*[+~]/,rnative = /^[^{
]+\{
\s*\[native code/,// Easily-parseable/retrievable ID or TAG or CLASS selectorsrquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rinputs = /^(?:input|select|textarea|button)$/i,rheader = /^h\d$/i,rescape = /'|\\/g,rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-charactersrunescape = /\\([\da-fA-F]{
1,6}
[\x20\t\r\n\f]?|.)/g,funescape = function( _,escaped ){
var high = "0x" + escaped - 0x10000;
// NaN means non-codepointreturn high !== high ?escaped:// BMP codepointhigh < 0 ?String.fromCharCode( high + 0x10000 ):// Supplemental Plane codepoint (surrogate pair)String.fromCharCode( high >> 10 | 0xD800,high & 0x3FF | 0xDC00 );
}
;
// Use a stripped-down slice if we can't use a native onetry{
slice.call( preferredDoc.documentElement.childNodes,0 )[0].nodeType;
}
catch ( e ){
slice = function( i ){
var elem,results = [];
while ( (elem = this[i++]) ){
results.push( elem );
}
return results;
}
;
}
/** * For feature detection * @param{
Function}
fn The function to test for native support */
function isNative( fn ){
return rnative.test( fn + "" );
}
/** * 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 cache,keys = [];
return (cache = function( 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 entriesdelete cache[ keys.shift() ];
}
return (cache[ key ] = value);
}
);
}
/** * 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{
// release memory in IEdiv = null;
}
}
function Sizzle( selector,context,results,seed ){
var match,elem,m,nodeType,// QSA varsi,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 ( !documentIsXML && !seed ){
// Shortcutsif ( (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 #6963if ( elem && elem.parentNode ){
// Handle the case where IE,Opera,and Webkit return items// by name instead of IDif ( elem.id === m ){
results.push( elem );
return results;
}
}
else{
return results;
}
}
else{
// Context is not a documentif ( 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,slice.call(context.getElementsByTagName( selector ),0) );
return results;
// Speed-up:Sizzle(".CLASS")}
else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ){
push.apply( results,slice.call(context.getElementsByClassName( m ),0) );
return results;
}
}
// QSA pathif ( support.qsa && !rbuggyQSA.test(selector) ){
old = true;
nid = 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 elementsif ( 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,slice.call( newContext.querySelectorAll(newSelector),0 ) );
return results;
}
catch(qsaError){
}
finally{
if ( !old ){
context.removeAttribute("id");
}
}
}
}
}
// All othersreturn select( selector.replace( rtrim,"$1" ),context,results,seed );
}
/** * 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;
}
;
/** * 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;
// If no document and documentElement is available,returnif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ){
return document;
}
// Set our documentdocument = doc;
docElem = doc.documentElement;
// Support testsdocumentIsXML = isXML( doc );
// Check if getElementsByTagName("*") returns only elementssupport.tagNameNoComments = assert(function( div ){
div.appendChild( doc.createComment("") );
return !div.getElementsByTagName("*").length;
}
);
// Check if attributes should be retrieved by attribute nodessupport.attributes = assert(function( div ){
div.innerHTML = "<select></select>";
var type = typeof div.lastChild.getAttribute("multiple");
// IE8 returns a string for some attributes even when not presentreturn type !== "boolean" && type !== "string";
}
);
// Check if getElementsByClassName can be trustedsupport.getByClassName = assert(function( div ){
// Opera can't find a second classname (in 9.6)div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ){
return false;
}
// Safari 3.2 caches class attributes and doesn't catch changesdiv.lastChild.className = "e";
return div.getElementsByClassName("e").length === 2;
}
);
// Check if getElementById returns elements by name// Check if getElementsByName privileges form controls or returns elements by IDsupport.getByName = assert(function( div ){
// Inject contentdiv.id = expando + 0;
div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
docElem.insertBefore( div,docElem.firstChild );
// Testvar pass = doc.getElementsByName &&// buggy browsers will return fewer than the correct 2doc.getElementsByName( expando ).length === 2 +// buggy browsers will return more than the correct 0doc.getElementsByName( expando + 0 ).length;
support.getIdNotName = !doc.getElementById( expando );
// CleanupdocElem.removeChild( div );
return pass;
}
);
// IE6/7 return modified attributesExpr.attrHandle = assert(function( div ){
div.innerHTML = "<a href='#'></a>";
return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&div.firstChild.getAttribute("href") === "#";
}
) ?{
}
:{
"href":function( elem ){
return elem.getAttribute( "href",2 );
}
,"type":function( elem ){
return elem.getAttribute("type");
}
}
;
// ID find and filterif ( support.getIdNotName ){
Expr.find["ID"] = function( id,context ){
if ( typeof context.getElementById !== strundefined && !documentIsXML ){
var m = context.getElementById( id );
// Check parentNode to catch when Blackberry 4.6 returns// nodes that are no longer in the document #6963return m && m.parentNode ? [m]:[];
}
}
;
Expr.filter["ID"] = function( id ){
var attrId = id.replace( runescape,funescape );
return function( elem ){
return elem.getAttribute("id") === attrId;
}
;
}
;
}
else{
Expr.find["ID"] = function( id,context ){
if ( typeof context.getElementById !== strundefined && !documentIsXML ){
var m = context.getElementById( id );
return m ?m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?[m]:undefined:[];
}
}
;
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;
}
;
}
;
}
// TagExpr.find["TAG"] = support.tagNameNoComments ?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 commentsif ( tag === "*" ){
while ( (elem = results[i++]) ){
if ( elem.nodeType === 1 ){
tmp.push( elem );
}
}
return tmp;
}
return results;
}
;
// NameExpr.find["NAME"] = support.getByName && function( tag,context ){
if ( typeof context.getElementsByName !== strundefined ){
return context.getElementsByName( name );
}
}
;
// ClassExpr.find["CLASS"] = support.getByClassName && function( className,context ){
if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ){
return context.getElementsByClassName( className );
}
}
;
// QSA and matchesSelector support// matchesSelector(:active) reports false when true (IE9/Opera 11.5)rbuggyMatches = [];
// qSa(:focus) reports false when true (Chrome 21),// no need to also add to buggyMatches since matches checks buggyQSA// A support test would require too much code (would include document ready)rbuggyQSA = [ ":focus" ];
if ( (support.qsa = isNative(doc.querySelectorAll)) ){
// Build QSA regex// Regex strategy adopted from Diego Periniassert(function( div ){
// Select is set to empty string on purpose// This is to test IE's treatment of not explictly// setting a boolean content attribute,// since its presence should be enough// http://bugs.jquery.com/ticket/12359div.innerHTML = "<select><option selected=''></option></select>";
// IE8 - Some boolean attributes are not treated correctlyif ( !div.querySelectorAll("[selected]").length ){
rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
}
// 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 testsif ( !div.querySelectorAll(":checked").length ){
rbuggyQSA.push(":checked");
}
}
);
assert(function( div ){
// Opera 10-12/IE8 - ^= $= *= and empty values// Should not select anythingdiv.innerHTML = "<input type='hidden' i=''/>";
if ( div.querySelectorAll("[i^='']").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 testsif ( !div.querySelectorAll(":enabled").length ){
rbuggyQSA.push( ":enabled",":disabled" );
}
// Opera 10-11 does not throw on post-comma invalid pseudosdiv.querySelectorAll("*,:x");
rbuggyQSA.push(",.*:");
}
);
}
if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||docElem.mozMatchesSelector ||docElem.webkitMatchesSelector ||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 insteadmatches.call( div,"[s!='']:x" );
rbuggyMatches.push( "!=",pseudos );
}
);
}
rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
// Element contains another// Purposefully does not implement inclusive descendent// As in,an element does not contain itselfcontains = isNative(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;
}
;
// Document order sortingsortOrder = docElem.compareDocumentPosition ?function( a,b ){
var compare;
if ( a === b ){
hasDuplicate = true;
return 0;
}
if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ){
if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ){
if ( a === doc || contains( preferredDoc,a ) ){
return -1;
}
if ( b === doc || contains( preferredDoc,b ) ){
return 1;
}
return 0;
}
return compare & 4 ? -1:1;
}
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 identicalif ( 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: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 comparisoncur = a;
while ( (cur = cur.parentNode) ){
ap.unshift( cur );
}
cur = b;
while ( (cur = cur.parentNode) ){
bp.unshift( cur );
}
// Walk down the tree looking for a discrepancywhile ( ap[i] === bp[i] ){
i++;
}
return i ?// Do a sibling check if the nodes have a common ancestorsiblingCheck( ap[i],bp[i] ):// Otherwise nodes in our document sort firstap[i] === preferredDoc ? -1:bp[i] === preferredDoc ? 1:0;
}
;
// Always assume the presence of duplicates if sort doesn't// pass them to our comparison function (as in Google Chrome).hasDuplicate = false;
[0,0].sort( sortOrder );
support.detectDuplicates = hasDuplicate;
return document;
}
;
Sizzle.matches = function( expr,elements ){
return Sizzle( expr,null,null,elements );
}
;
Sizzle.matchesSelector = function( elem,expr ){
// Set document vars if neededif ( ( elem.ownerDocument || elem ) !== document ){
setDocument( elem );
}
// Make sure that attribute selectors are quotedexpr = expr.replace( rattributeQuotes,"='$1']" );
// rbuggyQSA always contains:focus,so no need for an existence checkif ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ){
try{
var ret = matches.call( elem,expr );
// IE 9's matchesSelector returns false on disconnected nodesif ( ret || support.disconnectedMatch ||// As well,disconnected nodes are said to be in a document// fragment in IE 9elem.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 neededif ( ( context.ownerDocument || context ) !== document ){
setDocument( context );
}
return contains( context,elem );
}
;
Sizzle.attr = function( elem,name ){
var val;
// Set document vars if neededif ( ( elem.ownerDocument || elem ) !== document ){
setDocument( elem );
}
if ( !documentIsXML ){
name = name.toLowerCase();
}
if ( (val = Expr.attrHandle[ name ]) ){
return val( elem );
}
if ( documentIsXML || support.attributes ){
return elem.getAttribute( name );
}
return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?name:val && val.specified ? val.value:null;
}
;
Sizzle.error = function( msg ){
throw new Error( "Syntax error,unrecognized expression:" + msg );
}
;
// Document sorting and removing duplicatesSizzle.uniqueSort = function( results ){
var elem,duplicates = [],i = 1,j = 0;
// Unless we *know* we can detect duplicates,assume their presencehasDuplicate = !support.detectDuplicates;
results.sort( sortOrder );
if ( hasDuplicate ){
for (;
(elem = results[i]);
i++ ){
if ( elem === results[ i - 1 ] ){
j = duplicates.push( i );
}
}
while ( j-- ){
results.splice( duplicates[ j ],1 );
}
}
return results;
}
;
function siblingCheck( a,b ){
var cur = b && a,diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
// Use IE sourceIndex if available on both nodesif ( diff ){
return diff;
}
// Check if b follows aif ( cur ){
while ( (cur = cur.nextSibling) ){
if ( cur === b ){
return -1;
}
}
}
return a ? 1:-1;
}
// Returns a function to use in pseudos for input typesfunction createInputPseudo( type ){
return function( elem ){
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === type;
}
;
}
// Returns a function to use in pseudos for buttonsfunction 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 positionalsfunction 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 indexeswhile ( i-- ){
if ( seed[ (j = matchIndexes[i]) ] ){
seed[j] = !(matches[j] = seed[j]);
}
}
}
);
}
);
}
/** * 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 arrayfor (;
(node = elem[i]);
i++ ){
// Do not traverse comment nodesret += 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 childrenfor ( 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 nodesreturn ret;
}
;
Expr = Sizzle.selectors ={
// Can be adjusted by the usercacheLength:50,createPseudo:markFunction,match:matchExpr,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 unquotedmatch[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-component6 x of xn-component7 sign of y-component8 y of y-component*/
match[1] = match[1].toLowerCase();
if ( match[1].slice( 0,3 ) === "nth" ){
// nth-* requires argumentif ( !match[3] ){
Sizzle.error( match[0] );
}
// numeric x and y parameters for Expr.filter.CHILD// remember that false/true cast respectively to 0/1match[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-isif ( match[4] ){
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 indexmatch[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( nodeName ){
if ( nodeName === "*" ){
return function(){
return true;
}
;
}
nodeName = nodeName.replace( runescape,funescape ).toLowerCase();
return 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( 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 indexouterCache = 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 breakif ( 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 startwhile ( (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 elementif ( useCache ){
(node[ expando ] || (node[ expando ] ={
}
))[ type ] = [ dirruns,diff ];
}
if ( node === elem ){
break;
}
}
}
}
// Incorporate the offset,then check against cycle sizediff -= 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 pseudosvar 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 doesif ( fn[ expando ] ){
return fn( argument );
}
// But maintain support for old signaturesif ( 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 combinatorsvar 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 identifiderif ( !ridentifier.test(lang || "") ){
Sizzle.error( "unsupported lang:" + lang );
}
lang = lang.replace( runescape,funescape ).toLowerCase();
return function( elem ){
var elemLang;
do{
if ( (elemLang = documentIsXML ?elem.getAttribute("xml:lang") || elem.getAttribute("lang"):elem.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/#checkedvar 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 properlyif ( 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 casereturn 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;
}
)}
}
;
// Add button/input type pseudosfor ( 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 );
}
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 runif ( !matched || (match = rcomma.exec( soFar )) ){
if ( match ){
// Don't consume trailing commas as validsoFar = soFar.slice( match[0].length ) || soFar;
}
groups.push( tokens = [] );
}
matched = false;
// Combinatorsif ( (match = rcombinators.exec( soFar )) ){
matched = match.shift();
tokens.push({
value:matched,// Cast descendant combinators to spacetype:match[0].replace( rtrim," " )}
);
soFar = soFar.slice( matched.length );
}
// Filtersfor ( 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 tokensreturn parseOnly ?soFar.length:soFar ?Sizzle.error( selector ):// Cache the tokenstokenCache( 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 elementfunction( elem,context,xml ){
while ( (elem = elem[ dir ]) ){
if ( elem.nodeType === 1 || checkNonElements ){
return matcher( elem,context,xml );
}
}
}
:// Check against all ancestor/preceding elementsfunction( 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 cachingif ( 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 contextelems = seed || multipleContexts( selector || "*",context.nodeType ? [ context ]:context,[] ),// Prefilter to get matcher input,preserving a map for seed-results synchronizationmatcherIn = 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 directlyresults:matcherIn;
// Find primary matchesif ( matcher ){
matcher( matcherIn,matcherOut,context,xml );
}
// Apply postFilterif ( postFilter ){
temp = condense( matcherOut,postMap );
postFilter( temp,[],context,xml );
// Un-match failing elements by moving them back to matcherIni = 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 contextstemp = [];
i = matcherOut.length;
while ( i-- ){
if ( (elem = matcherOut[i]) ){
// Restore matcherIn since elem is not yet a final matchtemp.push( (matcherIn[i] = elem) );
}
}
postFinder( null,(matcherOut = []),temp,xml );
}
// Move matched elements from seed to results to keep them synchronizedi = 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 matcherif ( matcher[ expando ] ){
// Find the next relative operator (if any) for proper handlingj = ++i;
for (;
j < len;
j++ ){
if ( Expr.relative[ tokens[j].type ] ){
break;
}
}
return setMatcher(i > 1 && elementMatcher( matchers ),i > 1 && toSelector( tokens.slice( 0,i - 1 ) ).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 matchedvar 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 contextelems = seed || byElement && Expr.find["TAG"]( "*",expandContext && context.parentNode || context ),// Use integer dirruns iff this is the outermost matcherdirrunsUnique = (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" belowfor (;
(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 filtersif ( bySet ){
// They will have gone through all possible matchersif ( (elem = !matcher && elem) ){
matchedCount--;
}
// Lengthen the array for every element,matched or notif ( seed ){
unmatched.push( elem );
}
}
}
// Apply set filters to unmatched elementsmatchedCount += 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 sortingif ( matchedCount > 0 ){
while ( i-- ){
if ( !(unmatched[i] || setMatched[i]) ){
setMatched[i] = pop.call( results );
}
}
}
// Discard index placeholder values to get only actual matchessetMatched = condense( setMatched );
}
// Add matches to resultspush.apply( results,setMatched );
// Seedless set matches succeeding multiple successful matchers stipulate sortingif ( outermost && !seed && setMatched.length > 0 &&( matchedCount + setMatchers.length ) > 1 ){
Sizzle.uniqueSort( results );
}
}
// Override manipulation of globals by nested matchersif ( 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 elementif ( !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 functioncached = 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 groupif ( match.length === 1 ){
// Take a shortcut and set the context if the root selector is an IDtokens = match[0] = match[0].slice( 0 );
if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&context.nodeType === 9 && !documentIsXML &&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 matchingi = matchExpr["needsContext"].test( selector ) ? 0:tokens.length;
while ( i-- ){
token = tokens[i];
// Abort if we hit a combinatorif ( Expr.relative[ (type = token.type) ] ){
break;
}
if ( (find = Expr.find[ type ]) ){
// Search,expanding context for leading sibling combinatorsif ( (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 earlytokens.splice( i,1 );
selector = seed.length && toSelector( tokens );
if ( !selector ){
push.apply( results,slice.call( seed,0 ) );
return results;
}
break;
}
}
}
}
}
// Compile and execute a filtering function// Provide `match` to avoid retokenization if we modified the selector abovecompile( selector,match )(seed,context,documentIsXML,results,rsibling.test( selector ));
return results;
}
// DeprecatedExpr.pseudos["nth"] = Expr.pseudos["eq"];
// Easy API for creating new setFiltersfunction setFilters(){
}
Expr.filters = setFilters.prototype = Expr.pseudos;
Expr.setFilters = new setFilters();
// Initialize with the default documentsetDocument();
// Override sizzle attribute retrievalSizzle.attr = jQuery.attr;
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 );
var runtil = /Until$/,rparentsprev = /^(?:parents|prev(?:Until|All))/,isSimple = /^.[^:#\[\.,]*$/,rneedsContext = jQuery.expr.match.needsContext,// methods guaranteed to produce a unique set when starting from a unique setguaranteedUnique ={
children:true,contents:true,next:true,prev:true}
;
jQuery.fn.extend({
find:function( selector ){
var i,ret,self,len = this.length;
if ( typeof selector !== "string" ){
self = this;
return this.pushStack( jQuery( selector ).filter(function(){
for ( i = 0;
i < len;
i++ ){
if ( jQuery.contains( self[ i ],this ) ){
return true;
}
}
}
) );
}
ret = [];
for ( i = 0;
i < len;
i++ ){
jQuery.find( selector,this[ 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;
return ret;
}
,has:function( target ){
var i,targets = jQuery( target,this ),len = targets.length;
return this.filter(function(){
for ( i = 0;
i < len;
i++ ){
if ( jQuery.contains( this,targets[i] ) ){
return true;
}
}
}
);
}
,not:function( selector ){
return this.pushStack( winnow(this,selector,false) );
}
,filter:function( selector ){
return this.pushStack( winnow(this,selector,true) );
}
,is:function( selector ){
return !!selector && (typeof selector === "string" ?// 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".rneedsContext.test( selector ) ?jQuery( selector,this.context ).index( this[0] ) >= 0:jQuery.filter( selector,this ).length > 0:this.filter( selector ).length > 0 );
}
,closest:function( selectors,context ){
var cur,i = 0,l = this.length,ret = [],pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?jQuery( selectors,context || this.context ):0;
for (;
i < l;
i++ ){
cur = this[i];
while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ){
if ( pos ? pos.index(cur) > -1:jQuery.find.matchesSelector(cur,selectors) ){
ret.push( cur );
break;
}
cur = cur.parentNode;
}
}
return this.pushStack( ret.length > 1 ? jQuery.unique( ret ):ret );
}
,// Determine the position of an element within// the matched set of elementsindex:function( elem ){
// No argument,return index in parentif ( !elem ){
return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length:-1;
}
// index in selectorif ( typeof elem === "string" ){
return jQuery.inArray( this[0],jQuery( elem ) );
}
// Locate the position of the desired elementreturn jQuery.inArray(// If it receives a jQuery object,the first element is usedelem.jquery ? elem[0]:elem,this );
}
,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));
}
}
);
jQuery.fn.andSelf = jQuery.fn.addBack;
function sibling( cur,dir ){
do{
cur = cur[ dir ];
}
while ( cur && 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 jQuery.nodeName( elem,"iframe" ) ?elem.contentDocument || elem.contentWindow.document:jQuery.merge( [],elem.childNodes );
}
}
,function( name,fn ){
jQuery.fn[ name ] = function( until,selector ){
var ret = jQuery.map( this,fn,until );
if ( !runtil.test( name ) ){
selector = until;
}
if ( selector && typeof selector === "string" ){
ret = jQuery.filter( selector,ret );
}
ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ):ret;
if ( this.length > 1 && rparentsprev.test( name ) ){
ret = ret.reverse();
}
return this.pushStack( ret );
}
;
}
);
jQuery.extend({
filter:function( expr,elems,not ){
if ( not ){
expr = ":not(" + expr + ")";
}
return elems.length === 1 ?jQuery.find.matchesSelector(elems[0],expr) ? [ elems[0] ]:[]:jQuery.find.matches(expr,elems);
}
,dir:function( elem,dir,until ){
var matched = [],cur = elem[ dir ];
while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ){
if ( cur.nodeType === 1 ){
matched.push( cur );
}
cur = cur[dir];
}
return matched;
}
,sibling:function( n,elem ){
var r = [];
for (;
n;
n = n.nextSibling ){
if ( n.nodeType === 1 && n !== elem ){
r.push( n );
}
}
return r;
}
}
);
// Implement the identical functionality for filter and notfunction winnow( elements,qualifier,keep ){
// Can't pass null or undefined to indexOf in Firefox 4// Set to 0 to skip string checkqualifier = qualifier || 0;
if ( jQuery.isFunction( qualifier ) ){
return jQuery.grep(elements,function( elem,i ){
var retVal = !!qualifier.call( elem,i,elem );
return retVal === keep;
}
);
}
else if ( qualifier.nodeType ){
return jQuery.grep(elements,function( elem ){
return ( elem === qualifier ) === keep;
}
);
}
else if ( typeof qualifier === "string" ){
var filtered = jQuery.grep(elements,function( elem ){
return elem.nodeType === 1;
}
);
if ( isSimple.test( qualifier ) ){
return jQuery.filter(qualifier,filtered,!keep);
}
else{
qualifier = jQuery.filter( qualifier,filtered );
}
}
return jQuery.grep(elements,function( elem ){
return ( jQuery.inArray( elem,qualifier ) >= 0 ) === keep;
}
);
}
function createSafeFragment( document ){
var list = nodeNames.split( "|" ),safeFrag = document.createDocumentFragment();
if ( safeFrag.createElement ){
while ( list.length ){
safeFrag.createElement(list.pop());
}
}
return safeFrag;
}
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]","i"),rleadingWhitespace = /^\s+/,rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rtagName = /<([\w:]+)/,rtbody = /<tbody/i,rhtml = /<|&#?\w+;
/,rnoInnerhtml = /<(?:script|style|link)/i,manipulation_rcheckableType = /^(?:checkbox|radio)$/i,// checked="checked" or checkedrchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,rscriptType = /^$|\/(?:java|ecma)script/i,rscriptTypeMasked = /^true\/(.*)/,rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,// We have to close these tags to support XHTML (#13200)wrapMap ={
option:[ 1,"<select multiple='multiple'>","</select>" ],legend:[ 1,"<fieldset>","</fieldset>" ],area:[ 1,"<map>","</map>" ],param:[ 1,"<object>","</object>" ],thead:[ 1,"<table>","</table>" ],tr:[ 2,"<table><tbody>","</tbody></table>" ],col:[ 2,"<table><tbody></tbody><colgroup>","</colgroup></table>" ],td:[ 3,"<table><tbody><tr>","</tr></tbody></table>" ],// IE6-8 can't serialize link,script,style,or any html5 (NoScope) tags,// unless wrapped in a div with non-breaking characters in front of it._default:jQuery.support.htmlSerialize ? [ 0,"","" ]:[ 1,"X<div>","</div>" ]}
,safeFragment = createSafeFragment( document ),fragmentDiv = safeFragment.appendChild( document.createElement("div") );
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 );
}
,wrapAll:function( html ){
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 aroundvar 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.firstChild && elem.firstChild.nodeType === 1 ){
elem = elem.firstChild;
}
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();
}
,append:function(){
return this.domManip(arguments,true,function( elem ){
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ){
this.appendChild( elem );
}
}
);
}
,prepend:function(){
return this.domManip(arguments,true,function( elem ){
if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ){
this.insertBefore( elem,this.firstChild );
}
}
);
}
,before:function(){
return this.domManip( arguments,false,function( elem ){
if ( this.parentNode ){
this.parentNode.insertBefore( elem,this );
}
}
);
}
,after:function(){
return this.domManip( arguments,false,function( elem ){
if ( this.parentNode ){
this.parentNode.insertBefore( elem,this.nextSibling );
}
}
);
}
,// keepData is for internal use only--do not documentremove:function( selector,keepData ){
var elem,i = 0;
for (;
(elem = this[i]) != null;
i++ ){
if ( !selector || jQuery.filter( selector,[ elem ] ).length > 0 ){
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++ ){
// Remove element nodes and prevent memory leaksif ( elem.nodeType === 1 ){
jQuery.cleanData( getAll( elem,false ) );
}
// Remove any remaining nodeswhile ( elem.firstChild ){
elem.removeChild( elem.firstChild );
}
// If this is a select,ensure that it displays empty (#12336)// Support:IE<9if ( elem.options && jQuery.nodeName( elem,"select" ) ){
elem.options.length = 0;
}
}
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 ){
return elem.nodeType === 1 ?elem.innerHTML.replace( rinlinejQuery,"" ):undefined;
}
// See if we can take a shortcut and just use innerHTMLif ( typeof value === "string" && !rnoInnerhtml.test( value ) &&( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&!wrapMap[ ( rtagName.exec( value ) || ["",""] )[1].toLowerCase() ] ){
value = value.replace( rxhtmlTag,"<$1></$2>" );
try{
for (;
i < l;
i++ ){
// Remove element nodes and prevent memory leakselem = this[i] ||{
}
;
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( value ){
var isFunc = jQuery.isFunction( value );
// Make sure that the elements are removed from the DOM before they are inserted// this can help fix replacing a parent with child elementsif ( !isFunc && typeof value !== "string" ){
value = jQuery( value ).not( this ).detach();
}
return this.domManip( [ value ],true,function( elem ){
var next = this.nextSibling,parent = this.parentNode;
if ( parent ){
jQuery( this ).remove();
parent.insertBefore( elem,next );
}
}
);
}
,detach:function( selector ){
return this.remove( selector,true );
}
,domManip:function( args,table,callback ){
// Flatten any nested arraysargs = core_concat.apply( [],args );
var first,node,hasScripts,scripts,doc,fragment,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 WebKitif ( 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,table ? self.html():undefined );
}
self.domManip( args,table,callback );
}
);
}
if ( l ){
fragment = jQuery.buildFragment( args,this[ 0 ].ownerDocument,false,this );
first = fragment.firstChild;
if ( fragment.childNodes.length === 1 ){
fragment = first;
}
if ( first ){
table = table && jQuery.nodeName( first,"tr" );
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 restorationif ( hasScripts ){
jQuery.merge( scripts,getAll( node,"script" ) );
}
}
callback.call(table && jQuery.nodeName( this[i],"table" ) ?findOrAppend( this[i],"tbody" ):this[i],node,i);
}
if ( hasScripts ){
doc = scripts[ scripts.length - 1 ].ownerDocument;
// Reenable scriptsjQuery.map( scripts,restoreScript );
// Evaluate executable scripts on first document insertionfor ( i = 0;
i < hasScripts;
i++ ){
node = scripts[ i ];
if ( rscriptType.test( node.type || "" ) &&!jQuery._data( node,"globalEval" ) && jQuery.contains( doc,node ) ){
if ( node.src ){
// Hope ajax is available...jQuery.ajax({
url:node.src,type:"GET",dataType:"script",async:false,global:false,"throws":true}
);
}
else{
jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript,"" ) );
}
}
}
}
// Fix #11809:Avoid leaking memoryfragment = first = null;
}
}
return this;
}
}
);
function findOrAppend( elem,tag ){
return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
}
// Replace/restore the type attribute of script elements for safe DOM manipulationfunction disableScript( elem ){
var attr = elem.getAttributeNode("type");
elem.type = ( attr && attr.specified ) + "/" + 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 evaluatedfunction setGlobalEval( elems,refElements ){
var elem,i = 0;
for (;
(elem = elems[i]) != null;
i++ ){
jQuery._data( elem,"globalEval",!refElements || jQuery._data( refElements[i],"globalEval" ) );
}
}
function cloneCopyEvent( src,dest ){
if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ){
return;
}
var type,i,l,oldData = jQuery._data( src ),curData = jQuery._data( dest,oldData ),events = oldData.events;
if ( events ){
delete curData.handle;
curData.events ={
}
;
for ( type in events ){
for ( i = 0,l = events[ type ].length;
i < l;
i++ ){
jQuery.event.add( dest,type,events[ type ][ i ] );
}
}
}
// make the cloned public data object a copy from the originalif ( curData.data ){
curData.data = jQuery.extend({
}
,curData.data );
}
}
function fixCloneNodeIssues( src,dest ){
var nodeName,e,data;
// We do not need to do anything for non-Elementsif ( dest.nodeType !== 1 ){
return;
}
nodeName = dest.nodeName.toLowerCase();
// IE6-8 copies events bound via attachEvent when using cloneNode.if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ){
data = jQuery._data( dest );
for ( e in data.events ){
jQuery.removeEvent( dest,e,data.handle );
}
// Event data gets referenced instead of copied if the expando gets copied toodest.removeAttribute( jQuery.expando );
}
// IE blanks contents when cloning scripts,and tries to evaluate newly-set textif ( nodeName === "script" && dest.text !== src.text ){
disableScript( dest ).text = src.text;
restoreScript( dest );
// IE6-10 improperly clones children of object elements using classid.// IE10 throws NoModificationAllowedError if parent is null,#12132.}
else if ( nodeName === "object" ){
if ( dest.parentNode ){
dest.outerHTML = src.outerHTML;
}
// This path appears unavoidable for IE9. When cloning an object// element in IE9,the outerHTML strategy above is not sufficient.// If the src has innerHTML and the destination does not,// copy the src.innerHTML into the dest.innerHTML. #10324if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ){
dest.innerHTML = src.innerHTML;
}
}
else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ){
// IE6-8 fails to persist the checked state of a cloned checkbox// or radio button. Worse,IE6-7 fail to give the cloned element// a checked appearance if the defaultChecked value isn't also setdest.defaultChecked = dest.checked = src.checked;
// IE6-7 get confused and end up setting the value of a cloned// checkbox/radio button to an empty string instead of "on"if ( dest.value !== src.value ){
dest.value = src.value;
}
// IE6-8 fails to return the selected option to the default selected// state when cloning options}
else if ( nodeName === "option" ){
dest.defaultSelected = dest.selected = src.defaultSelected;
// IE6-8 fails to set the defaultValue to the correct value when// cloning other types of input fields}
else if ( nodeName === "input" || nodeName === "textarea" ){
dest.defaultValue = src.defaultValue;
}
}
jQuery.each({
appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"}
,function( name,original ){
jQuery.fn[ name ] = function( selector ){
var elems,i = 0,ret = [],insert = jQuery( selector ),last = insert.length - 1;
for (;
i <= last;
i++ ){
elems = i === last ? this:this.clone(true);
jQuery( insert[i] )[ original ]( elems );
// Modern browsers can apply jQuery collections as arrays,but oldIE needs a .get()core_push.apply( ret,elems.get() );
}
return this.pushStack( ret );
}
;
}
);
function getAll( context,tag ){
var elems,elem,i = 0,found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ):typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ):undefined;
if ( !found ){
for ( found = [],elems = context.childNodes || context;
(elem = elems[i]) != null;
i++ ){
if ( !tag || jQuery.nodeName( elem,tag ) ){
found.push( elem );
}
else{
jQuery.merge( found,getAll( elem,tag ) );
}
}
}
return tag === undefined || tag && jQuery.nodeName( context,tag ) ?jQuery.merge( [ context ],found ):found;
}
// Used in buildFragment,fixes the defaultChecked propertyfunction fixDefaultChecked( elem ){
if ( manipulation_rcheckableType.test( elem.type ) ){
elem.defaultChecked = elem.checked;
}
}
jQuery.extend({
clone:function( elem,dataAndEvents,deepDataAndEvents ){
var destElements,node,clone,i,srcElements,inPage = jQuery.contains( elem.ownerDocument,elem );
if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ){
clone = elem.cloneNode( true );
// IE<=8 does not properly clone detached,unknown element nodes}
else{
fragmentDiv.innerHTML = elem.outerHTML;
fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
}
if ( (!jQuery.support.noCloneEvent || !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/2destElements = getAll( clone );
srcElements = getAll( elem );
// Fix all IE cloning issuesfor ( i = 0;
(node = srcElements[i]) != null;
++i ){
// Ensure that the destination node is not null;
Fixes #9587if ( destElements[i] ){
fixCloneNodeIssues( node,destElements[i] );
}
}
}
// Copy the events from the original to the cloneif ( dataAndEvents ){
if ( deepDataAndEvents ){
srcElements = srcElements || getAll( elem );
destElements = destElements || getAll( clone );
for ( i = 0;
(node = srcElements[i]) != null;
i++ ){
cloneCopyEvent( node,destElements[i] );
}
}
else{
cloneCopyEvent( elem,clone );
}
}
// Preserve script evaluation historydestElements = getAll( clone,"script" );
if ( destElements.length > 0 ){
setGlobalEval( destElements,!inPage && getAll( elem,"script" ) );
}
destElements = srcElements = node = null;
// Return the cloned setreturn clone;
}
,buildFragment:function( elems,context,scripts,selection ){
var j,elem,contains,tmp,tag,tbody,wrap,l = elems.length,// Ensure a safe fragmentsafe = createSafeFragment( context ),nodes = [],i = 0;
for (;
i < l;
i++ ){
elem = elems[ i ];
if ( elem || elem === 0 ){
// Add nodes directlyif ( jQuery.type( elem ) === "object" ){
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 || safe.appendChild( context.createElement("div") );
// Deserialize a standard representationtag = ( rtagName.exec( elem ) || ["",""] )[1].toLowerCase();
wrap = wrapMap[ tag ] || wrapMap._default;
tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag,"<$1></$2>" ) + wrap[2];
// Descend through wrappers to the right contentj = wrap[0];
while ( j-- ){
tmp = tmp.lastChild;
}
// Manually add leading whitespace removed by IEif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ){
nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
}
// Remove IE's autoinserted <tbody> from table fragmentsif ( !jQuery.support.tbody ){
// String was a <table>,*may* have spurious <tbody>elem = tag === "table" && !rtbody.test( elem ) ?tmp.firstChild:// String was a bare <thead> or <tfoot>wrap[1] === "<table>" && !rtbody.test( elem ) ?tmp:0;
j = elem && elem.childNodes.length;
while ( j-- ){
if ( jQuery.nodeName( (tbody = elem.childNodes[j]),"tbody" ) && !tbody.childNodes.length ){
elem.removeChild( tbody );
}
}
}
jQuery.merge( nodes,tmp.childNodes );
// Fix #12392 for WebKit and IE > 9tmp.textContent = "";
// Fix #12392 for oldIEwhile ( tmp.firstChild ){
tmp.removeChild( tmp.firstChild );
}
// Remember the top-level container for proper cleanuptmp = safe.lastChild;
}
}
}
// Fix #11356:Clear elements from fragmentif ( tmp ){
safe.removeChild( tmp );
}
// Reset defaultChecked for any radios and checkboxes// about to be appended to the DOM in IE 6/7 (#8060)if ( !jQuery.support.appendChecked ){
jQuery.grep( getAll( nodes,"input" ),fixDefaultChecked );
}
i = 0;
while ( (elem = nodes[ i++ ]) ){
// #4087 - If origin and destination elements are the same,and this is// that element,do not do anythingif ( selection && jQuery.inArray( elem,selection ) !== -1 ){
continue;
}
contains = jQuery.contains( elem.ownerDocument,elem );
// Append to fragmenttmp = getAll( safe.appendChild( elem ),"script" );
// Preserve script evaluation historyif ( contains ){
setGlobalEval( tmp );
}
// Capture executablesif ( scripts ){
j = 0;
while ( (elem = tmp[ j++ ]) ){
if ( rscriptType.test( elem.type || "" ) ){
scripts.push( elem );
}
}
}
}
tmp = null;
return safe;
}
,cleanData:function( elems,/* internal */
acceptData ){
var elem,type,id,data,i = 0,internalKey = jQuery.expando,cache = jQuery.cache,deleteExpando = jQuery.support.deleteExpando,special = jQuery.event.special;
for (;
(elem = elems[i]) != null;
i++ ){
if ( acceptData || jQuery.acceptData( elem ) ){
id = elem[ internalKey ];
data = id && cache[ id ];
if ( data ){
if ( data.events ){
for ( type in data.events ){
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 );
}
}
}
// Remove cache only if it was not already removed by jQuery.event.removeif ( cache[ id ] ){
delete cache[ id ];
// IE does not allow us to delete expando properties from nodes,// nor does it have a removeAttribute function on Document nodes;
// we must handle all of these casesif ( deleteExpando ){
delete elem[ internalKey ];
}
else if ( typeof elem.removeAttribute !== core_strundefined ){
elem.removeAttribute( internalKey );
}
else{
elem[ internalKey ] = null;
}
core_deletedIds.push( id );
}
}
}
}
}
}
);
var iframe,getStyles,curCSS,ralpha = /alpha\([^)]*\)/i,ropacity = /opacity\s*=\s*([^)]*)/,rposition = /^(top|right|bottom|left)$/,// 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/displayrdisplayswap = /^(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 propertyfunction vendorPropName( style,name ){
// shortcut for names that are not vendor prefixedif ( name in style ){
return name;
}
// check for vendor prefixed namesvar 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 argumentelem = el || elem;
return jQuery.css( elem,"display" ) === "none" || !jQuery.contains( elem.ownerDocument,elem );
}
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 ] = jQuery._data( 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 notif ( !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 elementif ( elem.style.display === "" && isHidden( elem ) ){
values[ index ] = jQuery._data( elem,"olddisplay",css_defaultDisplay(elem.nodeName) );
}
}
else{
if ( !values[ index ] ){
hidden = isHidden( elem );
if ( display && display !== "none" || !hidden ){
jQuery._data( elem,"olddisplay",hidden ? display:jQuery.css( elem,"display" ) );
}
}
}
}
// Set the display of most of the elements in a second loop// to avoid the constant reflowfor ( 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 len,styles,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 ){
var bool = typeof state === "boolean";
return this.each(function(){
if ( bool ? state: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 propertycssHooks:{
opacity:{
get:function( elem,computed ){
if ( computed ){
// We should always get a number back from opacityvar ret = curCSS( elem,"opacity" );
return ret === "" ? "1":ret;
}
}
}
}
,// Exclude the following css properties to add pxcssNumber:{
"columnCount":true,"fillOpacity":true,"fontWeight":true,"lineHeight":true,"opacity":true,"orphans":true,"widows":true,"zIndex":true,"zoom":true}
,// Add in properties whose names you wish to fix before// setting or getting the valuecssProps:{
// normalize float css property"float":jQuery.support.cssFloat ? "cssFloat":"styleFloat"}
,// Get and set the style property on a DOM Nodestyle:function( elem,name,value,extra ){
// Don't set styles on text and comment nodesif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ){
return;
}
// Make sure that we're working with the right namevar 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 versionhooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
// Check if we're setting a valueif ( value !== undefined ){
type = typeof value;
// convert relative number strings (+= or -=) to relative numbers. #7345if ( type === "string" && (ret = rrelNum.exec( value )) ){
value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem,name ) );
// Fixes bug #9237type = "number";
}
// Make sure that NaN and null values aren't set. See:#7116if ( 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 specifing setters in cssHooks,// but it would mean to define eight (for every problematic property) identical functionsif ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ){
style[ name ] = "inherit";
}
// If a hook was provided,use that value,otherwise just set the specified valueif ( !hooks || !("set" in hooks) || (value = hooks.set( elem,value,extra )) !== undefined ){
// Wrapped to prevent IE from throwing errors when 'invalid' values are provided// Fixes bug #5509try{
style[ name ] = value;
}
catch(e){
}
}
}
else{
// If a hook was provided get the non-computed value from thereif ( hooks && "get" in hooks && (ret = hooks.get( elem,false,extra )) !== undefined ){
return ret;
}
// Otherwise just get the value from the style objectreturn style[ name ];
}
}
,css:function( elem,name,extra,styles ){
var num,val,hooks,origName = jQuery.camelCase( name );
// Make sure that we're working with the right namename = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style,origName ) );
// gets hook for the prefixed version// followed by the unprefixed versionhooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
// If a hook was provided get the computed value from thereif ( hooks && "get" in hooks ){
val = hooks.get( elem,true,extra );
}
// Otherwise,if a way to get the computed value exists,use thatif ( val === undefined ){
val = curCSS( elem,name,styles );
}
//convert "normal" to computed valueif ( val === "normal" && name in cssNormalTransform ){
val = cssNormalTransform[ name ];
}
// Return,converting to number if forced or a qualifier was provided and val looks numericif ( extra === "" || extra ){
num = parseFloat( val );
return extra === true || jQuery.isNumeric( num ) ? num || 0:val;
}
return val;
}
,// A method for quickly swapping in/out CSS properties to get correct calculationsswap:function( elem,options,callback,args ){
var ret,name,old ={
}
;
// Remember the old values,and insert the new onesfor ( name in options ){
old[ name ] = elem.style[ name ];
elem.style[ name ] = options[ name ];
}
ret = callback.apply( elem,args || [] );
// Revert the old valuesfor ( name in options ){
elem.style[ name ] = old[ name ];
}
return ret;
}
}
);
// NOTE:we've included the "window" in window.getComputedStyle// because jsdom on node.js will break without it.if ( window.getComputedStyle ){
getStyles = function( elem ){
return window.getComputedStyle( elem,null );
}
;
curCSS = function( elem,name,_computed ){
var width,minWidth,maxWidth,computed = _computed || getStyles( elem ),// getPropertyValue is only needed for .css('filter') in IE9,see #12537ret = computed ? computed.getPropertyValue( name ) || computed[ name ]:undefined,style = elem.style;
if ( computed ){
if ( ret === "" && !jQuery.contains( elem.ownerDocument,elem ) ){
ret = jQuery.style( elem,name );
}
// A tribute to the "awesome hack by Dean Edwards"// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right// 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-valuesif ( rnumnonpx.test( ret ) && rmargin.test( name ) ){
// Remember the original valueswidth = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
// Put in the new values to get a computed value outstyle.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
// Revert the changed valuesstyle.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
}
}
return ret;
}
;
}
else if ( document.documentElement.currentStyle ){
getStyles = function( elem ){
return elem.currentStyle;
}
;
curCSS = function( elem,name,_computed ){
var left,rs,rsLeft,computed = _computed || getStyles( elem ),ret = computed ? computed[ name ]:undefined,style = elem.style;
// Avoid setting ret to empty string here// so we don't default to autoif ( ret == null && style && style[ name ] ){
ret = style[ name ];
}
// From the awesome hack by Dean Edwards// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291// If we're not dealing with a regular pixel number// but a number that has a weird ending,we need to convert it to pixels// but not position css attributes,as those are proportional to the parent element instead// and we can't measure the parent instead because it might trigger a "stacking dolls" problemif ( rnumnonpx.test( ret ) && !rposition.test( name ) ){
// Remember the original valuesleft = style.left;
rs = elem.runtimeStyle;
rsLeft = rs && rs.left;
// Put in the new values to get a computed value outif ( rsLeft ){
rs.left = elem.currentStyle.left;
}
style.left = name === "fontSize" ? "1em":ret;
ret = style.pixelLeft + "px";
// Revert the changed valuesstyle.left = left;
if ( rsLeft ){
rs.left = rsLeft;
}
}
return ret === "" ? "auto":ret;
}
;
}
function setPositiveNumber( elem,value,subtract ){
var matches = rnumsplit.exec( value );
return matches ?// Guard against undefined "subtract",e.g.,when used as in cssHooksMath.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 augmentation4:// Otherwise initialize for horizontal or vertical propertiesname === "width" ? 1:0,val = 0;
for (;
i < 4;
i += 2 ){
// both box models exclude margin,so add it if we want itif ( extra === "margin" ){
val += jQuery.css( elem,extra + cssExpand[ i ],true,styles );
}
if ( isBorderBox ){
// border-box includes padding,so remove it if we want contentif ( extra === "content" ){
val -= jQuery.css( elem,"padding" + cssExpand[ i ],true,styles );
}
// at this point,extra isn't border nor margin,so remove borderif ( extra !== "margin" ){
val -= jQuery.css( elem,"border" + cssExpand[ i ] + "Width",true,styles );
}
}
else{
// at this point,extra isn't content,so add paddingval += jQuery.css( elem,"padding" + cssExpand[ i ],true,styles );
// at this point,extra isn't content nor padding,so add borderif ( 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 valuevar 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=491668if ( val <= 0 || val == null ){
// Fall back to computed then uncomputed css if necessaryval = 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.stylevalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
// Normalize "",auto,and prepare for extraval = parseFloat( val ) || 0;
}
// use the active box-sizing model to add/subtract irrelevant stylesreturn ( val +augmentWidthOrHeight(elem,name,extra || ( isBorderBox ? "border":"content" ),valueIsBorderBox,styles)) + "px";
}
// Try to determine the default display value of an elementfunction css_defaultDisplay( nodeName ){
var doc = document,display = elemdisplay[ nodeName ];
if ( !display ){
display = actualDisplay( nodeName,doc );
// If the simple way fails,read from inside an iframeif ( display === "none" || !display ){
// Use the already-created iframe if possibleiframe = ( iframe ||jQuery("<iframe frameborder='0' width='0' height='0'/>").css( "cssText","display:block !important" )).appendTo( doc.documentElement );
// Always write a new HTML skeleton so Webkit and Firefox don't choke on reusedoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
doc.write("<!doctype html><html><body>");
doc.close();
display = actualDisplay( nodeName,doc );
iframe.detach();
}
// Store the correct default displayelemdisplay[ nodeName ] = display;
}
return display;
}
// Called ONLY from within css_defaultDisplayfunction actualDisplay( name,doc ){
var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),display = jQuery.css( elem[0],"display" );
elem.remove();
return display;
}
jQuery.each([ "height","width" ],function( i,name ){
jQuery.cssHooks[ name ] ={
get:function( elem,computed,extra ){
if ( computed ){
// certain elements can have dimension info if we invisibly show them// however,it must have a current display style that would benefit from thisreturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem,"display" ) ) ?jQuery.swap( elem,cssShow,function(){
return getWidthOrHeight( elem,name,extra );
}
):getWidthOrHeight( elem,name,extra );
}
}
,set:function( elem,value,extra ){
var styles = extra && getStyles( elem );
return setPositiveNumber( elem,value,extra ?augmentWidthOrHeight(elem,name,extra,jQuery.support.boxSizing && jQuery.css( elem,"boxSizing",false,styles ) === "border-box",styles):0);
}
}
;
}
);
if ( !jQuery.support.opacity ){
jQuery.cssHooks.opacity ={
get:function( elem,computed ){
// IE uses filters for opacityreturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter:elem.style.filter) || "" ) ?( 0.01 * parseFloat( RegExp.$1 ) ) + "":computed ? "1":"";
}
,set:function( elem,value ){
var style = elem.style,currentStyle = elem.currentStyle,opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")":"",filter = currentStyle && currentStyle.filter || style.filter || "";
// IE has trouble with opacity if it does not have layout// Force it by setting the zoom levelstyle.zoom = 1;
// if setting opacity to 1,and no other filters exist - attempt to remove filter attribute #6652// if value === "",then remove inline opacity #12685if ( ( value >= 1 || value === "" ) &&jQuery.trim( filter.replace( ralpha,"" ) ) === "" &&style.removeAttribute ){
// Setting style.filter to null,"" & " " still leave "filter:" in the cssText// if "filter:" is present at all,clearType is disabled,we want to avoid this// style.removeAttribute is IE Only,but so apparently is this code path...style.removeAttribute( "filter" );
// if there is no filter style applied in a css rule or unset inline opacity,we are doneif ( value === "" || currentStyle && !currentStyle.filter ){
return;
}
}
// otherwise,set new filter valuesstyle.filter = ralpha.test( filter ) ?filter.replace( ralpha,opacity ):filter + " " + opacity;
}
}
;
}
// These hooks cannot be added until DOM ready because the support test// for it is not run until after DOM readyjQuery(function(){
if ( !jQuery.support.reliableMarginRight ){
jQuery.cssHooks.marginRight ={
get:function( elem,computed ){
if ( computed ){
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right// Work around by temporarily setting element display to inline-blockreturn jQuery.swap( elem,{
"display":"inline-block"}
,curCSS,[ elem,"marginRight" ] );
}
}
}
;
}
// Webkit bug:https://bugs.webkit.org/show_bug.cgi?id=29084// getComputedStyle returns percent when specified for top/left/bottom/right// rather than make the css module depend on the offset module,we just check for it hereif ( !jQuery.support.pixelPosition && jQuery.fn.position ){
jQuery.each( [ "top","left" ],function( i,prop ){
jQuery.cssHooks[ prop ] ={
get:function( elem,computed ){
if ( computed ){
computed = curCSS( elem,prop );
// if curCSS returns percentage,fallback to offsetreturn rnumnonpx.test( computed ) ?jQuery( elem ).position()[ prop ] + "px":computed;
}
}
}
;
}
);
}
}
);
if ( jQuery.expr && jQuery.expr.filters ){
jQuery.expr.filters.hidden = function( elem ){
// Support:Opera <= 12.12// Opera reports offsetWidths and offsetHeights less than zero on some elementsreturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem,"display" )) === "none");
}
;
jQuery.expr.filters.visible = function( elem ){
return !jQuery.expr.filters.hidden( elem );
}
;
}
// These hooks are used by animate to expand propertiesjQuery.each({
margin:"",padding:"",border:"Width"}
,function( prefix,suffix ){
jQuery.cssHooks[ prefix + suffix ] ={
expand:function( value ){
var i = 0,expanded ={
}
,// assumes a single number if not a stringparts = typeof value === "string" ? value.split(" "):[ value ];
for (;
i < 4;
i++ ){
expanded[ prefix + cssExpand[ i ] + suffix ] =parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
}
return expanded;
}
}
;
if ( !rmargin.test( prefix ) ){
jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
}
}
);
var r20 = /%20/g,rbracket = /\[\]$/,rCRLF = /\r?\n/g,rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,rsubmittable = /^(?:input|select|textarea|keygen)/i;
jQuery.fn.extend({
serialize:function(){
return jQuery.param( this.serializeArray() );
}
,serializeArray:function(){
return this.map(function(){
// Can add propHook for "elements" to filter or add form elementsvar elements = jQuery.prop( this,"elements" );
return elements ? jQuery.makeArray( elements ):this;
}
).filter(function(){
var type = this.type;
// Use .is(":disabled") so that fieldset[disabled] worksreturn this.name && !jQuery( this ).is( ":disabled" ) &&rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&( this.checked || !manipulation_rcheckableType.test( type ) );
}
).map(function( i,elem ){
var val = jQuery( this ).val();
return val == null ?null:jQuery.isArray( val ) ?jQuery.map( val,function( val ){
return{
name:elem.name,value:val.replace( rCRLF,"\r\n" )}
;
}
):{
name:elem.name,value:val.replace( rCRLF,"\r\n" )}
;
}
).get();
}
}
);
//Serialize an array of form elements or a set of//key/values into a query stringjQuery.param = function( a,traditional ){
var prefix,s = [],add = function( key,value ){
// If value is a function,invoke it and return its valuevalue = jQuery.isFunction( value ) ? value():( value == null ? "":value );
s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
}
;
// Set traditional to true for jQuery <= 1.3.2 behavior.if ( traditional === undefined ){
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
}
// If an array was passed in,assume that it is an array of form elements.if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ){
// Serialize the form elementsjQuery.each( a,function(){
add( this.name,this.value );
}
);
}
else{
// If traditional,encode the "old" way (the way 1.3.2 or older// did it),otherwise encode params recursively.for ( prefix in a ){
buildParams( prefix,a[ prefix ],traditional,add );
}
}
// Return the resulting serializationreturn s.join( "&" ).replace( r20,"+" );
}
;
function buildParams( prefix,obj,traditional,add ){
var name;
if ( jQuery.isArray( obj ) ){
// Serialize array item.jQuery.each( obj,function( i,v ){
if ( traditional || rbracket.test( prefix ) ){
// Treat each array item as a scalar.add( prefix,v );
}
else{
// Item is non-scalar (array or object),encode its numeric index.buildParams( prefix + "[" + ( typeof v === "object" ? i:"" ) + "]",v,traditional,add );
}
}
);
}
else if ( !traditional && jQuery.type( obj ) === "object" ){
// Serialize object item.for ( name in obj ){
buildParams( prefix + "[" + name + "]",obj[ name ],traditional,add );
}
}
else{
// Serialize scalar item.add( prefix,obj );
}
}
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +"change select submit keydown keypress keyup error contextmenu").split(" "),function( i,name ){
// Handle event bindingjQuery.fn[ name ] = function( data,fn ){
return arguments.length > 0 ?this.on( name,null,data,fn ):this.trigger( name );
}
;
}
);
jQuery.fn.hover = function( fnOver,fnOut ){
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}
;
var// Document locationajaxLocParts,ajaxLocation,ajax_nonce = jQuery.now(),ajax_rquery = /\?/,rhash = /#.*$/,rts = /([?&])_=[^&]*/
,rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,// IE leaves an \r character at EOL// #7653,#8125,#8152:local protocol detectionrlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rnoContent = /^(?:GET|HEAD)$/,rprotocol = /^\/\//,rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,// Keep a copy of the old load method_load = jQuery.fn.load,/* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called:* - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */
prefilters ={
}
,/* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */
transports ={
}
,// Avoid comment-prolog char sequence (#10098);
must appease lint and evade compressionallTypes = "*/
".concat("*");
// #8138,IE may throw an exception when accessing// a field from window.location if document.domain has been settry{
ajaxLocation = location.href;
}
catch( e ){
// Use the href attribute of an A element// since IE will modify it given document.locationajaxLocation = document.createElement( "a" );
ajaxLocation.href = "";
ajaxLocation = ajaxLocation.href;
}
// Segment location into partsajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransportfunction addToPrefiltersOrTransports( structure ){
// dataTypeExpression is optional and defaults to "*"return function( dataTypeExpression,func ){
if ( typeof dataTypeExpression !== "string" ){
func = dataTypeExpression;
dataTypeExpression = "*";
}
var dataType,i = 0,dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
if ( jQuery.isFunction( func ) ){
// For each dataType in the dataTypeExpressionwhile ( (dataType = dataTypes[i++]) ){
// Prepend if requestedif ( dataType[0] === "+" ){
dataType = dataType.slice( 1 ) || "*";
(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
// Otherwise append}
else{
(structure[ dataType ] = structure[ dataType ] || []).push( func );
}
}
}
}
;
}
// Base inspection function for prefilters and transportsfunction inspectPrefiltersOrTransports( structure,options,originalOptions,jqXHR ){
var inspected ={
}
,seekingTransport = ( structure === transports );
function inspect( dataType ){
var selected;
inspected[ dataType ] = true;
jQuery.each( structure[ dataType ] || [],function( _,prefilterOrFactory ){
var dataTypeOrTransport = prefilterOrFactory( options,originalOptions,jqXHR );
if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ){
options.dataTypes.unshift( dataTypeOrTransport );
inspect( dataTypeOrTransport );
return false;
}
else if ( seekingTransport ){
return !( selected = dataTypeOrTransport );
}
}
);
return selected;
}
return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}
// A special extend for ajax options// that takes "flat" options (not to be deep extended)// Fixes #9887function ajaxExtend( target,src ){
var deep,key,flatOptions = jQuery.ajaxSettings.flatOptions ||{
}
;
for ( key in src ){
if ( src[ key ] !== undefined ){
( flatOptions[ key ] ? target:( deep || (deep ={
}
) ) )[ key ] = src[ key ];
}
}
if ( deep ){
jQuery.extend( true,target,deep );
}
return target;
}
jQuery.fn.load = function( url,params,callback ){
if ( typeof url !== "string" && _load ){
return _load.apply( this,arguments );
}
var selector,response,type,self = this,off = url.indexOf(" ");
if ( off >= 0 ){
selector = url.slice( off,url.length );
url = url.slice( 0,off );
}
// If it's a functionif ( jQuery.isFunction( params ) ){
// We assume that it's the callbackcallback = params;
params = undefined;
// Otherwise,build a param string}
else if ( params && typeof params === "object" ){
type = "POST";
}
// If we have elements to modify,make the requestif ( self.length > 0 ){
jQuery.ajax({
url:url,// if "type" variable is undefined,then "GET" method will be usedtype:type,dataType:"html",data:params}
).done(function( responseText ){
// Save response for use in complete callbackresponse = arguments;
self.html( selector ?// If a selector was specified,locate the right elements in a dummy div// Exclude scripts to avoid IE 'Permission Denied' errorsjQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ):// Otherwise use the full resultresponseText );
}
).complete( callback && function( jqXHR,status ){
self.each( callback,response || [ jqXHR.responseText,status,jqXHR ] );
}
);
}
return this;
}
;
// Attach a bunch of functions for handling common AJAX eventsjQuery.each( [ "ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend" ],function( i,type ){
jQuery.fn[ type ] = function( fn ){
return this.on( type,fn );
}
;
}
);
jQuery.each( [ "get","post" ],function( i,method ){
jQuery[ method ] = function( url,data,callback,type ){
// shift arguments if data argument was omittedif ( jQuery.isFunction( data ) ){
type = type || callback;
callback = data;
data = undefined;
}
return jQuery.ajax({
url:url,type:method,dataType:type,data:data,success:callback}
);
}
;
}
);
jQuery.extend({
// Counter for holding the number of active queriesactive:0,// Last-Modified header cache for next requestlastModified:{
}
,etag:{
}
,ajaxSettings:{
url:ajaxLocation,type:"GET",isLocal:rlocalProtocol.test( ajaxLocParts[ 1 ] ),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded;
charset=UTF-8",/*timeout:0,data:null,dataType:null,username:null,password:null,cache:null,throws:false,traditional:false,headers:{
}
,*/
accepts:{
"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml,text/xml",json:"application/json,text/javascript"}
,contents:{
xml:/xml/,html:/html/,json:/json/}
,responseFields:{
xml:"responseXML",text:"responseText"}
,// Data converters// Keys separate source (or catchall "*") and destination types with a single spaceconverters:{
// Convert anything to text"* text":window.String,// Text to html (true = no transformation)"text html":true,// Evaluate text as a json expression"text json":jQuery.parseJSON,// Parse text as xml"text xml":jQuery.parseXML}
,// For options that shouldn't be deep extended:// you can add your own custom options here if// and when you create one that shouldn't be// deep extended (see ajaxExtend)flatOptions:{
url:true,context:true}
}
,// Creates a full fledged settings object into target// with both ajaxSettings and settings fields.// If target is omitted,writes into ajaxSettings.ajaxSetup:function( target,settings ){
return settings ?// Building a settings objectajaxExtend( ajaxExtend( target,jQuery.ajaxSettings ),settings ):// Extending ajaxSettingsajaxExtend( jQuery.ajaxSettings,target );
}
,ajaxPrefilter:addToPrefiltersOrTransports( prefilters ),ajaxTransport:addToPrefiltersOrTransports( transports ),// Main methodajax:function( url,options ){
// If url is an object,simulate pre-1.5 signatureif ( typeof url === "object" ){
options = url;
url = undefined;
}
// Force options to be an objectoptions = options ||{
}
;
var // Cross-domain detection varsparts,// Loop variablei,// URL without anti-cache paramcacheURL,// Response headers as stringresponseHeadersString,// timeout handletimeoutTimer,// To know if global events are to be dispatchedfireGlobals,transport,// Response headersresponseHeaders,// Create the final options objects = jQuery.ajaxSetup({
}
,options ),// Callbacks contextcallbackContext = s.context || s,// Context for global events is callbackContext if it is a DOM node or jQuery collectionglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?jQuery( callbackContext ):jQuery.event,// Deferredsdeferred = jQuery.Deferred(),completeDeferred = jQuery.Callbacks("once memory"),// Status-dependent callbacksstatusCode = s.statusCode ||{
}
,// Headers (they are sent all at once)requestHeaders ={
}
,requestHeadersNames ={
}
,// The jqXHR statestate = 0,// Default abort messagestrAbort = "canceled",// Fake xhrjqXHR ={
readyState:0,// Builds headers hashtable if neededgetResponseHeader:function( key ){
var match;
if ( state === 2 ){
if ( !responseHeaders ){
responseHeaders ={
}
;
while ( (match = rheaders.exec( responseHeadersString )) ){
responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
}
}
match = responseHeaders[ key.toLowerCase() ];
}
return match == null ? null:match;
}
,// Raw stringgetAllResponseHeaders:function(){
return state === 2 ? responseHeadersString:null;
}
,// Caches the headersetRequestHeader:function( name,value ){
var lname = name.toLowerCase();
if ( !state ){
name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
requestHeaders[ name ] = value;
}
return this;
}
,// Overrides response content-type headeroverrideMimeType:function( type ){
if ( !state ){
s.mimeType = type;
}
return this;
}
,// Status-dependent callbacksstatusCode:function( map ){
var code;
if ( map ){
if ( state < 2 ){
for ( code in map ){
// Lazy-add the new callback in a way that preserves old onesstatusCode[ code ] = [ statusCode[ code ],map[ code ] ];
}
}
else{
// Execute the appropriate callbacksjqXHR.always( map[ jqXHR.status ] );
}
}
return this;
}
,// Cancel the requestabort:function( statusText ){
var finalText = statusText || strAbort;
if ( transport ){
transport.abort( finalText );
}
done( 0,finalText );
return this;
}
}
;
// Attach deferredsdeferred.promise( jqXHR ).complete = completeDeferred.add;
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
// Remove hash character (#7531:and string promotion)// Add protocol if not provided (#5866:IE7 issue with protocol-less urls)// Handle falsy url in the settings object (#10093:consistency with old signature)// We also use the url parameter if availables.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash,"" ).replace( rprotocol,ajaxLocParts[ 1 ] + "//" );
// Alias method option to type as per ticket #12004s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes lists.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
// A cross-domain request is in order when we have a protocol:host:port mismatchif ( s.crossDomain == null ){
parts = rurl.exec( s.url.toLowerCase() );
s.crossDomain = !!( parts &&( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80:443 ) ) !=( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80:443 ) ) ));
}
// Convert data if not already a stringif ( s.data && s.processData && typeof s.data !== "string" ){
s.data = jQuery.param( s.data,s.traditional );
}
// Apply prefiltersinspectPrefiltersOrTransports( prefilters,s,options,jqXHR );
// If request was aborted inside a prefilter,stop thereif ( state === 2 ){
return jqXHR;
}
// We can fire global events as of now if asked tofireGlobals = s.global;
// Watch for a new set of requestsif ( fireGlobals && jQuery.active++ === 0 ){
jQuery.event.trigger("ajaxStart");
}
// Uppercase the types.type = s.type.toUpperCase();
// Determine if request has contents.hasContent = !rnoContent.test( s.type );
// Save the URL in case we're toying with the If-Modified-Since// and/or If-None-Match header later oncacheURL = s.url;
// More options handling for requests with no contentif ( !s.hasContent ){
// If data is available,append data to urlif ( s.data ){
cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&":"?" ) + s.data );
// #9682:remove data so that it's not used in an eventual retrydelete s.data;
}
// Add anti-cache in url if neededif ( s.cache === false ){
s.url = rts.test( cacheURL ) ?// If there is already a '_' parameter,set its valuecacheURL.replace( rts,"$1_=" + ajax_nonce++ ):// Otherwise add one to the endcacheURL + ( ajax_rquery.test( cacheURL ) ? "&":"?" ) + "_=" + ajax_nonce++;
}
}
// Set the If-Modified-Since and/or If-None-Match header,if in ifModified mode.if ( s.ifModified ){
if ( jQuery.lastModified[ cacheURL ] ){
jqXHR.setRequestHeader( "If-Modified-Since",jQuery.lastModified[ cacheURL ] );
}
if ( jQuery.etag[ cacheURL ] ){
jqXHR.setRequestHeader( "If-None-Match",jQuery.etag[ cacheURL ] );
}
}
// Set the correct header,if data is being sentif ( s.data && s.hasContent && s.contentType !== false || options.contentType ){
jqXHR.setRequestHeader( "Content-Type",s.contentType );
}
// Set the Accepts header for the server,depending on the dataTypejqXHR.setRequestHeader("Accept",s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? "," + allTypes + ";
q=0.01":"" ):s.accepts[ "*" ]);
// Check for headers optionfor ( i in s.headers ){
jqXHR.setRequestHeader( i,s.headers[ i ] );
}
// Allow custom headers/mimetypes and early abortif ( s.beforeSend && ( s.beforeSend.call( callbackContext,jqXHR,s ) === false || state === 2 ) ){
// Abort if not done already and returnreturn jqXHR.abort();
}
// aborting is no longer a cancellationstrAbort = "abort";
// Install callbacks on deferredsfor ( i in{
success:1,error:1,complete:1}
){
jqXHR[ i ]( s[ i ] );
}
// Get transporttransport = inspectPrefiltersOrTransports( transports,s,options,jqXHR );
// If no transport,we auto-abortif ( !transport ){
done( -1,"No Transport" );
}
else{
jqXHR.readyState = 1;
// Send global eventif ( fireGlobals ){
globalEventContext.trigger( "ajaxSend",[ jqXHR,s ] );
}
// Timeoutif ( s.async && s.timeout > 0 ){
timeoutTimer = setTimeout(function(){
jqXHR.abort("timeout");
}
,s.timeout );
}
try{
state = 1;
transport.send( requestHeaders,done );
}
catch ( e ){
// Propagate exception as error if not doneif ( state < 2 ){
done( -1,e );
// Simply rethrow otherwise}
else{
throw e;
}
}
}
// Callback for when everything is donefunction done( status,nativeStatusText,responses,headers ){
var isSuccess,success,error,response,modified,statusText = nativeStatusText;
// Called onceif ( state === 2 ){
return;
}
// State is "done" nowstate = 2;
// Clear timeout if it existsif ( timeoutTimer ){
clearTimeout( timeoutTimer );
}
// Dereference transport for early garbage collection// (no matter how long the jqXHR object will be used)transport = undefined;
// Cache response headersresponseHeadersString = headers || "";
// Set readyStatejqXHR.readyState = status > 0 ? 4:0;
// Get response dataif ( responses ){
response = ajaxHandleResponses( s,jqXHR,responses );
}
// If successful,handle type chainingif ( status >= 200 && status < 300 || status === 304 ){
// Set the If-Modified-Since and/or If-None-Match header,if in ifModified mode.if ( s.ifModified ){
modified = jqXHR.getResponseHeader("Last-Modified");
if ( modified ){
jQuery.lastModified[ cacheURL ] = modified;
}
modified = jqXHR.getResponseHeader("etag");
if ( modified ){
jQuery.etag[ cacheURL ] = modified;
}
}
// if no contentif ( status === 204 ){
isSuccess = true;
statusText = "nocontent";
// if not modified}
else if ( status === 304 ){
isSuccess = true;
statusText = "notmodified";
// If we have data,let's convert it}
else{
isSuccess = ajaxConvert( s,response );
statusText = isSuccess.state;
success = isSuccess.data;
error = isSuccess.error;
isSuccess = !error;
}
}
else{
// We extract error from statusText// then normalize statusText and status for non-abortserror = statusText;
if ( status || !statusText ){
statusText = "error";
if ( status < 0 ){
status = 0;
}
}
}
// Set data for the fake xhr objectjqXHR.status = status;
jqXHR.statusText = ( nativeStatusText || statusText ) + "";
// Success/Errorif ( isSuccess ){
deferred.resolveWith( callbackContext,[ success,statusText,jqXHR ] );
}
else{
deferred.rejectWith( callbackContext,[ jqXHR,statusText,error ] );
}
// Status-dependent callbacksjqXHR.statusCode( statusCode );
statusCode = undefined;
if ( fireGlobals ){
globalEventContext.trigger( isSuccess ? "ajaxSuccess":"ajaxError",[ jqXHR,s,isSuccess ? success:error ] );
}
// CompletecompleteDeferred.fireWith( callbackContext,[ jqXHR,statusText ] );
if ( fireGlobals ){
globalEventContext.trigger( "ajaxComplete",[ jqXHR,s ] );
// Handle the global AJAX counterif ( !( --jQuery.active ) ){
jQuery.event.trigger("ajaxStop");
}
}
}
return jqXHR;
}
,getScript:function( url,callback ){
return jQuery.get( url,undefined,callback,"script" );
}
,getJSON:function( url,data,callback ){
return jQuery.get( url,data,callback,"json" );
}
}
);
/* Handles responses to an ajax request:* - sets all responseXXX fields accordingly * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */
function ajaxHandleResponses( s,jqXHR,responses ){
var firstDataType,ct,finalDataType,type,contents = s.contents,dataTypes = s.dataTypes,responseFields = s.responseFields;
// Fill responseXXX fieldsfor ( type in responseFields ){
if ( type in responses ){
jqXHR[ responseFields[type] ] = responses[ type ];
}
}
// Remove auto dataType and get content-type in the processwhile( dataTypes[ 0 ] === "*" ){
dataTypes.shift();
if ( ct === undefined ){
ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
}
}
// Check if we're dealing with a known content-typeif ( ct ){
for ( type in contents ){
if ( contents[ type ] && contents[ type ].test( ct ) ){
dataTypes.unshift( type );
break;
}
}
}
// Check to see if we have a response for the expected dataTypeif ( dataTypes[ 0 ] in responses ){
finalDataType = dataTypes[ 0 ];
}
else{
// Try convertible dataTypesfor ( type in responses ){
if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ){
finalDataType = type;
break;
}
if ( !firstDataType ){
firstDataType = type;
}
}
// Or just use first onefinalDataType = finalDataType || firstDataType;
}
// If we found a dataType// We add the dataType to the list if needed// and return the corresponding responseif ( finalDataType ){
if ( finalDataType !== dataTypes[ 0 ] ){
dataTypes.unshift( finalDataType );
}
return responses[ finalDataType ];
}
}
// Chain conversions given the request and the original responsefunction ajaxConvert( s,response ){
var conv2,current,conv,tmp,converters ={
}
,i = 0,// Work with a copy of dataTypes in case we need to modify it for conversiondataTypes = s.dataTypes.slice(),prev = dataTypes[ 0 ];
// Apply the dataFilter if providedif ( s.dataFilter ){
response = s.dataFilter( response,s.dataType );
}
// Create converters map with lowercased keysif ( dataTypes[ 1 ] ){
for ( conv in s.converters ){
converters[ conv.toLowerCase() ] = s.converters[ conv ];
}
}
// Convert to each sequential dataType,tolerating list modificationfor (;
(current = dataTypes[++i]);
){
// There's only work to do if current dataType is non-autoif ( current !== "*" ){
// Convert response if prev dataType is non-auto and differs from currentif ( prev !== "*" && prev !== current ){
// Seek a direct converterconv = converters[ prev + " " + current ] || converters[ "* " + current ];
// If none found,seek a pairif ( !conv ){
for ( conv2 in converters ){
// If conv2 outputs currenttmp = conv2.split(" ");
if ( tmp[ 1 ] === current ){
// If prev can be converted to accepted inputconv = converters[ prev + " " + tmp[ 0 ] ] ||converters[ "* " + tmp[ 0 ] ];
if ( conv ){
// Condense equivalence convertersif ( conv === true ){
conv = converters[ conv2 ];
// Otherwise,insert the intermediate dataType}
else if ( converters[ conv2 ] !== true ){
current = tmp[ 0 ];
dataTypes.splice( i--,0,current );
}
break;
}
}
}
}
// Apply converter (if not an equivalence)if ( conv !== true ){
// Unless errors are allowed to bubble,catch and return themif ( conv && s["throws"] ){
response = conv( response );
}
else{
try{
response = conv( response );
}
catch ( e ){
return{
state:"parsererror",error:conv ? e:"No conversion from " + prev + " to " + current}
;
}
}
}
}
// Update prev for next iterationprev = current;
}
}
return{
state:"success",data:response}
;
}
// Install script dataTypejQuery.ajaxSetup({
accepts:{
script:"text/javascript,application/javascript,application/ecmascript,application/x-ecmascript"}
,contents:{
script:/(?:java|ecma)script/}
,converters:{
"text script":function( text ){
jQuery.globalEval( text );
return text;
}
}
}
);
// Handle cache's special case and globaljQuery.ajaxPrefilter( "script",function( s ){
if ( s.cache === undefined ){
s.cache = false;
}
if ( s.crossDomain ){
s.type = "GET";
s.global = false;
}
}
);
// Bind script tag hack transportjQuery.ajaxTransport( "script",function(s){
// This transport only deals with cross domain requestsif ( s.crossDomain ){
var script,head = document.head || jQuery("head")[0] || document.documentElement;
return{
send:function( _,callback ){
script = document.createElement("script");
script.async = true;
if ( s.scriptCharset ){
script.charset = s.scriptCharset;
}
script.src = s.url;
// Attach handlers for all browsersscript.onload = script.onreadystatechange = function( _,isAbort ){
if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ){
// Handle memory leak in IEscript.onload = script.onreadystatechange = null;
// Remove the scriptif ( script.parentNode ){
script.parentNode.removeChild( script );
}
// Dereference the scriptscript = null;
// Callback if not abortif ( !isAbort ){
callback( 200,"success" );
}
}
}
;
// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending// Use native DOM manipulation to avoid our domManip AJAX trickeryhead.insertBefore( script,head.firstChild );
}
,abort:function(){
if ( script ){
script.onload( undefined,true );
}
}
}
;
}
}
);
var oldCallbacks = [],rjsonp = /(=)\?(?=&|$)|\?\?/;
// Default jsonp settingsjQuery.ajaxSetup({
jsonp:"callback",jsonpCallback:function(){
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
this[ callback ] = true;
return callback;
}
}
);
// Detect,normalize options and install callbacks for jsonp requestsjQuery.ajaxPrefilter( "json jsonp",function( s,originalSettings,jqXHR ){
var callbackName,overwritten,responseContainer,jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?"url":typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data");
// Handle iff the expected data type is "jsonp" or we have a parameter to setif ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ){
// Get callback name,remembering preexisting value associated with itcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?s.jsonpCallback():s.jsonpCallback;
// Insert callback into url or form dataif ( jsonProp ){
s[ jsonProp ] = s[ jsonProp ].replace( rjsonp,"$1" + callbackName );
}
else if ( s.jsonp !== false ){
s.url += ( ajax_rquery.test( s.url ) ? "&":"?" ) + s.jsonp + "=" + callbackName;
}
// Use data converter to retrieve json after script executions.converters["script json"] = function(){
if ( !responseContainer ){
jQuery.error( callbackName + " was not called" );
}
return responseContainer[ 0 ];
}
;
// force json dataTypes.dataTypes[ 0 ] = "json";
// Install callbackoverwritten = window[ callbackName ];
window[ callbackName ] = function(){
responseContainer = arguments;
}
;
// Clean-up function (fires after converters)jqXHR.always(function(){
// Restore preexisting valuewindow[ callbackName ] = overwritten;
// Save back as freeif ( s[ callbackName ] ){
// make sure that re-using the options doesn't screw things arounds.jsonpCallback = originalSettings.jsonpCallback;
// save the callback name for future useoldCallbacks.push( callbackName );
}
// Call if it was a function and we have a responseif ( responseContainer && jQuery.isFunction( overwritten ) ){
overwritten( responseContainer[ 0 ] );
}
responseContainer = overwritten = undefined;
}
);
// Delegate to scriptreturn "script";
}
}
);
var xhrCallbacks,xhrSupported,xhrId = 0,// #5280:Internet Explorer will keep connections alive if we don't abort on unloadxhrOnUnloadAbort = window.ActiveXObject && function(){
// Abort all pending requestsvar key;
for ( key in xhrCallbacks ){
xhrCallbacks[ key ]( undefined,true );
}
}
;
// Functions to create xhrsfunction createStandardXHR(){
try{
return new window.XMLHttpRequest();
}
catch( e ){
}
}
function createActiveXHR(){
try{
return new window.ActiveXObject("Microsoft.XMLHTTP");
}
catch( e ){
}
}
// Create the request object// (This is still attached to ajaxSettings for backward compatibility)jQuery.ajaxSettings.xhr = window.ActiveXObject ?/* Microsoft failed to properly * implement the XMLHttpRequest in IE7 (can't request local files),* so we use the ActiveXObject when it is available * Additionally XMLHttpRequest can be disabled in IE7/IE8 so * we need a fallback. */
function(){
return !this.isLocal && createStandardXHR() || createActiveXHR();
}
:// For all other browsers,use the standard XMLHttpRequest objectcreateStandardXHR;
// Determine support propertiesxhrSupported = jQuery.ajaxSettings.xhr();
jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
xhrSupported = jQuery.support.ajax = !!xhrSupported;
// Create transport if the browser can provide an xhrif ( xhrSupported ){
jQuery.ajaxTransport(function( s ){
// Cross domain only allowed if supported through XMLHttpRequestif ( !s.crossDomain || jQuery.support.cors ){
var callback;
return{
send:function( headers,complete ){
// Get a new xhrvar handle,i,xhr = s.xhr();
// Open the socket// Passing null username,generates a login popup on Opera (#2865)if ( s.username ){
xhr.open( s.type,s.url,s.async,s.username,s.password );
}
else{
xhr.open( s.type,s.url,s.async );
}
// Apply custom fields if providedif ( s.xhrFields ){
for ( i in s.xhrFields ){
xhr[ i ] = s.xhrFields[ i ];
}
}
// Override mime type if neededif ( s.mimeType && xhr.overrideMimeType ){
xhr.overrideMimeType( s.mimeType );
}
// X-Requested-With header// For cross-domain requests,seeing as conditions for a preflight are// akin to a jigsaw puzzle,we simply never set it to be sure.// (it can always be set on a per-request basis or even using ajaxSetup)// For same-domain requests,won't change header if already provided.if ( !s.crossDomain && !headers["X-Requested-With"] ){
headers["X-Requested-With"] = "XMLHttpRequest";
}
// Need an extra try/catch for cross domain requests in Firefox 3try{
for ( i in headers ){
xhr.setRequestHeader( i,headers[ i ] );
}
}
catch( err ){
}
// Do send the request// This may raise an exception which is actually// handled in jQuery.ajax (so no try/catch here)xhr.send( ( s.hasContent && s.data ) || null );
// Listenercallback = function( _,isAbort ){
var status,responseHeaders,statusText,responses;
// Firefox throws exceptions when accessing properties// of an xhr when a network error occurred// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)try{
// Was never called and is aborted or completeif ( callback && ( isAbort || xhr.readyState === 4 ) ){
// Only called oncecallback = undefined;
// Do not keep as active anymoreif ( handle ){
xhr.onreadystatechange = jQuery.noop;
if ( xhrOnUnloadAbort ){
delete xhrCallbacks[ handle ];
}
}
// If it's an abortif ( isAbort ){
// Abort it manually if neededif ( xhr.readyState !== 4 ){
xhr.abort();
}
}
else{
responses ={
}
;
status = xhr.status;
responseHeaders = xhr.getAllResponseHeaders();
// When requesting binary data,IE6-9 will throw an exception// on any attempt to access responseText (#11426)if ( typeof xhr.responseText === "string" ){
responses.text = xhr.responseText;
}
// Firefox throws an exception when accessing// statusText for faulty cross-domain requeststry{
statusText = xhr.statusText;
}
catch( e ){
// We normalize with Webkit giving an empty statusTextstatusText = "";
}
// Filter status for non standard behaviors// If the request is local and we have data:assume a success// (success with no data won't get notified,that's the best we// can do given current implementations)if ( !status && s.isLocal && !s.crossDomain ){
status = responses.text ? 200:404;
// IE - #1450:sometimes returns 1223 when it should be 204}
else if ( status === 1223 ){
status = 204;
}
}
}
}
catch( firefoxAccessException ){
if ( !isAbort ){
complete( -1,firefoxAccessException );
}
}
// Call complete if neededif ( responses ){
complete( status,statusText,responses,responseHeaders );
}
}
;
if ( !s.async ){
// if we're in sync mode we fire the callbackcallback();
}
else if ( xhr.readyState === 4 ){
// (IE6 & IE7) if it's in cache and has been// retrieved directly we need to fire the callbacksetTimeout( callback );
}
else{
handle = ++xhrId;
if ( xhrOnUnloadAbort ){
// Create the active xhrs callbacks list if needed// and attach the unload handlerif ( !xhrCallbacks ){
xhrCallbacks ={
}
;
jQuery( window ).unload( xhrOnUnloadAbort );
}
// Add to list of active xhrs callbacksxhrCallbacks[ handle ] = callback;
}
xhr.onreadystatechange = callback;
}
}
,abort:function(){
if ( callback ){
callback( undefined,true );
}
}
}
;
}
}
);
}
var fxNow,timerId,rfxtypes = /^(?:toggle|show|hide)$/,rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$","i" ),rrun = /queueHooks$/,animationPrefilters = [ defaultPrefilter ],tweeners ={
"*":[function( prop,value ){
var end,unit,tween = this.createTween( prop,value ),parts = rfxnum.exec( value ),target = tween.cur(),start = +target || 0,scale = 1,maxIterations = 20;
if ( parts ){
end = +parts[2];
unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "":"px" );
// We need to compute starting valueif ( unit !== "px" && start ){
// Iteratively approximate from a nonzero starting point// Prefer the current property,because this process will be trivial if it uses the same units// Fallback to end or a simple constantstart = jQuery.css( tween.elem,prop,true ) || end || 1;
do{
// If previous iteration zeroed out,double until we get *something*/
/ Use a string for doubling factor so we don't accidentally see scale as unchanged belowscale = scale || ".5";
// Adjust and applystart = start / scale;
jQuery.style( tween.elem,prop,start + unit );
// Update scale,tolerating zero or NaN from tween.cur()// And breaking the loop if scale is unchanged or perfect,or if we've just had enough}
while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
}
tween.unit = unit;
tween.start = start;
// If a +=/-= token was provided,we're doing a relative animationtween.end = parts[1] ? start + ( parts[1] + 1 ) * end:end;
}
return tween;
}
]}
;
// Animations created synchronously will run synchronouslyfunction createFxNow(){
setTimeout(function(){
fxNow = undefined;
}
);
return ( fxNow = jQuery.now() );
}
function createTweens( animation,props ){
jQuery.each( props,function( prop,value ){
var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),index = 0,length = collection.length;
for (;
index < length;
index++ ){
if ( collection[ index ].call( animation,prop,value ) ){
// we're done with this propertyreturn;
}
}
}
);
}
function Animation( elem,properties,options ){
var result,stopped,index = 0,length = animationPrefilters.length,deferred = jQuery.Deferred().always( function(){
// don't match elem in the:animated selectordelete tick.elem;
}
),tick = function(){
if ( stopped ){
return false;
}
var currentTime = fxNow || createFxNow(),remaining = Math.max( 0,animation.startTime + animation.duration - currentTime ),// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)temp = remaining / animation.duration || 0,percent = 1 - temp,index = 0,length = animation.tweens.length;
for (;
index < length;
index++ ){
animation.tweens[ index ].run( percent );
}
deferred.notifyWith( elem,[ animation,percent,remaining ]);
if ( percent < 1 && length ){
return remaining;
}
else{
deferred.resolveWith( elem,[ animation ] );
return false;
}
}
,animation = deferred.promise({
elem:elem,props:jQuery.extend({
}
,properties ),opts:jQuery.extend( true,{
specialEasing:{
}
}
,options ),originalProperties:properties,originalOptions:options,startTime:fxNow || createFxNow(),duration:options.duration,tweens:[],createTween:function( prop,end ){
var tween = jQuery.Tween( elem,animation.opts,prop,end,animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
}
,stop:function( gotoEnd ){
var index = 0,// if we are going to the end,we want to run all the tweens// otherwise we skip this partlength = gotoEnd ? animation.tweens.length:0;
if ( stopped ){
return this;
}
stopped = true;
for (;
index < length;
index++ ){
animation.tweens[ index ].run( 1 );
}
// resolve when we played the last frame// otherwise,rejectif ( gotoEnd ){
deferred.resolveWith( elem,[ animation,gotoEnd ] );
}
else{
deferred.rejectWith( elem,[ animation,gotoEnd ] );
}
return this;
}
}
),props = animation.props;
propFilter( props,animation.opts.specialEasing );
for (;
index < length;
index++ ){
result = animationPrefilters[ index ].call( animation,elem,props,animation.opts );
if ( result ){
return result;
}
}
createTweens( animation,props );
if ( jQuery.isFunction( animation.opts.start ) ){
animation.opts.start.call( elem,animation );
}
jQuery.fx.timer(jQuery.extend( tick,{
elem:elem,anim:animation,queue:animation.opts.queue}
));
// attach callbacks from optionsreturn animation.progress( animation.opts.progress ).done( animation.opts.done,animation.opts.complete ).fail( animation.opts.fail ).always( animation.opts.always );
}
function propFilter( props,specialEasing ){
var value,name,index,easing,hooks;
// camelCase,specialEasing and expand cssHook passfor ( index in props ){
name = jQuery.camelCase( index );
easing = specialEasing[ name ];
value = props[ index ];
if ( jQuery.isArray( value ) ){
easing = value[ 1 ];
value = props[ index ] = value[ 0 ];
}
if ( index !== name ){
props[ name ] = value;
delete props[ index ];
}
hooks = jQuery.cssHooks[ name ];
if ( hooks && "expand" in hooks ){
value = hooks.expand( value );
delete props[ name ];
// not quite $.extend,this wont overwrite keys already present.// also - reusing 'index' from above because we have the correct "name"for ( index in value ){
if ( !( index in props ) ){
props[ index ] = value[ index ];
specialEasing[ index ] = easing;
}
}
}
else{
specialEasing[ name ] = easing;
}
}
}
jQuery.Animation = jQuery.extend( Animation,{
tweener:function( props,callback ){
if ( jQuery.isFunction( props ) ){
callback = props;
props = [ "*" ];
}
else{
props = props.split(" ");
}
var prop,index = 0,length = props.length;
for (;
index < length;
index++ ){
prop = props[ index ];
tweeners[ prop ] = tweeners[ prop ] || [];
tweeners[ prop ].unshift( callback );
}
}
,prefilter:function( callback,prepend ){
if ( prepend ){
animationPrefilters.unshift( callback );
}
else{
animationPrefilters.push( callback );
}
}
}
);
function defaultPrefilter( elem,props,opts ){
/*jshint validthis:true */
var prop,index,length,value,dataShow,toggle,tween,hooks,oldfire,anim = this,style = elem.style,orig ={
}
,handled = [],hidden = elem.nodeType && isHidden( elem );
// handle queue:false promisesif ( !opts.queue ){
hooks = jQuery._queueHooks( elem,"fx" );
if ( hooks.unqueued == null ){
hooks.unqueued = 0;
oldfire = hooks.empty.fire;
hooks.empty.fire = function(){
if ( !hooks.unqueued ){
oldfire();
}
}
;
}
hooks.unqueued++;
anim.always(function(){
// doing this makes sure that the complete handler will be called// before this completesanim.always(function(){
hooks.unqueued--;
if ( !jQuery.queue( elem,"fx" ).length ){
hooks.empty.fire();
}
}
);
}
);
}
// height/width overflow passif ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ){
// Make sure that nothing sneaks out// Record all 3 overflow attributes because IE does not// change the overflow attribute when overflowX and// overflowY are set to the same valueopts.overflow = [ style.overflow,style.overflowX,style.overflowY ];
// Set display property to inline-block for height/width// animations on inline elements that are having width/height animatedif ( jQuery.css( elem,"display" ) === "inline" &&jQuery.css( elem,"float" ) === "none" ){
// inline-level elements accept inline-block;
// block-level elements need to be inline with layoutif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ){
style.display = "inline-block";
}
else{
style.zoom = 1;
}
}
}
if ( opts.overflow ){
style.overflow = "hidden";
if ( !jQuery.support.shrinkWrapBlocks ){
anim.always(function(){
style.overflow = opts.overflow[ 0 ];
style.overflowX = opts.overflow[ 1 ];
style.overflowY = opts.overflow[ 2 ];
}
);
}
}
// show/hide passfor ( index in props ){
value = props[ index ];
if ( rfxtypes.exec( value ) ){
delete props[ index ];
toggle = toggle || value === "toggle";
if ( value === ( hidden ? "hide":"show" ) ){
continue;
}
handled.push( index );
}
}
length = handled.length;
if ( length ){
dataShow = jQuery._data( elem,"fxshow" ) || jQuery._data( elem,"fxshow",{
}
);
if ( "hidden" in dataShow ){
hidden = dataShow.hidden;
}
// store state if its toggle - enables .stop().toggle() to "reverse"if ( toggle ){
dataShow.hidden = !hidden;
}
if ( hidden ){
jQuery( elem ).show();
}
else{
anim.done(function(){
jQuery( elem ).hide();
}
);
}
anim.done(function(){
var prop;
jQuery._removeData( elem,"fxshow" );
for ( prop in orig ){
jQuery.style( elem,prop,orig[ prop ] );
}
}
);
for ( index = 0;
index < length;
index++ ){
prop = handled[ index ];
tween = anim.createTween( prop,hidden ? dataShow[ prop ]:0 );
orig[ prop ] = dataShow[ prop ] || jQuery.style( elem,prop );
if ( !( prop in dataShow ) ){
dataShow[ prop ] = tween.start;
if ( hidden ){
tween.end = tween.start;
tween.start = prop === "width" || prop === "height" ? 1:0;
}
}
}
}
}
function Tween( elem,options,prop,end,easing ){
return new Tween.prototype.init( elem,options,prop,end,easing );
}
jQuery.Tween = Tween;
Tween.prototype ={
constructor:Tween,init:function( elem,options,prop,end,easing,unit ){
this.elem = elem;
this.prop = prop;
this.easing = easing || "swing";
this.options = options;
this.start = this.now = this.cur();
this.end = end;
this.unit = unit || ( jQuery.cssNumber[ prop ] ? "":"px" );
}
,cur:function(){
var hooks = Tween.propHooks[ this.prop ];
return hooks && hooks.get ?hooks.get( this ):Tween.propHooks._default.get( this );
}
,run:function( percent ){
var eased,hooks = Tween.propHooks[ this.prop ];
if ( this.options.duration ){
this.pos = eased = jQuery.easing[ this.easing ](percent,this.options.duration * percent,0,1,this.options.duration);
}
else{
this.pos = eased = percent;
}
this.now = ( this.end - this.start ) * eased + this.start;
if ( this.options.step ){
this.options.step.call( this.elem,this.now,this );
}
if ( hooks && hooks.set ){
hooks.set( this );
}
else{
Tween.propHooks._default.set( this );
}
return this;
}
}
;
Tween.prototype.init.prototype = Tween.prototype;
Tween.propHooks ={
_default:{
get:function( tween ){
var result;
if ( tween.elem[ tween.prop ] != null &&(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ){
return tween.elem[ tween.prop ];
}
// passing an empty string as a 3rd parameter to .css will automatically// attempt a parseFloat and fallback to a string if the parse fails// so,simple values such as "10px" are parsed to Float.// complex values such as "rotate(1rad)" are returned as is.result = jQuery.css( tween.elem,tween.prop,"" );
// Empty strings,null,undefined and "auto" are converted to 0.return !result || result === "auto" ? 0:result;
}
,set:function( tween ){
// use step hook for back compat - use cssHook if its there - use .style if its// available and use plain properties where availableif ( jQuery.fx.step[ tween.prop ] ){
jQuery.fx.step[ tween.prop ]( tween );
}
else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ){
jQuery.style( tween.elem,tween.prop,tween.now + tween.unit );
}
else{
tween.elem[ tween.prop ] = tween.now;
}
}
}
}
;
// Remove in 2.0 - this supports IE8's panic based approach// to setting things on disconnected nodesTween.propHooks.scrollTop = Tween.propHooks.scrollLeft ={
set:function( tween ){
if ( tween.elem.nodeType && tween.elem.parentNode ){
tween.elem[ tween.prop ] = tween.now;
}
}
}
;
jQuery.each([ "toggle","show","hide" ],function( i,name ){
var cssFn = jQuery.fn[ name ];
jQuery.fn[ name ] = function( speed,easing,callback ){
return speed == null || typeof speed === "boolean" ?cssFn.apply( this,arguments ):this.animate( genFx( name,true ),speed,easing,callback );
}
;
}
);
jQuery.fn.extend({
fadeTo:function( speed,to,easing,callback ){
// show any hidden elements after setting opacity to 0return this.filter( isHidden ).css( "opacity",0 ).show()// animate to the value specified.end().animate({
opacity:to}
,speed,easing,callback );
}
,animate:function( prop,speed,easing,callback ){
var empty = jQuery.isEmptyObject( prop ),optall = jQuery.speed( speed,easing,callback ),doAnimation = function(){
// Operate on a copy of prop so per-property easing won't be lostvar anim = Animation( this,jQuery.extend({
}
,prop ),optall );
doAnimation.finish = function(){
anim.stop( true );
}
;
// Empty animations,or finishing resolves immediatelyif ( empty || jQuery._data( this,"finish" ) ){
anim.stop( true );
}
}
;
doAnimation.finish = doAnimation;
return empty || optall.queue === false ?this.each( doAnimation ):this.queue( optall.queue,doAnimation );
}
,stop:function( type,clearQueue,gotoEnd ){
var stopQueue = function( hooks ){
var stop = hooks.stop;
delete hooks.stop;
stop( gotoEnd );
}
;
if ( typeof type !== "string" ){
gotoEnd = clearQueue;
clearQueue = type;
type = undefined;
}
if ( clearQueue && type !== false ){
this.queue( type || "fx",[] );
}
return this.each(function(){
var dequeue = true,index = type != null && type + "queueHooks",timers = jQuery.timers,data = jQuery._data( this );
if ( index ){
if ( data[ index ] && data[ index ].stop ){
stopQueue( data[ index ] );
}
}
else{
for ( index in data ){
if ( data[ index ] && data[ index ].stop && rrun.test( index ) ){
stopQueue( data[ index ] );
}
}
}
for ( index = timers.length;
index--;
){
if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ){
timers[ index ].anim.stop( gotoEnd );
dequeue = false;
timers.splice( index,1 );
}
}
// start the next in the queue if the last step wasn't forced// timers currently will call their complete callbacks,which will dequeue// but only if they were gotoEndif ( dequeue || !gotoEnd ){
jQuery.dequeue( this,type );
}
}
);
}
,finish:function( type ){
if ( type !== false ){
type = type || "fx";
}
return this.each(function(){
var index,data = jQuery._data( this ),queue = data[ type + "queue" ],hooks = data[ type + "queueHooks" ],timers = jQuery.timers,length = queue ? queue.length:0;
// enable finishing flag on private datadata.finish = true;
// empty the queue firstjQuery.queue( this,type,[] );
if ( hooks && hooks.cur && hooks.cur.finish ){
hooks.cur.finish.call( this );
}
// look for any active animations,and finish themfor ( index = timers.length;
index--;
){
if ( timers[ index ].elem === this && timers[ index ].queue === type ){
timers[ index ].anim.stop( true );
timers.splice( index,1 );
}
}
// look for any animations in the old queue and finish themfor ( index = 0;
index < length;
index++ ){
if ( queue[ index ] && queue[ index ].finish ){
queue[ index ].finish.call( this );
}
}
// turn off finishing flagdelete data.finish;
}
);
}
}
);
// Generate parameters to create a standard animationfunction genFx( type,includeWidth ){
var which,attrs ={
height:type}
,i = 0;
// if we include width,step value is 1 to do all cssExpand values,// if we don't include width,step value is 2 to skip over Left and RightincludeWidth = includeWidth? 1:0;
for(;
i < 4;
i += 2 - includeWidth ){
which = cssExpand[ i ];
attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
}
if ( includeWidth ){
attrs.opacity = attrs.width = type;
}
return attrs;
}
// Generate shortcuts for custom animationsjQuery.each({
slideDown:genFx("show"),slideUp:genFx("hide"),slideToggle:genFx("toggle"),fadeIn:{
opacity:"show"}
,fadeOut:{
opacity:"hide"}
,fadeToggle:{
opacity:"toggle"}
}
,function( name,props ){
jQuery.fn[ name ] = function( speed,easing,callback ){
return this.animate( props,speed,easing,callback );
}
;
}
);
jQuery.speed = function( speed,easing,fn ){
var opt = speed && typeof speed === "object" ? jQuery.extend({
}
,speed ):{
complete:fn || !fn && easing ||jQuery.isFunction( speed ) && speed,duration:speed,easing:fn && easing || easing && !jQuery.isFunction( easing ) && easing}
;
opt.duration = jQuery.fx.off ? 0:typeof opt.duration === "number" ? opt.duration:opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ]:jQuery.fx.speeds._default;
// normalize opt.queue - true/undefined/null -> "fx"if ( opt.queue == null || opt.queue === true ){
opt.queue = "fx";
}
// Queueingopt.old = opt.complete;
opt.complete = function(){
if ( jQuery.isFunction( opt.old ) ){
opt.old.call( this );
}
if ( opt.queue ){
jQuery.dequeue( this,opt.queue );
}
}
;
return opt;
}
;
jQuery.easing ={
linear:function( p ){
return p;
}
,swing:function( p ){
return 0.5 - Math.cos( p*Math.PI ) / 2;
}
}
;
jQuery.timers = [];
jQuery.fx = Tween.prototype.init;
jQuery.fx.tick = function(){
var timer,timers = jQuery.timers,i = 0;
fxNow = jQuery.now();
for (;
i < timers.length;
i++ ){
timer = timers[ i ];
// Checks the timer has not already been removedif ( !timer() && timers[ i ] === timer ){
timers.splice( i--,1 );
}
}
if ( !timers.length ){
jQuery.fx.stop();
}
fxNow = undefined;
}
;
jQuery.fx.timer = function( timer ){
if ( timer() && jQuery.timers.push( timer ) ){
jQuery.fx.start();
}
}
;
jQuery.fx.interval = 13;
jQuery.fx.start = function(){
if ( !timerId ){
timerId = setInterval( jQuery.fx.tick,jQuery.fx.interval );
}
}
;
jQuery.fx.stop = function(){
clearInterval( timerId );
timerId = null;
}
;
jQuery.fx.speeds ={
slow:600,fast:200,// Default speed_default:400}
;
// Back Compat <1.8 extension pointjQuery.fx.step ={
}
;
if ( jQuery.expr && jQuery.expr.filters ){
jQuery.expr.filters.animated = function( elem ){
return jQuery.grep(jQuery.timers,function( fn ){
return elem === fn.elem;
}
).length;
}
;
}
jQuery.fn.offset = function( options ){
if ( arguments.length ){
return options === undefined ?this:this.each(function( i ){
jQuery.offset.setOffset( this,options,i );
}
);
}
var docElem,win,box ={
top:0,left:0}
,elem = this[ 0 ],doc = elem && elem.ownerDocument;
if ( !doc ){
return;
}
docElem = doc.documentElement;
// Make sure it's not a disconnected DOM nodeif ( !jQuery.contains( docElem,elem ) ){
return box;
}
// If we don't have gBCR,just use 0,0 rather than error// BlackBerry 5,iOS 3 (original iPhone)if ( typeof elem.getBoundingClientRect !== core_strundefined ){
box = elem.getBoundingClientRect();
}
win = getWindow( doc );
return{
top:box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),left:box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )}
;
}
;
jQuery.offset ={
setOffset:function( elem,options,i ){
var position = jQuery.css( elem,"position" );
// set position first,in-case top/left are set even on static elemif ( position === "static" ){
elem.style.position = "relative";
}
var curElem = jQuery( elem ),curOffset = curElem.offset(),curCSSTop = jQuery.css( elem,"top" ),curCSSLeft = jQuery.css( elem,"left" ),calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto",[curCSSTop,curCSSLeft]) > -1,props ={
}
,curPosition ={
}
,curTop,curLeft;
// need to be able to calculate position if either top or left is auto and position is either absolute or fixedif ( calculatePosition ){
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;
}
else{
curTop = parseFloat( curCSSTop ) || 0;
curLeft = parseFloat( curCSSLeft ) || 0;
}
if ( jQuery.isFunction( options ) ){
options = options.call( elem,i,curOffset );
}
if ( options.top != null ){
props.top = ( options.top - curOffset.top ) + curTop;
}
if ( options.left != null ){
props.left = ( options.left - curOffset.left ) + curLeft;
}
if ( "using" in options ){
options.using.call( elem,props );
}
else{
curElem.css( props );
}
}
}
;
jQuery.fn.extend({
position:function(){
if ( !this[ 0 ] ){
return;
}
var offsetParent,offset,parentOffset ={
top:0,left:0}
,elem = this[ 0 ];
// fixed elements are offset from window (parentOffset ={
top:0,left:0}
,because it is it's only offset parentif ( jQuery.css( elem,"position" ) === "fixed" ){
// we assume that getBoundingClientRect is available when computed position is fixedoffset = elem.getBoundingClientRect();
}
else{
// Get *real* offsetParentoffsetParent = this.offsetParent();
// Get correct offsetsoffset = this.offset();
if ( !jQuery.nodeName( offsetParent[ 0 ],"html" ) ){
parentOffset = offsetParent.offset();
}
// Add offsetParent bordersparentOffset.top += jQuery.css( offsetParent[ 0 ],"borderTopWidth",true );
parentOffset.left += jQuery.css( offsetParent[ 0 ],"borderLeftWidth",true );
}
// Subtract parent offsets and element margins// note:when an element has margin:auto the offsetLeft and marginLeft// are the same in Safari causing offset.left to incorrectly be 0return{
top:offset.top - parentOffset.top - jQuery.css( elem,"marginTop",true ),left:offset.left - parentOffset.left - jQuery.css( elem,"marginLeft",true)}
;
}
,offsetParent:function(){
return this.map(function(){
var offsetParent = this.offsetParent || document.documentElement;
while ( offsetParent && ( !jQuery.nodeName( offsetParent,"html" ) && jQuery.css( offsetParent,"position") === "static" ) ){
offsetParent = offsetParent.offsetParent;
}
return offsetParent || document.documentElement;
}
);
}
}
);
// Create scrollLeft and scrollTop methodsjQuery.each({
scrollLeft:"pageXOffset",scrollTop:"pageYOffset"}
,function( method,prop ){
var top = /Y/.test( prop );
jQuery.fn[ method ] = function( val ){
return jQuery.access( this,function( elem,method,val ){
var win = getWindow( elem );
if ( val === undefined ){
return win ? (prop in win) ? win[ prop ]:win.document.documentElement[ method ]:elem[ method ];
}
if ( win ){
win.scrollTo(!top ? val:jQuery( win ).scrollLeft(),top ? val:jQuery( win ).scrollTop());
}
else{
elem[ method ] = val;
}
}
,method,val,arguments.length,null );
}
;
}
);
function getWindow( elem ){
return jQuery.isWindow( elem ) ?elem:elem.nodeType === 9 ?elem.defaultView || elem.parentWindow:false;
}
// Create innerHeight,innerWidth,height,width,outerHeight and outerWidth methodsjQuery.each({
Height:"height",Width:"width"}
,function( name,type ){
jQuery.each({
padding:"inner" + name,content:type,"":"outer" + name}
,function( defaultExtra,funcName ){
// margin is only for outerHeight,outerWidthjQuery.fn[ funcName ] = function( margin,value ){
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),extra = defaultExtra || ( margin === true || value === true ? "margin":"border" );
return jQuery.access( this,function( elem,type,value ){
var doc;
if ( jQuery.isWindow( elem ) ){
// As of 5/8/2012 this will yield incorrect results for Mobile Safari,but there// isn't a whole lot we can do. See pull request at this URL for discussion:// https://github.com/jquery/jquery/pull/764return elem.document.documentElement[ "client" + name ];
}
// Get document width or heightif ( elem.nodeType === 9 ){
doc = elem.documentElement;
// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],whichever is greatest// unfortunately,this causes bug #3838 in IE6/8 only,but there is currently no good,small way to fix it.return Math.max(elem.body[ "scroll" + name ],doc[ "scroll" + name ],elem.body[ "offset" + name ],doc[ "offset" + name ],doc[ "client" + name ]);
}
return value === undefined ?// Get width or height on the element,requesting but not forcing parseFloatjQuery.css( elem,type,extra ):// Set width or height on the elementjQuery.style( elem,type,value,extra );
}
,type,chainable ? margin:undefined,chainable,null );
}
;
}
);
}
);
// Limit scope pollution from any deprecated API// (function(){
//}
)();
// Expose jQuery to the global objectwindow.jQuery = window.$ = jQuery;
// Expose jQuery as an AMD module,but only for AMD loaders that// understand the issues with loading multiple versions of jQuery// in a page that all might call define(). The loader will indicate// they have special allowances for multiple jQuery versions by// specifying define.amd.jQuery = true. Register as a named module,// since jQuery can be concatenated with other files that may use define,// but not use a proper concatenation script that understands anonymous// AMD modules. A named AMD is safest and most robust way to register.// Lowercase jquery is used because AMD module names are derived from// file names,and jQuery is normally delivered in a lowercase file name.// Do this after creating the global so that if an AMD module wants to call// noConflict to hide this version of jQuery,it will work.if ( typeof define === "function" && define.amd && define.amd.jQuery ){
define( "jquery",[],function (){
return jQuery;
}
);
}
}
)( window );