/*!
* jQuery JavaScript Library v1.6.4
* http://jquery.com/
*
* Copyright 2011, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Mon Sep 12 18:54:48 2011 -0400
*/
(function (window, undefined) {
// Use the correct document accordingly with window argument (sandbox)
var document = window.document,
navigator = window.navigator,
location = window.location;
var jQuery = (function () {
// Define a local copy of jQuery
var jQuery = function (selector, context) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init(selector, context, rootjQuery);
},
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
// A central reference to the root jQuery(document)
rootjQuery,
// A simple way to check for HTML strings or ID strings
// Prioritize #id over to avoid XSS via location.hash (#9521)
quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
// Check if a string has a non-whitespace character in it
rnotwhite = /\S/,
// Used for trimming whitespace
trimLeft = /^\s+/,
trimRight = /\s+$/,
// Check for digits
rdigit = /\d/,
// Match a standalone tag
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
// The body element only exists once, optimize finding it
if (selector === "body" && !context && document.body) {
this.context = document;
this[0] = document.body;
this.selector = selector;
this.length = 1;
return this;
}
// Handle HTML strings
if (typeof selector === "string") {
// Are we dealing with HTML string or an ID?
if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
// Assume that strings that start and end with <> are HTML and skip the regex check
match = [null, selector, null];
} else {
match = quickExpr.exec(selector);
}
// Verify a match, and that no context was specified for #id
if (match && (match[1] || !context)) {
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
if (elem && elem.parentNode) {
// Handle the case where IE and Opera return items
// by name instead of ID
if (elem.id !== match[2]) {
return rootjQuery.find(selector);
}
// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
}
// The current version of jQuery being used
jquery: "1.6.4",
// The default length of a jQuery object is 0
length: 0,
// The number of elements contained in the matched element set
size: function () {
return this.length;
},
toArray: function () {
return slice.call(this, 0);
},
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function (num) {
return num == null ?
// Return a 'clean' array
this.toArray() :
// Return just the object
(num < 0 ? this[this.length + num] : this[num]);
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function (elems, name, selector) {
// Build a new jQuery matched element set
var ret = this.constructor();
if (jQuery.isArray(elems)) {
push.apply(ret, elems);
} else {
jQuery.merge(ret, elems);
}
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
// Return the newly-formed element set
return ret;
},
// Execute a callback for every element in the matched set.
// (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) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.done(fn);
return this;
},
eq: function (i) {
return i === -1 ?
this.slice(i) :
this.slice(i, +i + 1);
},
first: function () {
return this.eq(0);
},
last: function () {
return this.eq(-1);
},
slice: function () {
return this.pushStack(slice.apply(this, arguments),
"slice", slice.call(arguments).join(","));
},
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: push,
sort: [].sort,
splice: [].splice
};
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function () {
var options, name, src, copy, copyIsArray, clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;
// Handle a deep copy situation
if (typeof target === "boolean") {
deep = target;
target = arguments[1] || {};
// skip the boolean and the target
i = 2;
}
// Handle case when target is a string or something (possible in deep copy)
if (typeof target !== "object" && !jQuery.isFunction(target)) {
target = {};
}
// extend jQuery itself if only one argument is passed
if (length === i) {
target = this;
--i;
}
for (; i < length; i++) {
// Only deal with non-null/undefined values
if ((options = arguments[i]) != null) {
// Extend the base object
for (name in options) {
src = target[name];
copy = options[name];
// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,
// A counter to track how many items to wait for before
// the ready event fires. See #6781
readyWait: 1,
// Hold (or release) the ready event
holdReady: function (hold) {
if (hold) {
jQuery.readyWait++;
} else {
jQuery.ready(true);
}
},
// Handle when the DOM is ready
ready: function (wait) {
// Either a released hold or an DOMready/load event and not yet ready
if ((wait === true && ! --jQuery.readyWait) || (wait !== true && !jQuery.isReady)) {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if (!document.body) {
return setTimeout(jQuery.ready, 1);
}
// Remember that the DOM is ready
jQuery.isReady = true;
// If a normal DOM Ready event fired, decrement, and wait if need be
if (wait !== true && --jQuery.readyWait > 0) {
return;
}
// If there are functions bound, to execute
readyList.resolveWith(document, [jQuery]);
// Trigger any bound ready events
if (jQuery.fn.trigger) {
jQuery(document).trigger("ready").unbind("ready");
}
}
},
bindReady: function () {
if (readyList) {
return;
}
readyList = jQuery._Deferred();
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if (document.readyState === "complete") {
// Handle it asynchronously to allow scripts the opportunity to delay ready
return setTimeout(jQuery.ready, 1);
}
// Mozilla, Opera and webkit nightlies currently support this event
if (document.addEventListener) {
// Use the handy event callback
document.addEventListener("DOMContentLoaded", DOMContentLoaded, false);
// A fallback to window.onload, that will always work
window.addEventListener("load", jQuery.ready, false);
// If IE event model is used
} else if (document.attachEvent) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", DOMContentLoaded);
// A fallback to window.onload, that will always work
window.attachEvent("onload", jQuery.ready);
// If IE and not a frame
// continually check to see if the document is ready
var toplevel = false;
if (document.documentElement.doScroll && toplevel) {
doScrollCheck();
}
}
},
// 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";
},
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 well
if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
return false;
}
try {
// Not own constructor property must be Object
if (obj.constructor &&
!hasOwn.call(obj, "constructor") &&
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
return false;
}
} catch (e) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
isEmptyObject: function (obj) {
for (var name in obj) {
return false;
}
return true;
},
error: function (msg) {
throw msg;
},
parseJSON: function (data) {
if (typeof data !== "string" || !data) {
return null;
}
// Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim(data);
// Attempt to parse using the native JSON parser first
if (window.JSON && window.JSON.parse) {
return window.JSON.parse(data);
}
// Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if (rvalidchars.test(data.replace(rvalidescape, "@")
.replace(rvalidtokens, "]")
.replace(rvalidbraces, ""))) {
return (new Function("return " + data))();
}
jQuery.error("Invalid JSON: " + data);
},
// Cross-browser xml parsing
parseXML: function (data) {
var xml, tmp;
try {
if (window.DOMParser) { // Standard
tmp = new DOMParser();
xml = tmp.parseFromString(data, "text/xml");
} else { // IE
xml = 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-context
globalEval: function (data) {
if (data && rnotwhite.test(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);
},
// args is for internal usage only
each: function (object, callback, args) {
var name, i = 0,
length = object.length,
isObj = length === undefined || jQuery.isFunction(object);
if (args) {
if (isObj) {
for (name in object) {
if (callback.apply(object[name], args) === false) {
break;
}
}
} else {
for (; i < length; ) {
if (callback.apply(object[i++], args) === false) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if (isObj) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break;
}
}
} else {
for (; i < length; ) {
if (callback.call(object[i], i, object[i++]) === false) {
break;
}
}
}
}
return object;
},
// Use native String.trim function wherever possible
trim: trim ?
function (text) {
return text == null ?
"" :
trim.call(text);
} :
// Otherwise use our own trimming functionality
function (text) {
return text == null ?
"" :
text.toString().replace(trimLeft, "").replace(trimRight, "");
},
// results is for internal usage only
makeArray: function (array, results) {
var ret = results || [];
if (array != null) {
// The window, strings (and functions) also have 'length'
// The extra typeof function check is to prevent crashes
// in Safari 2 (See: #3039)
// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
var type = jQuery.type(array);
if (array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow(array)) {
push.call(ret, array);
} else {
jQuery.merge(ret, array);
}
}
return ret;
},
inArray: function (elem, array) {
if (!array) {
return -1;
}
if (indexOf) {
return indexOf.call(array, elem);
}
for (var i = 0, length = array.length; i < length; i++) {
if (array[i] === elem) {
return i;
}
}
return -1;
},
merge: function (first, second) {
var i = first.length,
j = 0;
if (typeof second.length === "number") {
for (var l = second.length; j < l; j++) {
first[i++] = second[j];
}
grep: function (elems, callback, inv) {
var ret = [], retVal;
inv = !!inv;
// Go through the array, only saving the items
// that pass the validator function
for (var i = 0, length = elems.length; i < length; i++) {
retVal = !!callback(elems[i], i);
if (inv !== retVal) {
ret.push(elems[i]);
}
}
return ret;
},
// arg is for internal usage only
map: function (elems, callback, arg) {
var value, key, ret = [],
i = 0,
length = elems.length,
// jquery objects are treated as arrays
isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ((length > 0 && elems[0] && elems[length - 1]) || length === 0 || jQuery.isArray(elems));
// Go through the array, translating each of the items to their
if (isArray) {
for (; i < length; i++) {
value = callback(elems[i], i, arg);
if (value != null) {
ret[ret.length] = value;
}
}
// Go through every key on the object,
} else {
for (key in elems) {
value = callback(elems[key], key, arg);
// Flatten any nested arrays
return ret.concat.apply([], ret);
},
// A global GUID counter for objects
guid: 1,
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function (fn, context) {
if (typeof context === "string") {
var tmp = fn[context];
context = fn;
fn = tmp;
}
// Quick check to determine if target is callable, in the spec
// this throws a TypeError, but we will just return undefined.
if (!jQuery.isFunction(fn)) {
return undefined;
}
// Simulated bind
var args = slice.call(arguments, 2),
proxy = function () {
return fn.apply(context, args.concat(slice.call(arguments)));
};
// Set the guid of unique handler to the same of original handler, so it can be removed
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
return proxy;
},
// Mutifunctional method to get and set values to a collection
// The value/s can optionally be executed if it's a function
access: function (elems, key, value, exec, fn, pass) {
var length = elems.length;
// Setting many attributes
if (typeof key === "object") {
for (var k in key) {
jQuery.access(elems, k, key[k], exec, fn, value);
}
return elems;
}
// Setting one attribute
if (value !== undefined) {
// Optionally, function values get executed if exec is true
exec = !pass && exec && jQuery.isFunction(value);
for (var i = 0; i < length; i++) {
fn(elems[i], key, exec ? value.call(elems[i], i, fn(elems[i], key)) : value, pass);
}
now: function () {
return (new Date()).getTime();
},
// Use of jQuery.browser is frowned upon.
// More details: http://docs.jquery.com/Utilities/jQuery.browser
uaMatch: function (ua) {
ua = ua.toLowerCase();
var match = rwebkit.exec(ua) ||
ropera.exec(ua) ||
rmsie.exec(ua) ||
ua.indexOf("compatible") < 0 && rmozilla.exec(ua) ||
[];
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (i, name) {
class2type["[object " + name + "]"] = name.toLowerCase();
});
// Deprecated, use jQuery.browser.webkit instead
if (jQuery.browser.webkit) {
jQuery.browser.safari = true;
}
// IE doesn't match non-breaking spaces with \s
if (rnotwhite.test("\xA0")) {
trimLeft = /^[\s\xA0]+/;
trimRight = /[\s\xA0]+$/;
}
// All jQuery objects should point back to these
rootjQuery = jQuery(document);
// Cleanup functions for the document ready method
if (document.addEventListener) {
DOMContentLoaded = function () {
document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
jQuery.ready();
};
} else if (document.attachEvent) {
DOMContentLoaded = function () {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if (document.readyState === "complete") {
document.detachEvent("onreadystatechange", DOMContentLoaded);
jQuery.ready();
}
};
}
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if (jQuery.isReady) {
return;
}
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch (e) {
setTimeout(doScrollCheck, 1);
return;
}
// and execute any waiting functions
jQuery.ready();
}
return jQuery;
})();
var // Promise methods
promiseMethods = "done fail isResolved isRejected promise then always pipe".split(" "),
// Static reference to slice
sliceDeferred = [].slice;
jQuery.extend({
// Create a simple deferred (one callbacks list)
_Deferred: function () {
var // callbacks list
callbacks = [],
// stored [ context , args ]
fired,
// to avoid firing when already doing so
firing,
// flag to know if the deferred has been cancelled
cancelled,
// the deferred itself
deferred = {
// done( f1, f2, ...)
done: function () {
if (!cancelled) {
var args = arguments,
i,
length,
elem,
type,
_fired;
if (fired) {
_fired = fired;
fired = 0;
}
for (i = 0, length = args.length; i < length; i++) {
elem = args[i];
type = jQuery.type(elem);
if (type === "array") {
deferred.done.apply(deferred, elem);
} else if (type === "function") {
callbacks.push(elem);
}
}
if (_fired) {
deferred.resolveWith(_fired[0], _fired[1]);
}
}
return this;
},
// resolve with given context and args
resolveWith: function (context, args) {
if (!cancelled && !fired && !firing) {
// make sure args are available (#8421)
args = args || [];
firing = 1;
try {
while (callbacks[0]) {
callbacks.shift().apply(context, args);
}
}
finally {
fired = [context, args];
firing = 0;
}
}
return this;
},
// resolve with this as context and given arguments
resolve: function () {
deferred.resolveWith(this, arguments);
return this;
},
// Has this deferred been resolved?
isResolved: function () {
return !!(firing || fired);
},
// Full fledged deferred (two callbacks list)
Deferred: function (func) {
var deferred = jQuery._Deferred(),
failDeferred = jQuery._Deferred(),
promise;
// Add errorDeferred methods, then and promise
jQuery.extend(deferred, {
then: function (doneCallbacks, failCallbacks) {
deferred.done(doneCallbacks).fail(failCallbacks);
return this;
},
always: function () {
return deferred.done.apply(deferred, arguments).fail.apply(this, arguments);
},
fail: failDeferred.done,
rejectWith: failDeferred.resolveWith,
reject: failDeferred.resolve,
isRejected: failDeferred.isResolved,
pipe: function (fnDone, fnFail) {
return jQuery.Deferred(function (newDefer) {
jQuery.each({
done: [fnDone, "resolve"],
fail: [fnFail, "reject"]
}, function (handler, data) {
var fn = data[0],
action = data[1],
returned;
if (jQuery.isFunction(fn)) {
deferred[handler](function () {
returned = fn.apply(this, arguments);
if (returned && jQuery.isFunction(returned.promise)) {
returned.promise().then(newDefer.resolve, newDefer.reject);
} else {
newDefer[action + "With"](this === deferred ? newDefer : this, [returned]);
}
});
} else {
deferred[handler](newDefer[action]);
}
});
}).promise();
},
// Get a promise for this deferred
// If obj is provided, the promise aspect is added to the object
promise: function (obj) {
if (obj == null) {
if (promise) {
return promise;
}
promise = obj = {};
}
var i = promiseMethods.length;
while (i--) {
obj[promiseMethods[i]] = deferred[promiseMethods[i]];
}
return obj;
}
});
// Make sure only one callback list will be used
deferred.done(failDeferred.cancel).fail(deferred.cancel);
// Unexpose cancel
delete deferred.cancel;
// Call given func if any
if (func) {
func.call(deferred, deferred);
}
return deferred;
},
// Deferred helper
when: function (firstParam) {
var args = arguments,
i = 0,
length = args.length,
count = length,
deferred = length <= 1 && firstParam && jQuery.isFunction(firstParam.promise) ?
firstParam :
jQuery.Deferred();
function resolveFunc(i) {
return function (value) {
args[i] = arguments.length > 1 ? sliceDeferred.call(arguments, 0) : value;
if (!(--count)) {
// Strange bug in FF4:
// Values changed onto the arguments object sometimes end up as undefined values
// outside the $.when method. Cloning the object into a fresh array solves the issue
deferred.resolveWith(deferred, sliceDeferred.call(args, 0));
}
};
}
if (length > 1) {
for (; i < length; i++) {
if (args[i] && jQuery.isFunction(args[i].promise)) {
args[i].promise().then(resolveFunc(i), deferred.reject);
} else {
--count;
}
}
if (!count) {
deferred.resolveWith(deferred, args);
}
} else if (deferred !== firstParam) {
deferred.resolveWith(deferred, length ? [firstParam] : []);
}
return deferred.promise();
}
});
jQuery.support = (function () {
var div = document.createElement("div"),
documentElement = document.documentElement,
all,
a,
select,
opt,
input,
marginDiv,
support,
fragment,
body,
testElementParent,
testElement,
testElementStyle,
tds,
events,
eventName,
i,
isSupported;
all = div.getElementsByTagName("*");
a = div.getElementsByTagName("a")[0];
// Can't get basic test support
if (!all || !all.length || !a) {
return {};
}
// First batch of supports tests
select = document.createElement("select");
opt = select.appendChild(document.createElement("option"));
input = div.getElementsByTagName("input")[0];
support = {
// IE strips leading whitespace when .innerHTML is used
leadingWhitespace: (div.firstChild.nodeType === 3),
// Make sure that tbody elements aren't automatically inserted
// IE will insert them into empty tables
tbody: !div.getElementsByTagName("tbody").length,
// Make sure that link elements get serialized correctly by innerHTML
// This requires a wrapper element in IE
htmlSerialize: !!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 #5145
opacity: /^0.55$/.test(a.style.opacity),
// Verify style float existence
// (IE uses styleFloat instead of cssFloat)
cssFloat: !!a.style.cssFloat,
// Make sure that if no value is specified for a checkbox
// that it defaults to "on".
// (WebKit defaults to "" instead)
checkOn: (input.value === "on"),
// 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,
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
getSetAttribute: div.className !== "t",
// Will be defined later
submitBubbles: true,
changeBubbles: true,
focusinBubbles: false,
deleteExpando: true,
noCloneEvent: true,
inlineBlockNeedsLayout: false,
shrinkWrapBlocks: false,
reliableMarginRight: true
};
// Make sure checked status is properly cloned
input.checked = true;
support.noCloneChecked = input.cloneNode(true).checked;
// Make sure that the options inside disabled selects aren't marked as disabled
// (WebKit marks them as disabled)
select.disabled = true;
support.optDisabled = !opt.disabled;
// Test to see if it's possible to delete an expando from an element
// Fails in Internet Explorer
try {
delete div.test;
} catch (e) {
support.deleteExpando = false;
}
if (!div.addEventListener && div.attachEvent && div.fireEvent) {
div.attachEvent("onclick", function () {
// Cloning a node shouldn't copy over any
// bound event handlers (IE does this)
support.noCloneEvent = false;
});
div.cloneNode(true).fireEvent("onclick");
}
// Check if a radio maintains it's value
// after being appended to the DOM
input = document.createElement("input");
input.value = "t";
input.setAttribute("type", "radio");
support.radioValue = input.value === "t";
input.setAttribute("checked", "checked");
div.appendChild(input);
fragment = document.createDocumentFragment();
fragment.appendChild(div.firstChild);
// WebKit doesn't clone checked state correctly in fragments
support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
div.innerHTML = "";
// Figure out if the W3C box model works as expected
div.style.width = div.style.paddingLeft = "1px";
body = document.getElementsByTagName("body")[0];
// We use our own, invisible, body unless the body is already present
// in which case we use a div (#9239)
testElement = document.createElement(body ? "div" : "body");
testElementStyle = {
visibility: "hidden",
width: 0,
height: 0,
border: 0,
margin: 0,
background: "none"
};
if (body) {
jQuery.extend(testElementStyle, {
position: "absolute",
left: "-1000px",
top: "-1000px"
});
}
for (i in testElementStyle) {
testElement.style[i] = testElementStyle[i];
}
testElement.appendChild(div);
testElementParent = body || documentElement;
testElementParent.insertBefore(testElement, testElementParent.firstChild);
// Check if a disconnected checkbox will retain its checked
// value of true after appended to the DOM (IE6/7)
support.appendChecked = input.checked;
support.boxModel = div.offsetWidth === 2;
if ("zoom" in div.style) {
// Check if natively block-level elements act like inline-block
// elements when setting their display to 'inline' and giving
// them layout
// (IE < 8 does this)
div.style.display = "inline";
div.style.zoom = 1;
support.inlineBlockNeedsLayout = (div.offsetWidth === 2);
// Check if elements with layout shrink-wrap their children
// (IE 6 does this)
div.style.display = "";
div.innerHTML = "";
support.shrinkWrapBlocks = (div.offsetWidth !== 2);
}
div.innerHTML = "
t
";
tds = div.getElementsByTagName("td");
// 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).
// (only IE 8 fails this test)
isSupported = (tds[0].offsetHeight === 0);
// Check if empty table cells still have offsetWidth/Height
// (IE < 8 fail this test)
support.reliableHiddenOffsets = isSupported && (tds[0].offsetHeight === 0);
div.innerHTML = "";
// Check if div with explicit width and no margin-right incorrectly
// gets computed margin-right based on width of container. For more
// info see bug #3333
// Fails in WebKit before Feb 2011 nightlies
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
if (document.defaultView && document.defaultView.getComputedStyle) {
marginDiv = document.createElement("div");
marginDiv.style.width = "0";
marginDiv.style.marginRight = "0";
div.appendChild(marginDiv);
support.reliableMarginRight =
(parseInt((document.defaultView.getComputedStyle(marginDiv, null) || { marginRight: 0 }).marginRight, 10) || 0) === 0;
}
// Remove the body element we added
testElement.innerHTML = "";
testElementParent.removeChild(testElement);
// Technique from Juriy Zaytsev
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
// We only care about the case where non-standard event systems
// are used, namely in IE. Short-circuiting here helps us to
// avoid an eval call (in setAttribute) which can cause CSP
// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
if (div.attachEvent) {
for (i in {
submit: 1,
change: 1,
focusin: 1
}) {
eventName = "on" + i;
isSupported = (eventName in div);
if (!isSupported) {
div.setAttribute(eventName, "return;");
isSupported = (typeof div[eventName] === "function");
}
support[i + "Bubbles"] = isSupported;
}
}
// Null connected elements to avoid leaks in IE
testElement = fragment = select = opt = body = marginDiv = div = input = null;
return support;
})();
// Keep track of boxModel
jQuery.boxModel = jQuery.support.boxModel;
var rbrace = /^(?:\{.*\}|\[.*\])$/,
rmultiDash = /([A-Z])/g;
jQuery.extend({
cache: {},
// Please use with caution
uuid: 0,
// Unique for each copy of jQuery on the page
// Non-digits removed to match rinlinejQuery
expando: "jQuery" + (jQuery.fn.jquery + 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
},
data: function (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 boundary
isNode = elem.nodeType,
// Only DOM nodes need the global jQuery cache; JS object data is
// attached directly to the object so GC can occur automatically
cache = 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 cache
id = isNode ? elem[jQuery.expando] : elem[jQuery.expando] && jQuery.expando;
// Avoid doing any more work than we need to when trying to get data on an
// object that has no data at all
if ((!id || (pvt && id && (cache[id] && !cache[id][internalKey]))) && 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 cache
if (isNode) {
elem[jQuery.expando] = id = ++jQuery.uuid;
} else {
id = jQuery.expando;
}
}
if (!cache[id]) {
cache[id] = {};
// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
// metadata on plain JS objects when the object is serialized using
// JSON.stringify
if (!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 cache
if (typeof name === "object" || typeof name === "function") {
if (pvt) {
cache[id][internalKey] = jQuery.extend(cache[id][internalKey], name);
} else {
cache[id] = jQuery.extend(cache[id], name);
}
}
thisCache = cache[id];
// Internal jQuery data is stored in a separate object inside the object's data
// cache in order to avoid key collisions between internal data and user-defined
// data
if (pvt) {
if (!thisCache[internalKey]) {
thisCache[internalKey] = {};
}
thisCache = thisCache[internalKey];
}
if (data !== undefined) {
thisCache[jQuery.camelCase(name)] = data;
}
// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
// not attempt to inspect the internal events object using jQuery.data, as this
// internal data object is undocumented and subject to change.
if (name === "events" && !thisCache[name]) {
return thisCache[internalKey] && thisCache[internalKey].events;
}
// Check for both converted-to-camel and non-converted data property names
// If a data property was specified
if (getByName) {
// First Try to find as-is property data
ret = thisCache[name];
// Test for null|undefined property data
if (ret == null) {
// Try to find the camelCased property
ret = thisCache[jQuery.camelCase(name)];
}
} else {
ret = thisCache;
}
return ret;
},
removeData: function (elem, name, pvt /* Internal Use Only */) {
if (!jQuery.acceptData(elem)) {
return;
}
var thisCache,
// Reference to internal data cache key
internalKey = jQuery.expando,
isNode = elem.nodeType,
// See jQuery.data for more information
cache = isNode ? jQuery.cache : elem,
// See jQuery.data for more information
id = isNode ? elem[jQuery.expando] : jQuery.expando;
// If there is already no cache entry for this object, there is no
// purpose in continuing
if (!cache[id]) {
return;
}
// Support interoperable removal of hyphenated or camelcased keys
if (!thisCache[name]) {
name = jQuery.camelCase(name);
}
delete thisCache[name];
// If there is no data left in the cache, we want to continue
// and let the cache object itself get destroyed
if (!isEmptyDataObject(thisCache)) {
return;
}
}
}
// See jQuery.data for more information
if (pvt) {
delete cache[id][internalKey];
// Don't destroy the parent cache unless the internal data object
// had been the only thing left in it
if (!isEmptyDataObject(cache[id])) {
return;
}
}
var internalCache = cache[id][internalKey];
// Browsers that fail expando deletion also refuse to delete expandos on
// the window, but it will allow it on all other JS objects; other browsers
// don't care
// Ensure that `cache` is not a window object #10080
if (jQuery.support.deleteExpando || !cache.setInterval) {
delete cache[id];
} else {
cache[id] = null;
}
// We destroyed the entire user cache at once because it's faster than
// iterating through each key, but we need to continue to persist internal
// data if it existed
if (internalCache) {
cache[id] = {};
// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
// metadata on plain JS objects when the object is serialized using
// JSON.stringify
if (!isNode) {
cache[id].toJSON = jQuery.noop;
}
cache[id][internalKey] = internalCache;
// Otherwise, we need to eliminate the expando on the node to avoid
// false lookups in the cache for entries that no longer exist
} else if (isNode) {
// 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 cases
if (jQuery.support.deleteExpando) {
delete elem[jQuery.expando];
} else if (elem.removeAttribute) {
elem.removeAttribute(jQuery.expando);
} else {
elem[jQuery.expando] = null;
}
}
},
// For internal use only.
_data: function (elem, name, data) {
return jQuery.data(elem, name, data, true);
},
// A method for determining if a DOM node can handle the data expando
acceptData: function (elem) {
if (elem.nodeName) {
var match = jQuery.noData[elem.nodeName.toLowerCase()];
var parts = key.split(".");
parts[1] = parts[1] ? "." + parts[1] : "";
if (value === undefined) {
data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
// Try to fetch any internally stored data first
if (data === undefined && this.length) {
data = jQuery.data(this[0], key);
data = dataAttr(this[0], key, data);
}
return data === undefined && parts[1] ?
this.data(parts[0]) :
data;
function dataAttr(elem, key, data) {
// If nothing was found internally, try to fetch any
// data from the HTML5 data-* attribute
if (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 :
!jQuery.isNaN(data) ? parseFloat(data) :
rbrace.test(data) ? jQuery.parseJSON(data) :
data;
} catch (e) { }
// Make sure we set the data so it isn't changed later
jQuery.data(elem, key, data);
} else {
data = undefined;
}
}
return data;
}
// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
// property to be considered empty objects; this property always exists in
// order to make sure JSON.stringify does not expose internal metadata
function isEmptyDataObject(obj) {
for (var name in obj) {
if (name !== "toJSON") {
return false;
}
}
return true;
}
function handleQueueMarkDefer(elem, type, src) {
var deferDataKey = type + "defer",
queueDataKey = type + "queue",
markDataKey = type + "mark",
defer = jQuery.data(elem, deferDataKey, undefined, true);
if (defer &&
(src === "queue" || !jQuery.data(elem, queueDataKey, undefined, true)) &&
(src === "mark" || !jQuery.data(elem, markDataKey, undefined, true))) {
// Give room for hard-coded callbacks to fire first
// and eventually mark/queue something else on the element
setTimeout(function () {
if (!jQuery.data(elem, queueDataKey, undefined, true) &&
!jQuery.data(elem, markDataKey, undefined, true)) {
jQuery.removeData(elem, deferDataKey, true);
defer.resolve();
}
}, 0);
}
}
jQuery.extend({
_mark: function (elem, type) {
if (elem) {
type = (type || "fx") + "mark";
jQuery.data(elem, type, (jQuery.data(elem, type, undefined, true) || 0) + 1, true);
}
},
_unmark: function (force, elem, type) {
if (force !== true) {
type = elem;
elem = force;
force = false;
}
if (elem) {
type = type || "fx";
var key = type + "mark",
count = force ? 0 : ((jQuery.data(elem, key, undefined, true) || 1) - 1);
if (count) {
jQuery.data(elem, key, count, true);
} else {
jQuery.removeData(elem, key, true);
handleQueueMarkDefer(elem, type, "mark");
}
}
},
queue: function (elem, type, data) {
if (elem) {
type = (type || "fx") + "queue";
var q = jQuery.data(elem, type, undefined, true);
// Speed up dequeue by getting out quickly if this is just a lookup
if (data) {
if (!q || jQuery.isArray(data)) {
q = jQuery.data(elem, type, jQuery.makeArray(data), true);
} else {
q.push(data);
}
}
return q || [];
}
},
dequeue: function (elem, type) {
type = type || "fx";
var queue = jQuery.queue(elem, type),
fn = queue.shift(),
defer;
// If the fx queue is dequeued, always remove the progress sentinel
if (fn === "inprogress") {
fn = queue.shift();
}
if (fn) {
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if (type === "fx") {
queue.unshift("inprogress");
}
fn.call(elem, function () {
jQuery.dequeue(elem, type);
});
}
if (!queue.length) {
jQuery.removeData(elem, type + "queue", true);
handleQueueMarkDefer(elem, type, "queue");
}
}
});
jQuery.fn.extend({
queue: function (type, data) {
if (typeof type !== "string") {
data = type;
type = "fx";
}
if (data === undefined) {
return jQuery.queue(this[0], type);
}
return this.each(function () {
var queue = jQuery.queue(this, type, data);
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 () {
var elem = this;
setTimeout(function () {
jQuery.dequeue(elem, type);
}, time);
});
},
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, object) {
if (typeof type !== "string") {
object = type;
type = undefined;
}
type = type || "fx";
var defer = jQuery.Deferred(),
elements = this,
i = elements.length,
count = 1,
deferDataKey = type + "defer",
queueDataKey = type + "queue",
markDataKey = type + "mark",
tmp;
function resolve() {
if (!(--count)) {
defer.resolveWith(elements, [elements]);
}
}
while (i--) {
if ((tmp = jQuery.data(elements[i], deferDataKey, undefined, true) ||
(jQuery.data(elements[i], queueDataKey, undefined, true) ||
jQuery.data(elements[i], markDataKey, undefined, true)) &&
jQuery.data(elements[i], deferDataKey, jQuery._Deferred(), true))) {
count++;
tmp.done(resolve);
}
}
resolve();
return defer.promise();
}
});
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 names
var className,
i = 0,
self = jQuery(this),
state = stateVal,
classNames = value.split(rspace);
while ((className = classNames[i++])) {
// check each className given, space seperated list
state = isBool ? state : !self.hasClass(className);
self[state ? "addClass" : "removeClass"](className);
}
} else if (type === "undefined" || type === "boolean") {
if (this.className) {
// store className if set
jQuery._data(this, "__className__", this.className);
}
hasClass: function (selector) {
var className = " " + selector + " ";
for (var i = 0, l = this.length; i < l; i++) {
if (this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) > -1) {
return true;
}
}
return false;
},
val: function (value) {
var hooks, ret,
elem = this[0];
if (!arguments.length) {
if (elem) {
hooks = jQuery.valHooks[elem.nodeName.toLowerCase()] || jQuery.valHooks[elem.type];
if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
return ret;
}
ret = elem.value;
return typeof ret === "string" ?
// handle most common string cases
ret.replace(rreturn, "") :
// handle cases where value is null/undef or number
ret == null ? "" : ret;
}
return undefined;
}
var isFunction = jQuery.isFunction(value);
return this.each(function (i) {
var self = jQuery(this), val;
if (this.nodeType !== 1) {
return;
}
if (isFunction) {
val = value.call(this, i, self.val());
} else {
val = value;
}
// Treat null/undefined as ""; convert numbers to string
if (val == null) {
val = "";
} else if (typeof val === "number") {
val += "";
} else if (jQuery.isArray(val)) {
val = jQuery.map(val, function (value) {
return value == null ? "" : value + "";
});
}
// If set returns undefined, fall back to normal setting
if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
this.value = val;
}
});
}
});
jQuery.extend({
valHooks: {
option: {
get: function (elem) {
// attributes.value is undefined in Blackberry 4.7 but
// uses .value. See #6932
var val = elem.attributes.value;
return !val || val.specified ? elem.value : elem.text;
}
},
select: {
get: function (elem) {
var value,
index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type === "select-one";
// Nothing was selected
if (index < 0) {
return null;
}
// Loop through all the selected options
for (var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++) {
var option = options[i];
// Don't return options that are disabled or in a disabled optgroup
if (option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
(!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {
// Get the specific value for the option
value = jQuery(option).val();
// We don't need an array for one selects
if (one) {
return value;
}
// Multi-Selects return an array
values.push(value);
}
}
// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
if (one && !values.length && options.length) {
return jQuery(options[index]).val();
}
return values;
},
set: function (elem, value) {
var values = jQuery.makeArray(value);
// Set corresponding property to false for boolean attributes
if (rboolean.test(name) && (propName = jQuery.propFix[name] || name) in elem) {
elem[propName] = false;
}
}
},
attrHooks: {
type: {
set: function (elem, value) {
// We can't allow the type property to be changed (since it causes problems in IE)
if (rtype.test(elem.nodeName) && elem.parentNode) {
jQuery.error("type property can't be changed");
} else 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 it's default in case type is set after value
// This is for element creation
var val = elem.value;
elem.setAttribute("type", value);
if (val) {
elem.value = val;
}
return value;
}
}
},
// Use the value property for back compat
// Use the nodeHook for button elements in IE6/7 (#1954)
value: {
get: function (elem, name) {
if (nodeHook && jQuery.nodeName(elem, "button")) {
return nodeHook.get(elem, name);
}
return name in elem ?
elem.value :
null;
},
set: function (elem, value, name) {
if (nodeHook && jQuery.nodeName(elem, "button")) {
return nodeHook.set(elem, value, name);
}
// Does not return so that setAttribute is also used
elem.value = value;
}
}
},
prop: function (elem, name, value) {
var nType = elem.nodeType;
// don't get/set properties on text, comment and attribute nodes
if (!elem || nType === 3 || nType === 8 || nType === 2) {
return undefined;
}
var ret, hooks,
notxml = nType !== 1 || !jQuery.isXMLDoc(elem);
if (notxml) {
// Fix name and attach hooks
name = jQuery.propFix[name] || name;
hooks = jQuery.propHooks[name];
}
if (value !== undefined) {
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");
// Add the tabindex propHook to attrHooks for back-compat
jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
// Hook for boolean attributes
boolHook = {
get: function (elem, name) {
// Align boolean attributes with corresponding properties
// Fall back to attribute presence where some booleans are not supported
var attrNode;
return jQuery.prop(elem, name) === true || (attrNode = elem.getAttributeNode(name)) && attrNode.nodeValue !== false ?
name.toLowerCase() :
undefined;
},
set: function (elem, value, name) {
var propName;
if (value === false) {
// Remove boolean attributes when set to false
jQuery.removeAttr(elem, name);
} else {
// value is true since we know at this point it's type boolean and not false
// Set boolean attributes to the same name and set the DOM property
propName = jQuery.propFix[name] || name;
if (propName in elem) {
// Only set the IDL specifically if it already exists on the element
elem[propName] = true;
}
// IE6/7 do not support getting/setting some attributes with get/setAttribute
if (!jQuery.support.getSetAttribute) {
// Use this for any attribute in IE6/7
// This fixes almost every IE6/7 issue
nodeHook = jQuery.valHooks.button = {
get: function (elem, name) {
var ret;
ret = elem.getAttributeNode(name);
// Return undefined if nodeValue is empty string
return ret && ret.nodeValue !== "" ?
ret.nodeValue :
undefined;
},
set: function (elem, value, name) {
// Set the existing or create a new attribute node
var ret = elem.getAttributeNode(name);
if (!ret) {
ret = document.createAttribute(name);
elem.setAttributeNode(ret);
}
return (ret.nodeValue = value + "");
}
};
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
// This is for removals
jQuery.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
if (!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;
}
});
});
}
if (!jQuery.support.style) {
jQuery.attrHooks.style = {
get: function (elem) {
// Return undefined in the case of empty string
// Normalize to lowercase since IE uppercases css property names
return elem.style.cssText.toLowerCase() || 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 it
if (!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 #5701
if (parent.parentNode) {
parent.parentNode.selectedIndex;
}
}
return null;
}
});
}
// Radios and checkboxes getter/setter
if (!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 specified
return 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);
}
}
});
});
/*
* A number of helper functions used for managing events.
* Many of the ideas behind this code originated from
* Dean Edwards' addEvent library.
*/
jQuery.event = {
// Bind an event to an element
// Original by Dean Edwards
add: function (elem, types, handler, data) {
if (elem.nodeType === 3 || elem.nodeType === 8) {
return;
}
if (handler === false) {
handler = returnFalse;
} else if (!handler) {
// Fixes bug #7229. Fix recommended by jdalton
return;
}
var handleObjIn, handleObj;
if (handler.handler) {
handleObjIn = handler;
handler = handleObjIn.handler;
}
// Make sure that the function being executed has a unique ID
if (!handler.guid) {
handler.guid = jQuery.guid++;
}
// Init the element's event structure
var elemData = jQuery._data(elem);
// If no elemData is found then we must be trying to bind to one of the
// banned noData elements
if (!elemData) {
return;
}
var events = elemData.events,
eventHandle = elemData.handle;
if (!events) {
elemData.events = events = {};
}
if (!eventHandle) {
elemData.handle = eventHandle = function (e) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
jQuery.event.handle.apply(eventHandle.elem, arguments) :
undefined;
};
}
// Add elem as a property of the handle function
// This is to prevent a memory leak with non-native events in IE.
eventHandle.elem = elem;
// Handle multiple events separated by a space
// jQuery(...).bind("mouseover mouseout", fn);
types = types.split(" ");
var type, i = 0, namespaces;
while ((type = types[i++])) {
handleObj = handleObjIn ?
jQuery.extend({}, handleObjIn) :
{ handler: handler, data: data };
// Namespaced event handlers
if (type.indexOf(".") > -1) {
namespaces = type.split(".");
type = namespaces.shift();
handleObj.namespace = namespaces.slice(0).sort().join(".");
handleObj.type = type;
if (!handleObj.guid) {
handleObj.guid = handler.guid;
}
// Get the current list of functions bound to this event
var handlers = events[type],
special = jQuery.event.special[type] || {};
// Init the event handler queue
if (!handlers) {
handlers = events[type] = [];
// Check for a special event handler
// Only use addEventListener/attachEvent if the special
// events handler returns false
if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
// Bind the global event handler to the element
if (elem.addEventListener) {
elem.addEventListener(type, eventHandle, false);
if (special.add) {
special.add.call(elem, handleObj);
if (!handleObj.handler.guid) {
handleObj.handler.guid = handler.guid;
}
}
// Add the function to the element's handler list
handlers.push(handleObj);
// Keep track of which events have been used, for event optimization
jQuery.event.global[type] = true;
}
// Nullify elem to prevent memory leaks in IE
elem = null;
},
global: {},
// Detach an event or set of events from an element
remove: function (elem, types, handler, pos) {
// don't do events on text and comment nodes
if (elem.nodeType === 3 || elem.nodeType === 8) {
return;
}
if (handler === false) {
handler = returnFalse;
}
var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
elemData = jQuery.hasData(elem) && jQuery._data(elem),
events = elemData && elemData.events;
if (!elemData || !events) {
return;
}
// types is actually an event object here
if (types && types.type) {
handler = types.handler;
types = types.type;
}
// Unbind all events for the element
if (!types || typeof types === "string" && types.charAt(0) === ".") {
types = types || "";
for (type in events) {
jQuery.event.remove(elem, type + types);
}
return;
}
// Handle multiple events separated by a space
// jQuery(...).unbind("mouseover mouseout", fn);
types = types.split(" ");
while ((type = types[i++])) {
origType = type;
handleObj = null;
all = type.indexOf(".") < 0;
namespaces = [];
if (!all) {
// Namespaced event handlers
namespaces = type.split(".");
type = namespaces.shift();
namespace = new RegExp("(^|\\.)" +
jQuery.map(namespaces.slice(0).sort(), fcleanup).join("\\.(?:.*\\.)?") + "(\\.|$)");
}
eventType = events[type];
if (!eventType) {
continue;
}
if (!handler) {
for (j = 0; j < eventType.length; j++) {
handleObj = eventType[j];
if (handler.guid === handleObj.guid) {
// remove the given handler for the given type
if (all || namespace.test(handleObj.namespace)) {
if (pos == null) {
eventType.splice(j--, 1);
}
if (special.remove) {
special.remove.call(elem, handleObj);
}
}
if (pos != null) {
break;
}
}
}
// remove generic event handler if no more handlers exist
if (eventType.length === 0 || pos != null && eventType.length === 1) {
if (!special.teardown || special.teardown.call(elem, namespaces) === false) {
jQuery.removeEvent(elem, type, elemData.handle);
}
ret = null;
delete events[type];
}
}
// Remove the expando if it's no longer used
if (jQuery.isEmptyObject(events)) {
var handle = elemData.handle;
if (handle) {
handle.elem = null;
}
delete elemData.events;
delete elemData.handle;
if (jQuery.isEmptyObject(elemData)) {
jQuery.removeData(elem, undefined, true);
}
}
},
// Events that are safe to short-circuit if no handlers are attached.
// Native DOM events should not be added, they may have inline handlers.
customEvent: {
"getData": true,
"setData": true,
"changeData": true
},
trigger: function (event, data, elem, onlyHandlers) {
// Event object or event type
var type = event.type || event,
namespaces = [],
exclusive;
if (type.indexOf("!") >= 0) {
// Exclusive events trigger only for the exact event (no namespaces)
type = type.slice(0, -1);
exclusive = true;
}
if (type.indexOf(".") >= 0) {
// Namespaced trigger; create a regexp to match event type in handle()
namespaces = type.split(".");
type = namespaces.shift();
namespaces.sort();
}
if ((!elem || jQuery.event.customEvent[type]) && !jQuery.event.global[type]) {
// No jQuery handlers for this event type, and it can't have inline handlers
return;
}
// Caller can pass in an Event, Object, or just an event type string
event = typeof event === "object" ?
// jQuery.Event object
event[jQuery.expando] ? event :
// Object literal
new jQuery.Event(type, event) :
// Just the event type (string)
new jQuery.Event(type);
// triggerHandler() and global events don't bubble or run the default action
if (onlyHandlers || !elem) {
event.preventDefault();
event.stopPropagation();
}
// Handle a global trigger
if (!elem) {
// TODO: Stop taunting the data cache; remove global events and always attach to document
jQuery.each(jQuery.cache, function () {
// internalKey variable is just used to make it easier to find
// and potentially change this stuff later; currently it just
// points to jQuery.expando
var internalKey = jQuery.expando,
internalCache = this[internalKey];
if (internalCache && internalCache.events && internalCache.events[type]) {
jQuery.event.trigger(event, data, internalCache.handle.elem);
}
});
return;
}
// Don't do events on text and comment nodes
if (elem.nodeType === 3 || elem.nodeType === 8) {
return;
}
// Clean up the event in case it is being reused
event.result = undefined;
event.target = elem;
// Clone any incoming data and prepend the event, creating the handler arg list
data = data != null ? jQuery.makeArray(data) : [];
data.unshift(event);
var cur = elem,
// IE doesn't like method names with a colon (#3533, #8272)
ontype = type.indexOf(":") < 0 ? "on" + type : "";
// Fire event on the current element, then bubble up the DOM tree
do {
var handle = jQuery._data(cur, "handle");
event.currentTarget = cur;
if (handle) {
handle.apply(cur, data);
}
// Bubble up to document, then to window
cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
} while (cur && !event.isPropagationStopped());
// If nobody prevented the default action, do it now
if (!event.isDefaultPrevented()) {
var old,
special = jQuery.event.special[type] || {};
// 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.
// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
try {
if (ontype && elem[type]) {
// Don't re-trigger an onFOO event when we call its FOO() method
old = elem[ontype];
handle: function (event) {
event = jQuery.event.fix(event || window.event);
// Snapshot the handlers list since a called handler may add/remove events.
var handlers = ((jQuery._data(this, "events") || {})[event.type] || []).slice(0),
run_all = !event.exclusive && !event.namespace,
args = Array.prototype.slice.call(arguments, 0);
// Use the fix-ed Event rather than the (read-only) native event
args[0] = event;
event.currentTarget = this;
for (var j = 0, l = handlers.length; j < l; j++) {
var handleObj = handlers[j];
// Triggered event must 1) be non-exclusive and have no namespace, or
// 2) have namespace(s) a subset or equal to those in the bound event.
if (run_all || event.namespace_re.test(handleObj.namespace)) {
// Pass in a reference to the handler function itself
// So that we can later remove it
event.handler = handleObj.handler;
event.data = handleObj.data;
event.handleObj = handleObj;
var ret = handleObj.handler.apply(this, args);
if (ret !== undefined) {
event.result = ret;
if (ret === false) {
event.preventDefault();
event.stopPropagation();
}
}
if (event.isImmediatePropagationStopped()) {
break;
}
}
}
return event.result;
},
fix: function (event) {
if (event[jQuery.expando]) {
return event;
}
// store a copy of the original event object
// and "clone" to set read-only properties
var originalEvent = event;
event = jQuery.Event(originalEvent);
for (var i = this.props.length, prop; i; ) {
prop = this.props[--i];
event[prop] = originalEvent[prop];
}
// Fix target property, if necessary
if (!event.target) {
// Fixes #1925 where srcElement might not be defined either
event.target = event.srcElement || document;
}
// check if target is a textnode (safari)
if (event.target.nodeType === 3) {
event.target = event.target.parentNode;
}
// Add relatedTarget, if necessary
if (!event.relatedTarget && event.fromElement) {
event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
}
// Calculate pageX/Y if missing and clientX/Y available
if (event.pageX == null && event.clientX != null) {
var eventDocument = event.target.ownerDocument || document,
doc = eventDocument.documentElement,
body = eventDocument.body;
remove: function (handleObj) {
jQuery.event.remove(this, liveConvert(handleObj.origType, handleObj.selector), handleObj);
}
},
beforeunload: {
setup: function (data, namespaces, eventHandle) {
// We only want to do this special case on windows
if (jQuery.isWindow(this)) {
this.onbeforeunload = eventHandle;
}
},
teardown: function (namespaces, eventHandle) {
if (this.onbeforeunload === eventHandle) {
this.onbeforeunload = null;
}
}
}
}
};
jQuery.removeEvent = document.removeEventListener ?
function (elem, type, handle) {
if (elem.removeEventListener) {
elem.removeEventListener(type, handle, false);
}
} :
function (elem, type, handle) {
if (elem.detachEvent) {
elem.detachEvent("on" + type, handle);
}
};
jQuery.Event = function (src, props) {
// Allow instantiation without the 'new' keyword
if (!this.preventDefault) {
return new jQuery.Event(src, props);
}
// 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 object
if (props) {
jQuery.extend(this, props);
}
// timeStamp is buggy for some events on Firefox(#3843)
// So we won't rely on the native value
this.timeStamp = jQuery.now();
// Mark it as fixed
this[jQuery.expando] = true;
};
function returnFalse() {
return false;
}
function returnTrue() {
return true;
}
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
preventDefault: function () {
this.isDefaultPrevented = returnTrue;
var e = this.originalEvent;
if (!e) {
return;
}
// if preventDefault exists run it on the original event
if (e.preventDefault) {
e.preventDefault();
// otherwise set the returnValue property of the original event to false (IE)
} else {
e.returnValue = false;
}
},
stopPropagation: function () {
this.isPropagationStopped = returnTrue;
var e = this.originalEvent;
if (!e) {
return;
}
// if stopPropagation exists run it on the original event
if (e.stopPropagation) {
e.stopPropagation();
}
// otherwise set the cancelBubble property of the original event to true (IE)
e.cancelBubble = true;
},
stopImmediatePropagation: function () {
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
},
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse
};
// Checks if an event happened on an element within another element
// Used in jQuery.event.special.mouseenter and mouseleave handlers
var withinElement = function (event) {
// Check if mouse(over|out) are still within the same parent element
var related = event.relatedTarget,
inside = false,
eventType = event.type;
event.type = event.data;
if (related !== this) {
if (related) {
inside = jQuery.contains(this, related);
}
if (!inside) {
jQuery.event.handle.apply(this, arguments);
event.type = eventType;
}
}
},
// In case of event delegation, we only need to rename the event.type,
// liveHandler will take care of the rest.
delegate = function (event) {
event.type = event.data;
jQuery.event.handle.apply(this, arguments);
};
// Create mouseenter and mouseleave events
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout"
}, function (orig, fix) {
jQuery.event.special[orig] = {
setup: function (data) {
jQuery.event.add(this, fix, data && data.selector ? delegate : withinElement, orig);
},
teardown: function (data) {
jQuery.event.remove(this, fix, data && data.selector ? delegate : withinElement);
}
};
});
// submit delegation
if (!jQuery.support.submitBubbles) {
jQuery.event.special.submit = {
setup: function (data, namespaces) {
if (!jQuery.nodeName(this, "form")) {
jQuery.event.add(this, "click.specialSubmit", function (e) {
// Avoid triggering error on non-existent type attribute in IE VML (#7071)
var elem = e.target,
type = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.type : "";
if ((type === "submit" || type === "image") && jQuery(elem).closest("form").length) {
trigger("submit", this, arguments);
}
});
jQuery.event.add(this, "keypress.specialSubmit", function (e) {
var elem = e.target,
type = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.type : "";
if ((type === "text" || type === "password") && jQuery(elem).closest("form").length && e.keyCode === 13) {
trigger("submit", this, arguments);
}
});
} else {
return false;
}
},
teardown: function (namespaces) {
jQuery.event.remove(this, ".specialSubmit");
}
};
}
// change delegation, happens here so we have bind.
if (!jQuery.support.changeBubbles) {
var changeFilters,
getVal = function (elem) {
var type = jQuery.nodeName(elem, "input") ? elem.type : "",
val = elem.value;
if (type === "radio" || type === "checkbox") {
val = elem.checked;
} else if (type === "select-multiple") {
val = elem.selectedIndex > -1 ?
jQuery.map(elem.options, function (elem) {
return elem.selected;
}).join("-") :
"";
} else if (jQuery.nodeName(elem, "select")) {
val = elem.selectedIndex;
}
return val;
},
testChange = function testChange(e) {
var elem = e.target, data, val;
if (!rformElems.test(elem.nodeName) || elem.readOnly) {
return;
}
data = jQuery._data(elem, "_change_data");
val = getVal(elem);
// the current data will be also retrieved by beforeactivate
if (e.type !== "focusout" || elem.type !== "radio") {
jQuery._data(elem, "_change_data", val);
}
if (data === undefined || val === data) {
return;
}
click: function (e) {
var elem = e.target, type = jQuery.nodeName(elem, "input") ? elem.type : "";
if (type === "radio" || type === "checkbox" || jQuery.nodeName(elem, "select")) {
testChange.call(this, e);
}
},
// Change has to be called before submit
// Keydown will be called before keypress, which is used in submit-event delegation
keydown: function (e) {
var elem = e.target, type = jQuery.nodeName(elem, "input") ? elem.type : "";
if ((e.keyCode === 13 && !jQuery.nodeName(elem, "textarea")) ||
(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
type === "select-multiple") {
testChange.call(this, e);
}
},
// Beforeactivate happens also before the previous element is blurred
// with this event you can't trigger a change event, but you can store
// information
beforeactivate: function (e) {
var elem = e.target;
jQuery._data(elem, "_change_data", getVal(elem));
}
},
setup: function (data, namespaces) {
if (this.type === "file") {
return false;
}
for (var type in changeFilters) {
jQuery.event.add(this, type + ".specialChange", changeFilters[type]);
}
return rformElems.test(this.nodeName);
},
teardown: function (namespaces) {
jQuery.event.remove(this, ".specialChange");
// Handle when the input is .focus()'d
changeFilters.focus = changeFilters.beforeactivate;
}
function trigger(type, elem, args) {
// 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.
// Don't pass args or remember liveFired; they apply to the donor event.
var event = jQuery.extend({}, args[0]);
event.type = type;
event.originalEvent = {};
event.liveFired = undefined;
jQuery.event.handle.call(elem, event);
if (event.isDefaultPrevented()) {
args[0].preventDefault();
}
}
// Create "bubbling" focus and blur events
if (!jQuery.support.focusinBubbles) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) {
// Attach a single capturing handler while someone wants focusin/focusout
var attaches = 0;
jQuery.event.special[fix] = {
setup: function () {
if (attaches++ === 0) {
document.addEventListener(orig, handler, true);
}
},
teardown: function () {
if (--attaches === 0) {
document.removeEventListener(orig, handler, true);
}
}
};
function handler(donor) {
// Donor event is always a native one; fix it and switch its type.
// Let focusin/out handler cancel the donor focus/blur event.
var e = jQuery.event.fix(donor);
e.type = fix;
e.originalEvent = {};
jQuery.event.trigger(e, null, e.target);
if (e.isDefaultPrevented()) {
donor.preventDefault();
}
}
});
}
jQuery.each(["bind", "one"], function (i, name) {
jQuery.fn[name] = function (type, data, fn) {
var handler;
// Handle object literals
if (typeof type === "object") {
for (var key in type) {
this[name](key, data, type[key], fn);
}
return this;
}
if (arguments.length === 2 || data === false) {
fn = data;
data = undefined;
}
triggerHandler: function (type, data) {
if (this[0]) {
return jQuery.event.trigger(type, data, this[0], true);
}
},
toggle: function (fn) {
// Save reference to arguments for access in closure
var args = arguments,
guid = fn.guid || jQuery.guid++,
i = 0,
toggler = function (event) {
// Figure out which function to execute
var lastToggle = (jQuery.data(this, "lastToggle" + fn.guid) || 0) % i;
jQuery.data(this, "lastToggle" + fn.guid, lastToggle + 1);
// Make sure that clicks stop
event.preventDefault();
// and execute the function
return args[lastToggle].apply(this, arguments) || false;
};
// link all the functions, so any of them can unbind this click handler
toggler.guid = guid;
while (i < args.length) {
args[i++].guid = guid;
}
function liveHandler(event) {
var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
elems = [],
selectors = [],
events = jQuery._data(this, "events");
// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
if (event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click") {
return;
}
if (event.namespace) {
namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
}
if (jQuery.attrFn) {
jQuery.attrFn[name] = true;
}
});
/*!
* Sizzle CSS Selector Engine
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
* More information: http://sizzlejs.com/
*/
(function () {
// Here we check if the JavaScript engine is using some sort of
// optimization where it does not always call our comparision
// function. If that is the case, discard the hasDuplicate value.
// Thus far that includes Google Chrome.
[0, 0].sort(function () {
baseHasDuplicate = false;
return 0;
});
var Sizzle = function (selector, context, results, seed) {
results = results || [];
context = context || document;
if (Expr.relative[selector]) {
selector += parts.shift();
}
set = posProcess(selector, set);
}
}
} else {
// Take a shortcut and set the context if the root selector is an ID
// (but not if it'll be faster if the inner selector is an ID)
if (!seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1])) {
if (!set) {
set = typeof context.getElementsByTagName !== "undefined" ?
context.getElementsByTagName("*") :
[];
}
return { set: set, expr: expr };
};
Sizzle.filter = function (expr, set, inplace, not) {
var match, anyFound,
old = expr,
result = [],
curLoop = set,
isXMLFilter = set && set[0] && Sizzle.isXML(set[0]);
while (expr && set.length) {
for (var type in Expr.filter) {
if ((match = Expr.leftMatch[type].exec(expr)) != null && match[2]) {
var found, item,
filter = Expr.filter[type],
left = match[1];
anyFound = false;
match.splice(1, 1);
if (left.substr(left.length - 1) === "\\") {
continue;
}
if (curLoop === result) {
result = [];
}
if (Expr.preFilter[type]) {
match = Expr.preFilter[type](match, curLoop, inplace, result, not, isXMLFilter);
if (!match) {
anyFound = found = true;
} else if (match === true) {
continue;
}
}
if (match) {
for (var i = 0; (item = curLoop[i]) != null; i++) {
if (item) {
found = filter(item, match, i, curLoop);
var pass = not ^ !!found;
if (inplace && found != null) {
if (pass) {
anyFound = true;
find: {
ID: function (match, context, isXML) {
if (typeof context.getElementById !== "undefined" && !isXML) {
var m = context.getElementById(match[1]);
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
return m && m.parentNode ? [m] : [];
}
},
NAME: function (match, context) {
if (typeof context.getElementsByName !== "undefined") {
var ret = [],
results = context.getElementsByName(match[1]);
for (var i = 0, l = results.length; i < l; i++) {
if (results[i].getAttribute("name") === match[1]) {
ret.push(results[i]);
}
}
return ret.length === 0 ? null : ret;
}
},
TAG: function (match, context) {
if (typeof context.getElementsByTagName !== "undefined") {
return context.getElementsByTagName(match[1]);
}
}
},
preFilter: {
CLASS: function (match, curLoop, inplace, result, not, isXML) {
match = " " + match[1].replace(rBackslash, "") + " ";
if (isXML) {
return match;
}
for (var i = 0, elem; (elem = curLoop[i]) != null; i++) {
if (elem) {
if (not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0)) {
if (!inplace) {
result.push(elem);
}
} else if (inplace) {
curLoop[i] = false;
}
}
}
return false;
},
ID: function (match) {
return match[1].replace(rBackslash, "");
},
TAG: function (match, curLoop) {
return match[1].replace(rBackslash, "").toLowerCase();
},
CHILD: function (match) {
if (match[1] === "nth") {
if (!match[2]) {
Sizzle.error(match[0]);
}
PSEUDO: function (match, curLoop, inplace, result, not) {
if (match[1] === "not") {
// If we're dealing with a complex expression, or a simple one
if ((chunker.exec(match[3]) || "").length > 1 || /^\w/.test(match[3])) {
match[3] = Sizzle(match[3], null, null, curLoop);
} else {
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
if (!inplace) {
result.push.apply(result, ret);
}
return false;
}
} else if (Expr.match.POS.test(match[0]) || Expr.match.CHILD.test(match[0])) {
return true;
}
disabled: function (elem) {
return elem.disabled === true;
},
checked: function (elem) {
return elem.checked === true;
},
selected: function (elem) {
// Accessing this property makes selected-by-default
// options in Safari work properly
if (elem.parentNode) {
elem.parentNode.selectedIndex;
}
return elem.selected === true;
},
parent: function (elem) {
return !!elem.firstChild;
},
empty: function (elem) {
return !elem.firstChild;
},
has: function (elem, i, match) {
return !!Sizzle(match[3], elem).length;
},
header: function (elem) {
return (/h\d/i).test(elem.nodeName);
},
text: function (elem) {
var attr = elem.getAttribute("type"), type = elem.type;
// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
// use getAttribute instead to test this case
return elem.nodeName.toLowerCase() === "input" && "text" === type && (attr === type || attr === null);
},
reset: function (elem) {
var name = elem.nodeName.toLowerCase();
return (name === "input" || name === "button") && "reset" === elem.type;
},
button: function (elem) {
var name = elem.nodeName.toLowerCase();
return name === "input" && "button" === elem.type || name === "button";
},
input: function (elem) {
return (/input|select|textarea|button/i).test(elem.nodeName);
},
focus: function (elem) {
return elem === elem.ownerDocument.activeElement;
}
},
setFilters: {
first: function (elem, i) {
return i === 0;
},
last: function (elem, i, match, array) {
return i === array.length - 1;
},
even: function (elem, i) {
return i % 2 === 0;
},
odd: function (elem, i) {
return i % 2 === 1;
},
lt: function (elem, i, match) {
return i < match[3] - 0;
},
gt: function (elem, i, match) {
return i > match[3] - 0;
},
nth: function (elem, i, match) {
return match[3] - 0 === i;
},
eq: function (elem, i, match) {
return match[3] - 0 === i;
}
},
filter: {
PSEUDO: function (elem, match, i, array) {
var name = match[1],
filter = Expr.filters[name];
if (filter) {
return filter(elem, i, match, array);
ATTR: function (elem, match) {
var name = match[1],
result = Expr.attrHandle[name] ?
Expr.attrHandle[name](elem) :
elem[name] != null ?
elem[name] :
elem.getAttribute(name),
value = result + "",
type = match[2],
check = match[4];
return result == null ?
type === "!=" :
type === "=" ?
value === check :
type === "*=" ?
value.indexOf(check) >= 0 :
type === "~=" ?
(" " + value + " ").indexOf(check) >= 0 :
!check ?
value && result !== false :
type === "!=" ?
value !== check :
type === "^=" ?
value.indexOf(check) === 0 :
type === "$=" ?
value.substr(value.length - check.length) === check :
type === "|=" ?
value === check || value.substr(0, check.length + 1) === check + "-" :
false;
},
POS: function (elem, match, i, array) {
var name = match[2],
filter = Expr.setFilters[name];
if (filter) {
return filter(elem, i, match, array);
}
}
}
};
var origPOS = Expr.match.POS,
fescape = function (all, num) {
return "\\" + (num - 0 + 1);
};
for (var type in Expr.match) {
Expr.match[type] = new RegExp(Expr.match[type].source + (/(?![^\[]*\])(?![^\(]*\))/.source));
Expr.leftMatch[type] = new RegExp(/(^(?:.|\r|\n)*?)/.source + Expr.match[type].source.replace(/\\(\d+)/g, fescape));
}
var makeArray = function (array, results) {
array = Array.prototype.slice.call(array, 0);
if (results) {
results.push.apply(results, array);
return results;
}
return array;
};
// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
// Also verifies that the returned array holds DOM nodes
// (which is not the case in the Blackberry browser)
try {
Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType;
// Provide a fallback method if it does not work
} catch (e) {
makeArray = function (array, results) {
var i = 0,
ret = results || [];
if (toString.call(array) === "[object Array]") {
Array.prototype.push.apply(ret, array);
} else {
if (typeof array.length === "number") {
for (var l = array.length; i < l; i++) {
ret.push(array[i]);
}
} else {
sortOrder = function (a, b) {
// The nodes are identical, we can exit early
if (a === b) {
hasDuplicate = true;
return 0;
// Fallback to using sourceIndex (in IE) if it's available on both nodes
} else if (a.sourceIndex && b.sourceIndex) {
return a.sourceIndex - b.sourceIndex;
}
var al, bl,
ap = [],
bp = [],
aup = a.parentNode,
bup = b.parentNode,
cur = aup;
// If the nodes are siblings (or identical) we can do a quick check
if (aup === bup) {
return siblingCheck(a, b);
// If no parents were found then the nodes are disconnected
} else if (!aup) {
return -1;
} else if (!bup) {
return 1;
}
// Otherwise they're somewhere else in the tree so we need
// to build up a full list of the parentNodes for comparison
while (cur) {
ap.unshift(cur);
cur = cur.parentNode;
}
cur = bup;
while (cur) {
bp.unshift(cur);
cur = cur.parentNode;
}
al = ap.length;
bl = bp.length;
// Start walking down the tree looking for a discrepancy
for (var i = 0; i < al && i < bl; i++) {
if (ap[i] !== bp[i]) {
return siblingCheck(ap[i], bp[i]);
}
}
// We ended someplace up the tree so do a sibling check
return i === al ?
siblingCheck(a, bp[i], -1) :
siblingCheck(ap[i], b, 1);
};
siblingCheck = function (a, b, ret) {
if (a === b) {
return ret;
}
var cur = a.nextSibling;
while (cur) {
if (cur === b) {
return -1;
}
cur = cur.nextSibling;
}
return 1;
};
}
// Utility function for retreiving the text value of an array of DOM nodes
Sizzle.getText = function (elems) {
var ret = "", elem;
for (var i = 0; elems[i]; i++) {
elem = elems[i];
// Get the text from text nodes and CDATA nodes
if (elem.nodeType === 3 || elem.nodeType === 4) {
ret += elem.nodeValue;
// Traverse everything else, except comment nodes
} else if (elem.nodeType !== 8) {
ret += Sizzle.getText(elem.childNodes);
}
}
return ret;
};
// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function () {
// We're going to inject a fake input element with a specified name
var form = document.createElement("div"),
id = "script" + (new Date()).getTime(),
root = document.documentElement;
form.innerHTML = "";
// Inject it into the root element, check its status, and remove it quickly
root.insertBefore(form, root.firstChild);
// The workaround has to do additional checks after a getElementById
// Which slows things down for other browsers (hence the branching)
if (document.getElementById(id)) {
Expr.find.ID = function (match, context, isXML) {
if (typeof context.getElementById !== "undefined" && !isXML) {
var m = context.getElementById(match[1]);
(function () {
// Check to see if the browser returns only elements
// when doing getElementsByTagName("*")
// Create a fake element
var div = document.createElement("div");
div.appendChild(document.createComment(""));
// Make sure no comments are found
if (div.getElementsByTagName("*").length > 0) {
Expr.find.TAG = function (match, context) {
var results = context.getElementsByTagName(match[1]);
// Filter out possible comments
if (match[1] === "*") {
var tmp = [];
for (var i = 0; results[i]; i++) {
if (results[i].nodeType === 1) {
tmp.push(results[i]);
}
}
results = tmp;
}
return results;
};
}
// Check to see if an attribute returns normalized href attributes
div.innerHTML = "";
// Only use querySelectorAll on non-XML documents
// (ID selectors don't work in non-HTML documents)
if (!seed && !Sizzle.isXML(context)) {
// See if we find a selector to speed up
var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(query);
if (match && (context.nodeType === 1 || context.nodeType === 9)) {
// Speed-up: Sizzle("TAG")
if (match[1]) {
return makeArray(context.getElementsByTagName(query), extra);
if (context.nodeType === 9) {
// Speed-up: Sizzle("body")
// The body element only exists once, optimize finding it
if (query === "body" && context.body) {
return makeArray([context.body], extra);
// Speed-up: Sizzle("#ID")
} else if (match && match[3]) {
var elem = context.getElementById(match[3]);
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
if (elem && elem.parentNode) {
// Handle the case where IE and Opera return items
// by name instead of ID
if (elem.id === match[3]) {
return makeArray([elem], extra);
}
// qSA works strangely on Element-rooted queries
// We can work around this by specifying an extra ID on the root
// and working up from there (Thanks to Andrew Dupont for the technique)
// IE 8 doesn't work on object elements
} else if (context.nodeType === 1 && context.nodeName.toLowerCase() !== "object") {
var oldContext = context,
old = context.getAttribute("id"),
nid = old || id,
hasParent = context.parentNode,
relativeHierarchySelector = /^\s*[+~]/.test(query);
if (!old) {
context.setAttribute("id", nid);
} else {
nid = nid.replace(/'/g, "\\$&");
}
if (relativeHierarchySelector && hasParent) {
context = context.parentNode;
}
try {
if (!relativeHierarchySelector || hasParent) {
return makeArray(context.querySelectorAll("[id='" + nid + "'] " + query), extra);
}
for (var prop in oldSizzle) {
Sizzle[prop] = oldSizzle[prop];
}
// release memory in IE
div = null;
})();
}
(function () {
var html = document.documentElement,
matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
if (matches) {
// Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9 fails this)
var disconnectedMatch = !matches.call(document.createElement("div"), "div"),
pseudoWorks = false;
try {
// This should fail with an exception
// Gecko does not error, returns false instead
matches.call(document.documentElement, "[test!='']:sizzle");
} catch (pseudoError) {
pseudoWorks = true;
}
Sizzle.matchesSelector = function (node, expr) {
// Make sure that attribute selectors are quoted
expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
if (!Sizzle.isXML(node)) {
try {
if (pseudoWorks || !Expr.match.PSEUDO.test(expr) && !/!=/.test(expr)) {
var ret = matches.call(node, expr);
// IE 9's matchesSelector returns false on disconnected nodes
if (ret || !disconnectedMatch ||
// As well, disconnected nodes are said to be in a document
// fragment in IE 9, so check for that
node.document && node.document.nodeType !== 11) {
return ret;
}
}
} catch (e) { }
}
(function () {
var div = document.createElement("div");
div.innerHTML = "";
// Opera can't find a second classname (in 9.6)
// Also, make sure that getElementsByClassName actually exists
if (!div.getElementsByClassName || div.getElementsByClassName("e").length === 0) {
return;
}
// Safari caches class attributes, doesn't catch changes (in 3.2)
div.lastChild.className = "e";
if (div.getElementsByClassName("e").length === 1) {
return;
}
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 : 0).documentElement;
var posProcess = function (selector, context) {
var match,
tmpSet = [],
later = "",
root = context.nodeType ? [context] : context;
// Position selectors must be done after the filter
// And so must :not(positional) so we move all PSEUDOs to the end
while ((match = Expr.match.PSEUDO.exec(selector))) {
later += match[0];
selector = selector.replace(Expr.match.PSEUDO, "");
}
var runtil = /Until$/,
rparentsprev = /^(?:parents|prevUntil|prevAll)/,
// Note: This RegExp should be improved, or likely pulled from Sizzle
rmultiselector = /,/,
isSimple = /^.[^:#\[\.,]*$/,
slice = Array.prototype.slice,
POS = jQuery.expr.match.POS,
// methods guaranteed to produce a unique set when starting from a unique set
guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend({
find: function (selector) {
var self = this,
i, l;
if (typeof selector !== "string") {
return jQuery(selector).filter(function () {
for (i = 0, l = self.length; i < l; i++) {
if (jQuery.contains(self[i], this)) {
return true;
}
}
});
}
var ret = this.pushStack("", "find", selector),
length, n, r;
for (i = 0, l = this.length; i < l; i++) {
length = ret.length;
jQuery.find(selector, this[i], ret);
if (i > 0) {
// Make sure that the results are unique
for (n = length; n < ret.length; n++) {
for (r = 0; r < length; r++) {
if (ret[r] === ret[n]) {
ret.splice(n--, 1);
break;
}
}
}
}
}
return ret;
},
has: function (target) {
var targets = jQuery(target);
return this.filter(function () {
for (var i = 0, l = targets.length; i < l; i++) {
if (jQuery.contains(this, targets[i])) {
return true;
}
}
});
},
// Determine the position of an element within
// the matched set of elements
index: function (elem) {
// No argument, return index in parent
if (!elem) {
return (this[0] && this[0].parentNode) ? this.prevAll().length : -1;
}
// index in selector
if (typeof elem === "string") {
return jQuery.inArray(this[0], jQuery(elem));
}
// Locate the position of the desired element
return jQuery.inArray(
// If it receives a jQuery object, the first element is used
elem.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(isDisconnected(set[0]) || isDisconnected(all[0]) ?
all :
jQuery.unique(all));
},
andSelf: function () {
return this.add(this.prevObject);
}
});
// A painfully simple check to see if an element is disconnected
// from a document (should be improved, where feasible).
function isDisconnected(node) {
return !node || !node.parentNode || node.parentNode.nodeType === 11;
}
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 jQuery.nth(elem, 2, "nextSibling");
},
prev: function (elem) {
return jQuery.nth(elem, 2, "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.makeArray(elem.childNodes);
}
}, function (name, fn) {
jQuery.fn[name] = function (until, selector) {
var ret = jQuery.map(this, fn, until),
// The variable 'args' was introduced in
// https://github.com/jquery/jquery/commit/52a0238
// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
// http://code.google.com/p/v8/issues/detail?id=1050
args = slice.call(arguments);
if (!runtil.test(name)) {
selector = until;
}
if (selector && typeof selector === "string") {
ret = jQuery.filter(selector, ret);
}
nth: function (cur, result, dir, elem) {
result = result || 1;
var num = 0;
for (; cur; cur = cur[dir]) {
if (cur.nodeType === 1 && ++num === result) {
break;
}
}
return cur;
},
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 not
function winnow(elements, qualifier, keep) {
// Can't pass null or undefined to indexOf in Firefox 4
// Set to 0 to skip string check
qualifier = 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, i) {
return (elem === qualifier) === keep;
});
} else if (typeof qualifier === "string") {
var filtered = jQuery.grep(elements, function (elem) {
return elem.nodeType === 1;
});
XMLHttpRequest cannot load http://v.xxx.com. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access. test.html:1
1.什么是NoSQL数据库?NoSQL和RDBMS有什么区别?在哪些情况下使用和不使用NoSQL数据库?
NoSQL是非关系型数据库,NoSQL = Not Only SQL。
关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
在考虑数据库的成熟
ClientWatchManager接口
//接口的唯一方法materialize用于确定那些Watcher需要被通知
//确定Watcher需要三方面的因素1.事件状态 2.事件类型 3.znode的path
public interface ClientWatchManager {
/**
* Return a set of watchers that should
解决mysql导入导出数据乱码问题方法:
1、进入mysql,通过如下命令查看数据库编码方式:
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------------------+
| Variable_name&nbs
Your love is also your weak point.
你的所爱同时也是你的弱点。
If anything in this life is certain, if history has taught us anything, it is
that you can kill anyone.
不顾家的人永远不可能成为一个真正的男人。 &
用phpMyAdmin导入mysql数据库时,我的10M的
数据库不能导入,提示mysql数据库最大只能导入2M。
phpMyAdmin数据库导入出错: You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
1、create database school 创建数据库school
2、drop database school 删除数据库school
3、use school 连接到school数据库,使其成为当前数据库
4、create table class(classID int primary key identity not null)
创建一个名为class的表,其有一