IAN = {};

IAN.ui = {
	init: function(context) {
		context = context || $(document);
		
		IAN.ui.gallery.init(context);
		IAN.ui.showcase.init(context);
		IAN.ui.upload.init(context);
		IAN.ui.describe.init(context);
	}
};

IAN.ui.describe = {
	init: function(context) {
		var organize = $("#organize");

		$("img.editable", context).click(function(){
			// Check if a form is already open
			var form = $("form", organize);

			if (form.length > 0) {
				return;
			}

			var img = $(this);
			var url = img.attr("longdesc");

			$.get(url, function(data){
				img.replaceWith(data);
				var form = $("form", organize);

				// Add form save handlers
				$("button", form).click(function(){
					$.post(form.attr("action"), form.serializeArray(), function(data){
						organize.replaceWith(data);
						IAN.ui.describe.init($("#organize"));
					});

					return false;
				});

				$("a.action", form).click(function(){
					var a = $(this);

					$.post(a.attr("href"), {confirm: true}, function(data){
						organize.replaceWith(data);
						IAN.ui.describe.init($("#organize"));
					});

					return false;
				});
			});

			return false;
		});
	}
};

IAN.ui.upload = {
	init: function(context) {
		$("form.photo-upload", context).each(function(){
			var form = $(this);
			var rel = $("ul", form);
			
			// Initaially hide submit button
			$("input:submit", form).hide();

			// Upload the first file, and repeat
			form.submit(function(){
				var input = $("ul li.selected input:first", form);
				
				// Hide submit button
				$("input:submit", form).hide();

				if (input.length < 1) {
					return false;
				}
				
				input.attr("id", "photo-upload-current");

				input.parent().removeClass("selected").addClass("working");

				// Post upload
				$.ajaxFileUpload({
					url: form.attr("action"),
					secureuri: false,
					fileElementId: input.attr("id"),
					dataType: "json",

					success: function(data, status) {
						var li = $("ul li.working input:first", form).parent();
						li.removeClass("working");
						
						if (data.error) {
							li.addClass("error");
							li.append("<br>").append(data.error);
						} else {
							li.addClass("completed");

							// Add describe form
							if (data.redirect) {
								$.get(data.redirect, function(describe){
									// Insert dom
									li.html(describe);

									// Add events
									$("button", li).click(function(){
										var fields = $(":input", li).serializeArray();

										$.post(data.save, fields, function(organize){
											$("#organize").html(organize);
											IAN.ui.describe.init($("#organize"));
										});

										li.removeClass("completed");
										li.addClass("saved");
										li.html($("input:first", li).val());

										return false;
									});
								});
							}
						}

						// Remove input field
						li.find("input").remove();
						
						form.submit();
					},

					error: function(data, status, e) {
						$("ul input:first", form)
							.parent()
								.removeClass("working")
								.addClass("error")
								.append("<br>")
								.append(data.error)
							.find("input")
								.remove();
					}
				});

				return false;
			});

			$("input:file", form).each(function(){
				var element = $(this);

				var _change = function() {
					// Show the upload button
					$("input:submit", form).show();

					// Create a delete button
					var del = $("<a></a>").html("&times;").click(function(){
						IAN.ui.upload.remove($(this));
					}).attr("title", "Remove this photograph from the upload queue.");
					
					// Put delete button onto the last element
					$(this).parent().append(del).addClass("selected");
					
					// Create input
					var input = $("<input type=\"file\" name=\"photograph\">")
					input.change(_change);

					// Add to list
					rel.append(
						$("<li></li>")
							.append(input)
					);
					
					
					// Hide the current field
					$(this).css({
						position: "absolute",
						top: "-1000px"
					});
					
					$(this).parent().append(
						IAN.ui.upload.parse_filename($(this).val())
					);
				};

				element.change(_change);
			});
		});
	},
	
	// 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;
	},
	
	// Remove an entry from the upload list
	remove: function(el) {
		el.parent().slideUp(el.parent.remove);
	}
}

