AS = {};

AS.shade = {
	element: null,

	init: function() {
		AS.shade.element = $("#shade");

		AS.shade.element.click(function(){
			AS.tab.close();
		});
	},

	show: function() {
		AS.shade.element.show();
	},

	hide: function() {
		AS.shade.element.hide();
	}
};

AS.tab = {
	element: null,
	label: null,

	init: function() {
		AS.tab.element = $("#tab");
		AS.tab.label = $("em", AS.tab.element);

		// Add tab handler
		$("a", AS.tab.element).click(function(){
			AS.tab.toggle();
			return false;
		});
	},

	toggle: function() {
		if (AS.tab.element.hasClass("selected")) {
			AS.tab.close();
		} else {
			AS.tab.open();
		}
	},

	open: function() {
		// Stop slideshow
		AS.splash.stop();

		// Animate drawer
		AS.shade.show();
		AS.tab.element.addClass("selected");

		// Change button text
		AS.tab.label.text("Close Portfolio");

		// Show gallery listing
		AS.listing.open();
	},

	close: function() {
		// Animate drawer
		AS.shade.hide();
		AS.tab.element.removeClass("selected");

		// Change button text
		AS.tab.label.text("View Portfolio");

		// Hide gallery listing
		AS.listing.close();

		// Start slideshow
		AS.splash.start();
	}
};

AS.listing = {
	element: null,
	nav: null,
	next: null,
	prev: null,
	pane: null,
	pane_page: 0,
	sets: null,

	init: function() {
		AS.listing.element = $("#portfolio .set-list");
		AS.listing.nav = $("#portfolio-nav");
		AS.listing.next = $("#portfolio-nav-next");
		AS.listing.prev = $("#portfolio-nav-prev");
		AS.listing.pane = $("#portfolio .set-list-pane");
		AS.listing.sets = $(".set", AS.listing.element);

		// Attatch events
		AS.listing.sets.click(function(){
			AS.gallery.show_set($(this).attr("data-set"));
			return false;
		});

		$("#portfolio-nav-prev").click(function(){
			if (AS.listing.pane_page > 0) {
				AS.listing.pane.animate({
					marginLeft: "+=960px"
				});

				AS.listing.pane_page--;
			}

			AS.listing.update_nav();

			return false;
		});

		$("#portfolio-nav-next").click(function(){
			if (AS.listing.pane_page < (AS.listing.sets.size() / 3) - 1) {
				AS.listing.pane.animate({
					marginLeft: "-=960px"
				});

				AS.listing.pane_page++;
			}

			AS.listing.update_nav();

			return false;
		});
	},

	update_nav: function() {
		if (AS.listing.pane_page < 1) {
			AS.listing.prev.fadeTo("slow", .25);
		} else {
			AS.listing.prev.fadeTo("slow", 1);
		}

		if (AS.listing.pane_page > (AS.listing.sets.size() / 3) - 1) {
			AS.listing.next.fadeTo("slow", .25);
		} else if (AS.listing.sets.size() < 4) {
			AS.listing.next.fadeTo("slow", .25);
		} else {
			AS.listing.next.fadeTo("slow", 1);
		}
	},

	open: function() {
		AS.listing.element.slideDown("slow", "easeOutBounce").queue(function(){
			AS.listing.nav.fadeIn();
			$(this).dequeue();
		});

		if (AS.listing.pane_page == 0) {
			AS.listing.prev.fadeTo("slow", .25);

			if (AS.listing.sets.size() > 3) {
				AS.listing.next.fadeTo("slow", 1);
			} else {
				AS.listing.next.fadeTo("slow", .25);
			}
		}
	},

	close: function() {
		AS.listing.nav.fadeOut().queue(function(){
			AS.listing.element.slideUp("slow", "easeInBack");
			$(this).dequeue();
		});
	}
};

