var formId;
var overrideDefaultActions;
var overrideSuccessRedirect;
var overrideErrorPosition;
var jqueryVersion = $j().jquery;

function handleAjaxFormSubmit() {
   	var formValidationJSON={};
   	var defaultLoadingImage="/common_scripts/images/user/processing.gif";
	
   	formId = $j(this).attr("id");
   	overrideDefaultActions = $j(this).attr("overrideDefaultActions");
   	overrideSuccessRedirect = $j(this).attr("overrideSuccessRedirect");

	var isFileUpload = false;

   	// available Form Error Position are global,field
   	overrideErrorPosition = $j(this).attr("overrideErrorPosition");
   	if ( !overrideErrorPosition ) { overrideErrorPosition = 'field'; }

   	// scroll to top
   	window.location.href="#";

   	// disable submit button
	if ( jqueryVersion.indexOf("1.3") >= 0 || jqueryVersion.indexOf("1.4") >= 0 ) {
		$j("button[type=submit]").attr("disabled","disabled");
	} else {
		$j("button[@type=submit]").attr("disabled","disabled");
	} 

	// look for loading image override
	if ($j(this).attr("loadingImage")!=undefined) {
		defaultLoadingImage=$j(this).attr("loadingImage");
	}
   	// display loading image
	$j("<div><img src='"+defaultLoadingImage+"' /></div>").modal({
		close: false
	});

	// if file upload, change encType to multipart/form-data
	if ( jqueryVersion.indexOf("1.3") >= 0 || jqueryVersion.indexOf("1.4") >= 0 ) {
		if ($j(this).find("input[type=file]").size() > 0) {
			isFileUpload = true;
			$j(this).attr('encType','multipart/form-data');
			$j(this).attr('encoding','multipart/form-data'); // this is set because IE's javascript doesn't use the standard encType
			$j(this).attr('method','POST');
		}
	} else {
		if ($j(this).find("input[@type=file]").size() > 0) {
			isFileUpload = true;
			$j(this).attr('encType','multipart/form-data');
			$j(this).attr('encoding','multipart/form-data'); // this is set because IE's javascript doesn't use the standard encType
			$j(this).attr('method','POST');
		}
	}
	
	

	// check to see if using FCK Editor
	try {
		if (typeof(FCKeditorAPI)=="object") {
			// push xhtml content to hidden input for each fck editor instance
			for ( var s in FCKeditorAPI.__Instances ) {
				$j("#"+s).val(FCKeditorAPI.GetInstance(s).GetXHTML());
			}
		}
	} catch (err) {}


	// trigger custom event - onBeforeFormSubmit
	$j(this).trigger('onBeforeFormSubmit', [{form:$j(this)}]);

	if (!isFileUpload) {

		// ajax error handler
		$j(this).ajaxError(onFormAjaxError);


		// ajax complete handler
		$j(this).ajaxComplete(onFormAjaxComplete);

		// do ajax call
		$j.ajax({
		   type: $j(this).attr("method"),
		   url: $j(this).attr("action"),
		   data: "ajax=1&" + $j(this).serialize()
		 });
	} else {

		// create iframe
		var iframeName = "uploader_" + (new Date()).getTime();
		var iframe = $j("<iframe name=\"" + iframeName + "\" src=\"about:blank\" />");
		iframe.css('display','none');

		$j("body:first").append(iframe);
		$j(this).attr('target',iframeName);  // set form target to be iframe name

		// add event handler to listen for when iframe is loaded
		iframe.load(function(response) {

			var request = {};

			try {
				// add back binding for submit
				$j("form.ajax").submit(handleAjaxFormSubmit);

				// remove hidden ajax input
				$j(".fileAjax").remove();

				// read response
				var objUploadBody = window.frames[iframeName].document.getElementsByTagName( "body" )[ 0 ];
				var iframeBody = $j( objUploadBody );

				request = {responseText: iframeBody.html()};

				// used to check if a valid JSON string has been sent back to the iframe
				JSONObj = eval( "(" + request.responseText + ")" );
				if ( typeof(JSONObj) == "object" ) {
					onFormAjaxComplete({}, request, {});
				} else {
					onFormAjaxError(request, {});
				}

			} catch(err) {
				onFormAjaxError(request, {});
			}

			// remove iframe, delayed because of issue with FireFox
			setTimeout(function(){
				iframe.remove();
			},100);

		});

		// remove binding for submit
		$j(this).unbind("submit",handleAjaxFormSubmit);

		// inject ajax = 1 hidden input into form so JSON string comes back
		$j(this).append("<input class='fileAjax' type='hidden' name='ajax' value='1' />");


		// post form to iframe
		$j(this).submit();

	}

	return false;
}

function onFormAjaxError(request, settings){

	$j(this).trigger('onErrorFormSubmit', [{form:$j(this)}]);
   	displayUnknownError(formId);
  	
	if ( jqueryVersion.indexOf("1.3") >= 0 || jqueryVersion.indexOf("1.4") >= 0 ) {
		$j("button[type=submit]").removeAttr("disabled");
	} else {
		$j("button[@type=submit]").removeAttr("disabled");
	} 
	
   	// remove loading div
	$j.modal.close();
}

