(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 + ">"; }); // 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("", ""] || !tags.indexOf("", ""] || tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && [1, "", "
"] || !tags.indexOf("", ""] || // matched above (!tags.indexOf("", ""] || !tags.indexOf("", ""] || // IE can't serialize and