AS.gallery = {
	element: null,
	thumbs: null,
	slides: null,
	slide_count: 0,
	home: null,
	selected: -1,
	label_count: null,

	init: function() {
		AS.gallery.home = $("#home");
		AS.gallery.element = $("#gallery");
		AS.gallery.thumbs = $("#gallery-thumbs");
		AS.gallery.slides = $("#gallery-slides");
		AS.gallery.label_count = $("#gallery-nav .count");

		// Set initial effects
		AS.gallery.element.fadeOut();

		// Attach events
		$("a.close", AS.gallery.element).click(function(){
			AS.gallery.close();
			return false;
		});

		$("a.next", AS.gallery.element).click(function(){
			AS.gallery.next();
			return false;
		});

		$("a.prev", AS.gallery.element).click(function(){
			AS.gallery.prev();
			return false;
		});
	},

	show_set: function(url) {
		AS.gallery.load_set(url, AS.gallery.open);
	},

	open: function() {
		$("#portfolio").hide();
		$("#header").hide();
		$("body").addClass("dark");

		// Show the gallery
		AS.gallery.element.fadeIn(function(){
			// Hide the main page to remove scroll bars
			AS.gallery.home.hide();
		});

		// Disable right-click
		$(document).bind("contextmenu",function(e){
			return false;
		});
	},

	close: function() {
		// Reset gallery
		AS.gallery.thumbs.html("");
		$(".gallery-slide", AS.gallery.element).remove();

		// Show the page again
		AS.gallery.home.show();

		// Hide the gallery
		AS.gallery.element.fadeOut();

		$("#header").show();
		$("#portfolio").show();
		$("body").removeClass("dark");

		// Enable right-click
		$(document).unbind("contextmenu");
	},

	load_set: function(url, fn) {
		// Load set photos
		$.getJSON(url, function(slides){
			if (typeof slides != "object" || slides == null) {
				AS.gallery.close();
				return;
			}

			// Cache photo count
			AS.gallery.slide_count = slides.length;

			// Update nav
			AS.gallery.update_nav();

			// Build DOM elements
			$.each(slides, function(index){
				var current_slide = this;

				// Build slide
				var slide = $("<div>")
					.addClass("gallery-slide")
					.addClass("count-" + current_slide.length)
					.attr("data-count", current_slide.length)
					.attr("id", "slide-" + index);

				// Build guard
				var guard = $("<div>")
					.addClass("gallery-guard");

				slide.append(guard);

				// Build photos
				$.each(this, function(p_index){
					var loader = $("<div>")
						.addClass("position-" + p_index)
						.addClass("gallery-loader");

					var photo = $("<div>")
						.addClass("gallery-photo")
						.attr("data-src", current_slide[p_index].large);

					loader.append(photo);
					slide.append(loader);
				});

				// Build thumbnail
				var thumb = $("<img>").attr("src", current_slide[0].loader)
					.attr("data-thumbnail", current_slide[0].thumbnail)
					.attr("data-white", current_slide[0].white)
					.attr("data-index", index)
					.click(function(){
						AS.gallery.show_slide($(this).attr("data-index"));
						return false;
					});

				// Inject into DOM
				AS.gallery.slides.append(slide);
				AS.gallery.thumbs.append(thumb);
			});

			// Start loading slides
			AS.gallery.load_slide(0);

			// Show first slide
			AS.gallery.show_slide(0);

			// Execute callback
			if ($.isFunction(fn)) {
				fn();
			}

			// Scroll in inital image
			$("#slide-0").animate({
				left: "0"
			});
		});
	},

	load_slide: function(index) {
		var thumb = $("img", AS.gallery.thumbs).eq(index);
		var slide = $("#slide-" + index);
		var photos = $(".gallery-photo", slide);

		if (photos.length < 1 || thumb.length < 1) {
			return;
		}

		// Load thumbnail
		thumb.attr("src", thumb.attr("data-thumbnail"));

		// Load slide photos
		$.each(photos, function(photo_index){
			var photo = $(this);

			var image = new Image();

			image.onload = function(){
				// Insert into dom
				photo.css({
					"background": "transparent url(" + photo.attr("data-src") + ") no-repeat center"
				});

				// Mark slide as loaded
				photo.parents(".gallery-loader").addClass("loaded");

				// Load next image after this one
				AS.gallery.load_slide(index + 1);
			};

			image.src = photo.attr("data-src");
		});
	},

	update_nav: function() {
		AS.gallery.label_count.text((AS.gallery.selected + 1) + " of " + AS.gallery.slide_count);
	},

	update_thumbs: function(index) {
		$(".selected", AS.gallery.thumbs).each(function(){
			var thumb = $(this);

			thumb.attr("src", thumb.attr("data-thumbnail"));
			thumb.removeClass("selected");
		});

		var thumb = $("img", AS.gallery.thumbs).eq(index);
		thumb.attr("src", thumb.attr("data-white"));
		thumb.addClass("selected");
	},

	show_slide: function(index) {
		index = parseInt(index, 10);

		// Calculate offset
		var diff = index - AS.gallery.selected;

		// Moving forward, or back?
		var fn = diff > 0 ? AS.gallery.next : AS.gallery.prev;

		if (diff < 0) {
			diff = diff * -1;
		}

		// Move
		for (var i = 0; i < diff; i++) {
			fn();
		}

		AS.gallery.selected = index;
	},

	next: function() {
		// Are we at the end?
		if (AS.gallery.selected == AS.gallery.slide_count - 1) {
			return false;
		}

		// Slide out old image
		$("#slide-" + AS.gallery.selected).animate({
			left: "-100%"
		});

		AS.gallery.selected = AS.gallery.selected + 1;

		// Update nav
		AS.gallery.update_nav();
		AS.gallery.update_thumbs(AS.gallery.selected);

		// Show new image
		$("#slide-" + AS.gallery.selected).animate({
			left: "0%"
		});
	},

	prev: function() {
		if (AS.gallery.selected == 0) {
			return false;
		}

		// Slide out old image
		$("#slide-" + AS.gallery.selected).animate({
			left: "100%"
		});

		AS.gallery.selected = AS.gallery.selected - 1;

		// Update nav
		AS.gallery.update_nav();
		AS.gallery.update_thumbs(AS.gallery.selected);

		// Show new image
		$("#slide-" + AS.gallery.selected).animate({
			left: "0%"
		});
	}
};

