(function ($) {
	$.effects.slide = function (o, duration) {
		return this.queue(function () {
			var el = $(this),
				props = ['position', 'top', 'left'];
			var mode = $.effects.setMode(el, o.options.mode || 'show');
			var direction = o.options.direction || 'left';
			$.effects.save(el, props);
			el.show();
			$.effects.createWrapper(el).css({
				overflow: 'hidden'
			});
			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
			}) : el.outerWidth({
				margin: true
			}));
			if (mode == 'show') el.css(ref, motion == 'pos' ? -distance : distance);
			var animation = {};
			animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
			// Changed the hardcoded duration to accept a speed from the parameter object -BCD
			el.animate(animation, {
				queue: false,
				duration: o.duration,
				easing: 'easeInOutExpo',
				complete: function () {
					if (mode == 'hide') el.hide();
					$.effects.restore(el, props);
					$.effects.removeWrapper(el);
					if (o.callback) o.callback.apply(this, arguments);
					el.dequeue();
				}
			});
		});
	};
})(jQuery);