IAN.ui.showcase = {
	init: function(context) {
		$(".showcase", context).each(function(){
			var sc = $(this);

			if (sc.hasClass("photo")) {
				return;
			}

			// Add current class to first item
			if ($(".showcase-current", sc).size() == 0) {
				$(".showcase-item:first").addClass("showcase-current");
			}

			// Helper function -- Get index of current item
			var getIndex = function() {
				return $(".showcase-item", sc).index($(".showcase-current", sc)[0]);
			};

			var navFeedback = function() {
				// At first
				if ($(".showcase-item:first", sc).hasClass("showcase-current")) {
					$(".arw-l em", sc).fadeTo("slow", .5);
				} else {
					$(".arw-l em", sc).fadeTo("slow", 1);
				}

				// At last
				if ($(".showcase-item:last", sc).hasClass("showcase-current")) {
					$(".arw-r em", sc).fadeTo("slow", .5);
				} else {
					$(".arw-r em", sc).fadeTo("slow", 1);
				}
			};

			navFeedback();

			// View Previous
			$(".arw-l", sc).click(function(){
				// Already at the first one?
				if ($(".showcase-item:first", sc).hasClass("showcase-current")) {
					return false;
				}

				var index = getIndex();

				$(".showcase-items", sc).animate({"marginLeft": "+=850px"});
				$(".showcase-item", sc).
					removeClass("showcase-current").
					eq(index - 1).
						addClass("showcase-current");

				navFeedback();
				
				return false;
			});
			
			// View Next
			$(".arw-r", sc).click(function(){
				// Already at the last one?
				if ($(".showcase-item:last", sc).hasClass("showcase-current")) {
					return false;
				}

				var index = getIndex();

				$(".showcase-items", sc).animate({"marginLeft": "-=850px"});
				$(".showcase-item", sc).
					removeClass("showcase-current").
					eq(index + 1).
						addClass("showcase-current");
				
				navFeedback();
				
				return false;
			});
		});
	}
};

IAN.ui.gallery = {
	init: function(context) {
		IAN.ui.gallery.navFeedback();

		$("#gallery-next", context).click(function(){
			var sel = $("#photo-slide .selected");

			if ($(".arw-r em").hasClass("loading")) {
				return false;
			}

			if (sel.next().hasClass("photo")) {
				sel.removeClass("selected").next().addClass("selected");
				IAN.ui.gallery.navFeedback();
			} else {
				return false;
			}

			return IAN.ui.gallery.switchSelected();
		});

		$("#gallery-previous", context).click(function(){
			var sel = $("#photo-slide .selected");

			if ($(".arw-l em").hasClass("loading")) {
				return false;
			}

			if (sel.prev().hasClass("photo")) {
				sel.removeClass("selected").prev().addClass("selected");
				IAN.ui.gallery.navFeedback();
			} else {
				return false;
			}

			return IAN.ui.gallery.switchSelected("+");
		});
	},

	navFeedback: function() {
		if ($("#photo-slide .photo:last").hasClass("selected")) {
			$(".arw-r em").fadeTo("slow", .5);
		} else {
			$(".arw-r em").fadeTo("slow", 1);
		}

		if ($("#photo-slide .photo:first").hasClass("selected")) {
			$(".arw-l em").fadeTo("slow", .5);
		} else {
			$(".arw-l em").fadeTo("slow", 1);
		}
	},

	switchSelected: function(dir) {
		var items = $(".showcase-items");
		var rel = $("#photo-slide .selected").attr("rel");
		var already = false;
		dir = dir || "-";

		$(".showcase-item").each(function(){
			if ($(this).attr("rel") == rel) {
				already = true;
			}
		});

		if (already) {
			items.animate({
				marginLeft: dir + "=850px"
			});
		} else {
			if (dir == "-") {
				$(".arw-r em").addClass("loading");
			} else {
				$(".arw-l em").addClass("loading");
			}

			$("#preload").remove();

			var preload = $("<img>").attr("src", $("#photo-slide .selected").attr("rel")).attr("id", "preload");
			preload.css({position: "absolute", top: "-1000em", left: "-1000em"});
			$("body").append(preload);

			$("#preload").load(function(){
				$.get($("#photo-slide .selected").attr("href"), {ajax: true}, function(data){
					items.width(items.width() + 850);

					if (dir == "-") {
						$(".arw-r em").removeClass("loading");

						items.append(data);

						items.animate({
							marginLeft: dir + "=850px"
						});
					} else {
						$(".arw-l em").removeClass("loading");
						items.prepend(data);
					}
				});
			});
		}

		return false;
	}
};

$(document).ready(function(){
	IAN.ui.init();
});