AS.splash = {
	loaded: false,
	image_urls: [],

	timer: null,

	init: function() {
		if (!AS.splash.get_image_urls()) {
			return;
		}

		// Preload first image
		AS.splash.load(0);
	},

	get_image_urls: function() {
		$("#splash-images span").each(function(){
			var span = $(this);

			// Save the URL
			AS.splash.image_urls.push(span.attr("data-url"));

			// Remove from DOM
			span.remove();
		});

		return AS.splash.image_urls.length > 0;
	},

	load: function(index) {
		var image_url = AS.splash.image_urls[index];
		var image_count = AS.splash.image_urls.length;

		if (image_url === undefined) {
			// Finished preloading
			AS.splash.loaded = true;
			AS.splash.start();
			return;
		}
		
		// Create DOM element
		var dom = $("<img>").load(function(){
			$("#splash-images").append(dom);
			AS.splash.load(index + 1);
		}).css({
			zIndex: image_count - index
		});

		// Only show the first image
		if (index !== 0) {
			dom.hide();
		} else {
			dom.addClass("current")
		}

		// Start loading image
		dom.attr("src", image_url);
	},

	start: function() {
		if (!AS.splash.loaded) {
			return;
		}

		var timeout = 7000;
		var speed = 3000;
		var images = $("#splash-images img");
		var size = images.size();

		AS.splash.timer = setInterval(function(){
			AS.splash.step(images, size, speed);
		}, timeout);
	},

	step: function(images, size, speed) {
		var current = 0;
		var last = 0;

		// Find first image
		images.each(function(i){
			if ($(this).hasClass("current")) {
				$(this).removeClass("current");
				current = i;
			}
		});

		// Calculate which images to fade
		if ((current + 1) < size) {
			current = current + 1;
			last = current - 1;
		} else {
			current = 0;
			last = size - 1;
		}

		// Fade images
		$(images[last]).fadeOut(speed);
		$(images[current]).fadeIn(speed).addClass("current");
	},

	stop: function() {
		clearInterval(AS.splash.timer);
	}
};

