$(document).ready(function() { 
	function hasAttr(element, attr) {
		var t = $(element);
		if(t.filter("*[" + attr + "]").length > 0) {
			return true;
		} else {
			return false;
		}
	}

	/* Form stuff */
	if($("button.save").length > 0) {
		$("button.save").each(function() {
			function checkForEnter (event) {
				if (event.keyCode == 13) {
					currentBox = formelements.index(this);
					if(formelements[currentBox + 1] != null) {
						nextbox = formelements[currentBox + 1]
						nextbox.focus();
						if(nextbox.select) nextbox.select();
					} else {
						// submit the form
						save.click();
					}
				} 
			}

			var save = $(this);
			var form = $("#" + save.attr("save"));
			var req_inputs = form.find("input[type=text], input[type=password], textarea, input[type=checkbox]");
			
			var formelements = form.find("input, select, textarea");
			var inputs = form.find("input");
			var selects = form.find("select");
			var textareas = form.find("textarea");

			inputs.not(".autocomplete").keydown(checkForEnter);
			
			save.click(function() {
				var thissave = $(this);
				if(!thissave.hasClass("saving")) {
					var submitthis = true;
					
					thissave.addClass("saving");
					thissave.attr("oldval", thissave.html());
					thissave.html("Saving...");
					
					form.find("input[required]").css("background-color", "white");
					form.find(".input_error").hide();
					req_inputs.each(function() {
						var input = $(this);
						var isRequired = (hasAttr(input, 'required') && input.attr("required"));
						var isCheckbox = (hasAttr(input, 'type') && input.attr("type") == "checkbox");
						if( (isRequired && isCheckbox && !input.attr("checked")) || (isRequired && !isCheckbox && (input.val() == "")) ) {
							// Display an error message, if any
							var er = $("#" + input.attr("error"));
							if(er.length > 0) {
								er.hide();
								er.html(input.attr("required"));
								er.fadeIn(1000);
							}
							if(submitthis == true) {
								input.focus();
								submitthis = false;
							}
							input.animate( { backgroundColor: 'yellow' }, 500 );
						} else if(hasAttr(input, 'validate') && input.attr("validate") == "email") {
							if(isValidEmailAddress(input.val()) == false) {
								var er = $("#" + input.attr("error"));
								er.hide();
								er.html("Please enter a valid e-mail address.");
								er.fadeIn(1000);
								if(submitthis == true) {
									input.focus();
									submitthis = false;
								}
								input.animate( { backgroundColor: 'yellow' }, 500 );
							}
						} else if(hasAttr(input, 'validate') && input.attr("validate") == "url") {
							if(input.val().length > 0 && !isValidUrl(input.val())) {
								var er = $("#" + input.attr("error"));
								er.hide();
								er.html("Please enter a valid URL.");
								er.fadeIn(1000);
								if(submitthis == true) {
									input.focus();
									submitthis = false;
								}
								input.animate( { backgroundColor: 'yellow' }, 500 );
							}
						}
					});
					if(submitthis == true) {
						// Now save the form						
						var args = new Object();
						inputs.each(function() {
							var name = $(this).attr("name");
							var value = $(this).val();
							args[name] = $(this).val();
						});
						selects.each(function() {
							var name = $(this).attr("name");
							var value = $(this).val();
							args[name] = $(this).val();
						});
						textareas.each(function() {
							var name = $(this).attr("name");
							var value = $(this).html();
							args[name] = $(this).val();
						});
						
						var ajaxdest = form.attr("action");
//						 alert("Starting....");
						$.post(ajaxdest, args, function(result) {
//							 alert("Ajaxed.");
							if(result.status != "OK") {
//alert("result.status");
//alert("result.message");
								if(form.find("span.formerror").length < 1) {
									form.prepend("<span class=\"formerror\">" + result.message + "</span>");
								} else {
									form.find("span.formerror:first").html(result.message);
								}
							} else {
								// Success!
								var show_message = true;
								var message = "";
//								 alert("Success!");
								if(hasAttr(form, 'next')) {
									if(form.attr("next") == "redirect" && hasAttr(form, "target")) {
										show_message = false;
										// alert("Redirecting...");
										if(result.target){
											window.location = result.target;
										}else{
											window.location = form.attr("target");
										}
									}
									if(form.attr("next") == "message" && hasAttr(form, "target")) {
										// just show the message
										show_message = true;
										message = result.message;
									}
									if(form.attr("next") == "append") {
										if(result.newform) {
											show_message = false;
											nextelement = form.next("*");
											if(nextelement.hasClass("result")) {
												nextelement.html(result.newform);
											} else {
												form.after("<div class=\"result\">" + result.newform + "</div>");
											}
										} else {
											show_message = true;
											if(form.message) {
												message = result.message;
											} else {
												message = "Something went wrong!";
											}
										}
										show_message = false;
									}
								}
								if(show_message) {
									form.find("span.forminfo").remove();
									form.prepend("<span class=\"forminfo\">" + message + "</span>");
								}
							}
						}, 'json');
					}
					thissave.html(thissave.attr("oldval"));
					thissave.removeClass("saving");
				}
			});
		});
		$("input.autocomplete").each(function() { 
			var t = $(this);
			var hasAcTypeAttr = hasAttr(t, 'ac_type');
			if(hasAcTypeAttr){
				var acType = t.attr("ac_type");
				if(acType != "wine_tags") {
					t.autocomplete("/ajax/autocomplete/" + acType, {
						minChars:2,
						cacheLength:10,
						autoFill:false
					});
				}else if(acType == "wine_tags"){
					t.autocomplete("/ajax/autocomplete/" + acType, {
						multiple: true,
						matchContains: true
					});
				}
			}
		});
	}
});