/* * jQuery UI 1.6rc6 * * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI */;(function($) {var _remove = $.fn.remove,	isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);//Helper functions and ui object$.ui = {	version: "1.6rc6",	// $.ui.plugin is deprecated.  Use the proxy pattern instead.	plugin: {		add: function(module, option, set) {			var proto = $.ui[module].prototype;			for(var i in set) {				proto.plugins[i] = proto.plugins[i] || [];				proto.plugins[i].push([option, set[i]]);			}		},		call: function(instance, name, args) {			var set = instance.plugins[name];			if(!set) { return; }			for (var i = 0; i < set.length; i++) {				if (instance.options[set[i][0]]) {					set[i][1].apply(instance.element, args);				}			}		}	},	contains: function(a, b) {		return document.compareDocumentPosition			? a.compareDocumentPosition(b) & 16			: a !== b && a.contains(b);	},	cssCache: {},	css: function(name) {		if ($.ui.cssCache[name]) { return $.ui.cssCache[name]; }		var tmp = $('<div class="ui-gen"></div>').addClass(name).css({position:'absolute', top:'-5000px', left:'-5000px', display:'block'}).appendTo('body');		//if (!$.browser.safari)			//tmp.appendTo('body');		//Opera and Safari set width and height to 0px instead of auto		//Safari returns rgba(0,0,0,0) when bgcolor is not set		$.ui.cssCache[name] = !!(			(!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) ||			!(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor')))		);		try { $('body').get(0).removeChild(tmp.get(0));	} catch(e){}		return $.ui.cssCache[name];	},	hasScroll: function(el, a) {		//If overflow is hidden, the element might have extra content, but the user wants to hide it		if ($(el).css('overflow') == 'hidden') { return false; }		var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',			has = false;		if (el[scroll] > 0) { return true; }		// TODO: determine which cases actually cause this to happen		// if the element doesn't have the scroll set, see if it's possible to		// set the scroll		el[scroll] = 1;		has = (el[scroll] > 0);		el[scroll] = 0;		return has;	},	isOverAxis: function(x, reference, size) {		//Determines when x coordinate is over "b" element axis		return (x > reference) && (x < (reference + size));	},	isOver: function(y, x, top, left, height, width) {		//Determines when x, y coordinates is over "b" element		return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);	},	keyCode: {		BACKSPACE: 8,		CAPS_LOCK: 20,		COMMA: 188,		CONTROL: 17,		DELETE: 46,		DOWN: 40,		END: 35,		ENTER: 13,		ESCAPE: 27,		HOME: 36,		INSERT: 45,		LEFT: 37,		NUMPAD_ADD: 107,		NUMPAD_DECIMAL: 110,		NUMPAD_DIVIDE: 111,		NUMPAD_ENTER: 108,		NUMPAD_MULTIPLY: 106,		NUMPAD_SUBTRACT: 109,		PAGE_DOWN: 34,		PAGE_UP: 33,		PERIOD: 190,		RIGHT: 39,		SHIFT: 16,		SPACE: 32,		TAB: 9,		UP: 38	}};// WAI-ARIA normalizationif (isFF2) {	var attr = $.attr,		removeAttr = $.fn.removeAttr,		ariaNS = "http://www.w3.org/2005/07/aaa",		ariaState = /^aria-/,		ariaRole = /^wairole:/;	$.attr = function(elem, name, value) {		var set = value !== undefined;		return (name == 'role'			? (set				? attr.call(this, elem, name, "wairole:" + value)				: (attr.apply(this, arguments) || "").replace(ariaRole, ""))			: (ariaState.test(name)				? (set					? elem.setAttributeNS(ariaNS,						name.replace(ariaState, "aaa:"), value)					: attr.call(this, elem, name.replace(ariaState, "aaa:")))				: attr.apply(this, arguments)));	};	$.fn.removeAttr = function(name) {		return (ariaState.test(name)			? this.each(function() {				this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));			}) : removeAttr.call(this, name));	};}//jQuery plugins$.fn.extend({	remove: function() {		// Safari has a native remove event which actually removes DOM elements,		// so we have to use triggerHandler instead of trigger (#3037).		$("*", this).add(this).each(function() {			$(this).triggerHandler("remove");		});		return _remove.apply(this, arguments );	},	enableSelection: function() {		return this			.attr('unselectable', 'off')			.css('MozUserSelect', '')			.unbind('selectstart.ui');	},	disableSelection: function() {		return this			.attr('unselectable', 'on')			.css('MozUserSelect', 'none')			.bind('selectstart.ui', function() { return false; });	},	scrollParent: function() {		var scrollParent;		if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {			scrollParent = this.parents().filter(function() {				return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));			}).eq(0);		} else {			scrollParent = this.parents().filter(function() {				return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));			}).eq(0);		}		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;	}});//Additional selectors$.extend($.expr[':'], {	data: function(elem, i, match) {		return !!$.data(elem, match[3]);	},	focusable: function(element) {		var nodeName = element.nodeName.toLowerCase(),			tabIndex = $.attr(element, 'tabindex');		return (/input|select|textarea|button|object/.test(nodeName)			? !element.disabled			: 'a' == nodeName || 'area' == nodeName				? element.href || !isNaN(tabIndex)				: !isNaN(tabIndex))			// the element and all of its ancestors must be visible			// the browser may report that the area is hidden			&& !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;	},	tabbable: function(element) {		var tabIndex = $.attr(element, 'tabindex');		return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');	}});// $.widget is a factory to create jQuery plugins// taking some boilerplate code out of the plugin codefunction getter(namespace, plugin, method, args) {	function getMethods(type) {		var methods = $[namespace][plugin][type] || [];		return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);	}	var methods = getMethods('getter');	if (args.length == 1 && typeof args[0] == 'string') {		methods = methods.concat(getMethods('getterSetter'));	}	return ($.inArray(method, methods) != -1);}$.widget = function(name, prototype) {	var namespace = name.split(".")[0];	name = name.split(".")[1];	// create plugin method	$.fn[name] = function(options) {		var isMethodCall = (typeof options == 'string'),			args = Array.prototype.slice.call(arguments, 1);		// prevent calls to internal methods		if (isMethodCall && options.substring(0, 1) == '_') {			return this;		}		// handle getter methods		if (isMethodCall && getter(namespace, name, options, args)) {			var instance = $.data(this[0], name);			return (instance ? instance[options].apply(instance, args)				: undefined);		}		// handle initialization and non-getter methods		return this.each(function() {			var instance = $.data(this, name);			// constructor			(!instance && !isMethodCall &&				$.data(this, name, new $[namespace][name](this, options))._init());			// method call			(instance && isMethodCall && $.isFunction(instance[options]) &&				instance[options].apply(instance, args));		});	};	// create widget constructor	$[namespace] = $[namespace] || {};	$[namespace][name] = function(element, options) {		var self = this;		this.namespace = namespace;		this.widgetName = name;		this.widgetEventPrefix = $[namespace][name].eventPrefix || name;		this.widgetBaseClass = namespace + '-' + name;		this.options = $.extend({},			$.widget.defaults,			$[namespace][name].defaults,			$.metadata && $.metadata.get(element)[name],			options);		this.element = $(element)			.bind('setData.' + name, function(event, key, value) {				if (event.target == element) {					return self._setData(key, value);				}			})			.bind('getData.' + name, function(event, key) {				if (event.target == element) {					return self._getData(key);				}			})			.bind('remove', function() {				return self.destroy();			});	};	// add widget prototype	$[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);	// TODO: merge getter and getterSetter properties from widget prototype	// and plugin prototype	$[namespace][name].getterSetter = 'option';};$.widget.prototype = {	_init: function() {},	destroy: function() {		this.element.removeData(this.widgetName)			.removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')			.removeAttr('aria-disabled');	},	option: function(key, value) {		var options = key,			self = this;		if (typeof key == "string") {			if (value === undefined) {				return this._getData(key);			}			options = {};			options[key] = value;		}		$.each(options, function(key, value) {			self._setData(key, value);		});	},	_getData: function(key) {		return this.options[key];	},	_setData: function(key, value) {		this.options[key] = value;		if (key == 'disabled') {			this.element				[value ? 'addClass' : 'removeClass'](					this.widgetBaseClass + '-disabled' + ' ' +					this.namespace + '-state-disabled')				.attr("aria-disabled", value);		}	},	enable: function() {		this._setData('disabled', false);	},	disable: function() {		this._setData('disabled', true);	},	_trigger: function(type, event, data) {		var callback = this.options[type],			eventName = (type == this.widgetEventPrefix				? type : this.widgetEventPrefix + type);		event = $.Event(event);		event.type = eventName;		// copy original event properties over to the new event		// this would happen if we could call $.event.fix instead of $.Event		// but we don't have a way to force an event to be fixed multiple times		if (event.originalEvent) {			for (var i = $.event.props.length, prop; i;) {				prop = $.event.props[--i];				event[prop] = event.originalEvent[prop];			}		}		this.element.trigger(event, data);		return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false			|| event.isDefaultPrevented());	}};$.widget.defaults = {	disabled: false};/** Mouse Interaction Plugin **/$.ui.mouse = {	_mouseInit: function() {		var self = this;		this.element			.bind('mousedown.'+this.widgetName, function(event) {				return self._mouseDown(event);			})			.bind('click.'+this.widgetName, function(event) {				if(self._preventClickEvent) {					self._preventClickEvent = false;					return false;				}			});		// Prevent text selection in IE		if ($.browser.msie) {			this._mouseUnselectable = this.element.attr('unselectable');			this.element.attr('unselectable', 'on');		}		this.started = false;	},	// TODO: make sure destroying one instance of mouse doesn't mess with	// other instances of mouse	_mouseDestroy: function() {		this.element.unbind('.'+this.widgetName);		// Restore text selection in IE		($.browser.msie			&& this.element.attr('unselectable', this._mouseUnselectable));	},	_mouseDown: function(event) {		// don't let more than one widget handle mouseStart		if (event.originalEvent.mouseHandled) { return; }		// we may have missed mouseup (out of window)		(this._mouseStarted && this._mouseUp(event));		this._mouseDownEvent = event;		var self = this,			btnIsLeft = (event.which == 1),			elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {			return true;		}		this.mouseDelayMet = !this.options.delay;		if (!this.mouseDelayMet) {			this._mouseDelayTimer = setTimeout(function() {				self.mouseDelayMet = true;			}, this.options.delay);		}		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {			this._mouseStarted = (this._mouseStart(event) !== false);			if (!this._mouseStarted) {				event.preventDefault();				return true;			}		}		// these delegates are required to keep context		this._mouseMoveDelegate = function(event) {			return self._mouseMove(event);		};		this._mouseUpDelegate = function(event) {			return self._mouseUp(event);		};		$(document)			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);		// preventDefault() is used to prevent the selection of text here -		// however, in Safari, this causes select boxes not to be selectable		// anymore, so this fix is needed		($.browser.safari || event.preventDefault());		event.originalEvent.mouseHandled = true;		return true;	},	_mouseMove: function(event) {		// IE mouseup check - mouseup happened when mouse was out of window		if ($.browser.msie && !event.button) {			return this._mouseUp(event);		}		if (this._mouseStarted) {			this._mouseDrag(event);			return event.preventDefault();		}		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {			this._mouseStarted =				(this._mouseStart(this._mouseDownEvent, event) !== false);			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));		}		return !this._mouseStarted;	},	_mouseUp: function(event) {		$(document)			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);		if (this._mouseStarted) {			this._mouseStarted = false;			this._preventClickEvent = true;			this._mouseStop(event);		}		return false;	},	_mouseDistanceMet: function(event) {		return (Math.max(				Math.abs(this._mouseDownEvent.pageX - event.pageX),				Math.abs(this._mouseDownEvent.pageY - event.pageY)			) >= this.options.distance		);	},	_mouseDelayMet: function(event) {		return this.mouseDelayMet;	},	// These are placeholder methods, to be overriden by extending plugin	_mouseStart: function(event) {},	_mouseDrag: function(event) {},	_mouseStop: function(event) {},	_mouseCapture: function(event) { return true; }};$.ui.mouse.defaults = {	cancel: null,	distance: 1,	delay: 0};})(jQuery);/* * jQuery UI Accordion 1.6rc6 * * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Accordion * * Depends: *	ui.core.js */(function($) {$.widget("ui.accordion", {	_init: function() {		var o = this.options, self = this;		this.running = 0;		if ( o.navigation ) {			var current = this.element.find("a").filter(o.navigationFilter);			if ( current.length ) {				if ( current.filter(o.header).length ) {					this.active = current;				} else {					this.active = current.parent().parent().prev();					current.addClass("ui-accordion-content-active");				}			}		}		this.element.addClass("ui-accordion ui-widget ui-helper-reset");		this.headers = this.element.find(o.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all")			.bind("mouseenter.accordion", function(){ $(this).addClass('ui-state-hover'); })			.bind("mouseleave.accordion", function(){ $(this).removeClass('ui-state-hover'); });		this.headers			.next()				.addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");		this.active = this._findActive(this.active || o.active).toggleClass("ui-state-default").toggleClass("ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");		this.active.next().addClass('ui-accordion-content-active');		//Append icon elements		$("<span/>").addClass("ui-icon " + o.icons.header).prependTo(this.headers);		this.active.find(".ui-icon").toggleClass(o.icons.header).toggleClass(o.icons.headerSelected);		// IE7-/Win - Extra vertical space in lists fixed		if ($.browser.msie) {			this.element.find('a').css('zoom', '1');		}		this.resize();		//ARIA		this.element.attr('role','tablist');		this.headers			.attr('role','tab')			.bind('keydown', function(event) { return self._keydown(event); })			.next()			.attr('role','tabpanel');		this.headers			.not(this.active || "")			.attr('aria-expanded','false')			.attr("tabIndex", "-1")			.next()			.hide();		// make sure at least one header is in the tab order		if (!this.active.length) {			this.headers.eq(0).attr('tabIndex','0');		} else {			this.active				.attr('aria-expanded','true')				.attr('tabIndex', '0');		}		// only need links in taborder for Safari		if (!$.browser.safari)			this.headers.find('a').attr('tabIndex','-1');		if (o.event) {			this.element.bind((o.event) + ".accordion", function(event) { return self._clickHandler.call(self, event); });		}	},	destroy: function() {		this.element			.removeClass("ui-accordion ui-widget ui-helper-reset")			.removeAttr("role")			.unbind('.accordion')			.removeData('accordion');		this.headers			.unbind(".accordion")			.removeClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-corner-top")			.removeAttr("role").removeAttr("aria-expanded").removeAttr("tabindex");		this.headers.find("a").removeAttr("tabindex");		this.headers.children(".ui-icon").remove();		this.headers.next().removeClass("ui-accordion-content ui-accordion-content-active");	},	_keydown: function(event) {		var o = this.options, keyCode = $.ui.keyCode;		if (o.disabled || event.altKey || event.ctrlKey)			return;		var length = this.headers.length;		var currentIndex = this.headers.index(event.target);		var toFocus = false;		switch(event.keyCode) {			case keyCode.RIGHT:			case keyCode.DOWN:				toFocus = this.headers[(currentIndex + 1) % length];				break;			case keyCode.LEFT:			case keyCode.UP:				toFocus = this.headers[(currentIndex - 1 + length) % length];				break;			case keyCode.SPACE:			case keyCode.ENTER:				return this._clickHandler({ target: event.target });		}		if (toFocus) {			$(event.target).attr('tabIndex','-1');			$(toFocus).attr('tabIndex','0');			toFocus.focus();			return false;		}		return true;	},	resize: function() {		var o = this.options, maxHeight;		if (o.fillSpace) {						if($.browser.msie) { var defOverflow = this.element.parent().css('overflow'); this.element.parent().css('overflow', 'hidden'); }			maxHeight = this.element.parent().height();			if($.browser.msie) { this.element.parent().css('overflow', defOverflow); }				this.headers.each(function() {				maxHeight -= $(this).outerHeight();			});			var maxPadding = 0;			this.headers.next().each(function() {				maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height());			}).height(maxHeight - maxPadding)			.css('overflow', 'auto');		} else if ( o.autoHeight ) {			maxHeight = 0;			this.headers.next().each(function() {				maxHeight = Math.max(maxHeight, $(this).outerHeight());			}).height(maxHeight);		}	},	activate: function(index) {		// call clickHandler with custom event		this._clickHandler({ target: this._findActive(index)[0] });	},	_findActive: function(selector) {		return selector			? typeof selector == "number"				? this.headers.filter(":eq(" + selector + ")")				: this.headers.not(this.headers.not(selector))			: selector === false				? $([])				: this.headers.filter(":eq(0)");	},	_clickHandler: function(event) {		var o = this.options;		if (o.disabled) return false;		// called only when using activate(false) to close all parts programmatically		if (!event.target && !o.alwaysOpen) {			this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")				.find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);			this.active.next().addClass('ui-accordion-content-active');			var toHide = this.active.next(),				data = {					options: o,					newHeader: $([]),					oldHeader: o.active,					newContent: $([]),					oldContent: toHide				},				toShow = (this.active = $([]));			this._toggle(toShow, toHide, data);			return false;		}		// get the click target		var clicked = $(event.target);		// due to the event delegation model, we have to check if one		// of the parent elements is our actual header, and find that		// otherwise stick with the initial target		clicked = $( clicked.parents(o.header)[0] || clicked );		var clickedIsActive = clicked[0] == this.active[0];		// if animations are still active, or the active header is the target, ignore click		if (this.running || (o.alwaysOpen && clickedIsActive)) {			return false;		}		if (!clicked.is(o.header)) {			return;		}		// switch classes		this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all")			.find(".ui-icon").removeClass(o.icons.headerSelected).addClass(o.icons.header);		this.active.next().addClass('ui-accordion-content-active');		if (!clickedIsActive) {			clicked.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top")				.find(".ui-icon").removeClass(o.icons.header).addClass(o.icons.headerSelected);			clicked.next().addClass('ui-accordion-content-active');		}		// find elements to show and hide		var toShow = clicked.next(),			toHide = this.active.next(),			data = {				options: o,				newHeader: clickedIsActive && !o.alwaysOpen ? $([]) : clicked,				oldHeader: this.active,				newContent: clickedIsActive && !o.alwaysOpen ? $([]) : toShow.find('> *'),				oldContent: toHide.find('> *')			},			down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );		this.active = clickedIsActive ? $([]) : clicked;		this._toggle(toShow, toHide, data, clickedIsActive, down);		return false;	},	_toggle: function(toShow, toHide, data, clickedIsActive, down) {		var o = this.options, self = this;		this.toShow = toShow;		this.toHide = toHide;		this.data = data;		var complete = function() { if(!self) return; return self._completed.apply(self, arguments); };		// trigger changestart event		this._trigger("changestart", null, this.data);		// count elements to animate		this.running = toHide.size() === 0 ? toShow.size() : toHide.size();		if (o.animated) {			var animOptions = {};			if ( !o.alwaysOpen && clickedIsActive ) {				animOptions = {					toShow: $([]),					toHide: toHide,					complete: complete,					down: down,					autoHeight: o.autoHeight || o.fillSpace				};			} else {				animOptions = {					toShow: toShow,					toHide: toHide,					complete: complete,					down: down,					autoHeight: o.autoHeight || o.fillSpace				};			}			if (!o.proxied) {				o.proxied = o.animated;			}			if (!o.proxiedDuration) {				o.proxiedDuration = o.duration;			}			o.animated = $.isFunction(o.proxied) ?				o.proxied(animOptions) : o.proxied;			o.duration = $.isFunction(o.proxiedDuration) ?				o.proxiedDuration(animOptions) : o.proxiedDuration;			var animations = $.ui.accordion.animations,				duration = o.duration,				easing = o.animated;			if (!animations[easing]) {				animations[easing] = function(options) {					this.slide(options, {						easing: easing,						duration: duration || 700					});				};			}			animations[easing](animOptions);		} else {			if (!o.alwaysOpen && clickedIsActive) {				toShow.toggle();			} else {				toHide.hide();				toShow.show();			}			complete(true);		}		toHide.prev().attr('aria-expanded','false').attr("tabIndex", "-1");		toShow.prev().attr('aria-expanded','true').attr("tabIndex", "0").focus();	},	_completed: function(cancel) {		var o = this.options;		this.running = cancel ? 0 : --this.running;		if (this.running) return;		if (o.clearStyle) {			this.toShow.add(this.toHide).css({				height: "",				overflow: ""			});		}		this._trigger('change', null, this.data);	}});$.extend($.ui.accordion, {	version: "1.6rc6",	defaults: {		active: null,		autoHeight: true,		alwaysOpen: true,		animated: 'slide',		clearStyle: false,		event: "click",		fillSpace: false,		header: "a",		icons: {			header: "ui-icon-triangle-1-e",			headerSelected: "ui-icon-triangle-1-s"		},		navigation: false,		navigationFilter: function() {			return this.href.toLowerCase() == location.href.toLowerCase();		}	},	animations: {		slide: function(options, additions) {			options = $.extend({				easing: "swing",				duration: 500			}, options, additions);			if ( !options.toHide.size() ) {				options.toShow.animate({height: "show"}, options);				return;			}			var hideHeight = options.toHide.height(),				showHeight = options.toShow.height(),				difference = showHeight / hideHeight,				overflow = options.toShow.css('overflow'),				showProps = {},				hideProps = {},				fxAttrs = [ "height", "paddingTop", "paddingBottom" ];			$.each(fxAttrs, function(i, prop) {				hideProps[prop] = 'hide';				showProps[prop] = parseFloat(options.toShow.css(prop));			});			options.toShow.css({ height: 0, overflow: 'hidden' }).show();			options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate(hideProps,{				step: function(now, settings) {					// if the alwaysOpen option is set to false, we may not have					// a content pane to show					if (!options.toShow[0]) { return; }										var percentDone = settings.start != settings.end						? (settings.now - settings.start) / (settings.end - settings.start)						: 0,						current = percentDone * showProps[settings.prop];					if ($.browser.msie || $.browser.opera) {						current = Math.ceil(current);					}					options.toShow[0].style[settings.prop] = current + 'px';				},				duration: options.duration,				easing: options.easing,				complete: function() {					if ( !options.autoHeight ) {						options.toShow.css("height", "auto");					}					options.toShow.css({overflow: overflow});					options.complete();				}			});		},		bounceslide: function(options) {			this.slide(options, {				easing: options.down ? "easeOutBounce" : "swing",				duration: options.down ? 1000 : 200			});		},		easeslide: function(options) {			this.slide(options, {				easing: "easeinout",				duration: 700			});		}	}});})(jQuery);/* * jQuery UI Effects 1.6rc6 * * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Effects/ */;(function($) {$.effects = $.effects || {}; //Add the 'effects' scope$.extend($.effects, {	version: "1.6rc6",	// Saves a set of properties in a data storage	save: function(element, set) {		for(var i=0; i < set.length; i++) {			if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);		}	},	// Restores a set of previously saved properties from a data storage	restore: function(element, set) {		for(var i=0; i < set.length; i++) {			if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));		}	},	setMode: function(el, mode) {		if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle		return mode;	},	getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value		// this should be a little more flexible in the future to handle a string & hash		var y, x;		switch (origin[0]) {			case 'top': y = 0; break;			case 'middle': y = 0.5; break;			case 'bottom': y = 1; break;			default: y = origin[0] / original.height;		};		switch (origin[1]) {			case 'left': x = 0; break;			case 'center': x = 0.5; break;			case 'right': x = 1; break;			default: x = origin[1] / original.width;		};		return {x: x, y: y};	},	// Wraps the element around a wrapper that copies position properties	createWrapper: function(element) {		//if the element is already wrapped, return it		if (element.parent().is('.ui-effects-wrapper'))			return element.parent();		//Cache width,height and float properties of the element, and create a wrapper around it		var props = { width: element.outerWidth(true), height: element.outerHeight(true), 'float': element.css('float') };		element.wrap('<div class="ui-effects-wrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');		var wrapper = element.parent();		//Transfer the positioning of the element to the wrapper		if (element.css('position') == 'static') {			wrapper.css({ position: 'relative' });			element.css({ position: 'relative'} );		} else {			var top = element.css('top'); if(isNaN(parseInt(top,10))) top = 'auto';			var left = element.css('left'); if(isNaN(parseInt(left,10))) left = 'auto';			wrapper.css({ position: element.css('position'), top: top, left: left, zIndex: element.css('z-index') }).show();			element.css({position: 'relative', top: 0, left: 0 });		}		wrapper.css(props);		return wrapper;	},	removeWrapper: function(element) {		if (element.parent().is('.ui-effects-wrapper'))			return element.parent().replaceWith(element);		return element;	},	setTransition: function(element, list, factor, value) {		value = value || {};		$.each(list, function(i, x){			unit = element.cssUnit(x);			if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];		});		return value;	},	//Base function to animate from one class to another in a seamless transition	animateClass: function(value, duration, easing, callback) {		var cb = (typeof easing == "function" ? easing : (callback ? callback : null));		var ea = (typeof easing == "string" ? easing : null);		return this.each(function() {			var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || '';			if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */			if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; }			//Let's get a style offset			var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));			if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove);			var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));			if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove);			// The main function to form the object for animation			for(var n in newStyle) {				if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */				&& n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */				&& newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */				&& (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */				&& (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */				) offset[n] = newStyle[n];			}			that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object				// Change style attribute back to original. For stupid IE, we need to clear the damn object.				if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr);				if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove);				if(cb) cb.apply(this, arguments);			});		});	}});function _normalizeArguments(a, m) {	var o = a[1] && a[1].constructor == Object ? a[1] : {}; if(m) o.mode = m;	var speed = a[1] && a[1].constructor != Object ? a[1] : o.duration; //either comes from options.duration or the second argument		speed = $.fx.off ? 0 : typeof speed === "number" ? speed : $.fx.speeds[speed] || $.fx.speeds._default;	var callback = o.callback || ( $.isFunction(a[2]) && a[2] ) || ( $.isFunction(a[3]) && a[3] );	return [a[0], o, speed, callback];	}//Extend the methods of jQuery$.fn.extend({	//Save old methods	_show: $.fn.show,	_hide: $.fn.hide,	__toggle: $.fn.toggle,	_addClass: $.fn.addClass,	_removeClass: $.fn.removeClass,	_toggleClass: $.fn.toggleClass,	// New effect methods	effect: function(fx, options, speed, callback) {		return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: options || {}, duration: speed, callback: callback }) : null;	},	show: function() {		if(!arguments[0] || (arguments[0].constructor == Number || (/(slow|normal|fast)/).test(arguments[0])))			return this._show.apply(this, arguments);		else {			return this.effect.apply(this, _normalizeArguments(arguments, 'show'));		}	},	hide: function() {		if(!arguments[0] || (arguments[0].constructor == Number || (/(slow|normal|fast)/).test(arguments[0])))			return this._hide.apply(this, arguments);		else {			return this.effect.apply(this, _normalizeArguments(arguments, 'hide'));		}	},	toggle: function(){		if(!arguments[0] || (arguments[0].constructor == Number || (/(slow|normal|fast)/).test(arguments[0])) || (arguments[0].constructor == Function))			return this.__toggle.apply(this, arguments);		else {			return this.effect.apply(this, _normalizeArguments(arguments, 'toggle'));		}	},	addClass: function(classNames, speed, easing, callback) {		return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);	},	removeClass: function(classNames,speed,easing,callback) {		return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);	},	toggleClass: function(classNames,speed,easing,callback) {		return ( (typeof speed !== "boolean") && speed ) ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames, speed);	},	morph: function(remove,add,speed,easing,callback) {		return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);	},	switchClass: function() {		return this.morph.apply(this, arguments);	},	// helper functions	cssUnit: function(key) {		var style = this.css(key), val = [];		$.each( ['em','px','%','pt'], function(i, unit){			if(style.indexOf(unit) > 0)				val = [parseFloat(style), unit];		});		return val;	}});/* * jQuery Color Animations * Copyright 2007 John Resig * Released under the MIT and GPL licenses. */// We override the animation for all of these color styles$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){		$.fx.step[attr] = function(fx) {				if ( fx.state == 0 ) {						fx.start = getColor( fx.elem, attr );						fx.end = getRGB( fx.end );				}				fx.elem.style[attr] = "rgb(" + [						Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0],10), 255), 0),						Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1],10), 255), 0),						Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2],10), 255), 0)				].join(",") + ")";			};});// Color Conversion functions from highlightFade// By Blair Mitchelmore// http://jquery.offput.ca/highlightFade/// Parse strings looking for color tuples [255,255,255]function getRGB(color) {		var result;		// Check if we're already dealing with an array of colors		if ( color && color.constructor == Array && color.length == 3 )				return color;		// Look for rgb(num,num,num)		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))				return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];		// Look for rgb(num%,num%,num%)		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))				return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];		// Look for #a0b1c2		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))				return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];		// Look for #fff		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))				return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];		// Look for rgba(0, 0, 0, 0) == transparent in Safari 3		if (result = /rgba\(0, 0, 0, 0\)/.exec(color))				return colors['transparent'];		// Otherwise, we're most likely dealing with a named color		return colors[$.trim(color).toLowerCase()];}function getColor(elem, attr) {		var color;		do {				color = $.curCSS(elem, attr);				// Keep going until we find an element that has color, or we hit the body				if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )						break;				attr = "backgroundColor";		} while ( elem = elem.parentNode );		return getRGB(color);};// Some named colors to work with// From Interface by Stefan Petre// http://interface.eyecon.ro/var colors = {	aqua:[0,255,255],	azure:[240,255,255],	beige:[245,245,220],	black:[0,0,0],	blue:[0,0,255],	brown:[165,42,42],	cyan:[0,255,255],	darkblue:[0,0,139],	darkcyan:[0,139,139],	darkgrey:[169,169,169],	darkgreen:[0,100,0],	darkkhaki:[189,183,107],	darkmagenta:[139,0,139],	darkolivegreen:[85,107,47],	darkorange:[255,140,0],	darkorchid:[153,50,204],	darkred:[139,0,0],	darksalmon:[233,150,122],	darkviolet:[148,0,211],	fuchsia:[255,0,255],	gold:[255,215,0],	green:[0,128,0],	indigo:[75,0,130],	khaki:[240,230,140],	lightblue:[173,216,230],	lightcyan:[224,255,255],	lightgreen:[144,238,144],	lightgrey:[211,211,211],	lightpink:[255,182,193],	lightyellow:[255,255,224],	lime:[0,255,0],	magenta:[255,0,255],	maroon:[128,0,0],	navy:[0,0,128],	olive:[128,128,0],	orange:[255,165,0],	pink:[255,192,203],	purple:[128,0,128],	violet:[128,0,128],	red:[255,0,0],	silver:[192,192,192],	white:[255,255,255],	yellow:[255,255,0],	transparent: [255,255,255]};/* * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ * * Uses the built in easing capabilities added In jQuery 1.1 * to offer multiple easing options * * TERMS OF USE - jQuery Easing * * Open source under the BSD License. * * Copyright 2008 George McGinley Smith * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. **/// t: current time, b: begInnIng value, c: change In value, d: duration$.easing.jswing = $.easing.swing;$.extend($.easing,{	def: 'easeOutQuad',	swing: function (x, t, b, c, d) {		//alert($.easing.default);		return $.easing[$.easing.def](x, t, b, c, d);	},	easeInQuad: function (x, t, b, c, d) {		return c*(t/=d)*t + b;	},	easeOutQuad: function (x, t, b, c, d) {		return -c *(t/=d)*(t-2) + b;	},	easeInOutQuad: function (x, t, b, c, d) {		if ((t/=d/2) < 1) return c/2*t*t + b;		return -c/2 * ((--t)*(t-2) - 1) + b;	},	easeInCubic: function (x, t, b, c, d) {		return c*(t/=d)*t*t + b;	},	easeOutCubic: function (x, t, b, c, d) {		return c*((t=t/d-1)*t*t + 1) + b;	},	easeInOutCubic: function (x, t, b, c, d) {		if ((t/=d/2) < 1) return c/2*t*t*t + b;		return c/2*((t-=2)*t*t + 2) + b;	},	easeInQuart: function (x, t, b, c, d) {		return c*(t/=d)*t*t*t + b;	},	easeOutQuart: function (x, t, b, c, d) {		return -c * ((t=t/d-1)*t*t*t - 1) + b;	},	easeInOutQuart: function (x, t, b, c, d) {		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;		return -c/2 * ((t-=2)*t*t*t - 2) + b;	},	easeInQuint: function (x, t, b, c, d) {		return c*(t/=d)*t*t*t*t + b;	},	easeOutQuint: function (x, t, b, c, d) {		return c*((t=t/d-1)*t*t*t*t + 1) + b;	},	easeInOutQuint: function (x, t, b, c, d) {		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;		return c/2*((t-=2)*t*t*t*t + 2) + b;	},	easeInSine: function (x, t, b, c, d) {		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;	},	easeOutSine: function (x, t, b, c, d) {		return c * Math.sin(t/d * (Math.PI/2)) + b;	},	easeInOutSine: function (x, t, b, c, d) {		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;	},	easeInExpo: function (x, t, b, c, d) {		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;	},	easeOutExpo: function (x, t, b, c, d) {		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;	},	easeInOutExpo: function (x, t, b, c, d) {		if (t==0) return b;		if (t==d) return b+c;		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;	},	easeInCirc: function (x, t, b, c, d) {		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;	},	easeOutCirc: function (x, t, b, c, d) {		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;	},	easeInOutCirc: function (x, t, b, c, d) {		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;	},	easeInElastic: function (x, t, b, c, d) {		var s=1.70158;var p=0;var a=c;		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;		if (a < Math.abs(c)) { a=c; var s=p/4; }		else var s = p/(2*Math.PI) * Math.asin (c/a);		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;	},	easeOutElastic: function (x, t, b, c, d) {		var s=1.70158;var p=0;var a=c;		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;		if (a < Math.abs(c)) { a=c; var s=p/4; }		else var s = p/(2*Math.PI) * Math.asin (c/a);		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;	},	easeInOutElastic: function (x, t, b, c, d) {		var s=1.70158;var p=0;var a=c;		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);		if (a < Math.abs(c)) { a=c; var s=p/4; }		else var s = p/(2*Math.PI) * Math.asin (c/a);		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;	},	easeInBack: function (x, t, b, c, d, s) {		if (s == undefined) s = 1.70158;		return c*(t/=d)*t*((s+1)*t - s) + b;	},	easeOutBack: function (x, t, b, c, d, s) {		if (s == undefined) s = 1.70158;		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;	},	easeInOutBack: function (x, t, b, c, d, s) {		if (s == undefined) s = 1.70158;		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;	},	easeInBounce: function (x, t, b, c, d) {		return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;	},	easeOutBounce: function (x, t, b, c, d) {		if ((t/=d) < (1/2.75)) {			return c*(7.5625*t*t) + b;		} else if (t < (2/2.75)) {			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;		} else if (t < (2.5/2.75)) {			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;		} else {			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;		}	},	easeInOutBounce: function (x, t, b, c, d) {		if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;		return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;	}});/* * * TERMS OF USE - EASING EQUATIONS * * Open source under the BSD License. * * Copyright 2001 Robert Penner * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */})(jQuery);/* * jQuery UI Effects Bounce 1.6rc6 * * Copyright (c) 2009 AUTHORS.txt (http://ui.jquery.com/about) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * http://docs.jquery.com/UI/Effects/Bounce * * Depends: *	effects.core.js */(function($) {$.effects.bounce = function(o) {	return this.queue(function() {		// Create element		var el = $(this), props = ['position','top','left'];		// Set options		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode		var direction = o.options.direction || 'up'; // Default direction		var distance = o.options.distance || 20; // Default distance		var times = o.options.times || 5; // Default # of times		var speed = o.duration || 250; // Default speed per bounce		if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE		// Adjust		$.effects.save(el, props); el.show(); // Save & Show		$.effects.createWrapper(el); // Create Wrapper		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift		if (mode == 'hide') distance = distance / (times * 2);		if (mode != 'hide') times--;		// Animate		if (mode == 'show') { // Show Bounce			var animation = {opacity: 1};			animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;			el.animate(animation, speed / 2, o.options.easing);			distance = distance / 2;			times--;		};		for (var i = 0; i < times; i++) { // Bounces			var animation1 = {}, animation2 = {};			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);			distance = (mode == 'hide') ? distance * 2 : distance / 2;		};		if (mode == 'hide') { // Last Bounce			var animation = {opacity: 0};			animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;			el.animate(animation, speed / 2, o.options.easing, function(){				el.hide(); // Hide				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore				if(o.callback) o.callback.apply(this, arguments); // Callback			});		} else {			var animation1 = {}, animation2 = {};			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore				if(o.callback) o.callback.apply(this, arguments); // Callback			});		};		el.queue('fx', function() { el.dequeue(); });		el.dequeue();	});};})(jQuery);