AS.clients = {
	sets: null,

	init: function() {
		AS.clients.sets = $("#private-gallery .private-set");

		if (AS.clients.sets.length < 1) {
			return;
		}

		// Attach events
		AS.clients.sets.click(function(){
			var set = $(this);

			AS.gallery.show_set(set.attr("data-set"));
		});
	}
};

AS.admin = {
	init: function() {
		AS.admin.yeers();
		AS.admin.uploader();
	},

	yeers: function() {
		// Add calendars to date fields
		$("input.date").each(function(){
			// Create the calendar and add it to the DOM
			Yeers({
				output: $(this),
				format: "yyyy-MM-dd",
				inline: $(this).hasClass("inline")
			});
		});
	},

	uploader: function() {
		var list = $("#admin #photo-list");
		var img = null;
		var old = "";

		// Photo hover (large preview)
		$("tr", list).hover(function(){
			img = $(".preview", $(this));
			old = img.attr("src");

			var n = $("<img>").attr("src", img.attr("data-large")).addClass("preview-large");
			img.after(n);
		}, function(){
			$(".preview-large", list).remove();
		});

		// Photo list ordering
		$(".drag", list).mousedown(function(){
			// Disable text selection for MSIE
			if ($.browser.msie) {
				document.onselectstart = function() { return false; }
			}

			var row = $(this).parents("tr");

			var drag_on = function(el, e) {
				var pos = el.position();
				pos.right = pos.left + el.width();
				pos.bottom = pos.top + el.height();

				if (e.pageY >= pos.top && e.pageX >= pos.left) {
					if (e.pageY < pos.bottom && e.pageX < pos.right) {
						return true;
					}
				}
				
				return false;
			};

			var move = function(e){
				var drop_target = null;
				var drop_after = false;

				// Dragging on the same row?
				if (drag_on(row, e)) {
					return false;
				}

				$("tr", list).each(function(){
					var r = $(this);

					if (drag_on(r, e)) {
						drop_target = r;
						var pos = r.position();
						
						if (e.pageY < (pos.top + (r.height() / 2))) {
							drop_after = false;
						} else {
							drop_after = true;
						}
					}
				});

				if (drop_target) {
					if (drop_after) {
						drop_target.after(row);
					} else {
						drop_target.before(row);
					}
				}
			};

			// Add move event
			list.mousemove(move);

			// Finish draggin a row
			$(document).one("mouseup", function(){
				// Restore text selection on MSIE
				document.onselectstart = function(){};

				// Unbind
				list.unbind("mousemove", move);

				// Save list
				var items = {};
				var i = 0;

				$("tr", list).each(function(){
					items["order-" + i++] = $(this).attr("data-hash");
				});

				//$.post(list.attr("data-callback"), items);
				$.ajax({
					url: list.attr("data-callback"),
					type: "POST",
					data: items
				});
			});

			return false;
		});
	}
};

