﻿
(function($) {

	$.fn.extend({

		//pass the options variable to the function
		topForm: function(options) {


			//Set the default values, use comma to separate the settings, example:
			var defaults = {
				validateFunctionURL: "",
				submitFunctionURL: "",
				onValidationFail: null,
				onSubmitted: null,
				submitElementSelector: "",
				validationSummarySelector: "",
				errorClass: "error",
				onSubmitting: null
			}

			var formParameters = new Array();

			var options = $.extend(defaults, options);

			var AddParameter = function(key, value) {
				var keyValue = new Object();
				keyValue.Key = key;
				keyValue.Value = value;

				formParameters.push(keyValue);
			}

			var PostFormToServer = function() {
				//clear out inner html
				if (options.validationSummarySelector != null && options.validationSummarySelector != "") {
					$(options.validationSummarySelector).html("");
				}

				//build up parameters to be sent in
				var strSubmitData = "";

				for (var i = 0; i < formParameters.length; i++) {

					if ($('[name="' + formParameters[i].Key + '"]').attr('type') == 'checkbox') {
						if ($('[name="' + formParameters[i].Key + '"]').attr('checked') == true) {

							strSubmitData += formParameters[i].Key + "=" + $('[name="' + formParameters[i].Key + '"]').val() + "&";
						}
					}
					else if ($('[name="' + formParameters[i].Key + '"]').attr('type') == 'radio') {
						strSubmitData += formParameters[i].Key + "=" + $('[name="' + formParameters[i].Key + '"]').attr('checked') + "&";
					}
					else {
						strSubmitData += formParameters[i].Key + "=" + escape($('[name="' + formParameters[i].Key + '"]').val()) + "&";
					}

				}

				if (options.onSubmitting != null) {
					options.onSubmitting();
				}


				//submit for validation
				$.ajax({
					type: "POST",
					url: options.validateFunctionURL,
					data: strSubmitData,
					dataType: "json",
					success: function(msg) {

						//var errorObject = eval('(' + msg + ')');
						var errorObject = eval(msg);

						if (errorObject.length == 0) {
							//passed validation
							if (options.submitFunctionURL != "") {
								//submit via ajax
								$.ajax({
									type: "POST",
									url: options.submitFunctionURL,
									data: strSubmitData,
									dataType: "text",
									error: function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.responseText); alert(errorThrown); },
									success: function(submitSuccess) {
										if (options.onSubmitted != null) {
											//var successObject = eval(submitSuccess);
											$("#cboxClose").removeClass("noClose");
											options.onSubmitted(submitSuccess);
										}
									}
								});
							}
							else {
								//trigger the submit of the form to do a normal post back
								$(this).submit();
							}
						}
						else {
							//fail validation

							var errorList = new Array();
							//build up error list
							for (var i = 0; i < errorObject.length; i++) {
								var error = new Object();

								error.InputName = errorObject[i].Key;
								error.ErrorMessage = errorObject[i].Value.Errors[0].ErrorMessage;

								errorList.push(error);


								//add error style and validation behavior
								if (options.errorClass != "") {
									$('[name=' + error.InputName + ']').addClass(options.errorClass).change(function() {
										$(this).removeClass(options.errorClass);
									});

								}

							}

							if (options.validationSummarySelector != "") {
								//output a validation summary inside the specified div.
								var validationSummaryHTML = $("<ul>");

								for (var i = 0; i < errorList.length; i++) {
									var singleErrorHTML = $("<li>").append(errorList[i].ErrorMessage);
									validationSummaryHTML.append(singleErrorHTML);
								}

								$(options.validationSummarySelector).append(validationSummaryHTML);

							}

							if (options.onValidationFail != null) {
								//trigger onValidationFail event and send the error list
								options.onValidationFail(errorList);

							}
						}
					}
				});
			}

			return this.each(function() {

				//build up parameter list
				var inputItems = $('input', $(this));

				for (var i = 0; i < inputItems.length; i++) {
					AddParameter($(inputItems[i]).attr("name"), $(inputItems[i]).val());
				}

				var selectItems = $('select', $(this));

				for (var i = 0; i < selectItems.length; i++) {
					AddParameter($(selectItems[i]).attr("name"), $(selectItems[i]).val());
				}

				var textareaItems = $('textarea', $(this));

				for (var i = 0; i < textareaItems.length; i++) {
					AddParameter($(textareaItems[i]).attr("name"), $(textareaItems[i]).text());
				}

				$(options.submitElementSelector).click(PostFormToServer);

			});




		}
	});

})(jQuery);