function onFormAjaxComplete(event, request, settings){

	try {

		formValidationJSON=eval('('+request.responseText+')');

		$j(this).trigger('onAfterFormSubmit', [{form:$j(this), response:formValidationJSON}]);


		if (overrideDefaultActions != "true") {
			if (typeof(formValidationJSON)=="object") {

				// enable submit button
				if ( jqueryVersion.indexOf("1.3") >= 0 || jqueryVersion.indexOf("1.4") >= 0 ) {
					$j("button[type=submit]").removeAttr("disabled");
				} else {
					$j("button[@type=submit]").removeAttr("disabled");
				}

				if (formValidationJSON.result=="success") {

					formValidationJSON.url=formValidationJSON.url.replace(/&amp;/g,"&");
					if (overrideSuccessRedirect != "true") {
						window.location.href=formValidationJSON.url;
					} else {
						$j(this).trigger('onValidationSuccess', [{form:$j(this), response:formValidationJSON, successUrl:formValidationJSON.url }]);
					}

				} else {

					if ( overrideErrorPosition == 'field' ) {
						displayFormErrors(formValidationJSON,formId);
					} else if ( overrideErrorPosition == 'global' ) {
						displayGlobalErrors(formValidationJSON,formId);
					}

					// remove loading div
					$j.modal.close();
				}
			} else { // if invalid object returned, display generic error
				displayUnknownError(formId);
				
				

				// enable submit button
			   	if ( jqueryVersion.indexOf("1.3") >= 0 || jqueryVersion.indexOf("1.4") >= 0 ) {
					$j("button[type=submit]").removeAttr("disabled");
				} else {
					$j("button[@type=submit]").removeAttr("disabled");
				}
			   
			   

			   // remove loading div
				$j.modal.close();
			}
		}
	} catch(err) {

		displayUnknownError($j(this).attr("id"));
		
		if ( jqueryVersion.indexOf("1.3") >= 0 || jqueryVersion.indexOf("1.4") >= 0 ) {
			$j("button[type=submit]").removeAttr("disabled");
		} else {
			$j("button[@type=submit]").removeAttr("disabled");
		}

	   // remove loading div
		$j.modal.close();
	}

}

function displayFormErrors(jsErrorObject,formId)
{

	clearErrors();

	for (i=0;i<jsErrorObject.errors.length;i++) {
		var field = $j("#div_"+jsErrorObject.errors[i].field);
		var label = $j("#div_"+jsErrorObject.errors[i].field + " label#lbl_"+jsErrorObject.errors[i].field);
		var errorHTML = "<li>" + jsErrorObject.errors[i].errorMessage + "</li>";

		// add error class to fieldContainer
		field.addClass("error");

		/*
		 * Build unordered list of errors out.
		 * If displayPosition = "top", stick UL under label
		 * If displayPosition = "bottom", stick UL after input
		 */
		if ($j("#div_"+jsErrorObject.errors[i].field + " ul.formError." + jsErrorObject.errors[i].displayPosition).size()==0) {
			if (jsErrorObject.errors[i].displayPosition=="bottom") {
				field.append("<ul id='"+ jsErrorObject.errors[i].field +"_error' class='formError " + jsErrorObject.errors[i].displayPosition + "'>" + errorHTML + "</ul>");
			} else {
				label.after("<ul id='"+ jsErrorObject.errors[i].field +"_error' class='formError " + jsErrorObject.errors[i].displayPosition + "'>" + errorHTML + "</ul>");
			}
		} else {
			$j("#div_"+jsErrorObject.errors[i].field + " ul.formError." + jsErrorObject.errors[i].displayPosition).append(errorHTML);
		}

	}

	if (jsErrorObject.genericErrorMessage!="") {
		$j("#"+formId).before("<div class='formError generic'>" + jsErrorObject.genericErrorMessage + "</div>");
	} else {
		$j("#"+formId).before("<div class='formError generic'>Please fix the errors below:</div>");
	}
	
	$j(document).trigger('onAfterContentLoaded');
}

function displayGlobalErrors(jsErrorObject,formId) {

	clearErrors();

	var errorHTML = "";
	for (i=0;i<jsErrorObject.errors.length;i++) {
		var field = $j("#div_"+jsErrorObject.errors[i].field);
		var label = $j("#div_"+jsErrorObject.errors[i].field + " label#lbl_"+jsErrorObject.errors[i].field);
		var errorHTML = errorHTML + "<li>" + jsErrorObject.errors[i].errorMessage + "</li>";
			field.addClass("error");
	}

	if ( errorHTML.length > 0 ) {
		errorHTML = "<ul>" + errorHTML + "</ul>";
	}

	if (jsErrorObject.genericErrorMessage!="") {
		$j("#"+formId).before("<div class='formError generic'>" + jsErrorObject.genericErrorMessage + errorHTML + "</div>");
	} else {
		$j("#"+formId).before("<div class='formError generic'>Please fix the errors below:" + errorHTML + "</div>");
	}
	
	$j(document).trigger('onAfterContentLoaded');

}

function displayUnknownError(formId)
{
	clearErrors();
	$j("#"+formId).before("<div class='formError generic'>An unknown error occurred, please contact the webmaster.</div>");
}

function clearErrors()
{
	$j(".fieldContainer").removeClass("error");
	$j(".formError").remove();
}

$j(document).ready(function(){

	// add submit event handler for ajax forms
	$j("form.ajax").submit(handleAjaxFormSubmit);

});