AS.setgrid = {
	grids: null,
	groups: null,
	drag_source: null,

	init: function() {
		AS.setgrid.grids = $(".set-grid");
		AS.setgrid.groups = $(".set-group");

		// Add drag events
		$(".set", AS.setgrid.grids).live("mousedown", AS.setgrid.on_drag);
	},

	calculate_overlap: function(el, e) {
		var pos = el.offset();
		pos.right = pos.left + el.width();
		pos.bottom = pos.top + el.height();

		if (e.pageY >= pos.top && e.pageX >= pos.left) {
			if (e.pageY < pos.bottom && e.pageX < pos.right) {
				return true;
			}
		}
		
		return false;
	},

	on_drag: function() {
		// Disable text selection for MSIE
		if ($.browser.msie) {
			document.onselectstart = function() { return false; }
		}

		// Save source
		AS.setgrid.drag_source = $(this).addClass("moving");

		// Attach drop event
		$(document).one("mouseup", AS.setgrid.on_drop);

		// Attach move event
		AS.setgrid.groups.live("mousemove", AS.setgrid.on_move);

		return false;
	},

	on_move: function(e) {
		// Are we moving over the source?
		if (AS.setgrid.calculate_overlap(AS.setgrid.drag_source, e)) {
			return false;
		}

		// Get drag targets
		var targets = $(".set", AS.photogrid.grids);

		var drop_target = null;
		var drop_after = false;

		// Test targets
		targets.each(function(){
			var target = $(this);

			if (AS.setgrid.calculate_overlap(target, e)) {
				drop_target = target;
				drop_after = !(e.pageX < (target.offset().left + (target.width() / 2)));
			}
		});

		if (drop_target) {
			if (drop_after) {
				drop_target.after(AS.setgrid.drag_source);
			} else {
				drop_target.before(AS.setgrid.drag_source);
			}

			return;
		}

		// Test set headings
		targets = $(".set-group .block-h");

		targets.each(function(){
			var target = $(this);

			if (AS.setgrid.calculate_overlap(target, e)) {
				target.parents(".set-group").find(".set-grid").append(AS.setgrid.drag_source);
				return;
			}
		});
	},

	on_drop: function() {
		// Restore text selection on MSIE
		document.onselectstart = function(){};

		// Unbind move event
		AS.setgrid.groups.die("mousemove", AS.setgrid.on_move);

		// Update source state
		AS.setgrid.drag_source.removeClass("moving");

		// Save sort order
		AS.setgrid.update_order();
	},

	update_order: function() {
		var grids = AS.setgrid.grids;
		var sort = {};

		grids.each(function(index, grid){
			var sets = $(".set", grid);

			sets.each(function(i, set){
				sort["sort-" + $(grid).attr("data-id") + "-" + $(set).attr("data-id")] = i;
			});
		});

		$.post(AS.setgrid.grids.attr("data-sort-save"), sort);
	}
};

AS.photogrid = {
	grid: null,
	drag_source: null,

	init: function() {
		AS.photogrid.grid = $(".photo-grid");

		// Add delete click event
		$("a.delete", AS.photogrid.grid).live("click", AS.photogrid.remove_photo);

		// Add drag events
		$(".photo-edit", AS.photogrid.grid).live("mousedown", AS.photogrid.on_drag);
	},

	remove_photo: function() {
		var a = $(this);
		var div = $(this).parent();

		$.post(a.attr("href"));

		div.fadeOut();

		return false;
	},

	add_photo: function(url) {
		// Grab partial
		$.get(url, function(data){
			// Inject partial
			AS.photogrid.grid.append(data);
		});
	},

	calculate_overlap: function(el, e) {
		var pos = el.offset();
		pos.right = pos.left + el.width();
		pos.bottom = pos.top + el.height();

		if (e.pageY >= pos.top && e.pageX >= pos.left) {
			if (e.pageY < pos.bottom && e.pageX < pos.right) {
				return true;
			}
		}
		
		return false;
	},

	on_drag: function() {
		// Disable text selection for MSIE
		if ($.browser.msie) {
			document.onselectstart = function() { return false; }
		}

		// Save source
		AS.photogrid.drag_source = $(this).addClass("moving");

		// Attach drop event
		$(document).one("mouseup", AS.photogrid.on_drop);

		// Attach move event
		AS.photogrid.grid.bind("mousemove", AS.photogrid.on_move);

		return false;
	},

	on_move: function(e) {
		// Are we moving over the source?
		if (AS.photogrid.calculate_overlap(AS.photogrid.drag_source, e)) {
			return false;
		}

		// Get drag targets
		var targets = $(".photo-edit", AS.photogrid.grid);

		var drop_target = null;
		var drop_after = false;

		targets.each(function(){
			var target = $(this);

			if (AS.photogrid.calculate_overlap(target, e)) {
				drop_target = target;
				drop_after = !(e.pageX < (target.offset().left + (target.width() / 2)));
			}
		});

		if (drop_target) {
			if (drop_after) {
				drop_target.after(AS.photogrid.drag_source);
			} else {
				drop_target.before(AS.photogrid.drag_source);
			}
		}
	},

	on_drop: function() {
		// Restore text selection on MSIE
		document.onselectstart = function(){};

		// Unbind move event
		AS.photogrid.grid.unbind("mousemove", AS.photogrid.on_move);

		// Update source state
		AS.photogrid.drag_source.removeClass("moving");

		// Save sort order
		AS.photogrid.update_order();
	},

	update_order: function() {
		var elements = $(".photo-edit", AS.photogrid.grid);
		var sort = {};

		elements.each(function(index, element){
			sort["id-" + $(element).attr("data-id")] = index;
		});

		$.post(AS.photogrid.grid.attr("data-sort-save"), sort);
	}
}

