(function() {
/*
* jQuery 1.2.6 - New Wave Javascript
*
* Copyright (c) 2008 John Resig (jquery.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
* $Rev: 5685 $
*/
// Map over jQuery in case of overwrite
var _jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$;
var jQuery = window.jQuery = window.$ = function(selector, context) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init(selector, context);
};
// A simple way to check for HTML strings or ID strings
// (both of which we optimize for)
var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
// Is it a simple selector
isSimple = /^.[^:#\[\.]*$/,
// Will speed up references to undefined, and allows munging its name.
undefined;
jQuery.fn = jQuery.prototype = {
init: function(selector, context) {
// Make sure that a selection was provided
selector = selector || document;
// Handle $(DOMElement)
if (selector.nodeType) {
this[0] = selector;
this.length = 1;
return this;
}
// Handle HTML strings
if (typeof selector == "string") {
// Are we dealing with HTML string or an ID?
var match = quickExpr.exec(selector);
// Verify a match, and that no context was specified for #id
if (match && (match[1] || !context)) {
// HANDLE: $(html) -> $(array)
if (match[1])
selector = jQuery.clean([match[1]], context);
// HANDLE: $("#id")
else {
var elem = document.getElementById(match[3]);
// Make sure an element was located
if (elem) {
// Handle the case where IE and Opera return items
// by name instead of ID
if (elem.id != match[3])
return jQuery().find(selector);
// Otherwise, we inject the element directly into the jQuery object
return jQuery(elem);
}
selector = [];
}
// HANDLE: $(expr, [context])
// (which is just equivalent to: $(content).find(expr)
} else
return jQuery(context).find(selector);
// HANDLE: $(function)
// Shortcut for document ready
} else if (jQuery.isFunction(selector))
return jQuery(document)[jQuery.fn.ready ? "ready" : "load"](selector);
return this.setArray(jQuery.makeArray(selector));
},
// The current version of jQuery being used
jquery: "1.2.6",
// The number of elements contained in the matched element set
size: function() {
return this.length;
},
// The number of elements contained in the matched element set
length: 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 == undefined ?
// Return a 'clean' array
jQuery.makeArray(this) :
// Return just the object
this[num];
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function(elems) {
// Build a new jQuery matched element set
var ret = jQuery(elems);
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
// Return the newly-formed element set
return ret;
},
// Force the current matched set of elements to become
// the specified array of elements (destroying the stack in the process)
// You should use pushStack() in order to do this, but maintain the stack
setArray: function(elems) {
// Resetting the length to 0, then using the native Array push
// is a super-fast way to populate an object with array-like properties
this.length = 0;
Array.prototype.push.apply(this, elems);
return this;
},
// 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);
},
// Determine the position of an element within
// the matched set of elements
index: function(elem) {
var ret = -1;
// Locate the position of the desired element
return jQuery.inArray(
// If it receives a jQuery object, the first element is used
elem && elem.jquery ? elem[0] : elem
, this);
},
attr: function(name, value, type) {
var options = name;
// Look for the case where we're accessing a style value
if (name.constructor == String)
if (value === undefined)
return this[0] && jQuery[type || "attr"](this[0], name);
else {
options = {};
options[name] = value;
}
// Check to see if we're setting style values
return this.each(function(i) {
// Set all the styles
for (name in options)
jQuery.attr(
type ?
this.style :
this,
name, jQuery.prop(this, options[name], type, i, name)
);
});
},
css: function(key, value) {
// ignore negative width and height values
if ((key == 'width' || key == 'height') && parseFloat(value) < 0)
value = undefined;
return this.attr(key, value, "curCSS");
},
text: function(text) {
if (typeof text != "object" && text != null)
return this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(text));
var ret = "";
jQuery.each(text || this, function() {
jQuery.each(this.childNodes, function() {
if (this.nodeType != 8)
ret += this.nodeType != 1 ?
this.nodeValue :
jQuery.fn.text([this]);
});
});
return ret;
},
wrapAll: function(html) {
if (this[0])
// The elements to wrap the target around
jQuery(html, this[0].ownerDocument)
.clone()
.insertBefore(this[0])
.map(function() {
var elem = this;
while (elem.firstChild)
elem = elem.firstChild;
return elem;
})
.append(this);
return this;
},
wrapInner: function(html) {
return this.each(function() {
jQuery(this).contents().wrapAll(html);
});
},
wrap: function(html) {
return this.each(function() {
jQuery(this).wrapAll(html);
});
},
append: function() {
return this.domManip(arguments, true, false, function(elem) {
if (this.nodeType == 1)
this.appendChild(elem);
});
},
prepend: function() {
return this.domManip(arguments, true, true, function(elem) {
if (this.nodeType == 1)
this.insertBefore(elem, this.firstChild);
});
},
before: function() {
return this.domManip(arguments, false, false, function(elem) {
this.parentNode.insertBefore(elem, this);
});
},
after: function() {
return this.domManip(arguments, false, true, function(elem) {
this.parentNode.insertBefore(elem, this.nextSibling);
});
},
end: function() {
return this.prevObject || jQuery([]);
},
find: function(selector) {
var elems = jQuery.map(this, function(elem) {
return jQuery.find(selector, elem);
});
return this.pushStack(/[^+>] [^+>]/.test(selector) || selector.indexOf("..") > -1 ?
jQuery.unique(elems) :
elems);
},
clone: function(events) {
// Do the clone
var ret = this.map(function() {
if (jQuery.browser.msie && !jQuery.isXMLDoc(this)) {
// IE copies events bound via attachEvent when
// using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal
// In order to get around this, we use innerHTML.
// Unfortunately, this means some modifications to
// attributes in IE that are actually only stored
// as properties will not be copied (such as the
// the name attribute on an input).
var clone = this.cloneNode(true),
container = document.createElement("div");
container.appendChild(clone);
return jQuery.clean([container.innerHTML])[0];
} else
return this.cloneNode(true);
});
// Need to set the expando to null on the cloned set if it exists
// removeData doesn't work here, IE removes it from the original as well
// this is primarily for IE but the data expando shouldn't be copied over in any browser
var clone = ret.find("*").andSelf().each(function() {
if (this[expando] != undefined)
this[expando] = null;
});
// Copy the events from the original to the clone
if (events === true)
this.find("*").andSelf().each(function(i) {
if (this.nodeType == 3)
return;
var events = jQuery.data(this, "events");
for (var type in events)
for (var handler in events[type])
jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data);
});
// Return the cloned set
return ret;
},
filter: function(selector) {
return this.pushStack(
jQuery.isFunction(selector) &&
jQuery.grep(this, function(elem, i) {
return selector.call(elem, i);
}) ||
jQuery.multiFilter(selector, this));
},
not: function(selector) {
if (selector.constructor == String)
// test special case where just one selector is passed in
if (isSimple.test(selector))
return this.pushStack(jQuery.multiFilter(selector, this, true));
else
selector = jQuery.multiFilter(selector, this);
var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
return this.filter(function() {
return isArrayLike ? jQuery.inArray(this, selector) < 0 : this != selector;
});
},
add: function(selector) {
return this.pushStack(jQuery.unique(jQuery.merge(
this.get(),
typeof selector == 'string' ?
jQuery(selector) :
jQuery.makeArray(selector)
)));
},
is: function(selector) {
return !!selector && jQuery.multiFilter(selector, this).length > 0;
},
hasClass: function(selector) {
return this.is("." + selector);
},
val: function(value) {
if (value == undefined) {
if (this.length) {
var elem = this[0];
// We need to handle select boxes special
if (jQuery.nodeName(elem, "select")) {
var 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];
if (option.selected) {
// Get the specifc value for the option
value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
// We don't need an array for one selects
if (one)
return value;
// Multi-Selects return an array
values.push(value);
}
}
return values;
// Everything else, we just grab the value
} else
return (this[0].value || "").replace(/\r/g, "");
}
return undefined;
}
if (value.constructor == Number)
value += '';
return this.each(function() {
if (this.nodeType != 1)
return;
if (value.constructor == Array && /radio|checkbox/.test(this.type))
this.checked = (jQuery.inArray(this.value, value) >= 0 ||
jQuery.inArray(this.name, value) >= 0);
else if (jQuery.nodeName(this, "select")) {
var values = jQuery.makeArray(value);
jQuery("option", this).each(function() {
this.selected = (jQuery.inArray(this.value, values) >= 0 ||
jQuery.inArray(this.text, values) >= 0);
});
if (!values.length)
this.selectedIndex = -1;
} else
this.value = value;
});
},
html: function(value) {
return value == undefined ?
(this[0] ?
this[0].innerHTML :
null) :
this.empty().append(value);
},
replaceWith: function(value) {
return this.after(value).remove();
},
eq: function(i) {
return this.slice(i, i + 1);
},
slice: function() {
return this.pushStack(Array.prototype.slice.apply(this, arguments));
},
map: function(callback) {
return this.pushStack(jQuery.map(this, function(elem, i) {
return callback.call(elem, i, elem);
}));
},
andSelf: function() {
return this.add(this.prevObject);
},
data: function(key, value) {
var parts = key.split(".");
parts[1] = parts[1] ? "." + parts[1] : "";
if (value === undefined) {
var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
if (data === undefined && this.length)
data = jQuery.data(this[0], key);
return data === undefined && parts[1] ?
this.data(parts[0]) :
data;
} else
return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
jQuery.data(this, key, value);
});
},
removeData: function(key) {
return this.each(function() {
jQuery.removeData(this, key);
});
},
domManip: function(args, table, reverse, callback) {
var clone = this.length > 1, elems;
return this.each(function() {
if (!elems) {
elems = jQuery.clean(args, this.ownerDocument);
if (reverse)
elems.reverse();
}
var obj = this;
if (table && jQuery.nodeName(this, "table") && jQuery.nodeName(elems[0], "tr"))
obj = this.getElementsByTagName("tbody")[0] || this.appendChild(this.ownerDocument.createElement("tbody"));
var scripts = jQuery([]);
jQuery.each(elems, function() {
var elem = clone ?
jQuery(this).clone(true)[0] :
this;
// execute all scripts after the elements have been injected
if (jQuery.nodeName(elem, "script"))
scripts = scripts.add(elem);
else {
// Remove any inner scripts for later evaluation
if (elem.nodeType == 1)
scripts = scripts.add(jQuery("script", elem).remove());
// Inject the elements into the document
callback.call(obj, elem);
}
});
scripts.each(evalScript);
});
}
};
// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
function evalScript(i, elem) {
if (elem.src)
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
else
jQuery.globalEval(elem.text || elem.textContent || elem.innerHTML || "");
if (elem.parentNode)
elem.parentNode.removeChild(elem);
}
function now() {
return +new Date;
}
jQuery.extend = jQuery.fn.extend = function() {
// copy reference to target object
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
// Handle a deep copy situation
if (target.constructor == 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" && typeof target != "function")
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 (var name in options) {
var src = target[name], copy = options[name];
// Prevent never-ending loop
if (target === copy)
continue;
// Recurse if we're merging object values
if (deep && copy && typeof copy == "object" && !copy.nodeType)
target[name] = jQuery.extend(deep,
// Never move original objects, clone them
src || (copy.length != null ? [] : {})
, copy);
// Don't bring in undefined values
else if (copy !== undefined)
target[name] = copy;
}
// Return the modified object
return target;
};
var expando = "jQuery" + now(), uuid = 0, windowData = {},
// exclude the following css properties to add px
exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
// cache defaultView
defaultView = document.defaultView || {};
jQuery.extend({
noConflict: function(deep) {
window.$ = _$;
if (deep)
window.jQuery = _jQuery;
return jQuery;
},
// See test/unit/core.js for details concerning this function.
isFunction: function(fn) {
return !!fn && typeof fn != "string" && !fn.nodeName &&
fn.constructor != Array && /^[\s[]?function/.test(fn + "");
},
// check if an element is in a (or is an) XML document
isXMLDoc: function(elem) {
return elem.documentElement && !elem.body ||
elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
},
// Evalulates a script in a global context
globalEval: function(data) {
data = jQuery.trim(data);
if (data) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if (jQuery.browser.msie)
script.text = data;
else
script.appendChild(document.createTextNode(data));
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
head.insertBefore(script, head.firstChild);
head.removeChild(script);
}
},
nodeName: function(elem, name) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},
cache: {},
data: function(elem, name, data) {
elem = elem == window ?
windowData :
elem;
var id = elem[expando];
// Compute a unique ID for the element
if (!id)
id = elem[expando] = ++uuid;
// Only generate the data cache if we're
// trying to access or manipulate it
if (name && !jQuery.cache[id])
jQuery.cache[id] = {};
// Prevent overriding the named cache with undefined values
if (data !== undefined)
jQuery.cache[id][name] = data;
// Return the named cache data, or the ID for the element
return name ?
jQuery.cache[id][name] :
id;
},
removeData: function(elem, name) {
elem = elem == window ?
windowData :
elem;
var id = elem[expando];
// If we want to remove a specific section of the element's data
if (name) {
if (jQuery.cache[id]) {
// Remove the section of cache data
delete jQuery.cache[id][name];
// If we've removed all the data, remove the element's cache
name = "";
for (name in jQuery.cache[id])
break;
if (!name)
jQuery.removeData(elem);
}
// Otherwise, we want to remove all of the element's data
} else {
// Clean up the element expando
try {
delete elem[expando];
} catch (e) {
// IE has trouble directly removing the expando
// but it's ok with using removeAttribute
if (elem.removeAttribute)
elem.removeAttribute(expando);
}
// Completely remove the data cache
delete jQuery.cache[id];
}
},
// args is for internal usage only
each: function(object, callback, args) {
var name, i = 0, length = object.length;
if (args) {
if (length == undefined) {
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 (length == undefined) {
for (name in object)
if (callback.call(object[name], name, object[name]) === false)
break;
} else
for (var value = object[0];
i < length && callback.call(value, i, value) !== false; value = object[++i]) { }
}
return object;
},
prop: function(elem, value, type, i, name) {
// Handle executable functions
if (jQuery.isFunction(value))
value = value.call(elem, i);
// Handle passing in a number to a CSS property
return value && value.constructor == Number && type == "curCSS" && !exclude.test(name) ?
value + "px" :
value;
},
className: {
// internal only, use addClass("class")
add: function(elem, classNames) {
jQuery.each((classNames || "").split(/\s+/), function(i, className) {
if (elem.nodeType == 1 && !jQuery.className.has(elem.className, className))
elem.className += (elem.className ? " " : "") + className;
});
},
// internal only, use removeClass("class")
remove: function(elem, classNames) {
if (elem.nodeType == 1)
elem.className = classNames != undefined ?
jQuery.grep(elem.className.split(/\s+/), function(className) {
return !jQuery.className.has(classNames, className);
}).join(" ") :
"";
},
// internal only, use hasClass("class")
has: function(elem, className) {
return jQuery.inArray(className, (elem.className || elem).toString().split(/\s+/)) > -1;
}
},
// A method for quickly swapping in/out CSS properties to get correct calculations
swap: function(elem, options, callback) {
var old = {};
// Remember the old values, and insert the new ones
for (var name in options) {
old[name] = elem.style[name];
elem.style[name] = options[name];
}
callback.call(elem);
// Revert the old values
for (var name in options)
elem.style[name] = old[name];
},
css: function(elem, name, force) {
if (name == "width" || name == "height") {
var val, props = { position: "absolute", visibility: "hidden", display: "block" }, which = name == "width" ? ["Left", "Right"] : ["Top", "Bottom"];
function getWH() {
val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
var padding = 0, border = 0;
jQuery.each(which, function() {
padding += parseFloat(jQuery.curCSS(elem, "padding" + this, true)) || 0;
border += parseFloat(jQuery.curCSS(elem, "border" + this + "Width", true)) || 0;
});
val -= Math.round(padding + border);
}
if (jQuery(elem).is(":visible"))
getWH();
else
jQuery.swap(elem, props, getWH);
return Math.max(0, val);
}
return jQuery.curCSS(elem, name, force);
},
curCSS: function(elem, name, force) {
var ret, style = elem.style;
// A helper method for determining if an element's values are broken
function color(elem) {
if (!jQuery.browser.safari)
return false;
// defaultView is cached
var ret = defaultView.getComputedStyle(elem, null);
return !ret || ret.getPropertyValue("color") == "";
}
// We need to handle opacity special in IE
if (name == "opacity" && jQuery.browser.msie) {
ret = jQuery.attr(style, "opacity");
return ret == "" ?
"1" :
ret;
}
// Opera sometimes will give the wrong display answer, this fixes it, see #2037
if (jQuery.browser.opera && name == "display") {
var save = style.outline;
style.outline = "0 solid black";
style.outline = save;
}
// Make sure we're using the right name for getting the float value
if (name.match(/float/i))
name = styleFloat;
if (!force && style && style[name])
ret = style[name];
else if (defaultView.getComputedStyle) {
// Only "float" is needed here
if (name.match(/float/i))
name = "float";
name = name.replace(/([A-Z])/g, "-$1").toLowerCase();
var computedStyle = defaultView.getComputedStyle(elem, null);
if (computedStyle && !color(elem))
ret = computedStyle.getPropertyValue(name);
// If the element isn't reporting its values properly in Safari
// then some display: none elements are involved
else {
var swap = [], stack = [], a = elem, i = 0;
// Locate all of the parent display: none elements
for (; a && color(a); a = a.parentNode)
stack.unshift(a);
// Go through and make them visible, but in reverse
// (It would be better if we knew the exact display type that they had)
for (; i < stack.length; i++)
if (color(stack[i])) {
swap[i] = stack[i].style.display;
stack[i].style.display = "block";
}
// Since we flip the display style, we have to handle that
// one special, otherwise get the value
ret = name == "display" && swap[stack.length - 1] != null ?
"none" :
(computedStyle && computedStyle.getPropertyValue(name)) || "";
// Finally, revert the display styles back
for (i = 0; i < swap.length; i++)
if (swap[i] != null)
stack[i].style.display = swap[i];
}
// We should always get a number back from opacity
if (name == "opacity" && ret == "")
ret = "1";
} else if (elem.currentStyle) {
var camelCase = name.replace(/\-(\w)/g, function(all, letter) {
return letter.toUpperCase();
});
ret = elem.currentStyle[name] || elem.currentStyle[camelCase];
// 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
if (!/^\d+(px)?$/i.test(ret) && /^\d/.test(ret)) {
// Remember the original values
var left = style.left, rsLeft = elem.runtimeStyle.left;
// Put in the new values to get a computed value out
elem.runtimeStyle.left = elem.currentStyle.left;
style.left = ret || 0;
ret = style.pixelLeft + "px";
// Revert the changed values
style.left = left;
elem.runtimeStyle.left = rsLeft;
}
}
return ret;
},
clean: function(elems, context) {
var ret = [];
context = context || document;
// !context.createElement fails in IE with an error but returns typeof 'object'
if (typeof context.createElement == 'undefined')
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
jQuery.each(elems, function(i, elem) {
if (!elem)
return;
if (elem.constructor == Number)
elem += '';
// Convert html string into DOM nodes
if (typeof elem == "string") {
// Fix "XHTML"-style tags in all browsers
elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag) {
return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
all :
front + "></" + tag + ">";
});
// Trim whitespace, otherwise indexOf won't work as expected
var tags = jQuery.trim(elem).toLowerCase(), div = context.createElement("div");
var wrap =
// option or optgroup
!tags.indexOf("<opt") &&
[1, "<select multiple='multiple'>", "</select>"] ||
!tags.indexOf("<leg") &&
[1, "<fieldset>", "</fieldset>"] ||
tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
[1, "<table>", "</table>"] ||
!tags.indexOf("<tr") &&
[2, "<table><tbody>", "</tbody></table>"] ||
// <thead> matched above
(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
!tags.indexOf("<col") &&
[2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||
// IE can't serialize <link> and <script> tags normally
jQuery.browser.msie &&
[1, "div<div>", "</div>"] ||
[0, "", ""];
// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2];
// Move to the right depth
while (wrap[0]--)
div = div.lastChild;
// Remove IE's autoinserted <tbody> from table fragments
if (jQuery.browser.msie) {
// String was a <table>, *may* have spurious <tbody>
var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
div.firstChild && div.firstChild.childNodes :
// String was a bare <thead> or <tfoot>
wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
div.childNodes :
[];
for (var j = tbody.length - 1; j >= 0; --j)
if (jQuery.nodeName(tbody[j], "tbody") && !tbody[j].childNodes.length)
tbody[j].parentNode.removeChild(tbody[j]);
// IE completely kills leading whitespace when innerHTML is used
if (/^\s/.test(elem))
div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]), div.firstChild);
}
elem = jQuery.makeArray(div.childNodes);
}
if (elem.length === 0 && (!jQuery.nodeName(elem, "form") && !jQuery.nodeName(elem, "select")))
return;
if (elem[0] == undefined || jQuery.nodeName(elem, "form") || elem.options)
ret.push(elem);
else
ret = jQuery.merge(ret, elem);
});
return ret;
},
attr: function(elem, name, value) {
// don't set attributes on text and comment nodes
if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
return undefined;
var notxml = !jQuery.isXMLDoc(elem),
// Whether we are setting (or getting)
set = value !== undefined,
msie = jQuery.browser.msie;
// Try to normalize/fix the name
name = notxml && jQuery.props[name] || name;
// Only do all the following if this is a node (faster for style)
// IE elem.getAttribute passes even for style
if (elem.tagName) {
// These attributes require special treatment
var special = /href|src|style/.test(name);
// Safari mis-reports the default selected property of a hidden option
// Accessing the parent's selectedIndex property fixes it
if (name == "selected" && jQuery.browser.safari)
elem.parentNode.selectedIndex;
// If applicable, access the attribute via the DOM 0 way
if (name in elem && notxml && !special) {
if (set) {
// We can't allow the type property to be changed (since it causes problems in IE)
if (name == "type" && jQuery.nodeName(elem, "input") && elem.parentNode)
throw "type property can't be changed";
elem[name] = value;
}
// browsers index elements by id/name on forms, give priority to attributes.
if (jQuery.nodeName(elem, "form") && elem.getAttributeNode(name))
return elem.getAttributeNode(name).nodeValue;
return elem[name];
}
if (msie && notxml && name == "style")
return jQuery.attr(elem.style, "cssText", value);
if (set)
// convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute(name, "" + value);
var attr = msie && notxml && special
// Some attributes require a special call on IE
? elem.getAttribute(name, 2)
: elem.getAttribute(name);
// Non-existent attributes return null, we normalize to undefined
return attr === null ? undefined : attr;
}
// elem is actually elem.style ... set the style
// IE uses filters for opacity
if (msie && name == "opacity") {
if (set) {
// IE has trouble with opacity if it does not have layout
// Force it by setting the zoom level
elem.zoom = 1;
// Set the alpha filter to set the opacity
elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/, "") +
(parseInt(value) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
}
return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1]) / 100) + '' :
"";
}
name = name.replace(/-([a-z])/ig, function(all, letter) {
return letter.toUpperCase();
});
if (set)
elem[name] = value;
return elem[name];
},
trim: function(text) {
return (text || "").replace(/^\s+|\s+$/g, "");
},
makeArray: function(array) {
var ret = [];
if (array != null) {
var i = array.length;
//the window, strings and functions also have 'length'
if (i == null || array.split || array.setInterval || array.call)
ret[0] = array;
else
while (i)
ret[--i] = array[i];
}
return ret;
},
inArray: function(elem, array) {
for (var i = 0, length = array.length; i < length; i++)
// Use === because on IE, window == document
if (array[i] === elem)
return i;
return -1;
},
merge: function(first, second) {
// We have to loop this way because IE & Opera overwrite the length
// expando of getElementsByTagName
var i = 0, elem, pos = first.length;
// Also, we need to make sure that the correct elements are being returned
// (IE returns comment nodes in a '*' query)
if (jQuery.browser.msie) {
while (elem = second[i++])
if (elem.nodeType != 8)
first[pos++] = elem;
} else
while (elem = second[i++])
first[pos++] = elem;
return first;
},
unique: function(array) {
var ret = [], done = {};
try {
for (var i = 0, length = array.length; i < length; i++) {
var id = jQuery.data(array[i]);
if (!done[id]) {
done[id] = true;
ret.push(array[i]);
}
}
} catch (e) {
ret = array;
}
return ret;
},
grep: function(elems, callback, inv) {
var ret = [];
// Go through the array, only saving the items
// that pass the validator function
for (var i = 0, length = elems.length; i < length; i++)
if (!inv != !callback(elems[i], i))
ret.push(elems[i]);
return ret;
},
map: function(elems, callback) {
var ret = [];
// Go through the array, translating each of the items to their
// new value (or values).
for (var i = 0, length = elems.length; i < length; i++) {
var value = callback(elems[i], i);
if (value != null)
ret[ret.length] = value;
}
return ret.concat.apply([], ret);
}
});
var userAgent = navigator.userAgent.toLowerCase();
// Figure out what browser is being used
jQuery.browser = {
version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
safari: /webkit/.test(userAgent),
opera: /opera/.test(userAgent),
msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
};
var styleFloat = jQuery.browser.msie ?
"styleFloat" :
"cssFloat";
jQuery.extend({
// Check to see if the W3C box model is being used
boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
props: {
"for": "htmlFor",
"class": "className",
"float": styleFloat,
cssFloat: styleFloat,
styleFloat: styleFloat,
readonly: "readOnly",
maxlength: "maxLength",
cellspacing: "cellSpacing"
}
});
jQuery.each({
parent: function(elem) { return elem.parentNode; },
parents: function(elem) { return jQuery.dir(elem, "parentNode"); },
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"); },
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(selector) {
var ret = jQuery.map(this, fn);
if (selector && typeof selector == "string")
ret = jQuery.multiFilter(selector, ret);
return this.pushStack(jQuery.unique(ret));
};
});
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(name, original) {
jQuery.fn[name] = function() {
var args = arguments;
return this.each(function() {
for (var i = 0, length = args.length; i < length; i++)
jQuery(args[i])[original](this);
});
};
});
jQuery.each({
removeAttr: function(name) {
jQuery.attr(this, name, "");
if (this.nodeType == 1)
this.removeAttribute(name);
},
addClass: function(classNames) {
jQuery.className.add(this, classNames);
},
removeClass: function(classNames) {
jQuery.className.remove(this, classNames);
},
toggleClass: function(classNames) {
jQuery.className[jQuery.className.has(this, classNames) ? "remove" : "add"](this, classNames);
},
remove: function(selector) {
if (!selector || jQuery.filter(selector, [this]).r.length) {
// Prevent memory leaks
jQuery("*", this).add(this).each(function() {
jQuery.event.remove(this);
jQuery.removeData(this);
});
if (this.parentNode)
this.parentNode.removeChild(this);
}
},
empty: function() {
// Remove element nodes and prevent memory leaks
jQuery(">*", this).remove();
// Remove any remaining nodes
while (this.firstChild)
this.removeChild(this.firstChild);
}
}, function(name, fn) {
jQuery.fn[name] = function() {
return this.each(fn, arguments);
};
});
jQuery.each(["Height", "Width"], function(i, name) {
var type = name.toLowerCase();
jQuery.fn[type] = function(size) {
// Get window width or height
return this[0] == window ?
// Opera reports document.body.client[Width/Height] properly in both quirks and standards
jQuery.browser.opera && document.body["client" + name] ||
// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
jQuery.browser.safari && window["inner" + name] ||
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
document.compatMode == "CSS1Compat" && document.documentElement["client" + name] || document.body["client" + name] :
// Get document width or height
this[0] == document ?
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) :
// Get or set width or height on the element
size == undefined ?
// Get width or height on the element
(this.length ? jQuery.css(this[0], type) : null) :
// Set the width or height on the element (default to pixels if value is unitless)
this.css(type, size.constructor == String ? size : size + "px");
};
});
// Helper function used by the dimensions and offset modules
function num(elem, prop) {
return elem[0] && parseInt(jQuery.curCSS(elem[0], prop, true), 10) || 0;
} var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
"(?:[\\w*_-]|\\\\.)" :
"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
quickChild = new RegExp("^>\\s*(" + chars + "+)"),
quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
quickClass = new RegExp("^([#.]?)(" + chars + "*)");
jQuery.extend({
expr: {
"": function(a, i, m) { return m[2] == "*" || jQuery.nodeName(a, m[2]); },
"#": function(a, i, m) { return a.getAttribute("id") == m[2]; },
":": {
// Position Checks
lt: function(a, i, m) { return i < m[3] - 0; },
gt: function(a, i, m) { return i > m[3] - 0; },
nth: function(a, i, m) { return m[3] - 0 == i; },
eq: function(a, i, m) { return m[3] - 0 == i; },
first: function(a, i) { return i == 0; },
last: function(a, i, m, r) { return i == r.length - 1; },
even: function(a, i) { return i % 2 == 0; },
odd: function(a, i) { return i % 2; },
// Child Checks
"first-child": function(a) { return a.parentNode.getElementsByTagName("*")[0] == a; },
"last-child": function(a) { return jQuery.nth(a.parentNode.lastChild, 1, "previousSibling") == a; },
"only-child": function(a) { return !jQuery.nth(a.parentNode.lastChild, 2, "previousSibling"); },
// Parent Checks
parent: function(a) { return a.firstChild; },
empty: function(a) { return !a.firstChild; },
// Text Check
contains: function(a, i, m) { return (a.textContent || a.innerText || jQuery(a).text() || "").indexOf(m[3]) >= 0; },
// Visibility
visible: function(a) { return "hidden" != a.type && jQuery.css(a, "display") != "none" && jQuery.css(a, "visibility") != "hidden"; },
hidden: function(a) { return "hidden" == a.type || jQuery.css(a, "display") == "none" || jQuery.css(a, "visibility") == "hidden"; },
// Form attributes
enabled: function(a) { return !a.disabled; },
disabled: function(a) { return a.disabled; },
checked: function(a) { return a.checked; },
selected: function(a) { return a.selected || jQuery.attr(a, "selected"); },
// Form elements
text: function(a) { return "text" == a.type; },
radio: function(a) { return "radio" == a.type; },
checkbox: function(a) { return "checkbox" == a.type; },
file: function(a) { return "file" == a.type; },
password: function(a) { return "password" == a.type; },
submit: function(a) { return "submit" == a.type; },
image: function(a) { return "image" == a.type; },
reset: function(a) { return "reset" == a.type; },
button: function(a) { return "button" == a.type || jQuery.nodeName(a, "button"); },
input: function(a) { return /input|select|textarea|button/i.test(a.nodeName); },
// :has()
has: function(a, i, m) { return jQuery.find(m[3], a).length; },
// :header
header: function(a) { return /h\d/i.test(a.nodeName); },
// :animated
animated: function(a) { return jQuery.grep(jQuery.timers, function(fn) { return a == fn.elem; }).length; }
}
},
// The regular expressions that power the parsing engine
parse: [
// Match: [@value='test'], [@foo]
/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
// Match: :contains('foo')
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
// Match: :even, :last-child, #id, .class
new RegExp("^([:.#]*)(" + chars + "+)")
],
multiFilter: function(expr, elems, not) {
var old, cur = [];
while (expr && expr != old) {
old = expr;
var f = jQuery.filter(expr, elems, not);
expr = f.t.replace(/^\s*,\s*/, "");
cur = not ? elems = f.r : jQuery.merge(cur, f.r);
}
return cur;
},
find: function(t, context) {
// Quickly handle non-string expressions
if (typeof t != "string")
return [t];
// check to make sure context is a DOM element or a document
if (context && context.nodeType != 1 && context.nodeType != 9)
return [];
// Set the correct context (if none is provided)
context = context || document;
// Initialize the search
var ret = [context], done = [], last, nodeName;
// Continue while a selector expression exists, and while
// we're no longer looping upon ourselves
while (t && last != t) {
var r = [];
last = t;
t = jQuery.trim(t);
var foundToken = false,
// An attempt at speeding up child selectors that
// point to a specific element tag
re = quickChild,
m = re.exec(t);
if (m) {
nodeName = m[1].toUpperCase();
// Perform our own iteration and filter
for (var i = 0; ret[i]; i++)
for (var c = ret[i].firstChild; c; c = c.nextSibling)
if (c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName))
r.push(c);
ret = r;
t = t.replace(re, "");
if (t.indexOf(" ") == 0) continue;
foundToken = true;
} else {
re = /^([>+~])\s*(\w*)/i;
if ((m = re.exec(t)) != null) {
r = [];
var merge = {};
nodeName = m[2].toUpperCase();
m = m[1];
for (var j = 0, rl = ret.length; j < rl; j++) {
var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
for (; n; n = n.nextSibling)
if (n.nodeType == 1) {
var id = jQuery.data(n);
if (m == "~" && merge[id]) break;
if (!nodeName || n.nodeName.toUpperCase() == nodeName) {
if (m == "~") merge[id] = true;
r.push(n);
}
if (m == "+") break;
}
}
ret = r;
// And remove the token
t = jQuery.trim(t.replace(re, ""));
foundToken = true;
}
}
// See if there's still an expression, and that we haven't already
// matched a token
if (t && !foundToken) {
// Handle multiple expressions
if (!t.indexOf(",")) {
// Clean the result set
if (context == ret[0]) ret.shift();
// Merge the result sets
done = jQuery.merge(done, ret);
// Reset the context
r = ret = [context];
// Touch up the selector string
t = " " + t.substr(1, t.length);
} else {
// Optimize for the case nodeName#idName
var re2 = quickID;
var m = re2.exec(t);
// Re-organize the results, so that they're consistent
if (m) {
m = [0, m[2], m[3], m[1]];
} else {
// Otherwise, do a traditional filter check for
// ID, class, and element selectors
re2 = quickClass;
m = re2.exec(t);
}
m[2] = m[2].replace(/\\/g, "");
var elem = ret[ret.length - 1];
// Try to do a global search by ID, where we can
if (m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem)) {
// Optimization for HTML document case
var oid = elem.getElementById(m[2]);
// Do a quick check for the existence of the actual ID attribute
// to avoid selecting by the name attribute in IE
// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
if ((jQuery.browser.msie || jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2])
oid = jQuery('[@id="' + m[2] + '"]', elem)[0];
// Do a quick check for node name (where applicable) so
// that div#foo searches will be really fast
ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
} else {
// We need to find all descendant elements
for (var i = 0; ret[i]; i++) {
// Grab the tag name being searched for
var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
// Handle IE7 being really dumb about <object>s
if (tag == "*" && ret[i].nodeName.toLowerCase() == "object")
tag = "param";
r = jQuery.merge(r, ret[i].getElementsByTagName(tag));
}
// It's faster to filter by class and be done with it
if (m[1] == ".")
r = jQuery.classFilter(r, m[2]);
// Same with ID filtering
if (m[1] == "#") {
var tmp = [];
// Try to find the element with the ID
for (var i = 0; r[i]; i++)
if (r[i].getAttribute("id") == m[2]) {
tmp = [r[i]];
break;
}
r = tmp;
}
ret = r;
}
t = t.replace(re2, "");
}
}
// If a selector string still exists
if (t) {
// Attempt to filter it
var val = jQuery.filter(t, r);
ret = r = val.r;
t = jQuery.trim(val.t);
}
}
// An error occurred with the selector;
// just return an empty set instead
if (t)
ret = [];
// Remove the root context
if (ret && context == ret[0])
ret.shift();
// And combine the results
done = jQuery.merge(done, ret);
return done;
},
classFilter: function(r, m, not) {
m = " " + m + " ";
var tmp = [];
for (var i = 0; r[i]; i++) {
var pass = (" " + r[i].className + " ").indexOf(m) >= 0;
if (!not && pass || not && !pass)
tmp.push(r[i]);
}
return tmp;
},
filter: function(t, r, not) {
var last;
// Look for common filter expressions
while (t && t != last) {
last = t;
var p = jQuery.parse, m;
for (var i = 0; p[i]; i++) {
m = p[i].exec(t);
if (m) {
// Remove what we just matched
t = t.substring(m[0].length);
m[2] = m[2].replace(/\\/g, "");
break;
}
}
if (!m)
break;
// :not() is a special case that can be optimized by
// keeping it out of the expression list
if (m[1] == ":" && m[2] == "not")
// optimize if only one selector found (most common case)
r = isSimple.test(m[3]) ?
jQuery.filter(m[3], r, true).r :
jQuery(r).not(m[3]);
// We can get a big speed boost by filtering by class here
else if (m[1] == ".")
r = jQuery.classFilter(r, m[2], not);
else if (m[1] == "[") {
var tmp = [], type = m[3];
for (var i = 0, rl = r.length; i < rl; i++) {
var a = r[i], z = a[jQuery.props[m[2]] || m[2]];
if (z == null || /href|src|selected/.test(m[2]))
z = jQuery.attr(a, m[2]) || '';
if ((type == "" && !!z ||
type == "=" && z == m[5] ||
type == "!=" && z != m[5] ||
type == "^=" && z && !z.indexOf(m[5]) ||
type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
(type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not)
tmp.push(a);
}
r = tmp;
// We can get a speed boost by handling nth-child here
} else if (m[1] == ":" && m[2] == "nth-child") {
var merge = {}, tmp = [],
// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
!/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
// calculate the numbers (first)n+(last) including if they are negative
first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
// loop through all the elements left in the jQuery object
for (var i = 0, rl = r.length; i < rl; i++) {
var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
if (!merge[id]) {
var c = 1;
for (var n = parentNode.firstChild; n; n = n.nextSibling)
if (n.nodeType == 1)
n.nodeIndex = c++;
merge[id] = true;
}
var add = false;
if (first == 0) {
if (node.nodeIndex == last)
add = true;
} else if ((node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0)
add = true;
if (add ^ not)
tmp.push(node);
}
r = tmp;
// Otherwise, find the expression to execute
} else {
var fn = jQuery.expr[m[1]];
if (typeof fn == "object")
fn = fn[m[2]];
if (typeof fn == "string")
fn = eval("false||function(a,i){return " + fn + ";}");
// Execute it against the current filter
r = jQuery.grep(r, function(elem, i) {
return fn(elem, i, m, r);
}, not);
}
}
// Return an array of filtered elements (r)
// and the modified expression string (t)
return { r: r, t: t };
},
dir: function(elem, dir) {
var matched = [],
cur = elem[dir];
while (cur && cur != document) {
if (cur.nodeType == 1)
matched.push(cur);
cur = cur[dir];
}
return matched;
},
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;
}
});
/*
* A number of helper functions used for managing events.
* Many of the ideas behind this code orignated 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;
// For whatever reason, IE has trouble passing the window object
// around, causing it to be cloned in the process
if (jQuery.browser.msie && elem.setInterval)
elem = window;
// Make sure that the function being executed has a unique ID
if (!handler.guid)
handler.guid = this.guid++;
// if data is passed, bind to handler
if (data != undefined) {
// Create temporary function pointer to original handler
var fn = handler;
// Create unique handler function, wrapped around original handler
handler = this.proxy(fn, function() {
// Pass arguments and context to original handler
return fn.apply(this, arguments);
});
// Store data in unique handler
handler.data = data;
}
// Init the element's event structure
var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function() {
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
if (typeof jQuery != "undefined" && !jQuery.event.triggered)
return jQuery.event.handle.apply(arguments.callee.elem, arguments);
});
// Add elem as a property of the handle function
// This is to prevent a memory leak with non-native
// event in IE.
handle.elem = elem;
// Handle multiple events separated by a space
// jQuery(...).bind("mouseover mouseout", fn);
jQuery.each(types.split(/\s+/), function(index, type) {
// Namespaced event handlers
var parts = type.split(".");
type = parts[0];
handler.type = parts[1];
// Get the current list of functions bound to this event
var handlers = events[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 (!jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false) {
// Bind the global event handler to the element
if (elem.addEventListener)
elem.addEventListener(type, handle, false);
else if (elem.attachEvent)
elem.attachEvent("on" + type, handle);
}
}
// Add the function to the element's handler list
handlers[handler.guid] = handler;
// Keep track of which events have been used, for global triggering
jQuery.event.global[type] = true;
});
// Nullify elem to prevent memory leaks in IE
elem = null;
},
guid: 1,
global: {},
// Detach an event or set of events from an element
remove: function(elem, types, handler) {
// don't do events on text and comment nodes
if (elem.nodeType == 3 || elem.nodeType == 8)
return;
var events = jQuery.data(elem, "events"), ret, index;
if (events) {
// Unbind all events for the element
if (types == undefined || (typeof types == "string" && types.charAt(0) == "."))
for (var type in events)
this.remove(elem, type + (types || ""));
else {
// types is actually an event object here
if (types.type) {
handler = types.handler;
types = types.type;
}
// Handle multiple events seperated by a space
// jQuery(...).unbind("mouseover mouseout", fn);
jQuery.each(types.split(/\s+/), function(index, type) {
// Namespaced event handlers
var parts = type.split(".");
type = parts[0];
if (events[type]) {
// remove the given handler for the given type
if (handler)
delete events[type][handler.guid];
// remove all handlers for the given type
else
for (handler in events[type])
// Handle the removal of namespaced events
if (!parts[1] || events[type][handler].type == parts[1])
delete events[type][handler];
// remove generic event handler if no more handlers exist
for (ret in events[type]) break;
if (!ret) {
if (!jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false) {
if (elem.removeEventListener)
elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
else if (elem.detachEvent)
elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
}
ret = null;
delete events[type];
}
}
});
}
// Remove the expando if it's no longer used
for (ret in events) break;
if (!ret) {
var handle = jQuery.data(elem, "handle");
if (handle) handle.elem = null;
jQuery.removeData(elem, "events");
jQuery.removeData(elem, "handle");
}
}
},
trigger: function(type, data, elem, donative, extra) {
// Clone the incoming data, if any
data = jQuery.makeArray(data);
if (type.indexOf("!") >= 0) {
type = type.slice(0, -1);
var exclusive = true;
}
// Handle a global trigger
if (!elem) {
// Only trigger if we've ever bound an event for it
if (this.global[type])
jQuery("*").add([window, document]).trigger(type, data);
// Handle triggering a single element
} else {
// don't do events on text and comment nodes
if (elem.nodeType == 3 || elem.nodeType == 8)
return undefined;
var val, ret, fn = jQuery.isFunction(elem[type] || null),
// Check to see if we need to provide a fake event, or not
event = !data[0] || !data[0].preventDefault;
// Pass along a fake event
if (event) {
data.unshift({
type: type,
target: elem,
preventDefault: function() { },
stopPropagation: function() { },
timeStamp: now()
});
data[0][expando] = true; // no need to fix fake event
}
// Enforce the right trigger type
data[0].type = type;
if (exclusive)
data[0].exclusive = true;
// Trigger the event, it is assumed that "handle" is a function
var handle = jQuery.data(elem, "handle");
if (handle)
val = handle.apply(elem, data);
// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
if ((!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on" + type] && elem["on" + type].apply(elem, data) === false)
val = false;
// Extra functions don't get the custom event object
if (event)
data.shift();
// Handle triggering of extra function
if (extra && jQuery.isFunction(extra)) {
// call the extra function and tack the current return value on the end for possible inspection
ret = extra.apply(elem, val == null ? data : data.concat(val));
// if anything is returned, give it precedence and have it overwrite the previous value
if (ret !== undefined)
val = ret;
}
// Trigger the native events (except for clicks on links)
if (fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click")) {
this.triggered = true;
try {
elem[type]();
// prevent IE from throwing an error for some hidden elements
} catch (e) { }
}
this.triggered = false;
}
return val;
},
handle: function(event) {
// returned undefined or false
var val, ret, namespace, all, handlers;
event = arguments[0] = jQuery.event.fix(event || window.event);
// Namespaced event handlers
namespace = event.type.split(".");
event.type = namespace[0];
namespace = namespace[1];
// Cache this now, all = true means, any handler
all = !namespace && !event.exclusive;
handlers = (jQuery.data(this, "events") || {})[event.type];
for (var j in handlers) {
var handler = handlers[j];
// Filter the functions by class
if (all || handler.type == namespace) {
// Pass in a reference to the handler function itself
// So that we can later remove it
event.handler = handler;
event.data = handler.data;
ret = handler.apply(this, arguments);
if (val !== false)
val = ret;
if (ret === false) {
event.preventDefault();
event.stopPropagation();
}
}
}
return val;
},
fix: function(event) {
if (event[expando] == true)
return event;
// store a copy of the original event object
// and "clone" to set read-only properties
var originalEvent = event;
event = { originalEvent: originalEvent };
var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");
for (var i = props.length; i; i--)
event[props[i]] = originalEvent[props[i]];
// Mark it as fixed
event[expando] = true;
// add preventDefault and stopPropagation since
// they will not work on the clone
event.preventDefault = function() {
// if preventDefault exists run it on the original event
if (originalEvent.preventDefault)
originalEvent.preventDefault();
// otherwise set the returnValue property of the original event to false (IE)
originalEvent.returnValue = false;
};
event.stopPropagation = function() {
// if stopPropagation exists run it on the original event
if (originalEvent.stopPropagation)
originalEvent.stopPropagation();
// otherwise set the cancelBubble property of the original event to true (IE)
originalEvent.cancelBubble = true;
};
// Fix timeStamp
event.timeStamp = event.timeStamp || now();
// Fix target property, if necessary
if (!event.target)
event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
// 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 doc = document.documentElement, body = document.body;
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
}
// Add which for key events
if (!event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode))
event.which = event.charCode || event.keyCode;
// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
if (!event.metaKey && event.ctrlKey)
event.metaKey = event.ctrlKey;
// Add which for click: 1 == left; 2 == middle; 3 == right
// Note: button is not normalized, so don't use it
if (!event.which && event.button)
event.which = (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0)));
return event;
},
proxy: function(fn, proxy) {
// 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 || this.guid++;
// So proxy can be declared as an argument
return proxy;
},
special: {
ready: {
setup: function() {
// Make sure the ready event is setup
bindReady();
return;
},
teardown: function() { return; }
},
mouseenter: {
setup: function() {
if (jQuery.browser.msie) return false;
jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
return true;
},
teardown: function() {
if (jQuery.browser.msie) return false;
jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
return true;
},
handler: function(event) {
// If we actually just moused on to a sub-element, ignore it
if (withinElement(event, this)) return true;
// Execute the right handlers by setting the event type to mouseenter
event.type = "mouseenter";
return jQuery.event.handle.apply(this, arguments);
}
},
mouseleave: {
setup: function() {
if (jQuery.browser.msie) return false;
jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
return true;
},
teardown: function() {
if (jQuery.browser.msie) return false;
jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
return true;
},
handler: function(event) {
// If we actually just moused on to a sub-element, ignore it
if (withinElement(event, this)) return true;
// Execute the right handlers by setting the event type to mouseleave
event.type = "mouseleave";
return jQuery.event.handle.apply(this, arguments);
}
}
}
};
jQuery.fn.extend({
bind: function(type, data, fn) {
return type == "unload" ? this.one(type, data, fn) : this.each(function() {
jQuery.event.add(this, type, fn || data, fn && data);
});
},
one: function(type, data, fn) {
var one = jQuery.event.proxy(fn || data, function(event) {
jQuery(this).unbind(event, one);
return (fn || data).apply(this, arguments);
});
return this.each(function() {
jQuery.event.add(this, type, one, fn && data);
});
},
unbind: function(type, fn) {
return this.each(function() {
jQuery.event.remove(this, type, fn);
});
},
trigger: function(type, data, fn) {
return this.each(function() {
jQuery.event.trigger(type, data, this, true, fn);
});
},
triggerHandler: function(type, data, fn) {
return this[0] && jQuery.event.trigger(type, data, this[0], false, fn);
},
toggle: function(fn) {
// Save reference to arguments for access in closure
var args = arguments, i = 1;
// link all the functions, so any of them can unbind this click handler
while (i < args.length)
jQuery.event.proxy(fn, args[i++]);
return this.click(jQuery.event.proxy(fn, function(event) {
// Figure out which function to execute
this.lastToggle = (this.lastToggle || 0) % i;
// Make sure that clicks stop
event.preventDefault();
// and execute the function
return args[this.lastToggle++].apply(this, arguments) || false;
}));
},
hover: function(fnOver, fnOut) {
return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
},
ready: function(fn) {
// Attach the listeners
bindReady();
// If the DOM is already ready
if (jQuery.isReady)
// Execute the function immediately
fn.call(document, jQuery);
// Otherwise, remember the function for later
else
// Add the function to the wait list
jQuery.readyList.push(function() { return fn.call(this, jQuery); });
return this;
}
});
jQuery.extend({
isReady: false,
readyList: [],
// Handle when the DOM is ready
ready: function() {
// Make sure that the DOM is not already loaded
if (!jQuery.isReady) {
// Remember that the DOM is ready
jQuery.isReady = true;
// If there are functions bound, to execute
if (jQuery.readyList) {
// Execute all of them
jQuery.each(jQuery.readyList, function() {
this.call(document);
});
// Reset the list of functions
jQuery.readyList = null;
}
// Trigger any bound ready events
jQuery(document).triggerHandler("ready");
}
}
});
var readyBound = false;
function bindReady() {
if (readyBound) return;
readyBound = true;
// Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
if (document.addEventListener && !jQuery.browser.opera)
// Use the handy event callback
document.addEventListener("DOMContentLoaded", jQuery.ready, false);
// If IE is used and is not in a frame
// Continually check to see if the document is ready
if (jQuery.browser.msie && window == top) (function() {
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 (error) {
setTimeout(arguments.callee, 0);
return;
}
// and execute any waiting functions
jQuery.ready();
})();
if (jQuery.browser.opera)
document.addEventListener("DOMContentLoaded", function() {
if (jQuery.isReady) return;
for (var i = 0; i < document.styleSheets.length; i++)
if (document.styleSheets[i].disabled) {
setTimeout(arguments.callee, 0);
return;
}
// and execute any waiting functions
jQuery.ready();
}, false);
if (jQuery.browser.safari) {
var numStyles;
(function() {
if (jQuery.isReady) return;
if (document.readyState != "loaded" && document.readyState != "complete") {
setTimeout(arguments.callee, 0);
return;
}
if (numStyles === undefined)
numStyles = jQuery("style, link[rel=stylesheet]").length;
if (document.styleSheets.length != numStyles) {
setTimeout(arguments.callee, 0);
return;
}
// and execute any waiting functions
jQuery.ready();
})();
}
// A fallback to window.onload, that will always work
jQuery.event.add(window, "load", jQuery.ready);
}
jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick," +
"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
"submit,keydown,keypress,keyup,error").split(","), function(i, name) {
// Handle event binding
jQuery.fn[name] = function(fn) {
return fn ? this.bind(name, fn) : this.trigger(name);
};
});
// Checks if an event happened on an element within another element
// Used in jQuery.event.special.mouseenter and mouseleave handlers
var withinElement = function(event, elem) {
// Check if mouse(over|out) are still within the same parent element
var parent = event.relatedTarget;
// Traverse up the tree
while (parent && parent != elem) try { parent = parent.parentNode; } catch (error) { parent = elem; }
// Return true if we actually just moused on to a sub-element
return parent == elem;
};
// Prevent memory leaks in IE
// And prevent errors on refresh with events like mouseover in other browsers
// Window isn't included so as not to unbind existing unload events
jQuery(window).bind("unload", function() {
jQuery("*").add(document).unbind();
});
jQuery.fn.extend({
// Keep a copy of the old load
_load: jQuery.fn.load,
load: function(url, params, callback) {
if (typeof url != 'string')
return this._load(url);
var off = url.indexOf(" ");
if (off >= 0) {
var selector = url.slice(off, url.length);
url = url.slice(0, off);
}
callback = callback || function() { };
// Default to a GET request
var type = "GET";
// If the second parameter was provided
if (params)
// If it's a function
if (jQuery.isFunction(params)) {
// We assume that it's the callback
callback = params;
params = null;
// Otherwise, build a param string
} else {
params = jQuery.param(params);
type = "POST";
}
var self = this;
// Request the remote document
jQuery.ajax({
url: url,
type: type,
dataType: "html",
data: params,
complete: function(res, status) {
// If successful, inject the HTML into all the matched elements
if (status == "success" || status == "notmodified")
// See if a selector was specified
self.html(selector ?
// Create a dummy div to hold the results
jQuery("<div/>")
// inject the contents of the document in, removing the scripts
// to avoid any 'Permission Denied' errors in IE
.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
// Locate the specified elements
.find(selector) :
// If not, just inject the full result
res.responseText);
self.each(callback, [res.responseText, status, res]);
}
});
return this;
},
serialize: function() {
return jQuery.param(this.serializeArray());
},
serializeArray: function() {
return this.map(function() {
return jQuery.nodeName(this, "form") ?
jQuery.makeArray(this.elements) : this;
})
.filter(function() {
return this.name && !this.disabled &&
(this.checked || /select|textarea/i.test(this.nodeName) ||
/text|hidden|password/i.test(this.type));
})
.map(function(i, elem) {
var val = jQuery(this).val();
return val == null ? null :
val.constructor == Array ?
jQuery.map(val, function(val, i) {
return { name: elem.name, value: val };
}) :
{ name: elem.name, value: val };
}).get();
}
});
// Attach a bunch of functions for handling common AJAX events
jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i, o) {
jQuery.fn[o] = function(f) {
return this.bind(o, f);
};
});
var jsc = now();
jQuery.extend({
get: function(url, data, callback, type) {
// shift arguments if data argument was ommited
if (jQuery.isFunction(data)) {
callback = data;
data = null;
}
return jQuery.ajax({
type: "GET",
url: url,
data: data,
success: callback,
dataType: type
});
},
getScript: function(url, callback) {
return jQuery.get(url, null, callback, "script");
},
getJSON: function(url, data, callback) {
return jQuery.get(url, data, callback, "json");
},
post: function(url, data, callback, type) {
if (jQuery.isFunction(data)) {
callback = data;
data = {};
}
return jQuery.ajax({
type: "POST",
url: url,
data: data,
success: callback,
dataType: type
});
},
ajaxSetup: function(settings) {
jQuery.extend(jQuery.ajaxSettings, settings);
},
ajaxSettings: {
url: location.href,
global: true,
type: "GET",
timeout: 0,
contentType: "application/x-www-form-urlencoded",
processData: true,
async: true,
data: null,
username: null,
password: null,
accepts: {
xml: "application/xml, text/xml",
html: "text/html",
script: "text/javascript, application/javascript",
json: "application/json, text/javascript",
text: "text/plain",
_default: "*/*"
}
},
// Last-Modified header cache for next request
lastModified: {},
ajax: function(s) {
// Extend the settings, but re-extend 's' so that it can be
// checked again later (in the test suite, specifically)
s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
var jsonp, jsre = /=\?(&|$)/g, status, data,
type = s.type.toUpperCase();
// convert data if not already a string
if (s.data && s.processData && typeof s.data != "string")
s.data = jQuery.param(s.data);
// Handle JSONP Parameter Callbacks
if (s.dataType == "jsonp") {
if (type == "GET") {
if (!s.url.match(jsre))
s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
} else if (!s.data || !s.data.match(jsre))
s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
s.dataType = "json";
}
// Build temporary JSONP function
if (s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre))) {
jsonp = "jsonp" + jsc++;
// Replace the =? sequence both in the query string and the data
if (s.data)
s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
s.url = s.url.replace(jsre, "=" + jsonp + "$1");
// We need to make sure
// that a JSONP style response is executed properly
s.dataType = "script";
// Handle JSONP-style loading
window[jsonp] = function(tmp) {
data = tmp;
success();
complete();
// Garbage collect
window[jsonp] = undefined;
try { delete window[jsonp]; } catch (e) { }
if (head)
head.removeChild(script);
};
}
if (s.dataType == "script" && s.cache == null)
s.cache = false;
if (s.cache === false && type == "GET") {
var ts = now();
// try replacing _= if it is there
var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
// if nothing was replaced, add timestamp to the end
s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
}
// If data is available, append data to url for get requests
if (s.data && type == "GET") {
s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
// IE likes to send both get and post data, prevent this
s.data = null;
}
// Watch for a new set of requests
if (s.global && !jQuery.active++)
jQuery.event.trigger("ajaxStart");
// Matches an absolute URL, and saves the domain
var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
// If we're requesting a remote document
// and trying to load JSON or Script with a GET
if (s.dataType == "script" && type == "GET"
&& remote.test(s.url) && remote.exec(s.url)[1] != location.host) {
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = s.url;
if (s.scriptCharset)
script.charset = s.scriptCharset;
// Handle Script loading
if (!jsonp) {
var done = false;
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function() {
if (!done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete")) {
done = true;
success();
complete();
head.removeChild(script);
}
};
}
head.appendChild(script);
// We handle everything using the script element injection
return undefined;
}
var requestDone = false;
// Create the request object; Microsoft failed to properly
// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
// Open the socket
// Passing null username, generates a login popup on Opera (#2865)
if (s.username)
xhr.open(type, s.url, s.async, s.username, s.password);
else
xhr.open(type, s.url, s.async);
// Need an extra try/catch for cross domain requests in Firefox 3
try {
// Set the correct header, if data is being sent
if (s.data)
xhr.setRequestHeader("Content-Type", s.contentType);
// Set the If-Modified-Since header, if ifModified mode.
if (s.ifModified)
xhr.setRequestHeader("If-Modified-Since",
jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT");
// Set header so the called script knows that it's an XMLHttpRequest
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
// Set the Accepts header for the server, depending on the dataType
xhr.setRequestHeader("Accept", s.dataType && s.accepts[s.dataType] ?
s.accepts[s.dataType] + ", */*" :
s.accepts._default);
} catch (e) { }
// Allow custom headers/mimetypes
if (s.beforeSend && s.beforeSend(xhr, s) === false) {
// cleanup active request counter
s.global && jQuery.active--;
// close opended socket
xhr.abort();
return false;
}
if (s.global)
jQuery.event.trigger("ajaxSend", [xhr, s]);
// Wait for a response to come back
var onreadystatechange = function(isTimeout) {
// The transfer is complete and the data is available, or the request timed out
if (!requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout")) {
requestDone = true;
// clear poll interval
if (ival) {
clearInterval(ival);
ival = null;
}
status = isTimeout == "timeout" && "timeout" ||
!jQuery.httpSuccess(xhr) && "error" ||
s.ifModified && jQuery.httpNotModified(xhr, s.url) && "notmodified" ||
"success";
if (status == "success") {
// Watch for, and catch, XML document parse errors
try {
// process the data (runs the xml through httpData regardless of callback)
data = jQuery.httpData(xhr, s.dataType, s.dataFilter);
} catch (e) {
status = "parsererror";
}
}
// Make sure that the request was successful or notmodified
if (status == "success") {
// Cache Last-Modified header, if ifModified mode.
var modRes;
try {
modRes = xhr.getResponseHeader("Last-Modified");
} catch (e) { } // swallow exception thrown by FF if header is not available
if (s.ifModified && modRes)
jQuery.lastModified[s.url] = modRes;
// JSONP handles its own success callback
if (!jsonp)
success();
} else
jQuery.handleError(s, xhr, status);
// Fire the complete handlers
complete();
// Stop memory leaks
if (s.async)
xhr = null;
}
};
if (s.async) {
// don't attach the handler to the request, just poll it instead
var ival = setInterval(onreadystatechange, 13);
// Timeout checker
if (s.timeout > 0)
setTimeout(function() {
// Check to see if the request is still happening
if (xhr) {
// Cancel the request
xhr.abort();
if (!requestDone)
onreadystatechange("timeout");
}
}, s.timeout);
}
// Send the data
try {
xhr.send(s.data);
} catch (e) {
jQuery.handleError(s, xhr, null, e);
}
// firefox 1.5 doesn't fire statechange for sync requests
if (!s.async)
onreadystatechange();
function success() {
// If a local callback was specified, fire it and pass it the data
if (s.success)
s.success(data, status);
// Fire the global callback
if (s.global)
jQuery.event.trigger("ajaxSuccess", [xhr, s]);
}
function complete() {
// Process result
if (s.complete)
s.complete(xhr, status);
// The request was completed
if (s.global)
jQuery.event.trigger("ajaxComplete", [xhr, s]);
// Handle the global AJAX counter
if (s.global && ! --jQuery.active)
jQuery.event.trigger("ajaxStop");
}
// return XMLHttpRequest to allow aborting the request etc.
return xhr;
},
handleError: function(s, xhr, status, e) {
// If a local callback was specified, fire it
if (s.error) s.error(xhr, status, e);
// Fire the global callback
if (s.global)
jQuery.event.trigger("ajaxError", [xhr, s, e]);
},
// Counter for holding the number of active queries
active: 0,
// Determines if an XMLHttpRequest was successful or not
httpSuccess: function(xhr) {
try {
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
return !xhr.status && location.protocol == "file:" ||
(xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || xhr.status == 1223 ||
jQuery.browser.safari && xhr.status == undefined;
} catch (e) { }
return false;
},
// Determines if an XMLHttpRequest returns NotModified
httpNotModified: function(xhr, url) {
try {
var xhrRes = xhr.getResponseHeader("Last-Modified");
// Firefox always returns 200. check Last-Modified date
return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
jQuery.browser.safari && xhr.status == undefined;
} catch (e) { }
return false;
},
httpData: function(xhr, type, filter) {
var ct = xhr.getResponseHeader("content-type"),
xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
data = xml ? xhr.responseXML : xhr.responseText;
if (xml && data.documentElement.tagName == "parsererror")
throw "parsererror";
// Allow a pre-filtering function to sanitize the response
if (filter)
data = filter(data, type);
// If the type is "script", eval it in global context
if (type == "script")
jQuery.globalEval(data);
// Get the JavaScript object, if JSON is used.
if (type == "json")
data = eval("(" + data + ")");
return data;
},
// Serialize an array of form elements or a set of
// key/values into a query string
param: function(a) {
var s = [];
// If an array was passed in, assume that it is an array
// of form elements
if (a.constructor == Array || a.jquery)
// Serialize the form elements
jQuery.each(a, function() {
s.push(encodeURIComponent(this.name) + "=" + encodeURIComponent(this.value));
});
// Otherwise, assume that it's an object of key/value pairs
else
// Serialize the key/values
for (var j in a)
// If the value is an array then the key names need to be repeated
if (a[j] && a[j].constructor == Array)
jQuery.each(a[j], function() {
s.push(encodeURIComponent(j) + "=" + encodeURIComponent(this));
});
else
s.push(encodeURIComponent(j) + "=" + encodeURIComponent(jQuery.isFunction(a[j]) ? a[j]() : a[j]));
// Return the resulting serialization
return s.join("&").replace(/%20/g, "+");
}
});
jQuery.fn.extend({
show: function(speed, callback) {
return speed ?
this.animate({
height: "show", width: "show", opacity: "show"
}, speed, callback) :
this.filter(":hidden").each(function() {
this.style.display = this.oldblock || "";
if (jQuery.css(this, "display") == "none") {
var elem = jQuery("<" + this.tagName + " />").appendTo("body");
this.style.display = elem.css("display");
// handle an edge condition where css is - div { display:none; } or similar
if (this.style.display == "none")
this.style.display = "block";
elem.remove();
}
}).end();
},
hide: function(speed, callback) {
return speed ?
this.animate({
height: "hide", width: "hide", opacity: "hide"
}, speed, callback) :
this.filter(":visible").each(function() {
this.oldblock = this.oldblock || jQuery.css(this, "display");
this.style.display = "none";
}).end();
},
// Save the old toggle function
_toggle: jQuery.fn.toggle,
toggle: function(fn, fn2) {
return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
this._toggle.apply(this, arguments) :
fn ?
this.animate({
height: "toggle", width: "toggle", opacity: "toggle"
}, fn, fn2) :
this.each(function() {
jQuery(this)[jQuery(this).is(":hidden") ? "show" : "hide"]();
});
},
slideDown: function(speed, callback) {
return this.animate({ height: "show" }, speed, callback);
},
slideUp: function(speed, callback) {
return this.animate({ height: "hide" }, speed, callback);
},
slideToggle: function(speed, callback) {
return this.animate({ height: "toggle" }, speed, callback);
},
fadeIn: function(speed, callback) {
return this.animate({ opacity: "show" }, speed, callback);
},
fadeOut: function(speed, callback) {
return this.animate({ opacity: "hide" }, speed, callback);
},
fadeTo: function(speed, to, callback) {
return this.animate({ opacity: to }, speed, callback);
},
animate: function(prop, speed, easing, callback) {
var optall = jQuery.speed(speed, easing, callback);
return this[optall.queue === false ? "each" : "queue"](function() {
if (this.nodeType != 1)
return false;
var opt = jQuery.extend({}, optall), p,
hidden = jQuery(this).is(":hidden"), self = this;
for (p in prop) {
if (prop[p] == "hide" && hidden || prop[p] == "show" && !hidden)
return opt.complete.call(this);
if (p == "height" || p == "width") {
// Store display property
opt.display = jQuery.css(this, "display");
// Make sure that nothing sneaks out
opt.overflow = this.style.overflow;
}
}
if (opt.overflow != null)
this.style.overflow = "hidden";
opt.curAnim = jQuery.extend({}, prop);
jQuery.each(prop, function(name, val) {
var e = new jQuery.fx(self, opt, name);
if (/toggle|show|hide/.test(val))
e[val == "toggle" ? hidden ? "show" : "hide" : val](prop);
else {
var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
start = e.cur(true) || 0;
if (parts) {
var end = parseFloat(parts[2]),
unit = parts[3] || "px";
// We need to compute starting value
if (unit != "px") {
self.style[name] = (end || 1) + unit;
start = ((end || 1) / e.cur(true)) * start;
self.style[name] = start + unit;
}
// If a +=/-= token was provided, we're doing a relative animation
if (parts[1])
end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
e.custom(start, end, unit);
} else
e.custom(start, val, "");
}
});
// For JS strict compliance
return true;
});
},
queue: function(type, fn) {
if (jQuery.isFunction(type) || (type && type.constructor == Array)) {
fn = type;
type = "fx";
}
if (!type || (typeof type == "string" && !fn))
return queue(this[0], type);
return this.each(function() {
if (fn.constructor == Array)
queue(this, type, fn);
else {
queue(this, type).push(fn);
if (queue(this, type).length == 1)
fn.call(this);
}
});
},
stop: function(clearQueue, gotoEnd) {
var timers = jQuery.timers;
if (clearQueue)
this.queue([]);
this.each(function() {
// go in reverse order so anything added to the queue during the loop is ignored
for (var i = timers.length - 1; i >= 0; i--)
if (timers[i].elem == this) {
if (gotoEnd)
// force the next step to be the last
timers[i](true);
timers.splice(i, 1);
}
});
// start the next in the queue if the last step wasn't forced
if (!gotoEnd)
this.dequeue();
return this;
}
});
var queue = function(elem, type, array) {
if (elem) {
type = type || "fx";
var q = jQuery.data(elem, type + "queue");
if (!q || array)
q = jQuery.data(elem, type + "queue", jQuery.makeArray(array));
}
return q;
};
jQuery.fn.dequeue = function(type) {
type = type || "fx";
return this.each(function() {
var q = queue(this, type);
q.shift();
if (q.length)
q[0].call(this);
});
};
jQuery.extend({
speed: function(speed, easing, fn) {
var opt = speed && speed.constructor == Object ? speed : {
complete: fn || !fn && easing ||
jQuery.isFunction(speed) && speed,
duration: speed,
easing: fn && easing || easing && easing.constructor != Function && easing
};
opt.duration = (opt.duration && opt.duration.constructor == Number ?
opt.duration :
jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
// Queueing
opt.old = opt.complete;
opt.complete = function() {
if (opt.queue !== false)
jQuery(this).dequeue();
if (jQuery.isFunction(opt.old))
opt.old.call(this);
};
return opt;
},
easing: {
linear: function(p, n, firstNum, diff) {
return firstNum + diff * p;
},
swing: function(p, n, firstNum, diff) {
return ((-Math.cos(p * Math.PI) / 2) + 0.5) * diff + firstNum;
}
},
timers: [],
timerId: null,
fx: function(elem, options, prop) {
this.options = options;
this.elem = elem;
this.prop = prop;
if (!options.orig)
options.orig = {};
}
});
jQuery.fx.prototype = {
// Simple function for setting a style value
update: function() {
if (this.options.step)
this.options.step.call(this.elem, this.now, this);
(jQuery.fx.step[this.prop] || jQuery.fx.step._default)(this);
// Set display property to block for height/width animations
if (this.prop == "height" || this.prop == "width")
this.elem.style.display = "block";
},
// Get the current size
cur: function(force) {
if (this.elem[this.prop] != null && this.elem.style[this.prop] == null)
return this.elem[this.prop];
var r = parseFloat(jQuery.css(this.elem, this.prop, force));
return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
},
// Start an animation from one number to another
custom: function(from, to, unit) {
this.startTime = now();
this.start = from;
this.end = to;
this.unit = unit || this.unit || "px";
this.now = this.start;
this.pos = this.state = 0;
this.update();
var self = this;
function t(gotoEnd) {
return self.step(gotoEnd);
}
t.elem = this.elem;
jQuery.timers.push(t);
if (jQuery.timerId == null) {
jQuery.timerId = setInterval(function() {
var timers = jQuery.timers;
for (var i = 0; i < timers.length; i++)
if (!timers[i]())
timers.splice(i--, 1);
if (!timers.length) {
clearInterval(jQuery.timerId);
jQuery.timerId = null;
}
}, 13);
}
},
// Simple 'show' function
show: function() {
// Remember where we started, so that we can go back to it later
this.options.orig[this.prop] = jQuery.attr(this.elem.style, this.prop);
this.options.show = true;
// Begin the animation
this.custom(0, this.cur());
// Make sure that we start at a small width/height to avoid any
// flash of content
if (this.prop == "width" || this.prop == "height")
this.elem.style[this.prop] = "1px";
// Start by showing the element
jQuery(this.elem).show();
},
// Simple 'hide' function
hide: function() {
// Remember where we started, so that we can go back to it later
this.options.orig[this.prop] = jQuery.attr(this.elem.style, this.prop);
this.options.hide = true;
// Begin the animation
this.custom(this.cur(), 0);
},
// Each step of an animation
step: function(gotoEnd) {
var t = now();
if (gotoEnd || t > this.options.duration + this.startTime) {
this.now = this.end;
this.pos = this.state = 1;
this.update();
this.options.curAnim[this.prop] = true;
var done = true;
for (var i in this.options.curAnim)
if (this.options.curAnim[i] !== true)
done = false;
if (done) {
if (this.options.display != null) {
// Reset the overflow
this.elem.style.overflow = this.options.overflow;
// Reset the display
this.elem.style.display = this.options.display;
if (jQuery.css(this.elem, "display") == "none")
this.elem.style.display = "block";
}
// Hide the element if the "hide" operation was done
if (this.options.hide)
this.elem.style.display = "none";
// Reset the properties, if the item has been hidden or shown
if (this.options.hide || this.options.show)
for (var p in this.options.curAnim)
jQuery.attr(this.elem.style, p, this.options.orig[p]);
}
if (done)
// Execute the complete function
this.options.complete.call(this.elem);
return false;
} else {
var n = t - this.startTime;
this.state = n / this.options.duration;
// Perform the easing function, defaults to swing
this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
this.now = this.start + ((this.end - this.start) * this.pos);
// Perform the next step of the animation
this.update();
}
return true;
}
};
jQuery.extend(jQuery.fx, {
speeds: {
slow: 600,
fast: 200,
// Default speed
def: 400
},
step: {
scrollLeft: function(fx) {
fx.elem.scrollLeft = fx.now;
},
scrollTop: function(fx) {
fx.elem.scrollTop = fx.now;
},
opacity: function(fx) {
jQuery.attr(fx.elem.style, "opacity", fx.now);
},
_default: function(fx) {
fx.elem.style[fx.prop] = fx.now + fx.unit;
}
}
});
// The Offset Method
// Originally By Brandon Aaron, part of the Dimension Plugin
// http://jquery.com/plugins/project/dimensions
jQuery.fn.offset = function() {
var left = 0, top = 0, elem = this[0], results;
if (elem) with (jQuery.browser) {
var parent = elem.parentNode,
offsetChild = elem,
offsetParent = elem.offsetParent,
doc = elem.ownerDocument,
safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
css = jQuery.curCSS,
fixed = css(elem, "position") == "fixed";
// Use getBoundingClientRect if available
if (elem.getBoundingClientRect) {
var box = elem.getBoundingClientRect();
// Add the document scroll offsets
add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
// IE adds the HTML element's border, by default it is medium which is 2px
// IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
// IE 7 standards mode, the border is always 2px
// This border/offset is typically represented by the clientLeft and clientTop properties
// However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
// Therefore this method will be off by 2px in IE while in quirksmode
add(-doc.documentElement.clientLeft, -doc.documentElement.clientTop);
// Otherwise loop through the offsetParents and parentNodes
} else {
// Initial element offsets
add(elem.offsetLeft, elem.offsetTop);
// Get parent offsets
while (offsetParent) {
// Add offsetParent offsets
add(offsetParent.offsetLeft, offsetParent.offsetTop);
// Mozilla and Safari > 2 does not include the border on offset parents
// However Mozilla adds the border for table or table cells
if (mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2)
border(offsetParent);
// Add the document scroll offsets if position is fixed on any offsetParent
if (!fixed && css(offsetParent, "position") == "fixed")
fixed = true;
// Set offsetChild to previous offsetParent unless it is the body element
offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
// Get next offsetParent
offsetParent = offsetParent.offsetParent;
}
// Get parent scroll offsets
while (parent && parent.tagName && !/^body|html$/i.test(parent.tagName)) {
// Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
if (!/^inline|table.*$/i.test(css(parent, "display")))
// Subtract parent scroll offsets
add(-parent.scrollLeft, -parent.scrollTop);
// Mozilla does not add the border for a parent that has overflow != visible
if (mozilla && css(parent, "overflow") != "visible")
border(parent);
// Get next parent
parent = parent.parentNode;
}
// Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
// Mozilla doubles body offsets with a non-absolutely positioned offsetChild
if ((safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
(mozilla && css(offsetChild, "position") != "absolute"))
add(-doc.body.offsetLeft, -doc.body.offsetTop);
// Add the document scroll offsets if position is fixed
if (fixed)
add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
}
// Return an object with top and left properties
results = { top: top, left: left };
}
function border(elem) {
add(jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true));
}
function add(l, t) {
left += parseInt(l, 10) || 0;
top += parseInt(t, 10) || 0;
}
return results;
};
jQuery.fn.extend({
position: function() {
var left = 0, top = 0, results;
if (this[0]) {
// Get *real* offsetParent
var offsetParent = this.offsetParent(),
// Get correct offsets
offset = this.offset(),
parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0} : offsetParent.offset();
// Subtract element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
offset.top -= num(this, 'marginTop');
offset.left -= num(this, 'marginLeft');
// Add offsetParent borders
parentOffset.top += num(offsetParent, 'borderTopWidth');
parentOffset.left += num(offsetParent, 'borderLeftWidth');
// Subtract the two offsets
results = {
top: offset.top - parentOffset.top,
left: offset.left - parentOffset.left
};
}
return results;
},
offsetParent: function() {
var offsetParent = this[0].offsetParent;
while (offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static'))
offsetParent = offsetParent.offsetParent;
return jQuery(offsetParent);
}
});
// Create scrollLeft and scrollTop methods
jQuery.each(['Left', 'Top'], function(i, name) {
var method = 'scroll' + name;
jQuery.fn[method] = function(val) {
if (!this[0]) return;
return val != undefined ?
// Set the scroll offset
this.each(function() {
this == window || this == document ?
window.scrollTo(
!i ? val : jQuery(window).scrollLeft(),
i ? val : jQuery(window).scrollTop()
) :
this[method] = val;
}) :
// Return the scroll offset
this[0] == window || this[0] == document ?
self[i ? 'pageYOffset' : 'pageXOffset'] ||
jQuery.boxModel && document.documentElement[method] ||
document.body[method] :
this[0][method];
};
});
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
jQuery.each(["Height", "Width"], function(i, name) {
var tl = i ? "Left" : "Top", // top or left
br = i ? "Right" : "Bottom"; // bottom or right
// innerHeight and innerWidth
jQuery.fn["inner" + name] = function() {
return this[name.toLowerCase()]() +
num(this, "padding" + tl) +
num(this, "padding" + br);
};
// outerHeight and outerWidth
jQuery.fn["outer" + name] = function(margin) {
return this["inner" + name]() +
num(this, "border" + tl + "Width") +
num(this, "border" + br + "Width") +
(margin ?
num(this, "margin" + tl) + num(this, "margin" + br) : 0);
};
});
})();
相关推荐
原项目可在[http://plugins.jquery.com/project/pagination](http://plugins.jquery.com/project/pagination)找到,版本为v1.2,提供英文原版和中文翻译修改版的源文件下载。 **二、功能与说明** 该插件的CSS样式...
内容概要:本文详细介绍了A*搜索算法和DWA(动态窗口法)算法的基本原理及其在机器人路径规划中的融合应用。A*算法用于全局路径规划,通过启发式搜索找到从起点到目标点的最短路径;DWA算法则专注于局部动态环境下的实时避障,确保机器人在移动过程中能够灵活避开障碍物。两者结合可以在复杂环境中提供高效的路径规划解决方案。文中提供了详细的Python代码实现,帮助读者理解和实践这两种算法的融合方法。 适合人群:对机器人路径规划感兴趣的初学者和技术爱好者,尤其是有一定编程基础的小白。 使用场景及目标:适用于需要在静态和动态环境中进行路径规划的机器人项目。主要目标是使机器人能够在复杂环境中安全、高效地到达目标位置,同时避免障碍物。具体应用场景包括但不限于室内导航、无人驾驶车辆等。 其他说明:文章不仅讲解了理论知识,还给出了具体的代码实现和调试技巧,如启发函数的选择、速度空间采样的优化、评分权重的调整等。此外,还提到了一些常见问题及解决方法,如机器人在遇到突发情况时的行为调整。
ELK日志架构部署与应用指南:构建高效、可靠的日志管理与分析系统 本指南全面介绍ELK(Elasticsearch、Logstash、Kibana)日志架构的部署实践与优化策略,旨在帮助技术团队构建可扩展、高容错的日志处理平台。内容涵盖ELK核心组件(Filebeat、Logstash、Kafka、Elasticsearch、Kibana)的工作原理、架构设计、配置案例及最佳实践,重点解析以下关键内容: ● 架构选型与演进:从基础架构到分布式集群,对比单节点、轻量级(Filebeat+Logstash)及引入Kafka的高可用架构优劣,指导根据实际场景选择合适的部署模型。 ● 组件深度解析:详细讲解Filebeat轻量级采集、Logstash灵活处理、Kafka消息缓冲、Elasticsearch分布式索引及Kibana可视化分析的实现机制与性能调优。 ● 日志规范与实战:明确日志打印格式标准(时间、级别、组件、用户信息等),结合配置示例(如Nginx日志采集到Kafka的动态Topic生成)演示数据流转全过程。 ● 运维与扩展:涵盖集群高可用设计、负载均衡策略、日志实时监控及异常报警机制,为系统稳定性与后续扩展提供完整解决方案。 本指南适合日志管理需求的中大型企业技术团队,可作为从架构设计到落地实施的实操手册,助力提升日志分析效率与系统运维能力。
内容概要:本文详细介绍了基于T型三电平逆变器的虚拟同步机(VSG)控制技术,涵盖VSG的核心算法、中点电位平衡策略以及LCL滤波器的双闭环控制设计。首先探讨了VSG控制的基本原理,包括虚拟惯量和阻尼特性的模拟,以及有功-频率和无功-电压下垂控制的具体实现。针对T型三电平拓扑特有的中点电位漂移问题,提出了多种平衡控制方法。对于LCL滤波器,讨论了其参数设计和双闭环控制策略,特别是电流环PI参数的选择和避免谐振的方法。文中还提供了多个实用的经验公式和调试技巧,并引用了相关领域的权威文献作为理论支持。 适合人群:从事电力电子、新能源并网系统研究和开发的技术人员,尤其是有一定电力电子基础的研发人员。 使用场景及目标:适用于需要深入了解和掌握VSG控制技术和LCL滤波器设计的研究人员和技术开发者。主要目标是帮助读者理解和实现T型三电平逆变器的VSG控制,提高系统的稳定性和性能。 其他说明:文中不仅提供了详细的理论解释,还有具体的代码实现和调试建议,便于读者进行实际操作和验证。同时强调了调试过程中需要注意的安全事项和常见问题的解决方案。
内容概要:本文介绍了Go语言(又称Golang)的特点、应用场景和发展背景。Go语言由Google团队于2007年设计,2009年发布,以其简洁的语法、高效的编译性能和强大的并发支持著称。它摒弃了复杂的面向对象特性,采用接口和组合的方式实现代码复用。作为编译型语言,Go语言通过严格的类型检查确保代码质量,并内置了高效的垃圾回收机制。Go语言广泛应用于服务器端开发、云计算和微服务架构等领域,如Google、Docker和Uber等公司均采用Go语言构建后端服务。此外,Go语言拥有丰富的学习资源,包括官方文档、社区支持以及权威书籍和在线课程。; 适合人群:对编程有一定了解,特别是对高性能后端开发感兴趣的开发者。; 使用场景及目标:①希望掌握一门适用于服务器端开发、云计算和微服务架构的编程语言;②想深入了解并发编程和支持高并发场景的开发技术。; 其他说明:学习Go语言不仅可以提升编程技能,还能借助其活跃的社区和丰富的学习资源,快速适应现代互联网应用开发的需求。
Ollama0.6.2安装文件-2
内容概要:本文详细介绍了Java并发编程中的多个重要概念和技术,包括CountDownLatch、CyclicBarrier、Semaphore等同步工具类,深入探讨了线程的创建方式、运行状态及线程安全问题。文章还讲解了原子性、可见性、有序性三大特性及其解决方案,如锁机制和原子类的应用。此外,文中对比了悲观锁和乐观锁的特点与适用场景,并阐述了线程池的核心参数配置。最后,简要介绍了Spring框架的核心技术,如IOC、AOP及事务管理的基本概念。 适合人群:具备一定Java编程基础,尤其是对并发编程和Spring框架有一定了解的研发人员。 使用场景及目标:①帮助开发者理解Java并发编程中的同步工具类、线程管理及线程安全问题;②指导开发者在实际项目中选择合适的锁机制和线程池配置;③加深对Spring框架中IOC、AOP及事务管理的理解,提升开发效率。 其他说明:本文不仅提供了理论知识,还结合了代码示例,便于读者理解和实践。建议读者在学习过程中结合实际项目需求进行调试和验证,以更好地掌握相关技术。
内容概要:Rust是一种由Mozilla研究院开发的现代系统编程语言,专注于安全、并发和性能。其设计哲学是“零成本抽象”,即在不影响性能的前提下提供高级抽象。Rust通过所有权系统确保内存安全,避免了垃圾回收的需求,有效防止了悬垂指针、数据竞争和无效内存访问等问题。它提供了强大的并发原语,如线程、通道和原子操作,使并发编程更加简单和安全。此外,Rust编译为机器码,性能接近C/C++,并且支持多种操作系统和架构,包括Windows、Linux、macOS以及嵌入式系统。Rust还拥有活跃的社区和丰富的生态系统,提供了大量涵盖多个领域的库和工具。Rust适用于高性能和安全性的系统级应用,如操作系统、数据库、网络服务器和嵌入式系统,同时也被广泛应用于WebAssembly、区块链和人工智能等领域。; 适合人群:对系统编程感兴趣,尤其是希望在保证性能的同时提升代码安全性的开发者。; 使用场景及目标:①需要开发高性能、安全的系统级应用,如操作系统、数据库、网络服务器等;②希望深入理解内存管理和并发编程的最佳实践;③探索WebAssembly、区块链和人工智能等新兴技术领域。; 阅读建议:Rust不仅适合有经验的系统程序员,也适合希望通过学习现代编程语言提升技能的新手。官方教程《The Rust Programming Language》、实践指南《Rust by Example》和练习项目《Rustlings》都是很好的学习资源,建议结合这些资源进行实践和调试。
内容概要:本文介绍了一种基于一致性算法的直流微电网均流均压二级控制方案。该方案采用分布式二级控制器,通过邻居间的通信来计算控制动作,从而实现高效稳定的均流和均压控制。文中详细讨论了恒功率负载平衡点的存在条件,并介绍了即插即用特性的实现。此外,通过MATLAB/Simulink仿真验证了该方案的电压稳定性和鲁棒性。 适合人群:从事电力电子、微电网控制领域的研究人员和技术人员,尤其是对分布式控制系统感兴趣的读者。 使用场景及目标:适用于直流微电网的设计与优化,旨在提高系统的稳定性和效率,特别是在应对非线性负载和突发扰动的情况下。 其他说明:该方案在理论和实践中展现了显著的优势,如更高的均流精度和更快的动态响应时间。然而,仿真运行时间较长,需考虑计算资源的分配。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
内容概要:本文档《互联网大厂200道高频Javascript面试题.pdf》涵盖了广泛的JavaScript知识点,针对200道高频面试题进行了详细解析。内容涉及JavaScript的核心概念(如闭包、原型链、事件循环)、异步编程(如Promise、async/await)、数据类型(如BigInt、Symbol)、DOM操作(如EventTarget、MutationObserver)、性能优化(如防抖、节流)、以及最新的ES提案特性(如import.meta、top-level await)。每个问题不仅提供了简明的答案,还深入探讨了背后的原理和应用场景,帮助读者全面掌握JavaScript的各种特性和最佳实践。 适合人群:具备一定编程基础,特别是对JavaScript有初步了解的前端开发人员,以及准备面试互联网大厂的求职者。 使用场景及目标:①巩固JavaScript基础知识,理解语言内部机制;②掌握常见面试题及其解答技巧,为技术面试做准备;③通过实际案例和代码示例加深对JavaScript特性的理解,提高编程能力。 阅读建议:此资源内容详实,建议读者根据自身水平选择重点章节进行学习,同时结合实际项目或练习题进行实践,以达到更好的学习效果。对于复杂的概念,可以多次阅读并查阅相关资料,确保彻底理解。
内容概要:本文详细介绍了C#编程语言的基础知识和学习路径。首先阐述了C#的背景和优势,强调其广泛的应用领域和良好的就业前景。接着指导读者如何准备学习环境,包括安装Visual Studio等开发工具。文中深入讲解了C#的基础语法,如数据类型、运算符、流程控制语句等,并探讨了面向对象编程的核心概念,包括类与对象、封装、继承、多态等。此外,还介绍了异常处理机制,并通过一个控制台版的学生管理系统项目,帮助读者将理论应用于实践。最后,推荐了一系列学习资源,鼓励读者持续学习和探索C#的高级特性。 适合人群:对编程有兴趣的初学者,尤其是希望从事软件开发或提升编程技能的人士。 使用场景及目标:①帮助读者从零开始系统学习C#,掌握基本语法和核心概念;②通过实战项目巩固所学知识,培养解决实际问题的能力;③为后续深入学习C#的高级特性和应用领域打下坚实基础。 其他说明:本文不仅提供了详尽的知识点讲解,还注重实践操作和项目经验积累,适合自学或作为培训教材使用。建议读者跟随文章步骤逐步实践,并利用推荐的学习资源深化理解。
内容概要:本文详细介绍了使用COMSOL软件建立液氮压裂的热-流-固-损伤耦合模型的方法和技术细节。液氮压裂作为一种环保高效的油气开采方法,能够利用低温特性减少地层污染并提高裂缝扩展效率。文中探讨了模型的关键组件,如传热、达西流、固体力学以及自定义的损伤演化方程,并展示了如何将这些元素整合在一个统一的多物理场环境中进行仿真。此外,还讨论了网格划分、求解器设置、边界条件处理等方面的具体实现方法,以及如何通过后处理手段来分析和展示仿真结果。 适合人群:从事油气田开发、地质工程、计算力学等相关领域的科研人员和技术专家。 使用场景及目标:适用于需要深入理解液氮压裂过程中复杂的物理机制的研究项目,旨在为优化压裂工艺提供理论支持和技术指导。 其他说明:文中提供了大量具体的数学公式和代码片段,帮助读者更好地理解和重现所描述的技术流程。同时强调了不同参数选择对于最终仿真结果的影响,提醒使用者注意实际应用中的各种挑战。
内容概要:本文探讨了AI如何重塑企业价值,特别是通过DeepSeek和Manus这两个技术的推动。DeepSeek以其低成本、高质量的特性,打破了AI应用的技术和成本壁垒,实现了AI赋能平权。Manus作为通用智能体,通过全链路自主执行和多智能体协同架构,显著提升了企业效率并降低了成本。文章详细介绍了AI在多个行业(如金融分析、人力资源、零售运营等)的具体应用案例,展示了AI如何通过数据驱动、自动化和智能化手段,帮助企业实现降本增效、商业模式创新和产品迭代。此外,文中还提出了企业在拥抱AI过程中面临的挑战和应对策略,强调了数据基础、技术选择和组织能力建设的重要性。 适合人群:企业高管、AI技术从业者、数字化转型顾问及对AI感兴趣的创业者。 使用场景及目标:①了解AI技术在企业中的应用场景及其带来的变革;②为企业制定AI战略和实施路径提供参考;③帮助企业识别潜在的AI赋能机会,优化业务流程,提升竞争力。 其他说明:文章通过大量实际案例和数据支持,强调了AI技术在企业中的巨大潜力和现实可行性。同时,提醒企业在拥抱AI时需谨慎规划,避免盲目跟风,确保AI项目的成功落地。
c语言学习资料,共208页
内容概要:本文详细探讨了基于人工势场的无人车避障路径规划算法。主要内容包括三个主要势场的建立及其MATLAB代码实现:引力势场用于吸引无人车向目标点移动;障碍车斥力势场用于使无人车避开障碍物;道路边界势场确保无人车保持在车道内行驶。此外,文中还介绍了如何通过调整不同势场的增益系数、引入朝向因子和动量项等手段优化路径规划性能,提高路径平滑性和安全性。最终形成了完整的路径规划流程,即计算合力、确定方向并迭代推进,使得无人车能够在复杂环境中顺利导航。 适合人群:对无人驾驶技术和路径规划算法感兴趣的科研人员、工程师及高校相关专业学生。 使用场景及目标:适用于模拟和实际测试无人车在静态或动态环境中的避障能力和路径选择行为,旨在提高无人车的安全性和智能水平。 其他说明:文中提供的MATLAB代码仅为简化版本,实际应用中可根据具体需求进一步调整和完善。
内容概要:本文详细探讨了分布式电源(如光伏、风能、燃料电池等)接入电网时对电压产生的影响。通过具体的潮流计算模型,展示了不同类型的分布式电源(DG)在接入电网时所采用的不同节点类型(PQ节点、PV节点等),并分析了它们对电压稳定性的影响。文中还提供了基于Python的Pandapower库构建的测试电网实例,以及MATLAB中的节点类型动态切换逻辑,进一步解释了不同节点类型在实际应用中的表现及其优缺点。 适合人群:从事电力系统研究、分布式能源规划的技术人员和研究人员。 使用场景及目标:帮助技术人员理解分布式电源接入电网时的电压波动机制,优化分布式电源的接入方式,提高电网电压稳定性和可靠性。 其他说明:文章强调了在进行电网规划时,应根据实际情况选择合适的节点类型,避免盲目依赖理想化模型。同时,提出了混合模式作为一种有效的解决方案,能够在不同工况下保持较好的电压质量。
三星轮爬楼车sw18可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
内容概要:本文详细介绍了户外储能电源双向逆变器板的技术资料及其特点。涵盖原理文件、PCB文件、源代码、电感与变压器规格参数等,适用于2KW(最大3KW)的户外储能电源。文中强调了双向软开关DC-DC设计、两颗M0+ 32位MCU的分工、SPWM调制方式、H桥IGBT的应用、详细的电气参数和技术特性。此外,还包括了SPWM信号生成代码示例、硬件设计细节、生产注意事项等。 适合人群:从事户外储能电源开发的技术人员、电子工程师、产品经理等。 使用场景及目标:帮助开发者快速掌握双向逆变器板的设计和生产要点,缩短产品研发周期,提高产品质量和可靠性。具体应用场景包括但不限于户外应急电源、便携式储能设备等。 其他说明:本文提供了丰富的技术细节和实践经验,如双向软开关DC-DC设计、SPWM调制、IGBT驱动、EMC整改记录等,有助于解决实际开发中的难题。同时,附带的实际案例展示了该方案的成功应用,进一步证明了其可行性和优越性。