function MW_form_validate(theform) {
	if ($(theform).find("fieldset.invalid").length > 0) {
		$(theform).find("button, input[type=submit]").attr("disabled","disabled");
		$(theform).find(".buttonset .warning").show();
		return false;
	} else {
		$(theform).find("button, input[type=submit]").attr("disabled","");
		$(theform).find(".buttonset .warning").hide();
		return true;
	}
}

function MW_fieldset_validate(thefieldset) {
	if ($(thefieldset).hasClass("does_validate")) {
		$(thefieldset).removeClass("valid").removeClass("invalid");
		$(thefieldset).children("ol").children("li").removeClass("valid").removeClass("invalid");
	
		var isvalid = true;
		$(thefieldset).find(".required > input, .required > select, .required > textarea").not(":hidden").not(".extension").each( function() {
			if (($(this).is(":radio")) || ($(this).is(":checkbox"))) {
				setname = $(this).attr("name");
				if ($("input[name=" + setname + "]:checked").length === 0) {
					$(this).parent("li").addClass("invalid");
					isvalid = false;
				} else {
					$(this).parent("li").addClass("valid");
				}
			} else if ($(this).is("textarea[maxchars]")) {
				if (($(this).val().length > 0) && ($(this).val().length <= $(this).attr("maxchars"))) {
					$(this).parent("li").addClass("valid");
				} else {
					$(this).parent("li").addClass("invalid");
					isvalid = false;
				}
			} else {
				if ($(this).val().length === 0) {
					$(this).parent("li").addClass("invalid");
					isvalid = false;
				} else {
					$(this).parent("li").addClass("valid");
				}
			}
		});
		
		if (isvalid) {
			$(thefieldset).addClass("valid");
		} else {
			$(thefieldset).addClass("invalid");
		}
		
		// validate the entire form to see if the overall status has changed
		MW_form_validate($(thefieldset).parents("form").eq(0));
	}
}

function MW_fieldset_collapse(thefieldset) {
	if ($(thefieldset).hasClass("does_collapse")) {
		// validate fieldset on collapse
		MW_fieldset_validate(thefieldset)
		
		$(thefieldset).removeClass("expanded").addClass("collapsed");
	}
}

function MW_fieldset_expand(thefieldset) {
	if ($(thefieldset).hasClass("does_collapse")) {
		// collapse all fieldsets since only one can be expanded at once
		$(thefieldset).siblings("fieldset.expanded").removeClass("expanded").addClass("collapsed");
		
		// expand only this fieldset
		$(thefieldset).removeClass("collapsed").addClass("expanded");
	}
}

function MW_fieldset_toggle(thefieldset) {
	if ($(thefieldset).hasClass("does_collapse")) {
		if ($(thefieldset).hasClass("expanded")) {
			MW_fieldset_collapse(thefieldset);
		} else {
			MW_fieldset_expand(thefieldset);
		}
	}
}

function MW_establish_initial_state() {
	$(".can_collapse").removeClass("can_collapse").addClass("does_collapse");
	$(".can_validate").removeClass("can_validate").addClass("does_validate");
	
	// set up status indicators
	$(".does_collapse > legend > span").append('<span class="status_collapse"></span>');
	$(".does_validate > legend > span").append('<span class="status_validate"></span>');

	// collapse all fieldsets
	$("fieldset.does_collapse").each( function() { MW_fieldset_collapse(this); });
	
	//expand the first fieldset
	MW_fieldset_expand($("fieldset.does_collapse").eq(0));
}

function MW_enhance_textareas() {
	$("textarea[maxchars]").bind("keyup blur", function() {
		var maxchars = $(this).attr("maxchars");
		var currentchars = $(this).val().length;
		var charsleft = maxchars - currentchars;
		if (charsleft == 0) charsleft = "0";
		var $charcount = $(this).siblings(".charcount");
		$charcount.find("strong").html(charsleft);
		if (charsleft < 0) {
			$charcount.addClass("over");
		} else {
			$charcount.removeClass("over");
		}
	}).each( function() {
		var maxchars = $(this).attr("maxchars");
		$(this).after('<p class="charcount"><strong>' + maxchars + '</strong> characters left.</p>');
		$(this).blur();
	});
}

function MW_enhance_radios() {
	$("input:radio").each( function( ) {
		if ($(this).siblings("fieldset").length > 0) {
			var masterbutton = this;
			var slavebuttons = $(masterbutton).siblings("fieldset").children("ol").children("li").children("input:radio, input:checkbox");
			$("input[name=" + $(masterbutton).attr("name") + "]").bind("click change", function () {
				if ($(masterbutton).is(":checked")) {
					$(masterbutton).siblings("fieldset").children("ol").children("li").addClass("required");
				} else {
					$(masterbutton).siblings("fieldset").children("ol").children("li").removeClass("required").removeClass("valid").removeClass("invalid");
					$(masterbutton).siblings("fieldset").children("ol").children("li").children("input:radio, input:checkbox").attr("checked","");
				}
			});
			$(slavebuttons).bind("click change", function () {
				if ($(this).is(":checked")) {
					$(masterbutton).attr("checked","checked");
				}
			});
		}
	});
}

/* Initiate */
$(document).ready( function() {
	MW_establish_initial_state();
	$("fieldset.does_validate input, fieldset.does_validate select, fieldset.does_validate textarea").bind("keypress click change blur", function() {
		MW_fieldset_validate($(this).parents("fieldset").eq(0));
	});
	$("fieldset.does_validate").bind("click", function() {
		MW_fieldset_validate(this);
	});
	$("fieldset.does_collapse > legend").bind("click", function() {
		MW_fieldset_toggle($(this).parent("fieldset"));
	});
	MW_enhance_textareas();
	MW_enhance_radios();
	
	$("form#input").submit( function() {
		if (!MW_form_validate(this)) {
			MW_fieldset_expand($("fieldset.invalid:first"));
			$("fieldset.invalid:first").find("input, textarea").focus();
		}
	});
});