AS.uploader = {
	form: null,
	submit: null,
	queue: null,
	message: null,
	increment: 0,

	init: function() {
		AS.uploader.form = $("#photo-uploader");
		AS.uploader.queue = $(".queue", AS.uploader.form);
		AS.uploader.submit = $("#photo-uploader-submit");
		AS.uploader.message = $("#photo-uploader-message");

		// Initial input event
		$("input", AS.uploader.queue).change(AS.uploader.file_select);

		// Form submit
		AS.uploader.form.submit(AS.uploader.start);

		// Submit link
		AS.uploader.submit.click(function(){
			AS.uploader.form.submit();
			return false;
		});
	},

	start: function() {
		// Get first input
		var item = $(".queued:first", AS.uploader.queue);
		var input = $("input", item);

		if (input.length < 1) {
			return false;
		}

		// Hide submit button
		AS.uploader.submit.hide();

		// Update item status
		item.addClass("working").removeClass("queued");

		// Start upload
		var id = "photo-uploader-current-" + (AS.uploader.increment++)
		input.attr("id", id);

		$.ajaxFileUpload({
			url: AS.uploader.form.attr("action"),
			secureuri: false,
			fileElementId: id,
			dataType: "json",

			success: function(data, status) {
				if (data.error) {
					// Show error message
					AS.uploader.message.html(data.error);

					// Update item status
					item.removeClass("working").addClass("error");
				} else {
					// Update item status
					item.removeClass("working").addClass("completed");

					// Add photo to grid
					AS.photogrid.add_photo(data.partial_url);
				}

				// Continue queue
				AS.uploader.form.submit();
			},

			error: function(data, status, e) {
				// Show error message
				AS.uploader.message.html(data);

				// Update item status
				item.removeClass("working").addClass("error");

				// Continue queue
				AS.uploader.form.submit();
			}
		});

		return false;
	},

	file_select: function() {
		var input = $(this).hide();
		var item = input.parent();

		// Change item to queued state
		item
			.addClass("queued")
			.append(AS.uploader.parse_filename(input.val()));

		// Add new item to queue
		AS.uploader.insert_item();

		// Show submit button
		AS.uploader.submit.show();
	},

	insert_item: function() {
		var input = $("<input type=\"file\" name=\"photo\">")
			.change(AS.uploader.file_select);

		var div = $("<div></div>")
			.addClass("item")
			.append(input);

		AS.uploader.queue.append(div);
	},

	// Parse file name from a path
	parse_filename: function(val) {
		var i;

		if ((i = val.lastIndexOf("\\")) != -1) {
			val = val.substring(i + 1);
		} else if ((i = val.lastIndexOf("/")) != -1) {
			val = val.substring(i + 1);
		}
		
		return val;
	}
};

$(function(){
	AS.shade.init();
	AS.tab.init();
	AS.listing.init();
	AS.splash.init();
	AS.gallery.init();
	AS.clients.init();
	AS.admin.init();
	AS.photogrid.init();
	AS.setgrid.init();
	AS.uploader.init();
});


/*
 * 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
jQuery.extend( jQuery.easing,
{
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + 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;
		}
	}
});